2026-10-24T18:50:04.4363397Z Current runner version: '2.338.1' 2026-10-24T18:50:04.4366654Z Runner name: 'blacksmith-8vcpu-ubuntu-2404-blapq2es55qvyp72' 2026-10-24T18:50:04.4367364Z Runner group name: 'blacksmith scale sets - blacksmith-8vcpu-ubuntu-2404' 2026-10-24T18:50:04.4368036Z Machine name: 'ip-172-31-73-130' 2026-10-24T18:50:04.4369501Z ##[group]GITHUB_TOKEN Permissions 2026-10-24T18:50:04.4370781Z Contents: read 2026-10-24T18:50:04.4371307Z Metadata: read 2026-10-24T18:50:04.4371697Z ##[endgroup] 2026-10-24T18:50:04.4372965Z Secret source: Actions 2026-10-24T18:50:04.4373821Z Cache mode: write 2026-10-24T18:50:04.4374279Z Prepare workflow directory 2026-10-24T18:50:04.4544621Z Prepare all required actions 2026-10-24T18:50:04.4569394Z Getting action download info 2026-10-24T18:50:04.5959652Z Download action repository 'actions/checkout@v6' (SHA:d23441a48e516b6c34aea4fa41551a30e30af803) 2026-10-24T18:50:04.6321788Z Download action repository 'actions/cache@v6' (SHA:55cc8345863c7cc4c66a329aec7e433d2d1c52a9) 2026-10-24T18:50:04.7445923Z Setting BLACKSMITH_ACTIONS_RESULTS_URL to https://results-receiver.actions.githubusercontent.com/ 2026-10-24T18:50:04.7482480Z Complete job name: Lint 2026-10-24T18:50:04.7836242Z A job started hook has been configured by the self-hosted runner administrator 2026-10-24T18:50:04.7902188Z ##[group]Run '/setup.sh' 2026-10-24T18:50:04.7917340Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T18:50:04.7917733Z env: 2026-10-24T18:50:04.7917944Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 166 2026-10-24T18:50:04.7918231Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 371 2026-10-24T18:50:04.7918503Z BLACKSMITH_CHECK_RUN_ID: 120956923557 2026-10-24T18:50:04.7918778Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-24T18:50:04.7919042Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-24T18:50:04.7919299Z ##[endgroup] 2026-10-24T18:50:04.8134215Z Logging daemon started (blacksmithd for logs) 2026-10-24T18:50:04.8217505Z Results daemon started (blacksmithd for results) 2026-10-24T18:50:04.8334620Z Background adoption and SSH setup started (PID: 3069) 2026-10-24T18:50:04.8335080Z 2026-10-24T18:50:04.8335216Z ---------------------------------------- 2026-10-24T18:50:04.8335802Z View this job: https://app.blacksmith.sh/pingdotgg/runs/40122509491/jobs/120956923557 2026-10-24T18:50:04.8336318Z SSH Access (using your GitHub SSH key): 2026-10-24T18:50:04.8336853Z ssh -p 64000 runner@blacksmith-8vcpu-ubuntu-2404-blapq2es55qvyp72.vm.blacksmith.sh 2026-10-24T18:50:04.8337240Z 2026-10-24T18:50:04.8337375Z No GitHub SSH key? Add one at: 2026-10-24T18:50:04.8337989Z https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account 2026-10-24T18:50:04.8338482Z 2026-10-24T18:50:04.8338618Z ---------------------------------------- 2026-10-24T18:50:04.8338838Z 2026-10-24T18:50:04.8339014Z VM ID: blacksmith-8vcpu-ubuntu-2404-blapq2es55qvyp72 2026-10-24T18:50:04.8339413Z Host: production-152.236.41.44-x8664 2026-10-24T18:50:04.8339705Z Host Agent PID: 126128 2026-10-24T18:50:04.8339936Z Host Agent Git SHA: 1637818df 2026-10-24T18:50:04.8340188Z Host CPU Manufacturer: AuthenticAMD 2026-10-24T18:50:04.8340458Z Blacksmith Host Generation: gen 2 2026-10-24T18:50:04.8340735Z Petname: production-harmless-ibex-919985c9 2026-10-24T18:50:04.8341008Z Region: us-east 2026-10-24T18:50:04.8341231Z Rootfs Version: ubuntu24-full-x64-081926 2026-10-24T18:50:04.8345209Z OS Version: Ubuntu 24.04.4 LTS 2026-10-24T18:50:04.8345483Z 2026-10-24T18:50:04.8345600Z Enabling Blacksmith transparent cache 2026-10-24T18:50:04.8539391Z ##[group]Run actions/checkout@v6 2026-10-24T18:50:04.8539676Z with: 2026-10-24T18:50:04.8539989Z sparse-checkout: /* !/.repos/ !/apps/mobile/modules/t3-terminal/Vendor/**/*.a 2026-10-24T18:50:04.8540374Z sparse-checkout-cone-mode: false 2026-10-24T18:50:04.8540643Z repository: pingdotgg/t3code 2026-10-24T18:50:04.8542408Z token: *** 2026-10-24T18:50:04.8542614Z ssh-strict: true 2026-10-24T18:50:04.8542829Z ssh-user: git 2026-10-24T18:50:04.8543046Z persist-credentials: true 2026-10-24T18:50:04.8543433Z clean: true 2026-10-24T18:50:04.8543639Z fetch-depth: 1 2026-10-24T18:50:04.8543848Z fetch-tags: false 2026-10-24T18:50:04.8544063Z show-progress: true 2026-10-24T18:50:04.8544277Z lfs: false 2026-10-24T18:50:04.8544477Z submodules: false 2026-10-24T18:50:04.8544696Z set-safe-directory: true 2026-10-24T18:50:04.8544995Z allow-unsafe-pr-checkout: false 2026-10-24T18:50:04.8545246Z env: 2026-10-24T18:50:04.8545474Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 166 2026-10-24T18:50:04.8545751Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 371 2026-10-24T18:50:04.8546022Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T18:50:04.8546275Z ##[endgroup] 2026-10-24T18:50:04.9481074Z Syncing repository: pingdotgg/t3code 2026-10-24T18:50:04.9482000Z ##[group]Getting Git version info 2026-10-24T18:50:04.9482334Z Working directory is '/home/runner/_work/t3code/t3code' 2026-10-24T18:50:04.9482810Z [command]/usr/local/bin/git version 2026-10-24T18:50:04.9544676Z git version 2.55.0 2026-10-24T18:50:04.9556387Z ##[endgroup] 2026-10-24T18:50:04.9562985Z Temporarily overriding HOME='/home/runner/_work/_temp/35cd3a25-c828-4a07-a718-4484e9b04202' before making global git config changes 2026-10-24T18:50:04.9563629Z Adding repository directory to the temporary git global config as a safe directory 2026-10-24T18:50:04.9566379Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-24T18:50:04.9596965Z Deleting the contents of '/home/runner/_work/t3code/t3code' 2026-10-24T18:50:04.9598580Z ##[group]Determining repository object format 2026-10-24T18:50:04.9599735Z ##[endgroup] 2026-10-24T18:50:04.9600081Z ##[group]Initializing the repository 2026-10-24T18:50:04.9601913Z [command]/usr/local/bin/git init /home/runner/_work/t3code/t3code 2026-10-24T18:50:04.9631819Z hint: Using 'master' as the name for the initial branch. This default branch name 2026-10-24T18:50:04.9632284Z hint: will change to "main" in Git 3.0. To configure the initial branch name 2026-10-24T18:50:04.9632733Z hint: to use in all of your new repositories, which will suppress this warning, 2026-10-24T18:50:04.9633085Z hint: call: 2026-10-24T18:50:04.9633281Z hint: 2026-10-24T18:50:04.9633534Z hint: git config --global init.defaultBranch 2026-10-24T18:50:04.9633827Z hint: 2026-10-24T18:50:04.9634101Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and 2026-10-24T18:50:04.9634539Z hint: 'development'. The just-created branch can be renamed via this command: 2026-10-24T18:50:04.9634958Z hint: 2026-10-24T18:50:04.9635165Z hint: git branch -m 2026-10-24T18:50:04.9635390Z hint: 2026-10-24T18:50:04.9635688Z hint: Disable this message with "git config set advice.defaultBranchName false" 2026-10-24T18:50:04.9636147Z Initialized empty Git repository in /home/runner/_work/t3code/t3code/.git/ 2026-10-24T18:50:04.9637147Z [command]/usr/local/bin/git remote add origin https://github.com/pingdotgg/t3code 2026-10-24T18:50:04.9658571Z ##[endgroup] 2026-10-24T18:50:04.9658934Z ##[group]Disabling automatic garbage collection 2026-10-24T18:50:04.9660730Z [command]/usr/local/bin/git config --local gc.auto 0 2026-10-24T18:50:04.9678883Z ##[endgroup] 2026-10-24T18:50:04.9679210Z ##[group]Setting up auth 2026-10-24T18:50:04.9679524Z Removing SSH command configuration 2026-10-24T18:50:04.9682937Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-24T18:50:04.9703657Z [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-24T18:50:04.9828945Z Removing HTTP extra header 2026-10-24T18:50:04.9832240Z [command]/usr/local/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader 2026-10-24T18:50:04.9860563Z [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-24T18:50:04.9948746Z Removing includeIf entries pointing to credentials config files 2026-10-24T18:50:04.9951955Z [command]/usr/local/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: 2026-10-24T18:50:04.9974744Z [command]/usr/local/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url 2026-10-24T18:50:05.0071189Z [command]/usr/local/bin/git config --file /home/runner/_work/_temp/git-credentials-adb90a42-29f5-440b-8710-f1b8853bae92.config http.https://github.com/.extraheader AUTHORIZATION: basic *** 2026-10-24T18:50:05.0099782Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git.path /home/runner/_work/_temp/git-credentials-adb90a42-29f5-440b-8710-f1b8853bae92.config 2026-10-24T18:50:05.0117752Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git/worktrees/*.path /home/runner/_work/_temp/git-credentials-adb90a42-29f5-440b-8710-f1b8853bae92.config 2026-10-24T18:50:05.0135504Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-adb90a42-29f5-440b-8710-f1b8853bae92.config 2026-10-24T18:50:05.0153101Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-adb90a42-29f5-440b-8710-f1b8853bae92.config 2026-10-24T18:50:05.0168739Z ##[endgroup] 2026-10-24T18:50:05.0169101Z ##[group]Fetching the repository 2026-10-24T18:50:05.0173738Z [command]/usr/local/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --filter=blob:none --depth=1 origin +71df573f2d6910048e304282b960981cb45672b1:refs/remotes/origin/main 2026-10-24T18:50:05.3083648Z From https://github.com/pingdotgg/t3code 2026-10-24T18:50:05.3084541Z * [new ref] 71df573f2d6910048e304282b960981cb45672b1 -> origin/main 2026-10-24T18:50:05.3107696Z [command]/usr/local/bin/git branch --list --remote origin/main 2026-10-24T18:50:05.3126742Z origin/main 2026-10-24T18:50:05.3130945Z [command]/usr/local/bin/git rev-parse refs/remotes/origin/main 2026-10-24T18:50:05.3146987Z 71df573f2d6910048e304282b960981cb45672b1 2026-10-24T18:50:05.3149130Z ##[endgroup] 2026-10-24T18:50:05.3149855Z ##[group]Determining the checkout info 2026-10-24T18:50:05.3150690Z ##[endgroup] 2026-10-24T18:50:05.3151442Z ##[group]Setting up sparse checkout 2026-10-24T18:50:05.3152146Z [command]/usr/local/bin/git config core.sparseCheckout true 2026-10-24T18:50:05.3170929Z [command]/usr/local/bin/git rev-parse --git-path info/sparse-checkout 2026-10-24T18:50:05.3185722Z .git/info/sparse-checkout 2026-10-24T18:50:05.3189053Z ##[endgroup] 2026-10-24T18:50:05.3189990Z ##[group]Checking out the ref 2026-10-24T18:50:05.3191295Z [command]/usr/local/bin/git checkout --progress --force -B main refs/remotes/origin/main 2026-10-24T18:50:12.3473814Z Updating files: 0% (1/6400) 2026-10-24T18:50:12.3502517Z Updating files: 1% (64/6400) 2026-10-24T18:50:12.3519132Z Updating files: 2% (128/6400) 2026-10-24T18:50:12.3539387Z Updating files: 3% (192/6400) 2026-10-24T18:50:12.3560887Z Updating files: 4% (256/6400) 2026-10-24T18:50:12.3593045Z Updating files: 5% (320/6400) 2026-10-24T18:50:12.3614451Z Updating files: 6% (384/6400) 2026-10-24T18:50:12.3671318Z Updating files: 7% (448/6400) 2026-10-24T18:50:12.3708709Z Updating files: 8% (512/6400) 2026-10-24T18:50:12.3733925Z Updating files: 9% (576/6400) 2026-10-24T18:50:12.3984730Z Updating files: 10% (640/6400) 2026-10-24T18:50:12.4000473Z Updating files: 11% (704/6400) 2026-10-24T18:50:12.4010902Z Updating files: 12% (768/6400) 2026-10-24T18:50:12.4026016Z Updating files: 13% (832/6400) 2026-10-24T18:50:12.4041544Z Updating files: 14% (896/6400) 2026-10-24T18:50:12.4059626Z Updating files: 15% (960/6400) 2026-10-24T18:50:12.4079619Z Updating files: 16% (1024/6400) 2026-10-24T18:50:12.4094089Z Updating files: 17% (1088/6400) 2026-10-24T18:50:12.4111854Z Updating files: 18% (1152/6400) 2026-10-24T18:50:12.4126314Z Updating files: 19% (1216/6400) 2026-10-24T18:50:12.4149191Z Updating files: 20% (1280/6400) 2026-10-24T18:50:12.4165884Z Updating files: 21% (1344/6400) 2026-10-24T18:50:12.4184190Z Updating files: 22% (1408/6400) 2026-10-24T18:50:12.4197212Z Updating files: 23% (1472/6400) 2026-10-24T18:50:12.4210328Z Updating files: 24% (1536/6400) 2026-10-24T18:50:12.4225327Z Updating files: 25% (1600/6400) 2026-10-24T18:50:12.4239078Z Updating files: 26% (1664/6400) 2026-10-24T18:50:12.4253113Z Updating files: 27% (1728/6400) 2026-10-24T18:50:12.4273501Z Updating files: 28% (1792/6400) 2026-10-24T18:50:12.4307054Z Updating files: 29% (1856/6400) 2026-10-24T18:50:12.4327207Z Updating files: 30% (1920/6400) 2026-10-24T18:50:12.4351114Z Updating files: 31% (1984/6400) 2026-10-24T18:50:12.4380241Z Updating files: 32% (2048/6400) 2026-10-24T18:50:12.4408132Z Updating files: 33% (2112/6400) 2026-10-24T18:50:12.4477995Z Updating files: 34% (2176/6400) 2026-10-24T18:50:12.4533907Z Updating files: 35% (2240/6400) 2026-10-24T18:50:12.4568899Z Updating files: 36% (2304/6400) 2026-10-24T18:50:12.4599778Z Updating files: 37% (2368/6400) 2026-10-24T18:50:12.4646644Z Updating files: 38% (2432/6400) 2026-10-24T18:50:12.4673871Z Updating files: 39% (2496/6400) 2026-10-24T18:50:12.4703739Z Updating files: 40% (2560/6400) 2026-10-24T18:50:12.4731431Z Updating files: 41% (2624/6400) 2026-10-24T18:50:12.4745886Z Updating files: 42% (2688/6400) 2026-10-24T18:50:12.4755625Z Updating files: 43% (2752/6400) 2026-10-24T18:50:12.4784970Z Updating files: 44% (2816/6400) 2026-10-24T18:50:12.4811934Z Updating files: 45% (2880/6400) 2026-10-24T18:50:12.4840128Z Updating files: 46% (2944/6400) 2026-10-24T18:50:12.4864744Z Updating files: 47% (3008/6400) 2026-10-24T18:50:12.4892104Z Updating files: 48% (3072/6400) 2026-10-24T18:50:12.4931888Z Updating files: 49% (3136/6400) 2026-10-24T18:50:12.4958650Z Updating files: 50% (3200/6400) 2026-10-24T18:50:12.4973606Z Updating files: 51% (3264/6400) 2026-10-24T18:50:12.5008461Z Updating files: 52% (3328/6400) 2026-10-24T18:50:12.5035702Z Updating files: 53% (3392/6400) 2026-10-24T18:50:12.5054918Z Updating files: 54% (3456/6400) 2026-10-24T18:50:12.5076739Z Updating files: 55% (3520/6400) 2026-10-24T18:50:12.5092127Z Updating files: 56% (3584/6400) 2026-10-24T18:50:12.5113013Z Updating files: 57% (3648/6400) 2026-10-24T18:50:12.5130313Z Updating files: 58% (3712/6400) 2026-10-24T18:50:12.5492001Z Updating files: 59% (3776/6400) 2026-10-24T18:50:12.5506133Z Updating files: 60% (3840/6400) 2026-10-24T18:50:12.5525101Z Updating files: 61% (3904/6400) 2026-10-24T18:50:12.5542772Z Updating files: 62% (3968/6400) 2026-10-24T18:50:12.5564465Z Updating files: 63% (4032/6400) 2026-10-24T18:50:12.5591326Z Updating files: 64% (4096/6400) 2026-10-24T18:50:12.5610023Z Updating files: 65% (4160/6400) 2026-10-24T18:50:12.5626663Z Updating files: 66% (4224/6400) 2026-10-24T18:50:12.5649038Z Updating files: 67% (4288/6400) 2026-10-24T18:50:12.5663335Z Updating files: 68% (4352/6400) 2026-10-24T18:50:12.5680280Z Updating files: 69% (4416/6400) 2026-10-24T18:50:12.5694760Z Updating files: 70% (4480/6400) 2026-10-24T18:50:12.5712620Z Updating files: 71% (4544/6400) 2026-10-24T18:50:12.5724953Z Updating files: 72% (4608/6400) 2026-10-24T18:50:12.5769733Z Updating files: 73% (4672/6400) 2026-10-24T18:50:12.6164487Z Updating files: 74% (4736/6400) 2026-10-24T18:50:12.6186948Z Updating files: 75% (4800/6400) 2026-10-24T18:50:12.6208460Z Updating files: 76% (4864/6400) 2026-10-24T18:50:12.6233968Z Updating files: 77% (4928/6400) 2026-10-24T18:50:12.6254710Z Updating files: 78% (4992/6400) 2026-10-24T18:50:12.6270358Z Updating files: 79% (5056/6400) 2026-10-24T18:50:12.6291710Z Updating files: 80% (5120/6400) 2026-10-24T18:50:12.6306775Z Updating files: 81% (5184/6400) 2026-10-24T18:50:12.6324046Z Updating files: 82% (5248/6400) 2026-10-24T18:50:12.6345677Z Updating files: 83% (5312/6400) 2026-10-24T18:50:12.6369328Z Updating files: 84% (5376/6400) 2026-10-24T18:50:12.6386111Z Updating files: 85% (5440/6400) 2026-10-24T18:50:12.6410456Z Updating files: 86% (5504/6400) 2026-10-24T18:50:12.6480809Z Updating files: 87% (5568/6400) 2026-10-24T18:50:12.6509623Z Updating files: 88% (5632/6400) 2026-10-24T18:50:12.6528516Z Updating files: 89% (5696/6400) 2026-10-24T18:50:12.6556033Z Updating files: 90% (5760/6400) 2026-10-24T18:50:12.6585018Z Updating files: 91% (5824/6400) 2026-10-24T18:50:12.6599442Z Updating files: 92% (5888/6400) 2026-10-24T18:50:12.6621216Z Updating files: 93% (5952/6400) 2026-10-24T18:50:12.6640813Z Updating files: 94% (6016/6400) 2026-10-24T18:50:12.6663746Z Updating files: 95% (6080/6400) 2026-10-24T18:50:12.6718087Z Updating files: 96% (6144/6400) 2026-10-24T18:50:12.6742647Z Updating files: 97% (6208/6400) 2026-10-24T18:50:12.6786549Z Updating files: 98% (6272/6400) 2026-10-24T18:50:12.6805537Z Updating files: 99% (6336/6400) 2026-10-24T18:50:12.6805793Z Updating files: 100% (6400/6400) 2026-10-24T18:50:12.6806072Z Updating files: 100% (6400/6400), done. 2026-10-24T18:50:12.6956927Z Switched to a new branch 'main' 2026-10-24T18:50:12.6957684Z branch 'main' set up to track 'origin/main'. 2026-10-24T18:50:12.6970561Z ##[endgroup] 2026-10-24T18:50:12.7004321Z [command]/usr/local/bin/git log -1 --format=%H 2026-10-24T18:50:12.7022738Z 71df573f2d6910048e304282b960981cb45672b1 2026-10-24T18:50:12.7094091Z ##[group]Run files="$(git ls-files .github/pr-assets)" 2026-10-24T18:50:12.7094349Z files="$(git ls-files .github/pr-assets)" 2026-10-24T18:50:12.7094555Z if test -n "$files"; then 2026-10-24T18:50:12.7094799Z  printf 'PR evidence must be uploaded to GitHub, not committed:\n%s\n' "$files" >&2 2026-10-24T18:50:12.7095032Z  exit 1 2026-10-24T18:50:12.7095159Z fi 2026-10-24T18:50:12.7115305Z shell: /usr/bin/bash -e {0} 2026-10-24T18:50:12.7115460Z env: 2026-10-24T18:50:12.7115599Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 166 2026-10-24T18:50:12.7115782Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 371 2026-10-24T18:50:12.7115949Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T18:50:12.7116102Z ##[endgroup] 2026-10-24T18:50:12.7270691Z Prepare all required actions 2026-10-24T18:50:12.7271049Z Getting action download info 2026-10-24T18:50:12.8202193Z Download action repository 'voidzero-dev/setup-vp@v1' (SHA:250f29ce396baf5e8f24498e17c0dfdebabc26eb) 2026-10-24T18:50:12.9132931Z ##[group]Run ./.github/actions/setup-ci-deps 2026-10-24T18:50:12.9133210Z env: 2026-10-24T18:50:12.9133583Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 166 2026-10-24T18:50:12.9133848Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 371 2026-10-24T18:50:12.9134058Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T18:50:12.9134220Z ##[endgroup] 2026-10-24T18:50:12.9224114Z ##[start-action display=Resolve Vite+ version;id=__self.vp] 2026-10-24T18:50:12.9237057Z ##[group]Run echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-24T18:50:12.9237429Z echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-24T18:50:12.9237740Z echo "node=$(jq -r '.engines.node' package.json)" >> "$GITHUB_OUTPUT" 2026-10-24T18:50:12.9237998Z echo "pnpm=$(jq -r '.packageManager' package.json)" >> "$GITHUB_OUTPUT" 2026-10-24T18:50:12.9256886Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T18:50:12.9257069Z env: 2026-10-24T18:50:12.9257201Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 166 2026-10-24T18:50:12.9257364Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 371 2026-10-24T18:50:12.9257531Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T18:50:12.9257686Z ##[endgroup] 2026-10-24T18:50:12.9332474Z ##[end-action id=__self.vp;outcome=success;conclusion=success;duration_ms=10] 2026-10-24T18:50:12.9333842Z ##[start-action display=Cache Vite+;id=__self.vp_cache] 2026-10-24T18:50:12.9377763Z ##[group]Run actions/cache@v6 2026-10-24T18:50:12.9377921Z with: 2026-10-24T18:50:12.9378241Z path: ~/.vite-plus 2026-10-24T18:50:12.9378429Z key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T18:50:12.9378645Z enableCrossOsArchive: false 2026-10-24T18:50:12.9378796Z fail-on-cache-miss: false 2026-10-24T18:50:12.9378958Z lookup-only: false 2026-10-24T18:50:12.9379100Z save-always: false 2026-10-24T18:50:12.9379233Z env: 2026-10-24T18:50:12.9379362Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 166 2026-10-24T18:50:12.9379530Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 371 2026-10-24T18:50:12.9379691Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T18:50:12.9379845Z ##[endgroup] 2026-10-24T18:50:13.1343776Z Cache hit for: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T18:50:13.5065363Z Received 170349591 of 170349591 (100.0%), 462.8 MBs/sec 2026-10-24T18:50:13.5065950Z Cache Size: ~162 MB (170349591 B) 2026-10-24T18:50:13.5106329Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/a3f8e21f-2790-4309-9919-22af0fbbab2a/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T18:50:14.1813761Z Cache restored successfully 2026-10-24T18:50:14.2041635Z Cache restored from key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T18:50:14.2134115Z ##[end-action id=__self.vp_cache;outcome=success;conclusion=success;duration_ms=1279] 2026-10-24T18:50:14.2136899Z ##[start-action display=Use cached Vite+;id=__self.__run] 2026-10-24T18:50:14.2161327Z ##[group]Run echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-24T18:50:14.2161596Z echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-24T18:50:14.2161779Z "$HOME/.vite-plus/bin/vp" env use "26.12.1" 2026-10-24T18:50:14.2186967Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T18:50:14.2187167Z env: 2026-10-24T18:50:14.2187314Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 166 2026-10-24T18:50:14.2187477Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 371 2026-10-24T18:50:14.2187632Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T18:50:14.2187836Z ##[endgroup] 2026-10-24T18:50:14.2244889Z Using Node.js v26.12.1 (resolved from 26.12.1) 2026-10-24T18:50:14.2255975Z ##[end-action id=__self.__run;outcome=success;conclusion=success;duration_ms=11] 2026-10-24T18:50:14.2257944Z ##[start-action display=Setup Vite+;id=__self.__voidzero-dev_setup-vp] 2026-10-24T18:50:14.2263653Z ##[end-action id=__self.__voidzero-dev_setup-vp;outcome=skipped;conclusion=skipped;duration_ms=0] 2026-10-24T18:50:14.2265035Z ##[start-action display=Resolve pnpm store path;id=__self.pnpm_store] 2026-10-24T18:50:14.2276353Z ##[group]Run store_path="$(vp pm cache dir)" 2026-10-24T18:50:14.2276547Z store_path="$(vp pm cache dir)" 2026-10-24T18:50:14.2276717Z echo "path=$store_path" >> "$GITHUB_OUTPUT" 2026-10-24T18:50:14.2304658Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T18:50:14.2304874Z env: 2026-10-24T18:50:14.2305001Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 166 2026-10-24T18:50:14.2305158Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 371 2026-10-24T18:50:14.2305343Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T18:50:14.2305539Z ##[endgroup] 2026-10-24T18:50:14.2490830Z ##[end-action id=__self.pnpm_store;outcome=success;conclusion=success;duration_ms=22] 2026-10-24T18:50:14.2493587Z ##[start-action display=Cache full pnpm store;id=__self.__actions_cache] 2026-10-24T18:50:14.2891956Z ##[group]Run actions/cache@v6 2026-10-24T18:50:14.2892125Z with: 2026-10-24T18:50:14.2892265Z path: /home/runner/.local/share/pnpm/store/v11 2026-10-24T18:50:14.2892555Z key: pnpm-full-v1-Linux-X64-fa50cf9b003d547cd32552f61b874eb4abe5dace3fdb4b1abd9610da2da24074 2026-10-24T18:50:14.2892816Z restore-keys: pnpm-full-v1-Linux-X64- 2026-10-24T18:50:14.2892971Z enableCrossOsArchive: false 2026-10-24T18:50:14.2893117Z fail-on-cache-miss: false 2026-10-24T18:50:14.2893250Z lookup-only: false 2026-10-24T18:50:14.2893372Z save-always: false 2026-10-24T18:50:14.2893491Z env: 2026-10-24T18:50:14.2893620Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 166 2026-10-24T18:50:14.2894037Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 371 2026-10-24T18:50:14.2894268Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T18:50:14.2894470Z ##[endgroup] 2026-10-24T18:50:14.4897031Z Cache hit for: pnpm-full-v1-Linux-X64-fa50cf9b003d547cd32552f61b874eb4abe5dace3fdb4b1abd9610da2da24074 2026-10-24T18:50:15.5062251Z Received 671088640 of 994208090 (67.5%), 638.7 MBs/sec 2026-10-24T18:50:15.9837597Z Received 994208090 of 994208090 (100.0%), 640.6 MBs/sec 2026-10-24T18:50:15.9837935Z Cache Size: ~948 MB (994208090 B) 2026-10-24T18:50:15.9875229Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/2fddd807-d1df-43a0-8047-287a9c5b59a2/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T18:50:21.0848260Z Cache restored successfully 2026-10-24T18:50:21.1331053Z Cache restored from key: pnpm-full-v1-Linux-X64-fa50cf9b003d547cd32552f61b874eb4abe5dace3fdb4b1abd9610da2da24074 2026-10-24T18:50:21.1405921Z ##[end-action id=__self.__actions_cache;outcome=success;conclusion=success;duration_ms=6891] 2026-10-24T18:50:21.1408588Z ##[start-action display=Install dependencies;id=__self.__run_2] 2026-10-24T18:50:21.1419717Z ##[group]Run vp install 2026-10-24T18:50:21.1419872Z vp install 2026-10-24T18:50:21.1440012Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T18:50:21.1440182Z env: 2026-10-24T18:50:21.1440298Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 166 2026-10-24T18:50:21.1440447Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 371 2026-10-24T18:50:21.1440591Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T18:50:21.1440726Z ##[endgroup] 2026-10-24T18:50:21.1785498Z Scope: all 34 workspace projects 2026-10-24T18:50:21.2771318Z ? Verifying lockfile against supply-chain policies (2088 entries)... 2026-10-24T18:50:21.5164208Z Packages are hard linked from the content-addressable store to the virtual store. 2026-10-24T18:50:21.5164702Z Content-addressable store is at: /home/runner/.local/share/pnpm/store/v11 2026-10-24T18:50:21.5165804Z Virtual store is at: node_modules/.pnpm 2026-10-24T18:50:23.7775712Z ✓ Lockfile passes supply-chain policies (2088 entries in 2.5s) 2026-10-24T18:50:23.7775979Z Lockfile is up to date, resolution step is skipped 2026-10-24T18:50:23.7943274Z Packages: +1721 2026-10-24T18:50:23.7943471Z ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2026-10-24T18:50:23.8219069Z Progress: resolved 1721, reused 1718, downloaded 0, added 1721, done 2026-10-24T18:50:24.7147502Z . prepare$ vp config --no-agent 2026-10-24T18:50:24.8212713Z . prepare: Done 2026-10-24T18:50:24.8227244Z 2026-10-24T18:50:24.8227667Z devDependencies: 2026-10-24T18:50:24.8227907Z + @coderabbitai/config 1.1.0 2026-10-24T18:50:24.8228119Z + @shadcn/lint 0.1.5 2026-10-24T18:50:24.8228336Z + @types/node 24.12.4 2026-10-24T18:50:24.8228537Z + knip 6.34.0 2026-10-24T18:50:24.8228768Z + typescript <- @tsc-rs/typescript 0.8.0 2026-10-24T18:50:24.8229000Z + vite-plus 1.3.0 2026-10-24T18:50:24.8229105Z 2026-10-24T18:50:24.8245267Z Done in 3.7s using pnpm v12.14.0 2026-10-24T18:50:24.8400108Z ##[end-action id=__self.__run_2;outcome=success;conclusion=success;duration_ms=3699] 2026-10-24T18:50:24.8880329Z ##[group]Run actions/cache@v6 2026-10-24T18:50:24.8880482Z with: 2026-10-24T18:50:24.8880599Z path: ~/.cache/electron 2026-10-24T18:50:24.8880842Z key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T18:50:24.8881080Z enableCrossOsArchive: false 2026-10-24T18:50:24.8881217Z fail-on-cache-miss: false 2026-10-24T18:50:24.8881340Z lookup-only: false 2026-10-24T18:50:24.8881457Z save-always: false 2026-10-24T18:50:24.8881564Z env: 2026-10-24T18:50:24.8881677Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 166 2026-10-24T18:50:24.8881826Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 371 2026-10-24T18:50:24.8881986Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T18:50:24.8882123Z ##[endgroup] 2026-10-24T18:50:25.0767237Z Cache hit for: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T18:50:25.2357840Z Received 122906203 of 122906203 (100.0%), 808.4 MBs/sec 2026-10-24T18:50:25.2358485Z Cache Size: ~117 MB (122906203 B) 2026-10-24T18:50:25.2400356Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/a1560799-21c2-4032-96ba-28024d0b4aa9/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T18:50:25.2992848Z Cache restored successfully 2026-10-24T18:50:25.3543980Z Cache restored from key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T18:50:25.3657105Z ##[group]Run vp run --filter @t3tools/desktop ensure:electron 2026-10-24T18:50:25.3657435Z vp run --filter @t3tools/desktop ensure:electron 2026-10-24T18:50:25.3679818Z shell: /usr/bin/bash -e {0} 2026-10-24T18:50:25.3679956Z env: 2026-10-24T18:50:25.3680267Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 166 2026-10-24T18:50:25.3680424Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 371 2026-10-24T18:50:25.3680567Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T18:50:25.3680704Z ##[endgroup] 2026-10-24T18:50:25.5440752Z ~/apps/desktop$ node scripts/ensure-electron-runtime.mjs ⊘ cache disabled 2026-10-24T18:50:26.0988337Z /home/runner/_work/t3code/t3code/node_modules/.pnpm/electron@44.9.3_supports-color@8.1.1/node_modules/electron/dist/electron 2026-10-24T18:50:26.1005697Z 2026-10-24T18:50:26.1134615Z ##[group]Run vp run knip:check 2026-10-24T18:50:26.1134959Z vp run knip:check 2026-10-24T18:50:26.1155176Z shell: /usr/bin/bash -e {0} 2026-10-24T18:50:26.1155305Z env: 2026-10-24T18:50:26.1155425Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 166 2026-10-24T18:50:26.1155574Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 371 2026-10-24T18:50:26.1155722Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T18:50:26.1155854Z ##[endgroup] 2026-10-24T18:50:26.2586605Z $ knip --include files,dependencies --no-config-hints ⊘ cache disabled 2026-10-24T18:50:29.8821389Z 2026-10-24T18:50:29.8824264Z $ 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-24T18:50:37.9166339Z 2026-10-24T18:50:37.9173913Z --- 2026-10-24T18:50:37.9174194Z vp run: 2/2 successful. (Run `vp run --last-details` for full details) 2026-10-24T18:50:37.9280825Z ##[group]Run vp run --filter @t3tools/source-control-github generate --check 2026-10-24T18:50:37.9281176Z vp run --filter @t3tools/source-control-github generate --check 2026-10-24T18:50:37.9301421Z shell: /usr/bin/bash -e {0} 2026-10-24T18:50:37.9301563Z env: 2026-10-24T18:50:37.9301678Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 166 2026-10-24T18:50:37.9301830Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 371 2026-10-24T18:50:37.9301972Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T18:50:37.9302105Z ##[endgroup] 2026-10-24T18:50:38.0751012Z ~/packages/source-control-github$ graphqlgen --check ⊘ cache disabled 2026-10-24T18:50:38.2572052Z 2026-10-24T18:50:38.2655068Z ##[group]Run vp run --filter t3 generate --check 2026-10-24T18:50:38.2655308Z vp run --filter t3 generate --check 2026-10-24T18:50:38.2674579Z shell: /usr/bin/bash -e {0} 2026-10-24T18:50:38.2674706Z env: 2026-10-24T18:50:38.2674830Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 166 2026-10-24T18:50:38.2674975Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 371 2026-10-24T18:50:38.2675115Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T18:50:38.2675247Z ##[endgroup] 2026-10-24T18:50:38.4100834Z ~/apps/server$ graphqlgen --check ⊘ cache disabled 2026-10-24T18:50:38.5710466Z 2026-10-24T18:50:38.5776942Z ##[group]Run vp check 2026-10-24T18:50:38.5777133Z vp check 2026-10-24T18:50:38.5796963Z shell: /usr/bin/bash -e {0} 2026-10-24T18:50:38.5797104Z env: 2026-10-24T18:50:38.5797220Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 166 2026-10-24T18:50:38.5797370Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 371 2026-10-24T18:50:38.5797519Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T18:50:38.5797657Z ##[endgroup] 2026-10-24T18:50:39.1188560Z pass: All 5749 files are correctly formatted (401ms, 8 threads) 2026-10-24T18:50:44.1191376Z warn: Lint warnings found 2026-10-24T18:50:44.1192684Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T18:50:44.1193173Z ╭─[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:60:5] 2026-10-24T18:50:44.1193432Z 58 │ 2026-10-24T18:50:44.1193601Z 59 │ useEffect(() => { 2026-10-24T18:50:44.1193786Z ·  ────┬──── 2026-10-24T18:50:44.1194023Z · ╰── This is the containing effect 2026-10-24T18:50:44.1194291Z 60 │ setMountedModes((current) => { 2026-10-24T18:50:44.1194489Z ·  ───────┬─────── 2026-10-24T18:50:44.1194754Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1195011Z 61 │ if (current.has(props.mode)) { 2026-10-24T18:50:44.1195209Z ╰──── 2026-10-24T18:50:44.1195900Z  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-24T18:50:44.1196852Z  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-24T18:50:44.1197159Z 2026-10-24T18:50:44.1197451Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T18:50:44.1197856Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:290:50] 2026-10-24T18:50:44.1198087Z 289 │ return ( 2026-10-24T18:50:44.1198326Z 290 │ 2026-10-24T18:50:44.1198630Z ·  ───────────── 2026-10-24T18:50:44.1198844Z 291 │ {props.children} 2026-10-24T18:50:44.1199011Z ╰──── 2026-10-24T18:50:44.1199286Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T18:50:44.1199680Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T18:50:44.1199862Z 2026-10-24T18:50:44.1200102Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T18:50:44.1200513Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:654:44] 2026-10-24T18:50:44.1200744Z 653 │ return ( 2026-10-24T18:50:44.1200951Z 654 │ 2026-10-24T18:50:44.1201206Z ·  ───────────── 2026-10-24T18:50:44.1201392Z 655 │ {props.children} 2026-10-24T18:50:44.1201577Z ╰──── 2026-10-24T18:50:44.1201860Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T18:50:44.1202216Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T18:50:44.1202394Z 2026-10-24T18:50:44.1202942Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T18:50:44.1203325Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1462:55] 2026-10-24T18:50:44.1203570Z 1461 │ return ( 2026-10-24T18:50:44.1204003Z 1462 │ 2026-10-24T18:50:44.1204346Z ·  ──────────────────── 2026-10-24T18:50:44.1204578Z 1463 │ { 2026-10-24T18:50:44.1206824Z ·  ────┬──── 2026-10-24T18:50:44.1207075Z · ╰── This is the containing effect 2026-10-24T18:50:44.1207407Z 215 │ const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null; 2026-10-24T18:50:44.1207650Z 216 │ if (inserted) { 2026-10-24T18:50:44.1207810Z 217 │ setSelection((current) => 2026-10-24T18:50:44.1208020Z ·  ──────┬───── 2026-10-24T18:50:44.1208308Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1208662Z 218 │ current.start === inserted.start && current.end === inserted.end ? current : inserted, 2026-10-24T18:50:44.1208903Z ╰──── 2026-10-24T18:50:44.1209614Z  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-24T18:50:44.1210522Z  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-24T18:50:44.1210826Z 2026-10-24T18:50:44.1211097Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T18:50:44.1211634Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:298:7] 2026-10-24T18:50:44.1211879Z 286 │ }, [hasWorkspaceSnapshot]); 2026-10-24T18:50:44.1212047Z 287 │ useEffect(() => { 2026-10-24T18:50:44.1212210Z ·  ────┬──── 2026-10-24T18:50:44.1212465Z · ╰── This is the containing effect 2026-10-24T18:50:44.1212773Z 288 │ if (!environmentId || !projectCwd || !selectedProviderInstanceId) return; 2026-10-24T18:50:44.1213073Z 289 │ const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`; 2026-10-24T18:50:44.1213329Z 290 │ const now = Date.now(); 2026-10-24T18:50:44.1213547Z 291 │ const lastRequest = workspaceRefreshKeyRef.current; 2026-10-24T18:50:44.1213748Z 292 │ if ( 2026-10-24T18:50:44.1213897Z 293 │ lastRequest?.key === key && 2026-10-24T18:50:44.1214143Z 294 │ now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS 2026-10-24T18:50:44.1214375Z 295 │ ) 2026-10-24T18:50:44.1214529Z 296 │ return; 2026-10-24T18:50:44.1214943Z 297 │ if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) { 2026-10-24T18:50:44.1215260Z 298 │ setWorkspaceRefreshRetry(null); 2026-10-24T18:50:44.1215502Z ·  ────────────┬─────────── 2026-10-24T18:50:44.1215798Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1216034Z 299 │ return; 2026-10-24T18:50:44.1216166Z ╰──── 2026-10-24T18:50:44.1216853Z  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-24T18:50:44.1217744Z  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-24T18:50:44.1218056Z 2026-10-24T18:50:44.1218259Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T18:50:44.1218670Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:328:5] 2026-10-24T18:50:44.1219079Z 327 │ }, [ 2026-10-24T18:50:44.1219451Z 328 │ draftMessage, 2026-10-24T18:50:44.1219644Z ·  ──────┬───── 2026-10-24T18:50:44.1219930Z · ╰── Unnecessary dependency `draftMessage` 2026-10-24T18:50:44.1220192Z 329 │ environmentId, 2026-10-24T18:50:44.1220344Z ╰──── 2026-10-24T18:50:44.1220716Z  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-24T18:50:44.1221371Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1221668Z 2026-10-24T18:50:44.1221922Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T18:50:44.1222251Z ╭─[apps/mobile/src/state/thread-order.ts:29:7] 2026-10-24T18:50:44.1222451Z 28 │ getPendingThreadOrder(); 2026-10-24T18:50:44.1222665Z 29 │ }, [nowMinute, snoozeWakeTick]); 2026-10-24T18:50:44.1222903Z ·  ────┬──── ───────┬────── 2026-10-24T18:50:44.1223219Z · │ ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T18:50:44.1223582Z · ╰── Unnecessary dependency `nowMinute` 2026-10-24T18:50:44.1223801Z 30 │ return pending; 2026-10-24T18:50:44.1223936Z ╰──── 2026-10-24T18:50:44.1224315Z  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-24T18:50:44.1224913Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1225248Z 2026-10-24T18:50:44.1225407Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1225716Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:152:27] 2026-10-24T18:50:44.1226115Z 151 │ 2026-10-24T18:50:44.1226537Z 152 │ {props.children(open)} 2026-10-24T18:50:44.1226866Z ·  ──┬─ 2026-10-24T18:50:44.1227199Z · ╰── Cannot access ref value during render 2026-10-24T18:50:44.1228052Z 153 │ 2026-10-24T18:50:44.1228187Z ╰──── 2026-10-24T18:50:44.1228748Z  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-24T18:50:44.1229554Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1229856Z 2026-10-24T18:50:44.1230060Z ⚠ react(memo-dependencies): Found missing/extra memoization dependencies 2026-10-24T18:50:44.1230442Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:140:9] 2026-10-24T18:50:44.1230695Z 139 │ if (action.id !== undefined) { 2026-10-24T18:50:44.1230880Z 140 │ props.onPressAction?.({ 2026-10-24T18:50:44.1231052Z ·  ──┬── 2026-10-24T18:50:44.1231312Z · ╰── Missing dependency `props` 2026-10-24T18:50:44.1231550Z 141 │ nativeEvent: { event: action.id }, 2026-10-24T18:50:44.1231822Z 142 │ } as Parameters>[0]); 2026-10-24T18:50:44.1232065Z 143 │ } 2026-10-24T18:50:44.1232200Z 144 │ }, 2026-10-24T18:50:44.1232358Z 145 │ [close, props.onPressAction], 2026-10-24T18:50:44.1232559Z ·  ─────────┬───────── 2026-10-24T18:50:44.1232917Z · ╰── Overly precise dependency `props.onPressAction`, use `props` instead 2026-10-24T18:50:44.1233185Z 146 │ ); 2026-10-24T18:50:44.1233300Z ╰──── 2026-10-24T18:50:44.1233864Z  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-24T18:50:44.1234624Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1234918Z 2026-10-24T18:50:44.1235123Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-24T18:50:44.1235494Z ╭─[apps/server/src/sourceControl/SourceControlProviderRegistry.ts:15:13] 2026-10-24T18:50:44.1235846Z 14 │ } from "@t3tools/contracts"; 2026-10-24T18:50:44.1236053Z 15 │ import type {} from "@t3tools/contracts"; 2026-10-24T18:50:44.1236236Z ·  ── 2026-10-24T18:50:44.1236374Z 16 │ 2026-10-24T18:50:44.1236485Z ╰──── 2026-10-24T18:50:44.1236619Z  help: Remove empty braces 2026-10-24T18:50:44.1236722Z 2026-10-24T18:50:44.1236886Z ⚠ react(immutability): This value cannot be modified 2026-10-24T18:50:44.1237203Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:111:5] 2026-10-24T18:50:44.1237426Z 107 │ ); 2026-10-24T18:50:44.1237644Z 108 │ const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0); 2026-10-24T18:50:44.1237988Z ·  ─────────┬──────── 2026-10-24T18:50:44.1238361Z · ╰── `separationProgress` originates here 2026-10-24T18:50:44.1238557Z 109 │ 2026-10-24T18:50:44.1238685Z 110 │ useEffect(() => { 2026-10-24T18:50:44.1238978Z 111 │ separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING); 2026-10-24T18:50:44.1239257Z ·  ─────────┬──────── 2026-10-24T18:50:44.1239503Z · ╰── `separationProgress` cannot be modified 2026-10-24T18:50:44.1239778Z 112 │ }, [props.showScrollToEnd, separationProgress]); 2026-10-24T18:50:44.1239951Z ╰──── 2026-10-24T18:50:44.1240270Z  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-24T18:50:44.1240827Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T18:50:44.1241119Z 2026-10-24T18:50:44.1241274Z ⚠ react(immutability): This value cannot be modified 2026-10-24T18:50:44.1241588Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-24T18:50:44.1241867Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-24T18:50:44.1242104Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-24T18:50:44.1242318Z ·  ──────┬───── 2026-10-24T18:50:44.1242547Z · ╰── `capsuleWidth` originates here 2026-10-24T18:50:44.1242797Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T18:50:44.1243041Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T18:50:44.1243280Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T18:50:44.1243493Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T18:50:44.1243668Z 134 │ return; 2026-10-24T18:50:44.1243799Z 135 │ } 2026-10-24T18:50:44.1243966Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T18:50:44.1244172Z 137 │ measuredWidthRef.current = width; 2026-10-24T18:50:44.1244416Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T18:50:44.1244646Z ·  ──────┬───── 2026-10-24T18:50:44.1244872Z · ╰── `capsuleWidth` cannot be modified 2026-10-24T18:50:44.1245065Z 139 │ }; 2026-10-24T18:50:44.1245176Z ╰──── 2026-10-24T18:50:44.1245496Z  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-24T18:50:44.1246054Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T18:50:44.1246339Z 2026-10-24T18:50:44.1246493Z ⚠ react(immutability): This value cannot be modified 2026-10-24T18:50:44.1246810Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-24T18:50:44.1247084Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-24T18:50:44.1247324Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-24T18:50:44.1247529Z ·  ──────┬───── 2026-10-24T18:50:44.1247756Z · ╰── `capsuleWidth` originates here 2026-10-24T18:50:44.1248089Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T18:50:44.1248432Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T18:50:44.1248661Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T18:50:44.1249177Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T18:50:44.1249384Z 134 │ return; 2026-10-24T18:50:44.1249524Z 135 │ } 2026-10-24T18:50:44.1249703Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T18:50:44.1249912Z 137 │ measuredWidthRef.current = width; 2026-10-24T18:50:44.1250164Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T18:50:44.1250377Z 139 │ }; 2026-10-24T18:50:44.1250531Z 140 │ const hasStatus = props.status !== null; 2026-10-24T18:50:44.1250770Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-24T18:50:44.1250997Z 142 │ useEffect(() => { 2026-10-24T18:50:44.1251446Z 143 │ if (!hasStatus) { 2026-10-24T18:50:44.1251624Z 144 │ measuredWidthRef.current = null; 2026-10-24T18:50:44.1251806Z 145 │ capsuleWidth.value = null; 2026-10-24T18:50:44.1251995Z ·  ──────┬───── 2026-10-24T18:50:44.1252246Z · ╰── `capsuleWidth` cannot be modified 2026-10-24T18:50:44.1252452Z 146 │ } 2026-10-24T18:50:44.1252568Z ╰──── 2026-10-24T18:50:44.1252894Z  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-24T18:50:44.1253466Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T18:50:44.1253857Z 2026-10-24T18:50:44.1254076Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T18:50:44.1254444Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-24T18:50:44.1254753Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-24T18:50:44.1254962Z 142 │ useEffect(() => { 2026-10-24T18:50:44.1255122Z ·  ───┬─── 2026-10-24T18:50:44.1255438Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-24T18:50:44.1255708Z 143 │ if (!hasStatus) { 2026-10-24T18:50:44.1255878Z 144 │ measuredWidthRef.current = null; 2026-10-24T18:50:44.1256058Z 145 │ capsuleWidth.value = null; 2026-10-24T18:50:44.1256233Z ·  ──────┬───── 2026-10-24T18:50:44.1256614Z · ╰── This modifies `capsuleWidth` 2026-10-24T18:50:44.1256889Z 146 │ } 2026-10-24T18:50:44.1257005Z ╰──── 2026-10-24T18:50:44.1257404Z  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-24T18:50:44.1258018Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T18:50:44.1258307Z 2026-10-24T18:50:44.1258509Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T18:50:44.1258899Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-24T18:50:44.1259180Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T18:50:44.1259427Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T18:50:44.1259686Z ·  ───────────────┬─────────────── 2026-10-24T18:50:44.1260043Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-24T18:50:44.1260369Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T18:50:44.1260586Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T18:50:44.1260766Z 134 │ return; 2026-10-24T18:50:44.1260893Z 135 │ } 2026-10-24T18:50:44.1261061Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T18:50:44.1261264Z 137 │ measuredWidthRef.current = width; 2026-10-24T18:50:44.1261530Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T18:50:44.1261765Z ·  ──────┬───── 2026-10-24T18:50:44.1261985Z · ╰── This modifies `capsuleWidth` 2026-10-24T18:50:44.1262177Z 139 │ }; 2026-10-24T18:50:44.1262290Z ╰──── 2026-10-24T18:50:44.1262680Z  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-24T18:50:44.1263288Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T18:50:44.1263575Z 2026-10-24T18:50:44.1263776Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T18:50:44.1264117Z ╭─[apps/mobile/src/state/use-thread-outbox-drain.ts:1321:5] 2026-10-24T18:50:44.1264348Z 1320 │ queuedMessagesByThreadKey, 2026-10-24T18:50:44.1264509Z 1321 │ retryTick, 2026-10-24T18:50:44.1264662Z ·  ────┬──── 2026-10-24T18:50:44.1264889Z · ╰── Unnecessary dependency `retryTick` 2026-10-24T18:50:44.1265102Z 1322 │ restoreQueuedMessage, 2026-10-24T18:50:44.1265249Z ╰──── 2026-10-24T18:50:44.1265591Z  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-24T18:50:44.1266175Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1266469Z 2026-10-24T18:50:44.1266802Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T18:50:44.1267247Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:279:5] 2026-10-24T18:50:44.1267538Z 277 │ const [snoozeWakeTick, bumpSnoozeWakeTick] = useState(0); 2026-10-24T18:50:44.1267738Z 278 │ useEffect(() => { 2026-10-24T18:50:44.1267893Z ·  ────┬──── 2026-10-24T18:50:44.1268110Z · ╰── This is the containing effect 2026-10-24T18:50:44.1268325Z 279 │ setNow(new Date().toISOString()); 2026-10-24T18:50:44.1268499Z ·  ───┬── 2026-10-24T18:50:44.1268750Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1269075Z 280 │ const id = setInterval(() => setNow(new Date().toISOString()), 60_000); 2026-10-24T18:50:44.1269274Z ╰──── 2026-10-24T18:50:44.1269920Z  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-24T18:50:44.1270763Z  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-24T18:50:44.1271062Z 2026-10-24T18:50:44.1271292Z ⚠ eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used. 2026-10-24T18:50:44.1271664Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:13:8] 2026-10-24T18:50:44.1271907Z 12 │ threadSearchMatchKey, 2026-10-24T18:50:44.1272084Z 13 │ type EnvironmentThreadSearchMatch, 2026-10-24T18:50:44.1272294Z ·  ──────────────┬───────────── 2026-10-24T18:50:44.1272575Z · ╰── 'EnvironmentThreadSearchMatch' is imported here 2026-10-24T18:50:44.1272852Z 14 │ } from "@t3tools/client-runtime/state/thread-search"; 2026-10-24T18:50:44.1273024Z ╰──── 2026-10-24T18:50:44.1273181Z  help: Consider removing this import. 2026-10-24T18:50:44.1273293Z 2026-10-24T18:50:44.1273493Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T18:50:44.1273854Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:359:25] 2026-10-24T18:50:44.1274152Z 358 │ // range) the boundary string is identical and the chain would die. 2026-10-24T18:50:44.1274394Z 359 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-24T18:50:44.1274603Z ·  ───────┬────── 2026-10-24T18:50:44.1274881Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T18:50:44.1275152Z 360 │ const listItems = ((): readonly SidebarListItem[] => { 2026-10-24T18:50:44.1275330Z ╰──── 2026-10-24T18:50:44.1275678Z  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-24T18:50:44.1276258Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1276551Z 2026-10-24T18:50:44.1276785Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T18:50:44.1277156Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:350:53] 2026-10-24T18:50:44.1277407Z 349 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-24T18:50:44.1277668Z 350 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-24T18:50:44.1277949Z ·  ─────┬──── 2026-10-24T18:50:44.1278238Z · ╰── Cannot call impure function 2026-10-24T18:50:44.1278477Z 351 │ const id = setTimeout(() => { 2026-10-24T18:50:44.1278625Z ╰──── 2026-10-24T18:50:44.1278990Z  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-24T18:50:44.1279558Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T18:50:44.1279838Z 2026-10-24T18:50:44.1280006Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T18:50:44.1280295Z ╭─[apps/web/src/hooks/useThreadActions.ts:821:56] 2026-10-24T18:50:44.1280537Z 820 │ const resolved = resolveThreadTarget(target); 2026-10-24T18:50:44.1280816Z 821 │ if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) { 2026-10-24T18:50:44.1281100Z ·  ─────┬──── 2026-10-24T18:50:44.1281387Z · ╰── Cannot call impure function 2026-10-24T18:50:44.1281640Z 822 │ return AsyncResult.failure( 2026-10-24T18:50:44.1281793Z ╰──── 2026-10-24T18:50:44.1282128Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T18:50:44.1282680Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T18:50:44.1282959Z 2026-10-24T18:50:44.1283123Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T18:50:44.1283410Z ╭─[apps/web/src/hooks/useThreadActions.ts:709:46] 2026-10-24T18:50:44.1283612Z 708 │ const wokeAt = resolved 2026-10-24T18:50:44.1283837Z 709 │ ? threadWokeAt(resolved.thread, { now: new Date().toISOString() }) 2026-10-24T18:50:44.1284103Z ·  ─────┬──── 2026-10-24T18:50:44.1284383Z · ╰── Cannot call impure function 2026-10-24T18:50:44.1284601Z 710 │ : null; 2026-10-24T18:50:44.1284725Z ╰──── 2026-10-24T18:50:44.1285055Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T18:50:44.1285599Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T18:50:44.1285877Z 2026-10-24T18:50:44.1286145Z ⚠ eslint(no-unused-vars): Variable 'layerDaemon' is declared but never used. Unused variables should start with a '_'. 2026-10-24T18:50:44.1286593Z ╭─[apps/server/src/orchestration-v2/EffectWorker.ts:914:7] 2026-10-24T18:50:44.1286841Z 913 │ 2026-10-24T18:50:44.1287093Z 914 │ const layerDaemon: Layer.Layer = Layer.effectDiscard( 2026-10-24T18:50:44.1287365Z ·  ─────┬───── 2026-10-24T18:50:44.1287592Z · ╰── 'layerDaemon' is declared here 2026-10-24T18:50:44.1287823Z 915 │ runDaemon.pipe(Effect.forkScoped), 2026-10-24T18:50:44.1287987Z ╰──── 2026-10-24T18:50:44.1288147Z  help: Consider removing this declaration. 2026-10-24T18:50:44.1288267Z 2026-10-24T18:50:44.1288527Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T18:50:44.1288957Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:444:5] 2026-10-24T18:50:44.1289192Z 434 │ : null; 2026-10-24T18:50:44.1289333Z 435 │ useEffect(() => { 2026-10-24T18:50:44.1289494Z ·  ────┬──── 2026-10-24T18:50:44.1289713Z · ╰── This is the containing effect 2026-10-24T18:50:44.1289912Z 436 │ if ( 2026-10-24T18:50:44.1290061Z 437 │ props.active === false || 2026-10-24T18:50:44.1290242Z 438 │ activeDraftKey !== null || 2026-10-24T18:50:44.1290421Z 439 │ editingPendingTask !== null || 2026-10-24T18:50:44.1290598Z 440 │ selectedProject === null 2026-10-24T18:50:44.1290752Z 441 │ ) { 2026-10-24T18:50:44.1290878Z 442 │ return; 2026-10-24T18:50:44.1291010Z 443 │ } 2026-10-24T18:50:44.1291202Z 444 │ setActiveDraftKey( 2026-10-24T18:50:44.1291376Z ·  ────────┬──────── 2026-10-24T18:50:44.1291649Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1291891Z 445 │ createNewTaskDraft({ 2026-10-24T18:50:44.1292036Z ╰──── 2026-10-24T18:50:44.1292682Z  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-24T18:50:44.1293534Z  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-24T18:50:44.1293836Z 2026-10-24T18:50:44.1294076Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T18:50:44.1294473Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1244:36] 2026-10-24T18:50:44.1294759Z 1243 │ 2026-10-24T18:50:44.1295073Z 1244 │ {props.children} 2026-10-24T18:50:44.1295384Z ·  ───────────── 2026-10-24T18:50:44.1295581Z 1245 │ 2026-10-24T18:50:44.1295733Z ╰──── 2026-10-24T18:50:44.1296011Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T18:50:44.1296367Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T18:50:44.1296541Z 2026-10-24T18:50:44.1296838Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T18:50:44.1297238Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:773:7] 2026-10-24T18:50:44.1297496Z 772 │ if (settingsSheetPresentation.isActive) { 2026-10-24T18:50:44.1297752Z 773 │ settingsRoutePresentation.present(settingsRouteSession); 2026-10-24T18:50:44.1297993Z ·  ────────────┬──────────── 2026-10-24T18:50:44.1298275Z · ╰── Missing dependency `settingsRoutePresentation` 2026-10-24T18:50:44.1298502Z 774 │ } 2026-10-24T18:50:44.1298793Z 775 │ }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]); 2026-10-24T18:50:44.1299121Z ·  ────────────────┬──────────────── 2026-10-24T18:50:44.1299525Z · ╰── Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead 2026-10-24T18:50:44.1299845Z 776 │ 2026-10-24T18:50:44.1299955Z ╰──── 2026-10-24T18:50:44.1300429Z  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-24T18:50:44.1301118Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1301418Z 2026-10-24T18:50:44.1301581Z ⚠ react(immutability): This value cannot be modified 2026-10-24T18:50:44.1301882Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:391:5] 2026-10-24T18:50:44.1302202Z 387 │ typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0; 2026-10-24T18:50:44.1302509Z 388 │ const animatedBorderRadius = useSharedValue(targetBorderRadius); 2026-10-24T18:50:44.1302754Z ·  ──────────┬───────── 2026-10-24T18:50:44.1303013Z · ╰── `animatedBorderRadius` originates here 2026-10-24T18:50:44.1303334Z 389 │ const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android"; 2026-10-24T18:50:44.1303570Z 390 │ useLayoutEffect(() => { 2026-10-24T18:50:44.1303768Z 391 │ animatedBorderRadius.value = shouldAnimate 2026-10-24T18:50:44.1303974Z ·  ──────────┬───────── 2026-10-24T18:50:44.1304235Z · ╰── `animatedBorderRadius` cannot be modified 2026-10-24T18:50:44.1304481Z 392 │ ? withTiming(targetBorderRadius, { 2026-10-24T18:50:44.1304643Z ╰──── 2026-10-24T18:50:44.1305034Z  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-24T18:50:44.1305630Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T18:50:44.1305925Z 2026-10-24T18:50:44.1306138Z ⚠ eslint(no-unused-vars): Identifier 'HostProcess' is imported but never used. 2026-10-24T18:50:44.1306510Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:25:13] 2026-10-24T18:50:44.1306771Z 24 │ import * as Schema from "effect/Schema"; 2026-10-24T18:50:44.1307002Z 25 │ import * as HostProcess from "@t3tools/shared/HostProcess"; 2026-10-24T18:50:44.1307220Z ·  ─────┬───── 2026-10-24T18:50:44.1307467Z · ╰── 'HostProcess' is imported here 2026-10-24T18:50:44.1307672Z 26 │ 2026-10-24T18:50:44.1307786Z ╰──── 2026-10-24T18:50:44.1307950Z  help: Consider removing this import. 2026-10-24T18:50:44.1308068Z 2026-10-24T18:50:44.1308340Z ⚠ eslint(no-unused-vars): Variable 'serverConfig' is declared but never used. Unused variables should start with a '_'. 2026-10-24T18:50:44.1308789Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:124:11] 2026-10-24T18:50:44.1309048Z 123 │ const path = yield* Path.Path; 2026-10-24T18:50:44.1309323Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-24T18:50:44.1309545Z ·  ──────┬───── 2026-10-24T18:50:44.1309794Z · ╰── 'serverConfig' is declared here 2026-10-24T18:50:44.1310087Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-24T18:50:44.1310302Z ╰──── 2026-10-24T18:50:44.1310465Z  help: Consider removing this declaration. 2026-10-24T18:50:44.1310585Z 2026-10-24T18:50:44.1310861Z ⚠ eslint(no-unused-vars): Variable 'serverSettings' is declared but never used. Unused variables should start with a '_'. 2026-10-24T18:50:44.1325697Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:125:11] 2026-10-24T18:50:44.1325997Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-24T18:50:44.1326275Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-24T18:50:44.1326519Z ·  ───────┬────── 2026-10-24T18:50:44.1326781Z · ╰── 'serverSettings' is declared here 2026-10-24T18:50:44.1327069Z 126 │ const gitWorkflow = yield* GitWorkflowService.GitWorkflowService; 2026-10-24T18:50:44.1327269Z ╰──── 2026-10-24T18:50:44.1327429Z  help: Consider removing this declaration. 2026-10-24T18:50:44.1327548Z 2026-10-24T18:50:44.1327812Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T18:50:44.1328211Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:57:5] 2026-10-24T18:50:44.1328419Z 55 │ 2026-10-24T18:50:44.1328540Z 56 │ useEffect(() => { 2026-10-24T18:50:44.1328689Z ·  ────┬──── 2026-10-24T18:50:44.1328946Z · ╰── This is the containing effect 2026-10-24T18:50:44.1329148Z 57 │ setDecodedSize(null); 2026-10-24T18:50:44.1329400Z ·  ───────┬────── 2026-10-24T18:50:44.1329707Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1329948Z 58 │ }, [props.sourceKey]); 2026-10-24T18:50:44.1330086Z ╰──── 2026-10-24T18:50:44.1330744Z  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-24T18:50:44.1331674Z  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-24T18:50:44.1331981Z 2026-10-24T18:50:44.1332245Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T18:50:44.1332648Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5] 2026-10-24T18:50:44.1332865Z 59 │ 2026-10-24T18:50:44.1332987Z 60 │ useEffect(() => { 2026-10-24T18:50:44.1333145Z ·  ────┬──── 2026-10-24T18:50:44.1333360Z · ╰── This is the containing effect 2026-10-24T18:50:44.1333565Z 61 │ setFailedUri(null); 2026-10-24T18:50:44.1333732Z ·  ──────┬───── 2026-10-24T18:50:44.1333989Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1334225Z 62 │ }, [props.uri]); 2026-10-24T18:50:44.1334356Z ╰──── 2026-10-24T18:50:44.1335010Z  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-24T18:50:44.1335867Z  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-24T18:50:44.1336170Z 2026-10-24T18:50:44.1336387Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-24T18:50:44.1336751Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10] 2026-10-24T18:50:44.1337038Z 6 │ import { parse, SvgAst, type JsxAST } from "react-native-svg"; 2026-10-24T18:50:44.1337356Z 7 │ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native"; 2026-10-24T18:50:44.1337635Z ·  ────────┬──────── 2026-10-24T18:50:44.1337895Z · ╰── 'ActivityIndicator' is imported here 2026-10-24T18:50:44.1338097Z 8 │ 2026-10-24T18:50:44.1338207Z ╰──── 2026-10-24T18:50:44.1338366Z  help: Consider removing this import. 2026-10-24T18:50:44.1338483Z 2026-10-24T18:50:44.1338683Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T18:50:44.1339068Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7] 2026-10-24T18:50:44.1339294Z 57 │ setDecodedSize(null); 2026-10-24T18:50:44.1339454Z 58 │ }, [props.sourceKey]); 2026-10-24T18:50:44.1339624Z ·  ───────┬─────── 2026-10-24T18:50:44.1339966Z · ╰── Unnecessary dependency `props.sourceKey` 2026-10-24T18:50:44.1340221Z 59 │ 2026-10-24T18:50:44.1340332Z ╰──── 2026-10-24T18:50:44.1340676Z  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-24T18:50:44.1341259Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1341552Z 2026-10-24T18:50:44.1341756Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T18:50:44.1342106Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7] 2026-10-24T18:50:44.1342331Z 61 │ setFailedUri(null); 2026-10-24T18:50:44.1342483Z 62 │ }, [props.uri]); 2026-10-24T18:50:44.1342642Z ·  ────┬──── 2026-10-24T18:50:44.1342873Z · ╰── Unnecessary dependency `props.uri` 2026-10-24T18:50:44.1343071Z 63 │ 2026-10-24T18:50:44.1343180Z ╰──── 2026-10-24T18:50:44.1343522Z  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-24T18:50:44.1344102Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1344396Z 2026-10-24T18:50:44.1344861Z ⚠ 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-24T18:50:44.1345453Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7] 2026-10-24T18:50:44.1345732Z 565 │ let afterSequence = created[0]!.sequence; 2026-10-24T18:50:44.1346050Z 566 │ ╭─▶ for (let index = 1; index <= 32; index += 1) { 2026-10-24T18:50:44.1346343Z 567 │ │ const nextEvent = { 2026-10-24T18:50:44.1346618Z 568 │ │ id: EventId.make(`event:foundation-stream-race:${index}`), 2026-10-24T18:50:44.1346921Z 569 │ │ type: "thread.metadata-updated" as const, 2026-10-24T18:50:44.1347163Z 570 │ │ threadId, 2026-10-24T18:50:44.1347384Z 571 │ │ providerInstanceId, 2026-10-24T18:50:44.1347604Z 572 │ │ occurredAt: now, 2026-10-24T18:50:44.1347880Z 573 │ │ payload: { ...thread, title: `Race update ${index}` }, 2026-10-24T18:50:44.1348169Z 574 │ │ } satisfies OrchestrationV2DomainEvent; 2026-10-24T18:50:44.1348430Z 575 │ │ const reader = yield* eventSink 2026-10-24T18:50:44.1348682Z 576 │ │ .stream({ threadId, afterSequence }) 2026-10-24T18:50:44.1349248Z 577 │ │ .pipe(Stream.runHead, Effect.forkChild); 2026-10-24T18:50:44.1349537Z 578 │ │ yield* Effect.yieldNow; 2026-10-24T18:50:44.1349838Z 579 │ │ const written = yield* eventSink.write({ events: [nextEvent] }); 2026-10-24T18:50:44.1350154Z 580 │ │ const received = yield* Fiber.join(reader); 2026-10-24T18:50:44.1350575Z 581 │ │ if (Option.isNone(received)) { 2026-10-24T18:50:44.1350964Z 582 │ │ return yield* Effect.die("The event stream ended before delivering the live event."); 2026-10-24T18:50:44.1351251Z 583 │ │ } 2026-10-24T18:50:44.1351516Z 584 │ │ assert.equal(received.value.sequence, written[0]?.sequence); 2026-10-24T18:50:44.1351836Z 585 │ │ assert.equal(received.value.event.id, nextEvent.id); 2026-10-24T18:50:44.1352122Z 586 │ │ afterSequence = received.value.sequence; 2026-10-24T18:50:44.1352399Z 587 │ ╰─▶ } 2026-10-24T18:50:44.1352600Z 588 │ }), 2026-10-24T18:50:44.1352727Z ╰──── 2026-10-24T18:50:44.1352790Z 2026-10-24T18:50:44.1353276Z ⚠ 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-24T18:50:44.1353882Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:2327:9] 2026-10-24T18:50:44.1354138Z 2326 │ let settled = false; 2026-10-24T18:50:44.1354402Z 2327 │ ╭─▶ while (!settled) { 2026-10-24T18:50:44.1354724Z 2328 │ │ settled = (yield* outbox.listByCommandId(commandId)).every( 2026-10-24T18:50:44.1355022Z 2329 │ │ (effect) => effect.status === "succeeded", 2026-10-24T18:50:44.1355250Z 2330 │ │ ); 2026-10-24T18:50:44.1355481Z 2331 │ │ if (!settled) yield* Effect.yieldNow; 2026-10-24T18:50:44.1355761Z 2332 │ ╰─▶ } 2026-10-24T18:50:44.1356020Z 2333 │ }).pipe(Effect.provide(layerWorker), Effect.scoped); 2026-10-24T18:50:44.1356209Z ╰──── 2026-10-24T18:50:44.1356265Z 2026-10-24T18:50:44.1356645Z ⚠ 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-24T18:50:44.1357107Z ╭─[packages/effect-acp/src/client.ts:1269:11] 2026-10-24T18:50:44.1357384Z 1268 │ extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) => 2026-10-24T18:50:44.1357718Z 1269 │ Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe( 2026-10-24T18:50:44.1358013Z ·  ────────────────────────── 2026-10-24T18:50:44.1358289Z 1270 │ Effect.mapError(() => AcpError.AcpRequestError.invalidParams()), 2026-10-24T18:50:44.1358503Z ╰──── 2026-10-24T18:50:44.1358562Z 2026-10-24T18:50:44.1358863Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T18:50:44.1359265Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:570:5] 2026-10-24T18:50:44.1359486Z 568 │ }, []); 2026-10-24T18:50:44.1359625Z 569 │ useEffect(() => { 2026-10-24T18:50:44.1359788Z ·  ────┬──── 2026-10-24T18:50:44.1360011Z · ╰── This is the containing effect 2026-10-24T18:50:44.1360233Z 570 │ setKeyboardStateSuspect(false); 2026-10-24T18:50:44.1360435Z ·  ───────────┬─────────── 2026-10-24T18:50:44.1360773Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1361085Z 571 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-24T18:50:44.1361255Z ╰──── 2026-10-24T18:50:44.1361913Z  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-24T18:50:44.1362779Z  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-24T18:50:44.1363088Z 2026-10-24T18:50:44.1363359Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T18:50:44.1363764Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:966:7] 2026-10-24T18:50:44.1364079Z 963 │ const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0); 2026-10-24T18:50:44.1364309Z 964 │ useEffect(() => { 2026-10-24T18:50:44.1364470Z ·  ────┬──── 2026-10-24T18:50:44.1364681Z · ╰── This is the containing effect 2026-10-24T18:50:44.1364979Z 965 │ if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) { 2026-10-24T18:50:44.1365251Z 966 │ setLastKnownKeyboardHeight(liveKeyboardHeight); 2026-10-24T18:50:44.1365483Z ·  ─────────────┬──────────── 2026-10-24T18:50:44.1365766Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1366005Z 967 │ } 2026-10-24T18:50:44.1366129Z ╰──── 2026-10-24T18:50:44.1366772Z  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-24T18:50:44.1367612Z  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-24T18:50:44.1367912Z 2026-10-24T18:50:44.1368168Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T18:50:44.1368622Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1222:5] 2026-10-24T18:50:44.1368912Z 1220 │ 2026-10-24T18:50:44.1369038Z 1221 │ useEffect(() => { 2026-10-24T18:50:44.1369198Z ·  ────┬──── 2026-10-24T18:50:44.1369415Z · ╰── This is the containing effect 2026-10-24T18:50:44.1369640Z 1222 │ setAnchorMessageId(null); 2026-10-24T18:50:44.1369821Z ·  ─────────┬──────── 2026-10-24T18:50:44.1370092Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1370340Z 1223 │ setSubmittedMessageId(null); 2026-10-24T18:50:44.1370494Z ╰──── 2026-10-24T18:50:44.1371167Z  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-24T18:50:44.1372499Z  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-24T18:50:44.1372800Z 2026-10-24T18:50:44.1373000Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T18:50:44.1373349Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:571:7] 2026-10-24T18:50:44.1373591Z 570 │ setKeyboardStateSuspect(false); 2026-10-24T18:50:44.1373795Z 571 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-24T18:50:44.1374060Z ·  ────────┬──────── ─────────┬──────── 2026-10-24T18:50:44.1374415Z · │ ╰── Unnecessary dependency `liveKeyboardHeight` 2026-10-24T18:50:44.1374767Z · ╰── Unnecessary dependency `isKeyboardVisible` 2026-10-24T18:50:44.1375052Z 572 │ const handleOwnedInputFocusChange = (focused: boolean) => { 2026-10-24T18:50:44.1375243Z ╰──── 2026-10-24T18:50:44.1375587Z  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-24T18:50:44.1376162Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1376455Z 2026-10-24T18:50:44.1376653Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T18:50:44.1377007Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1170:7] 2026-10-24T18:50:44.1377255Z 1169 │ userInputInsetProgress.set(1); 2026-10-24T18:50:44.1377524Z 1170 │ }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]); 2026-10-24T18:50:44.1377795Z ·  ────────────┬─────────── 2026-10-24T18:50:44.1378078Z · ╰── Unnecessary dependency `activeUserInputRequestId` 2026-10-24T18:50:44.1378364Z 1171 │ const showContent = props.showContent ?? true; 2026-10-24T18:50:44.1378537Z ╰──── 2026-10-24T18:50:44.1378918Z  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-24T18:50:44.1379597Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1379932Z 2026-10-24T18:50:44.1380129Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T18:50:44.1380477Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1228:15] 2026-10-24T18:50:44.1380707Z 1227 │ freeze.set(false); 2026-10-24T18:50:44.1380874Z 1228 │ }, [freeze, selectedThreadKey]); 2026-10-24T18:50:44.1381069Z ·  ────────┬──────── 2026-10-24T18:50:44.1381339Z · ╰── Unnecessary dependency `selectedThreadKey` 2026-10-24T18:50:44.1381550Z 1229 │ 2026-10-24T18:50:44.1381664Z ╰──── 2026-10-24T18:50:44.1382010Z  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-24T18:50:44.1382588Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1382882Z 2026-10-24T18:50:44.1383037Z ⚠ react(immutability): This value cannot be modified 2026-10-24T18:50:44.1383344Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1058:5] 2026-10-24T18:50:44.1383620Z 1053 │ const composerPopoverHeight = useSharedValue(0); 2026-10-24T18:50:44.1383850Z 1054 │ const floatingControlCoverage = useSharedValue( 2026-10-24T18:50:44.1384064Z ·  ───────────┬─────────── 2026-10-24T18:50:44.1384331Z · ╰── `floatingControlCoverage` originates here 2026-10-24T18:50:44.1384623Z 1055 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-24T18:50:44.1384821Z 1056 │ ); 2026-10-24T18:50:44.1384950Z 1057 │ useEffect(() => { 2026-10-24T18:50:44.1385142Z 1058 │ floatingControlCoverage.value = withTiming( 2026-10-24T18:50:44.1385355Z ·  ───────────┬─────────── 2026-10-24T18:50:44.1385618Z · ╰── `floatingControlCoverage` cannot be modified 2026-10-24T18:50:44.1385908Z 1059 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-24T18:50:44.1386096Z ╰──── 2026-10-24T18:50:44.1386419Z  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-24T18:50:44.1386976Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T18:50:44.1387265Z 2026-10-24T18:50:44.1387423Z ⚠ react(immutability): This value cannot be modified 2026-10-24T18:50:44.1387729Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1076:7] 2026-10-24T18:50:44.1388075Z 1066 │ const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null; 2026-10-24T18:50:44.1388388Z 1067 │ const combinedContentInsetEndAdjustment = useSharedValue( 2026-10-24T18:50:44.1388642Z ·  ────────────────┬──────────────── 2026-10-24T18:50:44.1388985Z · ╰── `combinedContentInsetEndAdjustment` originates here 2026-10-24T18:50:44.1389301Z 1068 │ Math.max(0, estimatedOverlayHeight - nativeInsetOvercount), 2026-10-24T18:50:44.1389495Z 1069 │ ); 2026-10-24T18:50:44.1389690Z 1070 │ useAnimatedReaction( 2026-10-24T18:50:44.1389874Z 1071 │ () => 2026-10-24T18:50:44.1390037Z 1072 │ contentInsetEndAdjustment.value + 2026-10-24T18:50:44.1390231Z 1073 │ floatingControlCoverage.value + 2026-10-24T18:50:44.1390532Z 1074 │ (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0), 2026-10-24T18:50:44.1390794Z 1075 │ (value) => { 2026-10-24T18:50:44.1390987Z 1076 │ combinedContentInsetEndAdjustment.value = value; 2026-10-24T18:50:44.1391227Z ·  ────────────────┬──────────────── 2026-10-24T18:50:44.1391530Z · ╰── `combinedContentInsetEndAdjustment` cannot be modified 2026-10-24T18:50:44.1391767Z 1077 │ }, 2026-10-24T18:50:44.1391885Z ╰──── 2026-10-24T18:50:44.1392210Z  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-24T18:50:44.1392769Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T18:50:44.1393058Z 2026-10-24T18:50:44.1393281Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T18:50:44.1393629Z ╭─[apps/mobile/src/state/use-composer-drafts.ts:1022:15] 2026-10-24T18:50:44.1393841Z 1021 │ instanceId, 2026-10-24T18:50:44.1394068Z 1022 │ { ...(persisted.modelOptionMemory[instanceId] ?? {}), ...models }, 2026-10-24T18:50:44.1394360Z ·  ────────────────────────────────────────────────── 2026-10-24T18:50:44.1394557Z 1023 │ ]), 2026-10-24T18:50:44.1394689Z ╰──── 2026-10-24T18:50:44.1395010Z  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-24T18:50:44.1395266Z 2026-10-24T18:50:44.1395721Z ⚠ 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-24T18:50:44.1396252Z ╭─[packages/effect-acp/src/errors.test.ts:129:28] 2026-10-24T18:50:44.1396480Z 128 │ const secret = "acp-summary-secret"; 2026-10-24T18:50:44.1396696Z 129 │ const cause = yield* Schema.decodeUnknownEffect( 2026-10-24T18:50:44.1396943Z ·  ────────────────────────── 2026-10-24T18:50:44.1397131Z 130 │ Schema.Struct({ 2026-10-24T18:50:44.1397277Z ╰──── 2026-10-24T18:50:44.1397335Z 2026-10-24T18:50:44.1397786Z ⚠ 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-24T18:50:44.1398314Z ╭─[packages/effect-acp/src/protocol.test.ts:500:31] 2026-10-24T18:50:44.1398501Z 499 │ 2026-10-24T18:50:44.1398675Z 500 │ const response = yield* Schema.decodeUnknownEffect( 2026-10-24T18:50:44.1398970Z ·  ────────────────────────── 2026-10-24T18:50:44.1399201Z 501 │ Schema.fromJsonString(JsonRpcErrorResponse), 2026-10-24T18:50:44.1399376Z ╰──── 2026-10-24T18:50:44.1399433Z 2026-10-24T18:50:44.1399823Z ⚠ 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-24T18:50:44.1400278Z ╭─[packages/effect-acp/src/schema.test.ts:18:12] 2026-10-24T18:50:44.1400569Z 17 │ const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } }; 2026-10-24T18:50:44.1400851Z 18 │ expect(Schema.is(V1.AvailableCommand)(command)).toBe(true); 2026-10-24T18:50:44.1401066Z ·  ───────── 2026-10-24T18:50:44.1401220Z 19 │ expect( 2026-10-24T18:50:44.1401343Z ╰──── 2026-10-24T18:50:44.1401399Z 2026-10-24T18:50:44.1401724Z ⚠ 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-24T18:50:44.1402133Z ╭─[packages/effect-acp/src/schema.test.ts:20:7] 2026-10-24T18:50:44.1402333Z 19 │ expect( 2026-10-24T18:50:44.1402569Z 20 │ Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }), 2026-10-24T18:50:44.1402810Z ·  ───────── 2026-10-24T18:50:44.1402959Z 21 │ ).toBe(true); 2026-10-24T18:50:44.1403092Z ╰──── 2026-10-24T18:50:44.1403145Z 2026-10-24T18:50:44.1403402Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T18:50:44.1403781Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:60:5] 2026-10-24T18:50:44.1403974Z 57 │ 2026-10-24T18:50:44.1404097Z 58 │ useEffect(() => { 2026-10-24T18:50:44.1404247Z ·  ────┬──── 2026-10-24T18:50:44.1404462Z · ╰── This is the containing effect 2026-10-24T18:50:44.1404700Z 59 │ const controller = new AbortController(); 2026-10-24T18:50:44.1404886Z 60 │ setLoadState("pending"); 2026-10-24T18:50:44.1405053Z ·  ──────┬───── 2026-10-24T18:50:44.1405307Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1405631Z 61 │ // A renewed signature is used on Retry, not as a reason to reset the native player. 2026-10-24T18:50:44.1405841Z ╰──── 2026-10-24T18:50:44.1406481Z  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-24T18:50:44.1407386Z  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-24T18:50:44.1407754Z 2026-10-24T18:50:44.1407955Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T18:50:44.1408280Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:71:7] 2026-10-24T18:50:44.1408504Z 70 │ return () => controller.abort(); 2026-10-24T18:50:44.1408704Z 71 │ }, [player, props.playRequested, attempt]); 2026-10-24T18:50:44.1409018Z ·  ───┬── ─────────┬───────── ───┬─── 2026-10-24T18:50:44.1409402Z · │ │ ╰── Unnecessary dependency `attempt` 2026-10-24T18:50:44.1409813Z · │ ╰── Unnecessary dependency `props.playRequested` 2026-10-24T18:50:44.1410142Z · ╰── Unnecessary dependency `player_0` 2026-10-24T18:50:44.1410339Z 72 │ 2026-10-24T18:50:44.1410446Z ╰──── 2026-10-24T18:50:44.1410790Z  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-24T18:50:44.1411607Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1412065Z 2026-10-24T18:50:44.1412327Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T18:50:44.1412730Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-24T18:50:44.1412964Z 259 │ .join("|"); 2026-10-24T18:50:44.1413108Z 260 │ useEffect(() => { 2026-10-24T18:50:44.1413264Z ·  ────┬──── 2026-10-24T18:50:44.1413480Z · ╰── This is the containing effect 2026-10-24T18:50:44.1413681Z 261 │ stop(); 2026-10-24T18:50:44.1413820Z ·  ──┬─ 2026-10-24T18:50:44.1414065Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1414298Z 262 │ }, [orderVersion]); 2026-10-24T18:50:44.1414431Z ╰──── 2026-10-24T18:50:44.1415078Z  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-24T18:50:44.1415927Z  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-24T18:50:44.1416228Z 2026-10-24T18:50:44.1416442Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T18:50:44.1416811Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-24T18:50:44.1417043Z 260 │ useEffect(() => { 2026-10-24T18:50:44.1417194Z 261 │ stop(); 2026-10-24T18:50:44.1417335Z ·  ──┬─ 2026-10-24T18:50:44.1417541Z · ╰── Missing dependency `stop` 2026-10-24T18:50:44.1417744Z 262 │ }, [orderVersion]); 2026-10-24T18:50:44.1417978Z ·  ──────┬───── 2026-10-24T18:50:44.1418259Z · ╰── Unnecessary dependency `orderVersion` 2026-10-24T18:50:44.1418466Z 263 │ useEffect( 2026-10-24T18:50:44.1418596Z ╰──── 2026-10-24T18:50:44.1419109Z  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-24T18:50:44.1419799Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1420091Z 2026-10-24T18:50:44.1420235Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1420542Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9] 2026-10-24T18:50:44.1420788Z 95 │ const latest = useRef(props); 2026-10-24T18:50:44.1420957Z 96 │ latest.current = props; 2026-10-24T18:50:44.1421152Z ·  ───┬──────┬─── 2026-10-24T18:50:44.1421443Z · │ ╰── Cannot update ref value during render 2026-10-24T18:50:44.1421724Z · ╰── This value is a ref 2026-10-24T18:50:44.1421919Z 97 │ const gesture = useMemo( 2026-10-24T18:50:44.1422055Z ╰──── 2026-10-24T18:50:44.1422569Z  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-24T18:50:44.1423284Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1423566Z 2026-10-24T18:50:44.1423714Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1424024Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18] 2026-10-24T18:50:44.1424257Z 103 │ .runOnJS(true) 2026-10-24T18:50:44.1424441Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T18:50:44.1424677Z ·  ───────────────┬────────────── 2026-10-24T18:50:44.1424995Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T18:50:44.1425319Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T18:50:44.1425520Z ╰──── 2026-10-24T18:50:44.1426036Z  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-24T18:50:44.1426745Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1427022Z 2026-10-24T18:50:44.1427166Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1427472Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19] 2026-10-24T18:50:44.1427739Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T18:50:44.1427985Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T18:50:44.1428341Z ·  ──────────────────────────┬───────────────────────── 2026-10-24T18:50:44.1428720Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T18:50:44.1429086Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T18:50:44.1429276Z ╰──── 2026-10-24T18:50:44.1429788Z  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-24T18:50:44.1430496Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1430772Z 2026-10-24T18:50:44.1430924Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1431238Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16] 2026-10-24T18:50:44.1431537Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T18:50:44.1431804Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T18:50:44.1432088Z ·  ──────────────────────────┬───────────────────────── 2026-10-24T18:50:44.1432432Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T18:50:44.1432751Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T18:50:44.1432944Z ╰──── 2026-10-24T18:50:44.1433457Z  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-24T18:50:44.1434168Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1434447Z 2026-10-24T18:50:44.1434590Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1434894Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21] 2026-10-24T18:50:44.1435183Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T18:50:44.1435441Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T18:50:44.1435723Z ·  ───────────────────────┬────────────────────── 2026-10-24T18:50:44.1436069Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T18:50:44.1436334Z 108 │ [props.disabled], 2026-10-24T18:50:44.1436473Z ╰──── 2026-10-24T18:50:44.1436983Z  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-24T18:50:44.1437693Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1437972Z 2026-10-24T18:50:44.1438116Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1438481Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:249:9] 2026-10-24T18:50:44.1438805Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-24T18:50:44.1439073Z 249 │ latest.current = { rows, planners, moveThread }; 2026-10-24T18:50:44.1439302Z ·  ───┬──────┬─── 2026-10-24T18:50:44.1439592Z · │ ╰── Cannot update ref value during render 2026-10-24T18:50:44.1439876Z · ╰── This value is a ref 2026-10-24T18:50:44.1440059Z 250 │ 2026-10-24T18:50:44.1440168Z ╰──── 2026-10-24T18:50:44.1440688Z  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-24T18:50:44.1441387Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1441666Z 2026-10-24T18:50:44.1441810Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1442118Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:247:22] 2026-10-24T18:50:44.1442405Z 246 │ const [preview, setPreview] = useState(null); 2026-10-24T18:50:44.1442650Z 247 │ const translateY = useRef(new Animated.Value(0)).current; 2026-10-24T18:50:44.1442910Z ·  ──────────────────┬────────────────── 2026-10-24T18:50:44.1443204Z · ╰── Cannot access ref value during render 2026-10-24T18:50:44.1443487Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-24T18:50:44.1443669Z ╰──── 2026-10-24T18:50:44.1444180Z  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-24T18:50:44.1444880Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1445154Z 2026-10-24T18:50:44.1445321Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T18:50:44.1445646Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:324:16] 2026-10-24T18:50:44.1445880Z 323 │ update(0); 2026-10-24T18:50:44.1446099Z 324 │ let last = performance.now(); 2026-10-24T18:50:44.1446348Z ·  ────────┬──────── 2026-10-24T18:50:44.1446596Z · ╰── Cannot call impure function 2026-10-24T18:50:44.1446807Z 325 │ const tick = () => { 2026-10-24T18:50:44.1446943Z ╰──── 2026-10-24T18:50:44.1447303Z  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-24T18:50:44.1447877Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T18:50:44.1448158Z 2026-10-24T18:50:44.1448346Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T18:50:44.1448693Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15] 2026-10-24T18:50:44.1448964Z  98 │ () => 2026-10-24T18:50:44.1449100Z  99 │ Gesture.Pan() 2026-10-24T18:50:44.1449265Z ·  ─┬─ 2026-10-24T18:50:44.1449489Z · ╰── `Pan` may be a component 2026-10-24T18:50:44.1449707Z 100 │ .enabled(!props.disabled) 2026-10-24T18:50:44.1449858Z ╰──── 2026-10-24T18:50:44.1450185Z  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-24T18:50:44.1450885Z  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-24T18:50:44.1451484Z 2026-10-24T18:50:44.1451676Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T18:50:44.1452105Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5] 2026-10-24T18:50:44.1452338Z 103 │ .runOnJS(true) 2026-10-24T18:50:44.1452525Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T18:50:44.1452730Z ·  ───┬── 2026-10-24T18:50:44.1453265Z · ╰── 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-24T18:50:44.1453776Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T18:50:44.1454049Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T18:50:44.1454315Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T18:50:44.1454518Z 108 │ [props.disabled], 2026-10-24T18:50:44.1454686Z ·  ────────┬─────── 2026-10-24T18:50:44.1454971Z · ╰── This dependency list is missing values used by the callback 2026-10-24T18:50:44.1455206Z 109 │ ); 2026-10-24T18:50:44.1455323Z ╰──── 2026-10-24T18:50:44.1455577Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T18:50:44.1456090Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1456388Z 2026-10-24T18:50:44.1456660Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T18:50:44.1457043Z ╭─[apps/mobile/src/components/ComposerContextSheet.tsx:272:25] 2026-10-24T18:50:44.1457303Z 271 │ {record.elements?.map((element, index) => ( 2026-10-24T18:50:44.1457600Z 272 │ 2026-10-24T18:50:44.1457925Z ·  ─────────────────────────────────────────────────────── 2026-10-24T18:50:44.1458151Z 273 │ = 2026-10-24T18:50:44.1478108Z ·  ──┬── 2026-10-24T18:50:44.1478316Z · ╰── 'layer' is declared here 2026-10-24T18:50:44.1478507Z 3756 │ Layer.effect( 2026-10-24T18:50:44.1478632Z ╰──── 2026-10-24T18:50:44.1478799Z  help: Consider removing this declaration. 2026-10-24T18:50:44.1478944Z 2026-10-24T18:50:44.1479171Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T18:50:44.1479554Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:1998:15] 2026-10-24T18:50:44.1479787Z 1997 │ assert.equal( 2026-10-24T18:50:44.1480025Z 1998 │ items.filter((item) => item.type === "assistant_message").at(-1)?.text, 2026-10-24T18:50:44.1480257Z ·  ────── 2026-10-24T18:50:44.1480431Z 1999 │ "authoritative answer", 2026-10-24T18:50:44.1480578Z ╰──── 2026-10-24T18:50:44.1480804Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T18:50:44.1481037Z 2026-10-24T18:50:44.1481499Z ⚠ 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-24T18:50:44.1482086Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:3951:7] 2026-10-24T18:50:44.1482434Z 3950 │ const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped); 2026-10-24T18:50:44.1482827Z 3951 │ ╭─▶ while (!responseLifecycle.includes("failed")) { 2026-10-24T18:50:44.1483129Z 3952 │ │ yield* Effect.yieldNow; 2026-10-24T18:50:44.1483386Z 3953 │ ╰─▶ } 2026-10-24T18:50:44.1483641Z 3954 │ const responseExit = yield* Fiber.join(responseFiber); 2026-10-24T18:50:44.1483825Z ╰──── 2026-10-24T18:50:44.1483881Z 2026-10-24T18:50:44.1484393Z ⚠ 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-24T18:50:44.1485005Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6062:9] 2026-10-24T18:50:44.1485260Z 6061 │ .pipe(Effect.forkScoped); 2026-10-24T18:50:44.1485554Z 6062 │ ╭─▶ while (promptGates.length < 1) { 2026-10-24T18:50:44.1485837Z 6063 │ │ yield* Effect.yieldNow; 2026-10-24T18:50:44.1486093Z 6064 │ ╰─▶ } 2026-10-24T18:50:44.1486399Z 6065 │ assert.isDefined(sessionUpdateHandler, "session update handler must be wired"); 2026-10-24T18:50:44.1486629Z ╰──── 2026-10-24T18:50:44.1486685Z 2026-10-24T18:50:44.1487134Z ⚠ 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-24T18:50:44.1487710Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6197:9] 2026-10-24T18:50:44.1487964Z 6196 │ .pipe(Effect.forkScoped); 2026-10-24T18:50:44.1488254Z 6197 │ ╭─▶ while (promptGates.length < 2) { 2026-10-24T18:50:44.1488535Z 6198 │ │ yield* Effect.yieldNow; 2026-10-24T18:50:44.1488819Z 6199 │ ╰─▶ } 2026-10-24T18:50:44.1489124Z 6200 │ if (sessionUpdateHandler === undefined || capturedMutation.current === null) { 2026-10-24T18:50:44.1489352Z ╰──── 2026-10-24T18:50:44.1489408Z 2026-10-24T18:50:44.1489565Z ⚠ react(immutability): This value cannot be modified 2026-10-24T18:50:44.1489871Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:174:5] 2026-10-24T18:50:44.1490168Z 170 │ const expandedAngle = props.collapsedDirection === "right" ? 90 : 180; 2026-10-24T18:50:44.1490461Z 171 │ const rotation = useSharedValue(props.expanded ? expandedAngle : 0); 2026-10-24T18:50:44.1490688Z ·  ────┬─── 2026-10-24T18:50:44.1490910Z · ╰── `rotation` originates here 2026-10-24T18:50:44.1491199Z 172 │ 2026-10-24T18:50:44.1491358Z 173 │ useLayoutEffect(() => { 2026-10-24T18:50:44.1491585Z 174 │ rotation.value = withTiming(props.expanded ? expandedAngle : 0, { 2026-10-24T18:50:44.1491804Z ·  ────┬─── 2026-10-24T18:50:44.1492024Z · ╰── `rotation` cannot be modified 2026-10-24T18:50:44.1492258Z 175 │ duration: THREAD_DISCLOSURE_TRANSITION_MS, 2026-10-24T18:50:44.1492425Z ╰──── 2026-10-24T18:50:44.1492743Z  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-24T18:50:44.1493299Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T18:50:44.1493594Z 2026-10-24T18:50:44.1493787Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T18:50:44.1494198Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:1246:23] 2026-10-24T18:50:44.1494465Z 1245 │ { 2026-10-24T18:50:44.1498655Z ·  ────┬──── 2026-10-24T18:50:44.1498906Z · ╰── This is the containing effect 2026-10-24T18:50:44.1499110Z 68 │ setUri(null); 2026-10-24T18:50:44.1499260Z ·  ───┬── 2026-10-24T18:50:44.1499509Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1499738Z 69 │ setError(null); 2026-10-24T18:50:44.1499870Z ╰──── 2026-10-24T18:50:44.1500518Z  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-24T18:50:44.1501363Z  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-24T18:50:44.1501666Z 2026-10-24T18:50:44.1501870Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T18:50:44.1502203Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:91:7] 2026-10-24T18:50:44.1502399Z 90 │ }; 2026-10-24T18:50:44.1502538Z 91 │ }, [attachmentId, fileUri]); 2026-10-24T18:50:44.1502756Z ·  ──────┬───── ───┬─── 2026-10-24T18:50:44.1503058Z · │ ╰── Unnecessary dependency `fileUri` 2026-10-24T18:50:44.1503381Z · ╰── Unnecessary dependency `attachmentId` 2026-10-24T18:50:44.1503667Z 92 │ const mimeType = videoMimeType(attachment) ?? attachment.mimeType; 2026-10-24T18:50:44.1503865Z ╰──── 2026-10-24T18:50:44.1504271Z  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-24T18:50:44.1504890Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1505185Z 2026-10-24T18:50:44.1505395Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T18:50:44.1511460Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:213:34] 2026-10-24T18:50:44.1511678Z 212 │ useEffect(() => { 2026-10-24T18:50:44.1511874Z 213 │ if (!isFocused && hasSource) props.onRequestClose(); 2026-10-24T18:50:44.1512099Z ·  ──┬── 2026-10-24T18:50:44.1512357Z · ╰── Missing dependency `props` 2026-10-24T18:50:44.1512612Z 214 │ }, [isFocused, hasSource, props.onRequestClose]); 2026-10-24T18:50:44.1512847Z ·  ──────────┬───────── 2026-10-24T18:50:44.1513189Z · ╰── Overly precise dependency `props.onRequestClose`, use `props` instead 2026-10-24T18:50:44.1513474Z 215 │ const { source } = props; 2026-10-24T18:50:44.1513614Z ╰──── 2026-10-24T18:50:44.1514082Z  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-24T18:50:44.1514768Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1515066Z 2026-10-24T18:50:44.1515327Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T18:50:44.1515714Z ╭─[apps/mobile/src/components/VideoPreviewModal.ios.tsx:63:55] 2026-10-24T18:50:44.1515924Z 61 │ }, []); 2026-10-24T18:50:44.1516057Z 62 │ useEffect(() => { 2026-10-24T18:50:44.1516214Z ·  ────┬──── 2026-10-24T18:50:44.1516431Z · ╰── This is the containing effect 2026-10-24T18:50:44.1516715Z 63 │ if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl); 2026-10-24T18:50:44.1516995Z ·  ───────┬────── 2026-10-24T18:50:44.1517337Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1517605Z 64 │ }, [playbackUrl, resolvedUrl]); 2026-10-24T18:50:44.1517755Z ╰──── 2026-10-24T18:50:44.1518408Z  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-24T18:50:44.1519292Z  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-24T18:50:44.1519592Z 2026-10-24T18:50:44.1519851Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T18:50:44.1520312Z ╭─[apps/mobile/src/components/ProjectFavicon.tsx:172:5] 2026-10-24T18:50:44.1520679Z 167 │ const [activeFaviconRequest, setActiveFaviconRequest] = useState(null); 2026-10-24T18:50:44.1520949Z 168 │ useLayoutEffect(() => { 2026-10-24T18:50:44.1521120Z ·  ───────┬─────── 2026-10-24T18:50:44.1521349Z · ╰── This is the containing effect 2026-10-24T18:50:44.1521576Z 169 │ if (faviconRequest === null) return; 2026-10-24T18:50:44.1521734Z 170 │ 2026-10-24T18:50:44.1521928Z 171 │ const endRequest = beginProjectFaviconRequest(faviconRequest); 2026-10-24T18:50:44.1522169Z 172 │ setActiveFaviconRequest(faviconRequest); 2026-10-24T18:50:44.1522377Z ·  ───────────┬─────────── 2026-10-24T18:50:44.1522658Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1522896Z 173 │ return endRequest; 2026-10-24T18:50:44.1523031Z ╰──── 2026-10-24T18:50:44.1523680Z  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-24T18:50:44.1524522Z  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-24T18:50:44.1524822Z 2026-10-24T18:50:44.1525029Z ⚠ eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used. 2026-10-24T18:50:44.1525330Z ╭─[infra/relay/src/http/Api.ts:69:13] 2026-10-24T18:50:44.1525596Z 68 │ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts"; 2026-10-24T18:50:44.1525864Z 69 │ import * as HookForwarder from "../hooks/HookForwarder.ts"; 2026-10-24T18:50:44.1526085Z ·  ──────┬────── 2026-10-24T18:50:44.1526327Z · ╰── 'HookForwarder' is imported here 2026-10-24T18:50:44.1526574Z 70 │ import * as HeldHooks from "../hooks/HeldHooks.ts"; 2026-10-24T18:50:44.1526627Z ╰──── 2026-10-24T18:50:44.1526724Z  help: Consider removing this import. 2026-10-24T18:50:44.1526726Z 2026-10-24T18:50:44.1526928Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-24T18:50:44.1527053Z ╭─[apps/web/src/contextMenuFallback.test.ts:38:9] 2026-10-24T18:50:44.1527119Z 37 │ get isConnected() { 2026-10-24T18:50:44.1527214Z 38 │ let current: FakeElement | null = this; 2026-10-24T18:50:44.1527289Z ·  ─────── 2026-10-24T18:50:44.1527364Z 39 │ while (current?.parent) { 2026-10-24T18:50:44.1527416Z ╰──── 2026-10-24T18:50:44.1527684Z  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-24T18:50:44.1527687Z 2026-10-24T18:50:44.1527898Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T18:50:44.1528026Z ╭─[apps/web/src/lib/announce.browser.test.ts:41:46] 2026-10-24T18:50:44.1528080Z 40 │ 2026-10-24T18:50:44.1528186Z 41 │ expect(regionTexts()).toEqual([...first].reverse()); 2026-10-24T18:50:44.1528366Z ·  ─────── 2026-10-24T18:50:44.1528492Z 42 │ expect(regionTexts()).toContain("Claude"); 2026-10-24T18:50:44.1528544Z ╰──── 2026-10-24T18:50:44.1528834Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T18:50:44.1528837Z 2026-10-24T18:50:44.1529202Z ⚠ 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-24T18:50:44.1529325Z ╭─[packages/shared/src/otelEnvironment.ts:146:14] 2026-10-24T18:50:44.1529385Z 145 │ name, 2026-10-24T18:50:44.1529522Z 146 │ (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()), 2026-10-24T18:50:44.1529630Z ·  ────────────────────────── 2026-10-24T18:50:44.1529757Z 147 │ `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`, 2026-10-24T18:50:44.1529811Z ╰──── 2026-10-24T18:50:44.1529814Z 2026-10-24T18:50:44.1530094Z ⚠ eslint(no-unused-vars): Variable 'layerUnavailable' is declared but never used. Unused variables should start with a '_'. 2026-10-24T18:50:44.1530237Z ╭─[apps/server/src/orchestration-v2/Orchestrator.ts:12380:7] 2026-10-24T18:50:44.1530293Z 12379 │ 2026-10-24T18:50:44.1530434Z 12380 │ const layerUnavailable: Layer.Layer = Layer.succeed( 2026-10-24T18:50:44.1530520Z ·  ────────┬─────── 2026-10-24T18:50:44.1530666Z · ╰── 'layerUnavailable' is declared here 2026-10-24T18:50:44.1530735Z 12381 │ OrchestratorV2, 2026-10-24T18:50:44.1530788Z ╰──── 2026-10-24T18:50:44.1530898Z  help: Consider removing this declaration. 2026-10-24T18:50:44.1530903Z 2026-10-24T18:50:44.1531256Z ⚠ eslint(no-unused-vars): Function 'promptResponseHasMissingXAiStopReason' is declared but never used. 2026-10-24T18:50:44.1531453Z ╭─[packages/provider-grok/src/server/xaiAcpExtension.ts:1620:10] 2026-10-24T18:50:44.1531508Z 1619 │ 2026-10-24T18:50:44.1531716Z 1620 │ function promptResponseHasMissingXAiStopReason(response: EffectAcpSchema.PromptResponse): boolean { 2026-10-24T18:50:44.1531833Z ·  ──────────────────┬────────────────── 2026-10-24T18:50:44.1532031Z · ╰── 'promptResponseHasMissingXAiStopReason' is declared here 2026-10-24T18:50:44.1532109Z 1621 │ const meta = response._meta; 2026-10-24T18:50:44.1532161Z ╰──── 2026-10-24T18:50:44.1532337Z  help: Consider removing this declaration. 2026-10-24T18:50:44.1532384Z 2026-10-24T18:50:44.1532713Z ⚠ 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-24T18:50:44.1532855Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:50:18] 2026-10-24T18:50:44.1533015Z 49 │ for (const tool of ["sendMessage", "followupTask", "interruptAgent", "listAgents"]) { 2026-10-24T18:50:44.1533181Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-24T18:50:44.1533265Z ·  ───────── 2026-10-24T18:50:44.1533443Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-24T18:50:44.1533493Z ╰──── 2026-10-24T18:50:44.1533496Z 2026-10-24T18:50:44.1533826Z ⚠ 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-24T18:50:44.1533966Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:51:18] 2026-10-24T18:50:44.1534132Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-24T18:50:44.1534312Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-24T18:50:44.1534398Z ·  ───────── 2026-10-24T18:50:44.1534450Z 52 │ } 2026-10-24T18:50:44.1534503Z ╰──── 2026-10-24T18:50:44.1534505Z 2026-10-24T18:50:44.1534831Z ⚠ 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-24T18:50:44.1534974Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:55:5] 2026-10-24T18:50:44.1535039Z 54 │ assert.equal( 2026-10-24T18:50:44.1535210Z 55 │ Schema.is(CodexSchema.ServerNotification__CollabAgentToolCallStatus)("interrupted"), 2026-10-24T18:50:44.1535283Z ·  ───────── 2026-10-24T18:50:44.1535341Z 56 │ true, 2026-10-24T18:50:44.1535391Z ╰──── 2026-10-24T18:50:44.1535393Z 2026-10-24T18:50:44.1535716Z ⚠ 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-24T18:50:44.1535857Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:59:5] 2026-10-24T18:50:44.1535921Z 58 │ assert.equal( 2026-10-24T18:50:44.1536098Z 59 │ Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentToolCallStatus)("interrupted"), 2026-10-24T18:50:44.1536175Z ·  ───────── 2026-10-24T18:50:44.1536235Z 60 │ true, 2026-10-24T18:50:44.1536286Z ╰──── 2026-10-24T18:50:44.1536288Z 2026-10-24T18:50:44.1536611Z ⚠ 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-24T18:50:44.1536757Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:103:16] 2026-10-24T18:50:44.1536810Z 102 │ 2026-10-24T18:50:44.1536978Z 103 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse)(resumeResponse), true); 2026-10-24T18:50:44.1537063Z ·  ───────── 2026-10-24T18:50:44.1537118Z 104 │ }); 2026-10-24T18:50:44.1537170Z ╰──── 2026-10-24T18:50:44.1537173Z 2026-10-24T18:50:44.1537485Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T18:50:44.1537685Z ╭─[apps/server/src/orchestration-v2/ThreadPullRequestService.ts:410:7] 2026-10-24T18:50:44.1537736Z 409 │ 2026-10-24T18:50:44.1537863Z 410 │ const layer = Layer.effect(ThreadPullRequestServiceV2, make); 2026-10-24T18:50:44.1537936Z ·  ──┬── 2026-10-24T18:50:44.1538063Z · ╰── 'layer' is declared here 2026-10-24T18:50:44.1538115Z ╰──── 2026-10-24T18:50:44.1538219Z  help: Consider removing this declaration. 2026-10-24T18:50:44.1538221Z 2026-10-24T18:50:44.1538473Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T18:50:44.1538608Z ╭─[packages/provider-grok/src/server/adapter.ts:408:7] 2026-10-24T18:50:44.1538662Z 407 │ 2026-10-24T18:50:44.1538732Z 408 │ const layer: Layer.Layer< 2026-10-24T18:50:44.1538834Z ·  ──┬── 2026-10-24T18:50:44.1538973Z · ╰── 'layer' is declared here 2026-10-24T18:50:44.1539064Z 409 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T18:50:44.1539116Z ╰──── 2026-10-24T18:50:44.1539218Z  help: Consider removing this declaration. 2026-10-24T18:50:44.1539220Z 2026-10-24T18:50:44.1539429Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T18:50:44.1539557Z ╭─[apps/web/src/lib/composerContextReferences.ts:90:40] 2026-10-24T18:50:44.1539635Z 89 │ let cursor = prompt.length; 2026-10-24T18:50:44.1539741Z 90 │ for (const occurrence of occurrences.reverse()) { 2026-10-24T18:50:44.1539854Z ·  ─────── 2026-10-24T18:50:44.1539934Z 91 │ let { start, end } = occurrence; 2026-10-24T18:50:44.1539987Z ╰──── 2026-10-24T18:50:44.1540245Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T18:50:44.1540247Z 2026-10-24T18:50:44.1540446Z ⚠ eslint(no-unsafe-optional-chaining): Unsafe usage of optional chaining 2026-10-24T18:50:44.1540610Z ╭─[apps/server/src/orchestration-v2/ThreadLaunchService.test.ts:1783:8] 2026-10-24T18:50:44.1540681Z 1782 │ assert.equal( 2026-10-24T18:50:44.1540828Z 1783 │ (stored.context?.records[0] as { attachmentId: string }).attachmentId, 2026-10-24T18:50:44.1540932Z ·  ────────────────────────── 2026-10-24T18:50:44.1541016Z 1784 │ stored.attachments[0]?.id, 2026-10-24T18:50:44.1541073Z ╰──── 2026-10-24T18:50:44.1541242Z  help: If this short-circuits with 'undefined' the evaluation will throw TypeError 2026-10-24T18:50:44.1541245Z 2026-10-24T18:50:44.1541486Z ⚠ eslint(no-unused-vars): Function 'normalizeTerminalContextSelection' is declared but never used. 2026-10-24T18:50:44.1541602Z ╭─[apps/web/src/lib/terminalContext.ts:56:10] 2026-10-24T18:50:44.1541653Z 55 │ 2026-10-24T18:50:44.1541753Z 56 │ function normalizeTerminalContextSelection( 2026-10-24T18:50:44.1541868Z ·  ────────────────┬──────────────── 2026-10-24T18:50:44.1542148Z · ╰── 'normalizeTerminalContextSelection' is declared here 2026-10-24T18:50:44.1542233Z 57 │ selection: TerminalContextSelection, 2026-10-24T18:50:44.1542341Z ╰──── 2026-10-24T18:50:44.1542477Z  help: Consider removing this declaration. 2026-10-24T18:50:44.1542479Z 2026-10-24T18:50:44.1542695Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T18:50:44.1542812Z ╭─[packages/shared/src/serverSettings.ts:346:9] 2026-10-24T18:50:44.1542914Z 345 │ const entry: ProjectSettingsOverrides = { 2026-10-24T18:50:44.1543046Z 346 │ ...(entries.get(projectId) ?? currentEntries[projectId] ?? {}), 2026-10-24T18:50:44.1543203Z ·  ────────────────────────────────────────────────────────────── 2026-10-24T18:50:44.1543260Z 347 │ }; 2026-10-24T18:50:44.1543313Z ╰──── 2026-10-24T18:50:44.1543584Z  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-24T18:50:44.1543590Z 2026-10-24T18:50:44.1543807Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in Array.prototype.reduce() 2026-10-24T18:50:44.1543924Z ╭─[packages/shared/src/serverSettings.ts:448:24] 2026-10-24T18:50:44.1543992Z 447 │ const favorites = 2026-10-24T18:50:44.1544105Z 448 │ setModelFavorites?.reduce((current, change) => { 2026-10-24T18:50:44.1544194Z ·  ───┬── 2026-10-24T18:50:44.1544318Z · ╰── For this reduce 2026-10-24T18:50:44.1544399Z 449 │ const exists = current.some( 2026-10-24T18:50:44.1544574Z 450 │ (favorite) => favorite.provider === change.provider && favorite.model === change.model, 2026-10-24T18:50:44.1544630Z 451 │ ); 2026-10-24T18:50:44.1544707Z 452 │ return change.favorite 2026-10-24T18:50:44.1544773Z 453 │ ? exists 2026-10-24T18:50:44.1544837Z 454 │ ? current 2026-10-24T18:50:44.1544971Z 455 │ : [...current, { provider: change.provider, model: change.model }] 2026-10-24T18:50:44.1545052Z ·  ─────┬──── 2026-10-24T18:50:44.1545174Z · ╰── From this spread 2026-10-24T18:50:44.1545246Z 456 │ : current.filter( 2026-10-24T18:50:44.1545299Z ╰──── 2026-10-24T18:50:44.1545499Z  help: Consider using `Object.assign()` or `Array.prototype.push()` to mutate the accumulator instead. 2026-10-24T18:50:44.1545657Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T18:50:44.1545659Z 2026-10-24T18:50:44.1545849Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-24T18:50:44.1545969Z ╭─[packages/shared/src/serverSettings.ts:466:3] 2026-10-24T18:50:44.1546035Z 464 │ null; 2026-10-24T18:50:44.1546152Z 465 │ let nextModelPreferences = initialModelPreferences; 2026-10-24T18:50:44.1546241Z ·  ──────────┬───────── 2026-10-24T18:50:44.1546368Z · ╰── From this accumulator 2026-10-24T18:50:44.1546467Z 466 │ for (const change of setModelsHidden ?? []) { 2026-10-24T18:50:44.1546538Z ·  ─┬─ 2026-10-24T18:50:44.1546641Z · ╰── For this loop 2026-10-24T18:50:44.1546773Z 467 │ const preferences = nextModelPreferences?.[change.provider] ?? { 2026-10-24T18:50:44.1546840Z 468 │ hiddenModels: [], 2026-10-24T18:50:44.1546909Z 469 │ modelOrder: [], 2026-10-24T18:50:44.1547021Z 470 │ }; 2026-10-24T18:50:44.1547269Z 471 │ const hiddenModels = preferences.hiddenModels.filter((model) => model !== change.model); 2026-10-24T18:50:44.1547377Z 472 │ if (change.hidden) hiddenModels.push(change.model); 2026-10-24T18:50:44.1547452Z 473 │ nextModelPreferences = { 2026-10-24T18:50:44.1547529Z 474 │ ...nextModelPreferences, 2026-10-24T18:50:44.1547625Z ·  ───────────┬─────────── 2026-10-24T18:50:44.1547746Z · ╰── From this spread 2026-10-24T18:50:44.1547860Z 475 │ [change.provider]: { ...preferences, hiddenModels }, 2026-10-24T18:50:44.1547917Z ╰──── 2026-10-24T18:50:44.1548070Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-24T18:50:44.1548222Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T18:50:44.1548230Z 2026-10-24T18:50:44.1548701Z ⚠ 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-24T18:50:44.1548864Z ╭─[packages/client-runtime/src/rpc/session.test.ts:226:3] 2026-10-24T18:50:44.1548923Z 225 │ ) { 2026-10-24T18:50:44.1549129Z 226 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T18:50:44.1549239Z 227 │ │ const socket = sockets[index]; 2026-10-24T18:50:44.1549328Z 228 │ │ if (socket) { 2026-10-24T18:50:44.1549421Z 229 │ │ return socket; 2026-10-24T18:50:44.1549501Z 230 │ │ } 2026-10-24T18:50:44.1549605Z 231 │ │ yield* Effect.yieldNow; 2026-10-24T18:50:44.1549729Z 232 │ ╰─▶ } 2026-10-24T18:50:44.1549902Z 233 │ return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket.")); 2026-10-24T18:50:44.1549958Z ╰──── 2026-10-24T18:50:44.1549960Z 2026-10-24T18:50:44.1550411Z ⚠ 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-24T18:50:44.1550548Z ╭─[packages/client-runtime/src/rpc/session.test.ts:240:3] 2026-10-24T18:50:44.1550608Z 239 │ ) { 2026-10-24T18:50:44.1550869Z 240 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T18:50:44.1551112Z 241 │ │ const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index]; 2026-10-24T18:50:44.1551205Z 242 │ │ if (request) { 2026-10-24T18:50:44.1551302Z 243 │ │ return request; 2026-10-24T18:50:44.1551375Z 244 │ │ } 2026-10-24T18:50:44.1551474Z 245 │ │ yield* Effect.yieldNow; 2026-10-24T18:50:44.1551601Z 246 │ ╰─▶ } 2026-10-24T18:50:44.1551767Z 247 │ return yield* Effect.die(new Error("Expected the RPC protocol to send a request.")); 2026-10-24T18:50:44.1551818Z ╰──── 2026-10-24T18:50:44.1551821Z 2026-10-24T18:50:44.1552278Z ⚠ 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-24T18:50:44.1552413Z ╭─[packages/client-runtime/src/rpc/client.test.ts:131:9] 2026-10-24T18:50:44.1552473Z 130 │ ) { 2026-10-24T18:50:44.1552674Z 131 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T18:50:44.1552797Z 132 │ │ if (subscriptions.length >= count) { 2026-10-24T18:50:44.1552885Z 133 │ │ return; 2026-10-24T18:50:44.1552962Z 134 │ │ } 2026-10-24T18:50:44.1553067Z 135 │ │ yield* Effect.yieldNow; 2026-10-24T18:50:44.1553205Z 136 │ ╰─▶ } 2026-10-24T18:50:44.1553370Z 137 │ return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`)); 2026-10-24T18:50:44.1553422Z ╰──── 2026-10-24T18:50:44.1553425Z 2026-10-24T18:50:44.1553871Z ⚠ 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-24T18:50:44.1554003Z ╭─[packages/client-runtime/src/rpc/client.test.ts:252:7] 2026-10-24T18:50:44.1554163Z 251 │ yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient))); 2026-10-24T18:50:44.1554411Z 252 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) { 2026-10-24T18:50:44.1554518Z 253 │ │ yield* Effect.yieldNow; 2026-10-24T18:50:44.1554650Z 254 │ ╰─▶ } 2026-10-24T18:50:44.1554773Z 255 │ yield* SubscriptionRef.set(activeSession, Option.none()); 2026-10-24T18:50:44.1554824Z ╰──── 2026-10-24T18:50:44.1554826Z 2026-10-24T18:50:44.1555271Z ⚠ 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-24T18:50:44.1555398Z ╭─[packages/client-runtime/src/rpc/client.test.ts:258:7] 2026-10-24T18:50:44.1555453Z 257 │ 2026-10-24T18:50:44.1555746Z 258 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-24T18:50:44.1555874Z 259 │ │ yield* Effect.yieldNow; 2026-10-24T18:50:44.1556001Z 260 │ ╰─▶ } 2026-10-24T18:50:44.1556104Z 261 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-24T18:50:44.1556154Z ╰──── 2026-10-24T18:50:44.1556156Z 2026-10-24T18:50:44.1556602Z ⚠ 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-24T18:50:44.1556726Z ╭─[packages/client-runtime/src/rpc/client.test.ts:322:7] 2026-10-24T18:50:44.1556785Z 321 │ ); 2026-10-24T18:50:44.1557038Z 322 │ ╭─▶ for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) { 2026-10-24T18:50:44.1557141Z 323 │ │ yield* Effect.yieldNow; 2026-10-24T18:50:44.1557266Z 324 │ ╰─▶ } 2026-10-24T18:50:44.1557318Z 325 │ 2026-10-24T18:50:44.1557372Z ╰──── 2026-10-24T18:50:44.1557375Z 2026-10-24T18:50:44.1557822Z ⚠ 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-24T18:50:44.1557947Z ╭─[packages/client-runtime/src/rpc/client.test.ts:330:7] 2026-10-24T18:50:44.1558109Z 329 │ yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient))); 2026-10-24T18:50:44.1558358Z 330 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-24T18:50:44.1558462Z 331 │ │ yield* Effect.yieldNow; 2026-10-24T18:50:44.1558588Z 332 │ ╰─▶ } 2026-10-24T18:50:44.1558688Z 333 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-24T18:50:44.1558741Z ╰──── 2026-10-24T18:50:44.1558743Z 2026-10-24T18:50:44.1558979Z ⚠ eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used. 2026-10-24T18:50:44.1559072Z ╭─[apps/web/src/types.ts:22:3] 2026-10-24T18:50:44.1559141Z 21 │ EnvironmentThreadShell, 2026-10-24T18:50:44.1559206Z 22 │ ThreadRunSummary, 2026-10-24T18:50:44.1559290Z ·  ────────┬─────── 2026-10-24T18:50:44.1559434Z · ╰── 'ThreadRunSummary' is imported here 2026-10-24T18:50:44.1559503Z 23 │ ThreadRuntimeSummary, 2026-10-24T18:50:44.1559553Z ╰──── 2026-10-24T18:50:44.1559649Z  help: Consider removing this import. 2026-10-24T18:50:44.1559652Z 2026-10-24T18:50:44.1559943Z ⚠ eslint(no-unused-vars): Variable 'layerFromProviderAdapter' is declared but never used. Unused variables should start with a '_'. 2026-10-24T18:50:44.1560101Z ╭─[apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts:346:7] 2026-10-24T18:50:44.1560153Z 345 │ 2026-10-24T18:50:44.1560253Z 346 │ const layerFromProviderAdapter: Layer.Layer< 2026-10-24T18:50:44.1560347Z ·  ────────────┬─────────── 2026-10-24T18:50:44.1560559Z · ╰── 'layerFromProviderAdapter' is declared here 2026-10-24T18:50:44.1560663Z 347 │ ProviderAdapterRegistryV2, 2026-10-24T18:50:44.1560717Z ╰──── 2026-10-24T18:50:44.1560820Z  help: Consider removing this declaration. 2026-10-24T18:50:44.1560823Z 2026-10-24T18:50:44.1561003Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T18:50:44.1561171Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:555:70] 2026-10-24T18:50:44.1561251Z 554 │ assert.deepStrictEqual( 2026-10-24T18:50:44.1561412Z 555 │ (yield* Ref.get(fixture.syncCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-24T18:50:44.1561528Z ·  ┬ 2026-10-24T18:50:44.1561696Z · ╰── '_' is declared here 2026-10-24T18:50:44.1561759Z 556 │ [ 2026-10-24T18:50:44.1561809Z ╰──── 2026-10-24T18:50:44.1561909Z  help: Consider removing this parameter. 2026-10-24T18:50:44.1561912Z 2026-10-24T18:50:44.1562092Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T18:50:44.1562260Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:1155:70] 2026-10-24T18:50:44.1562342Z 1154 │ assert.deepStrictEqual( 2026-10-24T18:50:44.1562503Z 1155 │ (yield* Ref.get(fixture.linkCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-24T18:50:44.1562620Z ·  ┬ 2026-10-24T18:50:44.1562784Z · ╰── '_' is declared here 2026-10-24T18:50:44.1562846Z 1156 │ [ 2026-10-24T18:50:44.1562897Z ╰──── 2026-10-24T18:50:44.1562995Z  help: Consider removing this parameter. 2026-10-24T18:50:44.1562997Z 2026-10-24T18:50:44.1563448Z ⚠ 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-24T18:50:44.1563569Z ╭─[packages/shared/src/atomicWrite.test.ts:139:5] 2026-10-24T18:50:44.1563644Z 138 │ Effect.gen(function* () { 2026-10-24T18:50:44.1563832Z 139 │ ╭─▶ while (fiber.pollUnsafe() === undefined) { 2026-10-24T18:50:44.1563958Z 140 │ │ yield* TestClock.adjust("100 millis"); 2026-10-24T18:50:44.1564278Z 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-24T18:50:44.1564462Z 142 │ │ yield* Effect.promise(() => new Promise((resolve) => setImmediate(resolve))); 2026-10-24T18:50:44.1564591Z 143 │ ╰─▶ } 2026-10-24T18:50:44.1564674Z 144 │ return yield* Fiber.join(fiber); 2026-10-24T18:50:44.1564725Z ╰──── 2026-10-24T18:50:44.1564727Z 2026-10-24T18:50:44.1564933Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T18:50:44.1565054Z ╭─[apps/mobile/src/lib/markdownDocument.ts:259:28] 2026-10-24T18:50:44.1565200Z 258 │ visit(parser.parse(markdown), false, false); 2026-10-24T18:50:44.1565311Z 259 │ for (const edit of edits.reverse()) 2026-10-24T18:50:44.1565404Z ·  ─────── 2026-10-24T18:50:44.1565564Z 260 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-24T18:50:44.1565613Z ╰──── 2026-10-24T18:50:44.1565876Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T18:50:44.1565878Z 2026-10-24T18:50:44.1566083Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T18:50:44.1566203Z ╭─[apps/mobile/src/lib/markdownDocument.ts:290:28] 2026-10-24T18:50:44.1566280Z 289 │ visit(parser.parse(markdown)); 2026-10-24T18:50:44.1566368Z 290 │ for (const edit of edits.reverse()) 2026-10-24T18:50:44.1566463Z ·  ─────── 2026-10-24T18:50:44.1566621Z 291 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-24T18:50:44.1566670Z ╰──── 2026-10-24T18:50:44.1566921Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T18:50:44.1566923Z 2026-10-24T18:50:44.1567127Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T18:50:44.1567243Z ╭─[apps/mobile/src/lib/markdownDocument.ts:344:38] 2026-10-24T18:50:44.1567320Z 343 │ visit(parser.parse(markdown)); 2026-10-24T18:50:44.1567419Z 344 │ for (const lineStart of lineStarts.reverse()) { 2026-10-24T18:50:44.1567524Z ·  ─────── 2026-10-24T18:50:44.1567686Z 345 │ // The header row may be a lazy line without its container markers (`>` or list indent), 2026-10-24T18:50:44.1567736Z ╰──── 2026-10-24T18:50:44.1567987Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T18:50:44.1567989Z 2026-10-24T18:50:44.1568260Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-24T18:50:44.1568387Z ╭─[packages/provider-cursor/src/server/auth.ts:249:20] 2026-10-24T18:50:44.1568442Z 248 │ }, 2026-10-24T18:50:44.1568522Z 249 │ (effect, flow, stopSessions) => 2026-10-24T18:50:44.1568614Z ·  ──────┬───── 2026-10-24T18:50:44.1568795Z · ╰── 'stopSessions' is declared here 2026-10-24T18:50:44.1568862Z 250 │ effect.pipe( 2026-10-24T18:50:44.1568910Z ╰──── 2026-10-24T18:50:44.1569011Z  help: Consider removing this parameter. 2026-10-24T18:50:44.1569013Z 2026-10-24T18:50:44.1569286Z ⚠ eslint(no-unused-vars): Variable 'legacyCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-24T18:50:44.1569440Z ╭─[packages/provider-cursor/src/server/credentialStore.test.ts:15:7] 2026-10-24T18:50:44.1569490Z 14 │ 2026-10-24T18:50:44.1569561Z 15 │ const legacyCredentials = { 2026-10-24T18:50:44.1569643Z ·  ────────┬──────── 2026-10-24T18:50:44.1569786Z · ╰── 'legacyCredentials' is declared here 2026-10-24T18:50:44.1569908Z 16 │ version: 1 as const, 2026-10-24T18:50:44.1569987Z ╰──── 2026-10-24T18:50:44.1570088Z  help: Consider removing this declaration. 2026-10-24T18:50:44.1570091Z 2026-10-24T18:50:44.1570271Z ⚠ react(static-components): Cannot create components during render 2026-10-24T18:50:44.1570427Z ╭─[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10] 2026-10-24T18:50:44.1570515Z 196 │ const { onInput, onResize } = props; 2026-10-24T18:50:44.1570659Z 197 │ const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView(); 2026-10-24T18:50:44.1570785Z ·  ────────────────┬─────────────── 2026-10-24T18:50:44.1570971Z · ╰── The component is created during render here 2026-10-24T18:50:44.1571153Z 198 │ const hasNativeSurface = Boolean(NativeTerminalSurfaceView); 2026-10-24T18:50:44.1571208Z 199 │ 2026-10-24T18:50:44.1571272Z 200 │ useEffect(() => { 2026-10-24T18:50:44.1571357Z 201 │ terminalDebugLog("native:surface", { 2026-10-24T18:50:44.1571440Z 202 │ terminalKey: props.terminalKey, 2026-10-24T18:50:44.1571514Z 203 │ native: hasNativeSurface, 2026-10-24T18:50:44.1571645Z 204 │ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(), 2026-10-24T18:50:44.1571725Z 205 │ bufferLen: props.buffer.length, 2026-10-24T18:50:44.1571802Z 206 │ isRunning: props.isRunning, 2026-10-24T18:50:44.1571856Z 207 │ }); 2026-10-24T18:50:44.1572013Z 208 │ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]); 2026-10-24T18:50:44.1572096Z 209 │ const handleNativeInput = useCallback( 2026-10-24T18:50:44.1572218Z 210 │ (event: NativeSyntheticEvent) => { 2026-10-24T18:50:44.1572316Z 211 │ if (!props.isRunning || props.readOnly) { 2026-10-24T18:50:44.1572378Z 212 │ return; 2026-10-24T18:50:44.1572430Z 213 │ } 2026-10-24T18:50:44.1572518Z 214 │ terminalDebugLog("native:onInput", { 2026-10-24T18:50:44.1572665Z 215 │ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)), 2026-10-24T18:50:44.1572721Z 216 │ }); 2026-10-24T18:50:44.1572804Z 217 │ onInput(event.nativeEvent.data); 2026-10-24T18:50:44.1572857Z 218 │ }, 2026-10-24T18:50:44.1572951Z 219 │ [onInput, props.isRunning, props.readOnly], 2026-10-24T18:50:44.1573003Z 220 │ ); 2026-10-24T18:50:44.1573089Z 221 │ const handleNativeResize = useCallback( 2026-10-24T18:50:44.1573203Z 222 │ (event: NativeSyntheticEvent) => { 2026-10-24T18:50:44.1573263Z 223 │ onResize({ 2026-10-24T18:50:44.1573348Z 224 │ cols: event.nativeEvent.cols, 2026-10-24T18:50:44.1573428Z 225 │ rows: event.nativeEvent.rows, 2026-10-24T18:50:44.1573484Z 226 │ }); 2026-10-24T18:50:44.1573538Z 227 │ }, 2026-10-24T18:50:44.1573596Z 228 │ [onResize], 2026-10-24T18:50:44.1573648Z 229 │ ); 2026-10-24T18:50:44.1573699Z 230 │ 2026-10-24T18:50:44.1573779Z 231 │ if (NativeTerminalSurfaceView) { 2026-10-24T18:50:44.1573835Z 232 │ return ( 2026-10-24T18:50:44.1573909Z 233 │ 2026-10-24T18:50:44.1573986Z 234 │ ({ key: input.targetKey, location: candidate })); 2026-10-24T18:50:44.1575705Z 113 │ useEffect(() => { 2026-10-24T18:50:44.1575778Z ·  ────┬──── 2026-10-24T18:50:44.1575909Z · ╰── This is the containing effect 2026-10-24T18:50:44.1576069Z 114 │ if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) { 2026-10-24T18:50:44.1576130Z 115 │ return; 2026-10-24T18:50:44.1576182Z 116 │ } 2026-10-24T18:50:44.1576298Z 117 │ setEntry({ key: input.targetKey, location: candidate }); 2026-10-24T18:50:44.1576368Z ·  ────┬─── 2026-10-24T18:50:44.1576532Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1576649Z 118 │ }, [candidate, entry.key, entry.location, input.targetKey]); 2026-10-24T18:50:44.1576699Z ╰──── 2026-10-24T18:50:44.1577292Z  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-24T18:50:44.1577616Z  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-24T18:50:44.1577619Z 2026-10-24T18:50:44.1577871Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T18:50:44.1578035Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:643:5] 2026-10-24T18:50:44.1578086Z 638 │ 2026-10-24T18:50:44.1578150Z 639 │ useEffect(() => { 2026-10-24T18:50:44.1578219Z ·  ────┬──── 2026-10-24T18:50:44.1578395Z · ╰── This is the containing effect 2026-10-24T18:50:44.1578533Z 640 │ if (pendingLaunchEntry.key === launchTargetKey) { 2026-10-24T18:50:44.1578593Z 641 │ return; 2026-10-24T18:50:44.1578646Z 642 │ } 2026-10-24T18:50:44.1578718Z 643 │ setPendingLaunchEntry({ 2026-10-24T18:50:44.1578817Z ·  ──────────┬────────── 2026-10-24T18:50:44.1579014Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1579083Z 644 │ key: launchTargetKey, 2026-10-24T18:50:44.1579132Z ╰──── 2026-10-24T18:50:44.1579725Z  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-24T18:50:44.1580045Z  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-24T18:50:44.1580048Z 2026-10-24T18:50:44.1580298Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T18:50:44.1580465Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5] 2026-10-24T18:50:44.1580517Z 648 │ 2026-10-24T18:50:44.1580580Z 649 │ useEffect(() => { 2026-10-24T18:50:44.1580648Z ·  ────┬──── 2026-10-24T18:50:44.1580773Z · ╰── This is the containing effect 2026-10-24T18:50:44.1580885Z 650 │ if (initialAttachGridEntry.key === launchTargetKey) { 2026-10-24T18:50:44.1580947Z 651 │ return; 2026-10-24T18:50:44.1581001Z 652 │ } 2026-10-24T18:50:44.1581078Z 653 │ setInitialAttachGridEntry({ 2026-10-24T18:50:44.1581170Z ·  ────────────┬──────────── 2026-10-24T18:50:44.1581339Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1581408Z 654 │ key: launchTargetKey, 2026-10-24T18:50:44.1581457Z ╰──── 2026-10-24T18:50:44.1582042Z  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-24T18:50:44.1582363Z  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-24T18:50:44.1582368Z 2026-10-24T18:50:44.1582617Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T18:50:44.1582779Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7] 2026-10-24T18:50:44.1582829Z 743 │ 2026-10-24T18:50:44.1582892Z 744 │ useEffect(() => { 2026-10-24T18:50:44.1582960Z ·  ────┬──── 2026-10-24T18:50:44.1583086Z · ╰── This is the containing effect 2026-10-24T18:50:44.1583186Z 745 │ if (!routeEnvironmentId || !routeThreadId) { 2026-10-24T18:50:44.1583252Z 746 │ setLastGridSize({ 2026-10-24T18:50:44.1583333Z ·  ───────┬─────── 2026-10-24T18:50:44.1583559Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1583672Z 747 │ cols: DEFAULT_TERMINAL_COLS, 2026-10-24T18:50:44.1583723Z ╰──── 2026-10-24T18:50:44.1584308Z  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-24T18:50:44.1584620Z  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-24T18:50:44.1584622Z 2026-10-24T18:50:44.1584822Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T18:50:44.1584989Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24] 2026-10-24T18:50:44.1585043Z 537 │ }); 2026-10-24T18:50:44.1585164Z 538 │ }, [terminal.buffer, terminal.buffer.length, terminalKey]); 2026-10-24T18:50:44.1585272Z ·  ───────────┬────────── 2026-10-24T18:50:44.1585511Z · ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead 2026-10-24T18:50:44.1585669Z 539 │ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null; 2026-10-24T18:50:44.1585719Z ╰──── 2026-10-24T18:50:44.1586008Z  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-24T18:50:44.1586319Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1586323Z 2026-10-24T18:50:44.1586519Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T18:50:44.1586688Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7] 2026-10-24T18:50:44.1586784Z 708 │ sentInitialInputKeyRef.current = null; 2026-10-24T18:50:44.1586848Z 709 │ }, [terminalKey]); 2026-10-24T18:50:44.1586922Z ·  ─────┬───── 2026-10-24T18:50:44.1587062Z · ╰── Unnecessary dependency `terminalKey` 2026-10-24T18:50:44.1587113Z 710 │ 2026-10-24T18:50:44.1587165Z ╰──── 2026-10-24T18:50:44.1587455Z  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-24T18:50:44.1587759Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1587762Z 2026-10-24T18:50:44.1587956Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T18:50:44.1588122Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52] 2026-10-24T18:50:44.1588177Z 799 │ }; 2026-10-24T18:50:44.1588353Z 800 │ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]); 2026-10-24T18:50:44.1588527Z ·  ────────────┬──────────── ─────┬───── 2026-10-24T18:50:44.1588814Z · │ ╰── Unnecessary dependency `terminalKey` 2026-10-24T18:50:44.1589077Z · ╰── Unnecessary dependency `terminal.lifecycleVersion` 2026-10-24T18:50:44.1589127Z 801 │ 2026-10-24T18:50:44.1589178Z ╰──── 2026-10-24T18:50:44.1589463Z  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-24T18:50:44.1589766Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1589768Z 2026-10-24T18:50:44.1589915Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1590078Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24] 2026-10-24T18:50:44.1590132Z 792 │ } 2026-10-24T18:50:44.1590236Z 793 │ const pasteSession = pasteSessionRef.current; 2026-10-24T18:50:44.1590347Z ·  ───────────┬─────────── 2026-10-24T18:50:44.1590504Z · ╰── Cannot access ref value during render 2026-10-24T18:50:44.1590554Z 794 │ 2026-10-24T18:50:44.1590604Z ╰──── 2026-10-24T18:50:44.1591064Z  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-24T18:50:44.1591352Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1591357Z 2026-10-24T18:50:44.1591811Z ⚠ 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-24T18:50:44.1591965Z ╭─[packages/client-runtime/src/connection/supervisor.test.ts:135:3] 2026-10-24T18:50:44.1592076Z 134 │ let lastState = yield* SubscriptionRef.get(state); 2026-10-24T18:50:44.1592287Z 135 │ ╭─▶ for (let iteration = 0; iteration < 100; iteration += 1) { 2026-10-24T18:50:44.1592427Z 136 │ │ lastState = yield* SubscriptionRef.get(state); 2026-10-24T18:50:44.1592535Z 137 │ │ if (predicate(lastState)) { 2026-10-24T18:50:44.1592633Z 138 │ │ return lastState; 2026-10-24T18:50:44.1592708Z 139 │ │ } 2026-10-24T18:50:44.1592808Z 140 │ │ yield* Effect.yieldNow; 2026-10-24T18:50:44.1592933Z 141 │ ╰─▶ } 2026-10-24T18:50:44.1593008Z 142 │ return yield* Effect.die( 2026-10-24T18:50:44.1593059Z ╰──── 2026-10-24T18:50:44.1593062Z 2026-10-24T18:50:44.1593244Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T18:50:44.1593352Z ╭─[packages/shared/src/qrCode.ts:458:44] 2026-10-24T18:50:44.1593417Z 457 │ ): Array { 2026-10-24T18:50:44.1593574Z 458 │ let result: Array = divisor.map((_) => 0); 2026-10-24T18:50:44.1593705Z ·  ┬ 2026-10-24T18:50:44.1593850Z · ╰── '_' is declared here 2026-10-24T18:50:44.1593921Z 459 │ for (const b of data) { 2026-10-24T18:50:44.1593972Z ╰──── 2026-10-24T18:50:44.1594071Z  help: Consider removing this parameter. 2026-10-24T18:50:44.1594074Z 2026-10-24T18:50:44.1594339Z ⚠ eslint(no-unused-vars): Variable 'claudeCaps' is declared but never used. Unused variables should start with a '_'. 2026-10-24T18:50:44.1594446Z ╭─[packages/shared/src/model.test.ts:36:7] 2026-10-24T18:50:44.1594499Z 35 │ 2026-10-24T18:50:44.1594629Z 36 │ const claudeCaps: ModelCapabilities = createModelCapabilities({ 2026-10-24T18:50:44.1594711Z ·  ─────┬──── 2026-10-24T18:50:44.1594847Z · ╰── 'claudeCaps' is declared here 2026-10-24T18:50:44.1594918Z 37 │ optionDescriptors: [ 2026-10-24T18:50:44.1594969Z ╰──── 2026-10-24T18:50:44.1595072Z  help: Consider removing this declaration. 2026-10-24T18:50:44.1595074Z 2026-10-24T18:50:44.1595286Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T18:50:44.1595395Z ╭─[apps/mobile/src/Stack.tsx:1079:21] 2026-10-24T18:50:44.1595459Z 1078 │ } 2026-10-24T18:50:44.1595729Z ·  ───────────────────────────────────────────── 2026-10-24T18:50:44.1595812Z 1080 │ screenOptions={({ route }) => 2026-10-24T18:50:44.1595869Z ╰──── 2026-10-24T18:50:44.1596227Z  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-24T18:50:44.1596230Z 2026-10-24T18:50:44.1596415Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T18:50:44.1596530Z ╭─[apps/mobile/src/lib/useHoverGesture.ts:8:15] 2026-10-24T18:50:44.1596587Z 7 │ () => 2026-10-24T18:50:44.1596649Z 8 │ Gesture.Hover() 2026-10-24T18:50:44.1596725Z ·  ──┬── 2026-10-24T18:50:44.1596857Z · ╰── `Hover` may be a component 2026-10-24T18:50:44.1596930Z 9 │ .manualActivation(true) 2026-10-24T18:50:44.1596980Z ╰──── 2026-10-24T18:50:44.1597261Z  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-24T18:50:44.1597701Z  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-24T18:50:44.1597704Z 2026-10-24T18:50:44.1597878Z ⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`. 2026-10-24T18:50:44.1597998Z ╭─[apps/web/src/terminal/ghostty/core.ts:194:19] 2026-10-24T18:50:44.1598122Z 193 │ const count = Math.min(CHUNK_SIZE, graphemeLength - start); 2026-10-24T18:50:44.1598210Z 194 │ const codes = new Array(count); 2026-10-24T18:50:44.1598370Z ·  ──────────────────────── 2026-10-24T18:50:44.1598499Z 195 │ for (let index = 0; index < count; index += 1) { 2026-10-24T18:50:44.1598554Z ╰──── 2026-10-24T18:50:44.1598995Z  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-24T18:50:44.1598997Z 2026-10-24T18:50:44.1599155Z ⚠ react(immutability): This value cannot be modified 2026-10-24T18:50:44.1599316Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:42:5] 2026-10-24T18:50:44.1599366Z 35 │ 2026-10-24T18:50:44.1599507Z 36 │ const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0); 2026-10-24T18:50:44.1599594Z ·  ────────┬──────── 2026-10-24T18:50:44.1599748Z · ╰── `inspectorProgress` originates here 2026-10-24T18:50:44.1599842Z 37 │ const { renderedInspectorWidth } = props; 2026-10-24T18:50:44.1599974Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-24T18:50:44.1600026Z 39 │ 2026-10-24T18:50:44.1600106Z 40 │ const onClosed = props.onClosed; 2026-10-24T18:50:44.1600168Z 41 │ useEffect(() => { 2026-10-24T18:50:44.1600256Z 42 │ inspectorProgress.value = withTiming( 2026-10-24T18:50:44.1600337Z ·  ────────┬──────── 2026-10-24T18:50:44.1600484Z · ╰── `inspectorProgress` cannot be modified 2026-10-24T18:50:44.1600558Z 43 │ inspectorVisible ? 1 : 0, 2026-10-24T18:50:44.1600609Z ╰──── 2026-10-24T18:50:44.1600876Z  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-24T18:50:44.1601180Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T18:50:44.1601183Z 2026-10-24T18:50:44.1601334Z ⚠ react(immutability): This value cannot be modified 2026-10-24T18:50:44.1601492Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:67:7] 2026-10-24T18:50:44.1601585Z 37 │ const { renderedInspectorWidth } = props; 2026-10-24T18:50:44.1601715Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-24T18:50:44.1601801Z ·  ──────────┬───────── 2026-10-24T18:50:44.1601954Z · ╰── `renderedContentWidth` originates here 2026-10-24T18:50:44.1602053Z 39 │ 2026-10-24T18:50:44.1602176Z 40 │ const onClosed = props.onClosed; 2026-10-24T18:50:44.1602238Z 41 │ useEffect(() => { 2026-10-24T18:50:44.1602325Z 42 │ inspectorProgress.value = withTiming( 2026-10-24T18:50:44.1602401Z 43 │ inspectorVisible ? 1 : 0, 2026-10-24T18:50:44.1602471Z 44 │ WORKSPACE_PANE_TIMING, 2026-10-24T18:50:44.1602534Z 45 │ (finished) => { 2026-10-24T18:50:44.1602672Z 46 │ if (finished === true && !inspectorVisible && onClosed !== undefined) { 2026-10-24T18:50:44.1602745Z 47 │ runOnJS(onClosed)(); 2026-10-24T18:50:44.1602801Z 48 │ } 2026-10-24T18:50:44.1602853Z 49 │ }, 2026-10-24T18:50:44.1602907Z 50 │ ); 2026-10-24T18:50:44.1603036Z 51 │ const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0; 2026-10-24T18:50:44.1603115Z 52 │ renderedInspectorWidth.set( 2026-10-24T18:50:44.1603261Z 53 │ resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING), 2026-10-24T18:50:44.1603319Z 54 │ ); 2026-10-24T18:50:44.1603373Z 55 │ }, [ 2026-10-24T18:50:44.1603438Z 56 │ inspectorProgress, 2026-10-24T18:50:44.1603503Z 57 │ inspectorVisible, 2026-10-24T18:50:44.1603566Z 58 │ inspectorWidth, 2026-10-24T18:50:44.1603626Z 59 │ onClosed, 2026-10-24T18:50:44.1603695Z 60 │ renderedInspectorWidth, 2026-10-24T18:50:44.1603754Z 61 │ resizing, 2026-10-24T18:50:44.1603807Z 62 │ ]); 2026-10-24T18:50:44.1603858Z 63 │ 2026-10-24T18:50:44.1603920Z 64 │ useEffect(() => { 2026-10-24T18:50:44.1604011Z 65 │ const targetWidth = inspectorWidth ?? 0; 2026-10-24T18:50:44.1604095Z 66 │ if (!inspectorVisible || resizing) { 2026-10-24T18:50:44.1604193Z 67 │ renderedContentWidth.value = targetWidth; 2026-10-24T18:50:44.1604282Z ·  ──────────┬───────── 2026-10-24T18:50:44.1604445Z · ╰── `renderedContentWidth` cannot be modified 2026-10-24T18:50:44.1604503Z 68 │ return; 2026-10-24T18:50:44.1604554Z ╰──── 2026-10-24T18:50:44.1604813Z  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-24T18:50:44.1605112Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T18:50:44.1605115Z 2026-10-24T18:50:44.1605342Z ⚠ eslint(no-unneeded-ternary): Unnecessary use of boolean literals in conditional expression 2026-10-24T18:50:44.1605466Z ╭─[packages/shared/src/serverSettings.test.ts:35:7] 2026-10-24T18:50:44.1605651Z 34 │ const fallback = fallbackTextGenerationModelSelection(providerInstances, (instanceId) => 2026-10-24T18:50:44.1605748Z 35 │ instanceId === configured ? true : false, 2026-10-24T18:50:44.1605862Z ·  ──────────────────────────────────────── 2026-10-24T18:50:44.1605915Z 36 │ ); 2026-10-24T18:50:44.1605965Z ╰──── 2026-10-24T18:50:44.1606058Z  help: Remove this ternary operator 2026-10-24T18:50:44.1606061Z 2026-10-24T18:50:44.1606284Z ⚠ eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used. 2026-10-24T18:50:44.1606414Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:15:8] 2026-10-24T18:50:44.1606482Z 14 │ threadSearchMatchKey, 2026-10-24T18:50:44.1606568Z 15 │ type EnvironmentThreadSearchMatch, 2026-10-24T18:50:44.1606723Z ·  ──────────────┬───────────── 2026-10-24T18:50:44.1606928Z · ╰── 'EnvironmentThreadSearchMatch' is imported here 2026-10-24T18:50:44.1607033Z 16 │ } from "@t3tools/client-runtime/state/thread-search"; 2026-10-24T18:50:44.1607086Z ╰──── 2026-10-24T18:50:44.1607182Z  help: Consider removing this import. 2026-10-24T18:50:44.1607185Z 2026-10-24T18:50:44.1607383Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T18:50:44.1607510Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:527:25] 2026-10-24T18:50:44.1607640Z 526 │ // range) the boundary string is identical and the chain would die. 2026-10-24T18:50:44.1607730Z 527 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-24T18:50:44.1607831Z ·  ───────┬────── 2026-10-24T18:50:44.1607998Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T18:50:44.1608136Z 528 │ const v2SearchQuery = props.searchQuery.trim().toLocaleLowerCase(); 2026-10-24T18:50:44.1608187Z ╰──── 2026-10-24T18:50:44.1608475Z  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-24T18:50:44.1608792Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1608794Z 2026-10-24T18:50:44.1608992Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T18:50:44.1609119Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:518:53] 2026-10-24T18:50:44.1609209Z 517 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-24T18:50:44.1609371Z 518 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-24T18:50:44.1609488Z ·  ─────┬──── 2026-10-24T18:50:44.1609654Z · ╰── Cannot call impure function 2026-10-24T18:50:44.1609732Z 519 │ const id = setTimeout(() => { 2026-10-24T18:50:44.1609784Z ╰──── 2026-10-24T18:50:44.1610067Z  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-24T18:50:44.1610352Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T18:50:44.1610360Z 2026-10-24T18:50:44.1610559Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T18:50:44.1610718Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:155:7] 2026-10-24T18:50:44.1610772Z 154 │ } 2026-10-24T18:50:44.1610838Z 155 │ }, [wrappedRender]); 2026-10-24T18:50:44.1610916Z ·  ──────┬────── 2026-10-24T18:50:44.1611064Z · ╰── Unnecessary dependency `wrappedRender` 2026-10-24T18:50:44.1611164Z 156 │ 2026-10-24T18:50:44.1611214Z ╰──── 2026-10-24T18:50:44.1611499Z  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-24T18:50:44.1611871Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1611915Z 2026-10-24T18:50:44.1612186Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T18:50:44.1612347Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:800:42] 2026-10-24T18:50:44.1612401Z 799 │ > 2026-10-24T18:50:44.1612528Z 800 │ 2026-10-24T18:50:44.1612649Z ·  ──────────────────── 2026-10-24T18:50:44.1612750Z 801 │ 2026-10-24T18:50:44.1612800Z ╰──── 2026-10-24T18:50:44.1613023Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T18:50:44.1613167Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T18:50:44.1613171Z 2026-10-24T18:50:44.1613425Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T18:50:44.1613604Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:107:5] 2026-10-24T18:50:44.1613657Z 104 │ 2026-10-24T18:50:44.1613724Z 105 │ useEffect(() => { 2026-10-24T18:50:44.1613796Z ·  ────┬──── 2026-10-24T18:50:44.1613923Z · ╰── This is the containing effect 2026-10-24T18:50:44.1614002Z 106 │ clearReviewCommentTarget(); 2026-10-24T18:50:44.1614098Z 107 │ setPendingNativeCommentSelection(null); 2026-10-24T18:50:44.1614210Z ·  ────────────────┬─────────────── 2026-10-24T18:50:44.1614384Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1614458Z 108 │ }, [selectedSection?.id]); 2026-10-24T18:50:44.1614510Z ╰──── 2026-10-24T18:50:44.1615095Z  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-24T18:50:44.1615410Z  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-24T18:50:44.1615412Z 2026-10-24T18:50:44.1615668Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T18:50:44.1615852Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7] 2026-10-24T18:50:44.1615906Z 109 │ 2026-10-24T18:50:44.1615970Z 110 │ useEffect(() => { 2026-10-24T18:50:44.1616041Z ·  ────┬──── 2026-10-24T18:50:44.1616169Z · ╰── This is the containing effect 2026-10-24T18:50:44.1616256Z 111 │ if (activeCommentTarget === null) { 2026-10-24T18:50:44.1616355Z 112 │ setPendingNativeCommentSelection(null); 2026-10-24T18:50:44.1616460Z ·  ────────────────┬─────────────── 2026-10-24T18:50:44.1616637Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1616694Z 113 │ } 2026-10-24T18:50:44.1616800Z ╰──── 2026-10-24T18:50:44.1617409Z  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-24T18:50:44.1617723Z  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-24T18:50:44.1617726Z 2026-10-24T18:50:44.1617923Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T18:50:44.1618102Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7] 2026-10-24T18:50:44.1618201Z 107 │ setPendingNativeCommentSelection(null); 2026-10-24T18:50:44.1618274Z 108 │ }, [selectedSection?.id]); 2026-10-24T18:50:44.1618359Z ·  ─────────┬───────── 2026-10-24T18:50:44.1618519Z · ╰── Unnecessary dependency `selectedSection?.id` 2026-10-24T18:50:44.1618572Z 109 │ 2026-10-24T18:50:44.1618622Z ╰──── 2026-10-24T18:50:44.1618957Z  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-24T18:50:44.1619263Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1619265Z 2026-10-24T18:50:44.1619428Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T18:50:44.1619584Z ╭─[apps/web/src/components/CommandPaletteThreadItems.tsx:152:58] 2026-10-24T18:50:44.1619761Z 151 │ if (threadSearchQuery.trim().length > 0 && !threadSearchQuery.startsWith(">") && !isOpen) { 2026-10-24T18:50:44.1619892Z 152 │ claimThreadOpen(thread.environmentId, thread.id, Date.now()); 2026-10-24T18:50:44.1620014Z ·  ─────┬──── 2026-10-24T18:50:44.1620180Z · ╰── Cannot call impure function 2026-10-24T18:50:44.1620235Z 153 │ } 2026-10-24T18:50:44.1620287Z ╰──── 2026-10-24T18:50:44.1620565Z  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-24T18:50:44.1620923Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T18:50:44.1620954Z 2026-10-24T18:50:44.1621095Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1621245Z ╭─[apps/mobile/src/features/home/thread-swipe-actions.tsx:494:27] 2026-10-24T18:50:44.1621304Z 493 │ > 2026-10-24T18:50:44.1621382Z 494 │ {props.children(close)} 2026-10-24T18:50:44.1621468Z ·  ──┬── 2026-10-24T18:50:44.1621624Z · ╰── Cannot access ref value during render 2026-10-24T18:50:44.1621702Z 495 │ 2026-10-24T18:50:44.1621753Z ╰──── 2026-10-24T18:50:44.1622213Z  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-24T18:50:44.1622502Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1622505Z 2026-10-24T18:50:44.1622702Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T18:50:44.1622834Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:454:7] 2026-10-24T18:50:44.1622917Z 453 │ showAuxiliaryPane("inspector"); 2026-10-24T18:50:44.1623021Z 454 │ }, [environmentId, showAuxiliaryPane, threadId]); 2026-10-24T18:50:44.1623163Z ·  ──────┬────── ────┬─── 2026-10-24T18:50:44.1623364Z · │ ╰── Unnecessary dependency `threadId` 2026-10-24T18:50:44.1623512Z · ╰── Unnecessary dependency `environmentId` 2026-10-24T18:50:44.1623568Z 455 │ const { 2026-10-24T18:50:44.1623621Z ╰──── 2026-10-24T18:50:44.1623906Z  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-24T18:50:44.1624209Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1624212Z 2026-10-24T18:50:44.1624394Z ⚠ react(static-components): Cannot create components during render 2026-10-24T18:50:44.1624533Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:725:20] 2026-10-24T18:50:44.1624598Z 492 │ // same check. 2026-10-24T18:50:44.1624727Z 493 │ const NativeReviewDiffView = resolveNativeReviewDiffView(); 2026-10-24T18:50:44.1624846Z ·  ─────────────┬───────────── 2026-10-24T18:50:44.1625022Z · ╰── The component is created during render here 2026-10-24T18:50:44.1625171Z 494 │ const nativeReviewDiffViewRef = useRef(null); 2026-10-24T18:50:44.1625293Z 495 │ const showcasedReviewDrawRef = useRef(null); 2026-10-24T18:50:44.1625423Z 496 │ const [isPullRefreshing, setIsPullRefreshing] = useState(false); 2026-10-24T18:50:44.1625513Z 497 │ const handlePullToRefresh = async () => { 2026-10-24T18:50:44.1625640Z 498 │ setIsPullRefreshing(true); 2026-10-24T18:50:44.1625757Z 499 │ await refreshSelectedSection(); 2026-10-24T18:50:44.1625832Z 500 │ setIsPullRefreshing(false); 2026-10-24T18:50:44.1625883Z 501 │ }; 2026-10-24T18:50:44.1626024Z 502 │ const reviewFileNavigatorRef = useRef(null); 2026-10-24T18:50:44.1626169Z 503 │ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : []; 2026-10-24T18:50:44.1626275Z 504 │ const fileVisibility = useReviewFileVisibility({ 2026-10-24T18:50:44.1626358Z 505 │ threadKey: reviewCache.threadKey, 2026-10-24T18:50:44.1626445Z 506 │ sectionId: selectedSection?.id ?? null, 2026-10-24T18:50:44.1626513Z 507 │ files: reviewFiles, 2026-10-24T18:50:44.1626610Z 508 │ cachedExpandedFileIds: selectedSection?.id 2026-10-24T18:50:44.1626737Z 509 │ ? reviewCache.expandedFileIdsBySection[selectedSection.id] 2026-10-24T18:50:44.1626806Z 510 │ : undefined, 2026-10-24T18:50:44.1626902Z 511 │ cachedViewedFileIds: selectedSection?.id 2026-10-24T18:50:44.1627024Z 512 │ ? reviewCache.viewedFileIdsBySection[selectedSection.id] 2026-10-24T18:50:44.1627084Z 513 │ : undefined, 2026-10-24T18:50:44.1627136Z 514 │ }); 2026-10-24T18:50:44.1627325Z 515 │ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility; 2026-10-24T18:50:44.1627454Z 516 │ const commentSelection = useReviewCommentSelectionController({ 2026-10-24T18:50:44.1627516Z 517 │ environmentId, 2026-10-24T18:50:44.1627577Z 518 │ threadId, 2026-10-24T18:50:44.1627643Z 519 │ selectedSection, 2026-10-24T18:50:44.1627713Z 520 │ nativeReviewDiffData, 2026-10-24T18:50:44.1627766Z 521 │ }); 2026-10-24T18:50:44.1627871Z 522 │ const nativeBridge = useNativeReviewDiffBridge({ 2026-10-24T18:50:44.1627960Z 523 │ threadKey: reviewCache.threadKey, 2026-10-24T18:50:44.1628048Z 524 │ sectionId: selectedSection?.id ?? null, 2026-10-24T18:50:44.1628124Z 525 │ diff: selectedSection?.diff, 2026-10-24T18:50:44.1628199Z 526 │ data: nativeReviewDiffData, 2026-10-24T18:50:44.1628268Z 527 │ collapsedFileIds, 2026-10-24T18:50:44.1628328Z 528 │ viewedFileIds, 2026-10-24T18:50:44.1628437Z 529 │ selectedRowIds: commentSelection.selectedRowIds, 2026-10-24T18:50:44.1628535Z 530 │ canHighlight: parsedDiff.kind === "files", 2026-10-24T18:50:44.1628588Z 531 │ }); 2026-10-24T18:50:44.1628659Z 532 │ const showcaseReviewKey = 2026-10-24T18:50:44.1628802Z 533 │ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection 2026-10-24T18:50:44.1629034Z 534 │ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}` 2026-10-24T18:50:44.1629100Z 535 │ : null; 2026-10-24T18:50:44.1629265Z 536 │ const handleNativeDebug = (event: NativeSyntheticEvent>) => { 2026-10-24T18:50:44.1629343Z 537 │ nativeBridge.onDebug(event); 2026-10-24T18:50:44.1629400Z 538 │ if ( 2026-10-24T18:50:44.1629479Z 539 │ showcaseReviewKey === null || 2026-10-24T18:50:44.1629597Z 540 │ showcasedReviewDrawRef.current === showcaseReviewKey || 2026-10-24T18:50:44.1629707Z 541 │ !isNativeReviewDiffDrawEvent(event.nativeEvent) 2026-10-24T18:50:44.1629765Z 542 │ ) { 2026-10-24T18:50:44.1629824Z 543 │ return; 2026-10-24T18:50:44.1629877Z 544 │ } 2026-10-24T18:50:44.1629989Z 545 │ showcasedReviewDrawRef.current = showcaseReviewKey; 2026-10-24T18:50:44.1630152Z 546 │ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId }); 2026-10-24T18:50:44.1630256Z 547 │ }; 2026-10-24T18:50:44.1630337Z 548 │ 2026-10-24T18:50:44.1630460Z 549 │ const handleSelectFile = async (fileId: string | null) => { 2026-10-24T18:50:44.1630542Z 550 │ loadVisibleFile(fileId, true); 2026-10-24T18:50:44.1630631Z 551 │ commentSelection.clearSelection(); 2026-10-24T18:50:44.1630747Z 552 │ if (fileId !== null && collapsedFileIds.includes(fileId)) { 2026-10-24T18:50:44.1630825Z 553 │ toggleExpandedFile(fileId); 2026-10-24T18:50:44.1630880Z 554 │ } 2026-10-24T18:50:44.1630988Z 555 │ const nativeView = nativeReviewDiffViewRef.current; 2026-10-24T18:50:44.1631060Z 556 │ if (!nativeView) return; 2026-10-24T18:50:44.1631154Z 557 │ const result = await settlePromise(() => 2026-10-24T18:50:44.1631328Z 558 │ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true), 2026-10-24T18:50:44.1631382Z 559 │ ); 2026-10-24T18:50:44.1631480Z 560 │ if (AsyncResult.isFailure(result)) { 2026-10-24T18:50:44.1631662Z 561 │ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result)); 2026-10-24T18:50:44.1631716Z 562 │ } 2026-10-24T18:50:44.1631768Z 563 │ }; 2026-10-24T18:50:44.1631850Z 564 │ const handleVisibleFileChange = ( 2026-10-24T18:50:44.1631980Z 565 │ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>, 2026-10-24T18:50:44.1632037Z 566 │ ) => { 2026-10-24T18:50:44.1632144Z 567 │ loadVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-24T18:50:44.1632309Z 568 │ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-24T18:50:44.1632363Z 569 │ }; 2026-10-24T18:50:44.1632441Z 570 │ const renderInspector = () => ( 2026-10-24T18:50:44.1632510Z 571 │ void handleSelectFile(fileId)} 2026-10-24T18:50:44.1633029Z 577 │ /> 2026-10-24T18:50:44.1633083Z 578 │ ); 2026-10-24T18:50:44.1633133Z 579 │ 2026-10-24T18:50:44.1633316Z 580 │ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => { 2026-10-24T18:50:44.1633404Z 581 │ const { fileId } = event.nativeEvent; 2026-10-24T18:50:44.1633467Z 582 │ if (fileId) { 2026-10-24T18:50:44.1633546Z 583 │ loadVisibleFile(fileId, true); 2026-10-24T18:50:44.1633624Z 584 │ toggleExpandedFile(fileId); 2026-10-24T18:50:44.1633685Z 585 │ } 2026-10-24T18:50:44.1633739Z 586 │ }; 2026-10-24T18:50:44.1633792Z 587 │ 2026-10-24T18:50:44.1633880Z 588 │ const handleNativeToggleViewedFile = ( 2026-10-24T18:50:44.1633999Z 589 │ event: NativeSyntheticEvent<{ readonly fileId?: string }>, 2026-10-24T18:50:44.1634054Z 590 │ ) => { 2026-10-24T18:50:44.1634141Z 591 │ const { fileId } = event.nativeEvent; 2026-10-24T18:50:44.1634204Z 592 │ if (fileId) { 2026-10-24T18:50:44.1634279Z 593 │ toggleViewedFile(fileId); 2026-10-24T18:50:44.1634330Z 594 │ } 2026-10-24T18:50:44.1634385Z 595 │ }; 2026-10-24T18:50:44.1634438Z 596 │ 2026-10-24T18:50:44.1634511Z 597 │ const parsedDiffNotice = 2026-10-24T18:50:44.1634671Z 598 │ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null; 2026-10-24T18:50:44.1634846Z 599 │ const hasCachedSelectedDiff = selectedSection?.diff != null; 2026-10-24T18:50:44.1635034Z 600 │ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null); 2026-10-24T18:50:44.1635155Z 601 │ const sectionMenu = buildReviewSectionMenu(reviewSections); 2026-10-24T18:50:44.1635311Z 602 │ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({ 2026-10-24T18:50:44.1635421Z 603 │ hasEnvironmentPresentation: environment.isReady, 2026-10-24T18:50:44.1635522Z 604 │ isEnvironmentConnected: isEnvironmentReady, 2026-10-24T18:50:44.1635595Z 605 │ hasCachedSelectedDiff, 2026-10-24T18:50:44.1635659Z 606 │ hasAnyCachedDiff, 2026-10-24T18:50:44.1635712Z 607 │ }); 2026-10-24T18:50:44.1635799Z 608 │ const handleRetryEnvironment = () => { 2026-10-24T18:50:44.1635885Z 609 │ void retryEnvironment(environmentId); 2026-10-24T18:50:44.1635937Z 610 │ }; 2026-10-24T18:50:44.1636026Z 611 │ const handleReturnToThread = () => { 2026-10-24T18:50:44.1636105Z 612 │ if (navigation.canGoBack()) { 2026-10-24T18:50:44.1636182Z 613 │ navigation.goBack(); 2026-10-24T18:50:44.1636243Z 614 │ return; 2026-10-24T18:50:44.1636298Z 615 │ } 2026-10-24T18:50:44.1636380Z 616 │ navigation.navigate("Thread", { 2026-10-24T18:50:44.1636466Z 617 │ environmentId: String(environmentId), 2026-10-24T18:50:44.1636543Z 618 │ threadId: String(threadId), 2026-10-24T18:50:44.1636599Z 619 │ }); 2026-10-24T18:50:44.1636652Z 620 │ }; 2026-10-24T18:50:44.1636727Z 621 │ const androidHeaderSubtitle = [ 2026-10-24T18:50:44.1636800Z 622 │ selectedSection?.title, 2026-10-24T18:50:44.1636879Z 623 │ headerDiffSummary.additions, 2026-10-24T18:50:44.1636956Z 624 │ headerDiffSummary.deletions, 2026-10-24T18:50:44.1637008Z 625 │ ] 2026-10-24T18:50:44.1637121Z 626 │ .filter((part): part is string => Boolean(part)) 2026-10-24T18:50:44.1637188Z 627 │ .join(" · "); 2026-10-24T18:50:44.1637239Z 628 │ 2026-10-24T18:50:44.1637316Z 629 │ const showChangedFilesPane = 2026-10-24T18:50:44.1637389Z 630 │ !showConnectionNotice && 2026-10-24T18:50:44.1637463Z 631 │ selectedSection !== null && 2026-10-24T18:50:44.1637543Z 632 │ parsedDiff.kind === "files" && 2026-10-24T18:50:44.1637622Z 633 │ NativeReviewDiffView !== null; 2026-10-24T18:50:44.1637791Z 634 │ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined); 2026-10-24T18:50:44.1637961Z 635 │ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane; 2026-10-24T18:50:44.1638012Z 636 │ 2026-10-24T18:50:44.1638085Z 637 │ const listHeader = (() => { 2026-10-24T18:50:44.1638171Z 638 │ const children: ReactElement[] = []; 2026-10-24T18:50:44.1638229Z 639 │ 2026-10-24T18:50:44.1638292Z 640 │ if (error) { 2026-10-24T18:50:44.1638360Z 641 │ children.push( 2026-10-24T18:50:44.1638420Z 642 │ 2026-10-24T18:50:44.1639098Z 649 │ Review unavailable 2026-10-24T18:50:44.1639254Z 650 │ {error} 2026-10-24T18:50:44.1639314Z 651 │ , 2026-10-24T18:50:44.1639433Z 652 │ ); 2026-10-24T18:50:44.1639540Z 653 │ } 2026-10-24T18:50:44.1639594Z 654 │ 2026-10-24T18:50:44.1639665Z 655 │ if (parsedDiffNotice) { 2026-10-24T18:50:44.1639822Z 656 │ children.push(); 2026-10-24T18:50:44.1639876Z 657 │ } 2026-10-24T18:50:44.1639928Z 658 │ 2026-10-24T18:50:44.1640002Z 659 │ if (children.length === 0) { 2026-10-24T18:50:44.1640067Z 660 │ return null; 2026-10-24T18:50:44.1640120Z 661 │ } 2026-10-24T18:50:44.1640171Z 662 │ 2026-10-24T18:50:44.1640240Z 663 │ return <>{children}; 2026-10-24T18:50:44.1640295Z 664 │ })(); 2026-10-24T18:50:44.1640366Z 665 │ const headerSubtitle = [ 2026-10-24T18:50:44.1640444Z 666 │ headerDiffSummary.additions, 2026-10-24T18:50:44.1640519Z 667 │ headerDiffSummary.deletions, 2026-10-24T18:50:44.1640604Z 668 │ pendingReviewCommentCount > 0 2026-10-24T18:50:44.1640778Z 669 │ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}` 2026-10-24T18:50:44.1640840Z 670 │ : null, 2026-10-24T18:50:44.1640891Z 671 │ ] 2026-10-24T18:50:44.1640958Z 672 │ .filter(Boolean) 2026-10-24T18:50:44.1641020Z 673 │ .join(" · "); 2026-10-24T18:50:44.1641151Z 674 │ const headerTitleText = selectedSection?.title ?? "Review changes"; 2026-10-24T18:50:44.1641204Z 675 │ 2026-10-24T18:50:44.1641266Z 676 │ return ( 2026-10-24T18:50:44.1641320Z 677 │ <> 2026-10-24T18:50:44.1641382Z 678 │ 2026-10-24T18:50:44.1642695Z 694 │ 2026-10-24T18:50:44.1642769Z 695 │ 2026-10-24T18:50:44.1642892Z 696 │ 2026-10-24T18:50:44.1642970Z 697 │ {showConnectionNotice ? ( 2026-10-24T18:50:44.1643111Z 698 │ 2026-10-24T18:50:44.1643201Z 699 │ 2026-10-24T18:50:44.1644284Z 711 │ 2026-10-24T18:50:44.1644440Z 712 │ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? ( 2026-10-24T18:50:44.1644498Z 713 │ 2026-10-24T18:50:44.1644940Z 719 │ 2026-10-24T18:50:44.1645294Z 723 │ {listHeader} 2026-10-24T18:50:44.1645413Z 724 │ 2026-10-24T18:50:44.1645496Z 725 │ Promise.resolve()); 2026-10-24T18:50:44.1647628Z 225 │ │ const pending = backgroundRuntime.pending.shift(); 2026-10-24T18:50:44.1647720Z 226 │ │ if (!pending) { 2026-10-24T18:50:44.1647814Z 227 │ │ idlePasses++; 2026-10-24T18:50:44.1647919Z 228 │ │ if (idlePasses >= 3) { 2026-10-24T18:50:44.1648006Z 229 │ │ return; 2026-10-24T18:50:44.1648081Z 230 │ │ } 2026-10-24T18:50:44.1648167Z 231 │ │ continue; 2026-10-24T18:50:44.1648241Z 232 │ │ } 2026-10-24T18:50:44.1648333Z 233 │ │ idlePasses = 0; 2026-10-24T18:50:44.1648499Z 234 │ │ const exit = yield* Effect.exit( 2026-10-24T18:50:44.1648739Z 235 │ │ pending.operation as Effect.Effect, 2026-10-24T18:50:44.1648853Z 236 │ │ ); 2026-10-24T18:50:44.1648958Z 237 │ │ yield* Effect.sync(() => { 2026-10-24T18:50:44.1649059Z 238 │ │ pending.resolve(exit); 2026-10-24T18:50:44.1649137Z 239 │ │ }); 2026-10-24T18:50:44.1649264Z 240 │ ╰─▶ } 2026-10-24T18:50:44.1649322Z 241 │ }, 2026-10-24T18:50:44.1649374Z ╰──── 2026-10-24T18:50:44.1649376Z 2026-10-24T18:50:44.1649634Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T18:50:44.1649811Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:60:5] 2026-10-24T18:50:44.1649869Z 55 │ 2026-10-24T18:50:44.1649933Z 56 │ useEffect(() => { 2026-10-24T18:50:44.1650006Z ·  ────┬──── 2026-10-24T18:50:44.1650134Z · ╰── This is the containing effect 2026-10-24T18:50:44.1650203Z 57 │ scheduler.reset(); 2026-10-24T18:50:44.1650297Z 58 │ highlightedRowIdsRef.current = new Set(); 2026-10-24T18:50:44.1650382Z 59 │ visibleChunkIndexRef.current = 0; 2026-10-24T18:50:44.1650496Z 60 │ setVisibleRange({ firstRowIndex: 0, lastRowIndex: 80 }); 2026-10-24T18:50:44.1650575Z ·  ───────┬─────── 2026-10-24T18:50:44.1650743Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1650866Z 61 │ setTokensPatchJson(createEmptyTokenPatch(resetKey)); 2026-10-24T18:50:44.1650922Z ╰──── 2026-10-24T18:50:44.1651609Z  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-24T18:50:44.1651925Z  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-24T18:50:44.1651930Z 2026-10-24T18:50:44.1652131Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T18:50:44.1652301Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:63:7] 2026-10-24T18:50:44.1652383Z 62 │ return () => scheduler.cancel(); 2026-10-24T18:50:44.1652486Z 63 │ }, [enabled, resetKey, rows.length, scheduler]); 2026-10-24T18:50:44.1652610Z ·  ───┬─── ─────┬───── 2026-10-24T18:50:44.1652798Z · │ ╰── Unnecessary dependency `rows.length` 2026-10-24T18:50:44.1652934Z · ╰── Unnecessary dependency `enabled` 2026-10-24T18:50:44.1652989Z 64 │ 2026-10-24T18:50:44.1653040Z ╰──── 2026-10-24T18:50:44.1653329Z  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-24T18:50:44.1653705Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1653753Z 2026-10-24T18:50:44.1653944Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T18:50:44.1654091Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:223:31] 2026-10-24T18:50:44.1654197Z 222 │ ? snippetTokens.map((line, lineIndex) => ( 2026-10-24T18:50:44.1654292Z 223 │ 2026-10-24T18:50:44.1654397Z ·  ─────────────── 2026-10-24T18:50:44.1654487Z 224 │ {lineIndex > 0 ? "\n" : ""} 2026-10-24T18:50:44.1654540Z ╰──── 2026-10-24T18:50:44.1654686Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T18:50:44.1654689Z 2026-10-24T18:50:44.1654885Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T18:50:44.1655034Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25] 2026-10-24T18:50:44.1655110Z 226 │ { 2026-10-24T18:50:44.1656182Z ·  ────┬──── 2026-10-24T18:50:44.1656313Z · ╰── This is the containing effect 2026-10-24T18:50:44.1656413Z 102 │ if (!target || selectedLines.length === 0) { 2026-10-24T18:50:44.1656496Z 103 │ setHighlightedLinesById({}); 2026-10-24T18:50:44.1656587Z ·  ───────────┬─────────── 2026-10-24T18:50:44.1656762Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1656823Z 104 │ return; 2026-10-24T18:50:44.1656875Z ╰──── 2026-10-24T18:50:44.1657507Z  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-24T18:50:44.1657858Z  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-24T18:50:44.1657861Z 2026-10-24T18:50:44.1658140Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-24T18:50:44.1658269Z ╭─[apps/server/src/provider/AntigravityAuth.ts:285:20] 2026-10-24T18:50:44.1658324Z 284 │ }, 2026-10-24T18:50:44.1658405Z 285 │ (effect, flow, stopSessions) => 2026-10-24T18:50:44.1658498Z ·  ──────┬───── 2026-10-24T18:50:44.1658648Z · ╰── 'stopSessions' is declared here 2026-10-24T18:50:44.1658716Z 286 │ effect.pipe( 2026-10-24T18:50:44.1658808Z ╰──── 2026-10-24T18:50:44.1658923Z  help: Consider removing this parameter. 2026-10-24T18:50:44.1658925Z 2026-10-24T18:50:44.1659143Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T18:50:44.1659284Z ╭─[packages/client-runtime/src/operations/projects.ts:238:51] 2026-10-24T18:50:44.1659345Z 237 │ ): string { 2026-10-24T18:50:44.1659497Z 238 │ const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? ""; 2026-10-24T18:50:44.1659606Z ·  ────── 2026-10-24T18:50:44.1659740Z 239 │ return target.owner ? `${target.owner}/${folderName}` : folderName; 2026-10-24T18:50:44.1659796Z ╰──── 2026-10-24T18:50:44.1659965Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T18:50:44.1659968Z 2026-10-24T18:50:44.1660128Z ⚠ eslint(no-empty-pattern): Empty array binding pattern 2026-10-24T18:50:44.1660286Z ╭─[apps/server/src/pullRequest/PullRequestService.test.ts:1437:12] 2026-10-24T18:50:44.1660340Z 1436 │ 2026-10-24T18:50:44.1660405Z 1437 │ for (const [] of [ 2026-10-24T18:50:44.1660475Z ·  ── 2026-10-24T18:50:44.1660550Z 1438 │ ["github", "github.com"], 2026-10-24T18:50:44.1660603Z ╰──── 2026-10-24T18:50:44.1660881Z  help: Passing non-iterable values (null, undefined, numbers, booleans, etc.) will result in a runtime error because these values are not iterable. 2026-10-24T18:50:44.1660884Z 2026-10-24T18:50:44.1663486Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T18:50:44.1663651Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:406:5] 2026-10-24T18:50:44.1663703Z 404 │ 2026-10-24T18:50:44.1663767Z 405 │ useEffect(() => { 2026-10-24T18:50:44.1663837Z ·  ────┬──── 2026-10-24T18:50:44.1663969Z · ╰── This is the containing effect 2026-10-24T18:50:44.1664060Z 406 │ setInspectorSelection((current) => { 2026-10-24T18:50:44.1664144Z ·  ──────────┬────────── 2026-10-24T18:50:44.1664319Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1664420Z 407 │ if (props.renderInspector === undefined) { 2026-10-24T18:50:44.1664471Z ╰──── 2026-10-24T18:50:44.1665132Z  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-24T18:50:44.1665482Z  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-24T18:50:44.1665485Z 2026-10-24T18:50:44.1665696Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T18:50:44.1665844Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:534:24] 2026-10-24T18:50:44.1666006Z 533 │ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top; 2026-10-24T18:50:44.1666173Z 534 │ ╭─▶ const GitInspector = () => ( 2026-10-24T18:50:44.1666268Z 535 │ │ 2026-10-24T18:50:44.1666864Z 540 │ ╰─▶ ); 2026-10-24T18:50:44.1666942Z 541 │ const FilesInspector = () => 2026-10-24T18:50:44.1666993Z ╰──── 2026-10-24T18:50:44.1667214Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-24T18:50:44.1667220Z 2026-10-24T18:50:44.1667428Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T18:50:44.1667577Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:541:26] 2026-10-24T18:50:44.1667634Z 540 │ ); 2026-10-24T18:50:44.1667793Z 541 │ ╭─▶ const FilesInspector = () => 2026-10-24T18:50:44.1667942Z 542 │ │ selectedThread !== null && selectedThreadCwd !== null ? ( 2026-10-24T18:50:44.1668047Z 543 │ │ 2026-10-24T18:50:44.1669042Z 551 │ ╰─▶ ) : null; 2026-10-24T18:50:44.1669190Z 552 │ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset); 2026-10-24T18:50:44.1669241Z ╰──── 2026-10-24T18:50:44.1669453Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-24T18:50:44.1669508Z 2026-10-24T18:50:44.1670006Z ⚠ 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-24T18:50:44.1670154Z ╭─[apps/server/src/background/HostPowerMonitor.test.ts:133:11] 2026-10-24T18:50:44.1670282Z 132 │ const monitor = yield* HostPowerMonitor.HostPowerMonitor; 2026-10-24T18:50:44.1670421Z 133 │ ╭─▶ for ( 2026-10-24T18:50:44.1670524Z 134 │ │ let attempt = 0; 2026-10-24T18:50:44.1670688Z 135 │ │ attempt < 100 && (yield* monitor.snapshot).onBattery !== "true"; 2026-10-24T18:50:44.1670791Z 136 │ │ attempt += 1 2026-10-24T18:50:44.1670872Z 137 │ │ ) { 2026-10-24T18:50:44.1670983Z 138 │ │ yield* Effect.yieldNow; 2026-10-24T18:50:44.1671116Z 139 │ ╰─▶ } 2026-10-24T18:50:44.1671237Z 140 │ expect((yield* monitor.snapshot).onBattery).toBe("true"); 2026-10-24T18:50:44.1671287Z ╰──── 2026-10-24T18:50:44.1671291Z 2026-10-24T18:50:44.1671496Z ⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used. 2026-10-24T18:50:44.1671633Z ╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10] 2026-10-24T18:50:44.1671686Z 21 │ 2026-10-24T18:50:44.1671844Z 22 │ function summarizePayload(payload: unknown): Readonly> { 2026-10-24T18:50:44.1671934Z ·  ────────┬─────── 2026-10-24T18:50:44.1672084Z · ╰── 'summarizePayload' is declared here 2026-10-24T18:50:44.1672191Z 23 │ if (payload === null) return { valueType: "null" }; 2026-10-24T18:50:44.1672242Z ╰──── 2026-10-24T18:50:44.1672345Z  help: Consider removing this declaration. 2026-10-24T18:50:44.1672348Z 2026-10-24T18:50:44.1672514Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T18:50:44.1672662Z ╭─[apps/server/src/provider/Drivers/CodexDriver.test.ts:466:14] 2026-10-24T18:50:44.1672714Z 465 │ 2026-10-24T18:50:44.1672817Z 466 │ for (const {} of ["direct", "wrapper"] as const) { 2026-10-24T18:50:44.1672889Z ·  ── 2026-10-24T18:50:44.1672942Z 467 │ } 2026-10-24T18:50:44.1672994Z ╰──── 2026-10-24T18:50:44.1673227Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T18:50:44.1673231Z 2026-10-24T18:50:44.1673487Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T18:50:44.1673637Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:361:7] 2026-10-24T18:50:44.1673777Z 355 │ }, [cancelledIncomingShareId, navigation, props.incomingShareId]); 2026-10-24T18:50:44.1673841Z 356 │ useEffect(() => { 2026-10-24T18:50:44.1673911Z ·  ────┬──── 2026-10-24T18:50:44.1674041Z · ╰── This is the containing effect 2026-10-24T18:50:44.1674129Z 357 │ if (!isReturningToProjectPicker) { 2026-10-24T18:50:44.1674190Z 358 │ return; 2026-10-24T18:50:44.1674311Z 359 │ } 2026-10-24T18:50:44.1674443Z 360 │ if (requestedInitialProjectAvailable) { 2026-10-24T18:50:44.1674536Z 361 │ setIsReturningToProjectPicker(false); 2026-10-24T18:50:44.1674641Z ·  ──────────────┬────────────── 2026-10-24T18:50:44.1674818Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1674878Z 362 │ return; 2026-10-24T18:50:44.1674930Z ╰──── 2026-10-24T18:50:44.1675514Z  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-24T18:50:44.1675840Z  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-24T18:50:44.1675845Z 2026-10-24T18:50:44.1676097Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T18:50:44.1676244Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:504:9] 2026-10-24T18:50:44.1676300Z 447 │ 2026-10-24T18:50:44.1676364Z 448 │ useEffect(() => { 2026-10-24T18:50:44.1676434Z ·  ────┬──── 2026-10-24T18:50:44.1676563Z · ╰── This is the containing effect 2026-10-24T18:50:44.1676666Z 449 │ if (props.pendingTaskId || props.draftId) { 2026-10-24T18:50:44.1676722Z 450 │ return; 2026-10-24T18:50:44.1676778Z 451 │ } 2026-10-24T18:50:44.1676921Z 452 │ if (lastInitialProjectRefRef.current !== props.initialProjectRef) { 2026-10-24T18:50:44.1677054Z 453 │ lastInitialProjectRefRef.current = props.initialProjectRef; 2026-10-24T18:50:44.1677159Z 454 │ appliedInitialProjectKeyRef.current = null; 2026-10-24T18:50:44.1677215Z 455 │ } 2026-10-24T18:50:44.1677354Z 456 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-24T18:50:44.1677479Z 457 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-24T18:50:44.1677584Z 458 │ if (initialEnvironmentId && initialProjectId) { 2026-10-24T18:50:44.1677655Z 459 │ const directProject = 2026-10-24T18:50:44.1677721Z 460 │ projects.find( 2026-10-24T18:50:44.1677784Z 461 │ (project) => 2026-10-24T18:50:44.1677954Z 462 │ project.environmentId === initialEnvironmentId && project.id === initialProjectId, 2026-10-24T18:50:44.1678024Z 463 │ ) ?? null; 2026-10-24T18:50:44.1678077Z 464 │ 2026-10-24T18:50:44.1678144Z 465 │ if (directProject) { 2026-10-24T18:50:44.1678282Z 466 │ // Apply the route's project once. Re-applying on every change would 2026-10-24T18:50:44.1678418Z 467 │ // instantly revert environment/project switches made in the picker. 2026-10-24T18:50:44.1678578Z 468 │ const directProjectKey = `${directProject.environmentId}:${directProject.id}`; 2026-10-24T18:50:44.1678710Z 469 │ if (appliedInitialProjectKeyRef.current === directProjectKey) { 2026-10-24T18:50:44.1678803Z 470 │ return; 2026-10-24T18:50:44.1678859Z 471 │ } 2026-10-24T18:50:44.1678955Z 472 │ if (props.initialProjectRef?.branch) { 2026-10-24T18:50:44.1679014Z 473 │ if ( 2026-10-24T18:50:44.1679157Z 474 │ selectedProject?.environmentId !== directProject.environmentId || 2026-10-24T18:50:44.1679315Z 475 │ selectedProject.id !== directProject.id 2026-10-24T18:50:44.1679405Z 476 │ ) { 2026-10-24T18:50:44.1679487Z 477 │ setProject(directProject); 2026-10-24T18:50:44.1679550Z 478 │ return; 2026-10-24T18:50:44.1679607Z 479 │ } 2026-10-24T18:50:44.1679688Z 480 │ if (!flow.draftKey) return; 2026-10-24T18:50:44.1679823Z 481 │ // The route completes checkout before mounting this composer. Local 2026-10-24T18:50:44.1679964Z 482 │ // mode reuses an existing worktree; worktree mode would create another. 2026-10-24T18:50:44.1680073Z 483 │ updateComposerDraftSettings(flow.draftKey, { 2026-10-24T18:50:44.1680149Z 484 │ workspaceSelection: { 2026-10-24T18:50:44.1680215Z 485 │ mode: "local", 2026-10-24T18:50:44.1680317Z 486 │ branch: props.initialProjectRef.branch, 2026-10-24T18:50:44.1680453Z 487 │ worktreePath: props.initialProjectRef.worktreePath ?? null, 2026-10-24T18:50:44.1680534Z 488 │ startFromOrigin: false, 2026-10-24T18:50:44.1680590Z 489 │ }, 2026-10-24T18:50:44.1680650Z 490 │ }); 2026-10-24T18:50:44.1680705Z 491 │ } 2026-10-24T18:50:44.1680830Z 492 │ appliedInitialProjectKeyRef.current = directProjectKey; 2026-10-24T18:50:44.1680885Z 493 │ if ( 2026-10-24T18:50:44.1681024Z 494 │ selectedProject?.environmentId === directProject.environmentId && 2026-10-24T18:50:44.1681121Z 495 │ selectedProject.id === directProject.id 2026-10-24T18:50:44.1681184Z 496 │ ) { 2026-10-24T18:50:44.1681244Z 497 │ return; 2026-10-24T18:50:44.1681298Z 498 │ } 2026-10-24T18:50:44.1681376Z 499 │ setProject(directProject); 2026-10-24T18:50:44.1681440Z 500 │ return; 2026-10-24T18:50:44.1681495Z 501 │ } 2026-10-24T18:50:44.1681545Z 502 │ 2026-10-24T18:50:44.1681622Z 503 │ if (projects.length > 0) { 2026-10-24T18:50:44.1681715Z 504 │ setIsReturningToProjectPicker(true); 2026-10-24T18:50:44.1681824Z ·  ──────────────┬────────────── 2026-10-24T18:50:44.1682005Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1682061Z 505 │ } 2026-10-24T18:50:44.1682110Z ╰──── 2026-10-24T18:50:44.1682745Z  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-24T18:50:44.1683091Z  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-24T18:50:44.1683094Z 2026-10-24T18:50:44.1683346Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T18:50:44.1683495Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:604:5] 2026-10-24T18:50:44.1683545Z 545 │ 2026-10-24T18:50:44.1683611Z 546 │ useEffect(() => { 2026-10-24T18:50:44.1683682Z ·  ────┬──── 2026-10-24T18:50:44.1683809Z · ╰── This is the containing effect 2026-10-24T18:50:44.1683901Z 547 │ const shareId = props.incomingShareId; 2026-10-24T18:50:44.1683987Z 548 │ const draftKey = flow.draftKey; 2026-10-24T18:50:44.1684089Z 549 │ const destinationProject = selectedProject; 2026-10-24T18:50:44.1684228Z 550 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-24T18:50:44.1684352Z 551 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-24T18:50:44.1684440Z 552 │ const selectedProjectMatchesRoute = 2026-10-24T18:50:44.1684514Z 553 │ !initialEnvironmentId || 2026-10-24T18:50:44.1684584Z 554 │ !initialProjectId || 2026-10-24T18:50:44.1684711Z 555 │ (destinationProject?.environmentId === initialEnvironmentId && 2026-10-24T18:50:44.1684816Z 556 │ destinationProject.id === initialProjectId); 2026-10-24T18:50:44.1684873Z 557 │ if ( 2026-10-24T18:50:44.1684934Z 558 │ !shareId || 2026-10-24T18:50:44.1684995Z 559 │ !draftKey || 2026-10-24T18:50:44.1685066Z 560 │ !destinationProject || 2026-10-24T18:50:44.1685156Z 561 │ !selectedProjectMatchesRoute || 2026-10-24T18:50:44.1685246Z 562 │ cancelledIncomingShareId === shareId 2026-10-24T18:50:44.1685299Z 563 │ ) { 2026-10-24T18:50:44.1685358Z 564 │ return; 2026-10-24T18:50:44.1685412Z 565 │ } 2026-10-24T18:50:44.1685504Z 566 │ const importKey = `${shareId}:${draftKey}`; 2026-10-24T18:50:44.1685562Z 567 │ if ( 2026-10-24T18:50:44.1685671Z 568 │ startedShareImportKeyRef.current === importKey || 2026-10-24T18:50:44.1685780Z 569 │ cancellingShareImportKeyRef.current === importKey 2026-10-24T18:50:44.1685832Z 570 │ ) { 2026-10-24T18:50:44.1685891Z 571 │ return; 2026-10-24T18:50:44.1685944Z 572 │ } 2026-10-24T18:50:44.1685995Z 573 │ 2026-10-24T18:50:44.1686060Z 574 │ if (!incomingShare) { 2026-10-24T18:50:44.1686258Z 575 │ if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) { 2026-10-24T18:50:44.1686395Z 576 │ alertedUnavailableIncomingShareIdRef.current = shareId; 2026-10-24T18:50:44.1686459Z 577 │ Dialog.alert( 2026-10-24T18:50:44.1686541Z 578 │ "Shared content unavailable", 2026-10-24T18:50:44.1686718Z 579 │ "The shared content is no longer in the inbox. You can continue editing this task draft.", 2026-10-24T18:50:44.1686774Z 580 │ ); 2026-10-24T18:50:44.1686827Z 581 │ } 2026-10-24T18:50:44.1686884Z 582 │ return; 2026-10-24T18:50:44.1686936Z 583 │ } 2026-10-24T18:50:44.1686986Z 584 │ 2026-10-24T18:50:44.1687039Z 585 │ if ( 2026-10-24T18:50:44.1687199Z 586 │ incomingShare.attachments.some((attachment) => attachment.type === "file") && 2026-10-24T18:50:44.1687297Z 587 │ selectedEnvironmentServerConfig === null 2026-10-24T18:50:44.1687409Z 588 │ ) { 2026-10-24T18:50:44.1687496Z 589 │ return; 2026-10-24T18:50:44.1687550Z 590 │ } 2026-10-24T18:50:44.1687601Z 591 │ 2026-10-24T18:50:44.1687735Z 592 │ if (alertedUnavailableIncomingShareIdRef.current === shareId) { 2026-10-24T18:50:44.1687851Z 593 │ alertedUnavailableIncomingShareIdRef.current = null; 2026-10-24T18:50:44.1687906Z 594 │ } 2026-10-24T18:50:44.1688011Z 595 │ startedShareImportKeyRef.current = importKey; 2026-10-24T18:50:44.1688080Z 596 │ const draftBackup = 2026-10-24T18:50:44.1688260Z 597 │ shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey); 2026-10-24T18:50:44.1688396Z 598 │ shareImportDraftBackupRef.current.set(importKey, draftBackup); 2026-10-24T18:50:44.1688485Z 599 │ const importToken = Symbol(importKey); 2026-10-24T18:50:44.1688562Z 600 │ let didReserveShare = false; 2026-10-24T18:50:44.1688640Z 601 │ let didConsumeShare = false; 2026-10-24T18:50:44.1688718Z 602 │ let needsDraftRestore = false; 2026-10-24T18:50:44.1688836Z 603 │ activeShareImportTokenRef.current = importToken; 2026-10-24T18:50:44.1688945Z 604 │ setImportingShareKey(importKey); 2026-10-24T18:50:44.1689031Z ·  ──────────┬───────── 2026-10-24T18:50:44.1689203Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1689271Z 605 │ void (async () => { 2026-10-24T18:50:44.1689322Z ╰──── 2026-10-24T18:50:44.1689904Z  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-24T18:50:44.1690224Z  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-24T18:50:44.1690227Z 2026-10-24T18:50:44.1690427Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T18:50:44.1690576Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:524:5] 2026-10-24T18:50:44.1690651Z 523 │ props.initialProjectRef, 2026-10-24T18:50:44.1690719Z 524 │ props.incomingShareId, 2026-10-24T18:50:44.1690805Z ·  ──────────┬────────── 2026-10-24T18:50:44.1690972Z · ╰── Unnecessary dependency `props.incomingShareId` 2026-10-24T18:50:44.1691040Z 525 │ props.pendingTaskId, 2026-10-24T18:50:44.1691149Z ╰──── 2026-10-24T18:50:44.1691441Z  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-24T18:50:44.1691743Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1691746Z 2026-10-24T18:50:44.1691956Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T18:50:44.1692102Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:543:5] 2026-10-24T18:50:44.1692216Z 542 │ loadedBranchesProjectKeyRef.current = projectKey; 2026-10-24T18:50:44.1692282Z 543 │ flow.loadBranches(); 2026-10-24T18:50:44.1692352Z ·  ──┬─ 2026-10-24T18:50:44.1692545Z · ╰── Missing dependency `flow` 2026-10-24T18:50:44.1692679Z 544 │ }, [flow.loadBranches, selectedProject]); 2026-10-24T18:50:44.1692763Z ·  ────────┬──────── 2026-10-24T18:50:44.1692960Z · ╰── Overly precise dependency `flow.loadBranches`, use `flow` instead 2026-10-24T18:50:44.1693010Z 545 │ 2026-10-24T18:50:44.1693062Z ╰──── 2026-10-24T18:50:44.1693475Z  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-24T18:50:44.1693780Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1693787Z 2026-10-24T18:50:44.1693984Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T18:50:44.1694129Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:766:5] 2026-10-24T18:50:44.1694192Z 765 │ flow.draftKey, 2026-10-24T18:50:44.1694268Z 766 │ hasImportedIncomingShare, 2026-10-24T18:50:44.1694357Z ·  ────────────┬─────────── 2026-10-24T18:50:44.1694528Z · ╰── Unnecessary dependency `hasImportedIncomingShare` 2026-10-24T18:50:44.1694590Z 767 │ incomingShare, 2026-10-24T18:50:44.1694669Z 768 │ isIncomingShareInboxLoading, 2026-10-24T18:50:44.1694765Z ·  ─────────────┬───────────── 2026-10-24T18:50:44.1694948Z · ╰── Unnecessary dependency `isIncomingShareInboxLoading` 2026-10-24T18:50:44.1695029Z 769 │ isIncomingShareUnavailable, 2026-10-24T18:50:44.1695100Z 770 │ props.incomingShareId, 2026-10-24T18:50:44.1695192Z 771 │ props.initialProjectRef?.environmentId, 2026-10-24T18:50:44.1695276Z 772 │ props.initialProjectRef?.projectId, 2026-10-24T18:50:44.1695350Z 773 │ releaseShareReservation, 2026-10-24T18:50:44.1695412Z 774 │ reserveShare, 2026-10-24T18:50:44.1695495Z 775 │ selectedEnvironmentServerConfig, 2026-10-24T18:50:44.1695559Z 776 │ selectedProject, 2026-10-24T18:50:44.1695628Z 777 │ shareImportAttempt, 2026-10-24T18:50:44.1695713Z ·  ─────────┬──────── 2026-10-24T18:50:44.1695879Z · ╰── Unnecessary dependency `shareImportAttempt` 2026-10-24T18:50:44.1695932Z 778 │ ]); 2026-10-24T18:50:44.1695985Z ╰──── 2026-10-24T18:50:44.1696282Z  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-24T18:50:44.1696586Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1696589Z 2026-10-24T18:50:44.1696771Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-24T18:50:44.1696897Z ╭─[packages/client-runtime/src/state/shell.ts:189:5] 2026-10-24T18:50:44.1697006Z 186 │ let waiting = yield* Ref.get(awaitingCompletion); 2026-10-24T18:50:44.1697071Z 187 │ let next = initial; 2026-10-24T18:50:44.1697138Z ·  ──┬─ 2026-10-24T18:50:44.1697331Z · ╰── From this accumulator 2026-10-24T18:50:44.1697437Z 188 │ let receivedSnapshot = false; 2026-10-24T18:50:44.1697510Z 189 │ for (const item of items) { 2026-10-24T18:50:44.1697575Z ·  ─┬─ 2026-10-24T18:50:44.1697678Z · ╰── For this loop 2026-10-24T18:50:44.1697764Z 190 │ if (item.kind === "synchronized") { 2026-10-24T18:50:44.1697831Z 191 │ waiting = false; 2026-10-24T18:50:44.1697919Z 192 │ if (Option.isSome(next.snapshot)) { 2026-10-24T18:50:44.1698035Z 193 │ next = { ...next, status: "live", error: Option.none() }; 2026-10-24T18:50:44.1698116Z ·  ───┬─── 2026-10-24T18:50:44.1698242Z · ╰── From this spread 2026-10-24T18:50:44.1698299Z 194 │ } 2026-10-24T18:50:44.1698350Z ╰──── 2026-10-24T18:50:44.1698509Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-24T18:50:44.1698664Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T18:50:44.1698666Z 2026-10-24T18:50:44.1698881Z ⚠ eslint(require-yield): This generator function does not have `yield` 2026-10-24T18:50:44.1699027Z ╭─[packages/provider-acp/src/server/mcpOverAcpBridge.ts:81:78] 2026-10-24T18:50:44.1699079Z  80 │ 2026-10-24T18:50:44.1699350Z  81 │ ╭─▶ export const makeAcpMcpOverAcpBridge = Effect.fn("AcpMcpOverAcpBridge.make")(function* ( 2026-10-24T18:50:44.1699469Z  82 │ │ options: AcpMcpOverAcpBridgeOptions, 2026-10-24T18:50:44.1699587Z  83 │ │ ): Effect.fn.Return { 2026-10-24T18:50:44.1699752Z  84 │ │ const fetchImplementation = options.fetchImplementation ?? fetch; 2026-10-24T18:50:44.1699886Z  85 │ │ const connections = new Map(); 2026-10-24T18:50:44.1699954Z  86 │ │ 2026-10-24T18:50:44.1700165Z  87 │ │ const connectionFor = (connectionId: string): Effect.Effect => 2026-10-24T18:50:44.1700262Z  88 │ │ Effect.suspend(() => { 2026-10-24T18:50:44.1700397Z  89 │ │ const connection = connections.get(connectionId); 2026-10-24T18:50:44.1700505Z  90 │ │ return connection === undefined 2026-10-24T18:50:44.1700715Z  91 │ │ ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`)) 2026-10-24T18:50:44.1700827Z  92 │ │ : Effect.succeed(connection); 2026-10-24T18:50:44.1700901Z  93 │ │ }); 2026-10-24T18:50:44.1700970Z  94 │ │ 2026-10-24T18:50:44.1701057Z  95 │ │ const send = ( 2026-10-24T18:50:44.1701153Z  96 │ │ connection: Connection, 2026-10-24T18:50:44.1701242Z  97 │ │ message: unknown, 2026-10-24T18:50:44.1701397Z  98 │ │ ): Effect.Effect, AcpMcpOverAcpError> => 2026-10-24T18:50:44.1701509Z  99 │ │ connection.mutex.withPermits(1)( 2026-10-24T18:50:44.1701612Z 100 │ │ Effect.gen(function* () { 2026-10-24T18:50:44.1701728Z 101 │ │ const body = JSON.stringify(message); 2026-10-24T18:50:44.1701918Z 102 │ │ if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) { 2026-10-24T18:50:44.1702155Z 103 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB.")); 2026-10-24T18:50:44.1702230Z 104 │ │ } 2026-10-24T18:50:44.1702359Z 105 │ │ const response = yield* Effect.tryPromise({ 2026-10-24T18:50:44.1702455Z 106 │ │ try: (signal) => 2026-10-24T18:50:44.1702584Z 107 │ │ fetchImplementation(options.endpoint, { 2026-10-24T18:50:44.1702683Z 108 │ │ method: "POST", 2026-10-24T18:50:44.1702771Z 109 │ │ signal, 2026-10-24T18:50:44.1702865Z 110 │ │ headers: { 2026-10-24T18:50:44.1702996Z 111 │ │ "content-type": "application/json", 2026-10-24T18:50:44.1703139Z 112 │ │ accept: "application/json, text/event-stream", 2026-10-24T18:50:44.1703267Z 113 │ │ authorization: options.authorization, 2026-10-24T18:50:44.1703390Z 114 │ │ ...(connection.sessionId === null 2026-10-24T18:50:44.1703481Z 115 │ │ ? {} 2026-10-24T18:50:44.1703628Z 116 │ │ : { "mcp-session-id": connection.sessionId }), 2026-10-24T18:50:44.1703757Z 117 │ │ ...(connection.protocolVersion === null 2026-10-24T18:50:44.1703849Z 118 │ │ ? {} 2026-10-24T18:50:44.1704011Z 119 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-24T18:50:44.1704098Z 120 │ │ }, 2026-10-24T18:50:44.1704187Z 121 │ │ body, 2026-10-24T18:50:44.1704269Z 122 │ │ }), 2026-10-24T18:50:44.1704370Z 123 │ │ catch: bridgeError, 2026-10-24T18:50:44.1704448Z 124 │ │ }); 2026-10-24T18:50:44.1704654Z 125 │ │ connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId; 2026-10-24T18:50:44.1704750Z 126 │ │ if (!response.ok) { 2026-10-24T18:50:44.1704854Z 127 │ │ yield* Effect.promise( 2026-10-24T18:50:44.1705034Z 128 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-24T18:50:44.1705117Z 129 │ │ ); 2026-10-24T18:50:44.1705231Z 130 │ │ return yield* Effect.fail( 2026-10-24T18:50:44.1705438Z 131 │ │ new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`), 2026-10-24T18:50:44.1705516Z 132 │ │ ); 2026-10-24T18:50:44.1705592Z 133 │ │ } 2026-10-24T18:50:44.1705796Z 134 │ │ const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))]; 2026-10-24T18:50:44.1705914Z 135 │ │ for (const payload of payloads) { 2026-10-24T18:50:44.1706124Z 136 │ │ connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion; 2026-10-24T18:50:44.1706200Z 137 │ │ } 2026-10-24T18:50:44.1706346Z 138 │ │ return payloads; 2026-10-24T18:50:44.1706496Z 139 │ │ }).pipe(Effect.mapError(bridgeError)), 2026-10-24T18:50:44.1706568Z 140 │ │ ); 2026-10-24T18:50:44.1706638Z 141 │ │ 2026-10-24T18:50:44.1706810Z 142 │ │ const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* ( 2026-10-24T18:50:44.1706934Z 143 │ │ request: AcpSchema.DisconnectMcpRequest, 2026-10-24T18:50:44.1707115Z 144 │ │ ): Effect.fn.Return { 2026-10-24T18:50:44.1707274Z 145 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T18:50:44.1707396Z 146 │ │ connections.delete(request.connectionId); 2026-10-24T18:50:44.1707522Z 147 │ │ const sessionId = connection.sessionId; 2026-10-24T18:50:44.1707625Z 148 │ │ if (sessionId !== null) { 2026-10-24T18:50:44.1707753Z 149 │ │ const response = yield* Effect.tryPromise({ 2026-10-24T18:50:44.1707846Z 150 │ │ try: (signal) => 2026-10-24T18:50:44.1707973Z 151 │ │ fetchImplementation(options.endpoint, { 2026-10-24T18:50:44.1708069Z 152 │ │ method: "DELETE", 2026-10-24T18:50:44.1708157Z 153 │ │ signal, 2026-10-24T18:50:44.1708247Z 154 │ │ headers: { 2026-10-24T18:50:44.1708375Z 155 │ │ authorization: options.authorization, 2026-10-24T18:50:44.1708496Z 156 │ │ "mcp-session-id": sessionId, 2026-10-24T18:50:44.1708630Z 157 │ │ ...(connection.protocolVersion === null 2026-10-24T18:50:44.1708716Z 158 │ │ ? {} 2026-10-24T18:50:44.1708906Z 159 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-24T18:50:44.1708988Z 160 │ │ }, 2026-10-24T18:50:44.1709066Z 161 │ │ }), 2026-10-24T18:50:44.1709163Z 162 │ │ catch: bridgeError, 2026-10-24T18:50:44.1709238Z 163 │ │ }); 2026-10-24T18:50:44.1709368Z 164 │ │ if (!response.ok && response.status !== 404) { 2026-10-24T18:50:44.1709477Z 165 │ │ return yield* Effect.fail( 2026-10-24T18:50:44.1709634Z 166 │ │ new AcpMcpOverAcpError( 2026-10-24T18:50:44.1709851Z 167 │ │ `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`, 2026-10-24T18:50:44.1709930Z 168 │ │ ), 2026-10-24T18:50:44.1710006Z 169 │ │ ); 2026-10-24T18:50:44.1710079Z 170 │ │ } 2026-10-24T18:50:44.1710180Z 171 │ │ yield* Effect.promise( 2026-10-24T18:50:44.1710355Z 172 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-24T18:50:44.1710430Z 173 │ │ ); 2026-10-24T18:50:44.1710500Z 174 │ │ } 2026-10-24T18:50:44.1710582Z 175 │ │ return {}; 2026-10-24T18:50:44.1710653Z 176 │ │ }); 2026-10-24T18:50:44.1710725Z 177 │ │ 2026-10-24T18:50:44.1710804Z 178 │ │ return { 2026-10-24T18:50:44.1710971Z 179 │ │ connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) { 2026-10-24T18:50:44.1711087Z 180 │ │ if (request.serverId !== "t3-code") { 2026-10-24T18:50:44.1711193Z 181 │ │ return yield* Effect.fail( 2026-10-24T18:50:44.1711374Z 182 │ │ new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`), 2026-10-24T18:50:44.1711450Z 183 │ │ ); 2026-10-24T18:50:44.1711523Z 184 │ │ } 2026-10-24T18:50:44.1711646Z 185 │ │ if (connections.size >= MAX_CONNECTIONS) { 2026-10-24T18:50:44.1711858Z 186 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections.")); 2026-10-24T18:50:44.1711932Z 187 │ │ } 2026-10-24T18:50:44.1712085Z 188 │ │ const connectionId = yield* options.allocateConnectionId; 2026-10-24T18:50:44.1712198Z 189 │ │ connections.set(connectionId, { 2026-10-24T18:50:44.1712313Z 190 │ │ mutex: yield* Semaphore.make(1), 2026-10-24T18:50:44.1712408Z 191 │ │ sessionId: null, 2026-10-24T18:50:44.1712511Z 192 │ │ protocolVersion: null, 2026-10-24T18:50:44.1712609Z 193 │ │ nextRequestId: 0, 2026-10-24T18:50:44.1712685Z 194 │ │ }); 2026-10-24T18:50:44.1712784Z 195 │ │ return { connectionId }; 2026-10-24T18:50:44.1712862Z 196 │ │ }), 2026-10-24T18:50:44.1713032Z 197 │ │ message: Effect.fn("mcpOverAcpBridge.message")(function* (request) { 2026-10-24T18:50:44.1713190Z 198 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T18:50:44.1713309Z 199 │ │ const id = ++connection.nextRequestId; 2026-10-24T18:50:44.1713434Z 200 │ │ const payloads = yield* send(connection, { 2026-10-24T18:50:44.1713530Z 201 │ │ jsonrpc: "2.0", 2026-10-24T18:50:44.1713611Z 202 │ │ id, 2026-10-24T18:50:44.1713712Z 203 │ │ method: request.method, 2026-10-24T18:50:44.1713868Z 204 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-24T18:50:44.1713944Z 205 │ │ }); 2026-10-24T18:50:44.1714183Z 206 │ │ const response = payloads.find((payload) => asEnvelope(payload)?.id === id); 2026-10-24T18:50:44.1714334Z 207 │ │ const envelope = asEnvelope(response); 2026-10-24T18:50:44.1714434Z 208 │ │ if (envelope === null) { 2026-10-24T18:50:44.1714540Z 209 │ │ return yield* Effect.fail( 2026-10-24T18:50:44.1714724Z 210 │ │ new AcpMcpOverAcpError("MCP server did not return a matching response."), 2026-10-24T18:50:44.1714800Z 211 │ │ ); 2026-10-24T18:50:44.1714875Z 212 │ │ } 2026-10-24T18:50:44.1714990Z 213 │ │ if (envelope.error !== undefined) { 2026-10-24T18:50:44.1715187Z 214 │ │ return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error))); 2026-10-24T18:50:44.1715260Z 215 │ │ } 2026-10-24T18:50:44.1715429Z 216 │ │ return (envelope.result ?? null) as AcpSchema.MessageMcpResponse; 2026-10-24T18:50:44.1715504Z 217 │ │ }), 2026-10-24T18:50:44.1715693Z 218 │ │ notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) { 2026-10-24T18:50:44.1715852Z 219 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T18:50:44.1715956Z 220 │ │ yield* send(connection, { 2026-10-24T18:50:44.1716049Z 221 │ │ jsonrpc: "2.0", 2026-10-24T18:50:44.1716150Z 222 │ │ method: request.method, 2026-10-24T18:50:44.1716309Z 223 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-24T18:50:44.1716387Z 224 │ │ }); 2026-10-24T18:50:44.1716461Z 225 │ │ }), 2026-10-24T18:50:44.1716545Z 226 │ │ disconnect, 2026-10-24T18:50:44.1716650Z 227 │ │ dispose: Effect.suspend(() => 2026-10-24T18:50:44.1716744Z 228 │ │ Effect.forEach( 2026-10-24T18:50:44.1716846Z 229 │ │ [...connections.keys()], 2026-10-24T18:50:44.1717014Z 230 │ │ (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore), 2026-10-24T18:50:44.1717114Z 231 │ │ { discard: true }, 2026-10-24T18:50:44.1717188Z 232 │ │ ), 2026-10-24T18:50:44.1717261Z 233 │ │ ), 2026-10-24T18:50:44.1717338Z 234 │ │ }; 2026-10-24T18:50:44.1717465Z 235 │ ╰─▶ }); 2026-10-24T18:50:44.1717518Z ╰──── 2026-10-24T18:50:44.1717766Z  help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed. 2026-10-24T18:50:44.1717768Z 2026-10-24T18:50:44.1718034Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-24T18:50:44.1718152Z ╭─[apps/server/src/usage/UsageService.ts:169:7] 2026-10-24T18:50:44.1718203Z 168 │ 2026-10-24T18:50:44.1718281Z 169 │ const layerTest = Layer.succeed( 2026-10-24T18:50:44.1718354Z ·  ────┬──── 2026-10-24T18:50:44.1718538Z · ╰── 'layerTest' is declared here 2026-10-24T18:50:44.1718633Z 170 │ UsageService, 2026-10-24T18:50:44.1718683Z ╰──── 2026-10-24T18:50:44.1718816Z  help: Consider removing this declaration. 2026-10-24T18:50:44.1718818Z 2026-10-24T18:50:44.1719019Z ⚠ eslint(no-unused-vars): Function 'nonEmptyString' is declared but never used. 2026-10-24T18:50:44.1719163Z ╭─[packages/client-runtime/src/work-log/presentation.ts:237:10] 2026-10-24T18:50:44.1719215Z 236 │ 2026-10-24T18:50:44.1719328Z 237 │ function nonEmptyString(value: unknown): string | null { 2026-10-24T18:50:44.1719412Z ·  ───────┬────── 2026-10-24T18:50:44.1719554Z · ╰── 'nonEmptyString' is declared here 2026-10-24T18:50:44.1719695Z 238 │ return typeof value === "string" && value.trim().length > 0 ? value : null; 2026-10-24T18:50:44.1719750Z ╰──── 2026-10-24T18:50:44.1719855Z  help: Consider removing this declaration. 2026-10-24T18:50:44.1719857Z 2026-10-24T18:50:44.1720316Z ⚠ 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-24T18:50:44.1720470Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1680:7] 2026-10-24T18:50:44.1720562Z 1679 │ yield* harness.replaceSession; 2026-10-24T18:50:44.1720768Z 1680 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T18:50:44.1720920Z 1681 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) { 2026-10-24T18:50:44.1721009Z 1682 │ │ break; 2026-10-24T18:50:44.1721088Z 1683 │ │ } 2026-10-24T18:50:44.1721193Z 1684 │ │ yield* Effect.yieldNow; 2026-10-24T18:50:44.1721326Z 1685 │ ╰─▶ } 2026-10-24T18:50:44.1721397Z 1686 │ yield* Queue.offer( 2026-10-24T18:50:44.1721449Z ╰──── 2026-10-24T18:50:44.1721451Z 2026-10-24T18:50:44.1721902Z ⚠ 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-24T18:50:44.1722052Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1789:7] 2026-10-24T18:50:44.1722139Z 1788 │ yield* harness.replaceSession; 2026-10-24T18:50:44.1722347Z 1789 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T18:50:44.1722511Z 1790 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break; 2026-10-24T18:50:44.1722615Z 1791 │ │ yield* Effect.yieldNow; 2026-10-24T18:50:44.1722745Z 1792 │ ╰─▶ } 2026-10-24T18:50:44.1722872Z 1793 │ expect(yield* Ref.get(harness.subscriptionCount)).toBe(2); 2026-10-24T18:50:44.1722923Z ╰──── 2026-10-24T18:50:44.1722926Z 2026-10-24T18:50:44.1723123Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T18:50:44.1723252Z ╭─[packages/client-runtime/src/state/filesystem.ts:3:8] 2026-10-24T18:50:44.1723370Z 2 │ AuthFilesystemReadScope, 2026-10-24T18:50:44.1723473Z 3 │ type AuthSessionState, 2026-10-24T18:50:44.1723555Z ·  ────────┬─────── 2026-10-24T18:50:44.1723696Z · ╰── 'AuthSessionState' is imported here 2026-10-24T18:50:44.1723768Z 4 │ type FilesystemBrowseEntry, 2026-10-24T18:50:44.1723821Z ╰──── 2026-10-24T18:50:44.1723919Z  help: Consider removing this import. 2026-10-24T18:50:44.1723922Z 2026-10-24T18:50:44.1724371Z ⚠ 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-24T18:50:44.1724515Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:169:7] 2026-10-24T18:50:44.1724581Z 168 │ }); 2026-10-24T18:50:44.1724776Z 169 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T18:50:44.1724963Z 170 │ │ if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break; 2026-10-24T18:50:44.1725064Z 171 │ │ yield* Effect.yieldNow; 2026-10-24T18:50:44.1725195Z 172 │ ╰─▶ } 2026-10-24T18:50:44.1725248Z 173 │ 2026-10-24T18:50:44.1725298Z ╰──── 2026-10-24T18:50:44.1725300Z 2026-10-24T18:50:44.1725748Z ⚠ 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-24T18:50:44.1725896Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:178:7] 2026-10-24T18:50:44.1726004Z 177 │ yield* Deferred.succeed(releaseSave, undefined); 2026-10-24T18:50:44.1726192Z 178 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T18:50:44.1726323Z 179 │ │ if ((yield* Ref.get(saved)).length > 0) break; 2026-10-24T18:50:44.1726423Z 180 │ │ yield* Effect.yieldNow; 2026-10-24T18:50:44.1726550Z 181 │ ╰─▶ } 2026-10-24T18:50:44.1726611Z 182 │ 2026-10-24T18:50:44.1726661Z ╰──── 2026-10-24T18:50:44.1726663Z 2026-10-24T18:50:44.1727112Z ⚠ 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-24T18:50:44.1727257Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7] 2026-10-24T18:50:44.1727381Z 306 │ yield* Deferred.succeed(releaseUnenrichedSave, undefined); 2026-10-24T18:50:44.1727568Z 307 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T18:50:44.1727684Z 308 │ │ const values = yield* Ref.get(saved); 2026-10-24T18:50:44.1727873Z 309 │ │ if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) { 2026-10-24T18:50:44.1727959Z 310 │ │ break; 2026-10-24T18:50:44.1728035Z 311 │ │ } 2026-10-24T18:50:44.1728183Z 312 │ │ yield* Effect.yieldNow; 2026-10-24T18:50:44.1728340Z 313 │ ╰─▶ } 2026-10-24T18:50:44.1728395Z 314 │ 2026-10-24T18:50:44.1728444Z ╰──── 2026-10-24T18:50:44.1728447Z 2026-10-24T18:50:44.1728915Z ⚠ 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-24T18:50:44.1729042Z ╭─[apps/server/src/usage/UsageService.test.ts:2615:7] 2026-10-24T18:50:44.1729136Z 2614 │ let orphanedAt: number | undefined; 2026-10-24T18:50:44.1729360Z 2615 │ ╭─▶ for (let interruptAt = 1; interruptAt <= 31; interruptAt += 1) { 2026-10-24T18:50:44.1729483Z 2616 │ │ const tasks: Array<() => void> = []; 2026-10-24T18:50:44.1729632Z 2617 │ │ const dispatcher: Scheduler.SchedulerDispatcher = { 2026-10-24T18:50:44.1729762Z 2618 │ │ scheduleTask: (task) => tasks.push(task), 2026-10-24T18:50:44.1729860Z 2619 │ │ flush: () => { 2026-10-24T18:50:44.1729981Z 2620 │ │ let task: (() => void) | undefined; 2026-10-24T18:50:44.1730123Z 2621 │ │ while ((task = tasks.shift()) !== undefined) task(); 2026-10-24T18:50:44.1730203Z 2622 │ │ }, 2026-10-24T18:50:44.1730281Z 2623 │ │ }; 2026-10-24T18:50:44.1730350Z 2624 │ │ 2026-10-24T18:50:44.1730511Z 2625 │ │ let requestFiber: Fiber.Fiber | undefined; 2026-10-24T18:50:44.1730616Z 2626 │ │ let requestChecks = 0; 2026-10-24T18:50:44.1730743Z 2627 │ │ const scheduler: Scheduler.Scheduler = { 2026-10-24T18:50:44.1730851Z 2628 │ │ executionMode: "async", 2026-10-24T18:50:44.1730968Z 2629 │ │ makeDispatcher: () => dispatcher, 2026-10-24T18:50:44.1731077Z 2630 │ │ shouldYield: (fiber) => { 2026-10-24T18:50:44.1731251Z 2631 │ │ if (fiber !== requestFiber) return false; 2026-10-24T18:50:44.1731353Z 2632 │ │ requestChecks += 1; 2026-10-24T18:50:44.1731496Z 2633 │ │ if (requestChecks !== interruptAt) return false; 2026-10-24T18:50:44.1731613Z 2634 │ │ fiber.interruptUnsafe(); 2026-10-24T18:50:44.1731712Z 2635 │ │ return true; 2026-10-24T18:50:44.1731791Z 2636 │ │ }, 2026-10-24T18:50:44.1731869Z 2637 │ │ }; 2026-10-24T18:50:44.1731936Z 2638 │ │ 2026-10-24T18:50:44.1732055Z 2639 │ │ const input: UsageSummaryInput = { 2026-10-24T18:50:44.1732147Z 2640 │ │ ...WINDOW, 2026-10-24T18:50:44.1732273Z 2641 │ │ sinceDay: UsageDay.make("2026-09-01"), 2026-10-24T18:50:44.1732462Z 2642 │ │ untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`), 2026-10-24T18:50:44.1732539Z 2643 │ │ }; 2026-10-24T18:50:44.1732714Z 2644 │ │ const first = yield* service 2026-10-24T18:50:44.1732854Z 2645 │ │ .readSummary(input) 2026-10-24T18:50:44.1732938Z 2646 │ │ .pipe( 2026-10-24T18:50:44.1733033Z 2647 │ │ Effect.exit, 2026-10-24T18:50:44.1733188Z 2648 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-24T18:50:44.1733289Z 2649 │ │ Effect.forkChild, 2026-10-24T18:50:44.1733366Z 2650 │ │ ); 2026-10-24T18:50:44.1733467Z 2651 │ │ requestFiber = first; 2026-10-24T18:50:44.1733568Z 2652 │ │ yield* Effect.yieldNow; 2026-10-24T18:50:44.1733671Z 2653 │ │ dispatcher.flush(); 2026-10-24T18:50:44.1733739Z 2654 │ │ 2026-10-24T18:50:44.1733892Z 2655 │ │ const second = yield* service.readSummary(input).pipe( 2026-10-24T18:50:44.1733990Z 2656 │ │ Effect.match({ 2026-10-24T18:50:44.1734113Z 2657 │ │ onFailure: (error) => error.reason, 2026-10-24T18:50:44.1734236Z 2658 │ │ onSuccess: () => "success" as const, 2026-10-24T18:50:44.1734319Z 2659 │ │ }), 2026-10-24T18:50:44.1734473Z 2660 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-24T18:50:44.1734573Z 2661 │ │ Effect.forkChild, 2026-10-24T18:50:44.1734649Z 2662 │ │ ); 2026-10-24T18:50:44.1734752Z 2663 │ │ yield* Effect.yieldNow; 2026-10-24T18:50:44.1734858Z 2664 │ │ dispatcher.flush(); 2026-10-24T18:50:44.1734983Z 2665 │ │ const secondExit = second.pollUnsafe(); 2026-10-24T18:50:44.1735096Z 2666 │ │ if (secondExit === undefined) { 2026-10-24T18:50:44.1735209Z 2667 │ │ second.interruptUnsafe(); 2026-10-24T18:50:44.1735317Z 2668 │ │ orphanedAt = interruptAt; 2026-10-24T18:50:44.1735404Z 2669 │ │ break; 2026-10-24T18:50:44.1735482Z 2670 │ │ } 2026-10-24T18:50:44.1735600Z 2671 │ │ if (Exit.isFailure(secondExit)) { 2026-10-24T18:50:44.1735756Z 2672 │ │ assert.fail("the matching request fiber was interrupted"); 2026-10-24T18:50:44.1735832Z 2673 │ │ } 2026-10-24T18:50:44.1735985Z 2674 │ │ assert.strictEqual(secondExit.value, "invalidWindow"); 2026-10-24T18:50:44.1736120Z 2675 │ ╰─▶ } 2026-10-24T18:50:44.1736175Z 2676 │ 2026-10-24T18:50:44.1736231Z ╰──── 2026-10-24T18:50:44.1736234Z 2026-10-24T18:50:44.1736420Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T18:50:44.1736574Z ╭─[apps/mobile/src/features/threads/ThreadQueueControl.tsx:602:27] 2026-10-24T18:50:44.1736739Z 601 │ const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success)); 2026-10-24T18:50:44.1736815Z 602 │ const gesture = Gesture.Pan() 2026-10-24T18:50:44.1736899Z ·  ─┬─ 2026-10-24T18:50:44.1737086Z · ╰── `Pan` may be a component 2026-10-24T18:50:44.1737190Z 603 │ .enabled(!props.disabled) 2026-10-24T18:50:44.1737242Z ╰──── 2026-10-24T18:50:44.1737514Z  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-24T18:50:44.1737952Z  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-24T18:50:44.1737955Z 2026-10-24T18:50:44.1738145Z ⚠ eslint(no-unused-vars): Identifier 'Arr' is imported but never used. 2026-10-24T18:50:44.1738275Z ╭─[packages/client-runtime/src/state/threadSort.ts:4:13] 2026-10-24T18:50:44.1738390Z 3 │ import type { EnvironmentThreadShell } from "./models.ts"; 2026-10-24T18:50:44.1738472Z 4 │ import * as Arr from "effect/Array"; 2026-10-24T18:50:44.1738545Z ·  ─┬─ 2026-10-24T18:50:44.1738666Z · ╰── 'Arr' is imported here 2026-10-24T18:50:44.1738757Z 5 │ import * as Order from "effect/Order"; 2026-10-24T18:50:44.1738807Z ╰──── 2026-10-24T18:50:44.1738933Z  help: Consider removing this import. 2026-10-24T18:50:44.1738936Z 2026-10-24T18:50:44.1739126Z ⚠ eslint(no-unused-vars): Identifier 'Order' is imported but never used. 2026-10-24T18:50:44.1739253Z ╭─[packages/client-runtime/src/state/threadSort.ts:5:13] 2026-10-24T18:50:44.1739329Z 4 │ import * as Arr from "effect/Array"; 2026-10-24T18:50:44.1739408Z 5 │ import * as Order from "effect/Order"; 2026-10-24T18:50:44.1739482Z ·  ──┬── 2026-10-24T18:50:44.1739615Z · ╰── 'Order' is imported here 2026-10-24T18:50:44.1739668Z 6 │ 2026-10-24T18:50:44.1739718Z ╰──── 2026-10-24T18:50:44.1739813Z  help: Consider removing this import. 2026-10-24T18:50:44.1739815Z 2026-10-24T18:50:44.1740074Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-24T18:50:44.1740201Z ╭─[apps/server/src/telemetry/AnalyticsService.ts:340:7] 2026-10-24T18:50:44.1740253Z 339 │ 2026-10-24T18:50:44.1740354Z 340 │ const layerTest = AnalyticsService.layerTest; 2026-10-24T18:50:44.1740428Z ·  ────┬──── 2026-10-24T18:50:44.1740556Z · ╰── 'layerTest' is declared here 2026-10-24T18:50:44.1740607Z ╰──── 2026-10-24T18:50:44.1740762Z  help: Consider removing this declaration. 2026-10-24T18:50:44.1740799Z 2026-10-24T18:50:44.1740997Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T18:50:44.1741122Z ╭─[packages/client-runtime/src/state/usageAccess.ts:3:8] 2026-10-24T18:50:44.1741195Z 2 │ AuthDiagnosticsReadScope, 2026-10-24T18:50:44.1741264Z 3 │ type AuthSessionState, 2026-10-24T18:50:44.1741345Z ·  ────────┬─────── 2026-10-24T18:50:44.1741488Z · ╰── 'AuthSessionState' is imported here 2026-10-24T18:50:44.1741555Z 4 │ sessionGrantsScope, 2026-10-24T18:50:44.1741606Z ╰──── 2026-10-24T18:50:44.1741700Z  help: Consider removing this import. 2026-10-24T18:50:44.1741702Z 2026-10-24T18:50:44.1741898Z ⚠ eslint(no-unused-vars): Type 'EnvironmentId' is imported but never used. 2026-10-24T18:50:44.1742036Z ╭─[packages/client-runtime/src/state/sharedSettings.ts:2:3] 2026-10-24T18:50:44.1742098Z 1 │ import type { 2026-10-24T18:50:44.1742162Z 2 │ EnvironmentId, 2026-10-24T18:50:44.1742233Z ·  ──────┬────── 2026-10-24T18:50:44.1742367Z · ╰── 'EnvironmentId' is imported here 2026-10-24T18:50:44.1742449Z 3 │ ExecutionEnvironmentCapabilities, 2026-10-24T18:50:44.1742500Z ╰──── 2026-10-24T18:50:44.1742592Z  help: Consider removing this import. 2026-10-24T18:50:44.1742594Z 2026-10-24T18:50:44.1742843Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T18:50:44.1742964Z ╭─[apps/server/src/serverRuntimeStartup.ts:728:7] 2026-10-24T18:50:44.1743023Z 727 │ 2026-10-24T18:50:44.1743101Z 728 │ const layer = layerWithOptions(); 2026-10-24T18:50:44.1743171Z ·  ──┬── 2026-10-24T18:50:44.1743294Z · ╰── 'layer' is declared here 2026-10-24T18:50:44.1743345Z ╰──── 2026-10-24T18:50:44.1743445Z  help: Consider removing this declaration. 2026-10-24T18:50:44.1743447Z 2026-10-24T18:50:44.1743859Z ⚠ 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-24T18:50:44.1744007Z ╭─[apps/server/src/provider/acp/AntigravityProtocol.ts:263:20] 2026-10-24T18:50:44.1744089Z 262 │ ...(update._meta !== undefined 2026-10-24T18:50:44.1744259Z 263 │ ? { _meta: Schema.is(Schema.Record(Schema.String, Schema.Json))(meta) ? meta : null } 2026-10-24T18:50:44.1744344Z ·  ───────── 2026-10-24T18:50:44.1744405Z 264 │ : {}), 2026-10-24T18:50:44.1744456Z ╰──── 2026-10-24T18:50:44.1744458Z 2026-10-24T18:50:44.1744692Z ⚠ unicorn(prefer-string-starts-ends-with): Prefer String#startsWith over a regex with a caret. 2026-10-24T18:50:44.1744812Z ╭─[apps/server/src/vcs/GitVcsDriverCore.ts:517:11] 2026-10-24T18:50:44.1744912Z 516 │ GIT_DIAGNOSTIC_LINE_PATTERN.test(line) || 2026-10-24T18:50:44.1745045Z 517 │ (!/^remote:/.test(line) && SSH_TRANSPORT_REFUSAL_PATTERN.test(line)), 2026-10-24T18:50:44.1745129Z ·  ─────────────── 2026-10-24T18:50:44.1745182Z 518 │ ) 2026-10-24T18:50:44.1745232Z ╰──── 2026-10-24T18:50:44.1745435Z  help: Replace `/^remote:/.test(line)` with `line.startsWith('remote:')`. 2026-10-24T18:50:44.1745470Z 2026-10-24T18:50:44.1745818Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeEffect(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const. 2026-10-24T18:50:44.1745950Z ╭─[apps/server/src/vcs/GitVcsDriverCore.test.ts:1786:34] 2026-10-24T18:50:44.1746080Z 1785 │ const stat = branch.files!.find((file) => file.path === path)!; 2026-10-24T18:50:44.1746228Z 1786 │ const request = yield* Schema.decodeEffect(ReviewDiffPreviewInput)({ 2026-10-24T18:50:44.1746343Z ·  ─────────────────── 2026-10-24T18:50:44.1746404Z 1787 │ cwd, 2026-10-24T18:50:44.1746455Z ╰──── 2026-10-24T18:50:44.1746457Z 2026-10-24T18:50:44.1746627Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T18:50:44.1746762Z ╭─[apps/web/src/components/CustomSnoozeDialog.tsx:140:58] 2026-10-24T18:50:44.1746894Z 139 │ {...(weekStartsOn === undefined ? {} : { weekStartsOn })} 2026-10-24T18:50:44.1747038Z 140 │ disabled={{ before: new Date(new Date().setHours(0, 0, 0, 0)) }} 2026-10-24T18:50:44.1747159Z ·  ─────┬──── 2026-10-24T18:50:44.1747327Z · ╰── Cannot call impure function 2026-10-24T18:50:44.1747424Z 141 │ onSelect={(selected) => { 2026-10-24T18:50:44.1747473Z ╰──── 2026-10-24T18:50:44.1747752Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T18:50:44.1748045Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T18:50:44.1748047Z 2026-10-24T18:50:44.1748270Z ⚠ eslint(no-unused-vars): Function 'resolveThreadWorkspaceCwd' is declared but never used. 2026-10-24T18:50:44.1748385Z ╭─[apps/server/src/checkpointing/Utils.ts:12:10] 2026-10-24T18:50:44.1748437Z 11 │ 2026-10-24T18:50:44.1748535Z 12 │ function resolveThreadWorkspaceCwd(input: { 2026-10-24T18:50:44.1748634Z ·  ────────────┬──────────── 2026-10-24T18:50:44.1748827Z · ╰── 'resolveThreadWorkspaceCwd' is declared here 2026-10-24T18:50:44.1748899Z 13 │ readonly thread: { 2026-10-24T18:50:44.1748955Z ╰──── 2026-10-24T18:50:44.1749059Z  help: Consider removing this declaration. 2026-10-24T18:50:44.1749062Z 2026-10-24T18:50:44.1749316Z ⚠ unicorn(prefer-add-event-listener): Prefer `addEventListener()` over their `on`-function counterparts. 2026-10-24T18:50:44.1749457Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:12:14] 2026-10-24T18:50:44.1749610Z 11 │ addEventListener(_type: string, listener: (event: { data: string }) => void) { 2026-10-24T18:50:44.1749690Z 12 │ this.onmessage = listener; 2026-10-24T18:50:44.1749768Z ·  ───────── 2026-10-24T18:50:44.1749822Z 13 │ } 2026-10-24T18:50:44.1749874Z ╰──── 2026-10-24T18:50:44.1750233Z  help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on` replaces any previously registered handler. 2026-10-24T18:50:44.1750266Z 2026-10-24T18:50:44.1750464Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-24T18:50:44.1750601Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:16:9] 2026-10-24T18:50:44.1750665Z 15 │ constructor() { 2026-10-24T18:50:44.1750730Z 16 │ source = this; 2026-10-24T18:50:44.1750799Z ·  ────── 2026-10-24T18:50:44.1750852Z 17 │ } 2026-10-24T18:50:44.1750902Z ╰──── 2026-10-24T18:50:44.1751168Z  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-24T18:50:44.1751171Z 2026-10-24T18:50:44.1751453Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T18:50:44.1751618Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:473:19] 2026-10-24T18:50:44.1751680Z 472 │ onFilters, 2026-10-24T18:50:44.1751747Z 473 │ authorOptions = [], 2026-10-24T18:50:44.1751822Z ·  ── 2026-10-24T18:50:44.1751886Z 474 │ labelOptions = [], 2026-10-24T18:50:44.1751936Z ╰──── 2026-10-24T18:50:44.1752248Z  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-24T18:50:44.1752251Z 2026-10-24T18:50:44.1752525Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T18:50:44.1752691Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:474:18] 2026-10-24T18:50:44.1752758Z 473 │ authorOptions = [], 2026-10-24T18:50:44.1752820Z 474 │ labelOptions = [], 2026-10-24T18:50:44.1752896Z ·  ── 2026-10-24T18:50:44.1752957Z 475 │ optionScope, 2026-10-24T18:50:44.1753008Z ╰──── 2026-10-24T18:50:44.1753316Z  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-24T18:50:44.1753318Z 2026-10-24T18:50:44.1753482Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T18:50:44.1753599Z ╭─[apps/web/src/components/Sidebar.tsx:1136:11] 2026-10-24T18:50:44.1753696Z 1135 │ foldSearchQuery(threadSearchQuery), 2026-10-24T18:50:44.1753763Z 1136 │ Date.now(), 2026-10-24T18:50:44.1753848Z ·  ─────┬──── 2026-10-24T18:50:44.1753984Z · ╰── Cannot call impure function 2026-10-24T18:50:44.1754122Z 1137 │ // A list filter, as on mobile: a pick would move rows unexplained. 2026-10-24T18:50:44.1754173Z ╰──── 2026-10-24T18:50:44.1754451Z  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-24T18:50:44.1754739Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T18:50:44.1754741Z 2026-10-24T18:50:44.1755234Z ⚠ 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-24T18:50:44.1755398Z ╭─[packages/contracts/src/composerContext.test.ts:181:18] 2026-10-24T18:50:44.1755531Z 180 │ it("sends a message without the records the wire cannot carry", () => { 2026-10-24T18:50:44.1755711Z 181 │ const wire = Schema.encodeUnknownSync(Schema.toCodecJson(OrchestrationMessageContext))({ 2026-10-24T18:50:44.1755816Z ·  ──────────────────────── 2026-10-24T18:50:44.1755878Z 182 │ version: 1, 2026-10-24T18:50:44.1755928Z ╰──── 2026-10-24T18:50:44.1755931Z 2026-10-24T18:50:44.1756286Z ⚠ 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-24T18:50:44.1756400Z ╭─[packages/contracts/src/auth.test.ts:17:12] 2026-10-24T18:50:44.1756558Z 16 │ it("decodes legacy review credentials without offering them in new grants", () => { 2026-10-24T18:50:44.1756727Z 17 │ expect(Schema.decodeUnknownSync(AuthEnvironmentScopes)(["review:write"])).toEqual([ 2026-10-24T18:50:44.1756827Z ·  ──────────────────────── 2026-10-24T18:50:44.1756891Z 18 │ "review:write", 2026-10-24T18:50:44.1756940Z ╰──── 2026-10-24T18:50:44.1756942Z 2026-10-24T18:50:44.1757294Z ⚠ 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-24T18:50:44.1757409Z ╭─[packages/contracts/src/auth.test.ts:20:18] 2026-10-24T18:50:44.1757465Z 19 │ ]); 2026-10-24T18:50:44.1757628Z 20 │ expect(() => Schema.decodeUnknownSync(AuthGrantScopes)(["review:write"])).toThrow(); 2026-10-24T18:50:44.1757735Z ·  ──────────────────────── 2026-10-24T18:50:44.1757864Z 21 │ expect(AuthStandardClientScopes).not.toContain("review:write"); 2026-10-24T18:50:44.1757914Z ╰──── 2026-10-24T18:50:44.1757916Z 2026-10-24T18:50:44.1758270Z ⚠ 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-24T18:50:44.1758376Z ╭─[packages/contracts/src/auth.test.ts:58:21] 2026-10-24T18:50:44.1758543Z 57 │ it("ignores unknown response permissions without falling back to broader scopes", () => { 2026-10-24T18:50:44.1758666Z 58 │ const session = Schema.decodeUnknownSync(AuthSessionState)({ 2026-10-24T18:50:44.1758799Z ·  ──────────────────────── 2026-10-24T18:50:44.1758919Z 59 │ authenticated: true, 2026-10-24T18:50:44.1758997Z ╰──── 2026-10-24T18:50:44.1759000Z 2026-10-24T18:50:44.1759199Z ⚠ typescript(no-extraneous-class): Unexpected class with only a constructor. 2026-10-24T18:50:44.1759321Z ╭─[apps/desktop/src/preview/Manager.test.ts:158:18] 2026-10-24T18:50:44.1759419Z 157 │ BrowserWindow: browserWindowConstructor, 2026-10-24T18:50:44.1759578Z 158 │ ╭─▶ ClipboardItem: class { 2026-10-24T18:50:44.1759707Z 159 │ │ constructor(data: Record) { 2026-10-24T18:50:44.1759821Z 160 │ │ clipboardItemConstructor(data); 2026-10-24T18:50:44.1759893Z 161 │ │ } 2026-10-24T18:50:44.1760025Z 162 │ ╰─▶ }, 2026-10-24T18:50:44.1760093Z 163 │ clipboard: { 2026-10-24T18:50:44.1760144Z ╰──── 2026-10-24T18:50:44.1760312Z  help: Try replacing this class with a standalone function or deleting it entirely 2026-10-24T18:50:44.1760314Z 2026-10-24T18:50:44.1760513Z ⚠ eslint(no-unused-vars): Identifier 'identity' is imported but never used. 2026-10-24T18:50:44.1760615Z ╭─[apps/server/src/auth/http.ts:28:10] 2026-10-24T18:50:44.1760702Z 27 │ import * as Schema from "effect/Schema"; 2026-10-24T18:50:44.1760790Z 28 │ import { identity } from "effect/Function"; 2026-10-24T18:50:44.1760865Z ·  ────┬─── 2026-10-24T18:50:44.1761000Z · ╰── 'identity' is imported here 2026-10-24T18:50:44.1761081Z 29 │ import * as Layer from "effect/Layer"; 2026-10-24T18:50:44.1761137Z ╰──── 2026-10-24T18:50:44.1761234Z  help: Consider removing this import. 2026-10-24T18:50:44.1761236Z 2026-10-24T18:50:44.1761589Z ⚠ 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-24T18:50:44.1761711Z ╭─[apps/server/src/auth/RpcAuthorization.ts:237:17] 2026-10-24T18:50:44.1761844Z 236 │ const requiredScopesForSettingsUpdate = (payload: unknown) => { 2026-10-24T18:50:44.1761973Z 237 │ const input = Schema.decodeUnknownSync(SettingsUpdate)(payload); 2026-10-24T18:50:44.1762078Z ·  ──────────────────────── 2026-10-24T18:50:44.1762212Z 238 │ const scopes = requiredScopesForServerSettingsPatch(input.patch); 2026-10-24T18:50:44.1762263Z ╰──── 2026-10-24T18:50:44.1762266Z 2026-10-24T18:50:44.1762620Z ⚠ 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-24T18:50:44.1762741Z ╭─[apps/server/src/auth/RpcAuthorization.ts:256:26] 2026-10-24T18:50:44.1762836Z 255 │ if (method === WS_METHODS.assetsCreateUrl) { 2026-10-24T18:50:44.1762991Z 256 │ const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload); 2026-10-24T18:50:44.1763100Z ·  ──────────────────────── 2026-10-24T18:50:44.1763160Z 257 │ return [ 2026-10-24T18:50:44.1763211Z ╰──── 2026-10-24T18:50:44.1763214Z 2026-10-24T18:50:44.1763469Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T18:50:44.1763640Z ╭─[apps/mobile/src/state/use-vcs-action-state.ts:86:5] 2026-10-24T18:50:44.1763806Z 83 │ const [nowMs, setNowMs] = useState(() => Date.now()); 2026-10-24T18:50:44.1763871Z 84 │ useEffect(() => { 2026-10-24T18:50:44.1763941Z ·  ────┬──── 2026-10-24T18:50:44.1764068Z · ╰── This is the containing effect 2026-10-24T18:50:44.1764160Z 85 │ if (!actionState.isRunning) return; 2026-10-24T18:50:44.1764226Z 86 │ setNowMs(Date.now()); 2026-10-24T18:50:44.1764294Z ·  ────┬─── 2026-10-24T18:50:44.1764456Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1764579Z 87 │ const interval = setInterval(() => setNowMs(Date.now()), 1000); 2026-10-24T18:50:44.1764634Z ╰──── 2026-10-24T18:50:44.1765231Z  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-24T18:50:44.1765550Z  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-24T18:50:44.1765553Z 2026-10-24T18:50:44.1765755Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-24T18:50:44.1765860Z ╭─[packages/contracts/src/rpc.ts:297:8] 2026-10-24T18:50:44.1765926Z 296 │ } from "./device.ts"; 2026-10-24T18:50:44.1766020Z 297 │ import {} from "./previewAutomation.ts"; 2026-10-24T18:50:44.1766087Z ·  ── 2026-10-24T18:50:44.1766150Z 298 │ import { 2026-10-24T18:50:44.1766203Z ╰──── 2026-10-24T18:50:44.1766282Z  help: Remove empty braces 2026-10-24T18:50:44.1766285Z 2026-10-24T18:50:44.1766727Z ⚠ 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-24T18:50:44.1766850Z ╭─[packages/contracts/src/baseSchemas.test.ts:39:9] 2026-10-24T18:50:44.1766916Z 38 │ JSON.stringify( 2026-10-24T18:50:44.1767033Z 39 │ Schema.encodeUnknownSync(Schema.toCodecJson(Named))([ 2026-10-24T18:50:44.1767128Z ·  ──────────────────────── 2026-10-24T18:50:44.1767194Z 40 │ { name: "a" }, 2026-10-24T18:50:44.1767246Z ╰──── 2026-10-24T18:50:44.1767248Z 2026-10-24T18:50:44.1767418Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T18:50:44.1767564Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:372:47] 2026-10-24T18:50:44.1767692Z 371 │ const { open, onOpenChange, onSnooze, timestampFormat } = props; 2026-10-24T18:50:44.1767845Z 372 │ const presets = open ? resolveSnoozePresets(new Date(), timestampFormat) : []; 2026-10-24T18:50:44.1767956Z ·  ─────┬──── 2026-10-24T18:50:44.1768117Z · ╰── Cannot call impure function 2026-10-24T18:50:44.1768175Z 373 │ return ( 2026-10-24T18:50:44.1768226Z ╰──── 2026-10-24T18:50:44.1768654Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T18:50:44.1769012Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T18:50:44.1769014Z 2026-10-24T18:50:44.1769176Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T18:50:44.1769320Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:853:39] 2026-10-24T18:50:44.1769411Z 852 │ if (snoozeGateClock.thread !== thread) { 2026-10-24T18:50:44.1769537Z 853 │ setSnoozeGateClock({ thread, now: new Date().toISOString() }); 2026-10-24T18:50:44.1769641Z ·  ─────┬──── 2026-10-24T18:50:44.1769794Z · ╰── Cannot call impure function 2026-10-24T18:50:44.1769855Z 854 │ } 2026-10-24T18:50:44.1769908Z ╰──── 2026-10-24T18:50:44.1770173Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T18:50:44.1770459Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T18:50:44.1770461Z 2026-10-24T18:50:44.1770651Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T18:50:44.1770813Z ╭─[apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx:818:17] 2026-10-24T18:50:44.1770876Z 817 │
label.name.trim().toLowerCase()); 2026-10-24T18:50:44.1782713Z ·  ───────────────────────────────────────────────────────────────────── 2026-10-24T18:50:44.1782856Z 263 │ const holds = (label: string) => labels.includes(label.trim().toLowerCase()); 2026-10-24T18:50:44.1782907Z ╰──── 2026-10-24T18:50:44.1782982Z  help: Switch to `Set` 2026-10-24T18:50:44.1782984Z 2026-10-24T18:50:44.1783209Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T18:50:44.1783334Z ╭─[apps/server/src/terminal/Manager.test.ts:731:31] 2026-10-24T18:50:44.1783389Z 730 │ ); 2026-10-24T18:50:44.1783561Z 731 │ const snapshot = events.filter((event) => event.type === "snapshot").at(-1)?.snapshot; 2026-10-24T18:50:44.1783656Z ·  ────── 2026-10-24T18:50:44.1783771Z 732 │ expect(snapshot?.history).toBe("aa😀\rEND"); 2026-10-24T18:50:44.1783821Z ╰──── 2026-10-24T18:50:44.1783987Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T18:50:44.1783990Z 2026-10-24T18:50:44.1784188Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T18:50:44.1784357Z ╭─[apps/web/src/components/settings/ProviderSettingsPanel.logic.ts:4:8] 2026-10-24T18:50:44.1784431Z 3 │ AuthProvidersManageScope, 2026-10-24T18:50:44.1784501Z 4 │ type AuthSessionState, 2026-10-24T18:50:44.1784583Z ·  ────────┬─────── 2026-10-24T18:50:44.1784726Z · ╰── 'AuthSessionState' is imported here 2026-10-24T18:50:44.1784791Z 5 │ type EnvironmentId, 2026-10-24T18:50:44.1784841Z ╰──── 2026-10-24T18:50:44.1784937Z  help: Consider removing this import. 2026-10-24T18:50:44.1784940Z 2026-10-24T18:50:44.1785156Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T18:50:44.1785281Z ╭─[scripts/lib/cli-external-packages.test.ts:114:11] 2026-10-24T18:50:44.1785354Z 113 │ const declared = { 2026-10-24T18:50:44.1785446Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-24T18:50:44.1785554Z ·  ──────────────────────────────── 2026-10-24T18:50:44.1785657Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T18:50:44.1785708Z ╰──── 2026-10-24T18:50:44.1785970Z  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-24T18:50:44.1785973Z 2026-10-24T18:50:44.1786187Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T18:50:44.1786309Z ╭─[scripts/lib/cli-external-packages.test.ts:115:11] 2026-10-24T18:50:44.1786398Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-24T18:50:44.1786548Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T18:50:44.1786696Z ·  ──────────────────────────────────────── 2026-10-24T18:50:44.1786791Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-24T18:50:44.1786842Z ╰──── 2026-10-24T18:50:44.1787100Z  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-24T18:50:44.1787102Z 2026-10-24T18:50:44.1787314Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T18:50:44.1787436Z ╭─[scripts/lib/cli-external-packages.test.ts:116:11] 2026-10-24T18:50:44.1787534Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T18:50:44.1787628Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-24T18:50:44.1787745Z ·  ──────────────────────────────────── 2026-10-24T18:50:44.1787807Z 117 │ }; 2026-10-24T18:50:44.1787856Z ╰──── 2026-10-24T18:50:44.1788116Z  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-24T18:50:44.1788118Z 2026-10-24T18:50:44.1788314Z ⚠ eslint(no-unused-vars): Identifier 'Duration' is imported but never used. 2026-10-24T18:50:44.1788445Z ╭─[packages/provider-pi/src/server/adapter.test.ts:24:13] 2026-10-24T18:50:44.1788535Z 23 │ import * as Deferred from "effect/Deferred"; 2026-10-24T18:50:44.1788626Z 24 │ import * as Duration from "effect/Duration"; 2026-10-24T18:50:44.1788702Z ·  ────┬─── 2026-10-24T18:50:44.1788865Z · ╰── 'Duration' is imported here 2026-10-24T18:50:44.1788953Z 25 │ import * as Effect from "effect/Effect"; 2026-10-24T18:50:44.1789007Z ╰──── 2026-10-24T18:50:44.1789100Z  help: Consider removing this import. 2026-10-24T18:50:44.1789102Z 2026-10-24T18:50:44.1789355Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T18:50:44.1789481Z ╭─[packages/provider-pi/src/server/adapter.ts:3405:7] 2026-10-24T18:50:44.1789535Z 3404 │ 2026-10-24T18:50:44.1789722Z 3405 │ const layer: Layer.Layer = 2026-10-24T18:50:44.1789791Z ·  ──┬── 2026-10-24T18:50:44.1789913Z · ╰── 'layer' is declared here 2026-10-24T18:50:44.1789977Z 3406 │ Layer.effect( 2026-10-24T18:50:44.1790028Z ╰──── 2026-10-24T18:50:44.1790134Z  help: Consider removing this declaration. 2026-10-24T18:50:44.1790139Z 2026-10-24T18:50:44.1790593Z ⚠ 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-24T18:50:44.1790723Z ╭─[apps/server/src/project/ProjectService.test.ts:94:3] 2026-10-24T18:50:44.1790778Z 93 │ ) { 2026-10-24T18:50:44.1790978Z 94 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T18:50:44.1791150Z 95 │ │ const project = Option.getOrThrow(yield* service.getById(projectId)); 2026-10-24T18:50:44.1791265Z 96 │ │ if (predicate(project)) return project; 2026-10-24T18:50:44.1791570Z 97 │ │ yield* Effect.yieldNow; 2026-10-24T18:50:44.1791739Z 98 │ ╰─▶ } 2026-10-24T18:50:44.1791885Z 99 │ return yield* Effect.die(`Project ${projectId} was not enriched in time.`); 2026-10-24T18:50:44.1791935Z ╰──── 2026-10-24T18:50:44.1791937Z 2026-10-24T18:50:44.1792091Z ⚠ eslint(no-new): Do not use 'new' for side effects. 2026-10-24T18:50:44.1792214Z ╭─[apps/server/src/mcp/McpToolAccess.test.ts:168:3] 2026-10-24T18:50:44.1792323Z 167 │ // @ts-expect-error a declaration constructed directly 2026-10-24T18:50:44.1792415Z 168 │ new McpToolAccess.Declaration(unchecked); 2026-10-24T18:50:44.1792513Z ·  ───────────────────────────── 2026-10-24T18:50:44.1792636Z 169 │ // @ts-expect-error a handlers layer built outside McpToolAccess 2026-10-24T18:50:44.1792696Z ╰──── 2026-10-24T18:50:44.1792851Z  help: Assign the result of 'new' to a variable or compare it to a reference. 2026-10-24T18:50:44.1792854Z 2026-10-24T18:50:44.1793036Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T18:50:44.1793168Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:121:27] 2026-10-24T18:50:44.1793326Z 120 │ const scope = makeScope(options.capabilities ?? new Set(["preview", "worktree"])); 2026-10-24T18:50:44.1793412Z 121 │ const dispatch = vi.fn((_: unknown) => 2026-10-24T18:50:44.1793494Z ·  ┬ 2026-10-24T18:50:44.1793623Z · ╰── '_' is declared here 2026-10-24T18:50:44.1793723Z 122 │ (options.dispatchGate ?? Effect.void).pipe( 2026-10-24T18:50:44.1793772Z ╰──── 2026-10-24T18:50:44.1793878Z  help: Consider removing this parameter. 2026-10-24T18:50:44.1793882Z 2026-10-24T18:50:44.1794063Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T18:50:44.1794194Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:134:39] 2026-10-24T18:50:44.1794248Z 133 │ ); 2026-10-24T18:50:44.1794349Z 134 │ const listLocalBranchNames = vi.fn((_: string) => 2026-10-24T18:50:44.1794443Z ·  ┬ 2026-10-24T18:50:44.1794581Z · ╰── '_' is declared here 2026-10-24T18:50:44.1794647Z 135 │ Effect.succeed( 2026-10-24T18:50:44.1794696Z ╰──── 2026-10-24T18:50:44.1794794Z  help: Consider removing this parameter. 2026-10-24T18:50:44.1794797Z 2026-10-24T18:50:44.1794980Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T18:50:44.1795113Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:178:31] 2026-10-24T18:50:44.1795165Z 177 │ }); 2026-10-24T18:50:44.1795262Z 178 │ const sendToThread = vi.fn((_: unknown) => { 2026-10-24T18:50:44.1795347Z ·  ┬ 2026-10-24T18:50:44.1795478Z · ╰── '_' is declared here 2026-10-24T18:50:44.1795573Z 179 │ switch (options.continuation ?? "queued") { 2026-10-24T18:50:44.1795622Z ╰──── 2026-10-24T18:50:44.1795721Z  help: Consider removing this parameter. 2026-10-24T18:50:44.1795723Z 2026-10-24T18:50:44.1795907Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T18:50:44.1796086Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:203:33] 2026-10-24T18:50:44.1796169Z 202 │ ); 2026-10-24T18:50:44.1796264Z 203 │ const removeWorktree = vi.fn((_: unknown) => 2026-10-24T18:50:44.1796352Z ·  ┬ 2026-10-24T18:50:44.1796484Z · ╰── '_' is declared here 2026-10-24T18:50:44.1796563Z 204 │ options.removeWorktreeFails 2026-10-24T18:50:44.1796612Z ╰──── 2026-10-24T18:50:44.1796710Z  help: Consider removing this parameter. 2026-10-24T18:50:44.1796712Z 2026-10-24T18:50:44.1796887Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T18:50:44.1797016Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:208:36] 2026-10-24T18:50:44.1797068Z 207 │ ); 2026-10-24T18:50:44.1797171Z 208 │ const deleteLocalBranch = vi.fn((_: unknown) => 2026-10-24T18:50:44.1797263Z ·  ┬ 2026-10-24T18:50:44.1797399Z · ╰── '_' is declared here 2026-10-24T18:50:44.1797482Z 209 │ options.deleteLocalBranchFails 2026-10-24T18:50:44.1797532Z ╰──── 2026-10-24T18:50:44.1797625Z  help: Consider removing this parameter. 2026-10-24T18:50:44.1797628Z 2026-10-24T18:50:44.1797805Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T18:50:44.1797934Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:213:42] 2026-10-24T18:50:44.1797986Z 212 │ ); 2026-10-24T18:50:44.1798096Z 213 │ const fetchWorktreeBaseCommit = vi.fn((_: unknown) => 2026-10-24T18:50:44.1798196Z ·  ┬ 2026-10-24T18:50:44.1798340Z · ╰── '_' is declared here 2026-10-24T18:50:44.1798424Z 214 │ options.fetchWorktreeBaseFails 2026-10-24T18:50:44.1798472Z ╰──── 2026-10-24T18:50:44.1798571Z  help: Consider removing this parameter. 2026-10-24T18:50:44.1798574Z 2026-10-24T18:50:44.1798780Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T18:50:44.1798909Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:254:30] 2026-10-24T18:50:44.1798960Z 253 │ ); 2026-10-24T18:50:44.1799049Z 254 │ const localStatus = vi.fn((_: unknown) => 2026-10-24T18:50:44.1799134Z ·  ┬ 2026-10-24T18:50:44.1799308Z · ╰── '_' is declared here 2026-10-24T18:50:44.1799409Z 255 │ Effect.succeed({ 2026-10-24T18:50:44.1799460Z ╰──── 2026-10-24T18:50:44.1799555Z  help: Consider removing this parameter. 2026-10-24T18:50:44.1799558Z 2026-10-24T18:50:44.1799733Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T18:50:44.1799861Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:264:32] 2026-10-24T18:50:44.1799913Z 263 │ ); 2026-10-24T18:50:44.1800059Z 264 │ const refreshStatus = vi.fn((_: string) => Effect.die("refreshStatus stub")); 2026-10-24T18:50:44.1800146Z ·  ┬ 2026-10-24T18:50:44.1800276Z · ╰── '_' is declared here 2026-10-24T18:50:44.1800425Z 265 │ const runForThread = vi.fn((input: { readonly worktreePath: string }) => { 2026-10-24T18:50:44.1800476Z ╰──── 2026-10-24T18:50:44.1800574Z  help: Consider removing this parameter. 2026-10-24T18:50:44.1800576Z 2026-10-24T18:50:44.1800862Z ⚠ eslint(no-unused-vars): Variable 'revokeActiveMcpThread' is declared but never used. Unused variables should start with a '_'. 2026-10-24T18:50:44.1800982Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:218:7] 2026-10-24T18:50:44.1801035Z 217 │ 2026-10-24T18:50:44.1801179Z 218 │ const revokeActiveMcpThread = (threadId: ThreadId): Effect.Effect => 2026-10-24T18:50:44.1801269Z ·  ──────────┬────────── 2026-10-24T18:50:44.1801419Z · ╰── 'revokeActiveMcpThread' is declared here 2026-10-24T18:50:44.1801610Z 219 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeThread(threadId) : Effect.void; 2026-10-24T18:50:44.1801662Z ╰──── 2026-10-24T18:50:44.1801762Z  help: Consider removing this declaration. 2026-10-24T18:50:44.1801765Z 2026-10-24T18:50:44.1802064Z ⚠ eslint(no-unused-vars): Variable 'revokeAllActiveMcpCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-24T18:50:44.1802186Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:221:7] 2026-10-24T18:50:44.1802240Z 220 │ 2026-10-24T18:50:44.1802369Z 221 │ const revokeAllActiveMcpCredentials = (): Effect.Effect => 2026-10-24T18:50:44.1802466Z ·  ──────────────┬────────────── 2026-10-24T18:50:44.1802641Z · ╰── 'revokeAllActiveMcpCredentials' is declared here 2026-10-24T18:50:44.1802803Z 222 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void; 2026-10-24T18:50:44.1802856Z ╰──── 2026-10-24T18:50:44.1802955Z  help: Consider removing this declaration. 2026-10-24T18:50:44.1802957Z 2026-10-24T18:50:44.1803409Z ⚠ 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-24T18:50:44.1803563Z ╭─[apps/server/src/project/ProjectEnrichmentService.test.ts:28:3] 2026-10-24T18:50:44.1803617Z 27 │ ) { 2026-10-24T18:50:44.1803815Z 28 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T18:50:44.1803956Z 29 │ │ const available = yield* service.peek(workspaceRoot); 2026-10-24T18:50:44.1804133Z 30 │ │ if (predicate(available)) return available; 2026-10-24T18:50:44.1804262Z 31 │ │ yield* Effect.yieldNow; 2026-10-24T18:50:44.1804381Z 32 │ ╰─▶ } 2026-10-24T18:50:44.1804554Z 33 │ return yield* Effect.die(`Project metadata for ${workspaceRoot} was not resolved in time.`); 2026-10-24T18:50:44.1804605Z ╰──── 2026-10-24T18:50:44.1804607Z 2026-10-24T18:50:44.1804750Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1804867Z ╭─[apps/mobile/src/native/StackHeader.tsx:185:9] 2026-10-24T18:50:44.1804929Z 184 │ "options", 2026-10-24T18:50:44.1805021Z 185 │ latestOptionFunctionsRef.current, 2026-10-24T18:50:44.1805135Z ·  ────────────────┬─────────────── 2026-10-24T18:50:44.1805334Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T18:50:44.1805428Z 186 │ optionFunctionWrappersRef.current, 2026-10-24T18:50:44.1805479Z ╰──── 2026-10-24T18:50:44.1805931Z  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-24T18:50:44.1806220Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1806222Z 2026-10-24T18:50:44.1806362Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1806481Z ╭─[apps/mobile/src/native/StackHeader.tsx:186:9] 2026-10-24T18:50:44.1806572Z 185 │ latestOptionFunctionsRef.current, 2026-10-24T18:50:44.1806664Z 186 │ optionFunctionWrappersRef.current, 2026-10-24T18:50:44.1806771Z ·  ────────────────┬──────────────── 2026-10-24T18:50:44.1806956Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T18:50:44.1807047Z 187 │ ) as NativeStackNavigationOptions) 2026-10-24T18:50:44.1807098Z ╰──── 2026-10-24T18:50:44.1807551Z  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-24T18:50:44.1807841Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1807847Z 2026-10-24T18:50:44.1808284Z ⚠ 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-24T18:50:44.1808406Z ╭─[apps/server/src/serverSettings.test.ts:1741:32] 2026-10-24T18:50:44.1808573Z 1740 │ const model = createModelSelection(ProviderInstanceId.make("codex"), "gpt-5.5"); 2026-10-24T18:50:44.1808765Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-24T18:50:44.1808899Z ·  ─────────────────── 2026-10-24T18:50:44.1809006Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-24T18:50:44.1809107Z ╰──── 2026-10-24T18:50:44.1809145Z 2026-10-24T18:50:44.1809579Z ⚠ 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-24T18:50:44.1809699Z ╭─[apps/server/src/serverSettings.test.ts:1742:34] 2026-10-24T18:50:44.1809879Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-24T18:50:44.1812190Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-24T18:50:44.1812322Z ·  ─────────────────── 2026-10-24T18:50:44.1812442Z 1743 │ Schema.fromJsonString(Schema.Array(ProjectScript)), 2026-10-24T18:50:44.1812494Z ╰──── 2026-10-24T18:50:44.1812496Z 2026-10-24T18:50:44.1812711Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T18:50:44.1812850Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:231:6] 2026-10-24T18:50:44.1813012Z 227 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-24T18:50:44.1813101Z 228 │ nativeEventSnapshotsRef.current, 2026-10-24T18:50:44.1813195Z ·  ───────────┬─────────── 2026-10-24T18:50:44.1813651Z · ╰── 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-24T18:50:44.1813723Z 229 │ mostRecentEventCount, 2026-10-24T18:50:44.1813779Z 230 │ ); 2026-10-24T18:50:44.1813907Z 231 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-24T18:50:44.1814040Z ·  ──────────────────────────┬────────────────────────── 2026-10-24T18:50:44.1814237Z · ╰── This dependency list is missing values used by the callback 2026-10-24T18:50:44.1814320Z 232 │ const assumedValue = props.value; 2026-10-24T18:50:44.1814370Z ╰──── 2026-10-24T18:50:44.1814534Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T18:50:44.1814845Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1814848Z 2026-10-24T18:50:44.1815057Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T18:50:44.1815196Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:239:7] 2026-10-24T18:50:44.1815341Z 238 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-24T18:50:44.1815427Z 239 │ nativeEventSnapshotsRef.current, 2026-10-24T18:50:44.1815516Z ·  ───────────┬─────────── 2026-10-24T18:50:44.1815964Z · ╰── 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-24T18:50:44.1816035Z 240 │ controlledEventCount, 2026-10-24T18:50:44.1816098Z 241 │ assumedValue, 2026-10-24T18:50:44.1816151Z 242 │ ); 2026-10-24T18:50:44.1816306Z 243 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-24T18:50:44.1816524Z ·  ───────────┬────────── 2026-10-24T18:50:44.1816773Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-24T18:50:44.1816862Z 244 │ const acceptNativeEvent = useCallback( 2026-10-24T18:50:44.1816914Z ╰──── 2026-10-24T18:50:44.1817328Z  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-24T18:50:44.1817635Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1817638Z 2026-10-24T18:50:44.1817784Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1817921Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29] 2026-10-24T18:50:44.1818042Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T18:50:44.1818152Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T18:50:44.1818267Z ·  ─────────────┬──────────── 2026-10-24T18:50:44.1818432Z · ╰── Cannot access ref value during render 2026-10-24T18:50:44.1818487Z 165 │ }); 2026-10-24T18:50:44.1818538Z ╰──── 2026-10-24T18:50:44.1819050Z  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-24T18:50:44.1819337Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1819340Z 2026-10-24T18:50:44.1819482Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1819615Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29] 2026-10-24T18:50:44.1819734Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T18:50:44.1819841Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T18:50:44.1819956Z ·  ─────────────┬──────────── 2026-10-24T18:50:44.1820210Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T18:50:44.1820294Z 165 │ }); 2026-10-24T18:50:44.1820343Z ╰──── 2026-10-24T18:50:44.1820796Z  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-24T18:50:44.1821080Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1821083Z 2026-10-24T18:50:44.1821223Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1821354Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:166:23] 2026-10-24T18:50:44.1821408Z 165 │ }); 2026-10-24T18:50:44.1821502Z 166 │ confirmedTokensRef.current = tokens; 2026-10-24T18:50:44.1821626Z ·  ─────────┬────────────┬─── 2026-10-24T18:50:44.1821816Z · │ ╰── Cannot update ref value during render 2026-10-24T18:50:44.1821929Z · ╰── This value is a ref 2026-10-24T18:50:44.1822001Z 167 │ return JSON.stringify( 2026-10-24T18:50:44.1822050Z ╰──── 2026-10-24T18:50:44.1822505Z  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-24T18:50:44.1822795Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1822801Z 2026-10-24T18:50:44.1822940Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1823071Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:208:5] 2026-10-24T18:50:44.1823140Z 207 │ mostRecentEventCount, 2026-10-24T18:50:44.1823226Z 208 │ nativeEventSnapshotsRef.current, 2026-10-24T18:50:44.1823329Z ·  ───────────────┬─────────────── 2026-10-24T18:50:44.1823516Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T18:50:44.1823573Z 209 │ ); 2026-10-24T18:50:44.1823625Z ╰──── 2026-10-24T18:50:44.1824079Z  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-24T18:50:44.1824366Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1824369Z 2026-10-24T18:50:44.1824510Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1824642Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:214:5] 2026-10-24T18:50:44.1824710Z 213 │ mostRecentEventCount, 2026-10-24T18:50:44.1824794Z 214 │ nativeEventSnapshotsRef.current, 2026-10-24T18:50:44.1824895Z ·  ───────────────┬─────────────── 2026-10-24T18:50:44.1825076Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T18:50:44.1825180Z 215 │ ); 2026-10-24T18:50:44.1825264Z ╰──── 2026-10-24T18:50:44.1825716Z  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-24T18:50:44.1825998Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1826001Z 2026-10-24T18:50:44.1826184Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T18:50:44.1826314Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:199:6] 2026-10-24T18:50:44.1826432Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T18:50:44.1826543Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T18:50:44.1826652Z ·  ─────────┬──────── 2026-10-24T18:50:44.1827109Z · ╰── 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-24T18:50:44.1827162Z 165 │ }); 2026-10-24T18:50:44.1827252Z 166 │ confirmedTokensRef.current = tokens; 2026-10-24T18:50:44.1827322Z 167 │ return JSON.stringify( 2026-10-24T18:50:44.1827485Z 168 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-24T18:50:44.1827549Z 169 │ const record = 2026-10-24T18:50:44.1827630Z 170 │ token.type === "context" 2026-10-24T18:50:44.1827797Z 171 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-24T18:50:44.1827863Z 172 │ : undefined; 2026-10-24T18:50:44.1827967Z 173 │ const presentation = contextChipPresentation( 2026-10-24T18:50:44.1828076Z 174 │ token.type === "context" ? token.kind : token.type, 2026-10-24T18:50:44.1828140Z 175 │ record, 2026-10-24T18:50:44.1828198Z 176 │ ); 2026-10-24T18:50:44.1828278Z 177 │ const icon = contextChipIcon( 2026-10-24T18:50:44.1828345Z 178 │ presentation, 2026-10-24T18:50:44.1828487Z 179 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-24T18:50:44.1828543Z 180 │ ); 2026-10-24T18:50:44.1828604Z 181 │ return { 2026-10-24T18:50:44.1828672Z 182 │ type: token.type, 2026-10-24T18:50:44.1828771Z 183 │ source: token.source, 2026-10-24T18:50:44.1828847Z 184 │ start: token.start, 2026-10-24T18:50:44.1828915Z 185 │ end: token.end, 2026-10-24T18:50:44.1829060Z 186 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-24T18:50:44.1829120Z 187 │ label: 2026-10-24T18:50:44.1829195Z 188 │ token.type === "skill" 2026-10-24T18:50:44.1829304Z 189 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-24T18:50:44.1829385Z 190 │ : token.type === "context" 2026-10-24T18:50:44.1829618Z 191 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-24T18:50:44.1829697Z 192 │ : basename(token.value), 2026-10-24T18:50:44.1829839Z 193 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-24T18:50:44.1829989Z 194 │ iconUri: contextChipIconUri(icon), 2026-10-24T18:50:44.1830105Z 195 │ tintsIcon: icon.kind === "chip", 2026-10-24T18:50:44.1830160Z 196 │ }; 2026-10-24T18:50:44.1830216Z 197 │ }), 2026-10-24T18:50:44.1830269Z 198 │ ); 2026-10-24T18:50:44.1830399Z 199 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-24T18:50:44.1830548Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-24T18:50:44.1830751Z · ╰── This dependency list is missing values used by the callback 2026-10-24T18:50:44.1830893Z 200 │ // Every render resolves against the snapshot history, so a render whose 2026-10-24T18:50:44.1830943Z ╰──── 2026-10-24T18:50:44.1831143Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T18:50:44.1831456Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1831462Z 2026-10-24T18:50:44.1831643Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T18:50:44.1831775Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:261:5] 2026-10-24T18:50:44.1831902Z 253 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-24T18:50:44.1832000Z 254 │ nativeEventSnapshotsRef.current.push({ 2026-10-24T18:50:44.1832091Z ·  ───────────┬─────────── 2026-10-24T18:50:44.1832546Z · ╰── 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-24T18:50:44.1832637Z 255 │ eventCount: acknowledgedEventCount, 2026-10-24T18:50:44.1832697Z 256 │ value, 2026-10-24T18:50:44.1832774Z 257 │ selection: nextSelection, 2026-10-24T18:50:44.1832829Z 258 │ }); 2026-10-24T18:50:44.1832910Z 259 │ return acknowledgedEventCount; 2026-10-24T18:50:44.1832961Z 260 │ }, 2026-10-24T18:50:44.1833014Z 261 │ [], 2026-10-24T18:50:44.1833080Z ·  ─┬ 2026-10-24T18:50:44.1833258Z · ╰── This dependency list is missing values used by the callback 2026-10-24T18:50:44.1833312Z 262 │ ); 2026-10-24T18:50:44.1833366Z ╰──── 2026-10-24T18:50:44.1833566Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T18:50:44.1833878Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1833884Z 2026-10-24T18:50:44.1834036Z ⚠ react(immutability): This value cannot be modified 2026-10-24T18:50:44.1834200Z ╭─[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5] 2026-10-24T18:50:44.1834303Z 65 │ const [expanded, setExpanded] = useState(false); 2026-10-24T18:50:44.1834384Z 66 │ const progress = useSharedValue(0); 2026-10-24T18:50:44.1834456Z ·  ────┬─── 2026-10-24T18:50:44.1834588Z · ╰── `progress` originates here 2026-10-24T18:50:44.1834653Z 67 │ useEffect(() => { 2026-10-24T18:50:44.1834829Z 68 │ progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING); 2026-10-24T18:50:44.1834929Z ·  ────┬─── 2026-10-24T18:50:44.1835061Z · ╰── `progress` cannot be modified 2026-10-24T18:50:44.1835130Z 69 │ }, [expanded, progress]); 2026-10-24T18:50:44.1835182Z ╰──── 2026-10-24T18:50:44.1835441Z  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-24T18:50:44.1835739Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T18:50:44.1835742Z 2026-10-24T18:50:44.1835886Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1836043Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:122:38] 2026-10-24T18:50:44.1836205Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-24T18:50:44.1836329Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-24T18:50:44.1836449Z ·  ───────────┬────────── 2026-10-24T18:50:44.1836618Z · ╰── Cannot access ref value during render 2026-10-24T18:50:44.1836737Z 123 │ const sessionRef = useRef(null); 2026-10-24T18:50:44.1836786Z ╰──── 2026-10-24T18:50:44.1837237Z  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-24T18:50:44.1837527Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1837532Z 2026-10-24T18:50:44.1837673Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1837827Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8] 2026-10-24T18:50:44.1837878Z 125 │ 2026-10-24T18:50:44.1837986Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T18:50:44.1838072Z ·  ─────────┬──────── 2026-10-24T18:50:44.1838222Z · ╰── Cannot access ref value during render 2026-10-24T18:50:44.1838320Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T18:50:44.1838370Z ╰──── 2026-10-24T18:50:44.1838858Z  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-24T18:50:44.1839147Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1839149Z 2026-10-24T18:50:44.1839288Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1839440Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7] 2026-10-24T18:50:44.1839492Z 125 │ 2026-10-24T18:50:44.1839600Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T18:50:44.1839685Z ·  ─────────┬───────── 2026-10-24T18:50:44.1839880Z · ╰── Cannot access ref value during render 2026-10-24T18:50:44.1840042Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T18:50:44.1840092Z ╰──── 2026-10-24T18:50:44.1840540Z  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-24T18:50:44.1840822Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1840825Z 2026-10-24T18:50:44.1840963Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1841114Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31] 2026-10-24T18:50:44.1841169Z 125 │ 2026-10-24T18:50:44.1841274Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T18:50:44.1841385Z ·  ─────────┬───────── 2026-10-24T18:50:44.1841549Z · ╰── Cannot access ref value during render 2026-10-24T18:50:44.1841647Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T18:50:44.1841696Z ╰──── 2026-10-24T18:50:44.1842151Z  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-24T18:50:44.1842434Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1842440Z 2026-10-24T18:50:44.1842581Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1842733Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30] 2026-10-24T18:50:44.1842783Z 125 │ 2026-10-24T18:50:44.1842887Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T18:50:44.1842996Z ·  ──────────┬───────── 2026-10-24T18:50:44.1843158Z · ╰── Cannot access ref value during render 2026-10-24T18:50:44.1843254Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T18:50:44.1843304Z ╰──── 2026-10-24T18:50:44.1843798Z  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-24T18:50:44.1844108Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1844111Z 2026-10-24T18:50:44.1844249Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1844399Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46] 2026-10-24T18:50:44.1844509Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T18:50:44.1844706Z 127 │ ╭─▶ const recorder = createLazyVoiceRecorder({ 2026-10-24T18:50:44.1844877Z 128 │ │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-24T18:50:44.1845005Z 129 │ │ onStatus: (status: RecordingStatus) => { 2026-10-24T18:50:44.1845159Z 130 │ │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-24T18:50:44.1845276Z 131 │ │ isFinished: status.isFinished, 2026-10-24T18:50:44.1845451Z 132 │ │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-24T18:50:44.1845551Z 133 │ │ error: status.error, 2026-10-24T18:50:44.1845649Z 134 │ │ url: status.url, 2026-10-24T18:50:44.1845730Z 135 │ │ }); 2026-10-24T18:50:44.1845806Z 136 │ │ }, 2026-10-24T18:50:44.1846004Z 137 │ │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-24T18:50:44.1846111Z 138 │ │ selectInput: (inputs) => { 2026-10-24T18:50:44.1846263Z 139 │ │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-24T18:50:44.1846408Z 140 │ │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-24T18:50:44.1846572Z 141 │ │ const known = microphoneOrder(preferences.value.microphones); 2026-10-24T18:50:44.1846707Z 142 │ │ const order = rememberMicrophones(known, inputs); 2026-10-24T18:50:44.1846807Z 143 │ │ if (order !== known) { 2026-10-24T18:50:44.1846942Z 144 │ │ registry.set(updateMobilePreferencesAtom, { 2026-10-24T18:50:44.1847056Z 145 │ │ transform: (current) => ({ 2026-10-24T18:50:44.1847261Z 146 │ │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-24T18:50:44.1847350Z 147 │ │ }), 2026-10-24T18:50:44.1847432Z 148 │ │ }); 2026-10-24T18:50:44.1847508Z 149 │ │ } 2026-10-24T18:50:44.1847643Z 150 │ │ return preferredMicrophoneInput(inputs, order); 2026-10-24T18:50:44.1847720Z 151 │ │ }, 2026-10-24T18:50:44.1847851Z 152 │ ├─▶ }); 2026-10-24T18:50:44.1848087Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T18:50:44.1848169Z 153 │ recorderRef.current = recorder; 2026-10-24T18:50:44.1848220Z ╰──── 2026-10-24T18:50:44.1848729Z  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-24T18:50:44.1849076Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1849078Z 2026-10-24T18:50:44.1849219Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1849372Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16] 2026-10-24T18:50:44.1849427Z 152 │ }); 2026-10-24T18:50:44.1849509Z 153 │ recorderRef.current = recorder; 2026-10-24T18:50:44.1849619Z ·  ─────┬─────────┬─── 2026-10-24T18:50:44.1849802Z · │ ╰── Cannot update ref value during render 2026-10-24T18:50:44.1849919Z · ╰── This value is a ref 2026-10-24T18:50:44.1850024Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T18:50:44.1850075Z ╰──── 2026-10-24T18:50:44.1850524Z  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-24T18:50:44.1850806Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1850808Z 2026-10-24T18:50:44.1850954Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1851190Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48] 2026-10-24T18:50:44.1851307Z 153 │ recorderRef.current = recorder; 2026-10-24T18:50:44.1851498Z 154 │ ╭─▶ sessionRef.current = new VoiceInputSession({ 2026-10-24T18:50:44.1851582Z 155 │ │ recorder, 2026-10-24T18:50:44.1851709Z 156 │ │ getTranscriber: getLocalVoiceTranscriber, 2026-10-24T18:50:44.1851825Z 157 │ │ requestPermission: async () => { 2026-10-24T18:50:44.1851984Z 158 │ │ const permission = await requestRecordingPermissionsAsync(); 2026-10-24T18:50:44.1852178Z 159 │ │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-24T18:50:44.1852259Z 160 │ │ }, 2026-10-24T18:50:44.1852399Z 161 │ │ configureRecording: configureVoiceRecordingAudio, 2026-10-24T18:50:44.1852531Z 162 │ │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-24T18:50:44.1852663Z 163 │ │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-24T18:50:44.1852774Z 164 │ │ onStateChange: (nextState) => 2026-10-24T18:50:44.1852862Z 165 │ │ setState({ 2026-10-24T18:50:44.1852959Z 166 │ │ state: nextState, 2026-10-24T18:50:44.1853093Z 167 │ │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-24T18:50:44.1853217Z 168 │ │ label: sessionRef.current?.label ?? null, 2026-10-24T18:50:44.1853369Z 169 │ │ }), 2026-10-24T18:50:44.1853530Z 170 │ ├─▶ }); 2026-10-24T18:50:44.1853728Z · ╰──── Cannot access ref value during render 2026-10-24T18:50:44.1853784Z 171 │ } 2026-10-24T18:50:44.1853835Z ╰──── 2026-10-24T18:50:44.1854287Z  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-24T18:50:44.1854573Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1854575Z 2026-10-24T18:50:44.1854719Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1854875Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15] 2026-10-24T18:50:44.1854955Z 153 │ recorderRef.current = recorder; 2026-10-24T18:50:44.1855058Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T18:50:44.1855166Z ·  ─────┬────────┬─── 2026-10-24T18:50:44.1855345Z · │ ╰── Cannot update ref value during render 2026-10-24T18:50:44.1855458Z · ╰── This value is a ref 2026-10-24T18:50:44.1855520Z 155 │ recorder, 2026-10-24T18:50:44.1855571Z ╰──── 2026-10-24T18:50:44.1856027Z  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-24T18:50:44.1856314Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1856316Z 2026-10-24T18:50:44.1856456Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1856608Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7] 2026-10-24T18:50:44.1856694Z 184 │ return () => subscription.remove(); 2026-10-24T18:50:44.1856758Z 185 │ }, [controller]); 2026-10-24T18:50:44.1856833Z ·  ─────┬──── 2026-10-24T18:50:44.1856980Z · ╰── Cannot access ref value during render 2026-10-24T18:50:44.1857034Z 186 │ 2026-10-24T18:50:44.1857083Z ╰──── 2026-10-24T18:50:44.1857534Z  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-24T18:50:44.1857818Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1857820Z 2026-10-24T18:50:44.1857958Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1858110Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6] 2026-10-24T18:50:44.1858193Z 184 │ return () => subscription.remove(); 2026-10-24T18:50:44.1858307Z 185 │ }, [controller]); 2026-10-24T18:50:44.1858414Z ·  ──────┬───── 2026-10-24T18:50:44.1858552Z · ╰── Cannot access ref value during render 2026-10-24T18:50:44.1858603Z 186 │ 2026-10-24T18:50:44.1858653Z ╰──── 2026-10-24T18:50:44.1859169Z  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-24T18:50:44.1859452Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1859454Z 2026-10-24T18:50:44.1859590Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1859744Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6] 2026-10-24T18:50:44.1859800Z 191 │ }, 2026-10-24T18:50:44.1859869Z 192 │ [controller, recorder], 2026-10-24T18:50:44.1859941Z ·  ─────┬──── 2026-10-24T18:50:44.1860081Z · ╰── Cannot access ref value during render 2026-10-24T18:50:44.1860134Z 193 │ ); 2026-10-24T18:50:44.1860184Z ╰──── 2026-10-24T18:50:44.1860631Z  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-24T18:50:44.1860917Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1860921Z 2026-10-24T18:50:44.1861059Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1861210Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20] 2026-10-24T18:50:44.1861298Z 174 │ const controller = session.controller; 2026-10-24T18:50:44.1861381Z 175 │ const recorder = recorderRef.current; 2026-10-24T18:50:44.1861483Z ·  ─────────┬───────── 2026-10-24T18:50:44.1861637Z · ╰── Cannot access ref value during render 2026-10-24T18:50:44.1861687Z 176 │ 2026-10-24T18:50:44.1861736Z ╰──── 2026-10-24T18:50:44.1862190Z  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-24T18:50:44.1862474Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1862476Z 2026-10-24T18:50:44.1862615Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1862764Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5] 2026-10-24T18:50:44.1862817Z 191 │ }, 2026-10-24T18:50:44.1862887Z 192 │ [controller, recorder], 2026-10-24T18:50:44.1862974Z ·  ───────────┬────────── 2026-10-24T18:50:44.1863116Z · ╰── Cannot access ref value during render 2026-10-24T18:50:44.1863169Z 193 │ ); 2026-10-24T18:50:44.1863219Z ╰──── 2026-10-24T18:50:44.1863734Z  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-24T18:50:44.1864055Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1864057Z 2026-10-24T18:50:44.1864193Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1864347Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20] 2026-10-24T18:50:44.1864436Z 245 │ return () => clearInterval(intervalId); 2026-10-24T18:50:44.1864545Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-24T18:50:44.1864633Z ·  ─────┬──── 2026-10-24T18:50:44.1864787Z · ╰── Cannot access ref value during render 2026-10-24T18:50:44.1864838Z 247 │ 2026-10-24T18:50:44.1864888Z ╰──── 2026-10-24T18:50:44.1865334Z  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-24T18:50:44.1865616Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1865618Z 2026-10-24T18:50:44.1865756Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1865910Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6] 2026-10-24T18:50:44.1866002Z 245 │ return () => clearInterval(intervalId); 2026-10-24T18:50:44.1866106Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-24T18:50:44.1866234Z ·  ────────────────────────┬─────────────────────── 2026-10-24T18:50:44.1866387Z · ╰── Cannot access ref value during render 2026-10-24T18:50:44.1866439Z 247 │ 2026-10-24T18:50:44.1866488Z ╰──── 2026-10-24T18:50:44.1866940Z  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-24T18:50:44.1867232Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1867238Z 2026-10-24T18:50:44.1867375Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1867526Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5] 2026-10-24T18:50:44.1867592Z 260 │ setOwnerFocused, 2026-10-24T18:50:44.1867654Z 261 │ session, 2026-10-24T18:50:44.1867723Z ·  ───┬─── 2026-10-24T18:50:44.1867857Z · ╰── Cannot access ref value during render 2026-10-24T18:50:44.1867915Z 262 │ stop, 2026-10-24T18:50:44.1867966Z ╰──── 2026-10-24T18:50:44.1868472Z  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-24T18:50:44.1868795Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1868797Z 2026-10-24T18:50:44.1868963Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1869114Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10] 2026-10-24T18:50:44.1869167Z 250 │ 2026-10-24T18:50:44.1869304Z 251 │ ╭─▶ return { 2026-10-24T18:50:44.1869509Z 252 │ │ isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null, 2026-10-24T18:50:44.1869589Z 253 │ │ state, 2026-10-24T18:50:44.1869681Z 254 │ │ audioLevels, 2026-10-24T18:50:44.1869775Z 255 │ │ elapsedSeconds, 2026-10-24T18:50:44.1869899Z 256 │ │ isBusy: voiceInputBlocksSubmission(state), 2026-10-24T18:50:44.1869978Z 257 │ │ ownerKey, 2026-10-24T18:50:44.1870054Z 258 │ │ label, 2026-10-24T18:50:44.1870142Z 259 │ │ focusedOwners, 2026-10-24T18:50:44.1870233Z 260 │ │ setOwnerFocused, 2026-10-24T18:50:44.1870312Z 261 │ │ session, 2026-10-24T18:50:44.1870387Z 262 │ │ stop, 2026-10-24T18:50:44.1870463Z 263 │ │ cancel, 2026-10-24T18:50:44.1870588Z 264 │ ├─▶ }; 2026-10-24T18:50:44.1870791Z · ╰──── Cannot access ref value during render 2026-10-24T18:50:44.1870848Z 265 │ } 2026-10-24T18:50:44.1870898Z ╰──── 2026-10-24T18:50:44.1871349Z  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-24T18:50:44.1871632Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1871634Z 2026-10-24T18:50:44.1871787Z ⚠ react(immutability): This value cannot be modified 2026-10-24T18:50:44.1871940Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-24T18:50:44.1872146Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-24T18:50:44.1872295Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-24T18:50:44.1872374Z ·  ─────┬───── 2026-10-24T18:50:44.1872505Z · ╰── `audioLevels` originates here 2026-10-24T18:50:44.1872623Z 123 │ const sessionRef = useRef(null); 2026-10-24T18:50:44.1872764Z 124 │ const recorderRef = useRef | null>(null); 2026-10-24T18:50:44.1872817Z 125 │ 2026-10-24T18:50:44.1872921Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T18:50:44.1873018Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T18:50:44.1873151Z 128 │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-24T18:50:44.1873249Z 129 │ onStatus: (status: RecordingStatus) => { 2026-10-24T18:50:44.1873370Z 130 │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-24T18:50:44.1873454Z 131 │ isFinished: status.isFinished, 2026-10-24T18:50:44.1873590Z 132 │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-24T18:50:44.1873661Z 133 │ error: status.error, 2026-10-24T18:50:44.1873726Z 134 │ url: status.url, 2026-10-24T18:50:44.1873784Z 135 │ }); 2026-10-24T18:50:44.1873838Z 136 │ }, 2026-10-24T18:50:44.1873999Z 137 │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-24T18:50:44.1874075Z 138 │ selectInput: (inputs) => { 2026-10-24T18:50:44.1874195Z 139 │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-24T18:50:44.1874309Z 140 │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-24T18:50:44.1874439Z 141 │ const known = microphoneOrder(preferences.value.microphones); 2026-10-24T18:50:44.1874544Z 142 │ const order = rememberMicrophones(known, inputs); 2026-10-24T18:50:44.1874614Z 143 │ if (order !== known) { 2026-10-24T18:50:44.1874717Z 144 │ registry.set(updateMobilePreferencesAtom, { 2026-10-24T18:50:44.1874796Z 145 │ transform: (current) => ({ 2026-10-24T18:50:44.1874965Z 146 │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-24T18:50:44.1875025Z 147 │ }), 2026-10-24T18:50:44.1875084Z 148 │ }); 2026-10-24T18:50:44.1875139Z 149 │ } 2026-10-24T18:50:44.1875246Z 150 │ return preferredMicrophoneInput(inputs, order); 2026-10-24T18:50:44.1875300Z 151 │ }, 2026-10-24T18:50:44.1875357Z 152 │ }); 2026-10-24T18:50:44.1875439Z 153 │ recorderRef.current = recorder; 2026-10-24T18:50:44.1875540Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T18:50:44.1875598Z 155 │ recorder, 2026-10-24T18:50:44.1875695Z 156 │ getTranscriber: getLocalVoiceTranscriber, 2026-10-24T18:50:44.1875778Z 157 │ requestPermission: async () => { 2026-10-24T18:50:44.1875906Z 158 │ const permission = await requestRecordingPermissionsAsync(); 2026-10-24T18:50:44.1876058Z 159 │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-24T18:50:44.1876112Z 160 │ }, 2026-10-24T18:50:44.1876219Z 161 │ configureRecording: configureVoiceRecordingAudio, 2026-10-24T18:50:44.1876323Z 162 │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-24T18:50:44.1876422Z 163 │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-24T18:50:44.1876555Z 164 │ onStateChange: (nextState) => 2026-10-24T18:50:44.1876647Z 165 │ setState({ 2026-10-24T18:50:44.1876716Z 166 │ state: nextState, 2026-10-24T18:50:44.1876817Z 167 │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-24T18:50:44.1876912Z 168 │ label: sessionRef.current?.label ?? null, 2026-10-24T18:50:44.1876968Z 169 │ }), 2026-10-24T18:50:44.1877021Z 170 │ }); 2026-10-24T18:50:44.1877071Z 171 │ } 2026-10-24T18:50:44.1877123Z 172 │ 2026-10-24T18:50:44.1877205Z 173 │ const session = sessionRef.current; 2026-10-24T18:50:44.1877290Z 174 │ const controller = session.controller; 2026-10-24T18:50:44.1877370Z 175 │ const recorder = recorderRef.current; 2026-10-24T18:50:44.1877421Z 176 │ 2026-10-24T18:50:44.1877484Z 177 │ useEffect(() => { 2026-10-24T18:50:44.1877635Z 178 │ const subscription = AppState.addEventListener("change", (nextState) => { 2026-10-24T18:50:44.1877772Z 179 │ // iOS reports `inactive` while its permission dialog is open. Only the 2026-10-24T18:50:44.1877907Z 180 │ // real background state cancels preparation; recorder status handles 2026-10-24T18:50:44.1878008Z 181 │ // calls and route interruptions during capture. 2026-10-24T18:50:44.1878139Z 182 │ if (nextState === "background") controller.appMovedToBackground(); 2026-10-24T18:50:44.1878192Z 183 │ }); 2026-10-24T18:50:44.1878274Z 184 │ return () => subscription.remove(); 2026-10-24T18:50:44.1878336Z 185 │ }, [controller]); 2026-10-24T18:50:44.1878386Z 186 │ 2026-10-24T18:50:44.1878443Z 187 │ useEffect( 2026-10-24T18:50:44.1878503Z 188 │ () => () => { 2026-10-24T18:50:44.1878572Z 189 │ controller.dispose(); 2026-10-24T18:50:44.1878642Z 190 │ recorder.release(); 2026-10-24T18:50:44.1878698Z 191 │ }, 2026-10-24T18:50:44.1878799Z 192 │ [controller, recorder], 2026-10-24T18:50:44.1878851Z 193 │ ); 2026-10-24T18:50:44.1878899Z 194 │ 2026-10-24T18:50:44.1878961Z 195 │ useEffect(() => { 2026-10-24T18:50:44.1879051Z 196 │ if (state.phase !== "recording") return; 2026-10-24T18:50:44.1879101Z 197 │ 2026-10-24T18:50:44.1879243Z 198 │ const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`; 2026-10-24T18:50:44.1879346Z 199 │ const activation = activateKeepAwakeAsync(tag); 2026-10-24T18:50:44.1879424Z 200 │ void activation.catch(() => {}); 2026-10-24T18:50:44.1879486Z 201 │ return () => { 2026-10-24T18:50:44.1879631Z 202 │ // Release after activation settles, even if the recording ends immediately. 2026-10-24T18:50:44.1879772Z 203 │ void activation.then(() => deactivateKeepAwake(tag)).catch(() => {}); 2026-10-24T18:50:44.1879826Z 204 │ }; 2026-10-24T18:50:44.1879902Z 205 │ }, [keepAwakeId, state.phase]); 2026-10-24T18:50:44.1879950Z 206 │ 2026-10-24T18:50:44.1880011Z 207 │ useEffect(() => { 2026-10-24T18:50:44.1880141Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-24T18:50:44.1880189Z 209 │ 2026-10-24T18:50:44.1880308Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-24T18:50:44.1880459Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-24T18:50:44.1880559Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-24T18:50:44.1880633Z ·  ─────┬───── 2026-10-24T18:50:44.1880770Z · ╰── `audioLevels` cannot be modified 2026-10-24T18:50:44.1880823Z 213 │ } 2026-10-24T18:50:44.1880927Z ╰──── 2026-10-24T18:50:44.1881225Z  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-24T18:50:44.1881530Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T18:50:44.1881533Z 2026-10-24T18:50:44.1881732Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T18:50:44.1881887Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-24T18:50:44.1881938Z 206 │ 2026-10-24T18:50:44.1881998Z 207 │ useEffect(() => { 2026-10-24T18:50:44.1882073Z ·  ───┬─── 2026-10-24T18:50:44.1882292Z · ╰── This function may (indirectly) reassign or modify `audioLevels` after render 2026-10-24T18:50:44.1882426Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-24T18:50:44.1882475Z 209 │ 2026-10-24T18:50:44.1882593Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-24T18:50:44.1882743Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-24T18:50:44.1882842Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-24T18:50:44.1882916Z ·  ─────┬───── 2026-10-24T18:50:44.1883045Z · ╰── This modifies `audioLevels` 2026-10-24T18:50:44.1883098Z 213 │ } 2026-10-24T18:50:44.1883148Z ╰──── 2026-10-24T18:50:44.1883486Z  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-24T18:50:44.1883788Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T18:50:44.1883790Z 2026-10-24T18:50:44.1883942Z ⚠ react(immutability): This value cannot be modified 2026-10-24T18:50:44.1884107Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5] 2026-10-24T18:50:44.1884160Z 90 │ }) { 2026-10-24T18:50:44.1884269Z 91 │ const rotation = useSharedValue(props.hidden ? 1 : 0); 2026-10-24T18:50:44.1884343Z ·  ────┬─── 2026-10-24T18:50:44.1884478Z · ╰── `rotation` originates here 2026-10-24T18:50:44.1884546Z 92 │ useLayoutEffect(() => { 2026-10-24T18:50:44.1884690Z 93 │ rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING); 2026-10-24T18:50:44.1884761Z ·  ────┬─── 2026-10-24T18:50:44.1884891Z · ╰── `rotation` cannot be modified 2026-10-24T18:50:44.1884963Z 94 │ }, [props.hidden, rotation]); 2026-10-24T18:50:44.1885013Z ╰──── 2026-10-24T18:50:44.1885270Z  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-24T18:50:44.1885566Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T18:50:44.1885569Z 2026-10-24T18:50:44.1885720Z ⚠ react(immutability): This value cannot be modified 2026-10-24T18:50:44.1885936Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:269:5] 2026-10-24T18:50:44.1886061Z 266 │ const variant = props.variant ?? "plain"; 2026-10-24T18:50:44.1886193Z 267 │ const loadingVisibility = useSharedValue(props.loading ? 1 : 0); 2026-10-24T18:50:44.1886276Z ·  ────────┬──────── 2026-10-24T18:50:44.1886419Z · ╰── `loadingVisibility` originates here 2026-10-24T18:50:44.1886486Z 268 │ useLayoutEffect(() => { 2026-10-24T18:50:44.1886645Z 269 │ loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING); 2026-10-24T18:50:44.1886725Z ·  ────────┬──────── 2026-10-24T18:50:44.1886868Z · ╰── `loadingVisibility` cannot be modified 2026-10-24T18:50:44.1886956Z 270 │ }, [loadingVisibility, props.loading]); 2026-10-24T18:50:44.1887007Z ╰──── 2026-10-24T18:50:44.1887270Z  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-24T18:50:44.1887568Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T18:50:44.1887571Z 2026-10-24T18:50:44.1887719Z ⚠ react(immutability): This value cannot be modified 2026-10-24T18:50:44.1887883Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:328:5] 2026-10-24T18:50:44.1887937Z 325 │ }) { 2026-10-24T18:50:44.1888092Z 326 │ const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0); 2026-10-24T18:50:44.1888176Z ·  ─────────┬───────── 2026-10-24T18:50:44.1888328Z · ╰── `recordingVisibility` originates here 2026-10-24T18:50:44.1888398Z 327 │ useLayoutEffect(() => { 2026-10-24T18:50:44.1888580Z 328 │ recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING); 2026-10-24T18:50:44.1888662Z ·  ─────────┬───────── 2026-10-24T18:50:44.1888822Z · ╰── `recordingVisibility` cannot be modified 2026-10-24T18:50:44.1888941Z 329 │ }, [props.phase, recordingVisibility]); 2026-10-24T18:50:44.1888992Z ╰──── 2026-10-24T18:50:44.1889250Z  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-24T18:50:44.1889556Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T18:50:44.1889560Z 2026-10-24T18:50:44.1889701Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1889862Z ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14] 2026-10-24T18:50:44.1889942Z 26 │ const latestInput = useRef(input); 2026-10-24T18:50:44.1890016Z 27 │ latestInput.current = input; 2026-10-24T18:50:44.1890125Z ·  ─────┬─────────┬─── 2026-10-24T18:50:44.1890305Z · │ ╰── Cannot update ref value during render 2026-10-24T18:50:44.1890416Z · ╰── This value is a ref 2026-10-24T18:50:44.1890490Z 28 │ const mounted = useRef(true); 2026-10-24T18:50:44.1890540Z ╰──── 2026-10-24T18:50:44.1891052Z  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-24T18:50:44.1891424Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1891426Z 2026-10-24T18:50:44.1891677Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T18:50:44.1891844Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:79:5] 2026-10-24T18:50:44.1891896Z 76 │ 2026-10-24T18:50:44.1891959Z 77 │ useEffect(() => { 2026-10-24T18:50:44.1892028Z ·  ────┬──── 2026-10-24T18:50:44.1892162Z · ╰── This is the containing effect 2026-10-24T18:50:44.1892290Z 78 │ const { host, code } = parsePairingUrl(connectionPairingUrl); 2026-10-24T18:50:44.1892358Z 79 │ setHostInput(host); 2026-10-24T18:50:44.1892430Z ·  ──────┬───── 2026-10-24T18:50:44.1892596Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1892662Z 80 │ setCodeInput(code); 2026-10-24T18:50:44.1892712Z ╰──── 2026-10-24T18:50:44.1893298Z  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-24T18:50:44.1893620Z  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-24T18:50:44.1893625Z 2026-10-24T18:50:44.1893877Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T18:50:44.1894042Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:89:5] 2026-10-24T18:50:44.1894094Z 82 │ 2026-10-24T18:50:44.1894157Z 83 │ useEffect(() => { 2026-10-24T18:50:44.1894225Z ·  ────┬──── 2026-10-24T18:50:44.1894350Z · ╰── This is the containing effect 2026-10-24T18:50:44.1894437Z 84 │ if (routePairingUrl.length === 0) { 2026-10-24T18:50:44.1894495Z 85 │ return; 2026-10-24T18:50:44.1894549Z 86 │ } 2026-10-24T18:50:44.1894599Z 87 │ 2026-10-24T18:50:44.1894718Z 88 │ const { host, code } = parsePairingUrl(routePairingUrl); 2026-10-24T18:50:44.1894783Z 89 │ setHostInput(host); 2026-10-24T18:50:44.1894855Z ·  ──────┬───── 2026-10-24T18:50:44.1895023Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1895088Z 90 │ setCodeInput(code); 2026-10-24T18:50:44.1895138Z ╰──── 2026-10-24T18:50:44.1895724Z  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-24T18:50:44.1896108Z  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-24T18:50:44.1896148Z 2026-10-24T18:50:44.1896400Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T18:50:44.1896564Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:95:7] 2026-10-24T18:50:44.1896613Z 92 │ 2026-10-24T18:50:44.1896677Z 93 │ useEffect(() => { 2026-10-24T18:50:44.1896744Z ·  ────┬──── 2026-10-24T18:50:44.1896868Z · ╰── This is the containing effect 2026-10-24T18:50:44.1896947Z 94 │ if (pairingConnectionError) { 2026-10-24T18:50:44.1897017Z 95 │ setIsSubmitting(false); 2026-10-24T18:50:44.1897096Z ·  ───────┬─────── 2026-10-24T18:50:44.1897265Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1897319Z 96 │ } 2026-10-24T18:50:44.1897369Z ╰──── 2026-10-24T18:50:44.1897950Z  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-24T18:50:44.1898263Z  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-24T18:50:44.1898265Z 2026-10-24T18:50:44.1898456Z ⚠ eslint(no-unused-vars): Identifier 'Image' is imported but never used. 2026-10-24T18:50:44.1898597Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:17:10] 2026-10-24T18:50:44.1898732Z 16 │ import type { NativeSyntheticEvent, ViewProps } from "react-native"; 2026-10-24T18:50:44.1898878Z 17 │ import { Image, Platform, StyleSheet } from "react-native"; 2026-10-24T18:50:44.1898948Z ·  ──┬── 2026-10-24T18:50:44.1899069Z · ╰── 'Image' is imported here 2026-10-24T18:50:44.1899118Z 18 │ 2026-10-24T18:50:44.1899167Z ╰──── 2026-10-24T18:50:44.1899262Z  help: Consider removing this import. 2026-10-24T18:50:44.1899266Z 2026-10-24T18:50:44.1899464Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T18:50:44.1899603Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:229:6] 2026-10-24T18:50:44.1899820Z 225 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-24T18:50:44.1899939Z 226 │ nativeEventSnapshotsRef.current, 2026-10-24T18:50:44.1900030Z ·  ───────────┬─────────── 2026-10-24T18:50:44.1900480Z · ╰── 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-24T18:50:44.1900556Z 227 │ mostRecentEventCount, 2026-10-24T18:50:44.1900611Z 228 │ ); 2026-10-24T18:50:44.1900731Z 229 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-24T18:50:44.1900863Z ·  ──────────────────────────┬────────────────────────── 2026-10-24T18:50:44.1901064Z · ╰── This dependency list is missing values used by the callback 2026-10-24T18:50:44.1901149Z 230 │ const assumedValue = props.value; 2026-10-24T18:50:44.1901199Z ╰──── 2026-10-24T18:50:44.1901362Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T18:50:44.1901670Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1901673Z 2026-10-24T18:50:44.1901882Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T18:50:44.1902020Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:237:7] 2026-10-24T18:50:44.1902161Z 236 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-24T18:50:44.1902248Z 237 │ nativeEventSnapshotsRef.current, 2026-10-24T18:50:44.1902343Z ·  ───────────┬─────────── 2026-10-24T18:50:44.1902791Z · ╰── 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-24T18:50:44.1902864Z 238 │ controlledEventCount, 2026-10-24T18:50:44.1902928Z 239 │ assumedValue, 2026-10-24T18:50:44.1902981Z 240 │ ); 2026-10-24T18:50:44.1903134Z 241 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-24T18:50:44.1903268Z ·  ───────────┬────────── 2026-10-24T18:50:44.1903470Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-24T18:50:44.1903564Z 242 │ const acceptNativeEvent = useCallback( 2026-10-24T18:50:44.1903619Z ╰──── 2026-10-24T18:50:44.1904029Z  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-24T18:50:44.1904335Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1904337Z 2026-10-24T18:50:44.1904478Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1904619Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29] 2026-10-24T18:50:44.1904741Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T18:50:44.1904902Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T18:50:44.1905047Z ·  ─────────────┬──────────── 2026-10-24T18:50:44.1905210Z · ╰── Cannot access ref value during render 2026-10-24T18:50:44.1905267Z 163 │ }); 2026-10-24T18:50:44.1905315Z ╰──── 2026-10-24T18:50:44.1905769Z  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-24T18:50:44.1906056Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1906058Z 2026-10-24T18:50:44.1906204Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1906348Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29] 2026-10-24T18:50:44.1906465Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T18:50:44.1906573Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T18:50:44.1906686Z ·  ─────────────┬──────────── 2026-10-24T18:50:44.1906889Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T18:50:44.1906943Z 163 │ }); 2026-10-24T18:50:44.1906993Z ╰──── 2026-10-24T18:50:44.1907453Z  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-24T18:50:44.1907738Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1907741Z 2026-10-24T18:50:44.1907881Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1908019Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:164:23] 2026-10-24T18:50:44.1908073Z 163 │ }); 2026-10-24T18:50:44.1908165Z 164 │ confirmedTokensRef.current = tokens; 2026-10-24T18:50:44.1908288Z ·  ─────────┬────────────┬─── 2026-10-24T18:50:44.1908470Z · │ ╰── Cannot update ref value during render 2026-10-24T18:50:44.1908590Z · ╰── This value is a ref 2026-10-24T18:50:44.1908662Z 165 │ return JSON.stringify( 2026-10-24T18:50:44.1908712Z ╰──── 2026-10-24T18:50:44.1909196Z  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-24T18:50:44.1909479Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1909481Z 2026-10-24T18:50:44.1909622Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1909761Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:206:5] 2026-10-24T18:50:44.1909883Z 205 │ mostRecentEventCount, 2026-10-24T18:50:44.1909998Z 206 │ nativeEventSnapshotsRef.current, 2026-10-24T18:50:44.1910101Z ·  ───────────────┬─────────────── 2026-10-24T18:50:44.1910284Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T18:50:44.1910336Z 207 │ ); 2026-10-24T18:50:44.1910386Z ╰──── 2026-10-24T18:50:44.1910837Z  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-24T18:50:44.1911121Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1911128Z 2026-10-24T18:50:44.1911269Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1911404Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:212:5] 2026-10-24T18:50:44.1911473Z 211 │ mostRecentEventCount, 2026-10-24T18:50:44.1911558Z 212 │ nativeEventSnapshotsRef.current, 2026-10-24T18:50:44.1911659Z ·  ───────────────┬─────────────── 2026-10-24T18:50:44.1911840Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T18:50:44.1911892Z 213 │ ); 2026-10-24T18:50:44.1911942Z ╰──── 2026-10-24T18:50:44.1912398Z  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-24T18:50:44.1912685Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1912687Z 2026-10-24T18:50:44.1912869Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T18:50:44.1913006Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:197:6] 2026-10-24T18:50:44.1913125Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T18:50:44.1913234Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T18:50:44.1913340Z ·  ─────────┬──────── 2026-10-24T18:50:44.1913801Z · ╰── 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-24T18:50:44.1913858Z 163 │ }); 2026-10-24T18:50:44.1913946Z 164 │ confirmedTokensRef.current = tokens; 2026-10-24T18:50:44.1914013Z 165 │ return JSON.stringify( 2026-10-24T18:50:44.1914174Z 166 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-24T18:50:44.1914239Z 167 │ const record = 2026-10-24T18:50:44.1914317Z 168 │ token.type === "context" 2026-10-24T18:50:44.1914476Z 169 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-24T18:50:44.1914541Z 170 │ : undefined; 2026-10-24T18:50:44.1914647Z 171 │ const presentation = contextChipPresentation( 2026-10-24T18:50:44.1914842Z 172 │ token.type === "context" ? token.kind : token.type, 2026-10-24T18:50:44.1914933Z 173 │ record, 2026-10-24T18:50:44.1914990Z 174 │ ); 2026-10-24T18:50:44.1915073Z 175 │ const icon = contextChipIcon( 2026-10-24T18:50:44.1915138Z 176 │ presentation, 2026-10-24T18:50:44.1915275Z 177 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-24T18:50:44.1915332Z 178 │ ); 2026-10-24T18:50:44.1915391Z 179 │ return { 2026-10-24T18:50:44.1915459Z 180 │ type: token.type, 2026-10-24T18:50:44.1915531Z 181 │ source: token.source, 2026-10-24T18:50:44.1915600Z 182 │ start: token.start, 2026-10-24T18:50:44.1915666Z 183 │ end: token.end, 2026-10-24T18:50:44.1915811Z 184 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-24T18:50:44.1915870Z 185 │ label: 2026-10-24T18:50:44.1915952Z 186 │ token.type === "skill" 2026-10-24T18:50:44.1916060Z 187 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-24T18:50:44.1916140Z 188 │ : token.type === "context" 2026-10-24T18:50:44.1916369Z 189 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-24T18:50:44.1916449Z 190 │ : basename(token.value), 2026-10-24T18:50:44.1916589Z 191 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-24T18:50:44.1916679Z 192 │ iconUri: contextChipIconUri(icon), 2026-10-24T18:50:44.1916762Z 193 │ tintsIcon: icon.kind === "chip", 2026-10-24T18:50:44.1916820Z 194 │ }; 2026-10-24T18:50:44.1916875Z 195 │ }), 2026-10-24T18:50:44.1916928Z 196 │ ); 2026-10-24T18:50:44.1917061Z 197 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-24T18:50:44.1917210Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-24T18:50:44.1917412Z · ╰── This dependency list is missing values used by the callback 2026-10-24T18:50:44.1917548Z 198 │ // Every render resolves against the snapshot history, so a render whose 2026-10-24T18:50:44.1917596Z ╰──── 2026-10-24T18:50:44.1917797Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T18:50:44.1918104Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1918106Z 2026-10-24T18:50:44.1918344Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T18:50:44.1918510Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:259:5] 2026-10-24T18:50:44.1918640Z 251 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-24T18:50:44.1918739Z 252 │ nativeEventSnapshotsRef.current.push({ 2026-10-24T18:50:44.1918861Z ·  ───────────┬─────────── 2026-10-24T18:50:44.1919310Z · ╰── 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-24T18:50:44.1919398Z 253 │ eventCount: acknowledgedEventCount, 2026-10-24T18:50:44.1919458Z 254 │ value, 2026-10-24T18:50:44.1919540Z 255 │ selection: nextSelection, 2026-10-24T18:50:44.1919597Z 256 │ }); 2026-10-24T18:50:44.1919677Z 257 │ return acknowledgedEventCount; 2026-10-24T18:50:44.1919730Z 258 │ }, 2026-10-24T18:50:44.1919783Z 259 │ [], 2026-10-24T18:50:44.1919850Z ·  ─┬ 2026-10-24T18:50:44.1920028Z · ╰── This dependency list is missing values used by the callback 2026-10-24T18:50:44.1920080Z 260 │ ); 2026-10-24T18:50:44.1920130Z ╰──── 2026-10-24T18:50:44.1920330Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T18:50:44.1920633Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1920635Z 2026-10-24T18:50:44.1920807Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T18:50:44.1920947Z ╭─[apps/server/src/process/externalLauncher.test.ts:186:12] 2026-10-24T18:50:44.1920998Z 185 │ 2026-10-24T18:50:44.1921100Z 186 │ for (const {} of ["darwin", "linux"] as const) { 2026-10-24T18:50:44.1921170Z ·  ── 2026-10-24T18:50:44.1921221Z 187 │ } 2026-10-24T18:50:44.1921272Z ╰──── 2026-10-24T18:50:44.1921498Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T18:50:44.1921501Z 2026-10-24T18:50:44.1921663Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T18:50:44.1921798Z ╭─[apps/server/src/process/externalLauncher.test.ts:189:12] 2026-10-24T18:50:44.1921848Z 188 │ 2026-10-24T18:50:44.1921916Z 189 │ for (const {} of [ 2026-10-24T18:50:44.1921987Z ·  ── 2026-10-24T18:50:44.1922073Z 190 │ { kind: "browser", folderVerb: "none" }, 2026-10-24T18:50:44.1922123Z ╰──── 2026-10-24T18:50:44.1922342Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T18:50:44.1922344Z 2026-10-24T18:50:44.1922505Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T18:50:44.1922638Z ╭─[apps/server/src/process/externalLauncher.test.ts:311:12] 2026-10-24T18:50:44.1922691Z 310 │ 2026-10-24T18:50:44.1922816Z 311 │ for (const {} of ["rejected", "spawn-error", "stalled"] as const) { 2026-10-24T18:50:44.1922884Z ·  ── 2026-10-24T18:50:44.1922934Z 312 │ } 2026-10-24T18:50:44.1922984Z ╰──── 2026-10-24T18:50:44.1923252Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T18:50:44.1923284Z 2026-10-24T18:50:44.1923443Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T18:50:44.1923576Z ╭─[apps/server/src/process/externalLauncher.test.ts:314:12] 2026-10-24T18:50:44.1923627Z 313 │ 2026-10-24T18:50:44.1923688Z 314 │ for (const {} of [ 2026-10-24T18:50:44.1923755Z ·  ── 2026-10-24T18:50:44.1923807Z 315 │ { 2026-10-24T18:50:44.1923856Z ╰──── 2026-10-24T18:50:44.1924074Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T18:50:44.1924077Z 2026-10-24T18:50:44.1924226Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1924344Z ╭─[apps/mobile/src/components/ui/Menu.tsx:54:36] 2026-10-24T18:50:44.1924520Z 53 │ const child = children as ReactElement>; 2026-10-24T18:50:44.1924692Z 54 │ ╭─▶ children = cloneElement(child, { 2026-10-24T18:50:44.1924795Z 55 │ │ onTouchStart: (event) => { 2026-10-24T18:50:44.1924950Z 56 │ │ // Reset for a new touch, not onPressIn, which also fires when a 2026-10-24T18:50:44.1925104Z 57 │ │ // finger moves out of the row and back during the same gesture. 2026-10-24T18:50:44.1925227Z 58 │ │ menuPress.current.isPreparing = false; 2026-10-24T18:50:44.1925395Z 59 │ │ menuPress.current.suppressPress = menuPress.current.isOpen; 2026-10-24T18:50:44.1925507Z 60 │ │ pendingPress.current = null; 2026-10-24T18:50:44.1925624Z 61 │ │ child.props.onTouchStart?.(event); 2026-10-24T18:50:44.1925697Z 62 │ │ }, 2026-10-24T18:50:44.1925796Z 63 │ │ onPress: (event) => { 2026-10-24T18:50:44.1925962Z 64 │ │ // Accessibility clicks have no touch identifier and must not inherit 2026-10-24T18:50:44.1926094Z 65 │ │ // cancellation from a previous physical gesture. 2026-10-24T18:50:44.1926256Z 66 │ │ const isTouch = typeof event.nativeEvent.identifier === "number"; 2026-10-24T18:50:44.1926440Z 67 │ │ if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) { 2026-10-24T18:50:44.1926529Z 68 │ │ return; 2026-10-24T18:50:44.1926606Z 69 │ │ } 2026-10-24T18:50:44.1926746Z 70 │ │ if (isTouch && menuPress.current.isPreparing) { 2026-10-24T18:50:44.1926911Z 71 │ │ // A release can arrive between native menu preparation and display. 2026-10-24T18:50:44.1927075Z 72 │ │ // Let UIKit's display/cancel callback decide this press's outcome. 2026-10-24T18:50:44.1927173Z 73 │ │ event.persist(); 2026-10-24T18:50:44.1927329Z 74 │ │ pendingPress.current = () => child.props.onPress?.(event); 2026-10-24T18:50:44.1927411Z 75 │ │ return; 2026-10-24T18:50:44.1927489Z 76 │ │ } 2026-10-24T18:50:44.1927650Z 77 │ │ child.props.onPress?.(event); 2026-10-24T18:50:44.1927751Z 78 │ │ }, 2026-10-24T18:50:44.1927878Z 79 │ ├─▶ }); 2026-10-24T18:50:44.1928109Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T18:50:44.1928209Z 80 │ menuProps.onMenuInteractionStart = () => { 2026-10-24T18:50:44.1928260Z ╰──── 2026-10-24T18:50:44.1928716Z  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-24T18:50:44.1929039Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1929044Z 2026-10-24T18:50:44.1929408Z ⚠ 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-24T18:50:44.1929532Z ╭─[apps/server/src/assets/AssetAccess.test.ts:975:35] 2026-10-24T18:50:44.1929680Z 974 │ // Every client and server release spells the resource this way on the wire. 2026-10-24T18:50:44.1929831Z 975 │ const { resource } = yield* Schema.decodeUnknownEffect(AssetCreateUrlInput)({ 2026-10-24T18:50:44.1929953Z ·  ────────────────────────── 2026-10-24T18:50:44.1930067Z 976 │ resource: { _tag: "github-media", cwd: "/repo", url }, 2026-10-24T18:50:44.1930117Z ╰──── 2026-10-24T18:50:44.1930119Z 2026-10-24T18:50:44.1930564Z ⚠ 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-24T18:50:44.1930692Z ╭─[apps/server/src/assets/AssetAccess.test.ts:1012:32] 2026-10-24T18:50:44.1930827Z 1011 │ expect(error._tag).toBe("AssetGitHubMediaUrlValidationError"); 2026-10-24T18:50:44.1931011Z 1012 │ const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(AssetAccessError))(error); 2026-10-24T18:50:44.1931167Z ·  ─────────────────── 2026-10-24T18:50:44.1931259Z 1013 │ expect(encoded).not.toContain(url); 2026-10-24T18:50:44.1931310Z ╰──── 2026-10-24T18:50:44.1931313Z 2026-10-24T18:50:44.1931508Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T18:50:44.1931653Z ╭─[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9] 2026-10-24T18:50:44.1931737Z 35 │ { 2026-10-24T18:50:44.1933145Z 57 │ if (pulse) { 2026-10-24T18:50:44.1933228Z 58 │ pulseProgress.value = withRepeat( 2026-10-24T18:50:44.1933303Z ·  ──────┬────── 2026-10-24T18:50:44.1933442Z · ╰── `pulseProgress` cannot be modified 2026-10-24T18:50:44.1933508Z 59 │ withTiming(1, { 2026-10-24T18:50:44.1933557Z ╰──── 2026-10-24T18:50:44.1933825Z  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-24T18:50:44.1934127Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T18:50:44.1934130Z 2026-10-24T18:50:44.1934319Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T18:50:44.1934472Z ╭─[apps/mobile/src/features/terminal/TerminalContextSheet.tsx:72:15] 2026-10-24T18:50:44.1934537Z 71 │ cancelAnimationFrame(frame); 2026-10-24T18:50:44.1935507Z 114 │ }, [restoreSearch, tabActive, bottomSearch]); 2026-10-24T18:50:44.1935611Z ·  ──────┬───── 2026-10-24T18:50:44.1935780Z · ╰── Unnecessary dependency `bottomSearch` 2026-10-24T18:50:44.1935882Z 115 │ const composeButton = nativeToolbarCompose ? ( 2026-10-24T18:50:44.1935931Z ╰──── 2026-10-24T18:50:44.1936223Z  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-24T18:50:44.1936527Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1936530Z 2026-10-24T18:50:44.1936670Z ⚠ react(refs): Cannot access refs during render 2026-10-24T18:50:44.1936822Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39] 2026-10-24T18:50:44.1936874Z 276 │ 2026-10-24T18:50:44.1937051Z 277 │ ╭─▶ return createElement(RawNativeView, { 2026-10-24T18:50:44.1937142Z 278 │ │ ...nativeProps, 2026-10-24T18:50:44.1937282Z 279 │ │ refreshEnabled: props.onPullToRefresh !== undefined, 2026-10-24T18:50:44.1937423Z 280 │ │ ref: nativeRef, 2026-10-24T18:50:44.1937585Z 281 │ ├─▶ }); 2026-10-24T18:50:44.1937816Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T18:50:44.1937871Z 282 │ } 2026-10-24T18:50:44.1937921Z ╰──── 2026-10-24T18:50:44.1938377Z  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-24T18:50:44.1938663Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T18:50:44.1938665Z 2026-10-24T18:50:44.1938873Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T18:50:44.1939017Z ╭─[apps/web/src/components/chat/useThreadLifecycle.tsx:178:58] 2026-10-24T18:50:44.1939124Z 177 │ if (snoozeClockState.shell !== activeThreadShell) { 2026-10-24T18:50:44.1939289Z 178 │ setSnoozeClockState({ shell: activeThreadShell, now: new Date().toISOString() }); 2026-10-24T18:50:44.1939409Z ·  ─────┬──── 2026-10-24T18:50:44.1939574Z · ╰── Cannot call impure function 2026-10-24T18:50:44.1939626Z 179 │ } 2026-10-24T18:50:44.1939675Z ╰──── 2026-10-24T18:50:44.1939953Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T18:50:44.1940242Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T18:50:44.1940244Z 2026-10-24T18:50:44.1940405Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T18:50:44.1940532Z ╭─[apps/web/src/components/CommandPalette.tsx:2037:20] 2026-10-24T18:50:44.1940649Z 2036 │ title: inferProjectTitleFromPath(destinationPath), 2026-10-24T18:50:44.1940739Z 2037 │ createdAt: new Date().toISOString(), 2026-10-24T18:50:44.1940827Z ·  ─────┬──── 2026-10-24T18:50:44.1940967Z · ╰── Cannot call impure function 2026-10-24T18:50:44.1941073Z 2038 │ remoteUrl: addProjectCloneFlow.remoteUrl, 2026-10-24T18:50:44.1941177Z ╰──── 2026-10-24T18:50:44.1941475Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T18:50:44.1941760Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T18:50:44.1941763Z 2026-10-24T18:50:44.1941924Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T18:50:44.1942041Z ╭─[apps/server/src/processRunner.test.ts:266:14] 2026-10-24T18:50:44.1942094Z 265 │ 2026-10-24T18:50:44.1942195Z 266 │ for (const {} of ["timeout", "success"] as const) { 2026-10-24T18:50:44.1942265Z ·  ── 2026-10-24T18:50:44.1942316Z 267 │ } 2026-10-24T18:50:44.1942365Z ╰──── 2026-10-24T18:50:44.1942594Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T18:50:44.1942598Z 2026-10-24T18:50:44.1942827Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-24T18:50:44.1942959Z ╭─[apps/web/src/components/chat/useComposerSend.ts:985:13] 2026-10-24T18:50:44.1943079Z 984 │ const changedBeforeDecline = draftChangedSinceSend(); 2026-10-24T18:50:44.1943314Z 985 │ ╭─▶ const pendingIdsBeforeDecline = pendingApprovalsRef.current.map( 2026-10-24T18:50:44.1943433Z 986 │ │ (approval) => approval.requestId, 2026-10-24T18:50:44.1943573Z 987 │ ╰─▶ ); 2026-10-24T18:50:44.1943712Z 988 │ const approvalResponding = approvalsToDecline.some((approval) => 2026-10-24T18:50:44.1943764Z ╰──── 2026-10-24T18:50:44.1943839Z  help: Switch to `Set` 2026-10-24T18:50:44.1943841Z 2026-10-24T18:50:44.1944019Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T18:50:44.1944199Z ╭─[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:116:34] 2026-10-24T18:50:44.1944265Z 115 │ return [...commands]; 2026-10-24T18:50:44.1944394Z 116 │ }, [activeThreadRef, pathname, registrationVersion, navigation]); 2026-10-24T18:50:44.1944507Z ·  ─────────┬───────── 2026-10-24T18:50:44.1944690Z · ╰── Unnecessary dependency `registrationVersion` 2026-10-24T18:50:44.1944746Z 117 │ 2026-10-24T18:50:44.1944798Z ╰──── 2026-10-24T18:50:44.1945104Z  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-24T18:50:44.1945408Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1945411Z 2026-10-24T18:50:44.1945664Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T18:50:44.1945831Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:123:7] 2026-10-24T18:50:44.1945885Z 118 │ 2026-10-24T18:50:44.1945950Z 119 │ useEffect(() => { 2026-10-24T18:50:44.1946067Z ·  ────┬──── 2026-10-24T18:50:44.1946233Z · ╰── This is the containing effect 2026-10-24T18:50:44.1946317Z 120 │ if (orientationSettled) return; 2026-10-24T18:50:44.1946427Z 121 │ const orientation = getNativeShowcaseOrientation(); 2026-10-24T18:50:44.1946499Z 122 │ if (orientation === null) { 2026-10-24T18:50:44.1946578Z 123 │ setOrientationSettled(true); 2026-10-24T18:50:44.1946666Z ·  ──────────┬────────── 2026-10-24T18:50:44.1946836Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1946897Z 124 │ return; 2026-10-24T18:50:44.1946946Z ╰──── 2026-10-24T18:50:44.1947538Z  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-24T18:50:44.1947854Z  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-24T18:50:44.1947856Z 2026-10-24T18:50:44.1948107Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T18:50:44.1948275Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:304:7] 2026-10-24T18:50:44.1948324Z 292 │ 2026-10-24T18:50:44.1948388Z 293 │ useEffect(() => { 2026-10-24T18:50:44.1948457Z ·  ────┬──── 2026-10-24T18:50:44.1948588Z · ╰── This is the containing effect 2026-10-24T18:50:44.1948645Z 294 │ if ( 2026-10-24T18:50:44.1948709Z 295 │ scene === null || 2026-10-24T18:50:44.1948835Z 296 │ requestedScene === null || 2026-10-24T18:50:44.1948910Z 297 │ scene !== requestedScene || 2026-10-24T18:50:44.1948972Z 298 │ !hasFixture || 2026-10-24T18:50:44.1949043Z 299 │ !orientationSettled || 2026-10-24T18:50:44.1949108Z 300 │ !themeApplied || 2026-10-24T18:50:44.1949221Z 301 │ (scene === "agent-activity" && !agentActivityStaged) || 2026-10-24T18:50:44.1949352Z 302 │ !isShowcaseNativeContentReady({ scene, themeId, renderSignal }) 2026-10-24T18:50:44.1949406Z 303 │ ) { 2026-10-24T18:50:44.1949473Z 304 │ setReadyScene(null); 2026-10-24T18:50:44.1949549Z ·  ──────┬────── 2026-10-24T18:50:44.1949722Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1949784Z 305 │ return; 2026-10-24T18:50:44.1949833Z ╰──── 2026-10-24T18:50:44.1950412Z  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-24T18:50:44.1950725Z  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-24T18:50:44.1950727Z 2026-10-24T18:50:44.1950992Z ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'. 2026-10-24T18:50:44.1951217Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:128:9] 2026-10-24T18:50:44.1951321Z 127 │ let cancelled = false; 2026-10-24T18:50:44.1951408Z 128 │ let lastOutcome: string | null = null; 2026-10-24T18:50:44.1951484Z ·  ─────┬───── 2026-10-24T18:50:44.1951616Z · ╰── 'lastOutcome' is declared here 2026-10-24T18:50:44.1951789Z 129 │ void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), { 2026-10-24T18:50:44.1951837Z ╰──── 2026-10-24T18:50:44.1951940Z  help: Consider removing this declaration. 2026-10-24T18:50:44.1951942Z 2026-10-24T18:50:44.1952193Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T18:50:44.1952353Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:40:5] 2026-10-24T18:50:44.1952464Z 37 │ const [initialized, setInitialized] = useState(false); 2026-10-24T18:50:44.1952531Z 38 │ useLayoutEffect(() => { 2026-10-24T18:50:44.1952606Z ·  ───────┬─────── 2026-10-24T18:50:44.1952736Z · ╰── This is the containing effect 2026-10-24T18:50:44.1952795Z 39 │ reset(); 2026-10-24T18:50:44.1952860Z 40 │ setInitialized(true); 2026-10-24T18:50:44.1952934Z ·  ───────┬────── 2026-10-24T18:50:44.1953099Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1953157Z 41 │ }, [reset]); 2026-10-24T18:50:44.1953205Z ╰──── 2026-10-24T18:50:44.1953790Z  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-24T18:50:44.1954106Z  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-24T18:50:44.1954109Z 2026-10-24T18:50:44.1954358Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T18:50:44.1954512Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:93:5] 2026-10-24T18:50:44.1954562Z 88 │ 2026-10-24T18:50:44.1954625Z 89 │ useEffect(() => { 2026-10-24T18:50:44.1954693Z ·  ────┬──── 2026-10-24T18:50:44.1954823Z · ╰── This is the containing effect 2026-10-24T18:50:44.1954980Z 90 │ if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return; 2026-10-24T18:50:44.1955080Z 91 │ const branchName = initialProjectRef.branch; 2026-10-24T18:50:44.1955144Z 92 │ let active = true; 2026-10-24T18:50:44.1955236Z 93 │ setPendingCheckouts((count) => count + 1); 2026-10-24T18:50:44.1955318Z ·  ─────────┬───────── 2026-10-24T18:50:44.1955485Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1955635Z 94 │ // Serialize replacements: ignoring a stale result cannot undo its Git mutation. 2026-10-24T18:50:44.1955683Z ╰──── 2026-10-24T18:50:44.1956315Z  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-24T18:50:44.1956658Z  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-24T18:50:44.1956660Z 2026-10-24T18:50:44.1956824Z ⚠ eslint(no-control-regex): Unexpected control character 2026-10-24T18:50:44.1957011Z ╭─[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46] 2026-10-24T18:50:44.1957148Z 219 │ 2026-10-24T18:50:44.1957285Z 220 │ {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")} 2026-10-24T18:50:44.1957396Z ·  ──┬─ 2026-10-24T18:50:44.1957559Z · ╰── 'U+001B' is a control character. 2026-10-24T18:50:44.1957624Z 221 │ 2026-10-24T18:50:44.1957673Z ╰──── 2026-10-24T18:50:44.1957898Z  help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression. 2026-10-24T18:50:44.1957900Z 2026-10-24T18:50:44.1958076Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T18:50:44.1958233Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:100:85] 2026-10-24T18:50:44.1958331Z  99 │ const startEditor = startScheduledTaskEditor; 2026-10-24T18:50:44.1958514Z 100 │ const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]); 2026-10-24T18:50:44.1958660Z ·  ─────┬───── 2026-10-24T18:50:44.1958889Z · ╰── Unnecessary dependency `startEditor` 2026-10-24T18:50:44.1958966Z 101 │ const readEditor = useCallback( 2026-10-24T18:50:44.1959016Z ╰──── 2026-10-24T18:50:44.1959322Z  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-24T18:50:44.1959627Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1959629Z 2026-10-24T18:50:44.1959809Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T18:50:44.1959965Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:121:7] 2026-10-24T18:50:44.1960028Z 120 │ setEditor, 2026-10-24T18:50:44.1960091Z 121 │ startEditor, 2026-10-24T18:50:44.1960165Z ·  ─────┬───── 2026-10-24T18:50:44.1960304Z · ╰── Unnecessary dependency `startEditor` 2026-10-24T18:50:44.1960366Z 122 │ hasChanges, 2026-10-24T18:50:44.1960415Z ╰──── 2026-10-24T18:50:44.1960719Z  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-24T18:50:44.1961072Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1961106Z 2026-10-24T18:50:44.1961301Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T18:50:44.1961447Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7] 2026-10-24T18:50:44.1961541Z 256 │ return () => cancelAnimationFrame(frame); 2026-10-24T18:50:44.1961621Z 257 │ }, [props.path, targetIndex]); 2026-10-24T18:50:44.1961694Z ·  ─────┬──── 2026-10-24T18:50:44.1961833Z · ╰── Unnecessary dependency `props.path` 2026-10-24T18:50:44.1961886Z 258 │ 2026-10-24T18:50:44.1961934Z ╰──── 2026-10-24T18:50:44.1962225Z  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-24T18:50:44.1962528Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1962530Z 2026-10-24T18:50:44.1962717Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T18:50:44.1962861Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23] 2026-10-24T18:50:44.1962932Z 292 │ 2026-10-24T18:50:44.1963990Z ·  ─────────── 2026-10-24T18:50:44.1964054Z 310 │ {body} 2026-10-24T18:50:44.1964102Z ╰──── 2026-10-24T18:50:44.1964244Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T18:50:44.1964247Z 2026-10-24T18:50:44.1964499Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T18:50:44.1964641Z ╭─[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5] 2026-10-24T18:50:44.1964693Z 150 │ 2026-10-24T18:50:44.1964759Z 151 │ useEffect(() => { 2026-10-24T18:50:44.1964828Z ·  ────┬──── 2026-10-24T18:50:44.1964955Z · ╰── This is the containing effect 2026-10-24T18:50:44.1965035Z 152 │ if (!controlledSelectedPath) { 2026-10-24T18:50:44.1965094Z 153 │ return; 2026-10-24T18:50:44.1965148Z 154 │ } 2026-10-24T18:50:44.1965228Z 155 │ setExpandedPaths((current) => { 2026-10-24T18:50:44.1965304Z ·  ────────┬─────── 2026-10-24T18:50:44.1965470Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1965591Z 156 │ const ancestors = ancestorPaths(controlledSelectedPath); 2026-10-24T18:50:44.1965696Z ╰──── 2026-10-24T18:50:44.1966308Z  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-24T18:50:44.1966621Z  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-24T18:50:44.1966624Z 2026-10-24T18:50:44.1966875Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T18:50:44.1967023Z ╭─[apps/mobile/src/features/threads/use-worktree-setup.ts:30:40] 2026-10-24T18:50:44.1967186Z 28 │ const snapshot = resolveWorktreeSetupSnapshot(input.threadId, query.data, live); 2026-10-24T18:50:44.1967250Z 29 │ useEffect(() => { 2026-10-24T18:50:44.1967318Z ·  ────┬──── 2026-10-24T18:50:44.1967443Z · ╰── This is the containing effect 2026-10-24T18:50:44.1967565Z 30 │ if (snapshot && snapshot !== live) setHeld({ key, snapshot }); 2026-10-24T18:50:44.1967666Z ·  ───┬─── 2026-10-24T18:50:44.1967852Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1967922Z 31 │ }, [key, live, snapshot]); 2026-10-24T18:50:44.1967971Z ╰──── 2026-10-24T18:50:44.1968555Z  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-24T18:50:44.1968907Z  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-24T18:50:44.1968910Z 2026-10-24T18:50:44.1969089Z ⚠ eslint(no-unused-vars): Type 'Scope' is imported but never used. 2026-10-24T18:50:44.1969222Z ╭─[apps/server/src/provider/ProviderAuthService.ts:15:18] 2026-10-24T18:50:44.1969306Z 14 │ import * as Layer from "effect/Layer"; 2026-10-24T18:50:44.1969396Z 15 │ import type * as Scope from "effect/Scope"; 2026-10-24T18:50:44.1969473Z ·  ──┬── 2026-10-24T18:50:44.1969657Z · ╰── 'Scope' is imported here 2026-10-24T18:50:44.1969771Z 16 │ import * as Stream from "effect/Stream"; 2026-10-24T18:50:44.1969821Z ╰──── 2026-10-24T18:50:44.1969915Z  help: Consider removing this import. 2026-10-24T18:50:44.1969918Z 2026-10-24T18:50:44.1970073Z ⚠ react(immutability): This value cannot be modified 2026-10-24T18:50:44.1970226Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-24T18:50:44.1970276Z 83 │ 2026-10-24T18:50:44.1970365Z 84 │ const cardCoverage = props.cardCoverage; 2026-10-24T18:50:44.1970443Z ·  ──────┬───── 2026-10-24T18:50:44.1970575Z · ╰── `cardCoverage` originates here 2026-10-24T18:50:44.1970651Z 85 │ const barHeightRef = useRef(0); 2026-10-24T18:50:44.1970733Z 86 │ const cardHeightRef = useRef(0); 2026-10-24T18:50:44.1970818Z 87 │ const cardHeight = useSharedValue(0); 2026-10-24T18:50:44.1970907Z 88 │ const notifyCoverage = useCallback(() => { 2026-10-24T18:50:44.1970972Z 89 │ if (!cardCoverage) { 2026-10-24T18:50:44.1971030Z 90 │ return; 2026-10-24T18:50:44.1971143Z 91 │ } 2026-10-24T18:50:44.1971331Z 92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-24T18:50:44.1971429Z 93 │ // feed inset and floating controls trailing it. 2026-10-24T18:50:44.1971590Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T18:50:44.1971665Z ·  ──────┬───── 2026-10-24T18:50:44.1971870Z · ╰── `cardCoverage` cannot be modified 2026-10-24T18:50:44.1971966Z 95 │ }, [cardCoverage]); 2026-10-24T18:50:44.1972055Z ╰──── 2026-10-24T18:50:44.1972357Z  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-24T18:50:44.1972658Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T18:50:44.1972661Z 2026-10-24T18:50:44.1972814Z ⚠ react(immutability): This value cannot be modified 2026-10-24T18:50:44.1972965Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:106:7] 2026-10-24T18:50:44.1973045Z  86 │ const cardHeightRef = useRef(0); 2026-10-24T18:50:44.1973129Z  87 │ const cardHeight = useSharedValue(0); 2026-10-24T18:50:44.1973205Z ·  ─────┬──── 2026-10-24T18:50:44.1973342Z · ╰── `cardHeight` originates here 2026-10-24T18:50:44.1973435Z  88 │ const notifyCoverage = useCallback(() => { 2026-10-24T18:50:44.1973504Z  89 │ if (!cardCoverage) { 2026-10-24T18:50:44.1973561Z  90 │ return; 2026-10-24T18:50:44.1973617Z  91 │ } 2026-10-24T18:50:44.1975836Z  92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-24T18:50:44.1975951Z  93 │ // feed inset and floating controls trailing it. 2026-10-24T18:50:44.1976111Z  94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T18:50:44.1976176Z  95 │ }, [cardCoverage]); 2026-10-24T18:50:44.1976259Z  96 │ const handleBarLayout = useCallback( 2026-10-24T18:50:44.1976338Z  97 │ (event: LayoutChangeEvent) => { 2026-10-24T18:50:44.1976554Z  98 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T18:50:44.1976663Z  99 │ notifyCoverage(); 2026-10-24T18:50:44.1976727Z 100 │ }, 2026-10-24T18:50:44.1976793Z 101 │ [notifyCoverage], 2026-10-24T18:50:44.1976845Z 102 │ ); 2026-10-24T18:50:44.1976929Z 103 │ const handleCardLayout = useCallback( 2026-10-24T18:50:44.1977007Z 104 │ (event: LayoutChangeEvent) => { 2026-10-24T18:50:44.1977132Z 105 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T18:50:44.1977242Z 106 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-24T18:50:44.1977317Z ·  ─────┬──── 2026-10-24T18:50:44.1977454Z · ╰── `cardHeight` cannot be modified 2026-10-24T18:50:44.1977521Z 107 │ notifyCoverage(); 2026-10-24T18:50:44.1977571Z ╰──── 2026-10-24T18:50:44.1977842Z  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-24T18:50:44.1978145Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T18:50:44.1978148Z 2026-10-24T18:50:44.1978348Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T18:50:44.1978499Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-24T18:50:44.1978582Z 87 │ const cardHeight = useSharedValue(0); 2026-10-24T18:50:44.1978671Z 88 │ const notifyCoverage = useCallback(() => { 2026-10-24T18:50:44.1978830Z ·  ───┬─── 2026-10-24T18:50:44.1979069Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-24T18:50:44.1979136Z 89 │ if (!cardCoverage) { 2026-10-24T18:50:44.1979194Z 90 │ return; 2026-10-24T18:50:44.1979245Z 91 │ } 2026-10-24T18:50:44.1979406Z 92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-24T18:50:44.1979507Z 93 │ // feed inset and floating controls trailing it. 2026-10-24T18:50:44.1979662Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T18:50:44.1979734Z ·  ──────┬───── 2026-10-24T18:50:44.1979862Z · ╰── This modifies `cardCoverage` 2026-10-24T18:50:44.1979926Z 95 │ }, [cardCoverage]); 2026-10-24T18:50:44.1979975Z ╰──── 2026-10-24T18:50:44.1980316Z  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-24T18:50:44.1980615Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T18:50:44.1980618Z 2026-10-24T18:50:44.1980812Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T18:50:44.1980964Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-24T18:50:44.1981062Z 93 │ // feed inset and floating controls trailing it. 2026-10-24T18:50:44.1981215Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T18:50:44.1981288Z ·  ──────┬───── 2026-10-24T18:50:44.1981466Z · ╰── This modifies `cardCoverage` 2026-10-24T18:50:44.1981561Z 95 │ }, [cardCoverage]); 2026-10-24T18:50:44.1981644Z 96 │ const handleBarLayout = useCallback( 2026-10-24T18:50:44.1981722Z 97 │ (event: LayoutChangeEvent) => { 2026-10-24T18:50:44.1981824Z ·  ───────────────┬─────────────── 2026-10-24T18:50:44.1982040Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-24T18:50:44.1982161Z 98 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T18:50:44.1982211Z ╰──── 2026-10-24T18:50:44.1982631Z  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-24T18:50:44.1982998Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T18:50:44.1983004Z 2026-10-24T18:50:44.1983198Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T18:50:44.1983351Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:106:7] 2026-10-24T18:50:44.1983437Z 103 │ const handleCardLayout = useCallback( 2026-10-24T18:50:44.1983517Z 104 │ (event: LayoutChangeEvent) => { 2026-10-24T18:50:44.1983619Z ·  ───────────────┬─────────────── 2026-10-24T18:50:44.1983833Z · ╰── This function may (indirectly) reassign or modify `cardHeight` after render 2026-10-24T18:50:44.1983958Z 105 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T18:50:44.1984074Z 106 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-24T18:50:44.1984149Z ·  ─────┬──── 2026-10-24T18:50:44.1984275Z · ╰── This modifies `cardHeight` 2026-10-24T18:50:44.1984342Z 107 │ notifyCoverage(); 2026-10-24T18:50:44.1984392Z ╰──── 2026-10-24T18:50:44.1984718Z  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-24T18:50:44.1985012Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T18:50:44.1985014Z 2026-10-24T18:50:44.1985268Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T18:50:44.1985442Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:333:7] 2026-10-24T18:50:44.1985499Z 328 │ }; 2026-10-24T18:50:44.1985564Z 329 │ useEffect(() => { 2026-10-24T18:50:44.1985634Z ·  ────┬──── 2026-10-24T18:50:44.1985761Z · ╰── This is the containing effect 2026-10-24T18:50:44.1985859Z 330 │ if (!guidesEnabled && section === "guide") { 2026-10-24T18:50:44.1985950Z 331 │ requestedSection.current = "overview"; 2026-10-24T18:50:44.1986117Z 332 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-24T18:50:44.1986188Z 333 │ setSection("overview"); 2026-10-24T18:50:44.1986260Z ·  ─────┬──── 2026-10-24T18:50:44.1986425Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1986539Z 334 │ } 2026-10-24T18:50:44.1986620Z ╰──── 2026-10-24T18:50:44.1987212Z  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-24T18:50:44.1987524Z  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-24T18:50:44.1987528Z 2026-10-24T18:50:44.1987727Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T18:50:44.1987894Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:335:6] 2026-10-24T18:50:44.1987993Z 330 │ if (!guidesEnabled && section === "guide") { 2026-10-24T18:50:44.1988086Z 331 │ requestedSection.current = "overview"; 2026-10-24T18:50:44.1988166Z ·  ────────┬─────── 2026-10-24T18:50:44.1988603Z · ╰── 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-24T18:50:44.1988799Z 332 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-24T18:50:44.1988956Z ·  ─────────┬───────── ──────┬────── 2026-10-24T18:50:44.1989444Z · │ ╰── 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-24T18:50:44.1989885Z · ╰── 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-24T18:50:44.1989959Z 333 │ setSection("overview"); 2026-10-24T18:50:44.1990013Z 334 │ } 2026-10-24T18:50:44.1990103Z 335 │ }, [guidesEnabled, section, insets.top]); 2026-10-24T18:50:44.1990212Z ·  ──────────────────┬───────────────── 2026-10-24T18:50:44.1990400Z · ╰── This dependency list is missing values used by the callback 2026-10-24T18:50:44.1990489Z 336 │ const tabContent = activityContent; 2026-10-24T18:50:44.1990542Z ╰──── 2026-10-24T18:50:44.1990705Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T18:50:44.1991015Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1991018Z 2026-10-24T18:50:44.1991216Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T18:50:44.1991381Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:877:6] 2026-10-24T18:50:44.1991439Z 860 │ if ( 2026-10-24T18:50:44.1991551Z 861 │ lastSelection.current.path === route.params.path && 2026-10-24T18:50:44.1991628Z ·  ──────┬────── 2026-10-24T18:50:44.1992141Z · ╰── 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-24T18:50:44.1992295Z 862 │ lastSelection.current.id === route.params.fileSelectionId 2026-10-24T18:50:44.1992346Z 863 │ ) 2026-10-24T18:50:44.1992408Z 864 │ return; 2026-10-24T18:50:44.1992579Z 865 │ lastSelection.current = { path: route.params.path, id: route.params.fileSelectionId }; 2026-10-24T18:50:44.1992713Z 866 │ if (route.params.focus) navigation.setParams({ focus: undefined }); 2026-10-24T18:50:44.1992796Z 867 │ setJumpPath(route.params.path); 2026-10-24T18:50:44.1992871Z 868 │ setSelectedRowId(null); 2026-10-24T18:50:44.1992949Z 869 │ jumpStarted.current = false; 2026-10-24T18:50:44.1993101Z 870 │ const file = data.files.find((entry) => entry.path === route.params.path); 2026-10-24T18:50:44.1993193Z 871 │ if (!file || !nativeView.current) return; 2026-10-24T18:50:44.1993281Z ·  ─────┬──── 2026-10-24T18:50:44.1993706Z · ╰── 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-24T18:50:44.1993829Z 872 │ setCollapsedIds((ids) => ids.filter((id) => id !== file.id)); 2026-10-24T18:50:44.1993903Z 873 │ jumpStarted.current = true; 2026-10-24T18:50:44.1994035Z 874 │ void nativeView.current.scrollToFile(file.id, false).catch(() => { 2026-10-24T18:50:44.1994113Z 875 │ jumpStarted.current = false; 2026-10-24T18:50:44.1994167Z 876 │ }); 2026-10-24T18:50:44.1994364Z 877 │ }, [route.params.path, route.params.fileSelectionId, route.params.focus, data.files, navigation]); 2026-10-24T18:50:44.1994564Z ·  ──────────────────────────────────────────────┬────────────────────────────────────────────── 2026-10-24T18:50:44.1994779Z · ╰── This dependency list is missing values used by the callback 2026-10-24T18:50:44.1994886Z 878 │ const appliedFilter = useRef(filter.hideTestFiles); 2026-10-24T18:50:44.1994936Z ╰──── 2026-10-24T18:50:44.1995101Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T18:50:44.1995406Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.1995408Z 2026-10-24T18:50:44.1995712Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T18:50:44.1995925Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:119:10] 2026-10-24T18:50:44.1995977Z 117 │ 2026-10-24T18:50:44.1996040Z 118 │ useEffect(() => { 2026-10-24T18:50:44.1996111Z ·  ────┬──── 2026-10-24T18:50:44.1996239Z · ╰── This is the containing effect 2026-10-24T18:50:44.1996316Z 119 │ void refreshNotifications(); 2026-10-24T18:50:44.1996409Z ·  ──────────┬───────── 2026-10-24T18:50:44.1996581Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1996719Z 120 │ const subscription = AppState.addEventListener("change", (state) => { 2026-10-24T18:50:44.1996768Z ╰──── 2026-10-24T18:50:44.1997356Z  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-24T18:50:44.1997674Z  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-24T18:50:44.1997677Z 2026-10-24T18:50:44.1997929Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T18:50:44.1998110Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7] 2026-10-24T18:50:44.1998161Z 125 │ 2026-10-24T18:50:44.1998230Z 126 │ useEffect(() => { 2026-10-24T18:50:44.1998300Z ·  ────┬──── 2026-10-24T18:50:44.1998427Z · ╰── This is the containing effect 2026-10-24T18:50:44.1998490Z 127 │ if (!isLoaded) { 2026-10-24T18:50:44.1998578Z 128 │ setLiveActivityStatus("checking"); 2026-10-24T18:50:44.1998666Z ·  ──────────┬────────── 2026-10-24T18:50:44.1998879Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.1998937Z 129 │ return; 2026-10-24T18:50:44.1998987Z ╰──── 2026-10-24T18:50:44.1999569Z  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-24T18:50:44.1999883Z  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-24T18:50:44.1999885Z 2026-10-24T18:50:44.2000135Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T18:50:44.2000266Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2146:5] 2026-10-24T18:50:44.2000320Z 2144 │ ); 2026-10-24T18:50:44.2000386Z 2145 │ useEffect(() => { 2026-10-24T18:50:44.2000457Z ·  ────┬──── 2026-10-24T18:50:44.2000583Z · ╰── This is the containing effect 2026-10-24T18:50:44.2000656Z 2146 │ setExpandedVideo(null); 2026-10-24T18:50:44.2000795Z ·  ────────┬─────── 2026-10-24T18:50:44.2000992Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.2001062Z 2147 │ setExpandedFile(null); 2026-10-24T18:50:44.2001113Z ╰──── 2026-10-24T18:50:44.2001698Z  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-24T18:50:44.2002010Z  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-24T18:50:44.2002013Z 2026-10-24T18:50:44.2002265Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T18:50:44.2002397Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2647:9] 2026-10-24T18:50:44.2002533Z 2638 │ const stopFollowingEnd = useEffectEvent(() => setEndFollow(false)); 2026-10-24T18:50:44.2002599Z 2639 │ useEffect(() => { 2026-10-24T18:50:44.2002670Z ·  ────┬──── 2026-10-24T18:50:44.2002794Z · ╰── This is the containing effect 2026-10-24T18:50:44.2002922Z 2640 │ if (!jumpToMessageId || loadedListKey !== listMountKey) return; 2026-10-24T18:50:44.2003016Z 2641 │ const index = presentedFeed.findIndex( 2026-10-24T18:50:44.2003146Z 2642 │ (entry) => entry.type === "message" && entry.id === jumpToMessageId, 2026-10-24T18:50:44.2003200Z 2643 │ ); 2026-10-24T18:50:44.2003272Z 2644 │ if (index === -1) { 2026-10-24T18:50:44.2003401Z 2645 │ const runId = messageFoldRunId(props.feed, jumpToMessageId); 2026-10-24T18:50:44.2003502Z 2646 │ if (runId && !expandedTurnIds.has(runId)) { 2026-10-24T18:50:44.2003592Z 2647 │ setInteractionState((current) => ({ 2026-10-24T18:50:44.2003680Z ·  ─────────┬───────── 2026-10-24T18:50:44.2003852Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T18:50:44.2003918Z 2648 │ ...current, 2026-10-24T18:50:44.2003968Z ╰──── 2026-10-24T18:50:44.2004559Z  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-24T18:50:44.2004876Z  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-24T18:50:44.2004878Z 2026-10-24T18:50:44.2005102Z ⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used. 2026-10-24T18:50:44.2005232Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:66:10] 2026-10-24T18:50:44.2005365Z 65 │ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets"; 2026-10-24T18:50:44.2005502Z 66 │ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks"; 2026-10-24T18:50:44.2005595Z ·  ───────────┬─────────── 2026-10-24T18:50:44.2005811Z · ╰── 'isMarkdownFileLinkLabel' is imported here 2026-10-24T18:50:44.2005998Z 67 │ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments"; 2026-10-24T18:50:44.2006048Z ╰──── 2026-10-24T18:50:44.2006146Z  help: Consider removing this import. 2026-10-24T18:50:44.2006148Z 2026-10-24T18:50:44.2006351Z ⚠ eslint(no-unused-vars): Identifier 'createContext' is imported but never used. 2026-10-24T18:50:44.2006479Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:92:3] 2026-10-24T18:50:44.2006535Z 91 │ import { 2026-10-24T18:50:44.2006598Z 92 │ createContext, 2026-10-24T18:50:44.2006670Z ·  ──────┬────── 2026-10-24T18:50:44.2006802Z · ╰── 'createContext' is imported here 2026-10-24T18:50:44.2006857Z 93 │ memo, 2026-10-24T18:50:44.2006907Z ╰──── 2026-10-24T18:50:44.2007007Z  help: Consider removing this import. 2026-10-24T18:50:44.2007012Z 2026-10-24T18:50:44.2007219Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-24T18:50:44.2007350Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:108:3] 2026-10-24T18:50:44.2007407Z 107 │ import { 2026-10-24T18:50:44.2007472Z 108 │ ActivityIndicator, 2026-10-24T18:50:44.2007550Z ·  ────────┬──────── 2026-10-24T18:50:44.2007691Z · ╰── 'ActivityIndicator' is imported here 2026-10-24T18:50:44.2007747Z 109 │ Image, 2026-10-24T18:50:44.2007802Z ╰──── 2026-10-24T18:50:44.2007896Z  help: Consider removing this import. 2026-10-24T18:50:44.2007898Z 2026-10-24T18:50:44.2008101Z ⚠ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used. 2026-10-24T18:50:44.2008231Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:115:3] 2026-10-24T18:50:44.2008292Z 114 │ Pressable, 2026-10-24T18:50:44.2008352Z 115 │ ScrollView, 2026-10-24T18:50:44.2008423Z ·  ─────┬──── 2026-10-24T18:50:44.2008550Z · ╰── 'ScrollView' is imported here 2026-10-24T18:50:44.2008611Z 116 │ StyleSheet, 2026-10-24T18:50:44.2008660Z ╰──── 2026-10-24T18:50:44.2008763Z  help: Consider removing this import. 2026-10-24T18:50:44.2008766Z 2026-10-24T18:50:44.2008990Z ⚠ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used. 2026-10-24T18:50:44.2009121Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:117:11] 2026-10-24T18:50:44.2009177Z 116 │ StyleSheet, 2026-10-24T18:50:44.2009249Z 117 │ Text as NativeText, 2026-10-24T18:50:44.2009331Z ·  ─────┬──── 2026-10-24T18:50:44.2009464Z · ╰── 'NativeText' is imported here 2026-10-24T18:50:44.2009528Z 118 │ type ColorValue, 2026-10-24T18:50:44.2009577Z ╰──── 2026-10-24T18:50:44.2009669Z  help: Consider removing this import. 2026-10-24T18:50:44.2009671Z 2026-10-24T18:50:44.2009883Z ⚠ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used. 2026-10-24T18:50:44.2010012Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:140:10] 2026-10-24T18:50:44.2010145Z 139 │ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic"; 2026-10-24T18:50:44.2010270Z 140 │ import { tryOpenExternalUrl } from "../../lib/openExternalUrl"; 2026-10-24T18:50:44.2010410Z ·  ─────────┬──────── 2026-10-24T18:50:44.2010591Z · ╰── 'tryOpenExternalUrl' is imported here 2026-10-24T18:50:44.2010736Z 141 │ import { downloadAndShareAttachment } from "../../lib/attachmentDownload"; 2026-10-24T18:50:44.2010788Z ╰──── 2026-10-24T18:50:44.2010881Z  help: Consider removing this import. 2026-10-24T18:50:44.2010883Z 2026-10-24T18:50:44.2011177Z ⚠ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used. 2026-10-24T18:50:44.2011354Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:143:10] 2026-10-24T18:50:44.2011486Z 142 │ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks"; 2026-10-24T18:50:44.2011608Z 143 │ import { faviconUrlForOrigin } from "@t3tools/shared/favicon"; 2026-10-24T18:50:44.2011701Z ·  ─────────┬───────── 2026-10-24T18:50:44.2011853Z · ╰── 'faviconUrlForOrigin' is imported here 2026-10-24T18:50:44.2011912Z 144 │ import { 2026-10-24T18:50:44.2011962Z ╰──── 2026-10-24T18:50:44.2012053Z  help: Consider removing this import. 2026-10-24T18:50:44.2012056Z 2026-10-24T18:50:44.2012263Z ⚠ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used. 2026-10-24T18:50:44.2012391Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:157:10] 2026-10-24T18:50:44.2012536Z 156 │ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile"; 2026-10-24T18:50:44.2012666Z 157 │ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer"; 2026-10-24T18:50:44.2012750Z ·  ────────┬─────── 2026-10-24T18:50:44.2012902Z · ╰── 'MediaVideoPlayer' is imported here 2026-10-24T18:50:44.2013041Z 158 │ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia"; 2026-10-24T18:50:44.2013091Z ╰──── 2026-10-24T18:50:44.2013184Z  help: Consider removing this import. 2026-10-24T18:50:44.2013186Z 2026-10-24T18:50:44.2013401Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used. 2026-10-24T18:50:44.2013529Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:161:3] 2026-10-24T18:50:44.2013609Z 160 │ attachmentVideoPreviewSource, 2026-10-24T18:50:44.2013676Z 161 │ mediaVideoPreviewUri, 2026-10-24T18:50:44.2013759Z ·  ──────────┬───────── 2026-10-24T18:50:44.2013976Z · ╰── 'mediaVideoPreviewUri' is imported here 2026-10-24T18:50:44.2014084Z 162 │ mediaVideoThumbnailKey, 2026-10-24T18:50:44.2014132Z ╰──── 2026-10-24T18:50:44.2014225Z  help: Consider removing this import. 2026-10-24T18:50:44.2014227Z 2026-10-24T18:50:44.2014444Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used. 2026-10-24T18:50:44.2014571Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:162:3] 2026-10-24T18:50:44.2014647Z 161 │ mediaVideoPreviewUri, 2026-10-24T18:50:44.2014716Z 162 │ mediaVideoThumbnailKey, 2026-10-24T18:50:44.2014801Z ·  ───────────┬────────── 2026-10-24T18:50:44.2014955Z · ╰── 'mediaVideoThumbnailKey' is imported here 2026-10-24T18:50:44.2015032Z 163 │ type MediaVideoPreviewSource, 2026-10-24T18:50:44.2015081Z ╰──── 2026-10-24T18:50:44.2015178Z  help: Consider removing this import. 2026-10-24T18:50:44.2015183Z 2026-10-24T18:50:44.2015390Z ⚠ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used. 2026-10-24T18:50:44.2015516Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:163:8] 2026-10-24T18:50:44.2015588Z 162 │ mediaVideoThumbnailKey, 2026-10-24T18:50:44.2015664Z 163 │ type MediaVideoPreviewSource, 2026-10-24T18:50:44.2015756Z ·  ───────────┬─────────── 2026-10-24T18:50:44.2015914Z · ╰── 'MediaVideoPreviewSource' is imported here 2026-10-24T18:50:44.2015998Z 164 │ } from "../../lib/videoPreviewSource"; 2026-10-24T18:50:44.2016046Z ╰──── 2026-10-24T18:50:44.2016138Z  help: Consider removing this import. 2026-10-24T18:50:44.2016140Z 2026-10-24T18:50:44.2016338Z ⚠ eslint(no-unused-vars): Type 'ReviewDiffTheme' is imported but never used. 2026-10-24T18:50:44.2016468Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:171:15] 2026-10-24T18:50:44.2016640Z 170 │ import { parseReviewCommentMessageSegments } from "../review/reviewCommentSelection"; 2026-10-24T18:50:44.2016775Z 171 │ import type { ReviewDiffTheme } from "../review/shikiReviewHighlighter"; 2026-10-24T18:50:44.2016863Z ·  ───────┬─────── 2026-10-24T18:50:44.2017009Z · ╰── 'ReviewDiffTheme' is imported here 2026-10-24T18:50:44.2017065Z 172 │ import { 2026-10-24T18:50:44.2017115Z ╰──── 2026-10-24T18:50:44.2017206Z  help: Consider removing this import. 2026-10-24T18:50:44.2017208Z 2026-10-24T18:50:44.2017436Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used. 2026-10-24T18:50:44.2017565Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:186:3] 2026-10-24T18:50:44.2017621Z 185 │ import { 2026-10-24T18:50:44.2017694Z 186 │ resolveMarkdownFontSizes, 2026-10-24T18:50:44.2017781Z ·  ────────────┬─────────── 2026-10-24T18:50:44.2017934Z · ╰── 'resolveMarkdownFontSizes' is imported here 2026-10-24T18:50:44.2018018Z 187 │ resolveNativeMarkdownTypography, 2026-10-24T18:50:44.2018067Z ╰──── 2026-10-24T18:50:44.2018159Z  help: Consider removing this import. 2026-10-24T18:50:44.2018161Z 2026-10-24T18:50:44.2018413Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used. 2026-10-24T18:50:44.2018597Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:193:3] 2026-10-24T18:50:44.2018701Z 192 │ normalizeNativeMarkdownUrl, 2026-10-24T18:50:44.2018835Z 193 │ resolveMarkdownInlineCodePresentation, 2026-10-24T18:50:44.2018944Z ·  ──────────────────┬────────────────── 2026-10-24T18:50:44.2019132Z · ╰── 'resolveMarkdownInlineCodePresentation' is imported here 2026-10-24T18:50:44.2019216Z 194 │ resolveMarkdownLinkPresentation, 2026-10-24T18:50:44.2019269Z ╰──── 2026-10-24T18:50:44.2019361Z  help: Consider removing this import. 2026-10-24T18:50:44.2019363Z 2026-10-24T18:50:44.2019582Z ⚠ eslint(no-unused-vars): Identifier 'useMarkdownCodeHighlight' is imported but never used. 2026-10-24T18:50:44.2019716Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:233:10] 2026-10-24T18:50:44.2019819Z 232 │ import { ThreadMcpApp } from "./McpAppWebView"; 2026-10-24T18:50:44.2019959Z 233 │ import { useMarkdownCodeHighlight } from "./markdownCodeHighlightState"; 2026-10-24T18:50:44.2020056Z ·  ────────────┬─────────── 2026-10-24T18:50:44.2020219Z · ╰── 'useMarkdownCodeHighlight' is imported here 2026-10-24T18:50:44.2020276Z 234 │ import { 2026-10-24T18:50:44.2020326Z ╰──── 2026-10-24T18:50:44.2020416Z  help: Consider removing this import. 2026-10-24T18:50:44.2020419Z 2026-10-24T18:50:44.2020622Z ⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used. 2026-10-24T18:50:44.2020752Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:237:3] 2026-10-24T18:50:44.2020815Z 236 │ useAssetUrl, 2026-10-24T18:50:44.2020885Z 237 │ useAssetUrlState, 2026-10-24T18:50:44.2020967Z ·  ────────┬─────── 2026-10-24T18:50:44.2021104Z · ╰── 'useAssetUrlState' is imported here 2026-10-24T18:50:44.2021171Z 238 │ useRefreshAssetUrl, 2026-10-24T18:50:44.2021219Z ╰──── 2026-10-24T18:50:44.2021312Z  help: Consider removing this import. 2026-10-24T18:50:44.2021314Z 2026-10-24T18:50:44.2021511Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T18:50:44.2021643Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2148:7] 2026-10-24T18:50:44.2021714Z 2147 │ setExpandedFile(null); 2026-10-24T18:50:44.2021869Z 2148 │ }, [props.environmentId, props.threadId, props.contentPresentation.kind]); 2026-10-24T18:50:44.2022093Z ·  ─────────┬───────── ───────┬────── ───────────────┬────────────── 2026-10-24T18:50:44.2022384Z · │ │ ╰── Unnecessary dependency `props.contentPresentation.kind` 2026-10-24T18:50:44.2022579Z · │ ╰── Unnecessary dependency `props.threadId` 2026-10-24T18:50:44.2022737Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-24T18:50:44.2022876Z 2149 │ const horizontalPadding = props.layoutVariant === "split" ? 20 : 16; 2026-10-24T18:50:44.2022927Z ╰──── 2026-10-24T18:50:44.2023275Z  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-24T18:50:44.2023618Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.2023620Z 2026-10-24T18:50:44.2023821Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T18:50:44.2023952Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2616:7] 2026-10-24T18:50:44.2024048Z 2615 │ reportHeaderMaterialVisibility(false); 2026-10-24T18:50:44.2024158Z 2616 │ }, [feedThreadKey, reportHeaderMaterialVisibility]); 2026-10-24T18:50:44.2024236Z ·  ──────┬────── 2026-10-24T18:50:44.2024382Z · ╰── Unnecessary dependency `feedThreadKey` 2026-10-24T18:50:44.2024436Z 2617 │ 2026-10-24T18:50:44.2024491Z ╰──── 2026-10-24T18:50:44.2024778Z  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-24T18:50:44.2025081Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.2025084Z 2026-10-24T18:50:44.2025278Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T18:50:44.2025408Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2632:7] 2026-10-24T18:50:44.2025462Z 2631 │ } 2026-10-24T18:50:44.2025590Z 2632 │ }, [listMountKey, props.contentInsetEndAdjustment, listRef]); 2026-10-24T18:50:44.2025667Z ·  ──────┬───── 2026-10-24T18:50:44.2025816Z · ╰── Unnecessary dependency `listMountKey` 2026-10-24T18:50:44.2025957Z 2633 │ // Opening at a message: its run unfolds, the list stops following the end 2026-10-24T18:50:44.2026008Z ╰──── 2026-10-24T18:50:44.2026291Z  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-24T18:50:44.2026593Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.2026595Z 2026-10-24T18:50:44.2026790Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T18:50:44.2026919Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2828:7] 2026-10-24T18:50:44.2026974Z 2827 │ } 2026-10-24T18:50:44.2027200Z 2828 │ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]); 2026-10-24T18:50:44.2027427Z ·  ───────┬─────── ─────────┬──────── ────────┬─────── 2026-10-24T18:50:44.2027674Z · │ │ ╰── Unnecessary dependency `expandedWorkRows` 2026-10-24T18:50:44.2027874Z · │ ╰── Unnecessary dependency `expandedWorkGroups` 2026-10-24T18:50:44.2028023Z · ╰── Unnecessary dependency `expandedTurnIds` 2026-10-24T18:50:44.2028076Z 2829 │ 2026-10-24T18:50:44.2028124Z ╰──── 2026-10-24T18:50:44.2028417Z  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-24T18:50:44.2028721Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.2028724Z 2026-10-24T18:50:44.2028935Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T18:50:44.2029067Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:618:9] 2026-10-24T18:50:44.2029123Z 617 │ }; 2026-10-24T18:50:44.2029236Z 618 │ }, [props.environmentId, attachment.id, httpBaseUrl]), 2026-10-24T18:50:44.2029421Z ·  ─────────┬───────── ──────┬────── ─────┬───── 2026-10-24T18:50:44.2029661Z · │ │ ╰── Unnecessary dependency `httpBaseUrl` 2026-10-24T18:50:44.2029854Z · │ ╰── Unnecessary dependency `attachment.id` 2026-10-24T18:50:44.2030013Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-24T18:50:44.2030067Z 619 │ ); 2026-10-24T18:50:44.2030118Z ╰──── 2026-10-24T18:50:44.2030422Z  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-24T18:50:44.2030724Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.2030726Z 2026-10-24T18:50:44.2030953Z ⚠ eslint(no-unused-vars): Function 'assertUserMessagesExclude' is declared but never used. 2026-10-24T18:50:44.2031116Z ╭─[apps/server/src/orchestration-v2/testkit/fixtures/shared.ts:1398:10] 2026-10-24T18:50:44.2031168Z 1397 │ 2026-10-24T18:50:44.2031253Z 1398 │ function assertUserMessagesExclude( 2026-10-24T18:50:44.2031356Z ·  ────────────┬──────────── 2026-10-24T18:50:44.2031519Z · ╰── 'assertUserMessagesExclude' is declared here 2026-10-24T18:50:44.2031625Z 1399 │ projection: OrchestrationV2ThreadProjection, 2026-10-24T18:50:44.2031674Z ╰──── 2026-10-24T18:50:44.2031776Z  help: Consider removing this declaration. 2026-10-24T18:50:44.2031778Z 2026-10-24T18:50:44.2031997Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T18:50:44.2032180Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:698:76] 2026-10-24T18:50:44.2032355Z 697 │ const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() })); 2026-10-24T18:50:44.2032519Z 698 │ if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() }); 2026-10-24T18:50:44.2032653Z ·  ─────┬──── 2026-10-24T18:50:44.2032832Z · ╰── Cannot call impure function 2026-10-24T18:50:44.2032964Z 699 │ const snoozeGateNow = new Date(snoozeGateClock.now).toISOString(); 2026-10-24T18:50:44.2033015Z ╰──── 2026-10-24T18:50:44.2033301Z  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-24T18:50:44.2033591Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T18:50:44.2033593Z 2026-10-24T18:50:44.2033754Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T18:50:44.2033905Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:719:71] 2026-10-24T18:50:44.2033984Z 718 │ const snoozePresets = useMemo( 2026-10-24T18:50:44.2034161Z 719 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-24T18:50:44.2034288Z ·  ─────┬──── 2026-10-24T18:50:44.2034472Z · ╰── Cannot call impure function 2026-10-24T18:50:44.2034589Z 720 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-24T18:50:44.2034639Z ╰──── 2026-10-24T18:50:44.2034911Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T18:50:44.2035198Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T18:50:44.2035201Z 2026-10-24T18:50:44.2035375Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T18:50:44.2035525Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:720:6] 2026-10-24T18:50:44.2035700Z 719 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-24T18:50:44.2035814Z 720 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-24T18:50:44.2035905Z ·  ────────────┬─────────── 2026-10-24T18:50:44.2036075Z · ╰── Unnecessary dependency `props.snoozePresetMinute` 2026-10-24T18:50:44.2036128Z 721 │ ); 2026-10-24T18:50:44.2036178Z ╰──── 2026-10-24T18:50:44.2036483Z  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-24T18:50:44.2036787Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.2036789Z 2026-10-24T18:50:44.2037014Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T18:50:44.2037193Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:766:7] 2026-10-24T18:50:44.2037261Z 765 │ thread.pinnedAt, 2026-10-24T18:50:44.2037320Z 766 │ variant, 2026-10-24T18:50:44.2037392Z ·  ───┬─── 2026-10-24T18:50:44.2037524Z · ╰── Unnecessary dependency `variant` 2026-10-24T18:50:44.2037577Z 767 │ ], 2026-10-24T18:50:44.2037627Z ╰──── 2026-10-24T18:50:44.2037932Z  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-24T18:50:44.2038240Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T18:50:44.2038245Z 2026-10-24T18:50:44.2038435Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T18:50:44.2038592Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1216:21] 2026-10-24T18:50:44.2038717Z 1215 │ {providerDrivers.slice(0, -1).map((driver, index) => ( 2026-10-24T18:50:44.2038879Z 1216 │ 2026-10-24T18:50:44.2038991Z ·  ────────────────────────── 2026-10-24T18:50:44.2039099Z 1217 │ 2026-10-24T18:50:44.2039148Z ╰──── 2026-10-24T18:50:44.2039294Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T18:50:44.2039302Z 2026-10-24T18:50:44.2039386Z Found 0 errors and 367 warnings in 5477 files (5.0s, 8 threads) 2026-10-24T18:50:44.2453688Z Post job cleanup. 2026-10-24T18:50:44.3046485Z Cache hit occurred on the primary key electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309, not saving cache. 2026-10-24T18:50:44.3112824Z Post job cleanup. 2026-10-24T18:50:44.3128300Z ##[start-action display=Cache full pnpm store;id=__95cf10e4-39ab-4fe5-879b-449d9f9adc97.__actions_cache] 2026-10-24T18:50:44.3450416Z Post job cleanup. 2026-10-24T18:50:44.4052251Z Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-fa50cf9b003d547cd32552f61b874eb4abe5dace3fdb4b1abd9610da2da24074, not saving cache. 2026-10-24T18:50:44.4089228Z ##[end-action id=__95cf10e4-39ab-4fe5-879b-449d9f9adc97.__actions_cache;outcome=success;conclusion=success;duration_ms=96] 2026-10-24T18:50:44.4091752Z ##[start-action display=Cache Vite+;id=__95cf10e4-39ab-4fe5-879b-449d9f9adc97.vp_cache] 2026-10-24T18:50:44.4122800Z Post job cleanup. 2026-10-24T18:50:44.4702080Z 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-24T18:50:44.4732339Z ##[end-action id=__95cf10e4-39ab-4fe5-879b-449d9f9adc97.vp_cache;outcome=success;conclusion=success;duration_ms=63] 2026-10-24T18:50:44.4773153Z Post job cleanup. 2026-10-24T18:50:44.5200281Z [command]/usr/local/bin/git version 2026-10-24T18:50:44.5229564Z git version 2.55.0 2026-10-24T18:50:44.5247767Z Temporarily overriding HOME='/home/runner/_work/_temp/af4dff6e-4b4c-4730-901a-6c539eae489f' before making global git config changes 2026-10-24T18:50:44.5248123Z Adding repository directory to the temporary git global config as a safe directory 2026-10-24T18:50:44.5250982Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-24T18:50:44.5274589Z Removing SSH command configuration 2026-10-24T18:50:44.5277628Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-24T18:50:44.5300513Z [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-24T18:50:44.5416039Z fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules 2026-10-24T18:50:44.5437074Z ##[warning]The process '/usr/local/bin/git' failed with exit code 128 2026-10-24T18:50:44.5475622Z A job completed hook has been configured by the self-hosted runner administrator 2026-10-24T18:50:44.5499663Z ##[group]Run '/job_completed.sh' 2026-10-24T18:50:44.5512033Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T18:50:44.5512206Z env: 2026-10-24T18:50:44.5512319Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 166 2026-10-24T18:50:44.5512465Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 371 2026-10-24T18:50:44.5512605Z BLACKSMITH_CHECK_RUN_ID: 120956923557 2026-10-24T18:50:44.5512744Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-24T18:50:44.5512890Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-24T18:50:44.5513025Z ##[endgroup] 2026-10-24T18:50:44.5592378Z Docker container cache not activated, skipping hash computation. 2026-10-24T18:50:44.5866411Z No active SSH sessions detected. Proceeding with shutdown immediately. 2026-10-24T18:50:44.6459693Z Cleaning up orphan processes