2026-10-24T15:11:47.4934428Z Current runner version: '2.338.1' 2026-10-24T15:11:47.4938126Z Runner name: 'blacksmith-8vcpu-ubuntu-2404-tt5rfrhyiv75bwmo' 2026-10-24T15:11:47.4938889Z Runner group name: 'blacksmith scale sets - blacksmith-8vcpu-ubuntu-2404' 2026-10-24T15:11:47.4939617Z Machine name: 'ip-172-31-73-130' 2026-10-24T15:11:47.4941478Z ##[group]GITHUB_TOKEN Permissions 2026-10-24T15:11:47.4942758Z Contents: read 2026-10-24T15:11:47.4943202Z Metadata: read 2026-10-24T15:11:47.4943604Z ##[endgroup] 2026-10-24T15:11:47.4945312Z Secret source: None 2026-10-24T15:11:47.4945972Z Cache mode: write 2026-10-24T15:11:47.4946675Z Prepare workflow directory 2026-10-24T15:11:47.5130990Z Prepare all required actions 2026-10-24T15:11:47.5157335Z Getting action download info 2026-10-24T15:11:47.6294023Z Download action repository 'actions/checkout@v6' (SHA:d23441a48e516b6c34aea4fa41551a30e30af803) 2026-10-24T15:11:47.6722498Z Download action repository 'actions/cache@v6' (SHA:55cc8345863c7cc4c66a329aec7e433d2d1c52a9) 2026-10-24T15:11:47.7848381Z Setting BLACKSMITH_ACTIONS_RESULTS_URL to https://results-receiver.actions.githubusercontent.com/ 2026-10-24T15:11:47.7886805Z Complete job name: Lint 2026-10-24T15:11:47.8305339Z A job started hook has been configured by the self-hosted runner administrator 2026-10-24T15:11:47.8395980Z ##[group]Run '/setup.sh' 2026-10-24T15:11:47.8412234Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T15:11:47.8412664Z env: 2026-10-24T15:11:47.8412891Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 173 2026-10-24T15:11:47.8413185Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 386 2026-10-24T15:11:47.8413469Z BLACKSMITH_CHECK_RUN_ID: 120907262757 2026-10-24T15:11:47.8413751Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-24T15:11:47.8414030Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-24T15:11:47.8414289Z ##[endgroup] 2026-10-24T15:11:47.8662785Z Logging daemon started (blacksmithd for logs) 2026-10-24T15:11:47.8749689Z Results daemon started (blacksmithd for results) 2026-10-24T15:11:47.8890925Z Background adoption and SSH setup started (PID: 3066) 2026-10-24T15:11:47.8891532Z 2026-10-24T15:11:47.8891809Z ---------------------------------------- 2026-10-24T15:11:47.8892493Z View this job: https://app.blacksmith.sh/pingdotgg/runs/40105851779/jobs/120907262757 2026-10-24T15:11:47.8893032Z SSH Access (using your GitHub SSH key): 2026-10-24T15:11:47.8893459Z ssh -p 64002 runner@blacksmith-8vcpu-ubuntu-2404-tt5rfrhyiv75bwmo.vm.blacksmith.sh 2026-10-24T15:11:47.8893762Z 2026-10-24T15:11:47.8893878Z No GitHub SSH key? Add one at: 2026-10-24T15:11:47.8894358Z https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account 2026-10-24T15:11:47.8894756Z 2026-10-24T15:11:47.8894865Z ---------------------------------------- 2026-10-24T15:11:47.8895041Z 2026-10-24T15:11:47.8895186Z VM ID: blacksmith-8vcpu-ubuntu-2404-tt5rfrhyiv75bwmo 2026-10-24T15:11:47.8895514Z Host: production-152.236.41.225-x8664 2026-10-24T15:11:47.8895784Z Host Agent PID: 1039541 2026-10-24T15:11:47.8896030Z Host Agent Git SHA: 1637818df 2026-10-24T15:11:47.8896302Z Host CPU Manufacturer: AuthenticAMD 2026-10-24T15:11:47.8896588Z Blacksmith Host Generation: gen 2 2026-10-24T15:11:47.8896879Z Petname: production-grateful-cougar-467ad141 2026-10-24T15:11:47.8897176Z Region: us-east 2026-10-24T15:11:47.8897454Z Rootfs Version: ubuntu24-full-x64-081926 2026-10-24T15:11:47.8905235Z OS Version: Ubuntu 24.04.4 LTS 2026-10-24T15:11:47.8905538Z 2026-10-24T15:11:47.8905660Z Enabling Blacksmith transparent cache 2026-10-24T15:11:47.9183615Z ##[group]Run actions/checkout@v6 2026-10-24T15:11:47.9183935Z with: 2026-10-24T15:11:47.9184356Z sparse-checkout: /* !/.repos/ !/apps/mobile/modules/t3-terminal/Vendor/**/*.a 2026-10-24T15:11:47.9184760Z sparse-checkout-cone-mode: false 2026-10-24T15:11:47.9185039Z repository: pingdotgg/t3code 2026-10-24T15:11:47.9186720Z token: *** 2026-10-24T15:11:47.9186941Z ssh-strict: true 2026-10-24T15:11:47.9187167Z ssh-user: git 2026-10-24T15:11:47.9187396Z persist-credentials: true 2026-10-24T15:11:47.9188123Z clean: true 2026-10-24T15:11:47.9188338Z fetch-depth: 1 2026-10-24T15:11:47.9188561Z fetch-tags: false 2026-10-24T15:11:47.9188787Z show-progress: true 2026-10-24T15:11:47.9189017Z lfs: false 2026-10-24T15:11:47.9189228Z submodules: false 2026-10-24T15:11:47.9189459Z set-safe-directory: true 2026-10-24T15:11:47.9189719Z allow-unsafe-pr-checkout: false 2026-10-24T15:11:47.9189978Z env: 2026-10-24T15:11:47.9190229Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 173 2026-10-24T15:11:47.9190517Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 386 2026-10-24T15:11:47.9190798Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T15:11:47.9191064Z ##[endgroup] 2026-10-24T15:11:48.0198811Z Syncing repository: pingdotgg/t3code 2026-10-24T15:11:48.0199764Z ##[group]Getting Git version info 2026-10-24T15:11:48.0200101Z Working directory is '/home/runner/_work/t3code/t3code' 2026-10-24T15:11:48.0200584Z [command]/usr/local/bin/git version 2026-10-24T15:11:48.0274903Z git version 2.55.0 2026-10-24T15:11:48.0285570Z ##[endgroup] 2026-10-24T15:11:48.0292545Z Temporarily overriding HOME='/home/runner/_work/_temp/58e1cc2b-9269-491b-b5b6-1a1f678937cb' before making global git config changes 2026-10-24T15:11:48.0293202Z Adding repository directory to the temporary git global config as a safe directory 2026-10-24T15:11:48.0295657Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-24T15:11:48.0327926Z Deleting the contents of '/home/runner/_work/t3code/t3code' 2026-10-24T15:11:48.0329594Z ##[group]Determining repository object format 2026-10-24T15:11:48.0330897Z ##[endgroup] 2026-10-24T15:11:48.0331265Z ##[group]Initializing the repository 2026-10-24T15:11:48.0333268Z [command]/usr/local/bin/git init /home/runner/_work/t3code/t3code 2026-10-24T15:11:48.0373307Z hint: Using 'master' as the name for the initial branch. This default branch name 2026-10-24T15:11:48.0373777Z hint: will change to "main" in Git 3.0. To configure the initial branch name 2026-10-24T15:11:48.0374375Z hint: to use in all of your new repositories, which will suppress this warning, 2026-10-24T15:11:48.0374756Z hint: call: 2026-10-24T15:11:48.0374964Z hint: 2026-10-24T15:11:48.0375243Z hint: git config --global init.defaultBranch 2026-10-24T15:11:48.0375556Z hint: 2026-10-24T15:11:48.0375846Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and 2026-10-24T15:11:48.0376295Z hint: 'development'. The just-created branch can be renamed via this command: 2026-10-24T15:11:48.0376658Z hint: 2026-10-24T15:11:48.0376874Z hint: git branch -m 2026-10-24T15:11:48.0377115Z hint: 2026-10-24T15:11:48.0377487Z hint: Disable this message with "git config set advice.defaultBranchName false" 2026-10-24T15:11:48.0377948Z Initialized empty Git repository in /home/runner/_work/t3code/t3code/.git/ 2026-10-24T15:11:48.0382425Z [command]/usr/local/bin/git remote add origin https://github.com/pingdotgg/t3code 2026-10-24T15:11:48.0444809Z ##[endgroup] 2026-10-24T15:11:48.0445186Z ##[group]Disabling automatic garbage collection 2026-10-24T15:11:48.0447455Z [command]/usr/local/bin/git config --local gc.auto 0 2026-10-24T15:11:48.0469922Z ##[endgroup] 2026-10-24T15:11:48.0470272Z ##[group]Setting up auth 2026-10-24T15:11:48.0470669Z Removing SSH command configuration 2026-10-24T15:11:48.0474511Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-24T15:11:48.0499127Z [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-24T15:11:48.0649037Z Removing HTTP extra header 2026-10-24T15:11:48.0652137Z [command]/usr/local/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader 2026-10-24T15:11:48.0676281Z [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-24T15:11:48.0784061Z Removing includeIf entries pointing to credentials config files 2026-10-24T15:11:48.0787508Z [command]/usr/local/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: 2026-10-24T15:11:48.0810935Z [command]/usr/local/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url 2026-10-24T15:11:48.0917183Z [command]/usr/local/bin/git config --file /home/runner/_work/_temp/git-credentials-104a57eb-d02c-4c2b-b70c-5c310e10e451.config http.https://github.com/.extraheader AUTHORIZATION: basic *** 2026-10-24T15:11:48.0943193Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git.path /home/runner/_work/_temp/git-credentials-104a57eb-d02c-4c2b-b70c-5c310e10e451.config 2026-10-24T15:11:48.0964712Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git/worktrees/*.path /home/runner/_work/_temp/git-credentials-104a57eb-d02c-4c2b-b70c-5c310e10e451.config 2026-10-24T15:11:48.0998637Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-104a57eb-d02c-4c2b-b70c-5c310e10e451.config 2026-10-24T15:11:48.1022443Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-104a57eb-d02c-4c2b-b70c-5c310e10e451.config 2026-10-24T15:11:48.1043627Z ##[endgroup] 2026-10-24T15:11:48.1044009Z ##[group]Fetching the repository 2026-10-24T15:11:48.1049789Z [command]/usr/local/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --filter=blob:none --depth=1 origin +41ff1d8d1e37f42f5702468fd24ffc2fc833630a:refs/remotes/pull/23856/merge 2026-10-24T15:11:48.4124387Z From https://github.com/pingdotgg/t3code 2026-10-24T15:11:48.4125013Z * [new ref] 41ff1d8d1e37f42f5702468fd24ffc2fc833630a -> pull/23856/merge 2026-10-24T15:11:48.4154183Z ##[endgroup] 2026-10-24T15:11:48.4154688Z ##[group]Determining the checkout info 2026-10-24T15:11:48.4155151Z ##[endgroup] 2026-10-24T15:11:48.4155535Z ##[group]Setting up sparse checkout 2026-10-24T15:11:48.4158771Z [command]/usr/local/bin/git config core.sparseCheckout true 2026-10-24T15:11:48.4186514Z [command]/usr/local/bin/git rev-parse --git-path info/sparse-checkout 2026-10-24T15:11:48.4204260Z .git/info/sparse-checkout 2026-10-24T15:11:48.4208779Z ##[endgroup] 2026-10-24T15:11:48.4209359Z ##[group]Checking out the ref 2026-10-24T15:11:48.4211317Z [command]/usr/local/bin/git checkout --progress --force refs/remotes/pull/23856/merge 2026-10-24T15:11:54.9602748Z Updating files: 0% (1/6400) 2026-10-24T15:11:54.9634092Z Updating files: 1% (64/6400) 2026-10-24T15:11:54.9651651Z Updating files: 2% (128/6400) 2026-10-24T15:11:54.9674349Z Updating files: 3% (192/6400) 2026-10-24T15:11:54.9696892Z Updating files: 4% (256/6400) 2026-10-24T15:11:54.9729741Z Updating files: 5% (320/6400) 2026-10-24T15:11:54.9754285Z Updating files: 6% (384/6400) 2026-10-24T15:11:54.9812791Z Updating files: 7% (448/6400) 2026-10-24T15:11:54.9849750Z Updating files: 8% (512/6400) 2026-10-24T15:11:54.9877159Z Updating files: 9% (576/6400) 2026-10-24T15:11:55.0194221Z Updating files: 10% (640/6400) 2026-10-24T15:11:55.0211951Z Updating files: 11% (704/6400) 2026-10-24T15:11:55.0223785Z Updating files: 12% (768/6400) 2026-10-24T15:11:55.0240492Z Updating files: 13% (832/6400) 2026-10-24T15:11:55.0257828Z Updating files: 14% (896/6400) 2026-10-24T15:11:55.0277689Z Updating files: 15% (960/6400) 2026-10-24T15:11:55.0297813Z Updating files: 16% (1024/6400) 2026-10-24T15:11:55.0313979Z Updating files: 17% (1088/6400) 2026-10-24T15:11:55.0333892Z Updating files: 18% (1152/6400) 2026-10-24T15:11:55.0350051Z Updating files: 19% (1216/6400) 2026-10-24T15:11:55.0376744Z Updating files: 20% (1280/6400) 2026-10-24T15:11:55.0395294Z Updating files: 21% (1344/6400) 2026-10-24T15:11:55.0416588Z Updating files: 22% (1408/6400) 2026-10-24T15:11:55.0431328Z Updating files: 23% (1472/6400) 2026-10-24T15:11:55.0446542Z Updating files: 24% (1536/6400) 2026-10-24T15:11:55.0463305Z Updating files: 25% (1600/6400) 2026-10-24T15:11:55.0478432Z Updating files: 26% (1664/6400) 2026-10-24T15:11:55.0493897Z Updating files: 27% (1728/6400) 2026-10-24T15:11:55.0514607Z Updating files: 28% (1792/6400) 2026-10-24T15:11:55.0550136Z Updating files: 29% (1856/6400) 2026-10-24T15:11:55.0572890Z Updating files: 30% (1920/6400) 2026-10-24T15:11:55.0600207Z Updating files: 31% (1984/6400) 2026-10-24T15:11:55.0631955Z Updating files: 32% (2048/6400) 2026-10-24T15:11:55.0663426Z Updating files: 33% (2112/6400) 2026-10-24T15:11:55.0737587Z Updating files: 34% (2176/6400) 2026-10-24T15:11:55.0800098Z Updating files: 35% (2240/6400) 2026-10-24T15:11:55.0840438Z Updating files: 36% (2304/6400) 2026-10-24T15:11:55.0874042Z Updating files: 37% (2368/6400) 2026-10-24T15:11:55.0923605Z Updating files: 38% (2432/6400) 2026-10-24T15:11:55.0954685Z Updating files: 39% (2496/6400) 2026-10-24T15:11:55.0986689Z Updating files: 40% (2560/6400) 2026-10-24T15:11:55.1015715Z Updating files: 41% (2624/6400) 2026-10-24T15:11:55.1032589Z Updating files: 42% (2688/6400) 2026-10-24T15:11:55.1043530Z Updating files: 43% (2752/6400) 2026-10-24T15:11:55.1075718Z Updating files: 44% (2816/6400) 2026-10-24T15:11:55.1106532Z Updating files: 45% (2880/6400) 2026-10-24T15:11:55.1136658Z Updating files: 46% (2944/6400) 2026-10-24T15:11:55.1163801Z Updating files: 47% (3008/6400) 2026-10-24T15:11:55.1193784Z Updating files: 48% (3072/6400) 2026-10-24T15:11:55.1234837Z Updating files: 49% (3136/6400) 2026-10-24T15:11:55.1264970Z Updating files: 50% (3200/6400) 2026-10-24T15:11:55.1282705Z Updating files: 51% (3264/6400) 2026-10-24T15:11:55.1320760Z Updating files: 52% (3328/6400) 2026-10-24T15:11:55.1350679Z Updating files: 53% (3392/6400) 2026-10-24T15:11:55.1371302Z Updating files: 54% (3456/6400) 2026-10-24T15:11:55.1395884Z Updating files: 55% (3520/6400) 2026-10-24T15:11:55.1412333Z Updating files: 56% (3584/6400) 2026-10-24T15:11:55.1433904Z Updating files: 57% (3648/6400) 2026-10-24T15:11:55.1453364Z Updating files: 58% (3712/6400) 2026-10-24T15:11:55.1846247Z Updating files: 59% (3776/6400) 2026-10-24T15:11:55.1862311Z Updating files: 60% (3840/6400) 2026-10-24T15:11:55.1885202Z Updating files: 61% (3904/6400) 2026-10-24T15:11:55.1904656Z Updating files: 62% (3968/6400) 2026-10-24T15:11:55.1928165Z Updating files: 63% (4032/6400) 2026-10-24T15:11:55.1957197Z Updating files: 64% (4096/6400) 2026-10-24T15:11:55.1978295Z Updating files: 65% (4160/6400) 2026-10-24T15:11:55.1996673Z Updating files: 66% (4224/6400) 2026-10-24T15:11:55.2021416Z Updating files: 67% (4288/6400) 2026-10-24T15:11:55.2036941Z Updating files: 68% (4352/6400) 2026-10-24T15:11:55.2055857Z Updating files: 69% (4416/6400) 2026-10-24T15:11:55.2070051Z Updating files: 70% (4480/6400) 2026-10-24T15:11:55.2089596Z Updating files: 71% (4544/6400) 2026-10-24T15:11:55.2103469Z Updating files: 72% (4608/6400) 2026-10-24T15:11:55.2154254Z Updating files: 73% (4672/6400) 2026-10-24T15:11:55.2586612Z Updating files: 74% (4736/6400) 2026-10-24T15:11:55.2611548Z Updating files: 75% (4800/6400) 2026-10-24T15:11:55.2634870Z Updating files: 76% (4864/6400) 2026-10-24T15:11:55.2661036Z Updating files: 77% (4928/6400) 2026-10-24T15:11:55.2683997Z Updating files: 78% (4992/6400) 2026-10-24T15:11:55.2700971Z Updating files: 79% (5056/6400) 2026-10-24T15:11:55.2725666Z Updating files: 80% (5120/6400) 2026-10-24T15:11:55.2742494Z Updating files: 81% (5184/6400) 2026-10-24T15:11:55.2761379Z Updating files: 82% (5248/6400) 2026-10-24T15:11:55.2785097Z Updating files: 83% (5312/6400) 2026-10-24T15:11:55.2815177Z Updating files: 84% (5376/6400) 2026-10-24T15:11:55.2833104Z Updating files: 85% (5440/6400) 2026-10-24T15:11:55.2859957Z Updating files: 86% (5504/6400) 2026-10-24T15:11:55.2937783Z Updating files: 87% (5568/6400) 2026-10-24T15:11:55.2968961Z Updating files: 88% (5632/6400) 2026-10-24T15:11:55.2989883Z Updating files: 89% (5696/6400) 2026-10-24T15:11:55.3019831Z Updating files: 90% (5760/6400) 2026-10-24T15:11:55.3049020Z Updating files: 91% (5824/6400) 2026-10-24T15:11:55.3065036Z Updating files: 92% (5888/6400) 2026-10-24T15:11:55.3088239Z Updating files: 93% (5952/6400) 2026-10-24T15:11:55.3111200Z Updating files: 94% (6016/6400) 2026-10-24T15:11:55.3136333Z Updating files: 95% (6080/6400) 2026-10-24T15:11:55.3195653Z Updating files: 96% (6144/6400) 2026-10-24T15:11:55.3219954Z Updating files: 97% (6208/6400) 2026-10-24T15:11:55.3268437Z Updating files: 98% (6272/6400) 2026-10-24T15:11:55.3290391Z Updating files: 99% (6336/6400) 2026-10-24T15:11:55.3291244Z Updating files: 100% (6400/6400) 2026-10-24T15:11:55.3291396Z Updating files: 100% (6400/6400), done. 2026-10-24T15:11:55.3456550Z Note: switching to 'refs/remotes/pull/23856/merge'. 2026-10-24T15:11:55.3456820Z 2026-10-24T15:11:55.3457026Z You are in 'detached HEAD' state. You can look around, make experimental 2026-10-24T15:11:55.3457410Z changes and commit them, and you can discard any commits you make in this 2026-10-24T15:11:55.3457784Z state without impacting any branches by switching back to a branch. 2026-10-24T15:11:55.3458006Z 2026-10-24T15:11:55.3458154Z If you want to create a new branch to retain commits you create, you may 2026-10-24T15:11:55.3458518Z do so (now or later) by using -c with the switch command. Example: 2026-10-24T15:11:55.3458709Z 2026-10-24T15:11:55.3458779Z git switch -c 2026-10-24T15:11:55.3458873Z 2026-10-24T15:11:55.3458929Z Or undo this operation with: 2026-10-24T15:11:55.3459015Z 2026-10-24T15:11:55.3459065Z git switch - 2026-10-24T15:11:55.3459275Z 2026-10-24T15:11:55.3459457Z Turn off this advice by setting config variable advice.detachedHead to false 2026-10-24T15:11:55.3459695Z 2026-10-24T15:11:55.3459967Z HEAD is now at 41ff1d8 Merge 7c9904fa81ba3e4120cc55b438f7c82730d60471 into d53873b6a4799e87afd63c8d288ef0089f5a3748 2026-10-24T15:11:55.3481634Z ##[endgroup] 2026-10-24T15:11:55.3521455Z [command]/usr/local/bin/git log -1 --format=%H 2026-10-24T15:11:55.3541094Z 41ff1d8d1e37f42f5702468fd24ffc2fc833630a 2026-10-24T15:11:55.3633231Z ##[group]Run files="$(git ls-files .github/pr-assets)" 2026-10-24T15:11:55.3633474Z files="$(git ls-files .github/pr-assets)" 2026-10-24T15:11:55.3633654Z if test -n "$files"; then 2026-10-24T15:11:55.3633883Z  printf 'PR evidence must be uploaded to GitHub, not committed:\n%s\n' "$files" >&2 2026-10-24T15:11:55.3634101Z  exit 1 2026-10-24T15:11:55.3634209Z fi 2026-10-24T15:11:55.3656494Z shell: /usr/bin/bash -e {0} 2026-10-24T15:11:55.3656650Z env: 2026-10-24T15:11:55.3656771Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 173 2026-10-24T15:11:55.3656939Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 386 2026-10-24T15:11:55.3657084Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T15:11:55.3657220Z ##[endgroup] 2026-10-24T15:11:55.3820632Z Prepare all required actions 2026-10-24T15:11:55.3820991Z Getting action download info 2026-10-24T15:11:55.4783700Z Download action repository 'voidzero-dev/setup-vp@v1' (SHA:250f29ce396baf5e8f24498e17c0dfdebabc26eb) 2026-10-24T15:11:55.5914024Z ##[group]Run ./.github/actions/setup-ci-deps 2026-10-24T15:11:55.5914191Z env: 2026-10-24T15:11:55.5914305Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 173 2026-10-24T15:11:55.5914458Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 386 2026-10-24T15:11:55.5914607Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T15:11:55.5914748Z ##[endgroup] 2026-10-24T15:11:55.6024037Z ##[start-action display=Resolve Vite+ version;id=__self.vp] 2026-10-24T15:11:55.6042934Z ##[group]Run echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-24T15:11:55.6043488Z echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-24T15:11:55.6043808Z echo "node=$(jq -r '.engines.node' package.json)" >> "$GITHUB_OUTPUT" 2026-10-24T15:11:55.6044052Z echo "pnpm=$(jq -r '.packageManager' package.json)" >> "$GITHUB_OUTPUT" 2026-10-24T15:11:55.6069729Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T15:11:55.6069904Z env: 2026-10-24T15:11:55.6070079Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 173 2026-10-24T15:11:55.6070307Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 386 2026-10-24T15:11:55.6070517Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T15:11:55.6070660Z ##[endgroup] 2026-10-24T15:11:55.6158239Z ##[end-action id=__self.vp;outcome=success;conclusion=success;duration_ms=13] 2026-10-24T15:11:55.6159916Z ##[start-action display=Cache Vite+;id=__self.vp_cache] 2026-10-24T15:11:55.6205895Z ##[group]Run actions/cache@v6 2026-10-24T15:11:55.6206045Z with: 2026-10-24T15:11:55.6206150Z path: ~/.vite-plus 2026-10-24T15:11:55.6206314Z key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T15:11:55.6206521Z enableCrossOsArchive: false 2026-10-24T15:11:55.6206651Z fail-on-cache-miss: false 2026-10-24T15:11:55.6206777Z lookup-only: false 2026-10-24T15:11:55.6206885Z save-always: false 2026-10-24T15:11:55.6206994Z env: 2026-10-24T15:11:55.6207103Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 173 2026-10-24T15:11:55.6207249Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 386 2026-10-24T15:11:55.6207391Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T15:11:55.6207522Z ##[endgroup] 2026-10-24T15:11:55.8191177Z Cache hit for: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T15:11:56.2269748Z Received 170349591 of 170349591 (100.0%), 419.8 MBs/sec 2026-10-24T15:11:56.2270813Z Cache Size: ~162 MB (170349591 B) 2026-10-24T15:11:56.2298527Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/494f8fa5-0ec7-41d6-be0e-e1fac4bb494f/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T15:11:57.0255115Z Cache restored successfully 2026-10-24T15:11:57.0407786Z Cache restored from key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T15:11:57.0497554Z ##[end-action id=__self.vp_cache;outcome=success;conclusion=success;duration_ms=1433] 2026-10-24T15:11:57.0500412Z ##[start-action display=Use cached Vite+;id=__self.__run] 2026-10-24T15:11:57.0524032Z ##[group]Run echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-24T15:11:57.0524306Z echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-24T15:11:57.0524487Z "$HOME/.vite-plus/bin/vp" env use "26.12.1" 2026-10-24T15:11:57.0547788Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T15:11:57.0547987Z env: 2026-10-24T15:11:57.0548111Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 173 2026-10-24T15:11:57.0548266Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 386 2026-10-24T15:11:57.0548416Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T15:11:57.0548568Z ##[endgroup] 2026-10-24T15:11:57.0603272Z Using Node.js v26.12.1 (resolved from 26.12.1) 2026-10-24T15:11:57.0613094Z ##[end-action id=__self.__run;outcome=success;conclusion=success;duration_ms=11] 2026-10-24T15:11:57.0614594Z ##[start-action display=Setup Vite+;id=__self.__voidzero-dev_setup-vp] 2026-10-24T15:11:57.0618478Z ##[end-action id=__self.__voidzero-dev_setup-vp;outcome=skipped;conclusion=skipped;duration_ms=0] 2026-10-24T15:11:57.0619628Z ##[start-action display=Resolve pnpm store path;id=__self.pnpm_store] 2026-10-24T15:11:57.0645957Z ##[group]Run store_path="$(vp pm cache dir)" 2026-10-24T15:11:57.0646139Z store_path="$(vp pm cache dir)" 2026-10-24T15:11:57.0646306Z echo "path=$store_path" >> "$GITHUB_OUTPUT" 2026-10-24T15:11:57.0666689Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T15:11:57.0666865Z env: 2026-10-24T15:11:57.0666980Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 173 2026-10-24T15:11:57.0667292Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 386 2026-10-24T15:11:57.0667435Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T15:11:57.0667569Z ##[endgroup] 2026-10-24T15:11:57.0830530Z ##[end-action id=__self.pnpm_store;outcome=success;conclusion=success;duration_ms=21] 2026-10-24T15:11:57.0832272Z ##[start-action display=Cache full pnpm store;id=__self.__actions_cache] 2026-10-24T15:11:57.1182603Z ##[group]Run actions/cache@v6 2026-10-24T15:11:57.1182738Z with: 2026-10-24T15:11:57.1182865Z path: /home/runner/.local/share/pnpm/store/v11 2026-10-24T15:11:57.1183134Z key: pnpm-full-v1-Linux-X64-fa50cf9b003d547cd32552f61b874eb4abe5dace3fdb4b1abd9610da2da24074 2026-10-24T15:11:57.1183393Z restore-keys: pnpm-full-v1-Linux-X64- 2026-10-24T15:11:57.1183541Z enableCrossOsArchive: false 2026-10-24T15:11:57.1183720Z fail-on-cache-miss: false 2026-10-24T15:11:57.1183867Z lookup-only: false 2026-10-24T15:11:57.1183977Z save-always: false 2026-10-24T15:11:57.1184092Z env: 2026-10-24T15:11:57.1184199Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 173 2026-10-24T15:11:57.1184365Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 386 2026-10-24T15:11:57.1184507Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T15:11:57.1184641Z ##[endgroup] 2026-10-24T15:11:57.3057461Z Cache hit for: pnpm-full-v1-Linux-X64-fa50cf9b003d547cd32552f61b874eb4abe5dace3fdb4b1abd9610da2da24074 2026-10-24T15:11:58.4085738Z Received 805306368 of 994208090 (81.0%), 705.9 MBs/sec 2026-10-24T15:11:58.6811129Z Received 994208090 of 994208090 (100.0%), 697.2 MBs/sec 2026-10-24T15:11:58.6811699Z Cache Size: ~948 MB (994208090 B) 2026-10-24T15:11:58.6846387Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/74eabe5d-0739-444b-b47d-a15ac88b5490/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T15:12:04.4039176Z Cache restored successfully 2026-10-24T15:12:04.4522820Z Cache restored from key: pnpm-full-v1-Linux-X64-fa50cf9b003d547cd32552f61b874eb4abe5dace3fdb4b1abd9610da2da24074 2026-10-24T15:12:04.4593420Z ##[end-action id=__self.__actions_cache;outcome=success;conclusion=success;duration_ms=7376] 2026-10-24T15:12:04.4596054Z ##[start-action display=Install dependencies;id=__self.__run_2] 2026-10-24T15:12:04.4607153Z ##[group]Run vp install 2026-10-24T15:12:04.4607297Z vp install 2026-10-24T15:12:04.4628852Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T15:12:04.4629021Z env: 2026-10-24T15:12:04.4629139Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 173 2026-10-24T15:12:04.4629289Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 386 2026-10-24T15:12:04.4629432Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T15:12:04.4629572Z ##[endgroup] 2026-10-24T15:12:04.4968985Z Scope: all 34 workspace projects 2026-10-24T15:12:04.6037962Z ? Verifying lockfile against supply-chain policies (2088 entries)... 2026-10-24T15:12:04.8790052Z Packages are hard linked from the content-addressable store to the virtual store. 2026-10-24T15:12:04.8790419Z Content-addressable store is at: /home/runner/.local/share/pnpm/store/v11 2026-10-24T15:12:04.8790639Z Virtual store is at: node_modules/.pnpm 2026-10-24T15:12:07.9685215Z ✓ Lockfile passes supply-chain policies (2088 entries in 3.4s) 2026-10-24T15:12:07.9685496Z Lockfile is up to date, resolution step is skipped 2026-10-24T15:12:07.9902127Z Packages: +1721 2026-10-24T15:12:07.9902382Z ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2026-10-24T15:12:08.0557182Z Progress: resolved 1721, reused 1718, downloaded 0, added 1721, done 2026-10-24T15:12:09.1319598Z . prepare$ vp config --no-agent 2026-10-24T15:12:09.2432737Z . prepare: Done 2026-10-24T15:12:09.2449548Z 2026-10-24T15:12:09.2450477Z devDependencies: 2026-10-24T15:12:09.2450662Z + @coderabbitai/config 1.1.0 2026-10-24T15:12:09.2450804Z + @shadcn/lint 0.1.5 2026-10-24T15:12:09.2450961Z + @types/node 24.12.4 2026-10-24T15:12:09.2451092Z + knip 6.34.0 2026-10-24T15:12:09.2451235Z + typescript <- @tsc-rs/typescript 0.8.0 2026-10-24T15:12:09.2451385Z + vite-plus 1.3.0 2026-10-24T15:12:09.2451458Z 2026-10-24T15:12:09.2483271Z Done in 4.8s using pnpm v12.14.0 2026-10-24T15:12:09.2663516Z ##[end-action id=__self.__run_2;outcome=success;conclusion=success;duration_ms=4806] 2026-10-24T15:12:09.3160965Z ##[group]Run actions/cache@v6 2026-10-24T15:12:09.3161123Z with: 2026-10-24T15:12:09.3161238Z path: ~/.cache/electron 2026-10-24T15:12:09.3161468Z key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T15:12:09.3161706Z enableCrossOsArchive: false 2026-10-24T15:12:09.3161841Z fail-on-cache-miss: false 2026-10-24T15:12:09.3161964Z lookup-only: false 2026-10-24T15:12:09.3162079Z save-always: false 2026-10-24T15:12:09.3162189Z env: 2026-10-24T15:12:09.3162299Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 173 2026-10-24T15:12:09.3162452Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 386 2026-10-24T15:12:09.3162610Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T15:12:09.3162746Z ##[endgroup] 2026-10-24T15:12:09.5227048Z Cache hit for: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T15:12:09.6755694Z Received 122906203 of 122906203 (100.0%), 849.4 MBs/sec 2026-10-24T15:12:09.6756525Z Cache Size: ~117 MB (122906203 B) 2026-10-24T15:12:09.6772227Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/04bcd397-3918-46f1-8e96-aecd8160c4bd/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T15:12:09.7390174Z Cache restored successfully 2026-10-24T15:12:09.7521156Z Cache restored from key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T15:12:09.7679513Z ##[group]Run vp run --filter @t3tools/desktop ensure:electron 2026-10-24T15:12:09.7679853Z vp run --filter @t3tools/desktop ensure:electron 2026-10-24T15:12:09.7705750Z shell: /usr/bin/bash -e {0} 2026-10-24T15:12:09.7705901Z env: 2026-10-24T15:12:09.7706036Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 173 2026-10-24T15:12:09.7706193Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 386 2026-10-24T15:12:09.7706346Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T15:12:09.7706495Z ##[endgroup] 2026-10-24T15:12:09.9487310Z ~/apps/desktop$ node scripts/ensure-electron-runtime.mjs ⊘ cache disabled 2026-10-24T15:12:10.5463622Z /home/runner/_work/t3code/t3code/node_modules/.pnpm/electron@44.9.3_supports-color@8.1.1/node_modules/electron/dist/electron 2026-10-24T15:12:10.5481409Z 2026-10-24T15:12:10.5597859Z ##[group]Run vp run knip:check 2026-10-24T15:12:10.5598049Z vp run knip:check 2026-10-24T15:12:10.5620827Z shell: /usr/bin/bash -e {0} 2026-10-24T15:12:10.5620959Z env: 2026-10-24T15:12:10.5621077Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 173 2026-10-24T15:12:10.5621229Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 386 2026-10-24T15:12:10.5621373Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T15:12:10.5621514Z ##[endgroup] 2026-10-24T15:12:10.7174539Z $ knip --include files,dependencies --no-config-hints ⊘ cache disabled 2026-10-24T15:12:14.8013111Z 2026-10-24T15:12:14.8016823Z $ 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-24T15:12:23.7408828Z 2026-10-24T15:12:23.7410656Z --- 2026-10-24T15:12:23.7410960Z vp run: 2/2 successful. (Run `vp run --last-details` for full details) 2026-10-24T15:12:23.7500476Z ##[group]Run vp run --filter @t3tools/source-control-github generate --check 2026-10-24T15:12:23.7500769Z vp run --filter @t3tools/source-control-github generate --check 2026-10-24T15:12:23.7522474Z shell: /usr/bin/bash -e {0} 2026-10-24T15:12:23.7522604Z env: 2026-10-24T15:12:23.7522717Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 173 2026-10-24T15:12:23.7522869Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 386 2026-10-24T15:12:23.7523012Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T15:12:23.7523150Z ##[endgroup] 2026-10-24T15:12:23.9074514Z ~/packages/source-control-github$ graphqlgen --check ⊘ cache disabled 2026-10-24T15:12:24.1149548Z 2026-10-24T15:12:24.1238958Z ##[group]Run vp run --filter t3 generate --check 2026-10-24T15:12:24.1239307Z vp run --filter t3 generate --check 2026-10-24T15:12:24.1270603Z shell: /usr/bin/bash -e {0} 2026-10-24T15:12:24.1270820Z env: 2026-10-24T15:12:24.1271021Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 173 2026-10-24T15:12:24.1271265Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 386 2026-10-24T15:12:24.1271502Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T15:12:24.1271721Z ##[endgroup] 2026-10-24T15:12:24.2862380Z ~/apps/server$ graphqlgen --check ⊘ cache disabled 2026-10-24T15:12:24.4608658Z 2026-10-24T15:12:24.4704563Z ##[group]Run vp check 2026-10-24T15:12:24.4704718Z vp check 2026-10-24T15:12:24.4725618Z shell: /usr/bin/bash -e {0} 2026-10-24T15:12:24.4725752Z env: 2026-10-24T15:12:24.4725865Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 173 2026-10-24T15:12:24.4726017Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 386 2026-10-24T15:12:24.4726160Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T15:12:24.4726296Z ##[endgroup] 2026-10-24T15:12:25.0758555Z pass: All 5749 files are correctly formatted (456ms, 8 threads) 2026-10-24T15:12:30.3500920Z warn: Lint warnings found 2026-10-24T15:12:30.3502314Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T15:12:30.3502788Z ╭─[apps/mobile/src/components/VideoPreviewModal.ios.tsx:63:55] 2026-10-24T15:12:30.3503017Z 61 │ }, []); 2026-10-24T15:12:30.3503168Z 62 │ useEffect(() => { 2026-10-24T15:12:30.3503378Z ·  ────┬──── 2026-10-24T15:12:30.3503657Z · ╰── This is the containing effect 2026-10-24T15:12:30.3503984Z 63 │ if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl); 2026-10-24T15:12:30.3504280Z ·  ───────┬────── 2026-10-24T15:12:30.3504676Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.3504972Z 64 │ }, [playbackUrl, resolvedUrl]); 2026-10-24T15:12:30.3505145Z ╰──── 2026-10-24T15:12:30.3505827Z  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-24T15:12:30.3506792Z  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-24T15:12:30.3507118Z 2026-10-24T15:12:30.3507378Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T15:12:30.3507786Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:290:50] 2026-10-24T15:12:30.3508021Z 289 │ return ( 2026-10-24T15:12:30.3508241Z 290 │ 2026-10-24T15:12:30.3508531Z ·  ───────────── 2026-10-24T15:12:30.3508739Z 291 │ {props.children} 2026-10-24T15:12:30.3508886Z ╰──── 2026-10-24T15:12:30.3509175Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T15:12:30.3509546Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T15:12:30.3509983Z 2026-10-24T15:12:30.3510235Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T15:12:30.3510656Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:654:44] 2026-10-24T15:12:30.3510890Z 653 │ return ( 2026-10-24T15:12:30.3511100Z 654 │ 2026-10-24T15:12:30.3511356Z ·  ───────────── 2026-10-24T15:12:30.3511557Z 655 │ {props.children} 2026-10-24T15:12:30.3511699Z ╰──── 2026-10-24T15:12:30.3511984Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T15:12:30.3512345Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T15:12:30.3512529Z 2026-10-24T15:12:30.3512776Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T15:12:30.3513336Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1462:55] 2026-10-24T15:12:30.3513653Z 1461 │ return ( 2026-10-24T15:12:30.3513895Z 1462 │ 2026-10-24T15:12:30.3514215Z ·  ──────────────────── 2026-10-24T15:12:30.3514455Z 1463 │ { 2026-10-24T15:12:30.3517607Z 174 │ rotation.value = withTiming(props.expanded ? expandedAngle : 0, { 2026-10-24T15:12:30.3517829Z ·  ────┬─── 2026-10-24T15:12:30.3518062Z · ╰── `rotation` cannot be modified 2026-10-24T15:12:30.3518304Z 175 │ duration: THREAD_DISCLOSURE_TRANSITION_MS, 2026-10-24T15:12:30.3518490Z ╰──── 2026-10-24T15:12:30.3518839Z  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-24T15:12:30.3519425Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T15:12:30.3519751Z 2026-10-24T15:12:30.3519954Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T15:12:30.3520312Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:1246:23] 2026-10-24T15:12:30.3520540Z 1245 │ { 2026-10-24T15:12:30.3523092Z ·  ────┬──── 2026-10-24T15:12:30.3523314Z · ╰── This is the containing effect 2026-10-24T15:12:30.3523666Z 279 │ setNow(new Date().toISOString()); 2026-10-24T15:12:30.3523879Z ·  ───┬── 2026-10-24T15:12:30.3524138Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.3524445Z 280 │ const id = setInterval(() => setNow(new Date().toISOString()), 60_000); 2026-10-24T15:12:30.3524651Z ╰──── 2026-10-24T15:12:30.3525314Z  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-24T15:12:30.3526204Z  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-24T15:12:30.3526517Z 2026-10-24T15:12:30.3526761Z ⚠ eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used. 2026-10-24T15:12:30.3527151Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:13:8] 2026-10-24T15:12:30.3527392Z 12 │ threadSearchMatchKey, 2026-10-24T15:12:30.3527575Z 13 │ type EnvironmentThreadSearchMatch, 2026-10-24T15:12:30.3527787Z ·  ──────────────┬───────────── 2026-10-24T15:12:30.3528081Z · ╰── 'EnvironmentThreadSearchMatch' is imported here 2026-10-24T15:12:30.3528363Z 14 │ } from "@t3tools/client-runtime/state/thread-search"; 2026-10-24T15:12:30.3528542Z ╰──── 2026-10-24T15:12:30.3528695Z  help: Consider removing this import. 2026-10-24T15:12:30.3528816Z 2026-10-24T15:12:30.3529030Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T15:12:30.3529406Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:359:25] 2026-10-24T15:12:30.3529717Z 358 │ // range) the boundary string is identical and the chain would die. 2026-10-24T15:12:30.3530716Z 359 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-24T15:12:30.3530937Z ·  ───────┬────── 2026-10-24T15:12:30.3531217Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T15:12:30.3531499Z 360 │ const listItems = ((): readonly SidebarListItem[] => { 2026-10-24T15:12:30.3531682Z ╰──── 2026-10-24T15:12:30.3532044Z  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-24T15:12:30.3532654Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.3532963Z 2026-10-24T15:12:30.3533137Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T15:12:30.3533477Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:350:53] 2026-10-24T15:12:30.3533769Z 349 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-24T15:12:30.3534036Z 350 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-24T15:12:30.3534324Z ·  ─────┬──── 2026-10-24T15:12:30.3534621Z · ╰── Cannot call impure function 2026-10-24T15:12:30.3534991Z 351 │ const id = setTimeout(() => { 2026-10-24T15:12:30.3535197Z ╰──── 2026-10-24T15:12:30.3535543Z  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-24T15:12:30.3536124Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T15:12:30.3536412Z 2026-10-24T15:12:30.3536894Z ⚠ 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-24T15:12:30.3537495Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7] 2026-10-24T15:12:30.3537785Z 565 │ let afterSequence = created[0]!.sequence; 2026-10-24T15:12:30.3538107Z 566 │ ╭─▶ for (let index = 1; index <= 32; index += 1) { 2026-10-24T15:12:30.3538401Z 567 │ │ const nextEvent = { 2026-10-24T15:12:30.3538679Z 568 │ │ id: EventId.make(`event:foundation-stream-race:${index}`), 2026-10-24T15:12:30.3538982Z 569 │ │ type: "thread.metadata-updated" as const, 2026-10-24T15:12:30.3539220Z 570 │ │ threadId, 2026-10-24T15:12:30.3539432Z 571 │ │ providerInstanceId, 2026-10-24T15:12:30.3539657Z 572 │ │ occurredAt: now, 2026-10-24T15:12:30.3539920Z 573 │ │ payload: { ...thread, title: `Race update ${index}` }, 2026-10-24T15:12:30.3540215Z 574 │ │ } satisfies OrchestrationV2DomainEvent; 2026-10-24T15:12:30.3540474Z 575 │ │ const reader = yield* eventSink 2026-10-24T15:12:30.3540728Z 576 │ │ .stream({ threadId, afterSequence }) 2026-10-24T15:12:30.3540998Z 577 │ │ .pipe(Stream.runHead, Effect.forkChild); 2026-10-24T15:12:30.3541252Z 578 │ │ yield* Effect.yieldNow; 2026-10-24T15:12:30.3541538Z 579 │ │ const written = yield* eventSink.write({ events: [nextEvent] }); 2026-10-24T15:12:30.3541842Z 580 │ │ const received = yield* Fiber.join(reader); 2026-10-24T15:12:30.3542099Z 581 │ │ if (Option.isNone(received)) { 2026-10-24T15:12:30.3542443Z 582 │ │ return yield* Effect.die("The event stream ended before delivering the live event."); 2026-10-24T15:12:30.3542731Z 583 │ │ } 2026-10-24T15:12:30.3542999Z 584 │ │ assert.equal(received.value.sequence, written[0]?.sequence); 2026-10-24T15:12:30.3543313Z 585 │ │ assert.equal(received.value.event.id, nextEvent.id); 2026-10-24T15:12:30.3543832Z 586 │ │ afterSequence = received.value.sequence; 2026-10-24T15:12:30.3544119Z 587 │ ╰─▶ } 2026-10-24T15:12:30.3544319Z 588 │ }), 2026-10-24T15:12:30.3544450Z ╰──── 2026-10-24T15:12:30.3544504Z 2026-10-24T15:12:30.3545056Z ⚠ 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-24T15:12:30.3545699Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:2327:9] 2026-10-24T15:12:30.3545954Z 2326 │ let settled = false; 2026-10-24T15:12:30.3546220Z 2327 │ ╭─▶ while (!settled) { 2026-10-24T15:12:30.3546544Z 2328 │ │ settled = (yield* outbox.listByCommandId(commandId)).every( 2026-10-24T15:12:30.3546849Z 2329 │ │ (effect) => effect.status === "succeeded", 2026-10-24T15:12:30.3547074Z 2330 │ │ ); 2026-10-24T15:12:30.3547306Z 2331 │ │ if (!settled) yield* Effect.yieldNow; 2026-10-24T15:12:30.3547583Z 2332 │ ╰─▶ } 2026-10-24T15:12:30.3547863Z 2333 │ }).pipe(Effect.provide(layerWorker), Effect.scoped); 2026-10-24T15:12:30.3548058Z ╰──── 2026-10-24T15:12:30.3548118Z 2026-10-24T15:12:30.3548322Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T15:12:30.3548669Z ╭─[apps/mobile/src/state/use-thread-outbox-drain.ts:1321:5] 2026-10-24T15:12:30.3548900Z 1320 │ queuedMessagesByThreadKey, 2026-10-24T15:12:30.3549068Z 1321 │ retryTick, 2026-10-24T15:12:30.3549223Z ·  ────┬──── 2026-10-24T15:12:30.3549460Z · ╰── Unnecessary dependency `retryTick` 2026-10-24T15:12:30.3549677Z 1322 │ restoreQueuedMessage, 2026-10-24T15:12:30.3549825Z ╰──── 2026-10-24T15:12:30.3550191Z  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-24T15:12:30.3550803Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.3551108Z 2026-10-24T15:12:30.3551315Z ⚠ eslint(no-unsafe-optional-chaining): Unsafe usage of optional chaining 2026-10-24T15:12:30.3551687Z ╭─[apps/server/src/orchestration-v2/ThreadLaunchService.test.ts:1783:8] 2026-10-24T15:12:30.3551927Z 1782 │ assert.equal( 2026-10-24T15:12:30.3552160Z 1783 │ (stored.context?.records[0] as { attachmentId: string }).attachmentId, 2026-10-24T15:12:30.3552418Z ·  ────────────────────────── 2026-10-24T15:12:30.3552615Z 1784 │ stored.attachments[0]?.id, 2026-10-24T15:12:30.3552768Z ╰──── 2026-10-24T15:12:30.3553006Z  help: If this short-circuits with 'undefined' the evaluation will throw TypeError 2026-10-24T15:12:30.3553187Z 2026-10-24T15:12:30.3553453Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T15:12:30.3553925Z ╭─[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:60:5] 2026-10-24T15:12:30.3554161Z 58 │ 2026-10-24T15:12:30.3554287Z 59 │ useEffect(() => { 2026-10-24T15:12:30.3554447Z ·  ────┬──── 2026-10-24T15:12:30.3554670Z · ╰── This is the containing effect 2026-10-24T15:12:30.3554892Z 60 │ setMountedModes((current) => { 2026-10-24T15:12:30.3555073Z ·  ───────┬─────── 2026-10-24T15:12:30.3555418Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.3555709Z 61 │ if (current.has(props.mode)) { 2026-10-24T15:12:30.3555869Z ╰──── 2026-10-24T15:12:30.3556542Z  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-24T15:12:30.3557442Z  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-24T15:12:30.3557756Z 2026-10-24T15:12:30.3557981Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T15:12:30.3558336Z ╭─[packages/shared/src/serverSettings.ts:346:9] 2026-10-24T15:12:30.3558583Z 345 │ const entry: ProjectSettingsOverrides = { 2026-10-24T15:12:30.3558841Z 346 │ ...(entries.get(projectId) ?? currentEntries[projectId] ?? {}), 2026-10-24T15:12:30.3559141Z ·  ────────────────────────────────────────────────────────────── 2026-10-24T15:12:30.3559353Z 347 │ }; 2026-10-24T15:12:30.3559480Z ╰──── 2026-10-24T15:12:30.3559814Z  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-24T15:12:30.3560075Z 2026-10-24T15:12:30.3560308Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in Array.prototype.reduce() 2026-10-24T15:12:30.3560650Z ╭─[packages/shared/src/serverSettings.ts:448:24] 2026-10-24T15:12:30.3560858Z 447 │ const favorites = 2026-10-24T15:12:30.3561062Z 448 │ setModelFavorites?.reduce((current, change) => { 2026-10-24T15:12:30.3561278Z ·  ───┬── 2026-10-24T15:12:30.3561509Z · ╰── For this reduce 2026-10-24T15:12:30.3561724Z 449 │ const exists = current.some( 2026-10-24T15:12:30.3562003Z 450 │ (favorite) => favorite.provider === change.provider && favorite.model === change.model, 2026-10-24T15:12:30.3562243Z 451 │ ); 2026-10-24T15:12:30.3562385Z 452 │ return change.favorite 2026-10-24T15:12:30.3562548Z 453 │ ? exists 2026-10-24T15:12:30.3562691Z 454 │ ? current 2026-10-24T15:12:30.3562911Z 455 │ : [...current, { provider: change.provider, model: change.model }] 2026-10-24T15:12:30.3563181Z ·  ─────┬──── 2026-10-24T15:12:30.3581717Z · ╰── From this spread 2026-10-24T15:12:30.3582121Z 456 │ : current.filter( 2026-10-24T15:12:30.3582283Z ╰──── 2026-10-24T15:12:30.3582571Z  help: Consider using `Object.assign()` or `Array.prototype.push()` to mutate the accumulator instead. 2026-10-24T15:12:30.3582969Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T15:12:30.3583146Z 2026-10-24T15:12:30.3583349Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-24T15:12:30.3583705Z ╭─[packages/shared/src/serverSettings.ts:466:3] 2026-10-24T15:12:30.3583906Z 464 │ null; 2026-10-24T15:12:30.3584108Z 465 │ let nextModelPreferences = initialModelPreferences; 2026-10-24T15:12:30.3584339Z ·  ──────────┬───────── 2026-10-24T15:12:30.3584589Z · ╰── From this accumulator 2026-10-24T15:12:30.3584835Z 466 │ for (const change of setModelsHidden ?? []) { 2026-10-24T15:12:30.3585031Z ·  ─┬─ 2026-10-24T15:12:30.3585224Z · ╰── For this loop 2026-10-24T15:12:30.3585487Z 467 │ const preferences = nextModelPreferences?.[change.provider] ?? { 2026-10-24T15:12:30.3585706Z 468 │ hiddenModels: [], 2026-10-24T15:12:30.3585863Z 469 │ modelOrder: [], 2026-10-24T15:12:30.3586018Z 470 │ }; 2026-10-24T15:12:30.3586267Z 471 │ const hiddenModels = preferences.hiddenModels.filter((model) => model !== change.model); 2026-10-24T15:12:30.3586575Z 472 │ if (change.hidden) hiddenModels.push(change.model); 2026-10-24T15:12:30.3586782Z 473 │ nextModelPreferences = { 2026-10-24T15:12:30.3586970Z 474 │ ...nextModelPreferences, 2026-10-24T15:12:30.3587174Z ·  ───────────┬─────────── 2026-10-24T15:12:30.3587413Z · ╰── From this spread 2026-10-24T15:12:30.3587660Z 475 │ [change.provider]: { ...preferences, hiddenModels }, 2026-10-24T15:12:30.3587849Z ╰──── 2026-10-24T15:12:30.3588066Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-24T15:12:30.3588389Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T15:12:30.3588559Z 2026-10-24T15:12:30.3588797Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T15:12:30.3589158Z ╭─[apps/mobile/src/state/use-composer-drafts.ts:1022:15] 2026-10-24T15:12:30.3589380Z 1021 │ instanceId, 2026-10-24T15:12:30.3589625Z 1022 │ { ...(persisted.modelOptionMemory[instanceId] ?? {}), ...models }, 2026-10-24T15:12:30.3589928Z ·  ────────────────────────────────────────────────── 2026-10-24T15:12:30.3590133Z 1023 │ ]), 2026-10-24T15:12:30.3590272Z ╰──── 2026-10-24T15:12:30.3590604Z  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-24T15:12:30.3590869Z 2026-10-24T15:12:30.3591139Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T15:12:30.3591531Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2146:5] 2026-10-24T15:12:30.3591746Z 2144 │ ); 2026-10-24T15:12:30.3591883Z 2145 │ useEffect(() => { 2026-10-24T15:12:30.3592149Z ·  ────┬──── 2026-10-24T15:12:30.3592404Z · ╰── This is the containing effect 2026-10-24T15:12:30.3592621Z 2146 │ setExpandedVideo(null); 2026-10-24T15:12:30.3592803Z ·  ────────┬─────── 2026-10-24T15:12:30.3593069Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.3593307Z 2147 │ setExpandedFile(null); 2026-10-24T15:12:30.3593446Z ╰──── 2026-10-24T15:12:30.3594140Z  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-24T15:12:30.3595029Z  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-24T15:12:30.3595343Z 2026-10-24T15:12:30.3595603Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T15:12:30.3595985Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2647:9] 2026-10-24T15:12:30.3596270Z 2638 │ const stopFollowingEnd = useEffectEvent(() => setEndFollow(false)); 2026-10-24T15:12:30.3596482Z 2639 │ useEffect(() => { 2026-10-24T15:12:30.3596635Z ·  ────┬──── 2026-10-24T15:12:30.3596847Z · ╰── This is the containing effect 2026-10-24T15:12:30.3597111Z 2640 │ if (!jumpToMessageId || loadedListKey !== listMountKey) return; 2026-10-24T15:12:30.3597350Z 2641 │ const index = presentedFeed.findIndex( 2026-10-24T15:12:30.3597601Z 2642 │ (entry) => entry.type === "message" && entry.id === jumpToMessageId, 2026-10-24T15:12:30.3597797Z 2643 │ ); 2026-10-24T15:12:30.3597941Z 2644 │ if (index === -1) { 2026-10-24T15:12:30.3598157Z 2645 │ const runId = messageFoldRunId(props.feed, jumpToMessageId); 2026-10-24T15:12:30.3598403Z 2646 │ if (runId && !expandedTurnIds.has(runId)) { 2026-10-24T15:12:30.3598618Z 2647 │ setInteractionState((current) => ({ 2026-10-24T15:12:30.3598817Z ·  ─────────┬───────── 2026-10-24T15:12:30.3599100Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.3599341Z 2648 │ ...current, 2026-10-24T15:12:30.3599482Z ╰──── 2026-10-24T15:12:30.3600156Z  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-24T15:12:30.3601036Z  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-24T15:12:30.3601349Z 2026-10-24T15:12:30.3601582Z ⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used. 2026-10-24T15:12:30.3601944Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:66:10] 2026-10-24T15:12:30.3602228Z 65 │ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets"; 2026-10-24T15:12:30.3602580Z 66 │ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks"; 2026-10-24T15:12:30.3602881Z ·  ───────────┬─────────── 2026-10-24T15:12:30.3603162Z · ╰── 'isMarkdownFileLinkLabel' is imported here 2026-10-24T15:12:30.3603485Z 67 │ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments"; 2026-10-24T15:12:30.3603744Z ╰──── 2026-10-24T15:12:30.3603901Z  help: Consider removing this import. 2026-10-24T15:12:30.3604018Z 2026-10-24T15:12:30.3604232Z ⚠ eslint(no-unused-vars): Identifier 'createContext' is imported but never used. 2026-10-24T15:12:30.3604569Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:92:3] 2026-10-24T15:12:30.3604778Z 91 │ import { 2026-10-24T15:12:30.3604913Z 92 │ createContext, 2026-10-24T15:12:30.3605073Z ·  ──────┬────── 2026-10-24T15:12:30.3605337Z · ╰── 'createContext' is imported here 2026-10-24T15:12:30.3605720Z 93 │ memo, 2026-10-24T15:12:30.3605848Z ╰──── 2026-10-24T15:12:30.3606007Z  help: Consider removing this import. 2026-10-24T15:12:30.3606123Z 2026-10-24T15:12:30.3606347Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-24T15:12:30.3606706Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:108:3] 2026-10-24T15:12:30.3606917Z 107 │ import { 2026-10-24T15:12:30.3607059Z 108 │ ActivityIndicator, 2026-10-24T15:12:30.3607234Z ·  ────────┬──────── 2026-10-24T15:12:30.3607482Z · ╰── 'ActivityIndicator' is imported here 2026-10-24T15:12:30.3607696Z 109 │ Image, 2026-10-24T15:12:30.3607819Z ╰──── 2026-10-24T15:12:30.3607987Z  help: Consider removing this import. 2026-10-24T15:12:30.3608105Z 2026-10-24T15:12:30.3608317Z ⚠ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used. 2026-10-24T15:12:30.3608658Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:115:3] 2026-10-24T15:12:30.3608868Z 114 │ Pressable, 2026-10-24T15:12:30.3609013Z 115 │ ScrollView, 2026-10-24T15:12:30.3609165Z ·  ─────┬──── 2026-10-24T15:12:30.3609390Z · ╰── 'ScrollView' is imported here 2026-10-24T15:12:30.3609598Z 116 │ StyleSheet, 2026-10-24T15:12:30.3609729Z ╰──── 2026-10-24T15:12:30.3609889Z  help: Consider removing this import. 2026-10-24T15:12:30.3610646Z 2026-10-24T15:12:30.3610858Z ⚠ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used. 2026-10-24T15:12:30.3611204Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:117:11] 2026-10-24T15:12:30.3611415Z 116 │ StyleSheet, 2026-10-24T15:12:30.3611564Z 117 │ Text as NativeText, 2026-10-24T15:12:30.3611734Z ·  ─────┬──── 2026-10-24T15:12:30.3611981Z · ╰── 'NativeText' is imported here 2026-10-24T15:12:30.3612194Z 118 │ type ColorValue, 2026-10-24T15:12:30.3612334Z ╰──── 2026-10-24T15:12:30.3612489Z  help: Consider removing this import. 2026-10-24T15:12:30.3612603Z 2026-10-24T15:12:30.3612821Z ⚠ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used. 2026-10-24T15:12:30.3613174Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:140:10] 2026-10-24T15:12:30.3613580Z 139 │ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic"; 2026-10-24T15:12:30.3613905Z 140 │ import { tryOpenExternalUrl } from "../../lib/openExternalUrl"; 2026-10-24T15:12:30.3614140Z ·  ─────────┬──────── 2026-10-24T15:12:30.3614406Z · ╰── 'tryOpenExternalUrl' is imported here 2026-10-24T15:12:30.3614715Z 141 │ import { downloadAndShareAttachment } from "../../lib/attachmentDownload"; 2026-10-24T15:12:30.3614933Z ╰──── 2026-10-24T15:12:30.3615086Z  help: Consider removing this import. 2026-10-24T15:12:30.3615201Z 2026-10-24T15:12:30.3615429Z ⚠ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used. 2026-10-24T15:12:30.3615784Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:143:10] 2026-10-24T15:12:30.3616080Z 142 │ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks"; 2026-10-24T15:12:30.3616361Z 143 │ import { faviconUrlForOrigin } from "@t3tools/shared/favicon"; 2026-10-24T15:12:30.3616598Z ·  ─────────┬───────── 2026-10-24T15:12:30.3616860Z · ╰── 'faviconUrlForOrigin' is imported here 2026-10-24T15:12:30.3617082Z 144 │ import { 2026-10-24T15:12:30.3617205Z ╰──── 2026-10-24T15:12:30.3617359Z  help: Consider removing this import. 2026-10-24T15:12:30.3617476Z 2026-10-24T15:12:30.3617697Z ⚠ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used. 2026-10-24T15:12:30.3618045Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:157:10] 2026-10-24T15:12:30.3618352Z 156 │ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile"; 2026-10-24T15:12:30.3618656Z 157 │ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer"; 2026-10-24T15:12:30.3618900Z ·  ────────┬─────── 2026-10-24T15:12:30.3619156Z · ╰── 'MediaVideoPlayer' is imported here 2026-10-24T15:12:30.3619454Z 158 │ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia"; 2026-10-24T15:12:30.3619661Z ╰──── 2026-10-24T15:12:30.3619819Z  help: Consider removing this import. 2026-10-24T15:12:30.3619934Z 2026-10-24T15:12:30.3620159Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used. 2026-10-24T15:12:30.3620518Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:161:3] 2026-10-24T15:12:30.3620748Z 160 │ attachmentVideoPreviewSource, 2026-10-24T15:12:30.3621000Z 161 │ mediaVideoPreviewUri, 2026-10-24T15:12:30.3621214Z ·  ──────────┬───────── 2026-10-24T15:12:30.3621474Z · ╰── 'mediaVideoPreviewUri' is imported here 2026-10-24T15:12:30.3621703Z 162 │ mediaVideoThumbnailKey, 2026-10-24T15:12:30.3621850Z ╰──── 2026-10-24T15:12:30.3622009Z  help: Consider removing this import. 2026-10-24T15:12:30.3622125Z 2026-10-24T15:12:30.3622353Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used. 2026-10-24T15:12:30.3622715Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:162:3] 2026-10-24T15:12:30.3622932Z 161 │ mediaVideoPreviewUri, 2026-10-24T15:12:30.3623099Z 162 │ mediaVideoThumbnailKey, 2026-10-24T15:12:30.3623281Z ·  ───────────┬────────── 2026-10-24T15:12:30.3623585Z · ╰── 'mediaVideoThumbnailKey' is imported here 2026-10-24T15:12:30.3623835Z 163 │ type MediaVideoPreviewSource, 2026-10-24T15:12:30.3623992Z ╰──── 2026-10-24T15:12:30.3624147Z  help: Consider removing this import. 2026-10-24T15:12:30.3624261Z 2026-10-24T15:12:30.3624483Z ⚠ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used. 2026-10-24T15:12:30.3624829Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:163:8] 2026-10-24T15:12:30.3625049Z 162 │ mediaVideoThumbnailKey, 2026-10-24T15:12:30.3625220Z 163 │ type MediaVideoPreviewSource, 2026-10-24T15:12:30.3625418Z ·  ───────────┬─────────── 2026-10-24T15:12:30.3625694Z · ╰── 'MediaVideoPreviewSource' is imported here 2026-10-24T15:12:30.3625955Z 164 │ } from "../../lib/videoPreviewSource"; 2026-10-24T15:12:30.3626122Z ╰──── 2026-10-24T15:12:30.3626274Z  help: Consider removing this import. 2026-10-24T15:12:30.3626390Z 2026-10-24T15:12:30.3626595Z ⚠ eslint(no-unused-vars): Type 'ReviewDiffTheme' is imported but never used. 2026-10-24T15:12:30.3626930Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:171:15] 2026-10-24T15:12:30.3627264Z 170 │ import { parseReviewCommentMessageSegments } from "../review/reviewCommentSelection"; 2026-10-24T15:12:30.3627592Z 171 │ import type { ReviewDiffTheme } from "../review/shikiReviewHighlighter"; 2026-10-24T15:12:30.3627846Z ·  ───────┬─────── 2026-10-24T15:12:30.3628109Z · ╰── 'ReviewDiffTheme' is imported here 2026-10-24T15:12:30.3628325Z 172 │ import { 2026-10-24T15:12:30.3628454Z ╰──── 2026-10-24T15:12:30.3628618Z  help: Consider removing this import. 2026-10-24T15:12:30.3628730Z 2026-10-24T15:12:30.3628966Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used. 2026-10-24T15:12:30.3629331Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:186:3] 2026-10-24T15:12:30.3629537Z 185 │ import { 2026-10-24T15:12:30.3629682Z 186 │ resolveMarkdownFontSizes, 2026-10-24T15:12:30.3629875Z ·  ────────────┬─────────── 2026-10-24T15:12:30.3630141Z · ╰── 'resolveMarkdownFontSizes' is imported here 2026-10-24T15:12:30.3630395Z 187 │ resolveNativeMarkdownTypography, 2026-10-24T15:12:30.3630558Z ╰──── 2026-10-24T15:12:30.3630715Z  help: Consider removing this import. 2026-10-24T15:12:30.3630893Z 2026-10-24T15:12:30.3631194Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used. 2026-10-24T15:12:30.3631585Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:193:3] 2026-10-24T15:12:30.3631864Z 192 │ normalizeNativeMarkdownUrl, 2026-10-24T15:12:30.3632066Z 193 │ resolveMarkdownInlineCodePresentation, 2026-10-24T15:12:30.3632298Z ·  ──────────────────┬────────────────── 2026-10-24T15:12:30.3632622Z · ╰── 'resolveMarkdownInlineCodePresentation' is imported here 2026-10-24T15:12:30.3632904Z 194 │ resolveMarkdownLinkPresentation, 2026-10-24T15:12:30.3633069Z ╰──── 2026-10-24T15:12:30.3633223Z  help: Consider removing this import. 2026-10-24T15:12:30.3633338Z 2026-10-24T15:12:30.3633611Z ⚠ eslint(no-unused-vars): Identifier 'useMarkdownCodeHighlight' is imported but never used. 2026-10-24T15:12:30.3633980Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:233:10] 2026-10-24T15:12:30.3634239Z 232 │ import { ThreadMcpApp } from "./McpAppWebView"; 2026-10-24T15:12:30.3634509Z 233 │ import { useMarkdownCodeHighlight } from "./markdownCodeHighlightState"; 2026-10-24T15:12:30.3634775Z ·  ────────────┬─────────── 2026-10-24T15:12:30.3635061Z · ╰── 'useMarkdownCodeHighlight' is imported here 2026-10-24T15:12:30.3635288Z 234 │ import { 2026-10-24T15:12:30.3635414Z ╰──── 2026-10-24T15:12:30.3635568Z  help: Consider removing this import. 2026-10-24T15:12:30.3635683Z 2026-10-24T15:12:30.3635906Z ⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used. 2026-10-24T15:12:30.3636256Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:237:3] 2026-10-24T15:12:30.3636472Z 236 │ useAssetUrl, 2026-10-24T15:12:30.3636619Z 237 │ useAssetUrlState, 2026-10-24T15:12:30.3636789Z ·  ────────┬─────── 2026-10-24T15:12:30.3637028Z · ╰── 'useAssetUrlState' is imported here 2026-10-24T15:12:30.3637241Z 238 │ useRefreshAssetUrl, 2026-10-24T15:12:30.3637375Z ╰──── 2026-10-24T15:12:30.3637524Z  help: Consider removing this import. 2026-10-24T15:12:30.3637636Z 2026-10-24T15:12:30.3637844Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T15:12:30.3638181Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2148:7] 2026-10-24T15:12:30.3638408Z 2147 │ setExpandedFile(null); 2026-10-24T15:12:30.3638663Z 2148 │ }, [props.environmentId, props.threadId, props.contentPresentation.kind]); 2026-10-24T15:12:30.3639077Z ·  ─────────┬───────── ───────┬────── ───────────────┬────────────── 2026-10-24T15:12:30.3639598Z · │ │ ╰── Unnecessary dependency `props.contentPresentation.kind` 2026-10-24T15:12:30.3640071Z · │ ╰── Unnecessary dependency `props.threadId` 2026-10-24T15:12:30.3640431Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-24T15:12:30.3640810Z 2149 │ const horizontalPadding = props.layoutVariant === "split" ? 20 : 16; 2026-10-24T15:12:30.3641057Z ╰──── 2026-10-24T15:12:30.3641417Z  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-24T15:12:30.3642021Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.3642326Z 2026-10-24T15:12:30.3642533Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T15:12:30.3642882Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2616:7] 2026-10-24T15:12:30.3643133Z 2615 │ reportHeaderMaterialVisibility(false); 2026-10-24T15:12:30.3643368Z 2616 │ }, [feedThreadKey, reportHeaderMaterialVisibility]); 2026-10-24T15:12:30.3643629Z ·  ──────┬────── 2026-10-24T15:12:30.3643885Z · ╰── Unnecessary dependency `feedThreadKey` 2026-10-24T15:12:30.3644097Z 2617 │ 2026-10-24T15:12:30.3644210Z ╰──── 2026-10-24T15:12:30.3644567Z  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-24T15:12:30.3645165Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.3645468Z 2026-10-24T15:12:30.3645673Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T15:12:30.3646011Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2632:7] 2026-10-24T15:12:30.3646220Z 2631 │ } 2026-10-24T15:12:30.3646426Z 2632 │ }, [listMountKey, props.contentInsetEndAdjustment, listRef]); 2026-10-24T15:12:30.3646657Z ·  ──────┬───── 2026-10-24T15:12:30.3646902Z · ╰── Unnecessary dependency `listMountKey` 2026-10-24T15:12:30.3647202Z 2633 │ // Opening at a message: its run unfolds, the list stops following the end 2026-10-24T15:12:30.3647409Z ╰──── 2026-10-24T15:12:30.3647764Z  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-24T15:12:30.3648357Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.3648658Z 2026-10-24T15:12:30.3648927Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T15:12:30.3649303Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2828:7] 2026-10-24T15:12:30.3649509Z 2827 │ } 2026-10-24T15:12:30.3649763Z 2828 │ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]); 2026-10-24T15:12:30.3650241Z ·  ───────┬─────── ─────────┬──────── ────────┬─────── 2026-10-24T15:12:30.3650695Z · │ │ ╰── Unnecessary dependency `expandedWorkRows` 2026-10-24T15:12:30.3651138Z · │ ╰── Unnecessary dependency `expandedWorkGroups` 2026-10-24T15:12:30.3651505Z · ╰── Unnecessary dependency `expandedTurnIds` 2026-10-24T15:12:30.3651727Z 2829 │ 2026-10-24T15:12:30.3651840Z ╰──── 2026-10-24T15:12:30.3652191Z  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-24T15:12:30.3652785Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.3653088Z 2026-10-24T15:12:30.3653274Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T15:12:30.3653627Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:618:9] 2026-10-24T15:12:30.3653836Z 617 │ }; 2026-10-24T15:12:30.3654023Z 618 │ }, [props.environmentId, attachment.id, httpBaseUrl]), 2026-10-24T15:12:30.3654366Z ·  ─────────┬───────── ──────┬────── ─────┬───── 2026-10-24T15:12:30.3654801Z · │ │ ╰── Unnecessary dependency `httpBaseUrl` 2026-10-24T15:12:30.3655227Z · │ ╰── Unnecessary dependency `attachment.id` 2026-10-24T15:12:30.3655585Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-24T15:12:30.3655808Z 619 │ ); 2026-10-24T15:12:30.3655926Z ╰──── 2026-10-24T15:12:30.3656304Z  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-24T15:12:30.3656931Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.3657236Z 2026-10-24T15:12:30.3657389Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.3657698Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:152:27] 2026-10-24T15:12:30.3658048Z 151 │ 2026-10-24T15:12:30.3658314Z 152 │ {props.children(open)} 2026-10-24T15:12:30.3658510Z ·  ──┬─ 2026-10-24T15:12:30.3658779Z · ╰── Cannot access ref value during render 2026-10-24T15:12:30.3659001Z 153 │ 2026-10-24T15:12:30.3659213Z ╰──── 2026-10-24T15:12:30.3659789Z  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-24T15:12:30.3660520Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.3660805Z 2026-10-24T15:12:30.3661005Z ⚠ react(memo-dependencies): Found missing/extra memoization dependencies 2026-10-24T15:12:30.3661358Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:140:9] 2026-10-24T15:12:30.3661603Z 139 │ if (action.id !== undefined) { 2026-10-24T15:12:30.3661788Z 140 │ props.onPressAction?.({ 2026-10-24T15:12:30.3661967Z ·  ──┬── 2026-10-24T15:12:30.3662196Z · ╰── Missing dependency `props` 2026-10-24T15:12:30.3662429Z 141 │ nativeEvent: { event: action.id }, 2026-10-24T15:12:30.3662707Z 142 │ } as Parameters>[0]); 2026-10-24T15:12:30.3662925Z 143 │ } 2026-10-24T15:12:30.3663050Z 144 │ }, 2026-10-24T15:12:30.3663200Z 145 │ [close, props.onPressAction], 2026-10-24T15:12:30.3663409Z ·  ─────────┬───────── 2026-10-24T15:12:30.3663777Z · ╰── Overly precise dependency `props.onPressAction`, use `props` instead 2026-10-24T15:12:30.3664043Z 146 │ ); 2026-10-24T15:12:30.3664158Z ╰──── 2026-10-24T15:12:30.3664716Z  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-24T15:12:30.3665479Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.3665785Z 2026-10-24T15:12:30.3666003Z ⚠ eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used. 2026-10-24T15:12:30.3666318Z ╭─[infra/relay/src/http/Api.ts:69:13] 2026-10-24T15:12:30.3666583Z 68 │ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts"; 2026-10-24T15:12:30.3666856Z 69 │ import * as HookForwarder from "../hooks/HookForwarder.ts"; 2026-10-24T15:12:30.3667079Z ·  ──────┬────── 2026-10-24T15:12:30.3667331Z · ╰── 'HookForwarder' is imported here 2026-10-24T15:12:30.3667589Z 70 │ import * as HeldHooks from "../hooks/HeldHooks.ts"; 2026-10-24T15:12:30.3667761Z ╰──── 2026-10-24T15:12:30.3667917Z  help: Consider removing this import. 2026-10-24T15:12:30.3668030Z 2026-10-24T15:12:30.3668267Z ⚠ eslint(no-unused-vars): Function 'resolveThreadWorkspaceCwd' is declared but never used. 2026-10-24T15:12:30.3668616Z ╭─[apps/server/src/checkpointing/Utils.ts:12:10] 2026-10-24T15:12:30.3668801Z 11 │ 2026-10-24T15:12:30.3668958Z 12 │ function resolveThreadWorkspaceCwd(input: { 2026-10-24T15:12:30.3669171Z ·  ────────────┬──────────── 2026-10-24T15:12:30.3669450Z · ╰── 'resolveThreadWorkspaceCwd' is declared here 2026-10-24T15:12:30.3669751Z 13 │ readonly thread: { 2026-10-24T15:12:30.3669923Z ╰──── 2026-10-24T15:12:30.3670085Z  help: Consider removing this declaration. 2026-10-24T15:12:30.3670205Z 2026-10-24T15:12:30.3670440Z ⚠ eslint(no-unneeded-ternary): Unnecessary use of boolean literals in conditional expression 2026-10-24T15:12:30.3670798Z ╭─[packages/shared/src/serverSettings.test.ts:35:7] 2026-10-24T15:12:30.3671120Z 34 │ const fallback = fallbackTextGenerationModelSelection(providerInstances, (instanceId) => 2026-10-24T15:12:30.3671411Z 35 │ instanceId === configured ? true : false, 2026-10-24T15:12:30.3671643Z ·  ──────────────────────────────────────── 2026-10-24T15:12:30.3671824Z 36 │ ); 2026-10-24T15:12:30.3671943Z ╰──── 2026-10-24T15:12:30.3672097Z  help: Remove this ternary operator 2026-10-24T15:12:30.3672217Z 2026-10-24T15:12:30.3672455Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T15:12:30.3672806Z ╭─[apps/server/src/terminal/Manager.test.ts:731:31] 2026-10-24T15:12:30.3673001Z 730 │ ); 2026-10-24T15:12:30.3673250Z 731 │ const snapshot = events.filter((event) => event.type === "snapshot").at(-1)?.snapshot; 2026-10-24T15:12:30.3673531Z ·  ────── 2026-10-24T15:12:30.3673779Z 732 │ expect(snapshot?.history).toBe("aa😀\rEND"); 2026-10-24T15:12:30.3673950Z ╰──── 2026-10-24T15:12:30.3674183Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T15:12:30.3674363Z 2026-10-24T15:12:30.3674522Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.3674799Z ╭─[apps/mobile/src/components/ui/Menu.tsx:54:36] 2026-10-24T15:12:30.3675112Z 53 │ const child = children as ReactElement>; 2026-10-24T15:12:30.3675480Z 54 │ ╭─▶ children = cloneElement(child, { 2026-10-24T15:12:30.3675762Z 55 │ │ onTouchStart: (event) => { 2026-10-24T15:12:30.3676043Z 56 │ │ // Reset for a new touch, not onPressIn, which also fires when a 2026-10-24T15:12:30.3676369Z 57 │ │ // finger moves out of the row and back during the same gesture. 2026-10-24T15:12:30.3676661Z 58 │ │ menuPress.current.isPreparing = false; 2026-10-24T15:12:30.3676976Z 59 │ │ menuPress.current.suppressPress = menuPress.current.isOpen; 2026-10-24T15:12:30.3677267Z 60 │ │ pendingPress.current = null; 2026-10-24T15:12:30.3677518Z 61 │ │ child.props.onTouchStart?.(event); 2026-10-24T15:12:30.3677725Z 62 │ │ }, 2026-10-24T15:12:30.3677925Z 63 │ │ onPress: (event) => { 2026-10-24T15:12:30.3678211Z 64 │ │ // Accessibility clicks have no touch identifier and must not inherit 2026-10-24T15:12:30.3678525Z 65 │ │ // cancellation from a previous physical gesture. 2026-10-24T15:12:30.3678841Z 66 │ │ const isTouch = typeof event.nativeEvent.identifier === "number"; 2026-10-24T15:12:30.3679207Z 67 │ │ if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) { 2026-10-24T15:12:30.3679552Z 68 │ │ return; 2026-10-24T15:12:30.3679768Z 69 │ │ } 2026-10-24T15:12:30.3680006Z 70 │ │ if (isTouch && menuPress.current.isPreparing) { 2026-10-24T15:12:30.3680324Z 71 │ │ // A release can arrive between native menu preparation and display. 2026-10-24T15:12:30.3680669Z 72 │ │ // Let UIKit's display/cancel callback decide this press's outcome. 2026-10-24T15:12:30.3680937Z 73 │ │ event.persist(); 2026-10-24T15:12:30.3681213Z 74 │ │ pendingPress.current = () => child.props.onPress?.(event); 2026-10-24T15:12:30.3681460Z 75 │ │ return; 2026-10-24T15:12:30.3681643Z 76 │ │ } 2026-10-24T15:12:30.3681863Z 77 │ │ child.props.onPress?.(event); 2026-10-24T15:12:30.3682073Z 78 │ │ }, 2026-10-24T15:12:30.3682300Z 79 │ ├─▶ }); 2026-10-24T15:12:30.3682682Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T15:12:30.3683009Z 80 │ menuProps.onMenuInteractionStart = () => { 2026-10-24T15:12:30.3683185Z ╰──── 2026-10-24T15:12:30.3683744Z  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-24T15:12:30.3684482Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.3684773Z 2026-10-24T15:12:30.3684963Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T15:12:30.3685262Z ╭─[packages/shared/src/qrCode.ts:458:44] 2026-10-24T15:12:30.3685449Z 457 │ ): Array { 2026-10-24T15:12:30.3685640Z 458 │ let result: Array = divisor.map((_) => 0); 2026-10-24T15:12:30.3685867Z ·  ┬ 2026-10-24T15:12:30.3686134Z · ╰── '_' is declared here 2026-10-24T15:12:30.3686349Z 459 │ for (const b of data) { 2026-10-24T15:12:30.3686496Z ╰──── 2026-10-24T15:12:30.3686656Z  help: Consider removing this parameter. 2026-10-24T15:12:30.3686775Z 2026-10-24T15:12:30.3687242Z ⚠ 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-24T15:12:30.3687780Z ╭─[apps/server/src/serverSettings.test.ts:1741:32] 2026-10-24T15:12:30.3688092Z 1740 │ const model = createModelSelection(ProviderInstanceId.make("codex"), "gpt-5.5"); 2026-10-24T15:12:30.3688456Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-24T15:12:30.3688768Z ·  ─────────────────── 2026-10-24T15:12:30.3689000Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-24T15:12:30.3689178Z ╰──── 2026-10-24T15:12:30.3689238Z 2026-10-24T15:12:30.3689762Z ⚠ 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-24T15:12:30.3690404Z ╭─[apps/server/src/serverSettings.test.ts:1742:34] 2026-10-24T15:12:30.3690724Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-24T15:12:30.3691026Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-24T15:12:30.3691267Z ·  ─────────────────── 2026-10-24T15:12:30.3691509Z 1743 │ Schema.fromJsonString(Schema.Array(ProjectScript)), 2026-10-24T15:12:30.3691698Z ╰──── 2026-10-24T15:12:30.3691757Z 2026-10-24T15:12:30.3691985Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T15:12:30.3692356Z ╭─[apps/mobile/src/state/use-model-option-memory.ts:21:7] 2026-10-24T15:12:30.3692574Z 20 │ [instanceId]: { 2026-10-24T15:12:30.3692741Z 21 │ ...(state[instanceId] ?? {}), 2026-10-24T15:12:30.3692947Z ·  ──────────────────────────── 2026-10-24T15:12:30.3693129Z 22 │ [model]: options, 2026-10-24T15:12:30.3693268Z ╰──── 2026-10-24T15:12:30.3693630Z  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-24T15:12:30.3693890Z 2026-10-24T15:12:30.3694064Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T15:12:30.3694359Z ╭─[apps/web/src/components/Sidebar.tsx:1136:11] 2026-10-24T15:12:30.3694588Z 1135 │ foldSearchQuery(threadSearchQuery), 2026-10-24T15:12:30.3694782Z 1136 │ Date.now(), 2026-10-24T15:12:30.3694951Z ·  ─────┬──── 2026-10-24T15:12:30.3695187Z · ╰── Cannot call impure function 2026-10-24T15:12:30.3695474Z 1137 │ // A list filter, as on mobile: a pick would move rows unexplained. 2026-10-24T15:12:30.3695676Z ╰──── 2026-10-24T15:12:30.3696027Z  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-24T15:12:30.3696604Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T15:12:30.3696895Z 2026-10-24T15:12:30.3697105Z ⚠ typescript(no-extraneous-class): Unexpected class with only a constructor. 2026-10-24T15:12:30.3697514Z ╭─[apps/desktop/src/preview/Manager.test.ts:158:18] 2026-10-24T15:12:30.3697803Z 157 │ BrowserWindow: browserWindowConstructor, 2026-10-24T15:12:30.3698084Z 158 │ ╭─▶ ClipboardItem: class { 2026-10-24T15:12:30.3698383Z 159 │ │ constructor(data: Record) { 2026-10-24T15:12:30.3698646Z 160 │ │ clipboardItemConstructor(data); 2026-10-24T15:12:30.3698855Z 161 │ │ } 2026-10-24T15:12:30.3699078Z 162 │ ╰─▶ }, 2026-10-24T15:12:30.3699281Z 163 │ clipboard: { 2026-10-24T15:12:30.3699416Z ╰──── 2026-10-24T15:12:30.3699648Z  help: Try replacing this class with a standalone function or deleting it entirely 2026-10-24T15:12:30.3699821Z 2026-10-24T15:12:30.3700097Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T15:12:30.3700529Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:123:7] 2026-10-24T15:12:30.3700762Z 118 │ 2026-10-24T15:12:30.3700893Z 119 │ useEffect(() => { 2026-10-24T15:12:30.3701051Z ·  ────┬──── 2026-10-24T15:12:30.3701276Z · ╰── This is the containing effect 2026-10-24T15:12:30.3701502Z 120 │ if (orientationSettled) return; 2026-10-24T15:12:30.3701717Z 121 │ const orientation = getNativeShowcaseOrientation(); 2026-10-24T15:12:30.3701921Z 122 │ if (orientation === null) { 2026-10-24T15:12:30.3702097Z 123 │ setOrientationSettled(true); 2026-10-24T15:12:30.3702297Z ·  ──────────┬────────── 2026-10-24T15:12:30.3702580Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.3702821Z 124 │ return; 2026-10-24T15:12:30.3702950Z ╰──── 2026-10-24T15:12:30.3703648Z  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-24T15:12:30.3704524Z  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-24T15:12:30.3704837Z 2026-10-24T15:12:30.3705108Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T15:12:30.3705535Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:304:7] 2026-10-24T15:12:30.3705769Z 292 │ 2026-10-24T15:12:30.3705897Z 293 │ useEffect(() => { 2026-10-24T15:12:30.3706057Z ·  ────┬──── 2026-10-24T15:12:30.3706282Z · ╰── This is the containing effect 2026-10-24T15:12:30.3706484Z 294 │ if ( 2026-10-24T15:12:30.3706621Z 295 │ scene === null || 2026-10-24T15:12:30.3706789Z 296 │ requestedScene === null || 2026-10-24T15:12:30.3706968Z 297 │ scene !== requestedScene || 2026-10-24T15:12:30.3707134Z 298 │ !hasFixture || 2026-10-24T15:12:30.3707296Z 299 │ !orientationSettled || 2026-10-24T15:12:30.3707458Z 300 │ !themeApplied || 2026-10-24T15:12:30.3707735Z 301 │ (scene === "agent-activity" && !agentActivityStaged) || 2026-10-24T15:12:30.3708041Z 302 │ !isShowcaseNativeContentReady({ scene, themeId, renderSignal }) 2026-10-24T15:12:30.3708251Z 303 │ ) { 2026-10-24T15:12:30.3708391Z 304 │ setReadyScene(null); 2026-10-24T15:12:30.3708567Z ·  ──────┬────── 2026-10-24T15:12:30.3708838Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.3709070Z 305 │ return; 2026-10-24T15:12:30.3709202Z ╰──── 2026-10-24T15:12:30.3709866Z  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-24T15:12:30.3710751Z  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-24T15:12:30.3711070Z 2026-10-24T15:12:30.3711351Z ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'. 2026-10-24T15:12:30.3711786Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:128:9] 2026-10-24T15:12:30.3712038Z 127 │ let cancelled = false; 2026-10-24T15:12:30.3712224Z 128 │ let lastOutcome: string | null = null; 2026-10-24T15:12:30.3712416Z ·  ─────┬───── 2026-10-24T15:12:30.3712650Z · ╰── 'lastOutcome' is declared here 2026-10-24T15:12:30.3712983Z 129 │ void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), { 2026-10-24T15:12:30.3713227Z ╰──── 2026-10-24T15:12:30.3713394Z  help: Consider removing this declaration. 2026-10-24T15:12:30.3713517Z 2026-10-24T15:12:30.3713714Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T15:12:30.3714034Z ╭─[apps/web/src/components/chat/useThreadLifecycle.tsx:178:58] 2026-10-24T15:12:30.3714307Z 177 │ if (snoozeClockState.shell !== activeThreadShell) { 2026-10-24T15:12:30.3714599Z 178 │ setSnoozeClockState({ shell: activeThreadShell, now: new Date().toISOString() }); 2026-10-24T15:12:30.3714907Z ·  ─────┬──── 2026-10-24T15:12:30.3715212Z · ╰── Cannot call impure function 2026-10-24T15:12:30.3715444Z 179 │ } 2026-10-24T15:12:30.3715564Z ╰──── 2026-10-24T15:12:30.3715909Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T15:12:30.3716480Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T15:12:30.3716771Z 2026-10-24T15:12:30.3716943Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T15:12:30.3717261Z ╭─[apps/server/src/process/externalLauncher.test.ts:186:12] 2026-10-24T15:12:30.3717471Z 185 │ 2026-10-24T15:12:30.3717639Z 186 │ for (const {} of ["darwin", "linux"] as const) { 2026-10-24T15:12:30.3717833Z ·  ── 2026-10-24T15:12:30.3717978Z 187 │ } 2026-10-24T15:12:30.3718165Z ╰──── 2026-10-24T15:12:30.3718491Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T15:12:30.3718721Z 2026-10-24T15:12:30.3718891Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T15:12:30.3719206Z ╭─[apps/server/src/process/externalLauncher.test.ts:189:12] 2026-10-24T15:12:30.3719410Z 188 │ 2026-10-24T15:12:30.3719543Z 189 │ for (const {} of [ 2026-10-24T15:12:30.3719698Z ·  ── 2026-10-24T15:12:30.3719886Z 190 │ { kind: "browser", folderVerb: "none" }, 2026-10-24T15:12:30.3720046Z ╰──── 2026-10-24T15:12:30.3720336Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T15:12:30.3720563Z 2026-10-24T15:12:30.3720741Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T15:12:30.3721058Z ╭─[apps/server/src/process/externalLauncher.test.ts:311:12] 2026-10-24T15:12:30.3721263Z 310 │ 2026-10-24T15:12:30.3721456Z 311 │ for (const {} of ["rejected", "spawn-error", "stalled"] as const) { 2026-10-24T15:12:30.3721667Z ·  ── 2026-10-24T15:12:30.3721809Z 312 │ } 2026-10-24T15:12:30.3721927Z ╰──── 2026-10-24T15:12:30.3722211Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T15:12:30.3722440Z 2026-10-24T15:12:30.3722609Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T15:12:30.3722918Z ╭─[apps/server/src/process/externalLauncher.test.ts:314:12] 2026-10-24T15:12:30.3723129Z 313 │ 2026-10-24T15:12:30.3723259Z 314 │ for (const {} of [ 2026-10-24T15:12:30.3723416Z ·  ── 2026-10-24T15:12:30.3723585Z 315 │ { 2026-10-24T15:12:30.3723706Z ╰──── 2026-10-24T15:12:30.3723992Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T15:12:30.3724223Z 2026-10-24T15:12:30.3724491Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T15:12:30.3724916Z ╭─[apps/mobile/src/features/review/ReviewCommentComposerSheet.tsx:103:7] 2026-10-24T15:12:30.3725148Z 100 │ 2026-10-24T15:12:30.3725275Z 101 │ useEffect(() => { 2026-10-24T15:12:30.3725434Z ·  ────┬──── 2026-10-24T15:12:30.3725668Z · ╰── This is the containing effect 2026-10-24T15:12:30.3725916Z 102 │ if (!target || selectedLines.length === 0) { 2026-10-24T15:12:30.3726126Z 103 │ setHighlightedLinesById({}); 2026-10-24T15:12:30.3726326Z ·  ───────────┬─────────── 2026-10-24T15:12:30.3726613Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.3726850Z 104 │ return; 2026-10-24T15:12:30.3726984Z ╰──── 2026-10-24T15:12:30.3727651Z  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-24T15:12:30.3728609Z  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-24T15:12:30.3728957Z 2026-10-24T15:12:30.3729162Z ⚠ eslint(no-unused-vars): Identifier 'identity' is imported but never used. 2026-10-24T15:12:30.3729477Z ╭─[apps/server/src/auth/http.ts:28:10] 2026-10-24T15:12:30.3729686Z 27 │ import * as Schema from "effect/Schema"; 2026-10-24T15:12:30.3729895Z 28 │ import { identity } from "effect/Function"; 2026-10-24T15:12:30.3730155Z ·  ────┬─── 2026-10-24T15:12:30.3730391Z · ╰── 'identity' is imported here 2026-10-24T15:12:30.3730621Z 29 │ import * as Layer from "effect/Layer"; 2026-10-24T15:12:30.3730782Z ╰──── 2026-10-24T15:12:30.3730938Z  help: Consider removing this import. 2026-10-24T15:12:30.3731056Z 2026-10-24T15:12:30.3731329Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T15:12:30.3731746Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:444:5] 2026-10-24T15:12:30.3731982Z 434 │ : null; 2026-10-24T15:12:30.3732125Z 435 │ useEffect(() => { 2026-10-24T15:12:30.3732282Z ·  ────┬──── 2026-10-24T15:12:30.3732508Z · ╰── This is the containing effect 2026-10-24T15:12:30.3732708Z 436 │ if ( 2026-10-24T15:12:30.3732860Z 437 │ props.active === false || 2026-10-24T15:12:30.3733038Z 438 │ activeDraftKey !== null || 2026-10-24T15:12:30.3733224Z 439 │ editingPendingTask !== null || 2026-10-24T15:12:30.3733406Z 440 │ selectedProject === null 2026-10-24T15:12:30.3733600Z 441 │ ) { 2026-10-24T15:12:30.3733732Z 442 │ return; 2026-10-24T15:12:30.3733866Z 443 │ } 2026-10-24T15:12:30.3734007Z 444 │ setActiveDraftKey( 2026-10-24T15:12:30.3734181Z ·  ────────┬──────── 2026-10-24T15:12:30.3734456Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.3734700Z 445 │ createNewTaskDraft({ 2026-10-24T15:12:30.3734848Z ╰──── 2026-10-24T15:12:30.3735517Z  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-24T15:12:30.3736403Z  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-24T15:12:30.3736719Z 2026-10-24T15:12:30.3736965Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T15:12:30.3737376Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1244:36] 2026-10-24T15:12:30.3737661Z 1243 │ 2026-10-24T15:12:30.3737987Z 1244 │ {props.children} 2026-10-24T15:12:30.3738302Z ·  ───────────── 2026-10-24T15:12:30.3738504Z 1245 │ 2026-10-24T15:12:30.3738654Z ╰──── 2026-10-24T15:12:30.3739024Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T15:12:30.3739434Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T15:12:30.3739616Z 2026-10-24T15:12:30.3739827Z ⚠ eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used. 2026-10-24T15:12:30.3740123Z ╭─[apps/web/src/types.ts:22:3] 2026-10-24T15:12:30.3740310Z 21 │ EnvironmentThreadShell, 2026-10-24T15:12:30.3740472Z 22 │ ThreadRunSummary, 2026-10-24T15:12:30.3740640Z ·  ────────┬─────── 2026-10-24T15:12:30.3740881Z · ╰── 'ThreadRunSummary' is imported here 2026-10-24T15:12:30.3741106Z 23 │ ThreadRuntimeSummary, 2026-10-24T15:12:30.3741250Z ╰──── 2026-10-24T15:12:30.3741407Z  help: Consider removing this import. 2026-10-24T15:12:30.3741532Z 2026-10-24T15:12:30.3741912Z ⚠ 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-24T15:12:30.3742379Z ╭─[apps/server/src/auth/RpcAuthorization.ts:237:17] 2026-10-24T15:12:30.3742662Z 236 │ const requiredScopesForSettingsUpdate = (payload: unknown) => { 2026-10-24T15:12:30.3742950Z 237 │ const input = Schema.decodeUnknownSync(SettingsUpdate)(payload); 2026-10-24T15:12:30.3743210Z ·  ──────────────────────── 2026-10-24T15:12:30.3743471Z 238 │ const scopes = requiredScopesForServerSettingsPatch(input.patch); 2026-10-24T15:12:30.3743713Z ╰──── 2026-10-24T15:12:30.3743769Z 2026-10-24T15:12:30.3744151Z ⚠ 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-24T15:12:30.3744622Z ╭─[apps/server/src/auth/RpcAuthorization.ts:256:26] 2026-10-24T15:12:30.3744861Z 255 │ if (method === WS_METHODS.assetsCreateUrl) { 2026-10-24T15:12:30.3745144Z 256 │ const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload); 2026-10-24T15:12:30.3745424Z ·  ──────────────────────── 2026-10-24T15:12:30.3745612Z 257 │ return [ 2026-10-24T15:12:30.3745741Z ╰──── 2026-10-24T15:12:30.3745801Z 2026-10-24T15:12:30.3746182Z ⚠ 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-24T15:12:30.3746650Z ╭─[packages/shared/src/otelEnvironment.ts:146:14] 2026-10-24T15:12:30.3754634Z 145 │ name, 2026-10-24T15:12:30.3755005Z 146 │ (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()), 2026-10-24T15:12:30.3755282Z ·  ────────────────────────── 2026-10-24T15:12:30.3755524Z 147 │ `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`, 2026-10-24T15:12:30.3755712Z ╰──── 2026-10-24T15:12:30.3755771Z 2026-10-24T15:12:30.3755953Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T15:12:30.3756250Z ╭─[apps/server/src/processRunner.test.ts:266:14] 2026-10-24T15:12:30.3756434Z 265 │ 2026-10-24T15:12:30.3756598Z 266 │ for (const {} of ["timeout", "success"] as const) { 2026-10-24T15:12:30.3756789Z ·  ── 2026-10-24T15:12:30.3756931Z 267 │ } 2026-10-24T15:12:30.3757044Z ╰──── 2026-10-24T15:12:30.3757344Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T15:12:30.3757580Z 2026-10-24T15:12:30.3757847Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T15:12:30.3758287Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:107:5] 2026-10-24T15:12:30.3758528Z 104 │ 2026-10-24T15:12:30.3758654Z 105 │ useEffect(() => { 2026-10-24T15:12:30.3758810Z ·  ────┬──── 2026-10-24T15:12:30.3759034Z · ╰── This is the containing effect 2026-10-24T15:12:30.3759252Z 106 │ clearReviewCommentTarget(); 2026-10-24T15:12:30.3759454Z 107 │ setPendingNativeCommentSelection(null); 2026-10-24T15:12:30.3759686Z ·  ────────────────┬─────────────── 2026-10-24T15:12:30.3759987Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.3760236Z 108 │ }, [selectedSection?.id]); 2026-10-24T15:12:30.3760383Z ╰──── 2026-10-24T15:12:30.3761050Z  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-24T15:12:30.3761935Z  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-24T15:12:30.3762250Z 2026-10-24T15:12:30.3762517Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T15:12:30.3762962Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7] 2026-10-24T15:12:30.3763206Z 109 │ 2026-10-24T15:12:30.3763335Z 110 │ useEffect(() => { 2026-10-24T15:12:30.3763491Z ·  ────┬──── 2026-10-24T15:12:30.3763758Z · ╰── This is the containing effect 2026-10-24T15:12:30.3763984Z 111 │ if (activeCommentTarget === null) { 2026-10-24T15:12:30.3764195Z 112 │ setPendingNativeCommentSelection(null); 2026-10-24T15:12:30.3764423Z ·  ────────────────┬─────────────── 2026-10-24T15:12:30.3764723Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.3764955Z 113 │ } 2026-10-24T15:12:30.3765138Z ╰──── 2026-10-24T15:12:30.3765837Z  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-24T15:12:30.3766718Z  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-24T15:12:30.3767028Z 2026-10-24T15:12:30.3767233Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T15:12:30.3767625Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7] 2026-10-24T15:12:30.3767920Z 107 │ setPendingNativeCommentSelection(null); 2026-10-24T15:12:30.3768113Z 108 │ }, [selectedSection?.id]); 2026-10-24T15:12:30.3768295Z ·  ─────────┬───────── 2026-10-24T15:12:30.3768561Z · ╰── Unnecessary dependency `selectedSection?.id` 2026-10-24T15:12:30.3768773Z 109 │ 2026-10-24T15:12:30.3768883Z ╰──── 2026-10-24T15:12:30.3769237Z  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-24T15:12:30.3769837Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.3770246Z 2026-10-24T15:12:30.3770739Z ⚠ 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-24T15:12:30.3771294Z ╭─[packages/shared/src/atomicWrite.test.ts:139:5] 2026-10-24T15:12:30.3771506Z 138 │ Effect.gen(function* () { 2026-10-24T15:12:30.3771803Z 139 │ ╭─▶ while (fiber.pollUnsafe() === undefined) { 2026-10-24T15:12:30.3772119Z 140 │ │ yield* TestClock.adjust("100 millis"); 2026-10-24T15:12:30.3772584Z 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-24T15:12:30.3773071Z 142 │ │ yield* Effect.promise(() => new Promise((resolve) => setImmediate(resolve))); 2026-10-24T15:12:30.3773394Z 143 │ ╰─▶ } 2026-10-24T15:12:30.3773657Z 144 │ return yield* Fiber.join(fiber); 2026-10-24T15:12:30.3773815Z ╰──── 2026-10-24T15:12:30.3773873Z 2026-10-24T15:12:30.3774072Z ⚠ eslint(no-unused-vars): Identifier 'Fiber' is imported but never used. 2026-10-24T15:12:30.3774361Z ╭─[apps/server/src/ws.ts:10:13] 2026-10-24T15:12:30.3774561Z  9 │ import * as Effect from "effect/Effect"; 2026-10-24T15:12:30.3774750Z 10 │ import * as Fiber from "effect/Fiber"; 2026-10-24T15:12:30.3774931Z ·  ──┬── 2026-10-24T15:12:30.3775157Z · ╰── 'Fiber' is imported here 2026-10-24T15:12:30.3775402Z 11 │ import * as FileSystem from "effect/FileSystem"; 2026-10-24T15:12:30.3775570Z ╰──── 2026-10-24T15:12:30.3775821Z  help: Consider removing this import. 2026-10-24T15:12:30.3775975Z 2026-10-24T15:12:30.3776180Z ⚠ eslint(no-unused-vars): Identifier 'Schedule' is imported but never used. 2026-10-24T15:12:30.3776476Z ╭─[apps/server/src/ws.ts:17:13] 2026-10-24T15:12:30.3776662Z 16 │ import * as Ref from "effect/Ref"; 2026-10-24T15:12:30.3776855Z 17 │ import * as Schedule from "effect/Schedule"; 2026-10-24T15:12:30.3777043Z ·  ────┬─── 2026-10-24T15:12:30.3777274Z · ╰── 'Schedule' is imported here 2026-10-24T15:12:30.3777502Z 18 │ import * as Schema from "effect/Schema"; 2026-10-24T15:12:30.3777658Z ╰──── 2026-10-24T15:12:30.3777811Z  help: Consider removing this import. 2026-10-24T15:12:30.3777924Z 2026-10-24T15:12:30.3778233Z ⚠ eslint(no-unused-vars): Variable 'projectSetupScriptRunner' is declared but never used. Unused variables should start with a '_'. 2026-10-24T15:12:30.3778625Z ╭─[apps/server/src/ws.ts:1286:13] 2026-10-24T15:12:30.3778898Z 1285 │ const usageLimitSources = yield* UsageLimitSources.UsageLimitSources; 2026-10-24T15:12:30.3779269Z 1286 │ const projectSetupScriptRunner = yield* ProjectSetupScriptRunner.ProjectSetupScriptRunner; 2026-10-24T15:12:30.3779580Z ·  ────────────┬─────────── 2026-10-24T15:12:30.3779868Z · ╰── 'projectSetupScriptRunner' is declared here 2026-10-24T15:12:30.3780208Z 1287 │ const worktreeSetupTracker = yield* WorktreeSetupTracker.WorktreeSetupTracker; 2026-10-24T15:12:30.3780441Z ╰──── 2026-10-24T15:12:30.3780602Z  help: Consider removing this declaration. 2026-10-24T15:12:30.3780728Z 2026-10-24T15:12:30.3780951Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T15:12:30.3781301Z ╭─[packages/shared/src/composerContextLegacySend.ts:19:45] 2026-10-24T15:12:30.3781583Z 18 │ const occurrences = collectComposerContextReferences(text); 2026-10-24T15:12:30.3781832Z 19 │ for (const occurrence of [...occurrences].reverse()) { 2026-10-24T15:12:30.3782070Z ·  ─────── 2026-10-24T15:12:30.3782301Z 20 │ const record = recordsById.get(occurrence.contextId); 2026-10-24T15:12:30.3782478Z ╰──── 2026-10-24T15:12:30.3782803Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T15:12:30.3783057Z 2026-10-24T15:12:30.3783264Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T15:12:30.3783647Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:454:7] 2026-10-24T15:12:30.3783877Z 453 │ showAuxiliaryPane("inspector"); 2026-10-24T15:12:30.3784091Z 454 │ }, [environmentId, showAuxiliaryPane, threadId]); 2026-10-24T15:12:30.3784359Z ·  ──────┬────── ────┬─── 2026-10-24T15:12:30.3784712Z · │ ╰── Unnecessary dependency `threadId` 2026-10-24T15:12:30.3785050Z · ╰── Unnecessary dependency `environmentId` 2026-10-24T15:12:30.3785264Z 455 │ const { 2026-10-24T15:12:30.3785386Z ╰──── 2026-10-24T15:12:30.3785806Z  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-24T15:12:30.3786433Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.3786735Z 2026-10-24T15:12:30.3786925Z ⚠ react(static-components): Cannot create components during render 2026-10-24T15:12:30.3787251Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:725:20] 2026-10-24T15:12:30.3787465Z 492 │ // same check. 2026-10-24T15:12:30.3787672Z 493 │ const NativeReviewDiffView = resolveNativeReviewDiffView(); 2026-10-24T15:12:30.3787937Z ·  ─────────────┬───────────── 2026-10-24T15:12:30.3788255Z · ╰── The component is created during render here 2026-10-24T15:12:30.3788589Z 494 │ const nativeReviewDiffViewRef = useRef(null); 2026-10-24T15:12:30.3788875Z 495 │ const showcasedReviewDrawRef = useRef(null); 2026-10-24T15:12:30.3789146Z 496 │ const [isPullRefreshing, setIsPullRefreshing] = useState(false); 2026-10-24T15:12:30.3789465Z 497 │ const handlePullToRefresh = async () => { 2026-10-24T15:12:30.3789657Z 498 │ setIsPullRefreshing(true); 2026-10-24T15:12:30.3789838Z 499 │ await refreshSelectedSection(); 2026-10-24T15:12:30.3790021Z 500 │ setIsPullRefreshing(false); 2026-10-24T15:12:30.3790177Z 501 │ }; 2026-10-24T15:12:30.3790384Z 502 │ const reviewFileNavigatorRef = useRef(null); 2026-10-24T15:12:30.3790689Z 503 │ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : []; 2026-10-24T15:12:30.3790962Z 504 │ const fileVisibility = useReviewFileVisibility({ 2026-10-24T15:12:30.3791178Z 505 │ threadKey: reviewCache.threadKey, 2026-10-24T15:12:30.3791372Z 506 │ sectionId: selectedSection?.id ?? null, 2026-10-24T15:12:30.3791551Z 507 │ files: reviewFiles, 2026-10-24T15:12:30.3791739Z 508 │ cachedExpandedFileIds: selectedSection?.id 2026-10-24T15:12:30.3791990Z 509 │ ? reviewCache.expandedFileIdsBySection[selectedSection.id] 2026-10-24T15:12:30.3792199Z 510 │ : undefined, 2026-10-24T15:12:30.3792378Z 511 │ cachedViewedFileIds: selectedSection?.id 2026-10-24T15:12:30.3792614Z 512 │ ? reviewCache.viewedFileIdsBySection[selectedSection.id] 2026-10-24T15:12:30.3792813Z 513 │ : undefined, 2026-10-24T15:12:30.3792949Z 514 │ }); 2026-10-24T15:12:30.3793209Z 515 │ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility; 2026-10-24T15:12:30.3793540Z 516 │ const commentSelection = useReviewCommentSelectionController({ 2026-10-24T15:12:30.3793778Z 517 │ environmentId, 2026-10-24T15:12:30.3793923Z 518 │ threadId, 2026-10-24T15:12:30.3794064Z 519 │ selectedSection, 2026-10-24T15:12:30.3794219Z 520 │ nativeReviewDiffData, 2026-10-24T15:12:30.3794362Z 521 │ }); 2026-10-24T15:12:30.3794531Z 522 │ const nativeBridge = useNativeReviewDiffBridge({ 2026-10-24T15:12:30.3794738Z 523 │ threadKey: reviewCache.threadKey, 2026-10-24T15:12:30.3794932Z 524 │ sectionId: selectedSection?.id ?? null, 2026-10-24T15:12:30.3795130Z 525 │ diff: selectedSection?.diff, 2026-10-24T15:12:30.3795303Z 526 │ data: nativeReviewDiffData, 2026-10-24T15:12:30.3795467Z 527 │ collapsedFileIds, 2026-10-24T15:12:30.3795613Z 528 │ viewedFileIds, 2026-10-24T15:12:30.3795862Z 529 │ selectedRowIds: commentSelection.selectedRowIds, 2026-10-24T15:12:30.3796114Z 530 │ canHighlight: parsedDiff.kind === "files", 2026-10-24T15:12:30.3796282Z 531 │ }); 2026-10-24T15:12:30.3796417Z 532 │ const showcaseReviewKey = 2026-10-24T15:12:30.3796642Z 533 │ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection 2026-10-24T15:12:30.3796996Z 534 │ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}` 2026-10-24T15:12:30.3797264Z 535 │ : null; 2026-10-24T15:12:30.3797506Z 536 │ const handleNativeDebug = (event: NativeSyntheticEvent>) => { 2026-10-24T15:12:30.3797762Z 537 │ nativeBridge.onDebug(event); 2026-10-24T15:12:30.3797916Z 538 │ if ( 2026-10-24T15:12:30.3798063Z 539 │ showcaseReviewKey === null || 2026-10-24T15:12:30.3798294Z 540 │ showcasedReviewDrawRef.current === showcaseReviewKey || 2026-10-24T15:12:30.3798544Z 541 │ !isNativeReviewDiffDrawEvent(event.nativeEvent) 2026-10-24T15:12:30.3798721Z 542 │ ) { 2026-10-24T15:12:30.3798844Z 543 │ return; 2026-10-24T15:12:30.3798970Z 544 │ } 2026-10-24T15:12:30.3799144Z 545 │ showcasedReviewDrawRef.current = showcaseReviewKey; 2026-10-24T15:12:30.3799435Z 546 │ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId }); 2026-10-24T15:12:30.3799660Z 547 │ }; 2026-10-24T15:12:30.3799776Z 548 │ 2026-10-24T15:12:30.3799953Z 549 │ const handleSelectFile = async (fileId: string | null) => { 2026-10-24T15:12:30.3800168Z 550 │ loadVisibleFile(fileId, true); 2026-10-24T15:12:30.3800356Z 551 │ commentSelection.clearSelection(); 2026-10-24T15:12:30.3800583Z 552 │ if (fileId !== null && collapsedFileIds.includes(fileId)) { 2026-10-24T15:12:30.3800799Z 553 │ toggleExpandedFile(fileId); 2026-10-24T15:12:30.3800953Z 554 │ } 2026-10-24T15:12:30.3801130Z 555 │ const nativeView = nativeReviewDiffViewRef.current; 2026-10-24T15:12:30.3801326Z 556 │ if (!nativeView) return; 2026-10-24T15:12:30.3801511Z 557 │ const result = await settlePromise(() => 2026-10-24T15:12:30.3801794Z 558 │ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true), 2026-10-24T15:12:30.3802026Z 559 │ ); 2026-10-24T15:12:30.3802177Z 560 │ if (AsyncResult.isFailure(result)) { 2026-10-24T15:12:30.3802465Z 561 │ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result)); 2026-10-24T15:12:30.3802703Z 562 │ } 2026-10-24T15:12:30.3802818Z 563 │ }; 2026-10-24T15:12:30.3802961Z 564 │ const handleVisibleFileChange = ( 2026-10-24T15:12:30.3803261Z 565 │ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>, 2026-10-24T15:12:30.3803641Z 566 │ ) => { 2026-10-24T15:12:30.3803819Z 567 │ loadVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-24T15:12:30.3804113Z 568 │ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-24T15:12:30.3804342Z 569 │ }; 2026-10-24T15:12:30.3804480Z 570 │ const renderInspector = () => ( 2026-10-24T15:12:30.3804646Z 571 │ void handleSelectFile(fileId)} 2026-10-24T15:12:30.3805786Z 577 │ /> 2026-10-24T15:12:30.3805907Z 578 │ ); 2026-10-24T15:12:30.3806022Z 579 │ 2026-10-24T15:12:30.3806266Z 580 │ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => { 2026-10-24T15:12:30.3806545Z 581 │ const { fileId } = event.nativeEvent; 2026-10-24T15:12:30.3806712Z 582 │ if (fileId) { 2026-10-24T15:12:30.3806871Z 583 │ loadVisibleFile(fileId, true); 2026-10-24T15:12:30.3807047Z 584 │ toggleExpandedFile(fileId); 2026-10-24T15:12:30.3807195Z 585 │ } 2026-10-24T15:12:30.3807310Z 586 │ }; 2026-10-24T15:12:30.3807421Z 587 │ 2026-10-24T15:12:30.3807567Z 588 │ const handleNativeToggleViewedFile = ( 2026-10-24T15:12:30.3807791Z 589 │ event: NativeSyntheticEvent<{ readonly fileId?: string }>, 2026-10-24T15:12:30.3807981Z 590 │ ) => { 2026-10-24T15:12:30.3808130Z 591 │ const { fileId } = event.nativeEvent; 2026-10-24T15:12:30.3808300Z 592 │ if (fileId) { 2026-10-24T15:12:30.3808458Z 593 │ toggleViewedFile(fileId); 2026-10-24T15:12:30.3808604Z 594 │ } 2026-10-24T15:12:30.3808718Z 595 │ }; 2026-10-24T15:12:30.3808827Z 596 │ 2026-10-24T15:12:30.3808957Z 597 │ const parsedDiffNotice = 2026-10-24T15:12:30.3809206Z 598 │ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null; 2026-10-24T15:12:30.3809494Z 599 │ const hasCachedSelectedDiff = selectedSection?.diff != null; 2026-10-24T15:12:30.3809789Z 600 │ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null); 2026-10-24T15:12:30.3810179Z 601 │ const sectionMenu = buildReviewSectionMenu(reviewSections); 2026-10-24T15:12:30.3810473Z 602 │ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({ 2026-10-24T15:12:30.3810750Z 603 │ hasEnvironmentPresentation: environment.isReady, 2026-10-24T15:12:30.3810981Z 604 │ isEnvironmentConnected: isEnvironmentReady, 2026-10-24T15:12:30.3811175Z 605 │ hasCachedSelectedDiff, 2026-10-24T15:12:30.3811333Z 606 │ hasAnyCachedDiff, 2026-10-24T15:12:30.3811470Z 607 │ }); 2026-10-24T15:12:30.3811620Z 608 │ const handleRetryEnvironment = () => { 2026-10-24T15:12:30.3811810Z 609 │ void retryEnvironment(environmentId); 2026-10-24T15:12:30.3811967Z 610 │ }; 2026-10-24T15:12:30.3812110Z 611 │ const handleReturnToThread = () => { 2026-10-24T15:12:30.3812286Z 612 │ if (navigation.canGoBack()) { 2026-10-24T15:12:30.3812453Z 613 │ navigation.goBack(); 2026-10-24T15:12:30.3812600Z 614 │ return; 2026-10-24T15:12:30.3812725Z 615 │ } 2026-10-24T15:12:30.3812866Z 616 │ navigation.navigate("Thread", { 2026-10-24T15:12:30.3813055Z 617 │ environmentId: String(environmentId), 2026-10-24T15:12:30.3813320Z 618 │ threadId: String(threadId), 2026-10-24T15:12:30.3813510Z 619 │ }); 2026-10-24T15:12:30.3813666Z 620 │ }; 2026-10-24T15:12:30.3813802Z 621 │ const androidHeaderSubtitle = [ 2026-10-24T15:12:30.3813970Z 622 │ selectedSection?.title, 2026-10-24T15:12:30.3814137Z 623 │ headerDiffSummary.additions, 2026-10-24T15:12:30.3814314Z 624 │ headerDiffSummary.deletions, 2026-10-24T15:12:30.3814369Z 625 │ ] 2026-10-24T15:12:30.3814474Z 626 │ .filter((part): part is string => Boolean(part)) 2026-10-24T15:12:30.3814540Z 627 │ .join(" · "); 2026-10-24T15:12:30.3814595Z 628 │ 2026-10-24T15:12:30.3814671Z 629 │ const showChangedFilesPane = 2026-10-24T15:12:30.3814744Z 630 │ !showConnectionNotice && 2026-10-24T15:12:30.3814819Z 631 │ selectedSection !== null && 2026-10-24T15:12:30.3814899Z 632 │ parsedDiff.kind === "files" && 2026-10-24T15:12:30.3814986Z 633 │ NativeReviewDiffView !== null; 2026-10-24T15:12:30.3815165Z 634 │ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined); 2026-10-24T15:12:30.3815339Z 635 │ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane; 2026-10-24T15:12:30.3815391Z 636 │ 2026-10-24T15:12:30.3815462Z 637 │ const listHeader = (() => { 2026-10-24T15:12:30.3815549Z 638 │ const children: ReactElement[] = []; 2026-10-24T15:12:30.3815601Z 639 │ 2026-10-24T15:12:30.3815664Z 640 │ if (error) { 2026-10-24T15:12:30.3815730Z 641 │ children.push( 2026-10-24T15:12:30.3815791Z 642 │ 2026-10-24T15:12:30.3816457Z 649 │ Review unavailable 2026-10-24T15:12:30.3816618Z 650 │ {error} 2026-10-24T15:12:30.3816678Z 651 │ , 2026-10-24T15:12:30.3816733Z 652 │ ); 2026-10-24T15:12:30.3816788Z 653 │ } 2026-10-24T15:12:30.3816839Z 654 │ 2026-10-24T15:12:30.3816912Z 655 │ if (parsedDiffNotice) { 2026-10-24T15:12:30.3817071Z 656 │ children.push(); 2026-10-24T15:12:30.3817125Z 657 │ } 2026-10-24T15:12:30.3817179Z 658 │ 2026-10-24T15:12:30.3817261Z 659 │ if (children.length === 0) { 2026-10-24T15:12:30.3817327Z 660 │ return null; 2026-10-24T15:12:30.3817381Z 661 │ } 2026-10-24T15:12:30.3817433Z 662 │ 2026-10-24T15:12:30.3817504Z 663 │ return <>{children}; 2026-10-24T15:12:30.3817558Z 664 │ })(); 2026-10-24T15:12:30.3817628Z 665 │ const headerSubtitle = [ 2026-10-24T15:12:30.3817706Z 666 │ headerDiffSummary.additions, 2026-10-24T15:12:30.3817783Z 667 │ headerDiffSummary.deletions, 2026-10-24T15:12:30.3817864Z 668 │ pendingReviewCommentCount > 0 2026-10-24T15:12:30.3818037Z 669 │ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}` 2026-10-24T15:12:30.3818098Z 670 │ : null, 2026-10-24T15:12:30.3818150Z 671 │ ] 2026-10-24T15:12:30.3818216Z 672 │ .filter(Boolean) 2026-10-24T15:12:30.3818278Z 673 │ .join(" · "); 2026-10-24T15:12:30.3818472Z 674 │ const headerTitleText = selectedSection?.title ?? "Review changes"; 2026-10-24T15:12:30.3818551Z 675 │ 2026-10-24T15:12:30.3818609Z 676 │ return ( 2026-10-24T15:12:30.3818665Z 677 │ <> 2026-10-24T15:12:30.3818732Z 678 │ 2026-10-24T15:12:30.3820061Z 694 │ 2026-10-24T15:12:30.3820127Z 695 │ 2026-10-24T15:12:30.3820249Z 696 │ 2026-10-24T15:12:30.3820330Z 697 │ {showConnectionNotice ? ( 2026-10-24T15:12:30.3820470Z 698 │ 2026-10-24T15:12:30.3820561Z 699 │ 2026-10-24T15:12:30.3821578Z 711 │ 2026-10-24T15:12:30.3821743Z 712 │ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? ( 2026-10-24T15:12:30.3821806Z 713 │ 2026-10-24T15:12:30.3822244Z 719 │ 2026-10-24T15:12:30.3822604Z 723 │ {listHeader} 2026-10-24T15:12:30.3822725Z 724 │ 2026-10-24T15:12:30.3822864Z 725 │ ( 2026-10-24T15:12:30.3825543Z 223 │ 2026-10-24T15:12:30.3825653Z ·  ─────────────── 2026-10-24T15:12:30.3825745Z 224 │ {lineIndex > 0 ? "\n" : ""} 2026-10-24T15:12:30.3825799Z ╰──── 2026-10-24T15:12:30.3825948Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T15:12:30.3825951Z 2026-10-24T15:12:30.3826148Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T15:12:30.3826301Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25] 2026-10-24T15:12:30.3826376Z 226 │ { 2026-10-24T15:12:30.3827474Z ·  ────┬──── 2026-10-24T15:12:30.3827608Z · ╰── This is the containing effect 2026-10-24T15:12:30.3827791Z 78 │ const { host, code } = parsePairingUrl(connectionPairingUrl); 2026-10-24T15:12:30.3827898Z 79 │ setHostInput(host); 2026-10-24T15:12:30.3827973Z ·  ──────┬───── 2026-10-24T15:12:30.3828146Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.3828212Z 80 │ setCodeInput(code); 2026-10-24T15:12:30.3828266Z ╰──── 2026-10-24T15:12:30.3828880Z  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-24T15:12:30.3829213Z  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-24T15:12:30.3829219Z 2026-10-24T15:12:30.3829480Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T15:12:30.3829651Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:89:5] 2026-10-24T15:12:30.3829705Z 82 │ 2026-10-24T15:12:30.3829769Z 83 │ useEffect(() => { 2026-10-24T15:12:30.3829839Z ·  ────┬──── 2026-10-24T15:12:30.3829971Z · ╰── This is the containing effect 2026-10-24T15:12:30.3830061Z 84 │ if (routePairingUrl.length === 0) { 2026-10-24T15:12:30.3830122Z 85 │ return; 2026-10-24T15:12:30.3830175Z 86 │ } 2026-10-24T15:12:30.3830228Z 87 │ 2026-10-24T15:12:30.3830344Z 88 │ const { host, code } = parsePairingUrl(routePairingUrl); 2026-10-24T15:12:30.3830417Z 89 │ setHostInput(host); 2026-10-24T15:12:30.3830495Z ·  ──────┬───── 2026-10-24T15:12:30.3830666Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.3830733Z 90 │ setCodeInput(code); 2026-10-24T15:12:30.3830786Z ╰──── 2026-10-24T15:12:30.3831389Z  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-24T15:12:30.3831715Z  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-24T15:12:30.3831717Z 2026-10-24T15:12:30.3831982Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T15:12:30.3832156Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:95:7] 2026-10-24T15:12:30.3832209Z 92 │ 2026-10-24T15:12:30.3832270Z 93 │ useEffect(() => { 2026-10-24T15:12:30.3832342Z ·  ────┬──── 2026-10-24T15:12:30.3832470Z · ╰── This is the containing effect 2026-10-24T15:12:30.3832552Z 94 │ if (pairingConnectionError) { 2026-10-24T15:12:30.3832624Z 95 │ setIsSubmitting(false); 2026-10-24T15:12:30.3832707Z ·  ───────┬─────── 2026-10-24T15:12:30.3832880Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.3832992Z 96 │ } 2026-10-24T15:12:30.3833074Z ╰──── 2026-10-24T15:12:30.3833713Z  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-24T15:12:30.3834037Z  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-24T15:12:30.3834039Z 2026-10-24T15:12:30.3834300Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T15:12:30.3834478Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:60:5] 2026-10-24T15:12:30.3834533Z 55 │ 2026-10-24T15:12:30.3834600Z 56 │ useEffect(() => { 2026-10-24T15:12:30.3834672Z ·  ────┬──── 2026-10-24T15:12:30.3834800Z · ╰── This is the containing effect 2026-10-24T15:12:30.3834865Z 57 │ scheduler.reset(); 2026-10-24T15:12:30.3834966Z 58 │ highlightedRowIdsRef.current = new Set(); 2026-10-24T15:12:30.3835053Z 59 │ visibleChunkIndexRef.current = 0; 2026-10-24T15:12:30.3835170Z 60 │ setVisibleRange({ firstRowIndex: 0, lastRowIndex: 80 }); 2026-10-24T15:12:30.3835248Z ·  ───────┬─────── 2026-10-24T15:12:30.3835420Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.3835537Z 61 │ setTokensPatchJson(createEmptyTokenPatch(resetKey)); 2026-10-24T15:12:30.3835590Z ╰──── 2026-10-24T15:12:30.3836196Z  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-24T15:12:30.3836522Z  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-24T15:12:30.3836525Z 2026-10-24T15:12:30.3836730Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T15:12:30.3836906Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:63:7] 2026-10-24T15:12:30.3836987Z 62 │ return () => scheduler.cancel(); 2026-10-24T15:12:30.3837093Z 63 │ }, [enabled, resetKey, rows.length, scheduler]); 2026-10-24T15:12:30.3837226Z ·  ───┬─── ─────┬───── 2026-10-24T15:12:30.3837421Z · │ ╰── Unnecessary dependency `rows.length` 2026-10-24T15:12:30.3837561Z · ╰── Unnecessary dependency `enabled` 2026-10-24T15:12:30.3837613Z 64 │ 2026-10-24T15:12:30.3837664Z ╰──── 2026-10-24T15:12:30.3837962Z  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-24T15:12:30.3838277Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.3838279Z 2026-10-24T15:12:30.3838591Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T15:12:30.3838795Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:643:5] 2026-10-24T15:12:30.3838850Z 638 │ 2026-10-24T15:12:30.3838917Z 639 │ useEffect(() => { 2026-10-24T15:12:30.3838989Z ·  ────┬──── 2026-10-24T15:12:30.3839122Z · ╰── This is the containing effect 2026-10-24T15:12:30.3839234Z 640 │ if (pendingLaunchEntry.key === launchTargetKey) { 2026-10-24T15:12:30.3839296Z 641 │ return; 2026-10-24T15:12:30.3839349Z 642 │ } 2026-10-24T15:12:30.3839425Z 643 │ setPendingLaunchEntry({ 2026-10-24T15:12:30.3839516Z ·  ──────────┬────────── 2026-10-24T15:12:30.3839697Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.3839773Z 644 │ key: launchTargetKey, 2026-10-24T15:12:30.3839826Z ╰──── 2026-10-24T15:12:30.3840434Z  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-24T15:12:30.3840758Z  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-24T15:12:30.3840761Z 2026-10-24T15:12:30.3841022Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T15:12:30.3841194Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5] 2026-10-24T15:12:30.3841250Z 648 │ 2026-10-24T15:12:30.3841316Z 649 │ useEffect(() => { 2026-10-24T15:12:30.3841388Z ·  ────┬──── 2026-10-24T15:12:30.3841518Z · ╰── This is the containing effect 2026-10-24T15:12:30.3841635Z 650 │ if (initialAttachGridEntry.key === launchTargetKey) { 2026-10-24T15:12:30.3841696Z 651 │ return; 2026-10-24T15:12:30.3841752Z 652 │ } 2026-10-24T15:12:30.3841831Z 653 │ setInitialAttachGridEntry({ 2026-10-24T15:12:30.3841928Z ·  ────────────┬──────────── 2026-10-24T15:12:30.3842104Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.3842177Z 654 │ key: launchTargetKey, 2026-10-24T15:12:30.3842279Z ╰──── 2026-10-24T15:12:30.3842913Z  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-24T15:12:30.3843236Z  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-24T15:12:30.3843239Z 2026-10-24T15:12:30.3843498Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T15:12:30.3843704Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7] 2026-10-24T15:12:30.3843755Z 743 │ 2026-10-24T15:12:30.3843826Z 744 │ useEffect(() => { 2026-10-24T15:12:30.3843900Z ·  ────┬──── 2026-10-24T15:12:30.3844031Z · ╰── This is the containing effect 2026-10-24T15:12:30.3844134Z 745 │ if (!routeEnvironmentId || !routeThreadId) { 2026-10-24T15:12:30.3844203Z 746 │ setLastGridSize({ 2026-10-24T15:12:30.3844288Z ·  ───────┬─────── 2026-10-24T15:12:30.3844460Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.3844542Z 747 │ cols: DEFAULT_TERMINAL_COLS, 2026-10-24T15:12:30.3844594Z ╰──── 2026-10-24T15:12:30.3845201Z  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-24T15:12:30.3845526Z  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-24T15:12:30.3845528Z 2026-10-24T15:12:30.3845731Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T15:12:30.3845902Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24] 2026-10-24T15:12:30.3845960Z 537 │ }); 2026-10-24T15:12:30.3846087Z 538 │ }, [terminal.buffer, terminal.buffer.length, terminalKey]); 2026-10-24T15:12:30.3846201Z ·  ───────────┬────────── 2026-10-24T15:12:30.3846455Z · ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead 2026-10-24T15:12:30.3846623Z 539 │ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null; 2026-10-24T15:12:30.3846675Z ╰──── 2026-10-24T15:12:30.3846973Z  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-24T15:12:30.3847283Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.3847288Z 2026-10-24T15:12:30.3847487Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T15:12:30.3847656Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7] 2026-10-24T15:12:30.3847814Z 708 │ sentInitialInputKeyRef.current = null; 2026-10-24T15:12:30.3847907Z 709 │ }, [terminalKey]); 2026-10-24T15:12:30.3847984Z ·  ─────┬───── 2026-10-24T15:12:30.3848129Z · ╰── Unnecessary dependency `terminalKey` 2026-10-24T15:12:30.3848182Z 710 │ 2026-10-24T15:12:30.3848236Z ╰──── 2026-10-24T15:12:30.3848527Z  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-24T15:12:30.3848842Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.3848845Z 2026-10-24T15:12:30.3849051Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T15:12:30.3849226Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52] 2026-10-24T15:12:30.3849281Z 799 │ }; 2026-10-24T15:12:30.3849464Z 800 │ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]); 2026-10-24T15:12:30.3849649Z ·  ────────────┬──────────── ─────┬───── 2026-10-24T15:12:30.3849884Z · │ ╰── Unnecessary dependency `terminalKey` 2026-10-24T15:12:30.3850189Z · ╰── Unnecessary dependency `terminal.lifecycleVersion` 2026-10-24T15:12:30.3850241Z 801 │ 2026-10-24T15:12:30.3850294Z ╰──── 2026-10-24T15:12:30.3850596Z  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-24T15:12:30.3850912Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.3850915Z 2026-10-24T15:12:30.3851060Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.3851231Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24] 2026-10-24T15:12:30.3851288Z 792 │ } 2026-10-24T15:12:30.3851396Z 793 │ const pasteSession = pasteSessionRef.current; 2026-10-24T15:12:30.3851510Z ·  ───────────┬─────────── 2026-10-24T15:12:30.3851680Z · ╰── Cannot access ref value during render 2026-10-24T15:12:30.3851736Z 794 │ 2026-10-24T15:12:30.3851788Z ╰──── 2026-10-24T15:12:30.3852264Z  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-24T15:12:30.3852560Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.3852563Z 2026-10-24T15:12:30.3852721Z ⚠ react(immutability): This value cannot be modified 2026-10-24T15:12:30.3852888Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:111:5] 2026-10-24T15:12:30.3853013Z 107 │ ); 2026-10-24T15:12:30.3853211Z 108 │ const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0); 2026-10-24T15:12:30.3853302Z ·  ─────────┬──────── 2026-10-24T15:12:30.3853455Z · ╰── `separationProgress` originates here 2026-10-24T15:12:30.3853508Z 109 │ 2026-10-24T15:12:30.3853602Z 110 │ useEffect(() => { 2026-10-24T15:12:30.3853779Z 111 │ separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING); 2026-10-24T15:12:30.3853864Z ·  ─────────┬──────── 2026-10-24T15:12:30.3854019Z · ╰── `separationProgress` cannot be modified 2026-10-24T15:12:30.3854130Z 112 │ }, [props.showScrollToEnd, separationProgress]); 2026-10-24T15:12:30.3854181Z ╰──── 2026-10-24T15:12:30.3854459Z  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-24T15:12:30.3854773Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T15:12:30.3854776Z 2026-10-24T15:12:30.3854933Z ⚠ react(immutability): This value cannot be modified 2026-10-24T15:12:30.3855096Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-24T15:12:30.3855210Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-24T15:12:30.3855326Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-24T15:12:30.3855408Z ·  ──────┬───── 2026-10-24T15:12:30.3855550Z · ╰── `capsuleWidth` originates here 2026-10-24T15:12:30.3855665Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T15:12:30.3855781Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T15:12:30.3855888Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T15:12:30.3855983Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T15:12:30.3856048Z 134 │ return; 2026-10-24T15:12:30.3856104Z 135 │ } 2026-10-24T15:12:30.3856210Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T15:12:30.3856295Z 137 │ measuredWidthRef.current = width; 2026-10-24T15:12:30.3856439Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T15:12:30.3856519Z ·  ──────┬───── 2026-10-24T15:12:30.3856661Z · ╰── `capsuleWidth` cannot be modified 2026-10-24T15:12:30.3856720Z 139 │ }; 2026-10-24T15:12:30.3856776Z ╰──── 2026-10-24T15:12:30.3857045Z  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-24T15:12:30.3857353Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T15:12:30.3857356Z 2026-10-24T15:12:30.3857512Z ⚠ react(immutability): This value cannot be modified 2026-10-24T15:12:30.3857676Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-24T15:12:30.3857789Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-24T15:12:30.3857903Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-24T15:12:30.3858041Z ·  ──────┬───── 2026-10-24T15:12:30.3858211Z · ╰── `capsuleWidth` originates here 2026-10-24T15:12:30.3858323Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T15:12:30.3858439Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T15:12:30.3858542Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T15:12:30.3858640Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T15:12:30.3858701Z 134 │ return; 2026-10-24T15:12:30.3858757Z 135 │ } 2026-10-24T15:12:30.3858860Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T15:12:30.3858947Z 137 │ measuredWidthRef.current = width; 2026-10-24T15:12:30.3859090Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T15:12:30.3859145Z 139 │ }; 2026-10-24T15:12:30.3859239Z 140 │ const hasStatus = props.status !== null; 2026-10-24T15:12:30.3859379Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-24T15:12:30.3859445Z 142 │ useEffect(() => { 2026-10-24T15:12:30.3859511Z 143 │ if (!hasStatus) { 2026-10-24T15:12:30.3859597Z 144 │ measuredWidthRef.current = null; 2026-10-24T15:12:30.3859678Z 145 │ capsuleWidth.value = null; 2026-10-24T15:12:30.3859755Z ·  ──────┬───── 2026-10-24T15:12:30.3859897Z · ╰── `capsuleWidth` cannot be modified 2026-10-24T15:12:30.3859950Z 146 │ } 2026-10-24T15:12:30.3860003Z ╰──── 2026-10-24T15:12:30.3860269Z  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-24T15:12:30.3860583Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T15:12:30.3860588Z 2026-10-24T15:12:30.3860791Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T15:12:30.3860957Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-24T15:12:30.3861093Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-24T15:12:30.3861157Z 142 │ useEffect(() => { 2026-10-24T15:12:30.3861234Z ·  ───┬─── 2026-10-24T15:12:30.3861458Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-24T15:12:30.3861524Z 143 │ if (!hasStatus) { 2026-10-24T15:12:30.3861617Z 144 │ measuredWidthRef.current = null; 2026-10-24T15:12:30.3861697Z 145 │ capsuleWidth.value = null; 2026-10-24T15:12:30.3861775Z ·  ──────┬───── 2026-10-24T15:12:30.3861912Z · ╰── This modifies `capsuleWidth` 2026-10-24T15:12:30.3861968Z 146 │ } 2026-10-24T15:12:30.3862018Z ╰──── 2026-10-24T15:12:30.3862366Z  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-24T15:12:30.3862673Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T15:12:30.3862676Z 2026-10-24T15:12:30.3862934Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T15:12:30.3863129Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-24T15:12:30.3863239Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T15:12:30.3863356Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T15:12:30.3863483Z ·  ───────────────┬─────────────── 2026-10-24T15:12:30.3863875Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-24T15:12:30.3863979Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T15:12:30.3864077Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T15:12:30.3864139Z 134 │ return; 2026-10-24T15:12:30.3864192Z 135 │ } 2026-10-24T15:12:30.3864301Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T15:12:30.3864391Z 137 │ measuredWidthRef.current = width; 2026-10-24T15:12:30.3864533Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T15:12:30.3864612Z ·  ──────┬───── 2026-10-24T15:12:30.3864746Z · ╰── This modifies `capsuleWidth` 2026-10-24T15:12:30.3864804Z 139 │ }; 2026-10-24T15:12:30.3864858Z ╰──── 2026-10-24T15:12:30.3865202Z  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-24T15:12:30.3865507Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T15:12:30.3865510Z 2026-10-24T15:12:30.3865686Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T15:12:30.3865840Z ╭─[apps/server/src/provider/Drivers/CodexDriver.test.ts:466:14] 2026-10-24T15:12:30.3865896Z 465 │ 2026-10-24T15:12:30.3866000Z 466 │ for (const {} of ["direct", "wrapper"] as const) { 2026-10-24T15:12:30.3866075Z ·  ── 2026-10-24T15:12:30.3866132Z 467 │ } 2026-10-24T15:12:30.3866186Z ╰──── 2026-10-24T15:12:30.3866417Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T15:12:30.3866419Z 2026-10-24T15:12:30.3866577Z ⚠ react(immutability): This value cannot be modified 2026-10-24T15:12:30.3866738Z ╭─[apps/mobile/src/features/connection/ConnectionStatusDot.tsx:58:7] 2026-10-24T15:12:30.3866897Z 53 │ function usePulseAnimation(pulse: boolean) { 2026-10-24T15:12:30.3867023Z 54 │ const pulseProgress = useSharedValue(0); 2026-10-24T15:12:30.3867108Z ·  ──────┬────── 2026-10-24T15:12:30.3867250Z · ╰── `pulseProgress` originates here 2026-10-24T15:12:30.3867304Z 55 │ 2026-10-24T15:12:30.3867369Z 56 │ useEffect(() => { 2026-10-24T15:12:30.3867435Z 57 │ if (pulse) { 2026-10-24T15:12:30.3867525Z 58 │ pulseProgress.value = withRepeat( 2026-10-24T15:12:30.3867606Z ·  ──────┬────── 2026-10-24T15:12:30.3867748Z · ╰── `pulseProgress` cannot be modified 2026-10-24T15:12:30.3867819Z 59 │ withTiming(1, { 2026-10-24T15:12:30.3867873Z ╰──── 2026-10-24T15:12:30.3868150Z  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-24T15:12:30.3868458Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T15:12:30.3868464Z 2026-10-24T15:12:30.3868659Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T15:12:30.3868820Z ╭─[apps/mobile/src/features/terminal/TerminalContextSheet.tsx:72:15] 2026-10-24T15:12:30.3868888Z 71 │ { 2026-10-24T15:12:30.3870614Z 201 │ terminalDebugLog("native:surface", { 2026-10-24T15:12:30.3870703Z 202 │ terminalKey: props.terminalKey, 2026-10-24T15:12:30.3870783Z 203 │ native: hasNativeSurface, 2026-10-24T15:12:30.3870918Z 204 │ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(), 2026-10-24T15:12:30.3871004Z 205 │ bufferLen: props.buffer.length, 2026-10-24T15:12:30.3871086Z 206 │ isRunning: props.isRunning, 2026-10-24T15:12:30.3871146Z 207 │ }); 2026-10-24T15:12:30.3871305Z 208 │ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]); 2026-10-24T15:12:30.3871395Z 209 │ const handleNativeInput = useCallback( 2026-10-24T15:12:30.3871514Z 210 │ (event: NativeSyntheticEvent) => { 2026-10-24T15:12:30.3871673Z 211 │ if (!props.isRunning || props.readOnly) { 2026-10-24T15:12:30.3871763Z 212 │ return; 2026-10-24T15:12:30.3871822Z 213 │ } 2026-10-24T15:12:30.3871916Z 214 │ terminalDebugLog("native:onInput", { 2026-10-24T15:12:30.3872070Z 215 │ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)), 2026-10-24T15:12:30.3872129Z 216 │ }); 2026-10-24T15:12:30.3872218Z 217 │ onInput(event.nativeEvent.data); 2026-10-24T15:12:30.3872277Z 218 │ }, 2026-10-24T15:12:30.3872376Z 219 │ [onInput, props.isRunning, props.readOnly], 2026-10-24T15:12:30.3872433Z 220 │ ); 2026-10-24T15:12:30.3872526Z 221 │ const handleNativeResize = useCallback( 2026-10-24T15:12:30.3872646Z 222 │ (event: NativeSyntheticEvent) => { 2026-10-24T15:12:30.3872709Z 223 │ onResize({ 2026-10-24T15:12:30.3872795Z 224 │ cols: event.nativeEvent.cols, 2026-10-24T15:12:30.3872889Z 225 │ rows: event.nativeEvent.rows, 2026-10-24T15:12:30.3872953Z 226 │ }); 2026-10-24T15:12:30.3873008Z 227 │ }, 2026-10-24T15:12:30.3873072Z 228 │ [onResize], 2026-10-24T15:12:30.3873128Z 229 │ ); 2026-10-24T15:12:30.3873184Z 230 │ 2026-10-24T15:12:30.3873266Z 231 │ if (NativeTerminalSurfaceView) { 2026-10-24T15:12:30.3873329Z 232 │ return ( 2026-10-24T15:12:30.3873410Z 233 │ 2026-10-24T15:12:30.3873493Z 234 │ { 2026-10-24T15:12:30.3876213Z ·  ───────┬─────── 2026-10-24T15:12:30.3876347Z · ╰── This is the containing effect 2026-10-24T15:12:30.3876411Z 39 │ reset(); 2026-10-24T15:12:30.3876539Z 40 │ setInitialized(true); 2026-10-24T15:12:30.3876648Z ·  ───────┬────── 2026-10-24T15:12:30.3876818Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.3876883Z 41 │ }, [reset]); 2026-10-24T15:12:30.3876937Z ╰──── 2026-10-24T15:12:30.3877547Z  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-24T15:12:30.3877877Z  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-24T15:12:30.3877880Z 2026-10-24T15:12:30.3878144Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T15:12:30.3878310Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:93:5] 2026-10-24T15:12:30.3878366Z 88 │ 2026-10-24T15:12:30.3878433Z 89 │ useEffect(() => { 2026-10-24T15:12:30.3878503Z ·  ────┬──── 2026-10-24T15:12:30.3878637Z · ╰── This is the containing effect 2026-10-24T15:12:30.3878799Z 90 │ if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return; 2026-10-24T15:12:30.3878904Z 91 │ const branchName = initialProjectRef.branch; 2026-10-24T15:12:30.3878970Z 92 │ let active = true; 2026-10-24T15:12:30.3879070Z 93 │ setPendingCheckouts((count) => count + 1); 2026-10-24T15:12:30.3879157Z ·  ─────────┬───────── 2026-10-24T15:12:30.3879338Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.3879496Z 94 │ // Serialize replacements: ignoring a stale result cannot undo its Git mutation. 2026-10-24T15:12:30.3879550Z ╰──── 2026-10-24T15:12:30.3880153Z  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-24T15:12:30.3880478Z  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-24T15:12:30.3880480Z 2026-10-24T15:12:30.3880745Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T15:12:30.3880913Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:217:7] 2026-10-24T15:12:30.3880971Z 213 │ }; 2026-10-24T15:12:30.3881037Z 214 │ useEffect(() => { 2026-10-24T15:12:30.3881111Z ·  ────┬──── 2026-10-24T15:12:30.3881241Z · ╰── This is the containing effect 2026-10-24T15:12:30.3881419Z 215 │ const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null; 2026-10-24T15:12:30.3881483Z 216 │ if (inserted) { 2026-10-24T15:12:30.3881558Z 217 │ setSelection((current) => 2026-10-24T15:12:30.3881636Z ·  ──────┬───── 2026-10-24T15:12:30.3881866Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.3882078Z 218 │ current.start === inserted.start && current.end === inserted.end ? current : inserted, 2026-10-24T15:12:30.3882131Z ╰──── 2026-10-24T15:12:30.3882742Z  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-24T15:12:30.3883066Z  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-24T15:12:30.3883069Z 2026-10-24T15:12:30.3883332Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T15:12:30.3883502Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:298:7] 2026-10-24T15:12:30.3883611Z 286 │ }, [hasWorkspaceSnapshot]); 2026-10-24T15:12:30.3883675Z 287 │ useEffect(() => { 2026-10-24T15:12:30.3883748Z ·  ────┬──── 2026-10-24T15:12:30.3883882Z · ╰── This is the containing effect 2026-10-24T15:12:30.3884030Z 288 │ if (!environmentId || !projectCwd || !selectedProviderInstanceId) return; 2026-10-24T15:12:30.3884179Z 289 │ const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`; 2026-10-24T15:12:30.3884251Z 290 │ const now = Date.now(); 2026-10-24T15:12:30.3884366Z 291 │ const lastRequest = workspaceRefreshKeyRef.current; 2026-10-24T15:12:30.3884425Z 292 │ if ( 2026-10-24T15:12:30.3884502Z 293 │ lastRequest?.key === key && 2026-10-24T15:12:30.3884649Z 294 │ now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS 2026-10-24T15:12:30.3884708Z 295 │ ) 2026-10-24T15:12:30.3884770Z 296 │ return; 2026-10-24T15:12:30.3884947Z 297 │ if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) { 2026-10-24T15:12:30.3885036Z 298 │ setWorkspaceRefreshRetry(null); 2026-10-24T15:12:30.3885133Z ·  ────────────┬─────────── 2026-10-24T15:12:30.3885314Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.3885373Z 299 │ return; 2026-10-24T15:12:30.3885426Z ╰──── 2026-10-24T15:12:30.3886038Z  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-24T15:12:30.3886367Z  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-24T15:12:30.3886369Z 2026-10-24T15:12:30.3886575Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T15:12:30.3886739Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:328:5] 2026-10-24T15:12:30.3886796Z 327 │ }, [ 2026-10-24T15:12:30.3886862Z 328 │ draftMessage, 2026-10-24T15:12:30.3886939Z ·  ──────┬───── 2026-10-24T15:12:30.3887084Z · ╰── Unnecessary dependency `draftMessage` 2026-10-24T15:12:30.3887202Z 329 │ environmentId, 2026-10-24T15:12:30.3887286Z ╰──── 2026-10-24T15:12:30.3887585Z  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-24T15:12:30.3887897Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.3887899Z 2026-10-24T15:12:30.3888160Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T15:12:30.3888322Z ╭─[apps/mobile/src/features/terminal/terminalLaunchContext.ts:117:5] 2026-10-24T15:12:30.3888496Z 112 │ const [entry, setEntry] = useState(() => ({ key: input.targetKey, location: candidate })); 2026-10-24T15:12:30.3888566Z 113 │ useEffect(() => { 2026-10-24T15:12:30.3888640Z ·  ────┬──── 2026-10-24T15:12:30.3888773Z · ╰── This is the containing effect 2026-10-24T15:12:30.3888939Z 114 │ if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) { 2026-10-24T15:12:30.3889000Z 115 │ return; 2026-10-24T15:12:30.3889054Z 116 │ } 2026-10-24T15:12:30.3889175Z 117 │ setEntry({ key: input.targetKey, location: candidate }); 2026-10-24T15:12:30.3889249Z ·  ────┬─── 2026-10-24T15:12:30.3889416Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.3889540Z 118 │ }, [candidate, entry.key, entry.location, input.targetKey]); 2026-10-24T15:12:30.3889593Z ╰──── 2026-10-24T15:12:30.3890291Z  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-24T15:12:30.3890620Z  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-24T15:12:30.3890622Z 2026-10-24T15:12:30.3890905Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-24T15:12:30.3891037Z ╭─[apps/server/src/provider/AntigravityAuth.ts:285:20] 2026-10-24T15:12:30.3891094Z 284 │ }, 2026-10-24T15:12:30.3891179Z 285 │ (effect, flow, stopSessions) => 2026-10-24T15:12:30.3891340Z ·  ──────┬───── 2026-10-24T15:12:30.3891529Z · ╰── 'stopSessions' is declared here 2026-10-24T15:12:30.3891597Z 286 │ effect.pipe( 2026-10-24T15:12:30.3891650Z ╰──── 2026-10-24T15:12:30.3891753Z  help: Consider removing this parameter. 2026-10-24T15:12:30.3891758Z 2026-10-24T15:12:30.3892016Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T15:12:30.3892175Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:361:7] 2026-10-24T15:12:30.3892316Z 355 │ }, [cancelledIncomingShareId, navigation, props.incomingShareId]); 2026-10-24T15:12:30.3892381Z 356 │ useEffect(() => { 2026-10-24T15:12:30.3892453Z ·  ────┬──── 2026-10-24T15:12:30.3892588Z · ╰── This is the containing effect 2026-10-24T15:12:30.3892684Z 357 │ if (!isReturningToProjectPicker) { 2026-10-24T15:12:30.3892745Z 358 │ return; 2026-10-24T15:12:30.3892799Z 359 │ } 2026-10-24T15:12:30.3892898Z 360 │ if (requestedInitialProjectAvailable) { 2026-10-24T15:12:30.3892995Z 361 │ setIsReturningToProjectPicker(false); 2026-10-24T15:12:30.3893099Z ·  ──────────────┬────────────── 2026-10-24T15:12:30.3893277Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.3893338Z 362 │ return; 2026-10-24T15:12:30.3893388Z ╰──── 2026-10-24T15:12:30.3894031Z  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-24T15:12:30.3894357Z  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-24T15:12:30.3894359Z 2026-10-24T15:12:30.3894621Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T15:12:30.3894776Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:504:9] 2026-10-24T15:12:30.3894831Z 447 │ 2026-10-24T15:12:30.3894894Z 448 │ useEffect(() => { 2026-10-24T15:12:30.3894966Z ·  ────┬──── 2026-10-24T15:12:30.3895097Z · ╰── This is the containing effect 2026-10-24T15:12:30.3895205Z 449 │ if (props.pendingTaskId || props.draftId) { 2026-10-24T15:12:30.3895265Z 450 │ return; 2026-10-24T15:12:30.3895319Z 451 │ } 2026-10-24T15:12:30.3895464Z 452 │ if (lastInitialProjectRefRef.current !== props.initialProjectRef) { 2026-10-24T15:12:30.3895599Z 453 │ lastInitialProjectRefRef.current = props.initialProjectRef; 2026-10-24T15:12:30.3895705Z 454 │ appliedInitialProjectKeyRef.current = null; 2026-10-24T15:12:30.3895760Z 455 │ } 2026-10-24T15:12:30.3895904Z 456 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-24T15:12:30.3896034Z 457 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-24T15:12:30.3896138Z 458 │ if (initialEnvironmentId && initialProjectId) { 2026-10-24T15:12:30.3896213Z 459 │ const directProject = 2026-10-24T15:12:30.3896283Z 460 │ projects.find( 2026-10-24T15:12:30.3896407Z 461 │ (project) => 2026-10-24T15:12:30.3896611Z 462 │ project.environmentId === initialEnvironmentId && project.id === initialProjectId, 2026-10-24T15:12:30.3896676Z 463 │ ) ?? null; 2026-10-24T15:12:30.3896729Z 464 │ 2026-10-24T15:12:30.3896799Z 465 │ if (directProject) { 2026-10-24T15:12:30.3896937Z 466 │ // Apply the route's project once. Re-applying on every change would 2026-10-24T15:12:30.3897078Z 467 │ // instantly revert environment/project switches made in the picker. 2026-10-24T15:12:30.3897242Z 468 │ const directProjectKey = `${directProject.environmentId}:${directProject.id}`; 2026-10-24T15:12:30.3897380Z 469 │ if (appliedInitialProjectKeyRef.current === directProjectKey) { 2026-10-24T15:12:30.3897441Z 470 │ return; 2026-10-24T15:12:30.3897500Z 471 │ } 2026-10-24T15:12:30.3897606Z 472 │ if (props.initialProjectRef?.branch) { 2026-10-24T15:12:30.3897673Z 473 │ if ( 2026-10-24T15:12:30.3897817Z 474 │ selectedProject?.environmentId !== directProject.environmentId || 2026-10-24T15:12:30.3897920Z 475 │ selectedProject.id !== directProject.id 2026-10-24T15:12:30.3897982Z 476 │ ) { 2026-10-24T15:12:30.3898068Z 477 │ setProject(directProject); 2026-10-24T15:12:30.3898129Z 478 │ return; 2026-10-24T15:12:30.3898189Z 479 │ } 2026-10-24T15:12:30.3898273Z 480 │ if (!flow.draftKey) return; 2026-10-24T15:12:30.3898414Z 481 │ // The route completes checkout before mounting this composer. Local 2026-10-24T15:12:30.3898558Z 482 │ // mode reuses an existing worktree; worktree mode would create another. 2026-10-24T15:12:30.3898671Z 483 │ updateComposerDraftSettings(flow.draftKey, { 2026-10-24T15:12:30.3898756Z 484 │ workspaceSelection: { 2026-10-24T15:12:30.3898829Z 485 │ mode: "local", 2026-10-24T15:12:30.3898934Z 486 │ branch: props.initialProjectRef.branch, 2026-10-24T15:12:30.3899074Z 487 │ worktreePath: props.initialProjectRef.worktreePath ?? null, 2026-10-24T15:12:30.3899157Z 488 │ startFromOrigin: false, 2026-10-24T15:12:30.3899217Z 489 │ }, 2026-10-24T15:12:30.3899276Z 490 │ }); 2026-10-24T15:12:30.3899334Z 491 │ } 2026-10-24T15:12:30.3899465Z 492 │ appliedInitialProjectKeyRef.current = directProjectKey; 2026-10-24T15:12:30.3899524Z 493 │ if ( 2026-10-24T15:12:30.3899668Z 494 │ selectedProject?.environmentId === directProject.environmentId && 2026-10-24T15:12:30.3899769Z 495 │ selectedProject.id === directProject.id 2026-10-24T15:12:30.3899834Z 496 │ ) { 2026-10-24T15:12:30.3899897Z 497 │ return; 2026-10-24T15:12:30.3899955Z 498 │ } 2026-10-24T15:12:30.3900037Z 499 │ setProject(directProject); 2026-10-24T15:12:30.3900101Z 500 │ return; 2026-10-24T15:12:30.3900155Z 501 │ } 2026-10-24T15:12:30.3900209Z 502 │ 2026-10-24T15:12:30.3900289Z 503 │ if (projects.length > 0) { 2026-10-24T15:12:30.3900387Z 504 │ setIsReturningToProjectPicker(true); 2026-10-24T15:12:30.3900496Z ·  ──────────────┬────────────── 2026-10-24T15:12:30.3900682Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.3900739Z 505 │ } 2026-10-24T15:12:30.3900792Z ╰──── 2026-10-24T15:12:30.3901458Z  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-24T15:12:30.3901824Z  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-24T15:12:30.3901826Z 2026-10-24T15:12:30.3902089Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T15:12:30.3902244Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:604:5] 2026-10-24T15:12:30.3902299Z 545 │ 2026-10-24T15:12:30.3902364Z 546 │ useEffect(() => { 2026-10-24T15:12:30.3902437Z ·  ────┬──── 2026-10-24T15:12:30.3902574Z · ╰── This is the containing effect 2026-10-24T15:12:30.3902673Z 547 │ const shareId = props.incomingShareId; 2026-10-24T15:12:30.3902755Z 548 │ const draftKey = flow.draftKey; 2026-10-24T15:12:30.3902861Z 549 │ const destinationProject = selectedProject; 2026-10-24T15:12:30.3903005Z 550 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-24T15:12:30.3903137Z 551 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-24T15:12:30.3903231Z 552 │ const selectedProjectMatchesRoute = 2026-10-24T15:12:30.3903310Z 553 │ !initialEnvironmentId || 2026-10-24T15:12:30.3941441Z 554 │ !initialProjectId || 2026-10-24T15:12:30.3941678Z 555 │ (destinationProject?.environmentId === initialEnvironmentId && 2026-10-24T15:12:30.3941794Z 556 │ destinationProject.id === initialProjectId); 2026-10-24T15:12:30.3941869Z 557 │ if ( 2026-10-24T15:12:30.3941941Z 558 │ !shareId || 2026-10-24T15:12:30.3942004Z 559 │ !draftKey || 2026-10-24T15:12:30.3942078Z 560 │ !destinationProject || 2026-10-24T15:12:30.3942168Z 561 │ !selectedProjectMatchesRoute || 2026-10-24T15:12:30.3942261Z 562 │ cancelledIncomingShareId === shareId 2026-10-24T15:12:30.3942318Z 563 │ ) { 2026-10-24T15:12:30.3942380Z 564 │ return; 2026-10-24T15:12:30.3942434Z 565 │ } 2026-10-24T15:12:30.3942535Z 566 │ const importKey = `${shareId}:${draftKey}`; 2026-10-24T15:12:30.3942591Z 567 │ if ( 2026-10-24T15:12:30.3942706Z 568 │ startedShareImportKeyRef.current === importKey || 2026-10-24T15:12:30.3942816Z 569 │ cancellingShareImportKeyRef.current === importKey 2026-10-24T15:12:30.3942870Z 570 │ ) { 2026-10-24T15:12:30.3942930Z 571 │ return; 2026-10-24T15:12:30.3942989Z 572 │ } 2026-10-24T15:12:30.3943046Z 573 │ 2026-10-24T15:12:30.3943115Z 574 │ if (!incomingShare) { 2026-10-24T15:12:30.3943317Z 575 │ if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) { 2026-10-24T15:12:30.3943450Z 576 │ alertedUnavailableIncomingShareIdRef.current = shareId; 2026-10-24T15:12:30.3943516Z 577 │ Dialog.alert( 2026-10-24T15:12:30.3943650Z 578 │ "Shared content unavailable", 2026-10-24T15:12:30.3943830Z 579 │ "The shared content is no longer in the inbox. You can continue editing this task draft.", 2026-10-24T15:12:30.3943888Z 580 │ ); 2026-10-24T15:12:30.3943944Z 581 │ } 2026-10-24T15:12:30.3944003Z 582 │ return; 2026-10-24T15:12:30.3944057Z 583 │ } 2026-10-24T15:12:30.3944109Z 584 │ 2026-10-24T15:12:30.3944167Z 585 │ if ( 2026-10-24T15:12:30.3944495Z 586 │ incomingShare.attachments.some((attachment) => attachment.type === "file") && 2026-10-24T15:12:30.3944648Z 587 │ selectedEnvironmentServerConfig === null 2026-10-24T15:12:30.3944702Z 588 │ ) { 2026-10-24T15:12:30.3944762Z 589 │ return; 2026-10-24T15:12:30.3944816Z 590 │ } 2026-10-24T15:12:30.3944867Z 591 │ 2026-10-24T15:12:30.3945006Z 592 │ if (alertedUnavailableIncomingShareIdRef.current === shareId) { 2026-10-24T15:12:30.3945128Z 593 │ alertedUnavailableIncomingShareIdRef.current = null; 2026-10-24T15:12:30.3945182Z 594 │ } 2026-10-24T15:12:30.3945290Z 595 │ startedShareImportKeyRef.current = importKey; 2026-10-24T15:12:30.3945360Z 596 │ const draftBackup = 2026-10-24T15:12:30.3945551Z 597 │ shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey); 2026-10-24T15:12:30.3945696Z 598 │ shareImportDraftBackupRef.current.set(importKey, draftBackup); 2026-10-24T15:12:30.3945791Z 599 │ const importToken = Symbol(importKey); 2026-10-24T15:12:30.3945870Z 600 │ let didReserveShare = false; 2026-10-24T15:12:30.3945947Z 601 │ let didConsumeShare = false; 2026-10-24T15:12:30.3946028Z 602 │ let needsDraftRestore = false; 2026-10-24T15:12:30.3946138Z 603 │ activeShareImportTokenRef.current = importToken; 2026-10-24T15:12:30.3946223Z 604 │ setImportingShareKey(importKey); 2026-10-24T15:12:30.3946320Z ·  ──────────┬───────── 2026-10-24T15:12:30.3946519Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.3946587Z 605 │ void (async () => { 2026-10-24T15:12:30.3946643Z ╰──── 2026-10-24T15:12:30.3947267Z  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-24T15:12:30.3947615Z  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-24T15:12:30.3947621Z 2026-10-24T15:12:30.3947834Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T15:12:30.3947993Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:524:5] 2026-10-24T15:12:30.3948072Z 523 │ props.initialProjectRef, 2026-10-24T15:12:30.3948145Z 524 │ props.incomingShareId, 2026-10-24T15:12:30.3948235Z ·  ──────────┬────────── 2026-10-24T15:12:30.3948411Z · ╰── Unnecessary dependency `props.incomingShareId` 2026-10-24T15:12:30.3948487Z 525 │ props.pendingTaskId, 2026-10-24T15:12:30.3948540Z ╰──── 2026-10-24T15:12:30.3948840Z  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-24T15:12:30.3949155Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.3949159Z 2026-10-24T15:12:30.3949376Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T15:12:30.3949530Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:543:5] 2026-10-24T15:12:30.3949705Z 542 │ loadedBranchesProjectKeyRef.current = projectKey; 2026-10-24T15:12:30.3949803Z 543 │ flow.loadBranches(); 2026-10-24T15:12:30.3949872Z ·  ──┬─ 2026-10-24T15:12:30.3950001Z · ╰── Missing dependency `flow` 2026-10-24T15:12:30.3950096Z 544 │ }, [flow.loadBranches, selectedProject]); 2026-10-24T15:12:30.3950183Z ·  ────────┬──────── 2026-10-24T15:12:30.3950387Z · ╰── Overly precise dependency `flow.loadBranches`, use `flow` instead 2026-10-24T15:12:30.3950441Z 545 │ 2026-10-24T15:12:30.3950492Z ╰──── 2026-10-24T15:12:30.3950929Z  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-24T15:12:30.3951247Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.3951249Z 2026-10-24T15:12:30.3951453Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T15:12:30.3951605Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:766:5] 2026-10-24T15:12:30.3951671Z 765 │ flow.draftKey, 2026-10-24T15:12:30.3951747Z 766 │ hasImportedIncomingShare, 2026-10-24T15:12:30.3951841Z ·  ────────────┬─────────── 2026-10-24T15:12:30.3952019Z · ╰── Unnecessary dependency `hasImportedIncomingShare` 2026-10-24T15:12:30.3952084Z 767 │ incomingShare, 2026-10-24T15:12:30.3952170Z 768 │ isIncomingShareInboxLoading, 2026-10-24T15:12:30.3952271Z ·  ─────────────┬───────────── 2026-10-24T15:12:30.3952455Z · ╰── Unnecessary dependency `isIncomingShareInboxLoading` 2026-10-24T15:12:30.3952535Z 769 │ isIncomingShareUnavailable, 2026-10-24T15:12:30.3952606Z 770 │ props.incomingShareId, 2026-10-24T15:12:30.3952701Z 771 │ props.initialProjectRef?.environmentId, 2026-10-24T15:12:30.3952791Z 772 │ props.initialProjectRef?.projectId, 2026-10-24T15:12:30.3952864Z 773 │ releaseShareReservation, 2026-10-24T15:12:30.3952927Z 774 │ reserveShare, 2026-10-24T15:12:30.3953014Z 775 │ selectedEnvironmentServerConfig, 2026-10-24T15:12:30.3953081Z 776 │ selectedProject, 2026-10-24T15:12:30.3953151Z 777 │ shareImportAttempt, 2026-10-24T15:12:30.3953238Z ·  ─────────┬──────── 2026-10-24T15:12:30.3953459Z · ╰── Unnecessary dependency `shareImportAttempt` 2026-10-24T15:12:30.3953576Z 778 │ ]); 2026-10-24T15:12:30.3953630Z ╰──── 2026-10-24T15:12:30.3953925Z  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-24T15:12:30.3954239Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.3954242Z 2026-10-24T15:12:30.3954723Z ⚠ 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-24T15:12:30.3954913Z ╭─[apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts:223:5] 2026-10-24T15:12:30.3954987Z 222 │ let idlePasses = 0; 2026-10-24T15:12:30.3955135Z 223 │ ╭─▶ for (;;) { 2026-10-24T15:12:30.3955275Z 224 │ │ yield* Effect.promise(() => Promise.resolve()); 2026-10-24T15:12:30.3955422Z 225 │ │ const pending = backgroundRuntime.pending.shift(); 2026-10-24T15:12:30.3955519Z 226 │ │ if (!pending) { 2026-10-24T15:12:30.3955614Z 227 │ │ idlePasses++; 2026-10-24T15:12:30.3955721Z 228 │ │ if (idlePasses >= 3) { 2026-10-24T15:12:30.3955808Z 229 │ │ return; 2026-10-24T15:12:30.3955886Z 230 │ │ } 2026-10-24T15:12:30.3955978Z 231 │ │ continue; 2026-10-24T15:12:30.3956057Z 232 │ │ } 2026-10-24T15:12:30.3956150Z 233 │ │ idlePasses = 0; 2026-10-24T15:12:30.3956267Z 234 │ │ const exit = yield* Effect.exit( 2026-10-24T15:12:30.3956482Z 235 │ │ pending.operation as Effect.Effect, 2026-10-24T15:12:30.3956560Z 236 │ │ ); 2026-10-24T15:12:30.3956669Z 237 │ │ yield* Effect.sync(() => { 2026-10-24T15:12:30.3956774Z 238 │ │ pending.resolve(exit); 2026-10-24T15:12:30.3956851Z 239 │ │ }); 2026-10-24T15:12:30.3956982Z 240 │ ╰─▶ } 2026-10-24T15:12:30.3957047Z 241 │ }, 2026-10-24T15:12:30.3957103Z ╰──── 2026-10-24T15:12:30.3957106Z 2026-10-24T15:12:30.3957314Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-24T15:12:30.3957486Z ╭─[apps/server/src/sourceControl/SourceControlProviderRegistry.ts:15:13] 2026-10-24T15:12:30.3957559Z 14 │ } from "@t3tools/contracts"; 2026-10-24T15:12:30.3957649Z 15 │ import type {} from "@t3tools/contracts"; 2026-10-24T15:12:30.3957719Z ·  ── 2026-10-24T15:12:30.3957771Z 16 │ 2026-10-24T15:12:30.3957822Z ╰──── 2026-10-24T15:12:30.3957904Z  help: Remove empty braces 2026-10-24T15:12:30.3957907Z 2026-10-24T15:12:30.3958391Z ⚠ 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-24T15:12:30.3958574Z ╭─[apps/server/src/provider/acp/AntigravityProtocol.ts:263:20] 2026-10-24T15:12:30.3958655Z 262 │ ...(update._meta !== undefined 2026-10-24T15:12:30.3958822Z 263 │ ? { _meta: Schema.is(Schema.Record(Schema.String, Schema.Json))(meta) ? meta : null } 2026-10-24T15:12:30.3958912Z ·  ───────── 2026-10-24T15:12:30.3958974Z 264 │ : {}), 2026-10-24T15:12:30.3959027Z ╰──── 2026-10-24T15:12:30.3959030Z 2026-10-24T15:12:30.3959254Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T15:12:30.3959383Z ╭─[scripts/lib/cli-external-packages.test.ts:114:11] 2026-10-24T15:12:30.3959451Z 113 │ const declared = { 2026-10-24T15:12:30.3959552Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-24T15:12:30.3959667Z ·  ──────────────────────────────── 2026-10-24T15:12:30.3959773Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T15:12:30.3959823Z ╰──── 2026-10-24T15:12:30.3960096Z  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-24T15:12:30.3960099Z 2026-10-24T15:12:30.3960319Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T15:12:30.3960447Z ╭─[scripts/lib/cli-external-packages.test.ts:115:11] 2026-10-24T15:12:30.3960536Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-24T15:12:30.3960638Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T15:12:30.3960767Z ·  ──────────────────────────────────────── 2026-10-24T15:12:30.3960865Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-24T15:12:30.3960916Z ╰──── 2026-10-24T15:12:30.3961182Z  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-24T15:12:30.3961185Z 2026-10-24T15:12:30.3961402Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T15:12:30.3961528Z ╭─[scripts/lib/cli-external-packages.test.ts:116:11] 2026-10-24T15:12:30.3961627Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T15:12:30.3961723Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-24T15:12:30.3961839Z ·  ──────────────────────────────────── 2026-10-24T15:12:30.3961904Z 117 │ }; 2026-10-24T15:12:30.3961959Z ╰──── 2026-10-24T15:12:30.3962223Z  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-24T15:12:30.3962226Z 2026-10-24T15:12:30.3962485Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T15:12:30.3962639Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:570:5] 2026-10-24T15:12:30.3962698Z 568 │ }, []); 2026-10-24T15:12:30.3962764Z 569 │ useEffect(() => { 2026-10-24T15:12:30.3962836Z ·  ────┬──── 2026-10-24T15:12:30.3962969Z · ╰── This is the containing effect 2026-10-24T15:12:30.3963055Z 570 │ setKeyboardStateSuspect(false); 2026-10-24T15:12:30.3963196Z ·  ───────────┬─────────── 2026-10-24T15:12:30.3963401Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.3963501Z 571 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-24T15:12:30.3963590Z ╰──── 2026-10-24T15:12:30.3964199Z  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-24T15:12:30.3964526Z  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-24T15:12:30.3964529Z 2026-10-24T15:12:30.3964795Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T15:12:30.3964952Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:966:7] 2026-10-24T15:12:30.3965109Z 963 │ const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0); 2026-10-24T15:12:30.3965174Z 964 │ useEffect(() => { 2026-10-24T15:12:30.3965246Z ·  ────┬──── 2026-10-24T15:12:30.3965377Z · ╰── This is the containing effect 2026-10-24T15:12:30.3965537Z 965 │ if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) { 2026-10-24T15:12:30.3965649Z 966 │ setLastKnownKeyboardHeight(liveKeyboardHeight); 2026-10-24T15:12:30.3965749Z ·  ─────────────┬──────────── 2026-10-24T15:12:30.3965934Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.3965994Z 967 │ } 2026-10-24T15:12:30.3966045Z ╰──── 2026-10-24T15:12:30.3966653Z  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-24T15:12:30.3966980Z  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-24T15:12:30.3966982Z 2026-10-24T15:12:30.3967242Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T15:12:30.3967404Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1222:5] 2026-10-24T15:12:30.3967461Z 1220 │ 2026-10-24T15:12:30.3967529Z 1221 │ useEffect(() => { 2026-10-24T15:12:30.3967602Z ·  ────┬──── 2026-10-24T15:12:30.3967734Z · ╰── This is the containing effect 2026-10-24T15:12:30.3967811Z 1222 │ setAnchorMessageId(null); 2026-10-24T15:12:30.3967898Z ·  ─────────┬──────── 2026-10-24T15:12:30.3968072Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.3968155Z 1223 │ setSubmittedMessageId(null); 2026-10-24T15:12:30.3968206Z ╰──── 2026-10-24T15:12:30.3968862Z  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-24T15:12:30.3969217Z  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-24T15:12:30.3969219Z 2026-10-24T15:12:30.3969422Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T15:12:30.3969574Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:571:7] 2026-10-24T15:12:30.3969658Z 570 │ setKeyboardStateSuspect(false); 2026-10-24T15:12:30.3969758Z 571 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-24T15:12:30.3969900Z ·  ────────┬──────── ─────────┬──────── 2026-10-24T15:12:30.3970198Z · │ ╰── Unnecessary dependency `liveKeyboardHeight` 2026-10-24T15:12:30.3970363Z · ╰── Unnecessary dependency `isKeyboardVisible` 2026-10-24T15:12:30.3970492Z 572 │ const handleOwnedInputFocusChange = (focused: boolean) => { 2026-10-24T15:12:30.3970543Z ╰──── 2026-10-24T15:12:30.3970842Z  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-24T15:12:30.3971152Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.3971155Z 2026-10-24T15:12:30.3971360Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T15:12:30.3971518Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1170:7] 2026-10-24T15:12:30.3971605Z 1169 │ userInputInsetProgress.set(1); 2026-10-24T15:12:30.3971767Z 1170 │ }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]); 2026-10-24T15:12:30.3971863Z ·  ────────────┬─────────── 2026-10-24T15:12:30.3972043Z · ╰── Unnecessary dependency `activeUserInputRequestId` 2026-10-24T15:12:30.3972151Z 1171 │ const showContent = props.showContent ?? true; 2026-10-24T15:12:30.3972203Z ╰──── 2026-10-24T15:12:30.3972497Z  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-24T15:12:30.3972815Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.3972821Z 2026-10-24T15:12:30.3973021Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T15:12:30.3973179Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1228:15] 2026-10-24T15:12:30.3973246Z 1227 │ freeze.set(false); 2026-10-24T15:12:30.3973329Z 1228 │ }, [freeze, selectedThreadKey]); 2026-10-24T15:12:30.3973424Z ·  ────────┬──────── 2026-10-24T15:12:30.3973633Z · ╰── Unnecessary dependency `selectedThreadKey` 2026-10-24T15:12:30.3973686Z 1229 │ 2026-10-24T15:12:30.3973739Z ╰──── 2026-10-24T15:12:30.3974101Z  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-24T15:12:30.3974451Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.3974454Z 2026-10-24T15:12:30.3974612Z ⚠ react(immutability): This value cannot be modified 2026-10-24T15:12:30.3974763Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1058:5] 2026-10-24T15:12:30.3974875Z 1053 │ const composerPopoverHeight = useSharedValue(0); 2026-10-24T15:12:30.3974983Z 1054 │ const floatingControlCoverage = useSharedValue( 2026-10-24T15:12:30.3975079Z ·  ───────────┬─────────── 2026-10-24T15:12:30.3975247Z · ╰── `floatingControlCoverage` originates here 2026-10-24T15:12:30.3975379Z 1055 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-24T15:12:30.3975435Z 1056 │ ); 2026-10-24T15:12:30.3975503Z 1057 │ useEffect(() => { 2026-10-24T15:12:30.3975606Z 1058 │ floatingControlCoverage.value = withTiming( 2026-10-24T15:12:30.3975698Z ·  ───────────┬─────────── 2026-10-24T15:12:30.3975865Z · ╰── `floatingControlCoverage` cannot be modified 2026-10-24T15:12:30.3975993Z 1059 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-24T15:12:30.3976045Z ╰──── 2026-10-24T15:12:30.3976314Z  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-24T15:12:30.3976632Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T15:12:30.3976638Z 2026-10-24T15:12:30.3976796Z ⚠ react(immutability): This value cannot be modified 2026-10-24T15:12:30.3976948Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1076:7] 2026-10-24T15:12:30.3977138Z 1066 │ const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null; 2026-10-24T15:12:30.3977263Z 1067 │ const combinedContentInsetEndAdjustment = useSharedValue( 2026-10-24T15:12:30.3977375Z ·  ────────────────┬──────────────── 2026-10-24T15:12:30.3977564Z · ╰── `combinedContentInsetEndAdjustment` originates here 2026-10-24T15:12:30.3977696Z 1068 │ Math.max(0, estimatedOverlayHeight - nativeInsetOvercount), 2026-10-24T15:12:30.3977817Z 1069 │ ); 2026-10-24T15:12:30.3977919Z 1070 │ useAnimatedReaction( 2026-10-24T15:12:30.3977978Z 1071 │ () => 2026-10-24T15:12:30.3978071Z 1072 │ contentInsetEndAdjustment.value + 2026-10-24T15:12:30.3978160Z 1073 │ floatingControlCoverage.value + 2026-10-24T15:12:30.3978357Z 1074 │ (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0), 2026-10-24T15:12:30.3978422Z 1075 │ (value) => { 2026-10-24T15:12:30.3978536Z 1076 │ combinedContentInsetEndAdjustment.value = value; 2026-10-24T15:12:30.3978647Z ·  ────────────────┬──────────────── 2026-10-24T15:12:30.3978841Z · ╰── `combinedContentInsetEndAdjustment` cannot be modified 2026-10-24T15:12:30.3978898Z 1077 │ }, 2026-10-24T15:12:30.3978950Z ╰──── 2026-10-24T15:12:30.3979227Z  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-24T15:12:30.3979539Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T15:12:30.3979542Z 2026-10-24T15:12:30.3979743Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T15:12:30.3979906Z ╭─[apps/mobile/src/features/workspace/WorkspaceToolbar.ios.tsx:114:33] 2026-10-24T15:12:30.3980004Z 113 │ return () => cancelAnimationFrame(frame); 2026-10-24T15:12:30.3980101Z 114 │ }, [restoreSearch, tabActive, bottomSearch]); 2026-10-24T15:12:30.3980209Z ·  ──────┬───── 2026-10-24T15:12:30.3980383Z · ╰── Unnecessary dependency `bottomSearch` 2026-10-24T15:12:30.3980489Z 115 │ const composeButton = nativeToolbarCompose ? ( 2026-10-24T15:12:30.3980543Z ╰──── 2026-10-24T15:12:30.3980840Z  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-24T15:12:30.3981150Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.3981154Z 2026-10-24T15:12:30.3981623Z ⚠ 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-24T15:12:30.3981754Z ╭─[packages/effect-acp/src/errors.test.ts:129:28] 2026-10-24T15:12:30.3981851Z 128 │ const secret = "acp-summary-secret"; 2026-10-24T15:12:30.3981963Z 129 │ const cause = yield* Schema.decodeUnknownEffect( 2026-10-24T15:12:30.3982088Z ·  ────────────────────────── 2026-10-24T15:12:30.3982157Z 130 │ Schema.Struct({ 2026-10-24T15:12:30.3982210Z ╰──── 2026-10-24T15:12:30.3982213Z 2026-10-24T15:12:30.3982589Z ⚠ 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-24T15:12:30.3982706Z ╭─[packages/effect-acp/src/client.ts:1269:11] 2026-10-24T15:12:30.3982856Z 1268 │ extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) => 2026-10-24T15:12:30.3983084Z 1269 │ Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe( 2026-10-24T15:12:30.3983243Z ·  ────────────────────────── 2026-10-24T15:12:30.3983390Z 1270 │ Effect.mapError(() => AcpError.AcpRequestError.invalidParams()), 2026-10-24T15:12:30.3983442Z ╰──── 2026-10-24T15:12:30.3983445Z 2026-10-24T15:12:30.3983810Z ⚠ 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-24T15:12:30.3983929Z ╭─[packages/effect-acp/src/schema.test.ts:18:12] 2026-10-24T15:12:30.3984094Z 17 │ const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } }; 2026-10-24T15:12:30.3984217Z 18 │ expect(Schema.is(V1.AvailableCommand)(command)).toBe(true); 2026-10-24T15:12:30.3984303Z ·  ───────── 2026-10-24T15:12:30.3984367Z 19 │ expect( 2026-10-24T15:12:30.3984421Z ╰──── 2026-10-24T15:12:30.3984424Z 2026-10-24T15:12:30.3984756Z ⚠ 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-24T15:12:30.3984874Z ╭─[packages/effect-acp/src/schema.test.ts:20:7] 2026-10-24T15:12:30.3984936Z 19 │ expect( 2026-10-24T15:12:30.3985107Z 20 │ Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }), 2026-10-24T15:12:30.3985180Z ·  ───────── 2026-10-24T15:12:30.3985245Z 21 │ ).toBe(true); 2026-10-24T15:12:30.3985297Z ╰──── 2026-10-24T15:12:30.3985299Z 2026-10-24T15:12:30.3985773Z ⚠ 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-24T15:12:30.3985904Z ╭─[packages/effect-acp/src/protocol.test.ts:500:31] 2026-10-24T15:12:30.3985956Z 499 │ 2026-10-24T15:12:30.3986071Z 500 │ const response = yield* Schema.decodeUnknownEffect( 2026-10-24T15:12:30.3986195Z ·  ────────────────────────── 2026-10-24T15:12:30.3986305Z 501 │ Schema.fromJsonString(JsonRpcErrorResponse), 2026-10-24T15:12:30.3986357Z ╰──── 2026-10-24T15:12:30.3986360Z 2026-10-24T15:12:30.3986622Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T15:12:30.3986803Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:333:7] 2026-10-24T15:12:30.3986862Z 328 │ }; 2026-10-24T15:12:30.3986928Z 329 │ useEffect(() => { 2026-10-24T15:12:30.3987000Z ·  ────┬──── 2026-10-24T15:12:30.3987135Z · ╰── This is the containing effect 2026-10-24T15:12:30.3987235Z 330 │ if (!guidesEnabled && section === "guide") { 2026-10-24T15:12:30.3987330Z 331 │ requestedSection.current = "overview"; 2026-10-24T15:12:30.3987503Z 332 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-24T15:12:30.3987578Z 333 │ setSection("overview"); 2026-10-24T15:12:30.3987656Z ·  ─────┬──── 2026-10-24T15:12:30.3987828Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.3987884Z 334 │ } 2026-10-24T15:12:30.3987936Z ╰──── 2026-10-24T15:12:30.3988887Z  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-24T15:12:30.3989245Z  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-24T15:12:30.3989249Z 2026-10-24T15:12:30.3989455Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T15:12:30.3989628Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:335:6] 2026-10-24T15:12:30.3989726Z 330 │ if (!guidesEnabled && section === "guide") { 2026-10-24T15:12:30.3989825Z 331 │ requestedSection.current = "overview"; 2026-10-24T15:12:30.3989911Z ·  ────────┬─────── 2026-10-24T15:12:30.3990362Z · ╰── 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-24T15:12:30.3990528Z 332 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-24T15:12:30.3990680Z ·  ─────────┬───────── ──────┬────── 2026-10-24T15:12:30.3991194Z · │ ╰── 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-24T15:12:30.3991653Z · ╰── 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-24T15:12:30.3991727Z 333 │ setSection("overview"); 2026-10-24T15:12:30.3991783Z 334 │ } 2026-10-24T15:12:30.3991877Z 335 │ }, [guidesEnabled, section, insets.top]); 2026-10-24T15:12:30.3991988Z ·  ──────────────────┬───────────────── 2026-10-24T15:12:30.3992183Z · ╰── This dependency list is missing values used by the callback 2026-10-24T15:12:30.3992270Z 336 │ const tabContent = activityContent; 2026-10-24T15:12:30.3992321Z ╰──── 2026-10-24T15:12:30.3992545Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T15:12:30.3992894Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.3992897Z 2026-10-24T15:12:30.3993101Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T15:12:30.3993273Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:877:6] 2026-10-24T15:12:30.3993331Z 860 │ if ( 2026-10-24T15:12:30.3993445Z 861 │ lastSelection.current.path === route.params.path && 2026-10-24T15:12:30.3993525Z ·  ──────┬────── 2026-10-24T15:12:30.3993996Z · ╰── 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-24T15:12:30.3994129Z 862 │ lastSelection.current.id === route.params.fileSelectionId 2026-10-24T15:12:30.3994183Z 863 │ ) 2026-10-24T15:12:30.3994245Z 864 │ return; 2026-10-24T15:12:30.3994421Z 865 │ lastSelection.current = { path: route.params.path, id: route.params.fileSelectionId }; 2026-10-24T15:12:30.3994559Z 866 │ if (route.params.focus) navigation.setParams({ focus: undefined }); 2026-10-24T15:12:30.3994645Z 867 │ setJumpPath(route.params.path); 2026-10-24T15:12:30.3994718Z 868 │ setSelectedRowId(null); 2026-10-24T15:12:30.3994799Z 869 │ jumpStarted.current = false; 2026-10-24T15:12:30.3994946Z 870 │ const file = data.files.find((entry) => entry.path === route.params.path); 2026-10-24T15:12:30.3995046Z 871 │ if (!file || !nativeView.current) return; 2026-10-24T15:12:30.3995140Z ·  ─────┬──── 2026-10-24T15:12:30.3995581Z · ╰── 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-24T15:12:30.3995707Z 872 │ setCollapsedIds((ids) => ids.filter((id) => id !== file.id)); 2026-10-24T15:12:30.3995784Z 873 │ jumpStarted.current = true; 2026-10-24T15:12:30.3995921Z 874 │ void nativeView.current.scrollToFile(file.id, false).catch(() => { 2026-10-24T15:12:30.3996002Z 875 │ jumpStarted.current = false; 2026-10-24T15:12:30.3996059Z 876 │ }); 2026-10-24T15:12:30.3996253Z 877 │ }, [route.params.path, route.params.fileSelectionId, route.params.focus, data.files, navigation]); 2026-10-24T15:12:30.3996466Z ·  ──────────────────────────────────────────────┬────────────────────────────────────────────── 2026-10-24T15:12:30.3996695Z · ╰── This dependency list is missing values used by the callback 2026-10-24T15:12:30.3996807Z 878 │ const appliedFilter = useRef(filter.hideTestFiles); 2026-10-24T15:12:30.3996861Z ╰──── 2026-10-24T15:12:30.3997027Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T15:12:30.3997343Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.3997345Z 2026-10-24T15:12:30.3997516Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T15:12:30.3997737Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:698:76] 2026-10-24T15:12:30.3997947Z 697 │ const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() })); 2026-10-24T15:12:30.3998114Z 698 │ if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() }); 2026-10-24T15:12:30.3998254Z ·  ─────┬──── 2026-10-24T15:12:30.3998440Z · ╰── Cannot call impure function 2026-10-24T15:12:30.3998576Z 699 │ const snoozeGateNow = new Date(snoozeGateClock.now).toISOString(); 2026-10-24T15:12:30.3998627Z ╰──── 2026-10-24T15:12:30.3998921Z  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-24T15:12:30.3999223Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T15:12:30.3999226Z 2026-10-24T15:12:30.3999392Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T15:12:30.3999550Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:719:71] 2026-10-24T15:12:30.3999630Z 718 │ const snoozePresets = useMemo( 2026-10-24T15:12:30.3999809Z 719 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-24T15:12:30.3999942Z ·  ─────┬──── 2026-10-24T15:12:30.4000129Z · ╰── Cannot call impure function 2026-10-24T15:12:30.4000250Z 720 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-24T15:12:30.4000302Z ╰──── 2026-10-24T15:12:30.4000582Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T15:12:30.4000880Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T15:12:30.4000882Z 2026-10-24T15:12:30.4001065Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T15:12:30.4001224Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:720:6] 2026-10-24T15:12:30.4001404Z 719 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-24T15:12:30.4001521Z 720 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-24T15:12:30.4001612Z ·  ────────────┬─────────── 2026-10-24T15:12:30.4001792Z · ╰── Unnecessary dependency `props.snoozePresetMinute` 2026-10-24T15:12:30.4001848Z 721 │ ); 2026-10-24T15:12:30.4001900Z ╰──── 2026-10-24T15:12:30.4002219Z  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-24T15:12:30.4002533Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.4002536Z 2026-10-24T15:12:30.4002769Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T15:12:30.4002953Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:766:7] 2026-10-24T15:12:30.4003023Z 765 │ thread.pinnedAt, 2026-10-24T15:12:30.4003085Z 766 │ variant, 2026-10-24T15:12:30.4003158Z ·  ───┬─── 2026-10-24T15:12:30.4003295Z · ╰── Unnecessary dependency `variant` 2026-10-24T15:12:30.4003351Z 767 │ ], 2026-10-24T15:12:30.4003401Z ╰──── 2026-10-24T15:12:30.4003744Z  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-24T15:12:30.4004055Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.4004064Z 2026-10-24T15:12:30.4004264Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T15:12:30.4004424Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1216:21] 2026-10-24T15:12:30.4004552Z 1215 │ {providerDrivers.slice(0, -1).map((driver, index) => ( 2026-10-24T15:12:30.4004688Z 1216 │ 2026-10-24T15:12:30.4004803Z ·  ────────────────────────── 2026-10-24T15:12:30.4004913Z 1217 │ 2026-10-24T15:12:30.4004968Z ╰──── 2026-10-24T15:12:30.4005115Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T15:12:30.4005117Z 2026-10-24T15:12:30.4005344Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T15:12:30.4005453Z ╭─[apps/mobile/src/Stack.tsx:1079:21] 2026-10-24T15:12:30.4005515Z 1078 │ } 2026-10-24T15:12:30.4005783Z ·  ───────────────────────────────────────────── 2026-10-24T15:12:30.4005868Z 1080 │ screenOptions={({ route }) => 2026-10-24T15:12:30.4005919Z ╰──── 2026-10-24T15:12:30.4006290Z  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-24T15:12:30.4006293Z 2026-10-24T15:12:30.4006527Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T15:12:30.4006676Z ╭─[packages/client-runtime/src/operations/projects.ts:238:51] 2026-10-24T15:12:30.4006736Z 237 │ ): string { 2026-10-24T15:12:30.4006892Z 238 │ const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? ""; 2026-10-24T15:12:30.4007006Z ·  ────── 2026-10-24T15:12:30.4007140Z 239 │ return target.owner ? `${target.owner}/${folderName}` : folderName; 2026-10-24T15:12:30.4007191Z ╰──── 2026-10-24T15:12:30.4007363Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T15:12:30.4007366Z 2026-10-24T15:12:30.4007630Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T15:12:30.4007853Z ╭─[apps/server/src/orchestration-v2/ThreadPullRequestService.ts:410:7] 2026-10-24T15:12:30.4007936Z 409 │ 2026-10-24T15:12:30.4008061Z 410 │ const layer = Layer.effect(ThreadPullRequestServiceV2, make); 2026-10-24T15:12:30.4008132Z ·  ──┬── 2026-10-24T15:12:30.4008258Z · ╰── 'layer' is declared here 2026-10-24T15:12:30.4008308Z ╰──── 2026-10-24T15:12:30.4008413Z  help: Consider removing this declaration. 2026-10-24T15:12:30.4008416Z 2026-10-24T15:12:30.4008717Z ⚠ eslint(no-unused-vars): Variable 'layerFromProviderAdapter' is declared but never used. Unused variables should start with a '_'. 2026-10-24T15:12:30.4008879Z ╭─[apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts:346:7] 2026-10-24T15:12:30.4008933Z 345 │ 2026-10-24T15:12:30.4009041Z 346 │ const layerFromProviderAdapter: Layer.Layer< 2026-10-24T15:12:30.4009140Z ·  ────────────┬─────────── 2026-10-24T15:12:30.4009308Z · ╰── 'layerFromProviderAdapter' is declared here 2026-10-24T15:12:30.4009386Z 347 │ ProviderAdapterRegistryV2, 2026-10-24T15:12:30.4009437Z ╰──── 2026-10-24T15:12:30.4009541Z  help: Consider removing this declaration. 2026-10-24T15:12:30.4009544Z 2026-10-24T15:12:30.4009806Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T15:12:30.4010024Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:406:5] 2026-10-24T15:12:30.4010077Z 404 │ 2026-10-24T15:12:30.4010144Z 405 │ useEffect(() => { 2026-10-24T15:12:30.4010215Z ·  ────┬──── 2026-10-24T15:12:30.4010351Z · ╰── This is the containing effect 2026-10-24T15:12:30.4010445Z 406 │ setInspectorSelection((current) => { 2026-10-24T15:12:30.4010533Z ·  ──────────┬────────── 2026-10-24T15:12:30.4010708Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.4010810Z 407 │ if (props.renderInspector === undefined) { 2026-10-24T15:12:30.4010860Z ╰──── 2026-10-24T15:12:30.4011468Z  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-24T15:12:30.4011798Z  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-24T15:12:30.4011803Z 2026-10-24T15:12:30.4012021Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T15:12:30.4012174Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:534:24] 2026-10-24T15:12:30.4012334Z 533 │ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top; 2026-10-24T15:12:30.4012508Z 534 │ ╭─▶ const GitInspector = () => ( 2026-10-24T15:12:30.4012607Z 535 │ │ 2026-10-24T15:12:30.4013346Z 540 │ ╰─▶ ); 2026-10-24T15:12:30.4013425Z 541 │ const FilesInspector = () => 2026-10-24T15:12:30.4013478Z ╰──── 2026-10-24T15:12:30.4013720Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-24T15:12:30.4013723Z 2026-10-24T15:12:30.4013936Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T15:12:30.4014086Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:541:26] 2026-10-24T15:12:30.4014146Z 540 │ ); 2026-10-24T15:12:30.4014319Z 541 │ ╭─▶ const FilesInspector = () => 2026-10-24T15:12:30.4014475Z 542 │ │ selectedThread !== null && selectedThreadCwd !== null ? ( 2026-10-24T15:12:30.4014581Z 543 │ │ 2026-10-24T15:12:30.4015554Z 551 │ ╰─▶ ) : null; 2026-10-24T15:12:30.4015706Z 552 │ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset); 2026-10-24T15:12:30.4015758Z ╰──── 2026-10-24T15:12:30.4015977Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-24T15:12:30.4015980Z 2026-10-24T15:12:30.4016241Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T15:12:30.4016429Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:119:10] 2026-10-24T15:12:30.4016482Z 117 │ 2026-10-24T15:12:30.4016546Z 118 │ useEffect(() => { 2026-10-24T15:12:30.4016676Z ·  ────┬──── 2026-10-24T15:12:30.4016838Z · ╰── This is the containing effect 2026-10-24T15:12:30.4016918Z 119 │ void refreshNotifications(); 2026-10-24T15:12:30.4017011Z ·  ──────────┬───────── 2026-10-24T15:12:30.4017187Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.4017330Z 120 │ const subscription = AppState.addEventListener("change", (state) => { 2026-10-24T15:12:30.4017382Z ╰──── 2026-10-24T15:12:30.4017988Z  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-24T15:12:30.4018319Z  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-24T15:12:30.4018324Z 2026-10-24T15:12:30.4018583Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T15:12:30.4018770Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7] 2026-10-24T15:12:30.4018824Z 125 │ 2026-10-24T15:12:30.4018890Z 126 │ useEffect(() => { 2026-10-24T15:12:30.4018961Z ·  ────┬──── 2026-10-24T15:12:30.4019089Z · ╰── This is the containing effect 2026-10-24T15:12:30.4019156Z 127 │ if (!isLoaded) { 2026-10-24T15:12:30.4019245Z 128 │ setLiveActivityStatus("checking"); 2026-10-24T15:12:30.4019341Z ·  ──────────┬────────── 2026-10-24T15:12:30.4019516Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.4019579Z 129 │ return; 2026-10-24T15:12:30.4019630Z ╰──── 2026-10-24T15:12:30.4020230Z  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-24T15:12:30.4020553Z  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-24T15:12:30.4020555Z 2026-10-24T15:12:30.4020704Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4020827Z ╭─[apps/mobile/src/native/StackHeader.tsx:185:9] 2026-10-24T15:12:30.4020892Z 184 │ "options", 2026-10-24T15:12:30.4020989Z 185 │ latestOptionFunctionsRef.current, 2026-10-24T15:12:30.4021098Z ·  ────────────────┬─────────────── 2026-10-24T15:12:30.4021293Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T15:12:30.4021390Z 186 │ optionFunctionWrappersRef.current, 2026-10-24T15:12:30.4021441Z ╰──── 2026-10-24T15:12:30.4021979Z  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-24T15:12:30.4022301Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4022303Z 2026-10-24T15:12:30.4022449Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4022566Z ╭─[apps/mobile/src/native/StackHeader.tsx:186:9] 2026-10-24T15:12:30.4022659Z 185 │ latestOptionFunctionsRef.current, 2026-10-24T15:12:30.4022752Z 186 │ optionFunctionWrappersRef.current, 2026-10-24T15:12:30.4022864Z ·  ────────────────┬──────────────── 2026-10-24T15:12:30.4023057Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T15:12:30.4023150Z 187 │ ) as NativeStackNavigationOptions) 2026-10-24T15:12:30.4023206Z ╰──── 2026-10-24T15:12:30.4023714Z  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-24T15:12:30.4024009Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4024011Z 2026-10-24T15:12:30.4024218Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T15:12:30.4024355Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:231:6] 2026-10-24T15:12:30.4024517Z 227 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-24T15:12:30.4024611Z 228 │ nativeEventSnapshotsRef.current, 2026-10-24T15:12:30.4024705Z ·  ───────────┬─────────── 2026-10-24T15:12:30.4025173Z · ╰── 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-24T15:12:30.4025246Z 229 │ mostRecentEventCount, 2026-10-24T15:12:30.4025302Z 230 │ ); 2026-10-24T15:12:30.4025427Z 231 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-24T15:12:30.4025564Z ·  ──────────────────────────┬────────────────────────── 2026-10-24T15:12:30.4025765Z · ╰── This dependency list is missing values used by the callback 2026-10-24T15:12:30.4025857Z 232 │ const assumedValue = props.value; 2026-10-24T15:12:30.4025912Z ╰──── 2026-10-24T15:12:30.4026082Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T15:12:30.4026395Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.4026399Z 2026-10-24T15:12:30.4026614Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T15:12:30.4026750Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:239:7] 2026-10-24T15:12:30.4026896Z 238 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-24T15:12:30.4026986Z 239 │ nativeEventSnapshotsRef.current, 2026-10-24T15:12:30.4027076Z ·  ───────────┬─────────── 2026-10-24T15:12:30.4027592Z · ╰── 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-24T15:12:30.4027693Z 240 │ controlledEventCount, 2026-10-24T15:12:30.4027760Z 241 │ assumedValue, 2026-10-24T15:12:30.4027815Z 242 │ ); 2026-10-24T15:12:30.4027972Z 243 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-24T15:12:30.4028112Z ·  ───────────┬────────── 2026-10-24T15:12:30.4028326Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-24T15:12:30.4028414Z 244 │ const acceptNativeEvent = useCallback( 2026-10-24T15:12:30.4028474Z ╰──── 2026-10-24T15:12:30.4028903Z  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-24T15:12:30.4029215Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.4029218Z 2026-10-24T15:12:30.4029364Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4029502Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29] 2026-10-24T15:12:30.4029626Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T15:12:30.4029740Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T15:12:30.4029863Z ·  ─────────────┬──────────── 2026-10-24T15:12:30.4030035Z · ╰── Cannot access ref value during render 2026-10-24T15:12:30.4030092Z 165 │ }); 2026-10-24T15:12:30.4030145Z ╰──── 2026-10-24T15:12:30.4030614Z  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-24T15:12:30.4030906Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4030911Z 2026-10-24T15:12:30.4031060Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4031200Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29] 2026-10-24T15:12:30.4031321Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T15:12:30.4031434Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T15:12:30.4031550Z ·  ─────────────┬──────────── 2026-10-24T15:12:30.4031758Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T15:12:30.4031815Z 165 │ }); 2026-10-24T15:12:30.4031867Z ╰──── 2026-10-24T15:12:30.4032390Z  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-24T15:12:30.4032721Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4032724Z 2026-10-24T15:12:30.4032869Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4033005Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:166:23] 2026-10-24T15:12:30.4033061Z 165 │ }); 2026-10-24T15:12:30.4033150Z 166 │ confirmedTokensRef.current = tokens; 2026-10-24T15:12:30.4033272Z ·  ─────────┬────────────┬─── 2026-10-24T15:12:30.4033463Z · │ ╰── Cannot update ref value during render 2026-10-24T15:12:30.4033614Z · ╰── This value is a ref 2026-10-24T15:12:30.4033688Z 167 │ return JSON.stringify( 2026-10-24T15:12:30.4033740Z ╰──── 2026-10-24T15:12:30.4034213Z  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-24T15:12:30.4034503Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4034505Z 2026-10-24T15:12:30.4034648Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4034783Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:208:5] 2026-10-24T15:12:30.4034855Z 207 │ mostRecentEventCount, 2026-10-24T15:12:30.4034947Z 208 │ nativeEventSnapshotsRef.current, 2026-10-24T15:12:30.4035056Z ·  ───────────────┬─────────────── 2026-10-24T15:12:30.4035245Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T15:12:30.4035300Z 209 │ ); 2026-10-24T15:12:30.4035352Z ╰──── 2026-10-24T15:12:30.4035819Z  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-24T15:12:30.4036108Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4036110Z 2026-10-24T15:12:30.4036307Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4036471Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:214:5] 2026-10-24T15:12:30.4036543Z 213 │ mostRecentEventCount, 2026-10-24T15:12:30.4036630Z 214 │ nativeEventSnapshotsRef.current, 2026-10-24T15:12:30.4036734Z ·  ───────────────┬─────────────── 2026-10-24T15:12:30.4036924Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T15:12:30.4036979Z 215 │ ); 2026-10-24T15:12:30.4037029Z ╰──── 2026-10-24T15:12:30.4037501Z  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-24T15:12:30.4037797Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4037803Z 2026-10-24T15:12:30.4037991Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T15:12:30.4038126Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:199:6] 2026-10-24T15:12:30.4038246Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T15:12:30.4038358Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T15:12:30.4038469Z ·  ─────────┬──────── 2026-10-24T15:12:30.4038951Z · ╰── 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-24T15:12:30.4039009Z 165 │ }); 2026-10-24T15:12:30.4039101Z 166 │ confirmedTokensRef.current = tokens; 2026-10-24T15:12:30.4039171Z 167 │ return JSON.stringify( 2026-10-24T15:12:30.4039336Z 168 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-24T15:12:30.4039402Z 169 │ const record = 2026-10-24T15:12:30.4039485Z 170 │ token.type === "context" 2026-10-24T15:12:30.4039653Z 171 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-24T15:12:30.4039719Z 172 │ : undefined; 2026-10-24T15:12:30.4039827Z 173 │ const presentation = contextChipPresentation( 2026-10-24T15:12:30.4039937Z 174 │ token.type === "context" ? token.kind : token.type, 2026-10-24T15:12:30.4040007Z 175 │ record, 2026-10-24T15:12:30.4040070Z 176 │ ); 2026-10-24T15:12:30.4040153Z 177 │ const icon = contextChipIcon( 2026-10-24T15:12:30.4040220Z 178 │ presentation, 2026-10-24T15:12:30.4040364Z 179 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-24T15:12:30.4040422Z 180 │ ); 2026-10-24T15:12:30.4040483Z 181 │ return { 2026-10-24T15:12:30.4040554Z 182 │ type: token.type, 2026-10-24T15:12:30.4040630Z 183 │ source: token.source, 2026-10-24T15:12:30.4040702Z 184 │ start: token.start, 2026-10-24T15:12:30.4040768Z 185 │ end: token.end, 2026-10-24T15:12:30.4040917Z 186 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-24T15:12:30.4040979Z 187 │ label: 2026-10-24T15:12:30.4041057Z 188 │ token.type === "skill" 2026-10-24T15:12:30.4041217Z 189 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-24T15:12:30.4041333Z 190 │ : token.type === "context" 2026-10-24T15:12:30.4041571Z 191 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-24T15:12:30.4041654Z 192 │ : basename(token.value), 2026-10-24T15:12:30.4041798Z 193 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-24T15:12:30.4041893Z 194 │ iconUri: contextChipIconUri(icon), 2026-10-24T15:12:30.4041983Z 195 │ tintsIcon: icon.kind === "chip", 2026-10-24T15:12:30.4042041Z 196 │ }; 2026-10-24T15:12:30.4042097Z 197 │ }), 2026-10-24T15:12:30.4042152Z 198 │ ); 2026-10-24T15:12:30.4042285Z 199 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-24T15:12:30.4042446Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-24T15:12:30.4042657Z · ╰── This dependency list is missing values used by the callback 2026-10-24T15:12:30.4042799Z 200 │ // Every render resolves against the snapshot history, so a render whose 2026-10-24T15:12:30.4042851Z ╰──── 2026-10-24T15:12:30.4043062Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T15:12:30.4043375Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.4043378Z 2026-10-24T15:12:30.4043601Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T15:12:30.4043745Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:261:5] 2026-10-24T15:12:30.4043880Z 253 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-24T15:12:30.4043981Z 254 │ nativeEventSnapshotsRef.current.push({ 2026-10-24T15:12:30.4044074Z ·  ───────────┬─────────── 2026-10-24T15:12:30.4044540Z · ╰── 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-24T15:12:30.4044631Z 255 │ eventCount: acknowledgedEventCount, 2026-10-24T15:12:30.4044694Z 256 │ value, 2026-10-24T15:12:30.4044771Z 257 │ selection: nextSelection, 2026-10-24T15:12:30.4044829Z 258 │ }); 2026-10-24T15:12:30.4044919Z 259 │ return acknowledgedEventCount; 2026-10-24T15:12:30.4044976Z 260 │ }, 2026-10-24T15:12:30.4045029Z 261 │ [], 2026-10-24T15:12:30.4045098Z ·  ─┬ 2026-10-24T15:12:30.4045282Z · ╰── This dependency list is missing values used by the callback 2026-10-24T15:12:30.4045335Z 262 │ ); 2026-10-24T15:12:30.4045389Z ╰──── 2026-10-24T15:12:30.4045595Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T15:12:30.4045908Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.4045911Z 2026-10-24T15:12:30.4046098Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T15:12:30.4046324Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:555:70] 2026-10-24T15:12:30.4046434Z 554 │ assert.deepStrictEqual( 2026-10-24T15:12:30.4046600Z 555 │ (yield* Ref.get(fixture.syncCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-24T15:12:30.4046724Z ·  ┬ 2026-10-24T15:12:30.4046890Z · ╰── '_' is declared here 2026-10-24T15:12:30.4046951Z 556 │ [ 2026-10-24T15:12:30.4047002Z ╰──── 2026-10-24T15:12:30.4047106Z  help: Consider removing this parameter. 2026-10-24T15:12:30.4047108Z 2026-10-24T15:12:30.4047290Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T15:12:30.4047474Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:1155:70] 2026-10-24T15:12:30.4047560Z 1154 │ assert.deepStrictEqual( 2026-10-24T15:12:30.4047725Z 1155 │ (yield* Ref.get(fixture.linkCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-24T15:12:30.4047846Z ·  ┬ 2026-10-24T15:12:30.4048014Z · ╰── '_' is declared here 2026-10-24T15:12:30.4048076Z 1156 │ [ 2026-10-24T15:12:30.4048129Z ╰──── 2026-10-24T15:12:30.4048230Z  help: Consider removing this parameter. 2026-10-24T15:12:30.4048234Z 2026-10-24T15:12:30.4048400Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T15:12:30.4048555Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:372:47] 2026-10-24T15:12:30.4048690Z 371 │ const { open, onOpenChange, onSnooze, timestampFormat } = props; 2026-10-24T15:12:30.4048845Z 372 │ const presets = open ? resolveSnoozePresets(new Date(), timestampFormat) : []; 2026-10-24T15:12:30.4048960Z ·  ─────┬──── 2026-10-24T15:12:30.4049123Z · ╰── Cannot call impure function 2026-10-24T15:12:30.4049183Z 373 │ return ( 2026-10-24T15:12:30.4049235Z ╰──── 2026-10-24T15:12:30.4049516Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T15:12:30.4049819Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T15:12:30.4049824Z 2026-10-24T15:12:30.4050053Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T15:12:30.4050201Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:853:39] 2026-10-24T15:12:30.4050293Z 852 │ if (snoozeGateClock.thread !== thread) { 2026-10-24T15:12:30.4050422Z 853 │ setSnoozeGateClock({ thread, now: new Date().toISOString() }); 2026-10-24T15:12:30.4050533Z ·  ─────┬──── 2026-10-24T15:12:30.4050689Z · ╰── Cannot call impure function 2026-10-24T15:12:30.4050744Z 854 │ } 2026-10-24T15:12:30.4050794Z ╰──── 2026-10-24T15:12:30.4051144Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T15:12:30.4051480Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T15:12:30.4051483Z 2026-10-24T15:12:30.4051650Z ⚠ eslint(no-control-regex): Unexpected control character 2026-10-24T15:12:30.4051843Z ╭─[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46] 2026-10-24T15:12:30.4051982Z 219 │ 2026-10-24T15:12:30.4052123Z 220 │ {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")} 2026-10-24T15:12:30.4052232Z ·  ──┬─ 2026-10-24T15:12:30.4052404Z · ╰── 'U+001B' is a control character. 2026-10-24T15:12:30.4052473Z 221 │ 2026-10-24T15:12:30.4052525Z ╰──── 2026-10-24T15:12:30.4052757Z  help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression. 2026-10-24T15:12:30.4052759Z 2026-10-24T15:12:30.4052953Z ⚠ eslint(no-unused-vars): Identifier 'Image' is imported but never used. 2026-10-24T15:12:30.4053096Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:17:10] 2026-10-24T15:12:30.4053236Z 16 │ import type { NativeSyntheticEvent, ViewProps } from "react-native"; 2026-10-24T15:12:30.4053352Z 17 │ import { Image, Platform, StyleSheet } from "react-native"; 2026-10-24T15:12:30.4053425Z ·  ──┬── 2026-10-24T15:12:30.4053586Z · ╰── 'Image' is imported here 2026-10-24T15:12:30.4053644Z 18 │ 2026-10-24T15:12:30.4053695Z ╰──── 2026-10-24T15:12:30.4053794Z  help: Consider removing this import. 2026-10-24T15:12:30.4053797Z 2026-10-24T15:12:30.4054001Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T15:12:30.4054142Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:229:6] 2026-10-24T15:12:30.4054303Z 225 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-24T15:12:30.4054394Z 226 │ nativeEventSnapshotsRef.current, 2026-10-24T15:12:30.4054485Z ·  ───────────┬─────────── 2026-10-24T15:12:30.4054957Z · ╰── 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-24T15:12:30.4055033Z 227 │ mostRecentEventCount, 2026-10-24T15:12:30.4055088Z 228 │ ); 2026-10-24T15:12:30.4055211Z 229 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-24T15:12:30.4055350Z ·  ──────────────────────────┬────────────────────────── 2026-10-24T15:12:30.4055550Z · ╰── This dependency list is missing values used by the callback 2026-10-24T15:12:30.4055634Z 230 │ const assumedValue = props.value; 2026-10-24T15:12:30.4055684Z ╰──── 2026-10-24T15:12:30.4055852Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T15:12:30.4056217Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.4056251Z 2026-10-24T15:12:30.4056468Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T15:12:30.4056610Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:237:7] 2026-10-24T15:12:30.4056753Z 236 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-24T15:12:30.4056843Z 237 │ nativeEventSnapshotsRef.current, 2026-10-24T15:12:30.4056935Z ·  ───────────┬─────────── 2026-10-24T15:12:30.4057395Z · ╰── 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-24T15:12:30.4057471Z 238 │ controlledEventCount, 2026-10-24T15:12:30.4057543Z 239 │ assumedValue, 2026-10-24T15:12:30.4057600Z 240 │ ); 2026-10-24T15:12:30.4057758Z 241 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-24T15:12:30.4057895Z ·  ───────────┬────────── 2026-10-24T15:12:30.4058110Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-24T15:12:30.4058201Z 242 │ const acceptNativeEvent = useCallback( 2026-10-24T15:12:30.4058252Z ╰──── 2026-10-24T15:12:30.4058680Z  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-24T15:12:30.4058997Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.4059000Z 2026-10-24T15:12:30.4059146Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4059292Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29] 2026-10-24T15:12:30.4059414Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T15:12:30.4059526Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T15:12:30.4059646Z ·  ─────────────┬──────────── 2026-10-24T15:12:30.4059816Z · ╰── Cannot access ref value during render 2026-10-24T15:12:30.4059931Z 163 │ }); 2026-10-24T15:12:30.4060016Z ╰──── 2026-10-24T15:12:30.4060484Z  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-24T15:12:30.4060778Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4060780Z 2026-10-24T15:12:30.4060927Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4061072Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29] 2026-10-24T15:12:30.4061191Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T15:12:30.4061307Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T15:12:30.4061428Z ·  ─────────────┬──────────── 2026-10-24T15:12:30.4061636Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T15:12:30.4061692Z 163 │ }); 2026-10-24T15:12:30.4061744Z ╰──── 2026-10-24T15:12:30.4062214Z  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-24T15:12:30.4062505Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4062508Z 2026-10-24T15:12:30.4062657Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4062802Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:164:23] 2026-10-24T15:12:30.4062859Z 163 │ }); 2026-10-24T15:12:30.4062949Z 164 │ confirmedTokensRef.current = tokens; 2026-10-24T15:12:30.4063072Z ·  ─────────┬────────────┬─── 2026-10-24T15:12:30.4063261Z · │ ╰── Cannot update ref value during render 2026-10-24T15:12:30.4063379Z · ╰── This value is a ref 2026-10-24T15:12:30.4063451Z 165 │ return JSON.stringify( 2026-10-24T15:12:30.4063503Z ╰──── 2026-10-24T15:12:30.4064006Z  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-24T15:12:30.4064304Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4064306Z 2026-10-24T15:12:30.4064451Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4064594Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:206:5] 2026-10-24T15:12:30.4064667Z 205 │ mostRecentEventCount, 2026-10-24T15:12:30.4064755Z 206 │ nativeEventSnapshotsRef.current, 2026-10-24T15:12:30.4064860Z ·  ───────────────┬─────────────── 2026-10-24T15:12:30.4065106Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T15:12:30.4065193Z 207 │ ); 2026-10-24T15:12:30.4065244Z ╰──── 2026-10-24T15:12:30.4065708Z  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-24T15:12:30.4065998Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4066001Z 2026-10-24T15:12:30.4066144Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4066286Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:212:5] 2026-10-24T15:12:30.4066358Z 211 │ mostRecentEventCount, 2026-10-24T15:12:30.4066450Z 212 │ nativeEventSnapshotsRef.current, 2026-10-24T15:12:30.4066556Z ·  ───────────────┬─────────────── 2026-10-24T15:12:30.4066744Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T15:12:30.4066799Z 213 │ ); 2026-10-24T15:12:30.4066850Z ╰──── 2026-10-24T15:12:30.4067318Z  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-24T15:12:30.4067608Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4067610Z 2026-10-24T15:12:30.4067803Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T15:12:30.4067948Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:197:6] 2026-10-24T15:12:30.4068070Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T15:12:30.4068182Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T15:12:30.4068291Z ·  ─────────┬──────── 2026-10-24T15:12:30.4068762Z · ╰── 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-24T15:12:30.4068820Z 163 │ }); 2026-10-24T15:12:30.4068910Z 164 │ confirmedTokensRef.current = tokens; 2026-10-24T15:12:30.4068985Z 165 │ return JSON.stringify( 2026-10-24T15:12:30.4069154Z 166 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-24T15:12:30.4069222Z 167 │ const record = 2026-10-24T15:12:30.4069301Z 168 │ token.type === "context" 2026-10-24T15:12:30.4069466Z 169 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-24T15:12:30.4069533Z 170 │ : undefined; 2026-10-24T15:12:30.4069642Z 171 │ const presentation = contextChipPresentation( 2026-10-24T15:12:30.4069751Z 172 │ token.type === "context" ? token.kind : token.type, 2026-10-24T15:12:30.4069813Z 173 │ record, 2026-10-24T15:12:30.4069871Z 174 │ ); 2026-10-24T15:12:30.4069955Z 175 │ const icon = contextChipIcon( 2026-10-24T15:12:30.4070022Z 176 │ presentation, 2026-10-24T15:12:30.4070229Z 177 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-24T15:12:30.4070326Z 178 │ ); 2026-10-24T15:12:30.4070388Z 179 │ return { 2026-10-24T15:12:30.4070459Z 180 │ type: token.type, 2026-10-24T15:12:30.4070533Z 181 │ source: token.source, 2026-10-24T15:12:30.4070608Z 182 │ start: token.start, 2026-10-24T15:12:30.4070679Z 183 │ end: token.end, 2026-10-24T15:12:30.4070832Z 184 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-24T15:12:30.4070894Z 185 │ label: 2026-10-24T15:12:30.4070977Z 186 │ token.type === "skill" 2026-10-24T15:12:30.4071088Z 187 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-24T15:12:30.4071176Z 188 │ : token.type === "context" 2026-10-24T15:12:30.4071421Z 189 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-24T15:12:30.4071512Z 190 │ : basename(token.value), 2026-10-24T15:12:30.4071660Z 191 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-24T15:12:30.4071761Z 192 │ iconUri: contextChipIconUri(icon), 2026-10-24T15:12:30.4071850Z 193 │ tintsIcon: icon.kind === "chip", 2026-10-24T15:12:30.4071912Z 194 │ }; 2026-10-24T15:12:30.4071973Z 195 │ }), 2026-10-24T15:12:30.4072032Z 196 │ ); 2026-10-24T15:12:30.4072166Z 197 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-24T15:12:30.4072326Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-24T15:12:30.4072547Z · ╰── This dependency list is missing values used by the callback 2026-10-24T15:12:30.4072694Z 198 │ // Every render resolves against the snapshot history, so a render whose 2026-10-24T15:12:30.4072749Z ╰──── 2026-10-24T15:12:30.4072960Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T15:12:30.4073281Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.4073284Z 2026-10-24T15:12:30.4073477Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T15:12:30.4073647Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:259:5] 2026-10-24T15:12:30.4073778Z 251 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-24T15:12:30.4073887Z 252 │ nativeEventSnapshotsRef.current.push({ 2026-10-24T15:12:30.4073987Z ·  ───────────┬─────────── 2026-10-24T15:12:30.4074456Z · ╰── 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-24T15:12:30.4074548Z 253 │ eventCount: acknowledgedEventCount, 2026-10-24T15:12:30.4074618Z 254 │ value, 2026-10-24T15:12:30.4074701Z 255 │ selection: nextSelection, 2026-10-24T15:12:30.4074763Z 256 │ }); 2026-10-24T15:12:30.4074848Z 257 │ return acknowledgedEventCount; 2026-10-24T15:12:30.4074907Z 258 │ }, 2026-10-24T15:12:30.4074967Z 259 │ [], 2026-10-24T15:12:30.4075036Z ·  ─┬ 2026-10-24T15:12:30.4075283Z · ╰── This dependency list is missing values used by the callback 2026-10-24T15:12:30.4075373Z 260 │ ); 2026-10-24T15:12:30.4075430Z ╰──── 2026-10-24T15:12:30.4075637Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T15:12:30.4075956Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.4075959Z 2026-10-24T15:12:30.4076162Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T15:12:30.4076360Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:100:85] 2026-10-24T15:12:30.4076499Z  99 │ const startEditor = startScheduledTaskEditor; 2026-10-24T15:12:30.4076703Z 100 │ const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]); 2026-10-24T15:12:30.4076943Z ·  ─────┬───── 2026-10-24T15:12:30.4077238Z · ╰── Unnecessary dependency `startEditor` 2026-10-24T15:12:30.4077358Z 101 │ const readEditor = useCallback( 2026-10-24T15:12:30.4077425Z ╰──── 2026-10-24T15:12:30.4077777Z  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-24T15:12:30.4078129Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.4078132Z 2026-10-24T15:12:30.4078374Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T15:12:30.4078574Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:121:7] 2026-10-24T15:12:30.4078652Z 120 │ setEditor, 2026-10-24T15:12:30.4078741Z 121 │ startEditor, 2026-10-24T15:12:30.4078877Z ·  ─────┬───── 2026-10-24T15:12:30.4079061Z · ╰── Unnecessary dependency `startEditor` 2026-10-24T15:12:30.4079143Z 122 │ hasChanges, 2026-10-24T15:12:30.4079230Z ╰──── 2026-10-24T15:12:30.4079583Z  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-24T15:12:30.4079998Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.4080034Z 2026-10-24T15:12:30.4080360Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T15:12:30.4080534Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:68:5] 2026-10-24T15:12:30.4080671Z 66 │ const { id: attachmentId, fileUri } = attachment; 2026-10-24T15:12:30.4080791Z 67 │ useEffect(() => { 2026-10-24T15:12:30.4080878Z ·  ────┬──── 2026-10-24T15:12:30.4081046Z · ╰── This is the containing effect 2026-10-24T15:12:30.4081146Z 68 │ setUri(null); 2026-10-24T15:12:30.4081263Z ·  ───┬── 2026-10-24T15:12:30.4081462Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.4081565Z 69 │ setError(null); 2026-10-24T15:12:30.4081652Z ╰──── 2026-10-24T15:12:30.4082294Z  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-24T15:12:30.4082672Z  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-24T15:12:30.4082675Z 2026-10-24T15:12:30.4082892Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T15:12:30.4083070Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:91:7] 2026-10-24T15:12:30.4083167Z 90 │ }; 2026-10-24T15:12:30.4083282Z 91 │ }, [attachmentId, fileUri]); 2026-10-24T15:12:30.4083488Z ·  ──────┬───── ───┬─── 2026-10-24T15:12:30.4083716Z · │ ╰── Unnecessary dependency `fileUri` 2026-10-24T15:12:30.4083903Z · ╰── Unnecessary dependency `attachmentId` 2026-10-24T15:12:30.4084065Z 92 │ const mimeType = videoMimeType(attachment) ?? attachment.mimeType; 2026-10-24T15:12:30.4084170Z ╰──── 2026-10-24T15:12:30.4084484Z  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-24T15:12:30.4084842Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.4084848Z 2026-10-24T15:12:30.4085097Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T15:12:30.4085272Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:213:34] 2026-10-24T15:12:30.4085382Z 212 │ useEffect(() => { 2026-10-24T15:12:30.4085511Z 213 │ if (!isFocused && hasSource) props.onRequestClose(); 2026-10-24T15:12:30.4085650Z ·  ──┬── 2026-10-24T15:12:30.4085825Z · ╰── Missing dependency `props` 2026-10-24T15:12:30.4085986Z 214 │ }, [isFocused, hasSource, props.onRequestClose]); 2026-10-24T15:12:30.4086114Z ·  ──────────┬───────── 2026-10-24T15:12:30.4086445Z · ╰── Overly precise dependency `props.onRequestClose`, use `props` instead 2026-10-24T15:12:30.4086583Z 215 │ const { source } = props; 2026-10-24T15:12:30.4086736Z ╰──── 2026-10-24T15:12:30.4087196Z  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-24T15:12:30.4087542Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.4087545Z 2026-10-24T15:12:30.4087781Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T15:12:30.4087942Z ╭─[apps/mobile/src/components/ComposerEditor.tsx:82:6] 2026-10-24T15:12:30.4088058Z 81 │ }, 2026-10-24T15:12:30.4088137Z 82 │ [draftKey], 2026-10-24T15:12:30.4088246Z ·  ────┬─── 2026-10-24T15:12:30.4088420Z · ╰── Unnecessary dependency `draftKey` 2026-10-24T15:12:30.4088524Z 83 │ ); 2026-10-24T15:12:30.4088600Z ╰──── 2026-10-24T15:12:30.4088928Z  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-24T15:12:30.4089273Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.4089275Z 2026-10-24T15:12:30.4089488Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T15:12:30.4089737Z ╭─[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:116:34] 2026-10-24T15:12:30.4089821Z 115 │ return [...commands]; 2026-10-24T15:12:30.4090073Z 116 │ }, [activeThreadRef, pathname, registrationVersion, navigation]); 2026-10-24T15:12:30.4090223Z ·  ─────────┬───────── 2026-10-24T15:12:30.4090506Z · ╰── Unnecessary dependency `registrationVersion` 2026-10-24T15:12:30.4090583Z 117 │ 2026-10-24T15:12:30.4090668Z ╰──── 2026-10-24T15:12:30.4091018Z  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-24T15:12:30.4091366Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.4091372Z 2026-10-24T15:12:30.4091599Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T15:12:30.4091771Z ╭─[apps/web/src/components/CommandPaletteThreadItems.tsx:152:58] 2026-10-24T15:12:30.4091987Z 151 │ if (threadSearchQuery.trim().length > 0 && !threadSearchQuery.startsWith(">") && !isOpen) { 2026-10-24T15:12:30.4092160Z 152 │ claimThreadOpen(thread.environmentId, thread.id, Date.now()); 2026-10-24T15:12:30.4092326Z ·  ─────┬──── 2026-10-24T15:12:30.4092524Z · ╰── Cannot call impure function 2026-10-24T15:12:30.4092695Z 153 │ } 2026-10-24T15:12:30.4092833Z ╰──── 2026-10-24T15:12:30.4093145Z  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-24T15:12:30.4093468Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T15:12:30.4093496Z 2026-10-24T15:12:30.4093814Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T15:12:30.4093985Z ╭─[apps/mobile/src/components/ProjectFavicon.tsx:172:5] 2026-10-24T15:12:30.4094263Z 167 │ const [activeFaviconRequest, setActiveFaviconRequest] = useState(null); 2026-10-24T15:12:30.4094372Z 168 │ useLayoutEffect(() => { 2026-10-24T15:12:30.4094481Z ·  ───────┬─────── 2026-10-24T15:12:30.4094658Z · ╰── This is the containing effect 2026-10-24T15:12:30.4094781Z 169 │ if (faviconRequest === null) return; 2026-10-24T15:12:30.4094861Z 170 │ 2026-10-24T15:12:30.4095029Z 171 │ const endRequest = beginProjectFaviconRequest(faviconRequest); 2026-10-24T15:12:30.4095175Z 172 │ setActiveFaviconRequest(faviconRequest); 2026-10-24T15:12:30.4095300Z ·  ───────────┬─────────── 2026-10-24T15:12:30.4095509Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.4095596Z 173 │ return endRequest; 2026-10-24T15:12:30.4095707Z ╰──── 2026-10-24T15:12:30.4096352Z  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-24T15:12:30.4096713Z  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-24T15:12:30.4096717Z 2026-10-24T15:12:30.4096950Z ⚠ eslint(no-unused-vars): Identifier 'HostProcess' is imported but never used. 2026-10-24T15:12:30.4097146Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:25:13] 2026-10-24T15:12:30.4097283Z 24 │ import * as Schema from "effect/Schema"; 2026-10-24T15:12:30.4097514Z 25 │ import * as HostProcess from "@t3tools/shared/HostProcess"; 2026-10-24T15:12:30.4097636Z ·  ─────┬───── 2026-10-24T15:12:30.4097789Z · ╰── 'HostProcess' is imported here 2026-10-24T15:12:30.4097903Z 26 │ 2026-10-24T15:12:30.4097989Z ╰──── 2026-10-24T15:12:30.4098121Z  help: Consider removing this import. 2026-10-24T15:12:30.4098124Z 2026-10-24T15:12:30.4098415Z ⚠ eslint(no-unused-vars): Variable 'serverConfig' is declared but never used. Unused variables should start with a '_'. 2026-10-24T15:12:30.4098623Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:124:11] 2026-10-24T15:12:30.4098751Z 123 │ const path = yield* Path.Path; 2026-10-24T15:12:30.4098905Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-24T15:12:30.4099022Z ·  ──────┬───── 2026-10-24T15:12:30.4099236Z · ╰── 'serverConfig' is declared here 2026-10-24T15:12:30.4099464Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-24T15:12:30.4099549Z ╰──── 2026-10-24T15:12:30.4099693Z  help: Consider removing this declaration. 2026-10-24T15:12:30.4099696Z 2026-10-24T15:12:30.4099988Z ⚠ eslint(no-unused-vars): Variable 'serverSettings' is declared but never used. Unused variables should start with a '_'. 2026-10-24T15:12:30.4100192Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:125:11] 2026-10-24T15:12:30.4100418Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-24T15:12:30.4100596Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-24T15:12:30.4100698Z ·  ───────┬────── 2026-10-24T15:12:30.4100877Z · ╰── 'serverSettings' is declared here 2026-10-24T15:12:30.4101071Z 126 │ const gitWorkflow = yield* GitWorkflowService.GitWorkflowService; 2026-10-24T15:12:30.4101157Z ╰──── 2026-10-24T15:12:30.4101300Z  help: Consider removing this declaration. 2026-10-24T15:12:30.4101303Z 2026-10-24T15:12:30.4101611Z ⚠ eslint(no-unused-vars): Variable 'revokeActiveMcpThread' is declared but never used. Unused variables should start with a '_'. 2026-10-24T15:12:30.4101793Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:218:7] 2026-10-24T15:12:30.4101891Z 217 │ 2026-10-24T15:12:30.4102078Z 218 │ const revokeActiveMcpThread = (threadId: ThreadId): Effect.Effect => 2026-10-24T15:12:30.4102185Z ·  ──────────┬────────── 2026-10-24T15:12:30.4102374Z · ╰── 'revokeActiveMcpThread' is declared here 2026-10-24T15:12:30.4102619Z 219 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeThread(threadId) : Effect.void; 2026-10-24T15:12:30.4102708Z ╰──── 2026-10-24T15:12:30.4102828Z  help: Consider removing this declaration. 2026-10-24T15:12:30.4102831Z 2026-10-24T15:12:30.4103178Z ⚠ eslint(no-unused-vars): Variable 'revokeAllActiveMcpCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-24T15:12:30.4103341Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:221:7] 2026-10-24T15:12:30.4103514Z 220 │ 2026-10-24T15:12:30.4103710Z 221 │ const revokeAllActiveMcpCredentials = (): Effect.Effect => 2026-10-24T15:12:30.4103830Z ·  ──────────────┬────────────── 2026-10-24T15:12:30.4104044Z · ╰── 'revokeAllActiveMcpCredentials' is declared here 2026-10-24T15:12:30.4104274Z 222 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void; 2026-10-24T15:12:30.4104364Z ╰──── 2026-10-24T15:12:30.4104482Z  help: Consider removing this declaration. 2026-10-24T15:12:30.4104485Z 2026-10-24T15:12:30.4104788Z ⚠ eslint(no-unused-vars): Variable 'layerDaemon' is declared but never used. Unused variables should start with a '_'. 2026-10-24T15:12:30.4104967Z ╭─[apps/server/src/orchestration-v2/EffectWorker.ts:914:7] 2026-10-24T15:12:30.4105066Z 913 │ 2026-10-24T15:12:30.4105270Z 914 │ const layerDaemon: Layer.Layer = Layer.effectDiscard( 2026-10-24T15:12:30.4105384Z ·  ─────┬───── 2026-10-24T15:12:30.4105604Z · ╰── 'layerDaemon' is declared here 2026-10-24T15:12:30.4105785Z 915 │ runDaemon.pipe(Effect.forkScoped), 2026-10-24T15:12:30.4105852Z ╰──── 2026-10-24T15:12:30.4105994Z  help: Consider removing this declaration. 2026-10-24T15:12:30.4105996Z 2026-10-24T15:12:30.4106191Z ⚠ eslint(no-new): Do not use 'new' for side effects. 2026-10-24T15:12:30.4106434Z ╭─[apps/server/src/mcp/McpToolAccess.test.ts:168:3] 2026-10-24T15:12:30.4106594Z 167 │ // @ts-expect-error a declaration constructed directly 2026-10-24T15:12:30.4106706Z 168 │ new McpToolAccess.Declaration(unchecked); 2026-10-24T15:12:30.4106837Z ·  ───────────────────────────── 2026-10-24T15:12:30.4106994Z 169 │ // @ts-expect-error a handlers layer built outside McpToolAccess 2026-10-24T15:12:30.4107100Z ╰──── 2026-10-24T15:12:30.4107283Z  help: Assign the result of 'new' to a variable or compare it to a reference. 2026-10-24T15:12:30.4107289Z 2026-10-24T15:12:30.4107509Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T15:12:30.4107684Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:121:27] 2026-10-24T15:12:30.4107884Z 120 │ const scope = makeScope(options.capabilities ?? new Set(["preview", "worktree"])); 2026-10-24T15:12:30.4107998Z 121 │ const dispatch = vi.fn((_: unknown) => 2026-10-24T15:12:30.4108115Z ·  ┬ 2026-10-24T15:12:30.4108284Z · ╰── '_' is declared here 2026-10-24T15:12:30.4108411Z 122 │ (options.dispatchGate ?? Effect.void).pipe( 2026-10-24T15:12:30.4108491Z ╰──── 2026-10-24T15:12:30.4108637Z  help: Consider removing this parameter. 2026-10-24T15:12:30.4108646Z 2026-10-24T15:12:30.4108871Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T15:12:30.4109131Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:134:39] 2026-10-24T15:12:30.4109229Z 133 │ ); 2026-10-24T15:12:30.4109359Z 134 │ const listLocalBranchNames = vi.fn((_: string) => 2026-10-24T15:12:30.4109492Z ·  ┬ 2026-10-24T15:12:30.4109670Z · ╰── '_' is declared here 2026-10-24T15:12:30.4109765Z 135 │ Effect.succeed( 2026-10-24T15:12:30.4109843Z ╰──── 2026-10-24T15:12:30.4109984Z  help: Consider removing this parameter. 2026-10-24T15:12:30.4109987Z 2026-10-24T15:12:30.4110264Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T15:12:30.4110466Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:178:31] 2026-10-24T15:12:30.4110531Z 177 │ }); 2026-10-24T15:12:30.4110689Z 178 │ const sendToThread = vi.fn((_: unknown) => { 2026-10-24T15:12:30.4110812Z ·  ┬ 2026-10-24T15:12:30.4110980Z · ╰── '_' is declared here 2026-10-24T15:12:30.4111097Z 179 │ switch (options.continuation ?? "queued") { 2026-10-24T15:12:30.4111185Z ╰──── 2026-10-24T15:12:30.4111332Z  help: Consider removing this parameter. 2026-10-24T15:12:30.4111334Z 2026-10-24T15:12:30.4111631Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T15:12:30.4111781Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:203:33] 2026-10-24T15:12:30.4111868Z 202 │ ); 2026-10-24T15:12:30.4112030Z 203 │ const removeWorktree = vi.fn((_: unknown) => 2026-10-24T15:12:30.4112156Z ·  ┬ 2026-10-24T15:12:30.4112309Z · ╰── '_' is declared here 2026-10-24T15:12:30.4112425Z 204 │ options.removeWorktreeFails 2026-10-24T15:12:30.4112514Z ╰──── 2026-10-24T15:12:30.4112657Z  help: Consider removing this parameter. 2026-10-24T15:12:30.4112660Z 2026-10-24T15:12:30.4112857Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T15:12:30.4113023Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:208:36] 2026-10-24T15:12:30.4113110Z 207 │ ); 2026-10-24T15:12:30.4113263Z 208 │ const deleteLocalBranch = vi.fn((_: unknown) => 2026-10-24T15:12:30.4113397Z ·  ┬ 2026-10-24T15:12:30.4113584Z · ╰── '_' is declared here 2026-10-24T15:12:30.4113709Z 209 │ options.deleteLocalBranchFails 2026-10-24T15:12:30.4113798Z ╰──── 2026-10-24T15:12:30.4113941Z  help: Consider removing this parameter. 2026-10-24T15:12:30.4113944Z 2026-10-24T15:12:30.4114222Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T15:12:30.4114392Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:213:42] 2026-10-24T15:12:30.4114478Z 212 │ ); 2026-10-24T15:12:30.4114649Z 213 │ const fetchWorktreeBaseCommit = vi.fn((_: unknown) => 2026-10-24T15:12:30.4114764Z ·  ┬ 2026-10-24T15:12:30.4114950Z · ╰── '_' is declared here 2026-10-24T15:12:30.4115077Z 214 │ options.fetchWorktreeBaseFails 2026-10-24T15:12:30.4115166Z ╰──── 2026-10-24T15:12:30.4115287Z  help: Consider removing this parameter. 2026-10-24T15:12:30.4115290Z 2026-10-24T15:12:30.4115505Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T15:12:30.4115679Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:254:30] 2026-10-24T15:12:30.4115759Z 253 │ ); 2026-10-24T15:12:30.4115880Z 254 │ const localStatus = vi.fn((_: unknown) => 2026-10-24T15:12:30.4116013Z ·  ┬ 2026-10-24T15:12:30.4116187Z · ╰── '_' is declared here 2026-10-24T15:12:30.4116349Z 255 │ Effect.succeed({ 2026-10-24T15:12:30.4116441Z ╰──── 2026-10-24T15:12:30.4116669Z  help: Consider removing this parameter. 2026-10-24T15:12:30.4116672Z 2026-10-24T15:12:30.4116892Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T15:12:30.4117058Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:264:32] 2026-10-24T15:12:30.4117139Z 263 │ ); 2026-10-24T15:12:30.4117319Z 264 │ const refreshStatus = vi.fn((_: string) => Effect.die("refreshStatus stub")); 2026-10-24T15:12:30.4117459Z ·  ┬ 2026-10-24T15:12:30.4117628Z · ╰── '_' is declared here 2026-10-24T15:12:30.4117810Z 265 │ const runForThread = vi.fn((input: { readonly worktreePath: string }) => { 2026-10-24T15:12:30.4117870Z ╰──── 2026-10-24T15:12:30.4118035Z  help: Consider removing this parameter. 2026-10-24T15:12:30.4118041Z 2026-10-24T15:12:30.4118336Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T15:12:30.4118504Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:60:5] 2026-10-24T15:12:30.4118575Z 57 │ 2026-10-24T15:12:30.4118682Z 58 │ useEffect(() => { 2026-10-24T15:12:30.4118800Z ·  ────┬──── 2026-10-24T15:12:30.4118964Z · ╰── This is the containing effect 2026-10-24T15:12:30.4119075Z 59 │ const controller = new AbortController(); 2026-10-24T15:12:30.4123363Z 60 │ setLoadState("pending"); 2026-10-24T15:12:30.4123461Z ·  ──────┬───── 2026-10-24T15:12:30.4123684Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.4123857Z 61 │ // A renewed signature is used on Retry, not as a reason to reset the native player. 2026-10-24T15:12:30.4123910Z ╰──── 2026-10-24T15:12:30.4124522Z  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-24T15:12:30.4124856Z  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-24T15:12:30.4124859Z 2026-10-24T15:12:30.4125066Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T15:12:30.4125207Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:71:7] 2026-10-24T15:12:30.4125293Z 70 │ return () => controller.abort(); 2026-10-24T15:12:30.4125390Z 71 │ }, [player, props.playRequested, attempt]); 2026-10-24T15:12:30.4125568Z ·  ───┬── ─────────┬───────── ───┬─── 2026-10-24T15:12:30.4125800Z · │ │ ╰── Unnecessary dependency `attempt` 2026-10-24T15:12:30.4126004Z · │ ╰── Unnecessary dependency `props.playRequested` 2026-10-24T15:12:30.4126144Z · ╰── Unnecessary dependency `player_0` 2026-10-24T15:12:30.4126198Z 72 │ 2026-10-24T15:12:30.4126250Z ╰──── 2026-10-24T15:12:30.4126634Z  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-24T15:12:30.4127068Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.4127071Z 2026-10-24T15:12:30.4127261Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T15:12:30.4127420Z ╭─[apps/mobile/src/features/threads/ThreadQueueControl.tsx:602:27] 2026-10-24T15:12:30.4127593Z 601 │ const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success)); 2026-10-24T15:12:30.4127673Z 602 │ const gesture = Gesture.Pan() 2026-10-24T15:12:30.4127760Z ·  ─┬─ 2026-10-24T15:12:30.4127909Z · ╰── `Pan` may be a component 2026-10-24T15:12:30.4127989Z 603 │ .enabled(!props.disabled) 2026-10-24T15:12:30.4128044Z ╰──── 2026-10-24T15:12:30.4128322Z  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-24T15:12:30.4128777Z  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-24T15:12:30.4128780Z 2026-10-24T15:12:30.4128949Z ⚠ eslint(no-empty-pattern): Empty array binding pattern 2026-10-24T15:12:30.4129109Z ╭─[apps/server/src/pullRequest/PullRequestService.test.ts:1437:12] 2026-10-24T15:12:30.4129169Z 1436 │ 2026-10-24T15:12:30.4129240Z 1437 │ for (const [] of [ 2026-10-24T15:12:30.4129314Z ·  ── 2026-10-24T15:12:30.4129386Z 1438 │ ["github", "github.com"], 2026-10-24T15:12:30.4129440Z ╰──── 2026-10-24T15:12:30.4129719Z  help: Passing non-iterable values (null, undefined, numbers, booleans, etc.) will result in a runtime error because these values are not iterable. 2026-10-24T15:12:30.4129722Z 2026-10-24T15:12:30.4130100Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T15:12:30.4130251Z ╭─[apps/mobile/src/components/ComposerContextSheet.tsx:272:25] 2026-10-24T15:12:30.4130361Z 271 │ {record.elements?.map((element, index) => ( 2026-10-24T15:12:30.4130534Z 272 │ 2026-10-24T15:12:30.4130696Z ·  ─────────────────────────────────────────────────────── 2026-10-24T15:12:30.4130774Z 273 │ { 2026-10-24T15:12:30.4131690Z ·  ────┬──── 2026-10-24T15:12:30.4131903Z · ╰── This is the containing effect 2026-10-24T15:12:30.4132073Z 30 │ if (snapshot && snapshot !== live) setHeld({ key, snapshot }); 2026-10-24T15:12:30.4132180Z ·  ───┬─── 2026-10-24T15:12:30.4132375Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.4132448Z 31 │ }, [key, live, snapshot]); 2026-10-24T15:12:30.4132501Z ╰──── 2026-10-24T15:12:30.4133108Z  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-24T15:12:30.4133438Z  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-24T15:12:30.4133445Z 2026-10-24T15:12:30.4133691Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T15:12:30.4133837Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:773:7] 2026-10-24T15:12:30.4133941Z 772 │ if (settingsSheetPresentation.isActive) { 2026-10-24T15:12:30.4134072Z 773 │ settingsRoutePresentation.present(settingsRouteSession); 2026-10-24T15:12:30.4134167Z ·  ────────────┬──────────── 2026-10-24T15:12:30.4134344Z · ╰── Missing dependency `settingsRoutePresentation` 2026-10-24T15:12:30.4134401Z 774 │ } 2026-10-24T15:12:30.4134612Z 775 │ }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]); 2026-10-24T15:12:30.4134726Z ·  ────────────────┬──────────────── 2026-10-24T15:12:30.4135012Z · ╰── Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead 2026-10-24T15:12:30.4135068Z 776 │ 2026-10-24T15:12:30.4135120Z ╰──── 2026-10-24T15:12:30.4135544Z  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-24T15:12:30.4135862Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.4135865Z 2026-10-24T15:12:30.4136030Z ⚠ react(immutability): This value cannot be modified 2026-10-24T15:12:30.4136176Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:391:5] 2026-10-24T15:12:30.4136337Z 387 │ typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0; 2026-10-24T15:12:30.4136472Z 388 │ const animatedBorderRadius = useSharedValue(targetBorderRadius); 2026-10-24T15:12:30.4136565Z ·  ──────────┬───────── 2026-10-24T15:12:30.4136722Z · ╰── `animatedBorderRadius` originates here 2026-10-24T15:12:30.4136880Z 389 │ const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android"; 2026-10-24T15:12:30.4136949Z 390 │ useLayoutEffect(() => { 2026-10-24T15:12:30.4137052Z 391 │ animatedBorderRadius.value = shouldAnimate 2026-10-24T15:12:30.4137196Z ·  ──────────┬───────── 2026-10-24T15:12:30.4137388Z · ╰── `animatedBorderRadius` cannot be modified 2026-10-24T15:12:30.4137478Z 392 │ ? withTiming(targetBorderRadius, { 2026-10-24T15:12:30.4137532Z ╰──── 2026-10-24T15:12:30.4137801Z  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-24T15:12:30.4138111Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T15:12:30.4138114Z 2026-10-24T15:12:30.4138369Z ⚠ eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used. 2026-10-24T15:12:30.4138558Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:960:10] 2026-10-24T15:12:30.4138616Z 959 │ 2026-10-24T15:12:30.4138726Z 960 │ function layerClaudeAgentSdkReplayQueryRunner( 2026-10-24T15:12:30.4138842Z ·  ──────────────────┬───────────────── 2026-10-24T15:12:30.4139043Z · ╰── 'layerClaudeAgentSdkReplayQueryRunner' is declared here 2026-10-24T15:12:30.4139146Z 961 │ transcript: ClaudeAgentSdkReplayTranscript, 2026-10-24T15:12:30.4139199Z ╰──── 2026-10-24T15:12:30.4139303Z  help: Consider removing this declaration. 2026-10-24T15:12:30.4139307Z 2026-10-24T15:12:30.4139565Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T15:12:30.4139715Z ╭─[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5] 2026-10-24T15:12:30.4139774Z 150 │ 2026-10-24T15:12:30.4139841Z 151 │ useEffect(() => { 2026-10-24T15:12:30.4139912Z ·  ────┬──── 2026-10-24T15:12:30.4140043Z · ╰── This is the containing effect 2026-10-24T15:12:30.4140129Z 152 │ if (!controlledSelectedPath) { 2026-10-24T15:12:30.4140193Z 153 │ return; 2026-10-24T15:12:30.4140248Z 154 │ } 2026-10-24T15:12:30.4140335Z 155 │ setExpandedPaths((current) => { 2026-10-24T15:12:30.4140417Z ·  ────────┬─────── 2026-10-24T15:12:30.4140587Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.4140713Z 156 │ const ancestors = ancestorPaths(controlledSelectedPath); 2026-10-24T15:12:30.4140765Z ╰──── 2026-10-24T15:12:30.4141425Z  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-24T15:12:30.4141780Z  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-24T15:12:30.4141783Z 2026-10-24T15:12:30.4142001Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T15:12:30.4142175Z ╭─[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:249:7] 2026-10-24T15:12:30.4142255Z 248 │ mountedRef.current = false; 2026-10-24T15:12:30.4142333Z 249 │ flow.setBranchQuery(""); 2026-10-24T15:12:30.4142407Z ·  ──┬─ 2026-10-24T15:12:30.4142539Z · ╰── Missing dependency `flow` 2026-10-24T15:12:30.4142598Z 250 │ }; 2026-10-24T15:12:30.4142671Z 251 │ }, [flow.setBranchQuery]); 2026-10-24T15:12:30.4142758Z ·  ─────────┬───────── 2026-10-24T15:12:30.4142964Z · ╰── Overly precise dependency `flow.setBranchQuery`, use `flow` instead 2026-10-24T15:12:30.4143019Z 252 │ 2026-10-24T15:12:30.4143072Z ╰──── 2026-10-24T15:12:30.4143495Z  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-24T15:12:30.4143837Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.4143843Z 2026-10-24T15:12:30.4144046Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T15:12:30.4144194Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7] 2026-10-24T15:12:30.4144292Z 256 │ return () => cancelAnimationFrame(frame); 2026-10-24T15:12:30.4144371Z 257 │ }, [props.path, targetIndex]); 2026-10-24T15:12:30.4144448Z ·  ─────┬──── 2026-10-24T15:12:30.4144594Z · ╰── Unnecessary dependency `props.path` 2026-10-24T15:12:30.4144648Z 258 │ 2026-10-24T15:12:30.4144699Z ╰──── 2026-10-24T15:12:30.4145001Z  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-24T15:12:30.4145317Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.4145320Z 2026-10-24T15:12:30.4145516Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T15:12:30.4145666Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23] 2026-10-24T15:12:30.4145739Z 292 │ 2026-10-24T15:12:30.4146973Z ·  ─────────── 2026-10-24T15:12:30.4147039Z 310 │ {body} 2026-10-24T15:12:30.4147090Z ╰──── 2026-10-24T15:12:30.4147237Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T15:12:30.4147240Z 2026-10-24T15:12:30.4147505Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T15:12:30.4147669Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-24T15:12:30.4147732Z 259 │ .join("|"); 2026-10-24T15:12:30.4147797Z 260 │ useEffect(() => { 2026-10-24T15:12:30.4147869Z ·  ────┬──── 2026-10-24T15:12:30.4148000Z · ╰── This is the containing effect 2026-10-24T15:12:30.4148080Z 261 │ stop(); 2026-10-24T15:12:30.4148150Z ·  ──┬─ 2026-10-24T15:12:30.4148317Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.4148384Z 262 │ }, [orderVersion]); 2026-10-24T15:12:30.4148435Z ╰──── 2026-10-24T15:12:30.4149045Z  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-24T15:12:30.4149375Z  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-24T15:12:30.4149378Z 2026-10-24T15:12:30.4149597Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T15:12:30.4149758Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-24T15:12:30.4149822Z 260 │ useEffect(() => { 2026-10-24T15:12:30.4149883Z 261 │ stop(); 2026-10-24T15:12:30.4149951Z ·  ──┬─ 2026-10-24T15:12:30.4150083Z · ╰── Missing dependency `stop` 2026-10-24T15:12:30.4150151Z 262 │ }, [orderVersion]); 2026-10-24T15:12:30.4150231Z ·  ──────┬───── 2026-10-24T15:12:30.4150379Z · ╰── Unnecessary dependency `orderVersion` 2026-10-24T15:12:30.4150440Z 263 │ useEffect( 2026-10-24T15:12:30.4150493Z ╰──── 2026-10-24T15:12:30.4150914Z  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-24T15:12:30.4151228Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.4151231Z 2026-10-24T15:12:30.4151435Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4151624Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9] 2026-10-24T15:12:30.4151703Z 95 │ const latest = useRef(props); 2026-10-24T15:12:30.4151774Z 96 │ latest.current = props; 2026-10-24T15:12:30.4151880Z ·  ───┬──────┬─── 2026-10-24T15:12:30.4152059Z · │ ╰── Cannot update ref value during render 2026-10-24T15:12:30.4152174Z · ╰── This value is a ref 2026-10-24T15:12:30.4152243Z 97 │ const gesture = useMemo( 2026-10-24T15:12:30.4152296Z ╰──── 2026-10-24T15:12:30.4152774Z  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-24T15:12:30.4153071Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4153074Z 2026-10-24T15:12:30.4153221Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4153382Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18] 2026-10-24T15:12:30.4153450Z 103 │ .runOnJS(true) 2026-10-24T15:12:30.4153571Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T15:12:30.4153690Z ·  ───────────────┬────────────── 2026-10-24T15:12:30.4153893Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T15:12:30.4154035Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T15:12:30.4154089Z ╰──── 2026-10-24T15:12:30.4154565Z  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-24T15:12:30.4154859Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4154862Z 2026-10-24T15:12:30.4155007Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4155169Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19] 2026-10-24T15:12:30.4155271Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T15:12:30.4155405Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T15:12:30.4155550Z ·  ──────────────────────────┬───────────────────────── 2026-10-24T15:12:30.4155764Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T15:12:30.4155888Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T15:12:30.4155941Z ╰──── 2026-10-24T15:12:30.4156410Z  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-24T15:12:30.4156760Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4156794Z 2026-10-24T15:12:30.4156938Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4157097Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16] 2026-10-24T15:12:30.4157227Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T15:12:30.4157350Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T15:12:30.4157492Z ·  ──────────────────────────┬───────────────────────── 2026-10-24T15:12:30.4157698Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T15:12:30.4157831Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T15:12:30.4157888Z ╰──── 2026-10-24T15:12:30.4158357Z  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-24T15:12:30.4158648Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4158650Z 2026-10-24T15:12:30.4158793Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4158954Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21] 2026-10-24T15:12:30.4159077Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T15:12:30.4159205Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T15:12:30.4159345Z ·  ───────────────────────┬────────────────────── 2026-10-24T15:12:30.4159555Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T15:12:30.4159626Z 108 │ [props.disabled], 2026-10-24T15:12:30.4159678Z ╰──── 2026-10-24T15:12:30.4160145Z  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-24T15:12:30.4160439Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4160495Z 2026-10-24T15:12:30.4160670Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4160830Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:249:9] 2026-10-24T15:12:30.4160945Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-24T15:12:30.4161050Z 249 │ latest.current = { rows, planners, moveThread }; 2026-10-24T15:12:30.4161157Z ·  ───┬──────┬─── 2026-10-24T15:12:30.4161339Z · │ ╰── Cannot update ref value during render 2026-10-24T15:12:30.4161455Z · ╰── This value is a ref 2026-10-24T15:12:30.4161508Z 250 │ 2026-10-24T15:12:30.4161560Z ╰──── 2026-10-24T15:12:30.4162038Z  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-24T15:12:30.4162334Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4162336Z 2026-10-24T15:12:30.4162481Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4162640Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:247:22] 2026-10-24T15:12:30.4162760Z 246 │ const [preview, setPreview] = useState(null); 2026-10-24T15:12:30.4162875Z 247 │ const translateY = useRef(new Animated.Value(0)).current; 2026-10-24T15:12:30.4163007Z ·  ──────────────────┬────────────────── 2026-10-24T15:12:30.4163179Z · ╰── Cannot access ref value during render 2026-10-24T15:12:30.4163292Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-24T15:12:30.4163344Z ╰──── 2026-10-24T15:12:30.4163836Z  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-24T15:12:30.4164127Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4164130Z 2026-10-24T15:12:30.4164298Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T15:12:30.4164464Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:324:16] 2026-10-24T15:12:30.4164534Z 323 │ update(0); 2026-10-24T15:12:30.4164616Z 324 │ let last = performance.now(); 2026-10-24T15:12:30.4164712Z ·  ────────┬──────── 2026-10-24T15:12:30.4164854Z · ╰── Cannot call impure function 2026-10-24T15:12:30.4164924Z 325 │ const tick = () => { 2026-10-24T15:12:30.4164976Z ╰──── 2026-10-24T15:12:30.4165276Z  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-24T15:12:30.4165572Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T15:12:30.4165575Z 2026-10-24T15:12:30.4165825Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T15:12:30.4166016Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15] 2026-10-24T15:12:30.4166077Z  98 │ () => 2026-10-24T15:12:30.4166143Z  99 │ Gesture.Pan() 2026-10-24T15:12:30.4166219Z ·  ─┬─ 2026-10-24T15:12:30.4166351Z · ╰── `Pan` may be a component 2026-10-24T15:12:30.4166431Z 100 │ .enabled(!props.disabled) 2026-10-24T15:12:30.4166483Z ╰──── 2026-10-24T15:12:30.4166760Z  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-24T15:12:30.4167212Z  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-24T15:12:30.4167218Z 2026-10-24T15:12:30.4167406Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T15:12:30.4167564Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5] 2026-10-24T15:12:30.4167632Z 103 │ .runOnJS(true) 2026-10-24T15:12:30.4167733Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T15:12:30.4167822Z ·  ───┬── 2026-10-24T15:12:30.4168262Z · ╰── 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-24T15:12:30.4168399Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T15:12:30.4168523Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T15:12:30.4168647Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T15:12:30.4168716Z 108 │ [props.disabled], 2026-10-24T15:12:30.4168797Z ·  ────────┬─────── 2026-10-24T15:12:30.4168985Z · ╰── This dependency list is missing values used by the callback 2026-10-24T15:12:30.4169041Z 109 │ ); 2026-10-24T15:12:30.4169092Z ╰──── 2026-10-24T15:12:30.4169300Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T15:12:30.4169619Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.4169625Z 2026-10-24T15:12:30.4169853Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T15:12:30.4170095Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:1998:15] 2026-10-24T15:12:30.4170162Z 1997 │ assert.equal( 2026-10-24T15:12:30.4170311Z 1998 │ items.filter((item) => item.type === "assistant_message").at(-1)?.text, 2026-10-24T15:12:30.4170391Z ·  ────── 2026-10-24T15:12:30.4170469Z 1999 │ "authoritative answer", 2026-10-24T15:12:30.4170522Z ╰──── 2026-10-24T15:12:30.4170694Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T15:12:30.4170697Z 2026-10-24T15:12:30.4171238Z ⚠ 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-24T15:12:30.4171451Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:3951:7] 2026-10-24T15:12:30.4171633Z 3950 │ const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped); 2026-10-24T15:12:30.4171843Z 3951 │ ╭─▶ while (!responseLifecycle.includes("failed")) { 2026-10-24T15:12:30.4171954Z 3952 │ │ yield* Effect.yieldNow; 2026-10-24T15:12:30.4172089Z 3953 │ ╰─▶ } 2026-10-24T15:12:30.4172218Z 3954 │ const responseExit = yield* Fiber.join(responseFiber); 2026-10-24T15:12:30.4172273Z ╰──── 2026-10-24T15:12:30.4172275Z 2026-10-24T15:12:30.4172744Z ⚠ 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-24T15:12:30.4172913Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6062:9] 2026-10-24T15:12:30.4173004Z 6061 │ .pipe(Effect.forkScoped); 2026-10-24T15:12:30.4173189Z 6062 │ ╭─▶ while (promptGates.length < 1) { 2026-10-24T15:12:30.4173299Z 6063 │ │ yield* Effect.yieldNow; 2026-10-24T15:12:30.4173442Z 6064 │ ╰─▶ } 2026-10-24T15:12:30.4173640Z 6065 │ assert.isDefined(sessionUpdateHandler, "session update handler must be wired"); 2026-10-24T15:12:30.4173692Z ╰──── 2026-10-24T15:12:30.4173695Z 2026-10-24T15:12:30.4174156Z ⚠ 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-24T15:12:30.4174323Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6197:9] 2026-10-24T15:12:30.4174411Z 6196 │ .pipe(Effect.forkScoped); 2026-10-24T15:12:30.4174593Z 6197 │ ╭─▶ while (promptGates.length < 2) { 2026-10-24T15:12:30.4174701Z 6198 │ │ yield* Effect.yieldNow; 2026-10-24T15:12:30.4174840Z 6199 │ ╰─▶ } 2026-10-24T15:12:30.4175012Z 6200 │ if (sessionUpdateHandler === undefined || capturedMutation.current === null) { 2026-10-24T15:12:30.4175065Z ╰──── 2026-10-24T15:12:30.4175067Z 2026-10-24T15:12:30.4175532Z ⚠ 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-24T15:12:30.4175682Z ╭─[apps/server/src/background/HostPowerMonitor.test.ts:133:11] 2026-10-24T15:12:30.4175816Z 132 │ const monitor = yield* HostPowerMonitor.HostPowerMonitor; 2026-10-24T15:12:30.4175960Z 133 │ ╭─▶ for ( 2026-10-24T15:12:30.4176118Z 134 │ │ let attempt = 0; 2026-10-24T15:12:30.4176319Z 135 │ │ attempt < 100 && (yield* monitor.snapshot).onBattery !== "true"; 2026-10-24T15:12:30.4176418Z 136 │ │ attempt += 1 2026-10-24T15:12:30.4176502Z 137 │ │ ) { 2026-10-24T15:12:30.4176612Z 138 │ │ yield* Effect.yieldNow; 2026-10-24T15:12:30.4176745Z 139 │ ╰─▶ } 2026-10-24T15:12:30.4176869Z 140 │ expect((yield* monitor.snapshot).onBattery).toBe("true"); 2026-10-24T15:12:30.4176921Z ╰──── 2026-10-24T15:12:30.4176924Z 2026-10-24T15:12:30.4177188Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T15:12:30.4177362Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10578:7] 2026-10-24T15:12:30.4177421Z 10577 │ 2026-10-24T15:12:30.4177495Z 10578 │ const layer: Layer.Layer< 2026-10-24T15:12:30.4177568Z ·  ──┬── 2026-10-24T15:12:30.4177695Z · ╰── 'layer' is declared here 2026-10-24T15:12:30.4177790Z 10579 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T15:12:30.4177843Z ╰──── 2026-10-24T15:12:30.4177948Z  help: Consider removing this declaration. 2026-10-24T15:12:30.4177951Z 2026-10-24T15:12:30.4178096Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4178256Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39] 2026-10-24T15:12:30.4178311Z 276 │ 2026-10-24T15:12:30.4178498Z 277 │ ╭─▶ return createElement(RawNativeView, { 2026-10-24T15:12:30.4178595Z 278 │ │ ...nativeProps, 2026-10-24T15:12:30.4178739Z 279 │ │ refreshEnabled: props.onPullToRefresh !== undefined, 2026-10-24T15:12:30.4178833Z 280 │ │ ref: nativeRef, 2026-10-24T15:12:30.4178962Z 281 │ ├─▶ }); 2026-10-24T15:12:30.4179202Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T15:12:30.4179257Z 282 │ } 2026-10-24T15:12:30.4179309Z ╰──── 2026-10-24T15:12:30.4179786Z  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-24T15:12:30.4180080Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4180083Z 2026-10-24T15:12:30.4180459Z ⚠ 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-24T15:12:30.4180588Z ╭─[apps/server/src/assets/AssetAccess.test.ts:975:35] 2026-10-24T15:12:30.4180737Z 974 │ // Every client and server release spells the resource this way on the wire. 2026-10-24T15:12:30.4180892Z 975 │ const { resource } = yield* Schema.decodeUnknownEffect(AssetCreateUrlInput)({ 2026-10-24T15:12:30.4181070Z ·  ────────────────────────── 2026-10-24T15:12:30.4181224Z 976 │ resource: { _tag: "github-media", cwd: "/repo", url }, 2026-10-24T15:12:30.4181277Z ╰──── 2026-10-24T15:12:30.4181279Z 2026-10-24T15:12:30.4181735Z ⚠ 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-24T15:12:30.4181866Z ╭─[apps/server/src/assets/AssetAccess.test.ts:1012:32] 2026-10-24T15:12:30.4182005Z 1011 │ expect(error._tag).toBe("AssetGitHubMediaUrlValidationError"); 2026-10-24T15:12:30.4182193Z 1012 │ const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(AssetAccessError))(error); 2026-10-24T15:12:30.4182315Z ·  ─────────────────── 2026-10-24T15:12:30.4182414Z 1013 │ expect(encoded).not.toContain(url); 2026-10-24T15:12:30.4182467Z ╰──── 2026-10-24T15:12:30.4182470Z 2026-10-24T15:12:30.4182806Z ⚠ eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'. 2026-10-24T15:12:30.4182971Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1444:7] 2026-10-24T15:12:30.4183025Z 1443 │ 2026-10-24T15:12:30.4183141Z 1444 │ const layerCodexAppServerClientFactoryCommand = ( 2026-10-24T15:12:30.4183258Z ·  ───────────────────┬─────────────────── 2026-10-24T15:12:30.4183466Z · ╰── 'layerCodexAppServerClientFactoryCommand' is declared here 2026-10-24T15:12:30.4183629Z 1445 │ options: CodexClient.CodexAppServerClientOptions & { 2026-10-24T15:12:30.4183686Z ╰──── 2026-10-24T15:12:30.4183788Z  help: Consider removing this declaration. 2026-10-24T15:12:30.4183790Z 2026-10-24T15:12:30.4184049Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T15:12:30.4184211Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1680:7] 2026-10-24T15:12:30.4184266Z 1679 │ 2026-10-24T15:12:30.4184336Z 1680 │ const layer: Layer.Layer< 2026-10-24T15:12:30.4184407Z ·  ──┬── 2026-10-24T15:12:30.4184535Z · ╰── 'layer' is declared here 2026-10-24T15:12:30.4184629Z 1681 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T15:12:30.4184680Z ╰──── 2026-10-24T15:12:30.4184840Z  help: Consider removing this declaration. 2026-10-24T15:12:30.4184874Z 2026-10-24T15:12:30.4185345Z ⚠ 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-24T15:12:30.4185530Z ╭─[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:521:13] 2026-10-24T15:12:30.4185602Z 520 │ })).delivery; 2026-10-24T15:12:30.4185797Z 521 │ ╭─▶ while (delivery.outcome === "accepted") { 2026-10-24T15:12:30.4185913Z 522 │ │ yield* Effect.yieldNow; 2026-10-24T15:12:30.4186061Z 523 │ │ delivery = (yield* service.getWebhookDelivery({ 2026-10-24T15:12:30.4186169Z 524 │ │ id: task.id, 2026-10-24T15:12:30.4186288Z 525 │ │ deliveryId: deliveryId!, 2026-10-24T15:12:30.4186387Z 526 │ │ })).delivery; 2026-10-24T15:12:30.4186524Z 527 │ ╰─▶ } 2026-10-24T15:12:30.4186641Z 528 │ assert.equal(delivery.outcome, "dispatch_failed"); 2026-10-24T15:12:30.4186694Z ╰──── 2026-10-24T15:12:30.4186697Z 2026-10-24T15:12:30.4186855Z ⚠ react(immutability): This value cannot be modified 2026-10-24T15:12:30.4187012Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-24T15:12:30.4187065Z 83 │ 2026-10-24T15:12:30.4187158Z 84 │ const cardCoverage = props.cardCoverage; 2026-10-24T15:12:30.4187239Z ·  ──────┬───── 2026-10-24T15:12:30.4187382Z · ╰── `cardCoverage` originates here 2026-10-24T15:12:30.4187465Z 85 │ const barHeightRef = useRef(0); 2026-10-24T15:12:30.4187543Z 86 │ const cardHeightRef = useRef(0); 2026-10-24T15:12:30.4187628Z 87 │ const cardHeight = useSharedValue(0); 2026-10-24T15:12:30.4187721Z 88 │ const notifyCoverage = useCallback(() => { 2026-10-24T15:12:30.4187788Z 89 │ if (!cardCoverage) { 2026-10-24T15:12:30.4187848Z 90 │ return; 2026-10-24T15:12:30.4187902Z 91 │ } 2026-10-24T15:12:30.4188069Z 92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-24T15:12:30.4188170Z 93 │ // feed inset and floating controls trailing it. 2026-10-24T15:12:30.4188328Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T15:12:30.4188411Z ·  ──────┬───── 2026-10-24T15:12:30.4188552Z · ╰── `cardCoverage` cannot be modified 2026-10-24T15:12:30.4188619Z 95 │ }, [cardCoverage]); 2026-10-24T15:12:30.4188671Z ╰──── 2026-10-24T15:12:30.4188972Z  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-24T15:12:30.4189282Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T15:12:30.4189284Z 2026-10-24T15:12:30.4189443Z ⚠ react(immutability): This value cannot be modified 2026-10-24T15:12:30.4189599Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:106:7] 2026-10-24T15:12:30.4189738Z  86 │ const cardHeightRef = useRef(0); 2026-10-24T15:12:30.4189859Z  87 │ const cardHeight = useSharedValue(0); 2026-10-24T15:12:30.4189937Z ·  ─────┬──── 2026-10-24T15:12:30.4190071Z · ╰── `cardHeight` originates here 2026-10-24T15:12:30.4190167Z  88 │ const notifyCoverage = useCallback(() => { 2026-10-24T15:12:30.4190235Z  89 │ if (!cardCoverage) { 2026-10-24T15:12:30.4190297Z  90 │ return; 2026-10-24T15:12:30.4190350Z  91 │ } 2026-10-24T15:12:30.4190515Z  92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-24T15:12:30.4190616Z  93 │ // feed inset and floating controls trailing it. 2026-10-24T15:12:30.4190773Z  94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T15:12:30.4190838Z  95 │ }, [cardCoverage]); 2026-10-24T15:12:30.4190927Z  96 │ const handleBarLayout = useCallback( 2026-10-24T15:12:30.4191014Z  97 │ (event: LayoutChangeEvent) => { 2026-10-24T15:12:30.4191135Z  98 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T15:12:30.4191201Z  99 │ notifyCoverage(); 2026-10-24T15:12:30.4191257Z 100 │ }, 2026-10-24T15:12:30.4191324Z 101 │ [notifyCoverage], 2026-10-24T15:12:30.4191377Z 102 │ ); 2026-10-24T15:12:30.4191462Z 103 │ const handleCardLayout = useCallback( 2026-10-24T15:12:30.4191544Z 104 │ (event: LayoutChangeEvent) => { 2026-10-24T15:12:30.4191669Z 105 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T15:12:30.4191783Z 106 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-24T15:12:30.4191859Z ·  ─────┬──── 2026-10-24T15:12:30.4192005Z · ╰── `cardHeight` cannot be modified 2026-10-24T15:12:30.4192076Z 107 │ notifyCoverage(); 2026-10-24T15:12:30.4192128Z ╰──── 2026-10-24T15:12:30.4192395Z  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-24T15:12:30.4192703Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T15:12:30.4192705Z 2026-10-24T15:12:30.4192907Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T15:12:30.4193064Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-24T15:12:30.4193149Z 87 │ const cardHeight = useSharedValue(0); 2026-10-24T15:12:30.4193245Z 88 │ const notifyCoverage = useCallback(() => { 2026-10-24T15:12:30.4193352Z ·  ───┬─── 2026-10-24T15:12:30.4193628Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-24T15:12:30.4193694Z 89 │ if (!cardCoverage) { 2026-10-24T15:12:30.4193754Z 90 │ return; 2026-10-24T15:12:30.4193809Z 91 │ } 2026-10-24T15:12:30.4193974Z 92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-24T15:12:30.4194074Z 93 │ // feed inset and floating controls trailing it. 2026-10-24T15:12:30.4194231Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T15:12:30.4194307Z ·  ──────┬───── 2026-10-24T15:12:30.4194509Z · ╰── This modifies `cardCoverage` 2026-10-24T15:12:30.4194610Z 95 │ }, [cardCoverage]); 2026-10-24T15:12:30.4194662Z ╰──── 2026-10-24T15:12:30.4195005Z  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-24T15:12:30.4195310Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T15:12:30.4195313Z 2026-10-24T15:12:30.4195513Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T15:12:30.4195667Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-24T15:12:30.4195768Z 93 │ // feed inset and floating controls trailing it. 2026-10-24T15:12:30.4195929Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T15:12:30.4196006Z ·  ──────┬───── 2026-10-24T15:12:30.4196136Z · ╰── This modifies `cardCoverage` 2026-10-24T15:12:30.4196201Z 95 │ }, [cardCoverage]); 2026-10-24T15:12:30.4196286Z 96 │ const handleBarLayout = useCallback( 2026-10-24T15:12:30.4196367Z 97 │ (event: LayoutChangeEvent) => { 2026-10-24T15:12:30.4196472Z ·  ───────────────┬─────────────── 2026-10-24T15:12:30.4196697Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-24T15:12:30.4196818Z 98 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T15:12:30.4196871Z ╰──── 2026-10-24T15:12:30.4197215Z  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-24T15:12:30.4197523Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T15:12:30.4197526Z 2026-10-24T15:12:30.4197724Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T15:12:30.4197882Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:106:7] 2026-10-24T15:12:30.4197970Z 103 │ const handleCardLayout = useCallback( 2026-10-24T15:12:30.4198051Z 104 │ (event: LayoutChangeEvent) => { 2026-10-24T15:12:30.4198158Z ·  ───────────────┬─────────────── 2026-10-24T15:12:30.4198386Z · ╰── This function may (indirectly) reassign or modify `cardHeight` after render 2026-10-24T15:12:30.4198516Z 105 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T15:12:30.4198629Z 106 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-24T15:12:30.4198706Z ·  ─────┬──── 2026-10-24T15:12:30.4198836Z · ╰── This modifies `cardHeight` 2026-10-24T15:12:30.4198904Z 107 │ notifyCoverage(); 2026-10-24T15:12:30.4198955Z ╰──── 2026-10-24T15:12:30.4199292Z  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-24T15:12:30.4199659Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T15:12:30.4199699Z 2026-10-24T15:12:30.4199929Z ⚠ eslint(no-unused-vars): Function 'assertUserMessagesExclude' is declared but never used. 2026-10-24T15:12:30.4200095Z ╭─[apps/server/src/orchestration-v2/testkit/fixtures/shared.ts:1398:10] 2026-10-24T15:12:30.4200147Z 1397 │ 2026-10-24T15:12:30.4200235Z 1398 │ function assertUserMessagesExclude( 2026-10-24T15:12:30.4200339Z ·  ────────────┬──────────── 2026-10-24T15:12:30.4200508Z · ╰── 'assertUserMessagesExclude' is declared here 2026-10-24T15:12:30.4200617Z 1399 │ projection: OrchestrationV2ThreadProjection, 2026-10-24T15:12:30.4200670Z ╰──── 2026-10-24T15:12:30.4200773Z  help: Consider removing this declaration. 2026-10-24T15:12:30.4200776Z 2026-10-24T15:12:30.4200991Z ⚠ eslint(no-unused-vars): Function 'describeSchedule' is declared but never used. 2026-10-24T15:12:30.4201121Z ╭─[apps/server/src/scheduledTasks/Schedule.ts:79:10] 2026-10-24T15:12:30.4201175Z 78 │ 2026-10-24T15:12:30.4201312Z 79 │ function describeSchedule(schedule: ScheduledTaskSchedule): string { 2026-10-24T15:12:30.4201398Z ·  ────────┬─────── 2026-10-24T15:12:30.4201545Z · ╰── 'describeSchedule' is declared here 2026-10-24T15:12:30.4201653Z 80 │ if (schedule.type === "webhook") return "On webhook"; 2026-10-24T15:12:30.4201705Z ╰──── 2026-10-24T15:12:30.4201807Z  help: Consider removing this declaration. 2026-10-24T15:12:30.4201809Z 2026-10-24T15:12:30.4202075Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T15:12:30.4202232Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:57:5] 2026-10-24T15:12:30.4202285Z 55 │ 2026-10-24T15:12:30.4202352Z 56 │ useEffect(() => { 2026-10-24T15:12:30.4202422Z ·  ────┬──── 2026-10-24T15:12:30.4202551Z · ╰── This is the containing effect 2026-10-24T15:12:30.4202620Z 57 │ setDecodedSize(null); 2026-10-24T15:12:30.4202698Z ·  ───────┬────── 2026-10-24T15:12:30.4202866Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.4202935Z 58 │ }, [props.sourceKey]); 2026-10-24T15:12:30.4202986Z ╰──── 2026-10-24T15:12:30.4203622Z  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-24T15:12:30.4203949Z  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-24T15:12:30.4203953Z 2026-10-24T15:12:30.4204212Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T15:12:30.4204364Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5] 2026-10-24T15:12:30.4204417Z 59 │ 2026-10-24T15:12:30.4204482Z 60 │ useEffect(() => { 2026-10-24T15:12:30.4204550Z ·  ────┬──── 2026-10-24T15:12:30.4204732Z · ╰── This is the containing effect 2026-10-24T15:12:30.4204923Z 61 │ setFailedUri(null); 2026-10-24T15:12:30.4204999Z ·  ──────┬───── 2026-10-24T15:12:30.4205165Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.4205232Z 62 │ }, [props.uri]); 2026-10-24T15:12:30.4205284Z ╰──── 2026-10-24T15:12:30.4205889Z  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-24T15:12:30.4206216Z  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-24T15:12:30.4206224Z 2026-10-24T15:12:30.4206440Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-24T15:12:30.4206591Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10] 2026-10-24T15:12:30.4206716Z 6 │ import { parse, SvgAst, type JsxAST } from "react-native-svg"; 2026-10-24T15:12:30.4206894Z 7 │ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native"; 2026-10-24T15:12:30.4206981Z ·  ────────┬──────── 2026-10-24T15:12:30.4207131Z · ╰── 'ActivityIndicator' is imported here 2026-10-24T15:12:30.4207183Z 8 │ 2026-10-24T15:12:30.4207236Z ╰──── 2026-10-24T15:12:30.4207334Z  help: Consider removing this import. 2026-10-24T15:12:30.4207337Z 2026-10-24T15:12:30.4207543Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T15:12:30.4207697Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7] 2026-10-24T15:12:30.4207765Z 57 │ setDecodedSize(null); 2026-10-24T15:12:30.4207833Z 58 │ }, [props.sourceKey]); 2026-10-24T15:12:30.4207914Z ·  ───────┬─────── 2026-10-24T15:12:30.4208067Z · ╰── Unnecessary dependency `props.sourceKey` 2026-10-24T15:12:30.4208119Z 59 │ 2026-10-24T15:12:30.4208169Z ╰──── 2026-10-24T15:12:30.4208464Z  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-24T15:12:30.4208829Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.4208866Z 2026-10-24T15:12:30.4209069Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T15:12:30.4209218Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7] 2026-10-24T15:12:30.4209286Z 61 │ setFailedUri(null); 2026-10-24T15:12:30.4209351Z 62 │ }, [props.uri]); 2026-10-24T15:12:30.4209426Z ·  ────┬──── 2026-10-24T15:12:30.4209566Z · ╰── Unnecessary dependency `props.uri` 2026-10-24T15:12:30.4209618Z 63 │ 2026-10-24T15:12:30.4209669Z ╰──── 2026-10-24T15:12:30.4210094Z  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-24T15:12:30.4210413Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.4210423Z 2026-10-24T15:12:30.4210616Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T15:12:30.4210785Z ╭─[apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx:818:17] 2026-10-24T15:12:30.4210849Z 817 │
{ 2026-10-24T15:12:30.4212530Z ╰──── 2026-10-24T15:12:30.4212809Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T15:12:30.4213107Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T15:12:30.4213110Z 2026-10-24T15:12:30.4213396Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T15:12:30.4213588Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:473:19] 2026-10-24T15:12:30.4213651Z 472 │ onFilters, 2026-10-24T15:12:30.4213718Z 473 │ authorOptions = [], 2026-10-24T15:12:30.4213865Z ·  ── 2026-10-24T15:12:30.4213972Z 474 │ labelOptions = [], 2026-10-24T15:12:30.4214023Z ╰──── 2026-10-24T15:12:30.4214340Z  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-24T15:12:30.4214343Z 2026-10-24T15:12:30.4214626Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T15:12:30.4214795Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:474:18] 2026-10-24T15:12:30.4214863Z 473 │ authorOptions = [], 2026-10-24T15:12:30.4214928Z 474 │ labelOptions = [], 2026-10-24T15:12:30.4215005Z ·  ── 2026-10-24T15:12:30.4215070Z 475 │ optionScope, 2026-10-24T15:12:30.4215122Z ╰──── 2026-10-24T15:12:30.4215445Z  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-24T15:12:30.4215453Z 2026-10-24T15:12:30.4215713Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T15:12:30.4215845Z ╭─[packages/provider-pi/src/server/adapter.ts:3405:7] 2026-10-24T15:12:30.4215899Z 3404 │ 2026-10-24T15:12:30.4216089Z 3405 │ const layer: Layer.Layer = 2026-10-24T15:12:30.4216161Z ·  ──┬── 2026-10-24T15:12:30.4216289Z · ╰── 'layer' is declared here 2026-10-24T15:12:30.4216355Z 3406 │ Layer.effect( 2026-10-24T15:12:30.4216408Z ╰──── 2026-10-24T15:12:30.4216516Z  help: Consider removing this declaration. 2026-10-24T15:12:30.4216522Z 2026-10-24T15:12:30.4216689Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T15:12:30.4216812Z ╭─[apps/web/src/hooks/useThreadActions.ts:821:56] 2026-10-24T15:12:30.4216918Z 820 │ const resolved = resolveThreadTarget(target); 2026-10-24T15:12:30.4217076Z 821 │ if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) { 2026-10-24T15:12:30.4217200Z ·  ─────┬──── 2026-10-24T15:12:30.4217370Z · ╰── Cannot call impure function 2026-10-24T15:12:30.4217452Z 822 │ return AsyncResult.failure( 2026-10-24T15:12:30.4217503Z ╰──── 2026-10-24T15:12:30.4217789Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T15:12:30.4218090Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T15:12:30.4218093Z 2026-10-24T15:12:30.4218259Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T15:12:30.4218380Z ╭─[apps/web/src/hooks/useThreadActions.ts:709:46] 2026-10-24T15:12:30.4218451Z 708 │ const wokeAt = resolved 2026-10-24T15:12:30.4218585Z 709 │ ? threadWokeAt(resolved.thread, { now: new Date().toISOString() }) 2026-10-24T15:12:30.4218698Z ·  ─────┬──── 2026-10-24T15:12:30.4218920Z · ╰── Cannot call impure function 2026-10-24T15:12:30.4219010Z 710 │ : null; 2026-10-24T15:12:30.4219061Z ╰──── 2026-10-24T15:12:30.4219336Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T15:12:30.4219630Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T15:12:30.4219632Z 2026-10-24T15:12:30.4219831Z ⚠ eslint(no-unused-vars): Identifier 'Duration' is imported but never used. 2026-10-24T15:12:30.4219967Z ╭─[packages/provider-pi/src/server/adapter.test.ts:24:13] 2026-10-24T15:12:30.4220064Z 23 │ import * as Deferred from "effect/Deferred"; 2026-10-24T15:12:30.4220162Z 24 │ import * as Duration from "effect/Duration"; 2026-10-24T15:12:30.4220243Z ·  ────┬─── 2026-10-24T15:12:30.4220378Z · ╰── 'Duration' is imported here 2026-10-24T15:12:30.4220467Z 25 │ import * as Effect from "effect/Effect"; 2026-10-24T15:12:30.4220520Z ╰──── 2026-10-24T15:12:30.4220618Z  help: Consider removing this import. 2026-10-24T15:12:30.4220621Z 2026-10-24T15:12:30.4220789Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T15:12:30.4220982Z ╭─[packages/provider-opencode/src/server/OpenCodeRuntime.environment.test.ts:53:14] 2026-10-24T15:12:30.4221035Z 52 │ 2026-10-24T15:12:30.4221100Z 53 │ for (const {} of [ 2026-10-24T15:12:30.4221173Z ·  ── 2026-10-24T15:12:30.4221246Z 54 │ { healthy: true }, 2026-10-24T15:12:30.4221300Z ╰──── 2026-10-24T15:12:30.4221530Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T15:12:30.4221533Z 2026-10-24T15:12:30.4221746Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T15:12:30.4221880Z ╭─[apps/web/src/lib/composerContextReferences.ts:90:40] 2026-10-24T15:12:30.4221955Z 89 │ let cursor = prompt.length; 2026-10-24T15:12:30.4222062Z 90 │ for (const occurrence of occurrences.reverse()) { 2026-10-24T15:12:30.4222168Z ·  ─────── 2026-10-24T15:12:30.4222248Z 91 │ let { start, end } = occurrence; 2026-10-24T15:12:30.4222300Z ╰──── 2026-10-24T15:12:30.4222570Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T15:12:30.4222577Z 2026-10-24T15:12:30.4222852Z ⚠ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'. 2026-10-24T15:12:30.4223001Z ╭─[apps/web/src/components/preview/PreviewPanelShell.tsx:61:9] 2026-10-24T15:12:30.4223055Z 60 │ ) { 2026-10-24T15:12:30.4223226Z 61 │ const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded"; 2026-10-24T15:12:30.4223305Z ·  ──────┬────── 2026-10-24T15:12:30.4223448Z · ╰── 'useDragRegion' is declared here 2026-10-24T15:12:30.4223563Z 62 │ const isInline = props.mode === "inline"; 2026-10-24T15:12:30.4223617Z ╰──── 2026-10-24T15:12:30.4223774Z  help: Consider removing this declaration. 2026-10-24T15:12:30.4223811Z 2026-10-24T15:12:30.4224070Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T15:12:30.4224212Z ╭─[packages/provider-opencode/src/server/adapter.ts:3755:7] 2026-10-24T15:12:30.4224266Z 3754 │ 2026-10-24T15:12:30.4224465Z 3755 │ const layer: Layer.Layer = 2026-10-24T15:12:30.4224538Z ·  ──┬── 2026-10-24T15:12:30.4224664Z · ╰── 'layer' is declared here 2026-10-24T15:12:30.4224731Z 3756 │ Layer.effect( 2026-10-24T15:12:30.4224783Z ╰──── 2026-10-24T15:12:30.4224886Z  help: Consider removing this declaration. 2026-10-24T15:12:30.4224888Z 2026-10-24T15:12:30.4225370Z ⚠ 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-24T15:12:30.4225522Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:169:7] 2026-10-24T15:12:30.4225585Z 168 │ }); 2026-10-24T15:12:30.4225785Z 169 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T15:12:30.4225980Z 170 │ │ if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break; 2026-10-24T15:12:30.4226088Z 171 │ │ yield* Effect.yieldNow; 2026-10-24T15:12:30.4226221Z 172 │ ╰─▶ } 2026-10-24T15:12:30.4226282Z 173 │ 2026-10-24T15:12:30.4226339Z ╰──── 2026-10-24T15:12:30.4226342Z 2026-10-24T15:12:30.4226812Z ⚠ 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-24T15:12:30.4226960Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:178:7] 2026-10-24T15:12:30.4227071Z 177 │ yield* Deferred.succeed(releaseSave, undefined); 2026-10-24T15:12:30.4227268Z 178 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T15:12:30.4227403Z 179 │ │ if ((yield* Ref.get(saved)).length > 0) break; 2026-10-24T15:12:30.4227512Z 180 │ │ yield* Effect.yieldNow; 2026-10-24T15:12:30.4227643Z 181 │ ╰─▶ } 2026-10-24T15:12:30.4227698Z 182 │ 2026-10-24T15:12:30.4227749Z ╰──── 2026-10-24T15:12:30.4227752Z 2026-10-24T15:12:30.4228214Z ⚠ 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-24T15:12:30.4228361Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7] 2026-10-24T15:12:30.4228488Z 306 │ yield* Deferred.succeed(releaseUnenrichedSave, undefined); 2026-10-24T15:12:30.4228680Z 307 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T15:12:30.4228859Z 308 │ │ const values = yield* Ref.get(saved); 2026-10-24T15:12:30.4229086Z 309 │ │ if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) { 2026-10-24T15:12:30.4229173Z 310 │ │ break; 2026-10-24T15:12:30.4229253Z 311 │ │ } 2026-10-24T15:12:30.4229358Z 312 │ │ yield* Effect.yieldNow; 2026-10-24T15:12:30.4229491Z 313 │ ╰─▶ } 2026-10-24T15:12:30.4229544Z 314 │ 2026-10-24T15:12:30.4229596Z ╰──── 2026-10-24T15:12:30.4229598Z 2026-10-24T15:12:30.4229802Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T15:12:30.4229934Z ╭─[packages/client-runtime/src/state/usageAccess.ts:3:8] 2026-10-24T15:12:30.4230014Z 2 │ AuthDiagnosticsReadScope, 2026-10-24T15:12:30.4230088Z 3 │ type AuthSessionState, 2026-10-24T15:12:30.4230173Z ·  ────────┬─────── 2026-10-24T15:12:30.4230321Z · ╰── 'AuthSessionState' is imported here 2026-10-24T15:12:30.4230390Z 4 │ sessionGrantsScope, 2026-10-24T15:12:30.4230441Z ╰──── 2026-10-24T15:12:30.4230540Z  help: Consider removing this import. 2026-10-24T15:12:30.4230543Z 2026-10-24T15:12:30.4230789Z ⚠ eslint(no-unused-vars): Function 'normalizeTerminalContextSelection' is declared but never used. 2026-10-24T15:12:30.4230901Z ╭─[apps/web/src/lib/terminalContext.ts:56:10] 2026-10-24T15:12:30.4230954Z 55 │ 2026-10-24T15:12:30.4231053Z 56 │ function normalizeTerminalContextSelection( 2026-10-24T15:12:30.4231170Z ·  ────────────────┬──────────────── 2026-10-24T15:12:30.4231363Z · ╰── 'normalizeTerminalContextSelection' is declared here 2026-10-24T15:12:30.4231451Z 57 │ selection: TerminalContextSelection, 2026-10-24T15:12:30.4231502Z ╰──── 2026-10-24T15:12:30.4231605Z  help: Consider removing this declaration. 2026-10-24T15:12:30.4231607Z 2026-10-24T15:12:30.4231818Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T15:12:30.4231943Z ╭─[apps/mobile/src/lib/markdownDocument.ts:259:28] 2026-10-24T15:12:30.4232045Z 258 │ visit(parser.parse(markdown), false, false); 2026-10-24T15:12:30.4232129Z 259 │ for (const edit of edits.reverse()) 2026-10-24T15:12:30.4232227Z ·  ─────── 2026-10-24T15:12:30.4232445Z 260 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-24T15:12:30.4232533Z ╰──── 2026-10-24T15:12:30.4232798Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T15:12:30.4232801Z 2026-10-24T15:12:30.4233011Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T15:12:30.4233133Z ╭─[apps/mobile/src/lib/markdownDocument.ts:290:28] 2026-10-24T15:12:30.4233215Z 289 │ visit(parser.parse(markdown)); 2026-10-24T15:12:30.4233298Z 290 │ for (const edit of edits.reverse()) 2026-10-24T15:12:30.4233393Z ·  ─────── 2026-10-24T15:12:30.4233573Z 291 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-24T15:12:30.4233633Z ╰──── 2026-10-24T15:12:30.4233896Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T15:12:30.4233899Z 2026-10-24T15:12:30.4234109Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T15:12:30.4234230Z ╭─[apps/mobile/src/lib/markdownDocument.ts:344:38] 2026-10-24T15:12:30.4234311Z 343 │ visit(parser.parse(markdown)); 2026-10-24T15:12:30.4234415Z 344 │ for (const lineStart of lineStarts.reverse()) { 2026-10-24T15:12:30.4234519Z ·  ─────── 2026-10-24T15:12:30.4234682Z 345 │ // The header row may be a lazy line without its container markers (`>` or list indent), 2026-10-24T15:12:30.4234735Z ╰──── 2026-10-24T15:12:30.4235005Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T15:12:30.4235012Z 2026-10-24T15:12:30.4235220Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T15:12:30.4235346Z ╭─[apps/web/src/lib/announce.browser.test.ts:41:46] 2026-10-24T15:12:30.4235398Z 40 │ 2026-10-24T15:12:30.4235507Z 41 │ expect(regionTexts()).toEqual([...first].reverse()); 2026-10-24T15:12:30.4235618Z ·  ─────── 2026-10-24T15:12:30.4235714Z 42 │ expect(regionTexts()).toContain("Claude"); 2026-10-24T15:12:30.4235765Z ╰──── 2026-10-24T15:12:30.4236031Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T15:12:30.4236036Z 2026-10-24T15:12:30.4236236Z ⚠ eslint(no-unused-vars): Type 'EnvironmentId' is imported but never used. 2026-10-24T15:12:30.4236376Z ╭─[packages/client-runtime/src/state/sharedSettings.ts:2:3] 2026-10-24T15:12:30.4236438Z 1 │ import type { 2026-10-24T15:12:30.4236503Z 2 │ EnvironmentId, 2026-10-24T15:12:30.4236579Z ·  ──────┬────── 2026-10-24T15:12:30.4236717Z · ╰── 'EnvironmentId' is imported here 2026-10-24T15:12:30.4236802Z 3 │ ExecutionEnvironmentCapabilities, 2026-10-24T15:12:30.4236854Z ╰──── 2026-10-24T15:12:30.4236952Z  help: Consider removing this import. 2026-10-24T15:12:30.4236955Z 2026-10-24T15:12:30.4237250Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-24T15:12:30.4237447Z ╭─[apps/web/src/components/pullRequest/pullRequestList.logic.ts:262:9] 2026-10-24T15:12:30.4237508Z 261 │ ): boolean { 2026-10-24T15:12:30.4237661Z 262 │ const labels = entry.labels.map((label) => label.name.trim().toLowerCase()); 2026-10-24T15:12:30.4237827Z ·  ───────────────────────────────────────────────────────────────────── 2026-10-24T15:12:30.4237974Z 263 │ const holds = (label: string) => labels.includes(label.trim().toLowerCase()); 2026-10-24T15:12:30.4238026Z ╰──── 2026-10-24T15:12:30.4238103Z  help: Switch to `Set` 2026-10-24T15:12:30.4238106Z 2026-10-24T15:12:30.4238374Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-24T15:12:30.4238513Z ╭─[apps/server/src/telemetry/AnalyticsService.ts:340:7] 2026-10-24T15:12:30.4238571Z 339 │ 2026-10-24T15:12:30.4238674Z 340 │ const layerTest = AnalyticsService.layerTest; 2026-10-24T15:12:30.4238751Z ·  ────┬──── 2026-10-24T15:12:30.4238884Z · ╰── 'layerTest' is declared here 2026-10-24T15:12:30.4238936Z ╰──── 2026-10-24T15:12:30.4239040Z  help: Consider removing this declaration. 2026-10-24T15:12:30.4239043Z 2026-10-24T15:12:30.4239231Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T15:12:30.4239346Z ╭─[apps/mobile/src/lib/useHoverGesture.ts:8:15] 2026-10-24T15:12:30.4239403Z 7 │ () => 2026-10-24T15:12:30.4239470Z 8 │ Gesture.Hover() 2026-10-24T15:12:30.4239545Z ·  ──┬── 2026-10-24T15:12:30.4239686Z · ╰── `Hover` may be a component 2026-10-24T15:12:30.4239763Z 9 │ .manualActivation(true) 2026-10-24T15:12:30.4239814Z ╰──── 2026-10-24T15:12:30.4240098Z  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-24T15:12:30.4240549Z  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-24T15:12:30.4240552Z 2026-10-24T15:12:30.4240784Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-24T15:12:30.4240922Z ╭─[apps/web/src/components/chat/useComposerSend.ts:985:13] 2026-10-24T15:12:30.4241049Z 984 │ const changedBeforeDecline = draftChangedSinceSend(); 2026-10-24T15:12:30.4241295Z 985 │ ╭─▶ const pendingIdsBeforeDecline = pendingApprovalsRef.current.map( 2026-10-24T15:12:30.4241415Z 986 │ │ (approval) => approval.requestId, 2026-10-24T15:12:30.4241548Z 987 │ ╰─▶ ); 2026-10-24T15:12:30.4241687Z 988 │ const approvalResponding = approvalsToDecline.some((approval) => 2026-10-24T15:12:30.4241739Z ╰──── 2026-10-24T15:12:30.4241814Z  help: Switch to `Set` 2026-10-24T15:12:30.4241818Z 2026-10-24T15:12:30.4242028Z ⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used. 2026-10-24T15:12:30.4242222Z ╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10] 2026-10-24T15:12:30.4242307Z 21 │ 2026-10-24T15:12:30.4242463Z 22 │ function summarizePayload(payload: unknown): Readonly> { 2026-10-24T15:12:30.4242550Z ·  ────────┬─────── 2026-10-24T15:12:30.4242700Z · ╰── 'summarizePayload' is declared here 2026-10-24T15:12:30.4242806Z 23 │ if (payload === null) return { valueType: "null" }; 2026-10-24T15:12:30.4242858Z ╰──── 2026-10-24T15:12:30.4242960Z  help: Consider removing this declaration. 2026-10-24T15:12:30.4242962Z 2026-10-24T15:12:30.4243220Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T15:12:30.4243344Z ╭─[apps/server/src/serverRuntimeStartup.ts:728:7] 2026-10-24T15:12:30.4243404Z 727 │ 2026-10-24T15:12:30.4243486Z 728 │ const layer = layerWithOptions(); 2026-10-24T15:12:30.4243579Z ·  ──┬── 2026-10-24T15:12:30.4243704Z · ╰── 'layer' is declared here 2026-10-24T15:12:30.4243756Z ╰──── 2026-10-24T15:12:30.4243856Z  help: Consider removing this declaration. 2026-10-24T15:12:30.4243859Z 2026-10-24T15:12:30.4244050Z ⚠ eslint(require-yield): This generator function does not have `yield` 2026-10-24T15:12:30.4244195Z ╭─[packages/provider-acp/src/server/mcpOverAcpBridge.ts:81:78] 2026-10-24T15:12:30.4244252Z  80 │ 2026-10-24T15:12:30.4244524Z  81 │ ╭─▶ export const makeAcpMcpOverAcpBridge = Effect.fn("AcpMcpOverAcpBridge.make")(function* ( 2026-10-24T15:12:30.4244650Z  82 │ │ options: AcpMcpOverAcpBridgeOptions, 2026-10-24T15:12:30.4244776Z  83 │ │ ): Effect.fn.Return { 2026-10-24T15:12:30.4244945Z  84 │ │ const fetchImplementation = options.fetchImplementation ?? fetch; 2026-10-24T15:12:30.4245078Z  85 │ │ const connections = new Map(); 2026-10-24T15:12:30.4245148Z  86 │ │ 2026-10-24T15:12:30.4245363Z  87 │ │ const connectionFor = (connectionId: string): Effect.Effect => 2026-10-24T15:12:30.4245464Z  88 │ │ Effect.suspend(() => { 2026-10-24T15:12:30.4245598Z  89 │ │ const connection = connections.get(connectionId); 2026-10-24T15:12:30.4245709Z  90 │ │ return connection === undefined 2026-10-24T15:12:30.4245930Z  91 │ │ ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`)) 2026-10-24T15:12:30.4246044Z  92 │ │ : Effect.succeed(connection); 2026-10-24T15:12:30.4246119Z  93 │ │ }); 2026-10-24T15:12:30.4246188Z  94 │ │ 2026-10-24T15:12:30.4246275Z  95 │ │ const send = ( 2026-10-24T15:12:30.4246378Z  96 │ │ connection: Connection, 2026-10-24T15:12:30.4246469Z  97 │ │ message: unknown, 2026-10-24T15:12:30.4246627Z  98 │ │ ): Effect.Effect, AcpMcpOverAcpError> => 2026-10-24T15:12:30.4246742Z  99 │ │ connection.mutex.withPermits(1)( 2026-10-24T15:12:30.4246848Z 100 │ │ Effect.gen(function* () { 2026-10-24T15:12:30.4247028Z 101 │ │ const body = JSON.stringify(message); 2026-10-24T15:12:30.4247203Z 102 │ │ if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) { 2026-10-24T15:12:30.4247419Z 103 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB.")); 2026-10-24T15:12:30.4247497Z 104 │ │ } 2026-10-24T15:12:30.4247630Z 105 │ │ const response = yield* Effect.tryPromise({ 2026-10-24T15:12:30.4247728Z 106 │ │ try: (signal) => 2026-10-24T15:12:30.4247861Z 107 │ │ fetchImplementation(options.endpoint, { 2026-10-24T15:12:30.4247962Z 108 │ │ method: "POST", 2026-10-24T15:12:30.4248055Z 109 │ │ signal, 2026-10-24T15:12:30.4248156Z 110 │ │ headers: { 2026-10-24T15:12:30.4248287Z 111 │ │ "content-type": "application/json", 2026-10-24T15:12:30.4248431Z 112 │ │ accept: "application/json, text/event-stream", 2026-10-24T15:12:30.4248563Z 113 │ │ authorization: options.authorization, 2026-10-24T15:12:30.4248689Z 114 │ │ ...(connection.sessionId === null 2026-10-24T15:12:30.4248782Z 115 │ │ ? {} 2026-10-24T15:12:30.4248925Z 116 │ │ : { "mcp-session-id": connection.sessionId }), 2026-10-24T15:12:30.4249059Z 117 │ │ ...(connection.protocolVersion === null 2026-10-24T15:12:30.4249155Z 118 │ │ ? {} 2026-10-24T15:12:30.4249324Z 119 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-24T15:12:30.4249411Z 120 │ │ }, 2026-10-24T15:12:30.4249502Z 121 │ │ body, 2026-10-24T15:12:30.4249585Z 122 │ │ }), 2026-10-24T15:12:30.4249687Z 123 │ │ catch: bridgeError, 2026-10-24T15:12:30.4249767Z 124 │ │ }); 2026-10-24T15:12:30.4250057Z 125 │ │ connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId; 2026-10-24T15:12:30.4250156Z 126 │ │ if (!response.ok) { 2026-10-24T15:12:30.4250264Z 127 │ │ yield* Effect.promise( 2026-10-24T15:12:30.4250455Z 128 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-24T15:12:30.4250540Z 129 │ │ ); 2026-10-24T15:12:30.4250650Z 130 │ │ return yield* Effect.fail( 2026-10-24T15:12:30.4250863Z 131 │ │ new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`), 2026-10-24T15:12:30.4250946Z 132 │ │ ); 2026-10-24T15:12:30.4251025Z 133 │ │ } 2026-10-24T15:12:30.4251236Z 134 │ │ const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))]; 2026-10-24T15:12:30.4251356Z 135 │ │ for (const payload of payloads) { 2026-10-24T15:12:30.4251648Z 136 │ │ connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion; 2026-10-24T15:12:30.4251774Z 137 │ │ } 2026-10-24T15:12:30.4251874Z 138 │ │ return payloads; 2026-10-24T15:12:30.4251996Z 139 │ │ }).pipe(Effect.mapError(bridgeError)), 2026-10-24T15:12:30.4252072Z 140 │ │ ); 2026-10-24T15:12:30.4252142Z 141 │ │ 2026-10-24T15:12:30.4252318Z 142 │ │ const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* ( 2026-10-24T15:12:30.4252442Z 143 │ │ request: AcpSchema.DisconnectMcpRequest, 2026-10-24T15:12:30.4252628Z 144 │ │ ): Effect.fn.Return { 2026-10-24T15:12:30.4252797Z 145 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T15:12:30.4252927Z 146 │ │ connections.delete(request.connectionId); 2026-10-24T15:12:30.4253050Z 147 │ │ const sessionId = connection.sessionId; 2026-10-24T15:12:30.4253152Z 148 │ │ if (sessionId !== null) { 2026-10-24T15:12:30.4253285Z 149 │ │ const response = yield* Effect.tryPromise({ 2026-10-24T15:12:30.4253381Z 150 │ │ try: (signal) => 2026-10-24T15:12:30.4253510Z 151 │ │ fetchImplementation(options.endpoint, { 2026-10-24T15:12:30.4253638Z 152 │ │ method: "DELETE", 2026-10-24T15:12:30.4253728Z 153 │ │ signal, 2026-10-24T15:12:30.4253823Z 154 │ │ headers: { 2026-10-24T15:12:30.4253958Z 155 │ │ authorization: options.authorization, 2026-10-24T15:12:30.4254081Z 156 │ │ "mcp-session-id": sessionId, 2026-10-24T15:12:30.4254215Z 157 │ │ ...(connection.protocolVersion === null 2026-10-24T15:12:30.4254307Z 158 │ │ ? {} 2026-10-24T15:12:30.4254470Z 159 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-24T15:12:30.4254556Z 160 │ │ }, 2026-10-24T15:12:30.4254639Z 161 │ │ }), 2026-10-24T15:12:30.4254740Z 162 │ │ catch: bridgeError, 2026-10-24T15:12:30.4254817Z 163 │ │ }); 2026-10-24T15:12:30.4254951Z 164 │ │ if (!response.ok && response.status !== 404) { 2026-10-24T15:12:30.4255069Z 165 │ │ return yield* Effect.fail( 2026-10-24T15:12:30.4255182Z 166 │ │ new AcpMcpOverAcpError( 2026-10-24T15:12:30.4255366Z 167 │ │ `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`, 2026-10-24T15:12:30.4255447Z 168 │ │ ), 2026-10-24T15:12:30.4255526Z 169 │ │ ); 2026-10-24T15:12:30.4255603Z 170 │ │ } 2026-10-24T15:12:30.4255706Z 171 │ │ yield* Effect.promise( 2026-10-24T15:12:30.4255885Z 172 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-24T15:12:30.4255964Z 173 │ │ ); 2026-10-24T15:12:30.4256041Z 174 │ │ } 2026-10-24T15:12:30.4256186Z 175 │ │ return {}; 2026-10-24T15:12:30.4256294Z 176 │ │ }); 2026-10-24T15:12:30.4256363Z 177 │ │ 2026-10-24T15:12:30.4256442Z 178 │ │ return { 2026-10-24T15:12:30.4256614Z 179 │ │ connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) { 2026-10-24T15:12:30.4256736Z 180 │ │ if (request.serverId !== "t3-code") { 2026-10-24T15:12:30.4256845Z 181 │ │ return yield* Effect.fail( 2026-10-24T15:12:30.4257031Z 182 │ │ new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`), 2026-10-24T15:12:30.4257108Z 183 │ │ ); 2026-10-24T15:12:30.4257185Z 184 │ │ } 2026-10-24T15:12:30.4257320Z 185 │ │ if (connections.size >= MAX_CONNECTIONS) { 2026-10-24T15:12:30.4257532Z 186 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections.")); 2026-10-24T15:12:30.4257607Z 187 │ │ } 2026-10-24T15:12:30.4257762Z 188 │ │ const connectionId = yield* options.allocateConnectionId; 2026-10-24T15:12:30.4257877Z 189 │ │ connections.set(connectionId, { 2026-10-24T15:12:30.4257995Z 190 │ │ mutex: yield* Semaphore.make(1), 2026-10-24T15:12:30.4258093Z 191 │ │ sessionId: null, 2026-10-24T15:12:30.4258199Z 192 │ │ protocolVersion: null, 2026-10-24T15:12:30.4258299Z 193 │ │ nextRequestId: 0, 2026-10-24T15:12:30.4258377Z 194 │ │ }); 2026-10-24T15:12:30.4258486Z 195 │ │ return { connectionId }; 2026-10-24T15:12:30.4258564Z 196 │ │ }), 2026-10-24T15:12:30.4258738Z 197 │ │ message: Effect.fn("mcpOverAcpBridge.message")(function* (request) { 2026-10-24T15:12:30.4258901Z 198 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T15:12:30.4259025Z 199 │ │ const id = ++connection.nextRequestId; 2026-10-24T15:12:30.4259151Z 200 │ │ const payloads = yield* send(connection, { 2026-10-24T15:12:30.4259249Z 201 │ │ jsonrpc: "2.0", 2026-10-24T15:12:30.4259330Z 202 │ │ id, 2026-10-24T15:12:30.4259434Z 203 │ │ method: request.method, 2026-10-24T15:12:30.4259650Z 204 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-24T15:12:30.4259764Z 205 │ │ }); 2026-10-24T15:12:30.4259951Z 206 │ │ const response = payloads.find((payload) => asEnvelope(payload)?.id === id); 2026-10-24T15:12:30.4260073Z 207 │ │ const envelope = asEnvelope(response); 2026-10-24T15:12:30.4260173Z 208 │ │ if (envelope === null) { 2026-10-24T15:12:30.4260282Z 209 │ │ return yield* Effect.fail( 2026-10-24T15:12:30.4260468Z 210 │ │ new AcpMcpOverAcpError("MCP server did not return a matching response."), 2026-10-24T15:12:30.4260547Z 211 │ │ ); 2026-10-24T15:12:30.4260621Z 212 │ │ } 2026-10-24T15:12:30.4260744Z 213 │ │ if (envelope.error !== undefined) { 2026-10-24T15:12:30.4260943Z 214 │ │ return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error))); 2026-10-24T15:12:30.4261018Z 215 │ │ } 2026-10-24T15:12:30.4261189Z 216 │ │ return (envelope.result ?? null) as AcpSchema.MessageMcpResponse; 2026-10-24T15:12:30.4261263Z 217 │ │ }), 2026-10-24T15:12:30.4261456Z 218 │ │ notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) { 2026-10-24T15:12:30.4261618Z 219 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T15:12:30.4261721Z 220 │ │ yield* send(connection, { 2026-10-24T15:12:30.4261818Z 221 │ │ jsonrpc: "2.0", 2026-10-24T15:12:30.4261927Z 222 │ │ method: request.method, 2026-10-24T15:12:30.4262091Z 223 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-24T15:12:30.4262168Z 224 │ │ }); 2026-10-24T15:12:30.4262244Z 225 │ │ }), 2026-10-24T15:12:30.4262330Z 226 │ │ disconnect, 2026-10-24T15:12:30.4262439Z 227 │ │ dispose: Effect.suspend(() => 2026-10-24T15:12:30.4262536Z 228 │ │ Effect.forEach( 2026-10-24T15:12:30.4262641Z 229 │ │ [...connections.keys()], 2026-10-24T15:12:30.4262813Z 230 │ │ (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore), 2026-10-24T15:12:30.4262913Z 231 │ │ { discard: true }, 2026-10-24T15:12:30.4262995Z 232 │ │ ), 2026-10-24T15:12:30.4263074Z 233 │ │ ), 2026-10-24T15:12:30.4263148Z 234 │ │ }; 2026-10-24T15:12:30.4263276Z 235 │ ╰─▶ }); 2026-10-24T15:12:30.4263329Z ╰──── 2026-10-24T15:12:30.4263635Z  help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed. 2026-10-24T15:12:30.4263638Z 2026-10-24T15:12:30.4264113Z ⚠ 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-24T15:12:30.4264273Z ╭─[apps/server/src/project/ProjectEnrichmentService.test.ts:28:3] 2026-10-24T15:12:30.4264386Z 27 │ ) { 2026-10-24T15:12:30.4264618Z 28 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T15:12:30.4264763Z 29 │ │ const available = yield* service.peek(workspaceRoot); 2026-10-24T15:12:30.4264890Z 30 │ │ if (predicate(available)) return available; 2026-10-24T15:12:30.4264990Z 31 │ │ yield* Effect.yieldNow; 2026-10-24T15:12:30.4265111Z 32 │ ╰─▶ } 2026-10-24T15:12:30.4265291Z 33 │ return yield* Effect.die(`Project metadata for ${workspaceRoot} was not resolved in time.`); 2026-10-24T15:12:30.4265344Z ╰──── 2026-10-24T15:12:30.4265347Z 2026-10-24T15:12:30.4265822Z ⚠ 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-24T15:12:30.4265960Z ╭─[apps/server/src/project/ProjectService.test.ts:94:3] 2026-10-24T15:12:30.4266015Z 93 │ ) { 2026-10-24T15:12:30.4266214Z 94 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T15:12:30.4266388Z 95 │ │ const project = Option.getOrThrow(yield* service.getById(projectId)); 2026-10-24T15:12:30.4266509Z 96 │ │ if (predicate(project)) return project; 2026-10-24T15:12:30.4266606Z 97 │ │ yield* Effect.yieldNow; 2026-10-24T15:12:30.4266731Z 98 │ ╰─▶ } 2026-10-24T15:12:30.4266888Z 99 │ return yield* Effect.die(`Project ${projectId} was not enriched in time.`); 2026-10-24T15:12:30.4266944Z ╰──── 2026-10-24T15:12:30.4266947Z 2026-10-24T15:12:30.4267410Z ⚠ 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-24T15:12:30.4267549Z ╭─[packages/contracts/src/composerContext.test.ts:181:18] 2026-10-24T15:12:30.4267683Z 180 │ it("sends a message without the records the wire cannot carry", () => { 2026-10-24T15:12:30.4267865Z 181 │ const wire = Schema.encodeUnknownSync(Schema.toCodecJson(OrchestrationMessageContext))({ 2026-10-24T15:12:30.4267976Z ·  ──────────────────────── 2026-10-24T15:12:30.4268040Z 182 │ version: 1, 2026-10-24T15:12:30.4268092Z ╰──── 2026-10-24T15:12:30.4268102Z 2026-10-24T15:12:30.4268389Z ⚠ eslint(no-unused-vars): Variable 'layerUnavailable' is declared but never used. Unused variables should start with a '_'. 2026-10-24T15:12:30.4268534Z ╭─[apps/server/src/orchestration-v2/Orchestrator.ts:12380:7] 2026-10-24T15:12:30.4268589Z 12379 │ 2026-10-24T15:12:30.4268729Z 12380 │ const layerUnavailable: Layer.Layer = Layer.succeed( 2026-10-24T15:12:30.4268815Z ·  ────────┬─────── 2026-10-24T15:12:30.4268967Z · ╰── 'layerUnavailable' is declared here 2026-10-24T15:12:30.4269036Z 12381 │ OrchestratorV2, 2026-10-24T15:12:30.4269092Z ╰──── 2026-10-24T15:12:30.4269199Z  help: Consider removing this declaration. 2026-10-24T15:12:30.4269202Z 2026-10-24T15:12:30.4269463Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-24T15:12:30.4269608Z ╭─[packages/contracts/src/rpc.ts:297:8] 2026-10-24T15:12:30.4269677Z 296 │ } from "./device.ts"; 2026-10-24T15:12:30.4269772Z 297 │ import {} from "./previewAutomation.ts"; 2026-10-24T15:12:30.4269842Z ·  ── 2026-10-24T15:12:30.4269901Z 298 │ import { 2026-10-24T15:12:30.4269953Z ╰──── 2026-10-24T15:12:30.4270034Z  help: Remove empty braces 2026-10-24T15:12:30.4270037Z 2026-10-24T15:12:30.4270182Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4270336Z ╭─[apps/mobile/src/features/home/thread-swipe-actions.tsx:494:27] 2026-10-24T15:12:30.4270397Z 493 │ > 2026-10-24T15:12:30.4270477Z 494 │ {props.children(close)} 2026-10-24T15:12:30.4270575Z ·  ──┬── 2026-10-24T15:12:30.4270736Z · ╰── Cannot access ref value during render 2026-10-24T15:12:30.4270816Z 495 │ 2026-10-24T15:12:30.4270866Z ╰──── 2026-10-24T15:12:30.4271340Z  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-24T15:12:30.4271634Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4271637Z 2026-10-24T15:12:30.4271832Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T15:12:30.4271983Z ╭─[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9] 2026-10-24T15:12:30.4272077Z 35 │ { 2026-10-24T15:12:30.4276290Z ╰──── 2026-10-24T15:12:30.4276579Z  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-24T15:12:30.4276882Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T15:12:30.4276888Z 2026-10-24T15:12:30.4277082Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T15:12:30.4277256Z ╭─[apps/web/src/components/pullRequest/PullRequestChecksPopover.tsx:88:15] 2026-10-24T15:12:30.4277319Z 87 │
  • void) { 2026-10-24T15:12:30.4278518Z 12 │ this.onmessage = listener; 2026-10-24T15:12:30.4278599Z ·  ───────── 2026-10-24T15:12:30.4278655Z 13 │ } 2026-10-24T15:12:30.4278707Z ╰──── 2026-10-24T15:12:30.4279027Z  help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on` replaces any previously registered handler. 2026-10-24T15:12:30.4279030Z 2026-10-24T15:12:30.4279236Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-24T15:12:30.4279514Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:16:9] 2026-10-24T15:12:30.4279626Z 15 │ constructor() { 2026-10-24T15:12:30.4279692Z 16 │ source = this; 2026-10-24T15:12:30.4279764Z ·  ────── 2026-10-24T15:12:30.4279819Z 17 │ } 2026-10-24T15:12:30.4279871Z ╰──── 2026-10-24T15:12:30.4280147Z  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-24T15:12:30.4280150Z 2026-10-24T15:12:30.4280611Z ⚠ 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-24T15:12:30.4280742Z ╭─[packages/contracts/src/baseSchemas.test.ts:39:9] 2026-10-24T15:12:30.4280811Z 38 │ JSON.stringify( 2026-10-24T15:12:30.4280930Z 39 │ Schema.encodeUnknownSync(Schema.toCodecJson(Named))([ 2026-10-24T15:12:30.4281027Z ·  ──────────────────────── 2026-10-24T15:12:30.4281093Z 40 │ { name: "a" }, 2026-10-24T15:12:30.4281144Z ╰──── 2026-10-24T15:12:30.4281147Z 2026-10-24T15:12:30.4281307Z ⚠ react(immutability): This value cannot be modified 2026-10-24T15:12:30.4281479Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5] 2026-10-24T15:12:30.4281535Z 90 │ }) { 2026-10-24T15:12:30.4281647Z 91 │ const rotation = useSharedValue(props.hidden ? 1 : 0); 2026-10-24T15:12:30.4281721Z ·  ────┬─── 2026-10-24T15:12:30.4281861Z · ╰── `rotation` originates here 2026-10-24T15:12:30.4281933Z 92 │ useLayoutEffect(() => { 2026-10-24T15:12:30.4282075Z 93 │ rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING); 2026-10-24T15:12:30.4282146Z ·  ────┬─── 2026-10-24T15:12:30.4282278Z · ╰── `rotation` cannot be modified 2026-10-24T15:12:30.4282353Z 94 │ }, [props.hidden, rotation]); 2026-10-24T15:12:30.4282406Z ╰──── 2026-10-24T15:12:30.4282674Z  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-24T15:12:30.4282986Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T15:12:30.4282988Z 2026-10-24T15:12:30.4283204Z ⚠ react(immutability): This value cannot be modified 2026-10-24T15:12:30.4283408Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:269:5] 2026-10-24T15:12:30.4283503Z 266 │ const variant = props.variant ?? "plain"; 2026-10-24T15:12:30.4283667Z 267 │ const loadingVisibility = useSharedValue(props.loading ? 1 : 0); 2026-10-24T15:12:30.4283757Z ·  ────────┬──────── 2026-10-24T15:12:30.4283906Z · ╰── `loadingVisibility` originates here 2026-10-24T15:12:30.4283976Z 268 │ useLayoutEffect(() => { 2026-10-24T15:12:30.4284135Z 269 │ loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING); 2026-10-24T15:12:30.4284218Z ·  ────────┬──────── 2026-10-24T15:12:30.4284366Z · ╰── `loadingVisibility` cannot be modified 2026-10-24T15:12:30.4284467Z 270 │ }, [loadingVisibility, props.loading]); 2026-10-24T15:12:30.4284523Z ╰──── 2026-10-24T15:12:30.4284790Z  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-24T15:12:30.4285099Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T15:12:30.4285103Z 2026-10-24T15:12:30.4285259Z ⚠ react(immutability): This value cannot be modified 2026-10-24T15:12:30.4285429Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:328:5] 2026-10-24T15:12:30.4285485Z 325 │ }) { 2026-10-24T15:12:30.4285648Z 326 │ const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0); 2026-10-24T15:12:30.4285741Z ·  ─────────┬───────── 2026-10-24T15:12:30.4285897Z · ╰── `recordingVisibility` originates here 2026-10-24T15:12:30.4285967Z 327 │ useLayoutEffect(() => { 2026-10-24T15:12:30.4286156Z 328 │ recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING); 2026-10-24T15:12:30.4286241Z ·  ─────────┬───────── 2026-10-24T15:12:30.4286397Z · ╰── `recordingVisibility` cannot be modified 2026-10-24T15:12:30.4286489Z 329 │ }, [props.phase, recordingVisibility]); 2026-10-24T15:12:30.4286541Z ╰──── 2026-10-24T15:12:30.4286805Z  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-24T15:12:30.4287116Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T15:12:30.4287123Z 2026-10-24T15:12:30.4287595Z ⚠ 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-24T15:12:30.4287732Z ╭─[packages/client-runtime/src/rpc/session.test.ts:226:3] 2026-10-24T15:12:30.4287789Z 225 │ ) { 2026-10-24T15:12:30.4287996Z 226 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T15:12:30.4288111Z 227 │ │ const socket = sockets[index]; 2026-10-24T15:12:30.4288202Z 228 │ │ if (socket) { 2026-10-24T15:12:30.4288361Z 229 │ │ return socket; 2026-10-24T15:12:30.4288464Z 230 │ │ } 2026-10-24T15:12:30.4288568Z 231 │ │ yield* Effect.yieldNow; 2026-10-24T15:12:30.4288696Z 232 │ ╰─▶ } 2026-10-24T15:12:30.4288871Z 233 │ return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket.")); 2026-10-24T15:12:30.4288924Z ╰──── 2026-10-24T15:12:30.4288926Z 2026-10-24T15:12:30.4289394Z ⚠ 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-24T15:12:30.4289529Z ╭─[packages/client-runtime/src/rpc/session.test.ts:240:3] 2026-10-24T15:12:30.4289592Z 239 │ ) { 2026-10-24T15:12:30.4289797Z 240 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T15:12:30.4290215Z 241 │ │ const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index]; 2026-10-24T15:12:30.4290308Z 242 │ │ if (request) { 2026-10-24T15:12:30.4292032Z 243 │ │ return request; 2026-10-24T15:12:30.4292112Z 244 │ │ } 2026-10-24T15:12:30.4292216Z 245 │ │ yield* Effect.yieldNow; 2026-10-24T15:12:30.4292342Z 246 │ ╰─▶ } 2026-10-24T15:12:30.4292511Z 247 │ return yield* Effect.die(new Error("Expected the RPC protocol to send a request.")); 2026-10-24T15:12:30.4292562Z ╰──── 2026-10-24T15:12:30.4292574Z 2026-10-24T15:12:30.4292728Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4292897Z ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14] 2026-10-24T15:12:30.4292980Z 26 │ const latestInput = useRef(input); 2026-10-24T15:12:30.4293056Z 27 │ latestInput.current = input; 2026-10-24T15:12:30.4293169Z ·  ─────┬─────────┬─── 2026-10-24T15:12:30.4293355Z · │ ╰── Cannot update ref value during render 2026-10-24T15:12:30.4293470Z · ╰── This value is a ref 2026-10-24T15:12:30.4293576Z 28 │ const mounted = useRef(true); 2026-10-24T15:12:30.4293627Z ╰──── 2026-10-24T15:12:30.4294107Z  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-24T15:12:30.4294407Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4294410Z 2026-10-24T15:12:30.4294567Z ⚠ react(immutability): This value cannot be modified 2026-10-24T15:12:30.4294733Z ╭─[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5] 2026-10-24T15:12:30.4294838Z 65 │ const [expanded, setExpanded] = useState(false); 2026-10-24T15:12:30.4294922Z 66 │ const progress = useSharedValue(0); 2026-10-24T15:12:30.4294996Z ·  ────┬─── 2026-10-24T15:12:30.4295217Z · ╰── `progress` originates here 2026-10-24T15:12:30.4295323Z 67 │ useEffect(() => { 2026-10-24T15:12:30.4295447Z 68 │ progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING); 2026-10-24T15:12:30.4295518Z ·  ────┬─── 2026-10-24T15:12:30.4295650Z · ╰── `progress` cannot be modified 2026-10-24T15:12:30.4295722Z 69 │ }, [expanded, progress]); 2026-10-24T15:12:30.4295774Z ╰──── 2026-10-24T15:12:30.4296042Z  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-24T15:12:30.4296349Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T15:12:30.4296354Z 2026-10-24T15:12:30.4296826Z ⚠ 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-24T15:12:30.4296965Z ╭─[packages/client-runtime/src/rpc/client.test.ts:131:9] 2026-10-24T15:12:30.4297027Z 130 │ ) { 2026-10-24T15:12:30.4297239Z 131 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T15:12:30.4297363Z 132 │ │ if (subscriptions.length >= count) { 2026-10-24T15:12:30.4297454Z 133 │ │ return; 2026-10-24T15:12:30.4297536Z 134 │ │ } 2026-10-24T15:12:30.4297644Z 135 │ │ yield* Effect.yieldNow; 2026-10-24T15:12:30.4297783Z 136 │ ╰─▶ } 2026-10-24T15:12:30.4297952Z 137 │ return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`)); 2026-10-24T15:12:30.4298005Z ╰──── 2026-10-24T15:12:30.4298007Z 2026-10-24T15:12:30.4298471Z ⚠ 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-24T15:12:30.4298604Z ╭─[packages/client-runtime/src/rpc/client.test.ts:252:7] 2026-10-24T15:12:30.4298766Z 251 │ yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient))); 2026-10-24T15:12:30.4299027Z 252 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) { 2026-10-24T15:12:30.4299136Z 253 │ │ yield* Effect.yieldNow; 2026-10-24T15:12:30.4299269Z 254 │ ╰─▶ } 2026-10-24T15:12:30.4299392Z 255 │ yield* SubscriptionRef.set(activeSession, Option.none()); 2026-10-24T15:12:30.4299444Z ╰──── 2026-10-24T15:12:30.4299447Z 2026-10-24T15:12:30.4299910Z ⚠ 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-24T15:12:30.4300040Z ╭─[packages/client-runtime/src/rpc/client.test.ts:258:7] 2026-10-24T15:12:30.4300096Z 257 │ 2026-10-24T15:12:30.4300404Z 258 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-24T15:12:30.4300542Z 259 │ │ yield* Effect.yieldNow; 2026-10-24T15:12:30.4300672Z 260 │ ╰─▶ } 2026-10-24T15:12:30.4300778Z 261 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-24T15:12:30.4300829Z ╰──── 2026-10-24T15:12:30.4300832Z 2026-10-24T15:12:30.4301293Z ⚠ 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-24T15:12:30.4301422Z ╭─[packages/client-runtime/src/rpc/client.test.ts:322:7] 2026-10-24T15:12:30.4301483Z 321 │ ); 2026-10-24T15:12:30.4301742Z 322 │ ╭─▶ for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) { 2026-10-24T15:12:30.4301849Z 323 │ │ yield* Effect.yieldNow; 2026-10-24T15:12:30.4301978Z 324 │ ╰─▶ } 2026-10-24T15:12:30.4302032Z 325 │ 2026-10-24T15:12:30.4302083Z ╰──── 2026-10-24T15:12:30.4302087Z 2026-10-24T15:12:30.4302550Z ⚠ 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-24T15:12:30.4302681Z ╭─[packages/client-runtime/src/rpc/client.test.ts:330:7] 2026-10-24T15:12:30.4302849Z 329 │ yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient))); 2026-10-24T15:12:30.4303101Z 330 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-24T15:12:30.4303204Z 331 │ │ yield* Effect.yieldNow; 2026-10-24T15:12:30.4303334Z 332 │ ╰─▶ } 2026-10-24T15:12:30.4303438Z 333 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-24T15:12:30.4303490Z ╰──── 2026-10-24T15:12:30.4303492Z 2026-10-24T15:12:30.4303676Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4303838Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:122:38] 2026-10-24T15:12:30.4303996Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-24T15:12:30.4304124Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-24T15:12:30.4304250Z ·  ───────────┬────────── 2026-10-24T15:12:30.4304425Z · ╰── Cannot access ref value during render 2026-10-24T15:12:30.4304543Z 123 │ const sessionRef = useRef(null); 2026-10-24T15:12:30.4304594Z ╰──── 2026-10-24T15:12:30.4305065Z  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-24T15:12:30.4305414Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4305473Z 2026-10-24T15:12:30.4305617Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4305775Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8] 2026-10-24T15:12:30.4305829Z 125 │ 2026-10-24T15:12:30.4305935Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T15:12:30.4306024Z ·  ─────────┬──────── 2026-10-24T15:12:30.4306175Z · ╰── Cannot access ref value during render 2026-10-24T15:12:30.4306279Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T15:12:30.4306329Z ╰──── 2026-10-24T15:12:30.4306803Z  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-24T15:12:30.4307097Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4307100Z 2026-10-24T15:12:30.4307243Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4307399Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7] 2026-10-24T15:12:30.4307451Z 125 │ 2026-10-24T15:12:30.4307557Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T15:12:30.4307644Z ·  ─────────┬───────── 2026-10-24T15:12:30.4307795Z · ╰── Cannot access ref value during render 2026-10-24T15:12:30.4307901Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T15:12:30.4307955Z ╰──── 2026-10-24T15:12:30.4308423Z  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-24T15:12:30.4308715Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4308718Z 2026-10-24T15:12:30.4308859Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4309015Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31] 2026-10-24T15:12:30.4309067Z 125 │ 2026-10-24T15:12:30.4309173Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T15:12:30.4309290Z ·  ─────────┬───────── 2026-10-24T15:12:30.4309461Z · ╰── Cannot access ref value during render 2026-10-24T15:12:30.4309562Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T15:12:30.4309614Z ╰──── 2026-10-24T15:12:30.4310079Z  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-24T15:12:30.4310367Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4310371Z 2026-10-24T15:12:30.4310566Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4310758Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30] 2026-10-24T15:12:30.4310810Z 125 │ 2026-10-24T15:12:30.4310915Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T15:12:30.4311026Z ·  ──────────┬───────── 2026-10-24T15:12:30.4311193Z · ╰── Cannot access ref value during render 2026-10-24T15:12:30.4311293Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T15:12:30.4311344Z ╰──── 2026-10-24T15:12:30.4311817Z  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-24T15:12:30.4312110Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4312112Z 2026-10-24T15:12:30.4312254Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4312410Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46] 2026-10-24T15:12:30.4312521Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T15:12:30.4312713Z 127 │ ╭─▶ const recorder = createLazyVoiceRecorder({ 2026-10-24T15:12:30.4312890Z 128 │ │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-24T15:12:30.4313015Z 129 │ │ onStatus: (status: RecordingStatus) => { 2026-10-24T15:12:30.4313174Z 130 │ │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-24T15:12:30.4313295Z 131 │ │ isFinished: status.isFinished, 2026-10-24T15:12:30.4313472Z 132 │ │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-24T15:12:30.4313605Z 133 │ │ error: status.error, 2026-10-24T15:12:30.4313702Z 134 │ │ url: status.url, 2026-10-24T15:12:30.4313782Z 135 │ │ }); 2026-10-24T15:12:30.4313860Z 136 │ │ }, 2026-10-24T15:12:30.4314058Z 137 │ │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-24T15:12:30.4314166Z 138 │ │ selectInput: (inputs) => { 2026-10-24T15:12:30.4314382Z 139 │ │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-24T15:12:30.4314560Z 140 │ │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-24T15:12:30.4314728Z 141 │ │ const known = microphoneOrder(preferences.value.microphones); 2026-10-24T15:12:30.4314867Z 142 │ │ const order = rememberMicrophones(known, inputs); 2026-10-24T15:12:30.4314967Z 143 │ │ if (order !== known) { 2026-10-24T15:12:30.4315107Z 144 │ │ registry.set(updateMobilePreferencesAtom, { 2026-10-24T15:12:30.4315221Z 145 │ │ transform: (current) => ({ 2026-10-24T15:12:30.4315427Z 146 │ │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-24T15:12:30.4315519Z 147 │ │ }), 2026-10-24T15:12:30.4315603Z 148 │ │ }); 2026-10-24T15:12:30.4315682Z 149 │ │ } 2026-10-24T15:12:30.4315822Z 150 │ │ return preferredMicrophoneInput(inputs, order); 2026-10-24T15:12:30.4315899Z 151 │ │ }, 2026-10-24T15:12:30.4316030Z 152 │ ├─▶ }); 2026-10-24T15:12:30.4316268Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T15:12:30.4316354Z 153 │ recorderRef.current = recorder; 2026-10-24T15:12:30.4316406Z ╰──── 2026-10-24T15:12:30.4316881Z  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-24T15:12:30.4317176Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4317178Z 2026-10-24T15:12:30.4317322Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4317482Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16] 2026-10-24T15:12:30.4317538Z 152 │ }); 2026-10-24T15:12:30.4317619Z 153 │ recorderRef.current = recorder; 2026-10-24T15:12:30.4317732Z ·  ─────┬─────────┬─── 2026-10-24T15:12:30.4317922Z · │ ╰── Cannot update ref value during render 2026-10-24T15:12:30.4318042Z · ╰── This value is a ref 2026-10-24T15:12:30.4318145Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T15:12:30.4318197Z ╰──── 2026-10-24T15:12:30.4318665Z  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-24T15:12:30.4318956Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4318958Z 2026-10-24T15:12:30.4319100Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4319310Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48] 2026-10-24T15:12:30.4319430Z 153 │ recorderRef.current = recorder; 2026-10-24T15:12:30.4319626Z 154 │ ╭─▶ sessionRef.current = new VoiceInputSession({ 2026-10-24T15:12:30.4319713Z 155 │ │ recorder, 2026-10-24T15:12:30.4319842Z 156 │ │ getTranscriber: getLocalVoiceTranscriber, 2026-10-24T15:12:30.4319959Z 157 │ │ requestPermission: async () => { 2026-10-24T15:12:30.4320125Z 158 │ │ const permission = await requestRecordingPermissionsAsync(); 2026-10-24T15:12:30.4320319Z 159 │ │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-24T15:12:30.4320395Z 160 │ │ }, 2026-10-24T15:12:30.4320542Z 161 │ │ configureRecording: configureVoiceRecordingAudio, 2026-10-24T15:12:30.4320680Z 162 │ │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-24T15:12:30.4320815Z 163 │ │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-24T15:12:30.4320927Z 164 │ │ onStateChange: (nextState) => 2026-10-24T15:12:30.4321017Z 165 │ │ setState({ 2026-10-24T15:12:30.4321117Z 166 │ │ state: nextState, 2026-10-24T15:12:30.4321253Z 167 │ │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-24T15:12:30.4321381Z 168 │ │ label: sessionRef.current?.label ?? null, 2026-10-24T15:12:30.4321461Z 169 │ │ }), 2026-10-24T15:12:30.4321596Z 170 │ ├─▶ }); 2026-10-24T15:12:30.4321799Z · ╰──── Cannot access ref value during render 2026-10-24T15:12:30.4321855Z 171 │ } 2026-10-24T15:12:30.4321906Z ╰──── 2026-10-24T15:12:30.4322375Z  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-24T15:12:30.4322665Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4322667Z 2026-10-24T15:12:30.4322811Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4322972Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15] 2026-10-24T15:12:30.4323059Z 153 │ recorderRef.current = recorder; 2026-10-24T15:12:30.4323161Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T15:12:30.4323273Z ·  ─────┬────────┬─── 2026-10-24T15:12:30.4323455Z · │ ╰── Cannot update ref value during render 2026-10-24T15:12:30.4323592Z · ╰── This value is a ref 2026-10-24T15:12:30.4323656Z 155 │ recorder, 2026-10-24T15:12:30.4323707Z ╰──── 2026-10-24T15:12:30.4324228Z  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-24T15:12:30.4324558Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4324560Z 2026-10-24T15:12:30.4324705Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4324861Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7] 2026-10-24T15:12:30.4324947Z 184 │ return () => subscription.remove(); 2026-10-24T15:12:30.4325012Z 185 │ }, [controller]); 2026-10-24T15:12:30.4325089Z ·  ─────┬──── 2026-10-24T15:12:30.4325235Z · ╰── Cannot access ref value during render 2026-10-24T15:12:30.4325288Z 186 │ 2026-10-24T15:12:30.4325338Z ╰──── 2026-10-24T15:12:30.4325811Z  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-24T15:12:30.4326105Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4326108Z 2026-10-24T15:12:30.4326249Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4326403Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6] 2026-10-24T15:12:30.4326490Z 184 │ return () => subscription.remove(); 2026-10-24T15:12:30.4326554Z 185 │ }, [controller]); 2026-10-24T15:12:30.4326631Z ·  ──────┬───── 2026-10-24T15:12:30.4326778Z · ╰── Cannot access ref value during render 2026-10-24T15:12:30.4326835Z 186 │ 2026-10-24T15:12:30.4326886Z ╰──── 2026-10-24T15:12:30.4327349Z  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-24T15:12:30.4327639Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4327642Z 2026-10-24T15:12:30.4327783Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4327939Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6] 2026-10-24T15:12:30.4327999Z 191 │ }, 2026-10-24T15:12:30.4328074Z 192 │ [controller, recorder], 2026-10-24T15:12:30.4328149Z ·  ─────┬──── 2026-10-24T15:12:30.4328292Z · ╰── Cannot access ref value during render 2026-10-24T15:12:30.4328346Z 193 │ ); 2026-10-24T15:12:30.4328397Z ╰──── 2026-10-24T15:12:30.4328866Z  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-24T15:12:30.4329160Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4329163Z 2026-10-24T15:12:30.4329357Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4329549Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20] 2026-10-24T15:12:30.4329639Z 174 │ const controller = session.controller; 2026-10-24T15:12:30.4329726Z 175 │ const recorder = recorderRef.current; 2026-10-24T15:12:30.4329830Z ·  ─────────┬───────── 2026-10-24T15:12:30.4330074Z · ╰── Cannot access ref value during render 2026-10-24T15:12:30.4330128Z 176 │ 2026-10-24T15:12:30.4330177Z ╰──── 2026-10-24T15:12:30.4330643Z  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-24T15:12:30.4330938Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4330945Z 2026-10-24T15:12:30.4331087Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4331244Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5] 2026-10-24T15:12:30.4331300Z 191 │ }, 2026-10-24T15:12:30.4331371Z 192 │ [controller, recorder], 2026-10-24T15:12:30.4331460Z ·  ───────────┬────────── 2026-10-24T15:12:30.4331605Z · ╰── Cannot access ref value during render 2026-10-24T15:12:30.4331660Z 193 │ ); 2026-10-24T15:12:30.4331712Z ╰──── 2026-10-24T15:12:30.4332185Z  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-24T15:12:30.4332476Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4332479Z 2026-10-24T15:12:30.4332618Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4332775Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20] 2026-10-24T15:12:30.4332867Z 245 │ return () => clearInterval(intervalId); 2026-10-24T15:12:30.4332976Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-24T15:12:30.4333063Z ·  ─────┬──── 2026-10-24T15:12:30.4333223Z · ╰── Cannot access ref value during render 2026-10-24T15:12:30.4333278Z 247 │ 2026-10-24T15:12:30.4333328Z ╰──── 2026-10-24T15:12:30.4333822Z  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-24T15:12:30.4334111Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4334114Z 2026-10-24T15:12:30.4334255Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4334411Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6] 2026-10-24T15:12:30.4334570Z 245 │ return () => clearInterval(intervalId); 2026-10-24T15:12:30.4334721Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-24T15:12:30.4334851Z ·  ────────────────────────┬─────────────────────── 2026-10-24T15:12:30.4335011Z · ╰── Cannot access ref value during render 2026-10-24T15:12:30.4335064Z 247 │ 2026-10-24T15:12:30.4335114Z ╰──── 2026-10-24T15:12:30.4335580Z  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-24T15:12:30.4335870Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4335877Z 2026-10-24T15:12:30.4336022Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4336178Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5] 2026-10-24T15:12:30.4336245Z 260 │ setOwnerFocused, 2026-10-24T15:12:30.4336305Z 261 │ session, 2026-10-24T15:12:30.4336377Z ·  ───┬─── 2026-10-24T15:12:30.4336514Z · ╰── Cannot access ref value during render 2026-10-24T15:12:30.4336573Z 262 │ stop, 2026-10-24T15:12:30.4336624Z ╰──── 2026-10-24T15:12:30.4337090Z  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-24T15:12:30.4337384Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4337389Z 2026-10-24T15:12:30.4337530Z ⚠ react(refs): Cannot access refs during render 2026-10-24T15:12:30.4337687Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10] 2026-10-24T15:12:30.4337741Z 250 │ 2026-10-24T15:12:30.4337881Z 251 │ ╭─▶ return { 2026-10-24T15:12:30.4338094Z 252 │ │ isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null, 2026-10-24T15:12:30.4338175Z 253 │ │ state, 2026-10-24T15:12:30.4338264Z 254 │ │ audioLevels, 2026-10-24T15:12:30.4338365Z 255 │ │ elapsedSeconds, 2026-10-24T15:12:30.4338496Z 256 │ │ isBusy: voiceInputBlocksSubmission(state), 2026-10-24T15:12:30.4338578Z 257 │ │ ownerKey, 2026-10-24T15:12:30.4338657Z 258 │ │ label, 2026-10-24T15:12:30.4338746Z 259 │ │ focusedOwners, 2026-10-24T15:12:30.4338839Z 260 │ │ setOwnerFocused, 2026-10-24T15:12:30.4338920Z 261 │ │ session, 2026-10-24T15:12:30.4338998Z 262 │ │ stop, 2026-10-24T15:12:30.4339077Z 263 │ │ cancel, 2026-10-24T15:12:30.4339204Z 264 │ ├─▶ }; 2026-10-24T15:12:30.4339461Z · ╰──── Cannot access ref value during render 2026-10-24T15:12:30.4339552Z 265 │ } 2026-10-24T15:12:30.4339603Z ╰──── 2026-10-24T15:12:30.4340070Z  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-24T15:12:30.4340359Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T15:12:30.4340362Z 2026-10-24T15:12:30.4340521Z ⚠ react(immutability): This value cannot be modified 2026-10-24T15:12:30.4340680Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-24T15:12:30.4340843Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-24T15:12:30.4340968Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-24T15:12:30.4341048Z ·  ─────┬───── 2026-10-24T15:12:30.4341184Z · ╰── `audioLevels` originates here 2026-10-24T15:12:30.4341302Z 123 │ const sessionRef = useRef(null); 2026-10-24T15:12:30.4341447Z 124 │ const recorderRef = useRef | null>(null); 2026-10-24T15:12:30.4341500Z 125 │ 2026-10-24T15:12:30.4341604Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T15:12:30.4341705Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T15:12:30.4341843Z 128 │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-24T15:12:30.4341938Z 129 │ onStatus: (status: RecordingStatus) => { 2026-10-24T15:12:30.4342066Z 130 │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-24T15:12:30.4342154Z 131 │ isFinished: status.isFinished, 2026-10-24T15:12:30.4342295Z 132 │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-24T15:12:30.4342369Z 133 │ error: status.error, 2026-10-24T15:12:30.4342437Z 134 │ url: status.url, 2026-10-24T15:12:30.4342495Z 135 │ }); 2026-10-24T15:12:30.4342550Z 136 │ }, 2026-10-24T15:12:30.4342716Z 137 │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-24T15:12:30.4342794Z 138 │ selectInput: (inputs) => { 2026-10-24T15:12:30.4342917Z 139 │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-24T15:12:30.4343028Z 140 │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-24T15:12:30.4343226Z 141 │ const known = microphoneOrder(preferences.value.microphones); 2026-10-24T15:12:30.4343365Z 142 │ const order = rememberMicrophones(known, inputs); 2026-10-24T15:12:30.4343437Z 143 │ if (order !== known) { 2026-10-24T15:12:30.4343589Z 144 │ registry.set(updateMobilePreferencesAtom, { 2026-10-24T15:12:30.4343673Z 145 │ transform: (current) => ({ 2026-10-24T15:12:30.4343846Z 146 │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-24T15:12:30.4343907Z 147 │ }), 2026-10-24T15:12:30.4343967Z 148 │ }); 2026-10-24T15:12:30.4344025Z 149 │ } 2026-10-24T15:12:30.4344134Z 150 │ return preferredMicrophoneInput(inputs, order); 2026-10-24T15:12:30.4344191Z 151 │ }, 2026-10-24T15:12:30.4344244Z 152 │ }); 2026-10-24T15:12:30.4344326Z 153 │ recorderRef.current = recorder; 2026-10-24T15:12:30.4344434Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T15:12:30.4344498Z 155 │ recorder, 2026-10-24T15:12:30.4344597Z 156 │ getTranscriber: getLocalVoiceTranscriber, 2026-10-24T15:12:30.4344681Z 157 │ requestPermission: async () => { 2026-10-24T15:12:30.4344813Z 158 │ const permission = await requestRecordingPermissionsAsync(); 2026-10-24T15:12:30.4344968Z 159 │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-24T15:12:30.4345024Z 160 │ }, 2026-10-24T15:12:30.4345132Z 161 │ configureRecording: configureVoiceRecordingAudio, 2026-10-24T15:12:30.4345239Z 162 │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-24T15:12:30.4345341Z 163 │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-24T15:12:30.4345422Z 164 │ onStateChange: (nextState) => 2026-10-24T15:12:30.4345492Z 165 │ setState({ 2026-10-24T15:12:30.4345564Z 166 │ state: nextState, 2026-10-24T15:12:30.4345668Z 167 │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-24T15:12:30.4345766Z 168 │ label: sessionRef.current?.label ?? null, 2026-10-24T15:12:30.4345824Z 169 │ }), 2026-10-24T15:12:30.4345879Z 170 │ }); 2026-10-24T15:12:30.4345931Z 171 │ } 2026-10-24T15:12:30.4345983Z 172 │ 2026-10-24T15:12:30.4346068Z 173 │ const session = sessionRef.current; 2026-10-24T15:12:30.4346155Z 174 │ const controller = session.controller; 2026-10-24T15:12:30.4346240Z 175 │ const recorder = recorderRef.current; 2026-10-24T15:12:30.4346292Z 176 │ 2026-10-24T15:12:30.4346357Z 177 │ useEffect(() => { 2026-10-24T15:12:30.4346506Z 178 │ const subscription = AppState.addEventListener("change", (nextState) => { 2026-10-24T15:12:30.4346652Z 179 │ // iOS reports `inactive` while its permission dialog is open. Only the 2026-10-24T15:12:30.4346796Z 180 │ // real background state cancels preparation; recorder status handles 2026-10-24T15:12:30.4346899Z 181 │ // calls and route interruptions during capture. 2026-10-24T15:12:30.4347035Z 182 │ if (nextState === "background") controller.appMovedToBackground(); 2026-10-24T15:12:30.4347090Z 183 │ }); 2026-10-24T15:12:30.4347175Z 184 │ return () => subscription.remove(); 2026-10-24T15:12:30.4347243Z 185 │ }, [controller]); 2026-10-24T15:12:30.4347294Z 186 │ 2026-10-24T15:12:30.4347354Z 187 │ useEffect( 2026-10-24T15:12:30.4347416Z 188 │ () => () => { 2026-10-24T15:12:30.4347487Z 189 │ controller.dispose(); 2026-10-24T15:12:30.4347553Z 190 │ recorder.release(); 2026-10-24T15:12:30.4347609Z 191 │ }, 2026-10-24T15:12:30.4347738Z 192 │ [controller, recorder], 2026-10-24T15:12:30.4347831Z 193 │ ); 2026-10-24T15:12:30.4347882Z 194 │ 2026-10-24T15:12:30.4347946Z 195 │ useEffect(() => { 2026-10-24T15:12:30.4348038Z 196 │ if (state.phase !== "recording") return; 2026-10-24T15:12:30.4348090Z 197 │ 2026-10-24T15:12:30.4348236Z 198 │ const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`; 2026-10-24T15:12:30.4348341Z 199 │ const activation = activateKeepAwakeAsync(tag); 2026-10-24T15:12:30.4348424Z 200 │ void activation.catch(() => {}); 2026-10-24T15:12:30.4348487Z 201 │ return () => { 2026-10-24T15:12:30.4348636Z 202 │ // Release after activation settles, even if the recording ends immediately. 2026-10-24T15:12:30.4348774Z 203 │ void activation.then(() => deactivateKeepAwake(tag)).catch(() => {}); 2026-10-24T15:12:30.4348829Z 204 │ }; 2026-10-24T15:12:30.4348915Z 205 │ }, [keepAwakeId, state.phase]); 2026-10-24T15:12:30.4348969Z 206 │ 2026-10-24T15:12:30.4349031Z 207 │ useEffect(() => { 2026-10-24T15:12:30.4349163Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-24T15:12:30.4349214Z 209 │ 2026-10-24T15:12:30.4349334Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-24T15:12:30.4349490Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-24T15:12:30.4349593Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-24T15:12:30.4349670Z ·  ─────┬───── 2026-10-24T15:12:30.4349810Z · ╰── `audioLevels` cannot be modified 2026-10-24T15:12:30.4349865Z 213 │ } 2026-10-24T15:12:30.4349917Z ╰──── 2026-10-24T15:12:30.4350192Z  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-24T15:12:30.4350503Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T15:12:30.4350506Z 2026-10-24T15:12:30.4350708Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T15:12:30.4350867Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-24T15:12:30.4350920Z 206 │ 2026-10-24T15:12:30.4350982Z 207 │ useEffect(() => { 2026-10-24T15:12:30.4351060Z ·  ───┬─── 2026-10-24T15:12:30.4351280Z · ╰── This function may (indirectly) reassign or modify `audioLevels` after render 2026-10-24T15:12:30.4351422Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-24T15:12:30.4351477Z 209 │ 2026-10-24T15:12:30.4351596Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-24T15:12:30.4351749Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-24T15:12:30.4351851Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-24T15:12:30.4351927Z ·  ─────┬───── 2026-10-24T15:12:30.4352060Z · ╰── This modifies `audioLevels` 2026-10-24T15:12:30.4352115Z 213 │ } 2026-10-24T15:12:30.4352166Z ╰──── 2026-10-24T15:12:30.4352507Z  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-24T15:12:30.4352875Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T15:12:30.4352984Z 2026-10-24T15:12:30.4353355Z ⚠ 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-24T15:12:30.4353469Z ╭─[packages/contracts/src/auth.test.ts:17:12] 2026-10-24T15:12:30.4353674Z 16 │ it("decodes legacy review credentials without offering them in new grants", () => { 2026-10-24T15:12:30.4353842Z 17 │ expect(Schema.decodeUnknownSync(AuthEnvironmentScopes)(["review:write"])).toEqual([ 2026-10-24T15:12:30.4353944Z ·  ──────────────────────── 2026-10-24T15:12:30.4354011Z 18 │ "review:write", 2026-10-24T15:12:30.4354063Z ╰──── 2026-10-24T15:12:30.4354065Z 2026-10-24T15:12:30.4354437Z ⚠ 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-24T15:12:30.4354552Z ╭─[packages/contracts/src/auth.test.ts:20:18] 2026-10-24T15:12:30.4354608Z 19 │ ]); 2026-10-24T15:12:30.4354771Z 20 │ expect(() => Schema.decodeUnknownSync(AuthGrantScopes)(["review:write"])).toThrow(); 2026-10-24T15:12:30.4354876Z ·  ──────────────────────── 2026-10-24T15:12:30.4355007Z 21 │ expect(AuthStandardClientScopes).not.toContain("review:write"); 2026-10-24T15:12:30.4355058Z ╰──── 2026-10-24T15:12:30.4355061Z 2026-10-24T15:12:30.4355430Z ⚠ 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-24T15:12:30.4355542Z ╭─[packages/contracts/src/auth.test.ts:58:21] 2026-10-24T15:12:30.4355712Z 57 │ it("ignores unknown response permissions without falling back to broader scopes", () => { 2026-10-24T15:12:30.4355836Z 58 │ const session = Schema.decodeUnknownSync(AuthSessionState)({ 2026-10-24T15:12:30.4355944Z ·  ──────────────────────── 2026-10-24T15:12:30.4356012Z 59 │ authenticated: true, 2026-10-24T15:12:30.4356065Z ╰──── 2026-10-24T15:12:30.4356067Z 2026-10-24T15:12:30.4356270Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T15:12:30.4356432Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:155:7] 2026-10-24T15:12:30.4356487Z 154 │ } 2026-10-24T15:12:30.4356561Z 155 │ }, [wrappedRender]); 2026-10-24T15:12:30.4356645Z ·  ──────┬────── 2026-10-24T15:12:30.4356795Z · ╰── Unnecessary dependency `wrappedRender` 2026-10-24T15:12:30.4356847Z 156 │ 2026-10-24T15:12:30.4356897Z ╰──── 2026-10-24T15:12:30.4357193Z  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-24T15:12:30.4357507Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.4357510Z 2026-10-24T15:12:30.4357754Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T15:12:30.4357971Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:800:42] 2026-10-24T15:12:30.4358058Z 799 │ > 2026-10-24T15:12:30.4358184Z 800 │ 2026-10-24T15:12:30.4358307Z ·  ──────────────────── 2026-10-24T15:12:30.4358406Z 801 │ 2026-10-24T15:12:30.4358457Z ╰──── 2026-10-24T15:12:30.4358685Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T15:12:30.4358824Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T15:12:30.4358827Z 2026-10-24T15:12:30.4358995Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T15:12:30.4359132Z ╭─[apps/web/src/components/CommandPalette.tsx:2037:20] 2026-10-24T15:12:30.4359254Z 2036 │ title: inferProjectTitleFromPath(destinationPath), 2026-10-24T15:12:30.4359347Z 2037 │ createdAt: new Date().toISOString(), 2026-10-24T15:12:30.4359438Z ·  ─────┬──── 2026-10-24T15:12:30.4359581Z · ╰── Cannot call impure function 2026-10-24T15:12:30.4359689Z 2038 │ remoteUrl: addProjectCloneFlow.remoteUrl, 2026-10-24T15:12:30.4359742Z ╰──── 2026-10-24T15:12:30.4360024Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T15:12:30.4360321Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T15:12:30.4360324Z 2026-10-24T15:12:30.4360486Z ⚠ react(immutability): This value cannot be modified 2026-10-24T15:12:30.4360649Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:42:5] 2026-10-24T15:12:30.4360703Z 35 │ 2026-10-24T15:12:30.4360840Z 36 │ const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0); 2026-10-24T15:12:30.4360926Z ·  ────────┬──────── 2026-10-24T15:12:30.4361073Z · ╰── `inspectorProgress` originates here 2026-10-24T15:12:30.4361168Z 37 │ const { renderedInspectorWidth } = props; 2026-10-24T15:12:30.4361298Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-24T15:12:30.4361350Z 39 │ 2026-10-24T15:12:30.4361430Z 40 │ const onClosed = props.onClosed; 2026-10-24T15:12:30.4361496Z 41 │ useEffect(() => { 2026-10-24T15:12:30.4361591Z 42 │ inspectorProgress.value = withTiming( 2026-10-24T15:12:30.4361678Z ·  ────────┬──────── 2026-10-24T15:12:30.4361828Z · ╰── `inspectorProgress` cannot be modified 2026-10-24T15:12:30.4361905Z 43 │ inspectorVisible ? 1 : 0, 2026-10-24T15:12:30.4361955Z ╰──── 2026-10-24T15:12:30.4362224Z  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-24T15:12:30.4362531Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T15:12:30.4362533Z 2026-10-24T15:12:30.4362688Z ⚠ react(immutability): This value cannot be modified 2026-10-24T15:12:30.4362906Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:67:7] 2026-10-24T15:12:30.4363032Z 37 │ const { renderedInspectorWidth } = props; 2026-10-24T15:12:30.4363162Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-24T15:12:30.4363252Z ·  ──────────┬───────── 2026-10-24T15:12:30.4363405Z · ╰── `renderedContentWidth` originates here 2026-10-24T15:12:30.4363457Z 39 │ 2026-10-24T15:12:30.4363535Z 40 │ const onClosed = props.onClosed; 2026-10-24T15:12:30.4363626Z 41 │ useEffect(() => { 2026-10-24T15:12:30.4363713Z 42 │ inspectorProgress.value = withTiming( 2026-10-24T15:12:30.4363790Z 43 │ inspectorVisible ? 1 : 0, 2026-10-24T15:12:30.4363860Z 44 │ WORKSPACE_PANE_TIMING, 2026-10-24T15:12:30.4363925Z 45 │ (finished) => { 2026-10-24T15:12:30.4364070Z 46 │ if (finished === true && !inspectorVisible && onClosed !== undefined) { 2026-10-24T15:12:30.4364147Z 47 │ runOnJS(onClosed)(); 2026-10-24T15:12:30.4364203Z 48 │ } 2026-10-24T15:12:30.4364258Z 49 │ }, 2026-10-24T15:12:30.4364311Z 50 │ ); 2026-10-24T15:12:30.4364442Z 51 │ const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0; 2026-10-24T15:12:30.4364520Z 52 │ renderedInspectorWidth.set( 2026-10-24T15:12:30.4364662Z 53 │ resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING), 2026-10-24T15:12:30.4364715Z 54 │ ); 2026-10-24T15:12:30.4364768Z 55 │ }, [ 2026-10-24T15:12:30.4364836Z 56 │ inspectorProgress, 2026-10-24T15:12:30.4364902Z 57 │ inspectorVisible, 2026-10-24T15:12:30.4364963Z 58 │ inspectorWidth, 2026-10-24T15:12:30.4365022Z 59 │ onClosed, 2026-10-24T15:12:30.4365101Z 60 │ renderedInspectorWidth, 2026-10-24T15:12:30.4365161Z 61 │ resizing, 2026-10-24T15:12:30.4365215Z 62 │ ]); 2026-10-24T15:12:30.4365266Z 63 │ 2026-10-24T15:12:30.4365328Z 64 │ useEffect(() => { 2026-10-24T15:12:30.4365418Z 65 │ const targetWidth = inspectorWidth ?? 0; 2026-10-24T15:12:30.4365504Z 66 │ if (!inspectorVisible || resizing) { 2026-10-24T15:12:30.4365602Z 67 │ renderedContentWidth.value = targetWidth; 2026-10-24T15:12:30.4365689Z ·  ──────────┬───────── 2026-10-24T15:12:30.4365849Z · ╰── `renderedContentWidth` cannot be modified 2026-10-24T15:12:30.4365908Z 68 │ return; 2026-10-24T15:12:30.4365960Z ╰──── 2026-10-24T15:12:30.4366226Z  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-24T15:12:30.4366589Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T15:12:30.4366626Z 2026-10-24T15:12:30.4366909Z ⚠ eslint(no-unused-vars): Variable 'legacyCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-24T15:12:30.4367066Z ╭─[packages/provider-cursor/src/server/credentialStore.test.ts:15:7] 2026-10-24T15:12:30.4367118Z 14 │ 2026-10-24T15:12:30.4367189Z 15 │ const legacyCredentials = { 2026-10-24T15:12:30.4367273Z ·  ────────┬──────── 2026-10-24T15:12:30.4367418Z · ╰── 'legacyCredentials' is declared here 2026-10-24T15:12:30.4367485Z 16 │ version: 1 as const, 2026-10-24T15:12:30.4367534Z ╰──── 2026-10-24T15:12:30.4367646Z  help: Consider removing this declaration. 2026-10-24T15:12:30.4367653Z 2026-10-24T15:12:30.4367933Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-24T15:12:30.4368065Z ╭─[packages/provider-cursor/src/server/auth.ts:249:20] 2026-10-24T15:12:30.4368120Z 248 │ }, 2026-10-24T15:12:30.4368201Z 249 │ (effect, flow, stopSessions) => 2026-10-24T15:12:30.4368294Z ·  ──────┬───── 2026-10-24T15:12:30.4368442Z · ╰── 'stopSessions' is declared here 2026-10-24T15:12:30.4368506Z 250 │ effect.pipe( 2026-10-24T15:12:30.4368556Z ╰──── 2026-10-24T15:12:30.4368658Z  help: Consider removing this parameter. 2026-10-24T15:12:30.4368661Z 2026-10-24T15:12:30.4368875Z ⚠ eslint(no-unused-vars): Function 'nonEmptyString' is declared but never used. 2026-10-24T15:12:30.4369027Z ╭─[packages/client-runtime/src/work-log/presentation.ts:237:10] 2026-10-24T15:12:30.4369079Z 236 │ 2026-10-24T15:12:30.4369197Z 237 │ function nonEmptyString(value: unknown): string | null { 2026-10-24T15:12:30.4369281Z ·  ───────┬────── 2026-10-24T15:12:30.4369424Z · ╰── 'nonEmptyString' is declared here 2026-10-24T15:12:30.4369566Z 238 │ return typeof value === "string" && value.trim().length > 0 ? value : null; 2026-10-24T15:12:30.4369618Z ╰──── 2026-10-24T15:12:30.4369721Z  help: Consider removing this declaration. 2026-10-24T15:12:30.4369724Z 2026-10-24T15:12:30.4370061Z ⚠ unicorn(prefer-string-starts-ends-with): Prefer String#startsWith over a regex with a caret. 2026-10-24T15:12:30.4370187Z ╭─[apps/server/src/vcs/GitVcsDriverCore.ts:517:11] 2026-10-24T15:12:30.4370288Z 516 │ GIT_DIAGNOSTIC_LINE_PATTERN.test(line) || 2026-10-24T15:12:30.4370425Z 517 │ (!/^remote:/.test(line) && SSH_TRANSPORT_REFUSAL_PATTERN.test(line)), 2026-10-24T15:12:30.4370511Z ·  ─────────────── 2026-10-24T15:12:30.4370565Z 518 │ ) 2026-10-24T15:12:30.4370616Z ╰──── 2026-10-24T15:12:30.4370770Z  help: Replace `/^remote:/.test(line)` with `line.startsWith('remote:')`. 2026-10-24T15:12:30.4370773Z 2026-10-24T15:12:30.4370976Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T15:12:30.4371139Z ╭─[apps/web/src/components/settings/ProviderSettingsPanel.logic.ts:4:8] 2026-10-24T15:12:30.4371286Z 3 │ AuthProvidersManageScope, 2026-10-24T15:12:30.4371395Z 4 │ type AuthSessionState, 2026-10-24T15:12:30.4371477Z ·  ────────┬─────── 2026-10-24T15:12:30.4371623Z · ╰── 'AuthSessionState' is imported here 2026-10-24T15:12:30.4371690Z 5 │ type EnvironmentId, 2026-10-24T15:12:30.4371742Z ╰──── 2026-10-24T15:12:30.4371840Z  help: Consider removing this import. 2026-10-24T15:12:30.4371842Z 2026-10-24T15:12:30.4372200Z ⚠ 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-24T15:12:30.4372339Z ╭─[apps/server/src/vcs/GitVcsDriverCore.test.ts:1786:34] 2026-10-24T15:12:30.4372481Z 1785 │ const stat = branch.files!.find((file) => file.path === path)!; 2026-10-24T15:12:30.4372632Z 1786 │ const request = yield* Schema.decodeEffect(ReviewDiffPreviewInput)({ 2026-10-24T15:12:30.4372748Z ·  ─────────────────── 2026-10-24T15:12:30.4372811Z 1787 │ cwd, 2026-10-24T15:12:30.4372863Z ╰──── 2026-10-24T15:12:30.4372866Z 2026-10-24T15:12:30.4373123Z ⚠ eslint(no-unused-vars): Function 'promptResponseHasMissingXAiStopReason' is declared but never used. 2026-10-24T15:12:30.4373273Z ╭─[packages/provider-grok/src/server/xaiAcpExtension.ts:1620:10] 2026-10-24T15:12:30.4373326Z 1619 │ 2026-10-24T15:12:30.4373535Z 1620 │ function promptResponseHasMissingXAiStopReason(response: EffectAcpSchema.PromptResponse): boolean { 2026-10-24T15:12:30.4373683Z ·  ──────────────────┬────────────────── 2026-10-24T15:12:30.4373893Z · ╰── 'promptResponseHasMissingXAiStopReason' is declared here 2026-10-24T15:12:30.4373975Z 1621 │ const meta = response._meta; 2026-10-24T15:12:30.4374027Z ╰──── 2026-10-24T15:12:30.4374130Z  help: Consider removing this declaration. 2026-10-24T15:12:30.4374133Z 2026-10-24T15:12:30.4374390Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T15:12:30.4374518Z ╭─[packages/provider-grok/src/server/adapter.ts:408:7] 2026-10-24T15:12:30.4374573Z 407 │ 2026-10-24T15:12:30.4374643Z 408 │ const layer: Layer.Layer< 2026-10-24T15:12:30.4374713Z ·  ──┬── 2026-10-24T15:12:30.4374835Z · ╰── 'layer' is declared here 2026-10-24T15:12:30.4374932Z 409 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T15:12:30.4374987Z ╰──── 2026-10-24T15:12:30.4375089Z  help: Consider removing this declaration. 2026-10-24T15:12:30.4375091Z 2026-10-24T15:12:30.4375289Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T15:12:30.4375403Z ╭─[apps/mobile/src/state/thread-order.ts:29:7] 2026-10-24T15:12:30.4375478Z 28 │ getPendingThreadOrder(); 2026-10-24T15:12:30.4375558Z 29 │ }, [nowMinute, snoozeWakeTick]); 2026-10-24T15:12:30.4375679Z ·  ────┬──── ───────┬────── 2026-10-24T15:12:30.4375870Z · │ ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T15:12:30.4376010Z · ╰── Unnecessary dependency `nowMinute` 2026-10-24T15:12:30.4376133Z 30 │ return pending; 2026-10-24T15:12:30.4376222Z ╰──── 2026-10-24T15:12:30.4376519Z  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-24T15:12:30.4376834Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T15:12:30.4376837Z 2026-10-24T15:12:30.4377097Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T15:12:30.4377225Z ╭─[apps/mobile/src/state/use-vcs-action-state.ts:86:5] 2026-10-24T15:12:30.4377333Z 83 │ const [nowMs, setNowMs] = useState(() => Date.now()); 2026-10-24T15:12:30.4377397Z 84 │ useEffect(() => { 2026-10-24T15:12:30.4377473Z ·  ────┬──── 2026-10-24T15:12:30.4377608Z · ╰── This is the containing effect 2026-10-24T15:12:30.4377694Z 85 │ if (!actionState.isRunning) return; 2026-10-24T15:12:30.4377762Z 86 │ setNowMs(Date.now()); 2026-10-24T15:12:30.4377831Z ·  ────┬─── 2026-10-24T15:12:30.4377997Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T15:12:30.4378122Z 87 │ const interval = setInterval(() => setNowMs(Date.now()), 1000); 2026-10-24T15:12:30.4378173Z ╰──── 2026-10-24T15:12:30.4378789Z  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-24T15:12:30.4379119Z  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-24T15:12:30.4379122Z 2026-10-24T15:12:30.4379326Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T15:12:30.4379455Z ╭─[packages/client-runtime/src/state/filesystem.ts:3:8] 2026-10-24T15:12:30.4379526Z 2 │ AuthFilesystemReadScope, 2026-10-24T15:12:30.4379595Z 3 │ type AuthSessionState, 2026-10-24T15:12:30.4379680Z ·  ────────┬─────── 2026-10-24T15:12:30.4379824Z · ╰── 'AuthSessionState' is imported here 2026-10-24T15:12:30.4379899Z 4 │ type FilesystemBrowseEntry, 2026-10-24T15:12:30.4379955Z ╰──── 2026-10-24T15:12:30.4380057Z  help: Consider removing this import. 2026-10-24T15:12:30.4380059Z 2026-10-24T15:12:30.4380245Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-24T15:12:30.4380369Z ╭─[packages/client-runtime/src/state/shell.ts:189:5] 2026-10-24T15:12:30.4380480Z 186 │ let waiting = yield* Ref.get(awaitingCompletion); 2026-10-24T15:12:30.4380548Z 187 │ let next = initial; 2026-10-24T15:12:30.4380617Z ·  ──┬─ 2026-10-24T15:12:30.4380738Z · ╰── From this accumulator 2026-10-24T15:12:30.4380818Z 188 │ let receivedSnapshot = false; 2026-10-24T15:12:30.4380894Z 189 │ for (const item of items) { 2026-10-24T15:12:30.4380962Z ·  ─┬─ 2026-10-24T15:12:30.4381121Z · ╰── For this loop 2026-10-24T15:12:30.4381243Z 190 │ if (item.kind === "synchronized") { 2026-10-24T15:12:30.4381309Z 191 │ waiting = false; 2026-10-24T15:12:30.4381399Z 192 │ if (Option.isSome(next.snapshot)) { 2026-10-24T15:12:30.4381517Z 193 │ next = { ...next, status: "live", error: Option.none() }; 2026-10-24T15:12:30.4381603Z ·  ───┬─── 2026-10-24T15:12:30.4381734Z · ╰── From this spread 2026-10-24T15:12:30.4381792Z 194 │ } 2026-10-24T15:12:30.4381843Z ╰──── 2026-10-24T15:12:30.4382000Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-24T15:12:30.4382156Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T15:12:30.4382158Z 2026-10-24T15:12:30.4382640Z ⚠ 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-24T15:12:30.4382797Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1680:7] 2026-10-24T15:12:30.4382889Z 1679 │ yield* harness.replaceSession; 2026-10-24T15:12:30.4383104Z 1680 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T15:12:30.4383258Z 1681 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) { 2026-10-24T15:12:30.4383345Z 1682 │ │ break; 2026-10-24T15:12:30.4383425Z 1683 │ │ } 2026-10-24T15:12:30.4383539Z 1684 │ │ yield* Effect.yieldNow; 2026-10-24T15:12:30.4383707Z 1685 │ ╰─▶ } 2026-10-24T15:12:30.4383782Z 1686 │ yield* Queue.offer( 2026-10-24T15:12:30.4383834Z ╰──── 2026-10-24T15:12:30.4383837Z 2026-10-24T15:12:30.4384313Z ⚠ 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-24T15:12:30.4384467Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1789:7] 2026-10-24T15:12:30.4384556Z 1788 │ yield* harness.replaceSession; 2026-10-24T15:12:30.4384764Z 1789 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T15:12:30.4384931Z 1790 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break; 2026-10-24T15:12:30.4385039Z 1791 │ │ yield* Effect.yieldNow; 2026-10-24T15:12:30.4385172Z 1792 │ ╰─▶ } 2026-10-24T15:12:30.4385301Z 1793 │ expect(yield* Ref.get(harness.subscriptionCount)).toBe(2); 2026-10-24T15:12:30.4385354Z ╰──── 2026-10-24T15:12:30.4385357Z 2026-10-24T15:12:30.4385696Z ⚠ 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-24T15:12:30.4385842Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:50:18] 2026-10-24T15:12:30.4386004Z 49 │ for (const tool of ["sendMessage", "followupTask", "interruptAgent", "listAgents"]) { 2026-10-24T15:12:30.4386227Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-24T15:12:30.4386344Z ·  ───────── 2026-10-24T15:12:30.4386523Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-24T15:12:30.4386573Z ╰──── 2026-10-24T15:12:30.4386576Z 2026-10-24T15:12:30.4386909Z ⚠ 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-24T15:12:30.4387053Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:51:18] 2026-10-24T15:12:30.4387221Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-24T15:12:30.4387401Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-24T15:12:30.4387490Z ·  ───────── 2026-10-24T15:12:30.4387544Z 52 │ } 2026-10-24T15:12:30.4387595Z ╰──── 2026-10-24T15:12:30.4387598Z 2026-10-24T15:12:30.4387927Z ⚠ 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-24T15:12:30.4388068Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:55:5] 2026-10-24T15:12:30.4388132Z 54 │ assert.equal( 2026-10-24T15:12:30.4388303Z 55 │ Schema.is(CodexSchema.ServerNotification__CollabAgentToolCallStatus)("interrupted"), 2026-10-24T15:12:30.4388373Z ·  ───────── 2026-10-24T15:12:30.4388432Z 56 │ true, 2026-10-24T15:12:30.4388483Z ╰──── 2026-10-24T15:12:30.4388486Z 2026-10-24T15:12:30.4388823Z ⚠ 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-24T15:12:30.4388968Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:59:5] 2026-10-24T15:12:30.4389029Z 58 │ assert.equal( 2026-10-24T15:12:30.4389211Z 59 │ Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentToolCallStatus)("interrupted"), 2026-10-24T15:12:30.4389282Z ·  ───────── 2026-10-24T15:12:30.4389339Z 60 │ true, 2026-10-24T15:12:30.4389388Z ╰──── 2026-10-24T15:12:30.4389391Z 2026-10-24T15:12:30.4389721Z ⚠ 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-24T15:12:30.4389922Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:103:16] 2026-10-24T15:12:30.4390010Z 102 │ 2026-10-24T15:12:30.4390176Z 103 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse)(resumeResponse), true); 2026-10-24T15:12:30.4390261Z ·  ───────── 2026-10-24T15:12:30.4390315Z 104 │ }); 2026-10-24T15:12:30.4390367Z ╰──── 2026-10-24T15:12:30.4390369Z 2026-10-24T15:12:30.4390558Z ⚠ eslint(no-unused-vars): Identifier 'Arr' is imported but never used. 2026-10-24T15:12:30.4390691Z ╭─[packages/client-runtime/src/state/threadSort.ts:4:13] 2026-10-24T15:12:30.4390809Z 3 │ import type { EnvironmentThreadShell } from "./models.ts"; 2026-10-24T15:12:30.4390890Z 4 │ import * as Arr from "effect/Array"; 2026-10-24T15:12:30.4390961Z ·  ─┬─ 2026-10-24T15:12:30.4391085Z · ╰── 'Arr' is imported here 2026-10-24T15:12:30.4391176Z 5 │ import * as Order from "effect/Order"; 2026-10-24T15:12:30.4391232Z ╰──── 2026-10-24T15:12:30.4391330Z  help: Consider removing this import. 2026-10-24T15:12:30.4391332Z 2026-10-24T15:12:30.4391524Z ⚠ eslint(no-unused-vars): Identifier 'Order' is imported but never used. 2026-10-24T15:12:30.4391655Z ╭─[packages/client-runtime/src/state/threadSort.ts:5:13] 2026-10-24T15:12:30.4391736Z 4 │ import * as Arr from "effect/Array"; 2026-10-24T15:12:30.4391816Z 5 │ import * as Order from "effect/Order"; 2026-10-24T15:12:30.4391890Z ·  ──┬── 2026-10-24T15:12:30.4392020Z · ╰── 'Order' is imported here 2026-10-24T15:12:30.4392073Z 6 │ 2026-10-24T15:12:30.4392122Z ╰──── 2026-10-24T15:12:30.4392226Z  help: Consider removing this import. 2026-10-24T15:12:30.4392235Z 2026-10-24T15:12:30.4392520Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T15:12:30.4392677Z ╭─[apps/web/src/components/settings/SettingInheritance.tsx:163:24] 2026-10-24T15:12:30.4392733Z 162 │ keys, 2026-10-24T15:12:30.4392805Z 163 │ overridingProjects = [], 2026-10-24T15:12:30.4392888Z ·  ── 2026-10-24T15:12:30.4392955Z 164 │ onClearOverrides, 2026-10-24T15:12:30.4393006Z ╰──── 2026-10-24T15:12:30.4393328Z  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-24T15:12:30.4393330Z 2026-10-24T15:12:30.4393564Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-24T15:12:30.4393693Z ╭─[apps/web/src/contextMenuFallback.test.ts:38:9] 2026-10-24T15:12:30.4393759Z 37 │ get isConnected() { 2026-10-24T15:12:30.4393851Z 38 │ let current: FakeElement | null = this; 2026-10-24T15:12:30.4393924Z ·  ─────── 2026-10-24T15:12:30.4393996Z 39 │ while (current?.parent) { 2026-10-24T15:12:30.4394046Z ╰──── 2026-10-24T15:12:30.4394321Z  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-24T15:12:30.4394323Z 2026-10-24T15:12:30.4394965Z ⚠ 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-24T15:12:30.4395160Z ╭─[packages/client-runtime/src/connection/supervisor.test.ts:135:3] 2026-10-24T15:12:30.4395275Z 134 │ let lastState = yield* SubscriptionRef.get(state); 2026-10-24T15:12:30.4395492Z 135 │ ╭─▶ for (let iteration = 0; iteration < 100; iteration += 1) { 2026-10-24T15:12:30.4395629Z 136 │ │ lastState = yield* SubscriptionRef.get(state); 2026-10-24T15:12:30.4395735Z 137 │ │ if (predicate(lastState)) { 2026-10-24T15:12:30.4395834Z 138 │ │ return lastState; 2026-10-24T15:12:30.4395907Z 139 │ │ } 2026-10-24T15:12:30.4396009Z 140 │ │ yield* Effect.yieldNow; 2026-10-24T15:12:30.4396142Z 141 │ ╰─▶ } 2026-10-24T15:12:30.4396221Z 142 │ return yield* Effect.die( 2026-10-24T15:12:30.4396271Z ╰──── 2026-10-24T15:12:30.4396274Z 2026-10-24T15:12:30.4396543Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-24T15:12:30.4396660Z ╭─[apps/server/src/usage/UsageService.ts:169:7] 2026-10-24T15:12:30.4396714Z 168 │ 2026-10-24T15:12:30.4396791Z 169 │ const layerTest = Layer.succeed( 2026-10-24T15:12:30.4396866Z ·  ────┬──── 2026-10-24T15:12:30.4396999Z · ╰── 'layerTest' is declared here 2026-10-24T15:12:30.4397063Z 170 │ UsageService, 2026-10-24T15:12:30.4397114Z ╰──── 2026-10-24T15:12:30.4397219Z  help: Consider removing this declaration. 2026-10-24T15:12:30.4397221Z 2026-10-24T15:12:30.4397692Z ⚠ 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-24T15:12:30.4397827Z ╭─[apps/server/src/usage/UsageService.test.ts:2615:7] 2026-10-24T15:12:30.4397926Z 2614 │ let orphanedAt: number | undefined; 2026-10-24T15:12:30.4398155Z 2615 │ ╭─▶ for (let interruptAt = 1; interruptAt <= 31; interruptAt += 1) { 2026-10-24T15:12:30.4398278Z 2616 │ │ const tasks: Array<() => void> = []; 2026-10-24T15:12:30.4398427Z 2617 │ │ const dispatcher: Scheduler.SchedulerDispatcher = { 2026-10-24T15:12:30.4398563Z 2618 │ │ scheduleTask: (task) => tasks.push(task), 2026-10-24T15:12:30.4398665Z 2619 │ │ flush: () => { 2026-10-24T15:12:30.4398788Z 2620 │ │ let task: (() => void) | undefined; 2026-10-24T15:12:30.4398935Z 2621 │ │ while ((task = tasks.shift()) !== undefined) task(); 2026-10-24T15:12:30.4399018Z 2622 │ │ }, 2026-10-24T15:12:30.4399098Z 2623 │ │ }; 2026-10-24T15:12:30.4399168Z 2624 │ │ 2026-10-24T15:12:30.4399328Z 2625 │ │ let requestFiber: Fiber.Fiber | undefined; 2026-10-24T15:12:30.4399434Z 2626 │ │ let requestChecks = 0; 2026-10-24T15:12:30.4399563Z 2627 │ │ const scheduler: Scheduler.Scheduler = { 2026-10-24T15:12:30.4399730Z 2628 │ │ executionMode: "async", 2026-10-24T15:12:30.4399885Z 2629 │ │ makeDispatcher: () => dispatcher, 2026-10-24T15:12:30.4399996Z 2630 │ │ shouldYield: (fiber) => { 2026-10-24T15:12:30.4400128Z 2631 │ │ if (fiber !== requestFiber) return false; 2026-10-24T15:12:30.4400234Z 2632 │ │ requestChecks += 1; 2026-10-24T15:12:30.4400377Z 2633 │ │ if (requestChecks !== interruptAt) return false; 2026-10-24T15:12:30.4400492Z 2634 │ │ fiber.interruptUnsafe(); 2026-10-24T15:12:30.4400589Z 2635 │ │ return true; 2026-10-24T15:12:30.4400671Z 2636 │ │ }, 2026-10-24T15:12:30.4400751Z 2637 │ │ }; 2026-10-24T15:12:30.4400826Z 2638 │ │ 2026-10-24T15:12:30.4400950Z 2639 │ │ const input: UsageSummaryInput = { 2026-10-24T15:12:30.4401044Z 2640 │ │ ...WINDOW, 2026-10-24T15:12:30.4401173Z 2641 │ │ sinceDay: UsageDay.make("2026-09-01"), 2026-10-24T15:12:30.4401366Z 2642 │ │ untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`), 2026-10-24T15:12:30.4401445Z 2643 │ │ }; 2026-10-24T15:12:30.4401557Z 2644 │ │ const first = yield* service 2026-10-24T15:12:30.4401662Z 2645 │ │ .readSummary(input) 2026-10-24T15:12:30.4401750Z 2646 │ │ .pipe( 2026-10-24T15:12:30.4401846Z 2647 │ │ Effect.exit, 2026-10-24T15:12:30.4402012Z 2648 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-24T15:12:30.4402120Z 2649 │ │ Effect.forkChild, 2026-10-24T15:12:30.4402201Z 2650 │ │ ); 2026-10-24T15:12:30.4402303Z 2651 │ │ requestFiber = first; 2026-10-24T15:12:30.4402409Z 2652 │ │ yield* Effect.yieldNow; 2026-10-24T15:12:30.4402511Z 2653 │ │ dispatcher.flush(); 2026-10-24T15:12:30.4402580Z 2654 │ │ 2026-10-24T15:12:30.4402730Z 2655 │ │ const second = yield* service.readSummary(input).pipe( 2026-10-24T15:12:30.4402829Z 2656 │ │ Effect.match({ 2026-10-24T15:12:30.4402958Z 2657 │ │ onFailure: (error) => error.reason, 2026-10-24T15:12:30.4403086Z 2658 │ │ onSuccess: () => "success" as const, 2026-10-24T15:12:30.4403169Z 2659 │ │ }), 2026-10-24T15:12:30.4403325Z 2660 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-24T15:12:30.4403427Z 2661 │ │ Effect.forkChild, 2026-10-24T15:12:30.4403507Z 2662 │ │ ); 2026-10-24T15:12:30.4403639Z 2663 │ │ yield* Effect.yieldNow; 2026-10-24T15:12:30.4403740Z 2664 │ │ dispatcher.flush(); 2026-10-24T15:12:30.4403868Z 2665 │ │ const secondExit = second.pollUnsafe(); 2026-10-24T15:12:30.4403983Z 2666 │ │ if (secondExit === undefined) { 2026-10-24T15:12:30.4404153Z 2667 │ │ second.interruptUnsafe(); 2026-10-24T15:12:30.4404293Z 2668 │ │ orphanedAt = interruptAt; 2026-10-24T15:12:30.4404380Z 2669 │ │ break; 2026-10-24T15:12:30.4404459Z 2670 │ │ } 2026-10-24T15:12:30.4404579Z 2671 │ │ if (Exit.isFailure(secondExit)) { 2026-10-24T15:12:30.4404736Z 2672 │ │ assert.fail("the matching request fiber was interrupted"); 2026-10-24T15:12:30.4404815Z 2673 │ │ } 2026-10-24T15:12:30.4404966Z 2674 │ │ assert.strictEqual(secondExit.value, "invalidWindow"); 2026-10-24T15:12:30.4405101Z 2675 │ ╰─▶ } 2026-10-24T15:12:30.4405156Z 2676 │ 2026-10-24T15:12:30.4405208Z ╰──── 2026-10-24T15:12:30.4405217Z 2026-10-24T15:12:30.4405401Z ⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`. 2026-10-24T15:12:30.4405521Z ╭─[apps/web/src/terminal/ghostty/core.ts:194:19] 2026-10-24T15:12:30.4405643Z 193 │ const count = Math.min(CHUNK_SIZE, graphemeLength - start); 2026-10-24T15:12:30.4405733Z 194 │ const codes = new Array(count); 2026-10-24T15:12:30.4405841Z ·  ──────────────────────── 2026-10-24T15:12:30.4405943Z 195 │ for (let index = 0; index < count; index += 1) { 2026-10-24T15:12:30.4405994Z ╰──── 2026-10-24T15:12:30.4406421Z  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-24T15:12:30.4406430Z 2026-10-24T15:12:30.4406518Z Found 0 errors and 367 warnings in 5477 files (5.2s, 8 threads) 2026-10-24T15:12:30.4868830Z Post job cleanup. 2026-10-24T15:12:30.5547350Z Cache hit occurred on the primary key electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309, not saving cache. 2026-10-24T15:12:30.5642417Z Post job cleanup. 2026-10-24T15:12:30.5655606Z ##[start-action display=Cache full pnpm store;id=__aa3ca0c3-306a-4350-8da6-7264c814c0ff.__actions_cache] 2026-10-24T15:12:30.5992794Z Post job cleanup. 2026-10-24T15:12:30.6635678Z Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-fa50cf9b003d547cd32552f61b874eb4abe5dace3fdb4b1abd9610da2da24074, not saving cache. 2026-10-24T15:12:30.6675347Z ##[end-action id=__aa3ca0c3-306a-4350-8da6-7264c814c0ff.__actions_cache;outcome=success;conclusion=success;duration_ms=101] 2026-10-24T15:12:30.6677132Z ##[start-action display=Cache Vite+;id=__aa3ca0c3-306a-4350-8da6-7264c814c0ff.vp_cache] 2026-10-24T15:12:30.6698236Z Post job cleanup. 2026-10-24T15:12:30.7302655Z 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-24T15:12:30.7341570Z ##[end-action id=__aa3ca0c3-306a-4350-8da6-7264c814c0ff.vp_cache;outcome=success;conclusion=success;duration_ms=66] 2026-10-24T15:12:30.7377937Z Post job cleanup. 2026-10-24T15:12:30.7816312Z [command]/usr/local/bin/git version 2026-10-24T15:12:30.7849078Z git version 2.55.0 2026-10-24T15:12:30.7869256Z Temporarily overriding HOME='/home/runner/_work/_temp/2dad3bf7-8444-4f44-b205-abacdfaae8af' before making global git config changes 2026-10-24T15:12:30.7869894Z Adding repository directory to the temporary git global config as a safe directory 2026-10-24T15:12:30.7872861Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-24T15:12:30.7896896Z Removing SSH command configuration 2026-10-24T15:12:30.7900167Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-24T15:12:30.7924870Z [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-24T15:12:30.8066042Z fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules 2026-10-24T15:12:30.8121591Z ##[warning]The process '/usr/local/bin/git' failed with exit code 128 2026-10-24T15:12:30.8162878Z A job completed hook has been configured by the self-hosted runner administrator 2026-10-24T15:12:30.8190050Z ##[group]Run '/job_completed.sh' 2026-10-24T15:12:30.8203016Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T15:12:30.8203192Z env: 2026-10-24T15:12:30.8203306Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 173 2026-10-24T15:12:30.8203460Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 386 2026-10-24T15:12:30.8203641Z BLACKSMITH_CHECK_RUN_ID: 120907262757 2026-10-24T15:12:30.8203784Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-24T15:12:30.8203936Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-24T15:12:30.8204072Z ##[endgroup] 2026-10-24T15:12:30.8290421Z Docker container cache not activated, skipping hash computation. 2026-10-24T15:12:30.8592695Z No active SSH sessions detected. Proceeding with shutdown immediately. 2026-10-24T15:12:30.8636418Z Cleaning up orphan processes