2026-10-24T14:23:56.4030295Z Current runner version: '2.338.1' 2026-10-24T14:23:56.4033936Z Runner name: 'blacksmith-8vcpu-ubuntu-2404-qyni2tirgu5xhonc' 2026-10-24T14:23:56.4034670Z Runner group name: 'blacksmith scale sets - blacksmith-8vcpu-ubuntu-2404' 2026-10-24T14:23:56.4035461Z Machine name: 'ip-172-31-73-130' 2026-10-24T14:23:56.4037131Z ##[group]GITHUB_TOKEN Permissions 2026-10-24T14:23:56.4038506Z Contents: read 2026-10-24T14:23:56.4039065Z Metadata: read 2026-10-24T14:23:56.4039520Z ##[endgroup] 2026-10-24T14:23:56.4041594Z Secret source: None 2026-10-24T14:23:56.4042316Z Cache mode: write 2026-10-24T14:23:56.4042993Z Prepare workflow directory 2026-10-24T14:23:56.4231026Z Prepare all required actions 2026-10-24T14:23:56.4258122Z Getting action download info 2026-10-24T14:23:56.5521968Z Download action repository 'actions/checkout@v6' (SHA:d23441a48e516b6c34aea4fa41551a30e30af803) 2026-10-24T14:23:56.5897844Z Download action repository 'actions/cache@v6' (SHA:55cc8345863c7cc4c66a329aec7e433d2d1c52a9) 2026-10-24T14:23:56.7007794Z Setting BLACKSMITH_ACTIONS_RESULTS_URL to https://results-receiver.actions.githubusercontent.com/ 2026-10-24T14:23:56.7046013Z Complete job name: Lint 2026-10-24T14:23:56.7426850Z A job started hook has been configured by the self-hosted runner administrator 2026-10-24T14:23:56.7565146Z ##[group]Run '/setup.sh' 2026-10-24T14:23:56.7579244Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T14:23:56.7579660Z env: 2026-10-24T14:23:56.7579894Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 150 2026-10-24T14:23:56.7580185Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 397 2026-10-24T14:23:56.7580467Z BLACKSMITH_CHECK_RUN_ID: 120896785339 2026-10-24T14:23:56.7580785Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-24T14:23:56.7581065Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-24T14:23:56.7581331Z ##[endgroup] 2026-10-24T14:23:56.7833556Z Logging daemon started (blacksmithd for logs) 2026-10-24T14:23:56.7951719Z Results daemon started (blacksmithd for results) 2026-10-24T14:23:56.8090592Z Background adoption and SSH setup started (PID: 3063) 2026-10-24T14:23:56.8093487Z 2026-10-24T14:23:56.8093609Z ---------------------------------------- 2026-10-24T14:23:56.8094462Z View this job: https://app.blacksmith.sh/pingdotgg/runs/40102304653/jobs/120896785339 2026-10-24T14:23:56.8095091Z SSH Access (using your GitHub SSH key): 2026-10-24T14:23:56.8095517Z ssh -p 64000 runner@blacksmith-8vcpu-ubuntu-2404-qyni2tirgu5xhonc.vm.blacksmith.sh 2026-10-24T14:23:56.8095825Z 2026-10-24T14:23:56.8095933Z No GitHub SSH key? Add one at: 2026-10-24T14:23:56.8097843Z https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account 2026-10-24T14:23:56.8098249Z 2026-10-24T14:23:56.8098358Z ---------------------------------------- 2026-10-24T14:23:56.8098534Z 2026-10-24T14:23:56.8098684Z VM ID: blacksmith-8vcpu-ubuntu-2404-qyni2tirgu5xhonc 2026-10-24T14:23:56.8099008Z Host: production-152.236.41.222-x8664 2026-10-24T14:23:56.8099286Z Host Agent PID: 834438 2026-10-24T14:23:56.8099535Z Host Agent Git SHA: 1637818df 2026-10-24T14:23:56.8099896Z Host CPU Manufacturer: AuthenticAMD 2026-10-24T14:23:56.8100345Z Blacksmith Host Generation: gen 2 2026-10-24T14:23:56.8100844Z Petname: production-vast-pipefish-06d3d819 2026-10-24T14:23:56.8101290Z Region: us-east 2026-10-24T14:23:56.8101665Z Rootfs Version: ubuntu24-full-x64-081926 2026-10-24T14:23:56.8106428Z OS Version: Ubuntu 24.04.4 LTS 2026-10-24T14:23:56.8106807Z 2026-10-24T14:23:56.8107035Z Enabling Blacksmith transparent cache 2026-10-24T14:23:56.8411196Z ##[group]Run actions/checkout@v6 2026-10-24T14:23:56.8411525Z with: 2026-10-24T14:23:56.8411854Z sparse-checkout: /* !/.repos/ !/apps/mobile/modules/t3-terminal/Vendor/**/*.a 2026-10-24T14:23:56.8412250Z sparse-checkout-cone-mode: false 2026-10-24T14:23:56.8412533Z repository: pingdotgg/t3code 2026-10-24T14:23:56.8414357Z token: *** 2026-10-24T14:23:56.8414578Z ssh-strict: true 2026-10-24T14:23:56.8414800Z ssh-user: git 2026-10-24T14:23:56.8415031Z persist-credentials: true 2026-10-24T14:23:56.8415532Z clean: true 2026-10-24T14:23:56.8415750Z fetch-depth: 1 2026-10-24T14:23:56.8415974Z fetch-tags: false 2026-10-24T14:23:56.8416200Z show-progress: true 2026-10-24T14:23:56.8416598Z lfs: false 2026-10-24T14:23:56.8416816Z submodules: false 2026-10-24T14:23:56.8417049Z set-safe-directory: true 2026-10-24T14:23:56.8417307Z allow-unsafe-pr-checkout: false 2026-10-24T14:23:56.8417565Z env: 2026-10-24T14:23:56.8417810Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 150 2026-10-24T14:23:56.8418097Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 397 2026-10-24T14:23:56.8418381Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T14:23:56.8418642Z ##[endgroup] 2026-10-24T14:23:56.9682691Z Syncing repository: pingdotgg/t3code 2026-10-24T14:23:56.9683934Z ##[group]Getting Git version info 2026-10-24T14:23:56.9684287Z Working directory is '/home/runner/_work/t3code/t3code' 2026-10-24T14:23:56.9684905Z [command]/usr/local/bin/git version 2026-10-24T14:23:56.9745396Z git version 2.55.0 2026-10-24T14:23:56.9756432Z ##[endgroup] 2026-10-24T14:23:56.9763265Z Temporarily overriding HOME='/home/runner/_work/_temp/97eff923-da27-49b8-9d58-b8dfef6f2a61' before making global git config changes 2026-10-24T14:23:56.9763934Z Adding repository directory to the temporary git global config as a safe directory 2026-10-24T14:23:56.9766420Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-24T14:23:56.9798900Z Deleting the contents of '/home/runner/_work/t3code/t3code' 2026-10-24T14:23:56.9800506Z ##[group]Determining repository object format 2026-10-24T14:23:56.9801694Z ##[endgroup] 2026-10-24T14:23:56.9802058Z ##[group]Initializing the repository 2026-10-24T14:23:56.9804072Z [command]/usr/local/bin/git init /home/runner/_work/t3code/t3code 2026-10-24T14:23:56.9839545Z hint: Using 'master' as the name for the initial branch. This default branch name 2026-10-24T14:23:56.9840055Z hint: will change to "main" in Git 3.0. To configure the initial branch name 2026-10-24T14:23:56.9840539Z hint: to use in all of your new repositories, which will suppress this warning, 2026-10-24T14:23:56.9840936Z hint: call: 2026-10-24T14:23:56.9841148Z hint: 2026-10-24T14:23:56.9841429Z hint: git config --global init.defaultBranch 2026-10-24T14:23:56.9841733Z hint: 2026-10-24T14:23:56.9842022Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and 2026-10-24T14:23:56.9842475Z hint: 'development'. The just-created branch can be renamed via this command: 2026-10-24T14:23:56.9842840Z hint: 2026-10-24T14:23:56.9843064Z hint: git branch -m 2026-10-24T14:23:56.9843307Z hint: 2026-10-24T14:23:56.9843623Z hint: Disable this message with "git config set advice.defaultBranchName false" 2026-10-24T14:23:56.9844099Z Initialized empty Git repository in /home/runner/_work/t3code/t3code/.git/ 2026-10-24T14:23:56.9844969Z [command]/usr/local/bin/git remote add origin https://github.com/pingdotgg/t3code 2026-10-24T14:23:56.9870197Z ##[endgroup] 2026-10-24T14:23:56.9870599Z ##[group]Disabling automatic garbage collection 2026-10-24T14:23:56.9872871Z [command]/usr/local/bin/git config --local gc.auto 0 2026-10-24T14:23:56.9894512Z ##[endgroup] 2026-10-24T14:23:56.9894890Z ##[group]Setting up auth 2026-10-24T14:23:56.9895174Z Removing SSH command configuration 2026-10-24T14:23:56.9898930Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-24T14:23:56.9921570Z [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-24T14:23:57.0060040Z Removing HTTP extra header 2026-10-24T14:23:57.0062862Z [command]/usr/local/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader 2026-10-24T14:23:57.0087676Z [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-24T14:23:57.0206033Z Removing includeIf entries pointing to credentials config files 2026-10-24T14:23:57.0209239Z [command]/usr/local/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: 2026-10-24T14:23:57.0240315Z [command]/usr/local/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url 2026-10-24T14:23:57.0377072Z [command]/usr/local/bin/git config --file /home/runner/_work/_temp/git-credentials-de39ec16-bea5-4b9c-bffe-6079f22a5eaf.config http.https://github.com/.extraheader AUTHORIZATION: basic *** 2026-10-24T14:23:57.0408245Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git.path /home/runner/_work/_temp/git-credentials-de39ec16-bea5-4b9c-bffe-6079f22a5eaf.config 2026-10-24T14:23:57.0431597Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git/worktrees/*.path /home/runner/_work/_temp/git-credentials-de39ec16-bea5-4b9c-bffe-6079f22a5eaf.config 2026-10-24T14:23:57.0454626Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-de39ec16-bea5-4b9c-bffe-6079f22a5eaf.config 2026-10-24T14:23:57.0480213Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-de39ec16-bea5-4b9c-bffe-6079f22a5eaf.config 2026-10-24T14:23:57.0500243Z ##[endgroup] 2026-10-24T14:23:57.0500610Z ##[group]Fetching the repository 2026-10-24T14:23:57.0504761Z [command]/usr/local/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --filter=blob:none --depth=1 origin +cd72644f92665bc473e566ba1a0b762bcb3319f5:refs/remotes/pull/23848/merge 2026-10-24T14:23:57.3404593Z From https://github.com/pingdotgg/t3code 2026-10-24T14:23:57.3405279Z * [new ref] cd72644f92665bc473e566ba1a0b762bcb3319f5 -> pull/23848/merge 2026-10-24T14:23:57.3431452Z ##[endgroup] 2026-10-24T14:23:57.3431963Z ##[group]Determining the checkout info 2026-10-24T14:23:57.3432448Z ##[endgroup] 2026-10-24T14:23:57.3432863Z ##[group]Setting up sparse checkout 2026-10-24T14:23:57.3435684Z [command]/usr/local/bin/git config core.sparseCheckout true 2026-10-24T14:23:57.3465845Z [command]/usr/local/bin/git rev-parse --git-path info/sparse-checkout 2026-10-24T14:23:57.3486950Z .git/info/sparse-checkout 2026-10-24T14:23:57.3522961Z ##[endgroup] 2026-10-24T14:23:57.3523497Z ##[group]Checking out the ref 2026-10-24T14:23:57.3525439Z [command]/usr/local/bin/git checkout --progress --force refs/remotes/pull/23848/merge 2026-10-24T14:24:04.1421316Z Updating files: 0% (1/6400) 2026-10-24T14:24:04.1451327Z Updating files: 1% (64/6400) 2026-10-24T14:24:04.1470317Z Updating files: 2% (128/6400) 2026-10-24T14:24:04.1493912Z Updating files: 3% (192/6400) 2026-10-24T14:24:04.1516655Z Updating files: 4% (256/6400) 2026-10-24T14:24:04.1549874Z Updating files: 5% (320/6400) 2026-10-24T14:24:04.1573760Z Updating files: 6% (384/6400) 2026-10-24T14:24:04.1631797Z Updating files: 7% (448/6400) 2026-10-24T14:24:04.1664516Z Updating files: 8% (512/6400) 2026-10-24T14:24:04.1688435Z Updating files: 9% (576/6400) 2026-10-24T14:24:04.1980861Z Updating files: 10% (640/6400) 2026-10-24T14:24:04.1998245Z Updating files: 11% (704/6400) 2026-10-24T14:24:04.2009651Z Updating files: 12% (768/6400) 2026-10-24T14:24:04.2026034Z Updating files: 13% (832/6400) 2026-10-24T14:24:04.2043368Z Updating files: 14% (896/6400) 2026-10-24T14:24:04.2063146Z Updating files: 15% (960/6400) 2026-10-24T14:24:04.2082771Z Updating files: 16% (1024/6400) 2026-10-24T14:24:04.2099111Z Updating files: 17% (1088/6400) 2026-10-24T14:24:04.2118535Z Updating files: 18% (1152/6400) 2026-10-24T14:24:04.2134447Z Updating files: 19% (1216/6400) 2026-10-24T14:24:04.2159883Z Updating files: 20% (1280/6400) 2026-10-24T14:24:04.2178252Z Updating files: 21% (1344/6400) 2026-10-24T14:24:04.2198944Z Updating files: 22% (1408/6400) 2026-10-24T14:24:04.2213179Z Updating files: 23% (1472/6400) 2026-10-24T14:24:04.2228008Z Updating files: 24% (1536/6400) 2026-10-24T14:24:04.2246474Z Updating files: 25% (1600/6400) 2026-10-24T14:24:04.2259930Z Updating files: 26% (1664/6400) 2026-10-24T14:24:04.2274493Z Updating files: 27% (1728/6400) 2026-10-24T14:24:04.2295019Z Updating files: 28% (1792/6400) 2026-10-24T14:24:04.2331114Z Updating files: 29% (1856/6400) 2026-10-24T14:24:04.2353250Z Updating files: 30% (1920/6400) 2026-10-24T14:24:04.2379593Z Updating files: 31% (1984/6400) 2026-10-24T14:24:04.2410683Z Updating files: 32% (2048/6400) 2026-10-24T14:24:04.2441327Z Updating files: 33% (2112/6400) 2026-10-24T14:24:04.2516034Z Updating files: 34% (2176/6400) 2026-10-24T14:24:04.2577393Z Updating files: 35% (2240/6400) 2026-10-24T14:24:04.2615831Z Updating files: 36% (2304/6400) 2026-10-24T14:24:04.2649303Z Updating files: 37% (2368/6400) 2026-10-24T14:24:04.2698709Z Updating files: 38% (2432/6400) 2026-10-24T14:24:04.2728062Z Updating files: 39% (2496/6400) 2026-10-24T14:24:04.2760368Z Updating files: 40% (2560/6400) 2026-10-24T14:24:04.2788605Z Updating files: 41% (2624/6400) 2026-10-24T14:24:04.2805109Z Updating files: 42% (2688/6400) 2026-10-24T14:24:04.2815656Z Updating files: 43% (2752/6400) 2026-10-24T14:24:04.2847577Z Updating files: 44% (2816/6400) 2026-10-24T14:24:04.2876966Z Updating files: 45% (2880/6400) 2026-10-24T14:24:04.2906497Z Updating files: 46% (2944/6400) 2026-10-24T14:24:04.2933562Z Updating files: 47% (3008/6400) 2026-10-24T14:24:04.2963250Z Updating files: 48% (3072/6400) 2026-10-24T14:24:04.3003064Z Updating files: 49% (3136/6400) 2026-10-24T14:24:04.3033742Z Updating files: 50% (3200/6400) 2026-10-24T14:24:04.3050366Z Updating files: 51% (3264/6400) 2026-10-24T14:24:04.3089558Z Updating files: 52% (3328/6400) 2026-10-24T14:24:04.3119826Z Updating files: 53% (3392/6400) 2026-10-24T14:24:04.3140515Z Updating files: 54% (3456/6400) 2026-10-24T14:24:04.3164802Z Updating files: 55% (3520/6400) 2026-10-24T14:24:04.3181397Z Updating files: 56% (3584/6400) 2026-10-24T14:24:04.3203176Z Updating files: 57% (3648/6400) 2026-10-24T14:24:04.3222514Z Updating files: 58% (3712/6400) 2026-10-24T14:24:04.3614389Z Updating files: 59% (3776/6400) 2026-10-24T14:24:04.3630371Z Updating files: 60% (3840/6400) 2026-10-24T14:24:04.3652279Z Updating files: 61% (3904/6400) 2026-10-24T14:24:04.3672561Z Updating files: 62% (3968/6400) 2026-10-24T14:24:04.3696680Z Updating files: 63% (4032/6400) 2026-10-24T14:24:04.3726237Z Updating files: 64% (4096/6400) 2026-10-24T14:24:04.3747731Z Updating files: 65% (4160/6400) 2026-10-24T14:24:04.3766046Z Updating files: 66% (4224/6400) 2026-10-24T14:24:04.3767774Z Updating files: 67% (4288/6400) 2026-10-24T14:24:04.3791648Z Updating files: 67% (4293/6400) 2026-10-24T14:24:04.3807271Z Updating files: 68% (4352/6400) 2026-10-24T14:24:04.3826262Z Updating files: 69% (4416/6400) 2026-10-24T14:24:04.3840685Z Updating files: 70% (4480/6400) 2026-10-24T14:24:04.3860256Z Updating files: 71% (4544/6400) 2026-10-24T14:24:04.3873875Z Updating files: 72% (4608/6400) 2026-10-24T14:24:04.3923582Z Updating files: 73% (4672/6400) 2026-10-24T14:24:04.4353683Z Updating files: 74% (4736/6400) 2026-10-24T14:24:04.4378320Z Updating files: 75% (4800/6400) 2026-10-24T14:24:04.4401846Z Updating files: 76% (4864/6400) 2026-10-24T14:24:04.4428350Z Updating files: 77% (4928/6400) 2026-10-24T14:24:04.4451221Z Updating files: 78% (4992/6400) 2026-10-24T14:24:04.4468311Z Updating files: 79% (5056/6400) 2026-10-24T14:24:04.4491934Z Updating files: 80% (5120/6400) 2026-10-24T14:24:04.4508592Z Updating files: 81% (5184/6400) 2026-10-24T14:24:04.4528109Z Updating files: 82% (5248/6400) 2026-10-24T14:24:04.4551519Z Updating files: 83% (5312/6400) 2026-10-24T14:24:04.4578414Z Updating files: 84% (5376/6400) 2026-10-24T14:24:04.4596902Z Updating files: 85% (5440/6400) 2026-10-24T14:24:04.4623900Z Updating files: 86% (5504/6400) 2026-10-24T14:24:04.4699153Z Updating files: 87% (5568/6400) 2026-10-24T14:24:04.4730482Z Updating files: 88% (5632/6400) 2026-10-24T14:24:04.4752196Z Updating files: 89% (5696/6400) 2026-10-24T14:24:04.4782271Z Updating files: 90% (5760/6400) 2026-10-24T14:24:04.4812381Z Updating files: 91% (5824/6400) 2026-10-24T14:24:04.4829564Z Updating files: 92% (5888/6400) 2026-10-24T14:24:04.4852770Z Updating files: 93% (5952/6400) 2026-10-24T14:24:04.4874778Z Updating files: 94% (6016/6400) 2026-10-24T14:24:04.4899855Z Updating files: 95% (6080/6400) 2026-10-24T14:24:04.4960381Z Updating files: 96% (6144/6400) 2026-10-24T14:24:04.4984986Z Updating files: 97% (6208/6400) 2026-10-24T14:24:04.5034732Z Updating files: 98% (6272/6400) 2026-10-24T14:24:04.5056113Z Updating files: 99% (6336/6400) 2026-10-24T14:24:04.5056381Z Updating files: 100% (6400/6400) 2026-10-24T14:24:04.5056530Z Updating files: 100% (6400/6400), done. 2026-10-24T14:24:04.5218860Z Note: switching to 'refs/remotes/pull/23848/merge'. 2026-10-24T14:24:04.5219010Z 2026-10-24T14:24:04.5219121Z You are in 'detached HEAD' state. You can look around, make experimental 2026-10-24T14:24:04.5219363Z changes and commit them, and you can discard any commits you make in this 2026-10-24T14:24:04.5219601Z state without impacting any branches by switching back to a branch. 2026-10-24T14:24:04.5219741Z 2026-10-24T14:24:04.5219837Z If you want to create a new branch to retain commits you create, you may 2026-10-24T14:24:04.5220059Z do so (now or later) by using -c with the switch command. Example: 2026-10-24T14:24:04.5220188Z 2026-10-24T14:24:04.5220252Z git switch -c 2026-10-24T14:24:04.5220343Z 2026-10-24T14:24:04.5220403Z Or undo this operation with: 2026-10-24T14:24:04.5220486Z 2026-10-24T14:24:04.5220548Z git switch - 2026-10-24T14:24:04.5220622Z 2026-10-24T14:24:04.5220732Z Turn off this advice by setting config variable advice.detachedHead to false 2026-10-24T14:24:04.5220883Z 2026-10-24T14:24:04.5221057Z HEAD is now at cd72644 Merge a4c2fe0f81c3fd21b21093861c28a04110ad1840 into d53873b6a4799e87afd63c8d288ef0089f5a3748 2026-10-24T14:24:04.5233233Z ##[endgroup] 2026-10-24T14:24:04.5271987Z [command]/usr/local/bin/git log -1 --format=%H 2026-10-24T14:24:04.5293186Z cd72644f92665bc473e566ba1a0b762bcb3319f5 2026-10-24T14:24:04.5385077Z ##[group]Run files="$(git ls-files .github/pr-assets)" 2026-10-24T14:24:04.5385319Z files="$(git ls-files .github/pr-assets)" 2026-10-24T14:24:04.5385508Z if test -n "$files"; then 2026-10-24T14:24:04.5385757Z  printf 'PR evidence must be uploaded to GitHub, not committed:\n%s\n' "$files" >&2 2026-10-24T14:24:04.5385974Z  exit 1 2026-10-24T14:24:04.5386081Z fi 2026-10-24T14:24:04.5403916Z shell: /usr/bin/bash -e {0} 2026-10-24T14:24:04.5404066Z env: 2026-10-24T14:24:04.5404188Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 150 2026-10-24T14:24:04.5404338Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 397 2026-10-24T14:24:04.5404488Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T14:24:04.5404625Z ##[endgroup] 2026-10-24T14:24:04.5560927Z Prepare all required actions 2026-10-24T14:24:04.5561241Z Getting action download info 2026-10-24T14:24:04.6517325Z Download action repository 'voidzero-dev/setup-vp@v1' (SHA:250f29ce396baf5e8f24498e17c0dfdebabc26eb) 2026-10-24T14:24:04.7446310Z ##[group]Run ./.github/actions/setup-ci-deps 2026-10-24T14:24:04.7446481Z env: 2026-10-24T14:24:04.7446600Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 150 2026-10-24T14:24:04.7446752Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 397 2026-10-24T14:24:04.7446972Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T14:24:04.7447114Z ##[endgroup] 2026-10-24T14:24:04.7542659Z ##[start-action display=Resolve Vite+ version;id=__self.vp] 2026-10-24T14:24:04.7559510Z ##[group]Run echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-24T14:24:04.7560014Z echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-24T14:24:04.7560320Z echo "node=$(jq -r '.engines.node' package.json)" >> "$GITHUB_OUTPUT" 2026-10-24T14:24:04.7560559Z echo "pnpm=$(jq -r '.packageManager' package.json)" >> "$GITHUB_OUTPUT" 2026-10-24T14:24:04.7578882Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T14:24:04.7579052Z env: 2026-10-24T14:24:04.7579175Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 150 2026-10-24T14:24:04.7579324Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 397 2026-10-24T14:24:04.7579467Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T14:24:04.7579603Z ##[endgroup] 2026-10-24T14:24:04.7655554Z ##[end-action id=__self.vp;outcome=success;conclusion=success;duration_ms=11] 2026-10-24T14:24:04.7657305Z ##[start-action display=Cache Vite+;id=__self.vp_cache] 2026-10-24T14:24:04.7702275Z ##[group]Run actions/cache@v6 2026-10-24T14:24:04.7702420Z with: 2026-10-24T14:24:04.7702530Z path: ~/.vite-plus 2026-10-24T14:24:04.7702699Z key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T14:24:04.7702899Z enableCrossOsArchive: false 2026-10-24T14:24:04.7703036Z fail-on-cache-miss: false 2026-10-24T14:24:04.7703163Z lookup-only: false 2026-10-24T14:24:04.7703276Z save-always: false 2026-10-24T14:24:04.7703390Z env: 2026-10-24T14:24:04.7703503Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 150 2026-10-24T14:24:04.7703652Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 397 2026-10-24T14:24:04.7703797Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T14:24:04.7703934Z ##[endgroup] 2026-10-24T14:24:04.9718766Z Cache hit for: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T14:24:05.3560617Z Received 170349591 of 170349591 (100.0%), 451.3 MBs/sec 2026-10-24T14:24:05.3561545Z Cache Size: ~162 MB (170349591 B) 2026-10-24T14:24:05.3587115Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/23291133-9f63-415a-b00e-0258da6b5bb2/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T14:24:06.1419058Z Cache restored successfully 2026-10-24T14:24:06.1563994Z Cache restored from key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T14:24:06.1651253Z ##[end-action id=__self.vp_cache;outcome=success;conclusion=success;duration_ms=1399] 2026-10-24T14:24:06.1653778Z ##[start-action display=Use cached Vite+;id=__self.__run] 2026-10-24T14:24:06.1675632Z ##[group]Run echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-24T14:24:06.1675856Z echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-24T14:24:06.1676034Z "$HOME/.vite-plus/bin/vp" env use "26.12.1" 2026-10-24T14:24:06.1695275Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T14:24:06.1695448Z env: 2026-10-24T14:24:06.1695573Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 150 2026-10-24T14:24:06.1695733Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 397 2026-10-24T14:24:06.1695903Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T14:24:06.1696040Z ##[endgroup] 2026-10-24T14:24:06.1742292Z Using Node.js v26.12.1 (resolved from 26.12.1) 2026-10-24T14:24:06.1753378Z ##[end-action id=__self.__run;outcome=success;conclusion=success;duration_ms=9] 2026-10-24T14:24:06.1755376Z ##[start-action display=Setup Vite+;id=__self.__voidzero-dev_setup-vp] 2026-10-24T14:24:06.1759979Z ##[end-action id=__self.__voidzero-dev_setup-vp;outcome=skipped;conclusion=skipped;duration_ms=0] 2026-10-24T14:24:06.1761342Z ##[start-action display=Resolve pnpm store path;id=__self.pnpm_store] 2026-10-24T14:24:06.1789088Z ##[group]Run store_path="$(vp pm cache dir)" 2026-10-24T14:24:06.1789281Z store_path="$(vp pm cache dir)" 2026-10-24T14:24:06.1789449Z echo "path=$store_path" >> "$GITHUB_OUTPUT" 2026-10-24T14:24:06.1810340Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T14:24:06.1810529Z env: 2026-10-24T14:24:06.1810644Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 150 2026-10-24T14:24:06.1811044Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 397 2026-10-24T14:24:06.1811200Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T14:24:06.1811377Z ##[endgroup] 2026-10-24T14:24:06.1959639Z ##[end-action id=__self.pnpm_store;outcome=success;conclusion=success;duration_ms=19] 2026-10-24T14:24:06.1961036Z ##[start-action display=Cache full pnpm store;id=__self.__actions_cache] 2026-10-24T14:24:06.2306957Z ##[group]Run actions/cache@v6 2026-10-24T14:24:06.2307149Z with: 2026-10-24T14:24:06.2307282Z path: /home/runner/.local/share/pnpm/store/v11 2026-10-24T14:24:06.2307556Z key: pnpm-full-v1-Linux-X64-fa50cf9b003d547cd32552f61b874eb4abe5dace3fdb4b1abd9610da2da24074 2026-10-24T14:24:06.2307821Z restore-keys: pnpm-full-v1-Linux-X64- 2026-10-24T14:24:06.2307974Z enableCrossOsArchive: false 2026-10-24T14:24:06.2308110Z fail-on-cache-miss: false 2026-10-24T14:24:06.2308238Z lookup-only: false 2026-10-24T14:24:06.2308357Z save-always: false 2026-10-24T14:24:06.2308486Z env: 2026-10-24T14:24:06.2308597Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 150 2026-10-24T14:24:06.2308753Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 397 2026-10-24T14:24:06.2308896Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T14:24:06.2309034Z ##[endgroup] 2026-10-24T14:24:06.4242681Z Cache hit for: pnpm-full-v1-Linux-X64-fa50cf9b003d547cd32552f61b874eb4abe5dace3fdb4b1abd9610da2da24074 2026-10-24T14:24:07.4481884Z Received 754974720 of 994208090 (75.9%), 715.0 MBs/sec 2026-10-24T14:24:07.8430744Z Received 994208090 of 994208090 (100.0%), 676.3 MBs/sec 2026-10-24T14:24:07.8432744Z Cache Size: ~948 MB (994208090 B) 2026-10-24T14:24:07.8480328Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/8e7e28f3-2a51-41bb-82c8-45f4c02eb52a/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T14:24:13.8070028Z Cache restored successfully 2026-10-24T14:24:13.8554923Z Cache restored from key: pnpm-full-v1-Linux-X64-fa50cf9b003d547cd32552f61b874eb4abe5dace3fdb4b1abd9610da2da24074 2026-10-24T14:24:13.8645355Z ##[end-action id=__self.__actions_cache;outcome=success;conclusion=success;duration_ms=7668] 2026-10-24T14:24:13.8647555Z ##[start-action display=Install dependencies;id=__self.__run_2] 2026-10-24T14:24:13.8659729Z ##[group]Run vp install 2026-10-24T14:24:13.8659876Z vp install 2026-10-24T14:24:13.8678008Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T14:24:13.8678177Z env: 2026-10-24T14:24:13.8678297Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 150 2026-10-24T14:24:13.8678446Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 397 2026-10-24T14:24:13.8678591Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T14:24:13.8678735Z ##[endgroup] 2026-10-24T14:24:13.9035056Z Scope: all 34 workspace projects 2026-10-24T14:24:14.0128743Z ? Verifying lockfile against supply-chain policies (2088 entries)... 2026-10-24T14:24:14.3073988Z Packages are hard linked from the content-addressable store to the virtual store. 2026-10-24T14:24:14.3074366Z Content-addressable store is at: /home/runner/.local/share/pnpm/store/v11 2026-10-24T14:24:14.3074603Z Virtual store is at: node_modules/.pnpm 2026-10-24T14:24:17.0047225Z ✓ Lockfile passes supply-chain policies (2088 entries in 3s) 2026-10-24T14:24:17.0047511Z Lockfile is up to date, resolution step is skipped 2026-10-24T14:24:17.0257806Z Packages: +1721 2026-10-24T14:24:17.0257996Z ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2026-10-24T14:24:17.1075306Z Progress: resolved 1721, reused 1718, downloaded 0, added 1721, done 2026-10-24T14:24:18.2018690Z . prepare$ vp config --no-agent 2026-10-24T14:24:18.3146309Z . prepare: Done 2026-10-24T14:24:18.3161842Z 2026-10-24T14:24:18.3162312Z devDependencies: 2026-10-24T14:24:18.3162510Z + @coderabbitai/config 1.1.0 2026-10-24T14:24:18.3162742Z + @shadcn/lint 0.1.5 2026-10-24T14:24:18.3162917Z + @types/node 24.12.4 2026-10-24T14:24:18.3163055Z + knip 6.34.0 2026-10-24T14:24:18.3163201Z + typescript <- @tsc-rs/typescript 0.8.0 2026-10-24T14:24:18.3163352Z + vite-plus 1.3.0 2026-10-24T14:24:18.3163421Z 2026-10-24T14:24:18.3183270Z Done in 4.4s using pnpm v12.14.0 2026-10-24T14:24:18.3354724Z ##[end-action id=__self.__run_2;outcome=success;conclusion=success;duration_ms=4470] 2026-10-24T14:24:18.3878446Z ##[group]Run actions/cache@v6 2026-10-24T14:24:18.3878630Z with: 2026-10-24T14:24:18.3878735Z path: ~/.cache/electron 2026-10-24T14:24:18.3878963Z key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T14:24:18.3879205Z enableCrossOsArchive: false 2026-10-24T14:24:18.3879340Z fail-on-cache-miss: false 2026-10-24T14:24:18.3879466Z lookup-only: false 2026-10-24T14:24:18.3879582Z save-always: false 2026-10-24T14:24:18.3879689Z env: 2026-10-24T14:24:18.3879802Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 150 2026-10-24T14:24:18.3879949Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 397 2026-10-24T14:24:18.3880115Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T14:24:18.3880257Z ##[endgroup] 2026-10-24T14:24:18.5835348Z Cache hit for: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T14:24:18.7424990Z Received 122906203 of 122906203 (100.0%), 825.4 MBs/sec 2026-10-24T14:24:18.7425366Z Cache Size: ~117 MB (122906203 B) 2026-10-24T14:24:18.7440269Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/0427a501-ba84-4715-b4d9-dfc6cb52c7d2/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T14:24:18.8264956Z Cache restored successfully 2026-10-24T14:24:18.8397775Z Cache restored from key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T14:24:18.8515480Z ##[group]Run vp run --filter @t3tools/desktop ensure:electron 2026-10-24T14:24:18.8515738Z vp run --filter @t3tools/desktop ensure:electron 2026-10-24T14:24:18.8533225Z shell: /usr/bin/bash -e {0} 2026-10-24T14:24:18.8533360Z env: 2026-10-24T14:24:18.8533478Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 150 2026-10-24T14:24:18.8533632Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 397 2026-10-24T14:24:18.8533779Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T14:24:18.8533922Z ##[endgroup] 2026-10-24T14:24:19.0190196Z ~/apps/desktop$ node scripts/ensure-electron-runtime.mjs ⊘ cache disabled 2026-10-24T14:24:19.6206830Z /home/runner/_work/t3code/t3code/node_modules/.pnpm/electron@44.9.3_supports-color@8.1.1/node_modules/electron/dist/electron 2026-10-24T14:24:19.6228323Z 2026-10-24T14:24:19.6362674Z ##[group]Run vp run knip:check 2026-10-24T14:24:19.6362845Z vp run knip:check 2026-10-24T14:24:19.6379882Z shell: /usr/bin/bash -e {0} 2026-10-24T14:24:19.6380014Z env: 2026-10-24T14:24:19.6380126Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 150 2026-10-24T14:24:19.6380278Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 397 2026-10-24T14:24:19.6380422Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T14:24:19.6380561Z ##[endgroup] 2026-10-24T14:24:19.7895074Z $ knip --include files,dependencies --no-config-hints ⊘ cache disabled 2026-10-24T14:24:23.8070087Z 2026-10-24T14:24:23.8073103Z $ 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-24T14:24:32.6320331Z 2026-10-24T14:24:32.6320959Z --- 2026-10-24T14:24:32.6321259Z vp run: 2/2 successful. (Run `vp run --last-details` for full details) 2026-10-24T14:24:32.6408506Z ##[group]Run vp run --filter @t3tools/source-control-github generate --check 2026-10-24T14:24:32.6408842Z vp run --filter @t3tools/source-control-github generate --check 2026-10-24T14:24:32.6426472Z shell: /usr/bin/bash -e {0} 2026-10-24T14:24:32.6426600Z env: 2026-10-24T14:24:32.6426719Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 150 2026-10-24T14:24:32.6426870Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 397 2026-10-24T14:24:32.6427020Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T14:24:32.6427155Z ##[endgroup] 2026-10-24T14:24:32.8002312Z ~/packages/source-control-github$ graphqlgen --check ⊘ cache disabled 2026-10-24T14:24:33.0012418Z 2026-10-24T14:24:33.0094091Z ##[group]Run vp run --filter t3 generate --check 2026-10-24T14:24:33.0094322Z vp run --filter t3 generate --check 2026-10-24T14:24:33.0112133Z shell: /usr/bin/bash -e {0} 2026-10-24T14:24:33.0112267Z env: 2026-10-24T14:24:33.0112409Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 150 2026-10-24T14:24:33.0112562Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 397 2026-10-24T14:24:33.0112709Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T14:24:33.0112846Z ##[endgroup] 2026-10-24T14:24:33.1609491Z ~/apps/server$ graphqlgen --check ⊘ cache disabled 2026-10-24T14:24:33.3208806Z 2026-10-24T14:24:33.3290726Z ##[group]Run vp check 2026-10-24T14:24:33.3290884Z vp check 2026-10-24T14:24:33.3308202Z shell: /usr/bin/bash -e {0} 2026-10-24T14:24:33.3308332Z env: 2026-10-24T14:24:33.3308453Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 150 2026-10-24T14:24:33.3308639Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 397 2026-10-24T14:24:33.3308785Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T14:24:33.3308928Z ##[endgroup] 2026-10-24T14:24:33.9118207Z pass: All 5749 files are correctly formatted (430ms, 8 threads) 2026-10-24T14:24:39.9971279Z warn: Lint warnings found 2026-10-24T14:24:39.9972281Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:24:39.9972755Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:123:7] 2026-10-24T14:24:39.9973005Z 118 │ 2026-10-24T14:24:39.9973146Z 119 │ useEffect(() => { 2026-10-24T14:24:39.9973348Z ·  ────┬──── 2026-10-24T14:24:39.9973591Z · ╰── This is the containing effect 2026-10-24T14:24:39.9973961Z 120 │ if (orientationSettled) return; 2026-10-24T14:24:39.9974210Z 121 │ const orientation = getNativeShowcaseOrientation(); 2026-10-24T14:24:39.9974429Z 122 │ if (orientation === null) { 2026-10-24T14:24:39.9974613Z 123 │ setOrientationSettled(true); 2026-10-24T14:24:39.9974836Z ·  ──────────┬────────── 2026-10-24T14:24:39.9975142Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:39.9975391Z 124 │ return; 2026-10-24T14:24:39.9975557Z ╰──── 2026-10-24T14:24:39.9976250Z  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-24T14:24:39.9977369Z  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-24T14:24:39.9977708Z 2026-10-24T14:24:39.9978000Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:24:39.9978487Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:304:7] 2026-10-24T14:24:39.9978735Z 292 │ 2026-10-24T14:24:39.9978873Z 293 │ useEffect(() => { 2026-10-24T14:24:39.9979038Z ·  ────┬──── 2026-10-24T14:24:39.9979267Z · ╰── This is the containing effect 2026-10-24T14:24:39.9979473Z 294 │ if ( 2026-10-24T14:24:39.9979615Z 295 │ scene === null || 2026-10-24T14:24:39.9979788Z 296 │ requestedScene === null || 2026-10-24T14:24:39.9979973Z 297 │ scene !== requestedScene || 2026-10-24T14:24:39.9980145Z 298 │ !hasFixture || 2026-10-24T14:24:39.9980313Z 299 │ !orientationSettled || 2026-10-24T14:24:39.9980483Z 300 │ !themeApplied || 2026-10-24T14:24:39.9980706Z 301 │ (scene === "agent-activity" && !agentActivityStaged) || 2026-10-24T14:24:39.9980988Z 302 │ !isShowcaseNativeContentReady({ scene, themeId, renderSignal }) 2026-10-24T14:24:39.9981204Z 303 │ ) { 2026-10-24T14:24:39.9981347Z 304 │ setReadyScene(null); 2026-10-24T14:24:39.9981526Z ·  ──────┬────── 2026-10-24T14:24:39.9981807Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:39.9982049Z 305 │ return; 2026-10-24T14:24:39.9982185Z ╰──── 2026-10-24T14:24:39.9982875Z  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-24T14:24:39.9983923Z  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-24T14:24:39.9984297Z 2026-10-24T14:24:39.9984584Z ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'. 2026-10-24T14:24:39.9985022Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:128:9] 2026-10-24T14:24:39.9985316Z 127 │ let cancelled = false; 2026-10-24T14:24:39.9985504Z 128 │ let lastOutcome: string | null = null; 2026-10-24T14:24:39.9985703Z ·  ─────┬───── 2026-10-24T14:24:39.9985943Z · ╰── 'lastOutcome' is declared here 2026-10-24T14:24:39.9986282Z 129 │ void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), { 2026-10-24T14:24:39.9986532Z ╰──── 2026-10-24T14:24:39.9986703Z  help: Consider removing this declaration. 2026-10-24T14:24:39.9986826Z 2026-10-24T14:24:39.9987097Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:24:39.9987513Z ╭─[apps/mobile/src/features/threads/use-worktree-setup.ts:30:40] 2026-10-24T14:24:39.9987846Z 28 │ const snapshot = resolveWorktreeSetupSnapshot(input.threadId, query.data, live); 2026-10-24T14:24:39.9988093Z 29 │ useEffect(() => { 2026-10-24T14:24:39.9988253Z ·  ────┬──── 2026-10-24T14:24:39.9988503Z · ╰── This is the containing effect 2026-10-24T14:24:39.9988769Z 30 │ if (snapshot && snapshot !== live) setHeld({ key, snapshot }); 2026-10-24T14:24:39.9989022Z ·  ───┬─── 2026-10-24T14:24:39.9989354Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:39.9989613Z 31 │ }, [key, live, snapshot]); 2026-10-24T14:24:39.9989766Z ╰──── 2026-10-24T14:24:39.9990440Z  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-24T14:24:39.9991326Z  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-24T14:24:39.9991643Z 2026-10-24T14:24:39.9991917Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:24:39.9992335Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:444:5] 2026-10-24T14:24:39.9992575Z 434 │ : null; 2026-10-24T14:24:39.9992721Z 435 │ useEffect(() => { 2026-10-24T14:24:39.9992880Z ·  ────┬──── 2026-10-24T14:24:39.9993104Z · ╰── This is the containing effect 2026-10-24T14:24:39.9993302Z 436 │ if ( 2026-10-24T14:24:39.9993459Z 437 │ props.active === false || 2026-10-24T14:24:39.9993637Z 438 │ activeDraftKey !== null || 2026-10-24T14:24:39.9993828Z 439 │ editingPendingTask !== null || 2026-10-24T14:24:39.9994016Z 440 │ selectedProject === null 2026-10-24T14:24:39.9994270Z 441 │ ) { 2026-10-24T14:24:39.9994442Z 442 │ return; 2026-10-24T14:24:39.9994577Z 443 │ } 2026-10-24T14:24:39.9994721Z 444 │ setActiveDraftKey( 2026-10-24T14:24:39.9994900Z ·  ────────┬──────── 2026-10-24T14:24:39.9995176Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:39.9995421Z 445 │ createNewTaskDraft({ 2026-10-24T14:24:39.9995574Z ╰──── 2026-10-24T14:24:39.9996252Z  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-24T14:24:39.9997174Z  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-24T14:24:39.9997496Z 2026-10-24T14:24:39.9997745Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T14:24:39.9998179Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1244:36] 2026-10-24T14:24:39.9998501Z 1243 │ 2026-10-24T14:24:39.9998830Z 1244 │ {props.children} 2026-10-24T14:24:39.9999148Z ·  ───────────── 2026-10-24T14:24:39.9999349Z 1245 │ 2026-10-24T14:24:39.9999499Z ╰──── 2026-10-24T14:24:39.9999798Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T14:24:40.0000168Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T14:24:40.0000352Z 2026-10-24T14:24:40.0000525Z ⚠ eslint(no-control-regex): Unexpected control character 2026-10-24T14:24:40.0000895Z ╭─[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46] 2026-10-24T14:24:40.0001244Z 219 │ 2026-10-24T14:24:40.0001542Z 220 │ {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")} 2026-10-24T14:24:40.0001806Z ·  ──┬─ 2026-10-24T14:24:40.0002099Z · ╰── 'U+001B' is a control character. 2026-10-24T14:24:40.0002334Z 221 │ 2026-10-24T14:24:40.0002477Z ╰──── 2026-10-24T14:24:40.0002775Z  help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression. 2026-10-24T14:24:40.0003006Z 2026-10-24T14:24:40.0003224Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-24T14:24:40.0003608Z ╭─[apps/server/src/sourceControl/SourceControlProviderRegistry.ts:15:13] 2026-10-24T14:24:40.0003855Z 14 │ } from "@t3tools/contracts"; 2026-10-24T14:24:40.0004047Z 15 │ import type {} from "@t3tools/contracts"; 2026-10-24T14:24:40.0004230Z ·  ── 2026-10-24T14:24:40.0004373Z 16 │ 2026-10-24T14:24:40.0004491Z ╰──── 2026-10-24T14:24:40.0004631Z  help: Remove empty braces 2026-10-24T14:24:40.0004737Z 2026-10-24T14:24:40.0005088Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:24:40.0005539Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:570:5] 2026-10-24T14:24:40.0005767Z 568 │ }, []); 2026-10-24T14:24:40.0005909Z 569 │ useEffect(() => { 2026-10-24T14:24:40.0006072Z ·  ────┬──── 2026-10-24T14:24:40.0006296Z · ╰── This is the containing effect 2026-10-24T14:24:40.0006526Z 570 │ setKeyboardStateSuspect(false); 2026-10-24T14:24:40.0006726Z ·  ───────────┬─────────── 2026-10-24T14:24:40.0007008Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:40.0007287Z 571 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-24T14:24:40.0007468Z ╰──── 2026-10-24T14:24:40.0008152Z  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-24T14:24:40.0009085Z  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-24T14:24:40.0009397Z 2026-10-24T14:24:40.0009666Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:24:40.0010077Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:966:7] 2026-10-24T14:24:40.0010407Z 963 │ const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0); 2026-10-24T14:24:40.0010652Z 964 │ useEffect(() => { 2026-10-24T14:24:40.0010814Z ·  ────┬──── 2026-10-24T14:24:40.0011037Z · ╰── This is the containing effect 2026-10-24T14:24:40.0011335Z 965 │ if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) { 2026-10-24T14:24:40.0011763Z 966 │ setLastKnownKeyboardHeight(liveKeyboardHeight); 2026-10-24T14:24:40.0012021Z ·  ─────────────┬──────────── 2026-10-24T14:24:40.0012315Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:40.0012548Z 967 │ } 2026-10-24T14:24:40.0012675Z ╰──── 2026-10-24T14:24:40.0013359Z  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-24T14:24:40.0014254Z  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-24T14:24:40.0014569Z 2026-10-24T14:24:40.0014836Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:24:40.0015246Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1222:5] 2026-10-24T14:24:40.0015470Z 1220 │ 2026-10-24T14:24:40.0015602Z 1221 │ useEffect(() => { 2026-10-24T14:24:40.0015763Z ·  ────┬──── 2026-10-24T14:24:40.0016073Z · ╰── This is the containing effect 2026-10-24T14:24:40.0016411Z 1222 │ setAnchorMessageId(null); 2026-10-24T14:24:40.0016603Z ·  ─────────┬──────── 2026-10-24T14:24:40.0016898Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:40.0017157Z 1223 │ setSubmittedMessageId(null); 2026-10-24T14:24:40.0017318Z ╰──── 2026-10-24T14:24:40.0017998Z  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-24T14:24:40.0018935Z  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-24T14:24:40.0019256Z 2026-10-24T14:24:40.0019467Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:24:40.0019825Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:571:7] 2026-10-24T14:24:40.0020075Z 570 │ setKeyboardStateSuspect(false); 2026-10-24T14:24:40.0020286Z 571 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-24T14:24:40.0020551Z ·  ────────┬──────── ─────────┬──────── 2026-10-24T14:24:40.0020902Z · │ ╰── Unnecessary dependency `liveKeyboardHeight` 2026-10-24T14:24:40.0021262Z · ╰── Unnecessary dependency `isKeyboardVisible` 2026-10-24T14:24:40.0021558Z 572 │ const handleOwnedInputFocusChange = (focused: boolean) => { 2026-10-24T14:24:40.0021762Z ╰──── 2026-10-24T14:24:40.0022128Z  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-24T14:24:40.0022738Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0023054Z 2026-10-24T14:24:40.0023259Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:24:40.0023625Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1170:7] 2026-10-24T14:24:40.0023876Z 1169 │ userInputInsetProgress.set(1); 2026-10-24T14:24:40.0024159Z 1170 │ }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]); 2026-10-24T14:24:40.0024436Z ·  ────────────┬─────────── 2026-10-24T14:24:40.0024731Z · ╰── Unnecessary dependency `activeUserInputRequestId` 2026-10-24T14:24:40.0025018Z 1171 │ const showContent = props.showContent ?? true; 2026-10-24T14:24:40.0025199Z ╰──── 2026-10-24T14:24:40.0025559Z  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-24T14:24:40.0026165Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0026466Z 2026-10-24T14:24:40.0026771Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:24:40.0027177Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1228:15] 2026-10-24T14:24:40.0027412Z 1227 │ freeze.set(false); 2026-10-24T14:24:40.0027590Z 1228 │ }, [freeze, selectedThreadKey]); 2026-10-24T14:24:40.0027793Z ·  ────────┬──────── 2026-10-24T14:24:40.0028066Z · ╰── Unnecessary dependency `selectedThreadKey` 2026-10-24T14:24:40.0028290Z 1229 │ 2026-10-24T14:24:40.0028436Z ╰──── 2026-10-24T14:24:40.0028797Z  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-24T14:24:40.0029397Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0029706Z 2026-10-24T14:24:40.0029869Z ⚠ react(immutability): This value cannot be modified 2026-10-24T14:24:40.0030187Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1058:5] 2026-10-24T14:24:40.0030471Z 1053 │ const composerPopoverHeight = useSharedValue(0); 2026-10-24T14:24:40.0030712Z 1054 │ const floatingControlCoverage = useSharedValue( 2026-10-24T14:24:40.0030942Z ·  ───────────┬─────────── 2026-10-24T14:24:40.0031253Z · ╰── `floatingControlCoverage` originates here 2026-10-24T14:24:40.0049850Z 1055 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-24T14:24:40.0050063Z 1056 │ ); 2026-10-24T14:24:40.0050213Z 1057 │ useEffect(() => { 2026-10-24T14:24:40.0050426Z 1058 │ floatingControlCoverage.value = withTiming( 2026-10-24T14:24:40.0050684Z ·  ───────────┬─────────── 2026-10-24T14:24:40.0050966Z · ╰── `floatingControlCoverage` cannot be modified 2026-10-24T14:24:40.0051270Z 1059 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-24T14:24:40.0051472Z ╰──── 2026-10-24T14:24:40.0051819Z  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-24T14:24:40.0052403Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:24:40.0052708Z 2026-10-24T14:24:40.0052881Z ⚠ react(immutability): This value cannot be modified 2026-10-24T14:24:40.0053310Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1076:7] 2026-10-24T14:24:40.0053724Z 1066 │ const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null; 2026-10-24T14:24:40.0054047Z 1067 │ const combinedContentInsetEndAdjustment = useSharedValue( 2026-10-24T14:24:40.0054315Z ·  ────────────────┬──────────────── 2026-10-24T14:24:40.0054629Z · ╰── `combinedContentInsetEndAdjustment` originates here 2026-10-24T14:24:40.0054958Z 1068 │ Math.max(0, estimatedOverlayHeight - nativeInsetOvercount), 2026-10-24T14:24:40.0055166Z 1069 │ ); 2026-10-24T14:24:40.0055313Z 1070 │ useAnimatedReaction( 2026-10-24T14:24:40.0055477Z 1071 │ () => 2026-10-24T14:24:40.0055651Z 1072 │ contentInsetEndAdjustment.value + 2026-10-24T14:24:40.0055874Z 1073 │ floatingControlCoverage.value + 2026-10-24T14:24:40.0056238Z 1074 │ (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0), 2026-10-24T14:24:40.0056624Z 1075 │ (value) => { 2026-10-24T14:24:40.0056828Z 1076 │ combinedContentInsetEndAdjustment.value = value; 2026-10-24T14:24:40.0057190Z ·  ────────────────┬──────────────── 2026-10-24T14:24:40.0057605Z · ╰── `combinedContentInsetEndAdjustment` cannot be modified 2026-10-24T14:24:40.0057859Z 1077 │ }, 2026-10-24T14:24:40.0057989Z ╰──── 2026-10-24T14:24:40.0058336Z  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-24T14:24:40.0058959Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:24:40.0059269Z 2026-10-24T14:24:40.0059542Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:24:40.0059973Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:217:7] 2026-10-24T14:24:40.0060216Z 213 │ }; 2026-10-24T14:24:40.0060346Z 214 │ useEffect(() => { 2026-10-24T14:24:40.0060508Z ·  ────┬──── 2026-10-24T14:24:40.0060735Z · ╰── This is the containing effect 2026-10-24T14:24:40.0061046Z 215 │ const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null; 2026-10-24T14:24:40.0061291Z 216 │ if (inserted) { 2026-10-24T14:24:40.0061450Z 217 │ setSelection((current) => 2026-10-24T14:24:40.0061631Z ·  ──────┬───── 2026-10-24T14:24:40.0061897Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:40.0062233Z 218 │ current.start === inserted.start && current.end === inserted.end ? current : inserted, 2026-10-24T14:24:40.0062457Z ╰──── 2026-10-24T14:24:40.0063127Z  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-24T14:24:40.0064000Z  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-24T14:24:40.0064311Z 2026-10-24T14:24:40.0064707Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:24:40.0065165Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:298:7] 2026-10-24T14:24:40.0065413Z 286 │ }, [hasWorkspaceSnapshot]); 2026-10-24T14:24:40.0065573Z 287 │ useEffect(() => { 2026-10-24T14:24:40.0065726Z ·  ────┬──── 2026-10-24T14:24:40.0065941Z · ╰── This is the containing effect 2026-10-24T14:24:40.0066224Z 288 │ if (!environmentId || !projectCwd || !selectedProviderInstanceId) return; 2026-10-24T14:24:40.0066527Z 289 │ const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`; 2026-10-24T14:24:40.0066754Z 290 │ const now = Date.now(); 2026-10-24T14:24:40.0066964Z 291 │ const lastRequest = workspaceRefreshKeyRef.current; 2026-10-24T14:24:40.0067154Z 292 │ if ( 2026-10-24T14:24:40.0067301Z 293 │ lastRequest?.key === key && 2026-10-24T14:24:40.0067542Z 294 │ now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS 2026-10-24T14:24:40.0067754Z 295 │ ) 2026-10-24T14:24:40.0067882Z 296 │ return; 2026-10-24T14:24:40.0068140Z 297 │ if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) { 2026-10-24T14:24:40.0068439Z 298 │ setWorkspaceRefreshRetry(null); 2026-10-24T14:24:40.0068647Z ·  ────────────┬─────────── 2026-10-24T14:24:40.0068934Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:40.0069169Z 299 │ return; 2026-10-24T14:24:40.0069302Z ╰──── 2026-10-24T14:24:40.0069982Z  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-24T14:24:40.0070867Z  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-24T14:24:40.0071177Z 2026-10-24T14:24:40.0071387Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:24:40.0071758Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:328:5] 2026-10-24T14:24:40.0071992Z 327 │ }, [ 2026-10-24T14:24:40.0072131Z 328 │ draftMessage, 2026-10-24T14:24:40.0072301Z ·  ──────┬───── 2026-10-24T14:24:40.0072551Z · ╰── Unnecessary dependency `draftMessage` 2026-10-24T14:24:40.0072771Z 329 │ environmentId, 2026-10-24T14:24:40.0072914Z ╰──── 2026-10-24T14:24:40.0073275Z  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-24T14:24:40.0073882Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0074187Z 2026-10-24T14:24:40.0074338Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0074615Z ╭─[apps/mobile/src/components/ui/Menu.tsx:54:36] 2026-10-24T14:24:40.0075020Z 53 │ const child = children as ReactElement>; 2026-10-24T14:24:40.0075434Z 54 │ ╭─▶ children = cloneElement(child, { 2026-10-24T14:24:40.0075715Z 55 │ │ onTouchStart: (event) => { 2026-10-24T14:24:40.0076003Z 56 │ │ // Reset for a new touch, not onPressIn, which also fires when a 2026-10-24T14:24:40.0076327Z 57 │ │ // finger moves out of the row and back during the same gesture. 2026-10-24T14:24:40.0076627Z 58 │ │ menuPress.current.isPreparing = false; 2026-10-24T14:24:40.0076939Z 59 │ │ menuPress.current.suppressPress = menuPress.current.isOpen; 2026-10-24T14:24:40.0077231Z 60 │ │ pendingPress.current = null; 2026-10-24T14:24:40.0077487Z 61 │ │ child.props.onTouchStart?.(event); 2026-10-24T14:24:40.0077707Z 62 │ │ }, 2026-10-24T14:24:40.0077908Z 63 │ │ onPress: (event) => { 2026-10-24T14:24:40.0078200Z 64 │ │ // Accessibility clicks have no touch identifier and must not inherit 2026-10-24T14:24:40.0078540Z 65 │ │ // cancellation from a previous physical gesture. 2026-10-24T14:24:40.0078862Z 66 │ │ const isTouch = typeof event.nativeEvent.identifier === "number"; 2026-10-24T14:24:40.0079233Z 67 │ │ if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) { 2026-10-24T14:24:40.0079521Z 68 │ │ return; 2026-10-24T14:24:40.0079707Z 69 │ │ } 2026-10-24T14:24:40.0079958Z 70 │ │ if (isTouch && menuPress.current.isPreparing) { 2026-10-24T14:24:40.0080284Z 71 │ │ // A release can arrive between native menu preparation and display. 2026-10-24T14:24:40.0080627Z 72 │ │ // Let UIKit's display/cancel callback decide this press's outcome. 2026-10-24T14:24:40.0080903Z 73 │ │ event.persist(); 2026-10-24T14:24:40.0081181Z 74 │ │ pendingPress.current = () => child.props.onPress?.(event); 2026-10-24T14:24:40.0081435Z 75 │ │ return; 2026-10-24T14:24:40.0081615Z 76 │ │ } 2026-10-24T14:24:40.0081829Z 77 │ │ child.props.onPress?.(event); 2026-10-24T14:24:40.0082032Z 78 │ │ }, 2026-10-24T14:24:40.0082268Z 79 │ ├─▶ }); 2026-10-24T14:24:40.0082649Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T14:24:40.0082991Z 80 │ menuProps.onMenuInteractionStart = () => { 2026-10-24T14:24:40.0083170Z ╰──── 2026-10-24T14:24:40.0083717Z  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-24T14:24:40.0084451Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0084740Z 2026-10-24T14:24:40.0085049Z ⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used. 2026-10-24T14:24:40.0085450Z ╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10] 2026-10-24T14:24:40.0085661Z 21 │ 2026-10-24T14:24:40.0085882Z 22 │ function summarizePayload(payload: unknown): Readonly> { 2026-10-24T14:24:40.0086146Z ·  ────────┬─────── 2026-10-24T14:24:40.0086404Z · ╰── 'summarizePayload' is declared here 2026-10-24T14:24:40.0086670Z 23 │ if (payload === null) return { valueType: "null" }; 2026-10-24T14:24:40.0086845Z ╰──── 2026-10-24T14:24:40.0087012Z  help: Consider removing this declaration. 2026-10-24T14:24:40.0087131Z 2026-10-24T14:24:40.0087321Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T14:24:40.0087683Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:100:85] 2026-10-24T14:24:40.0087967Z  99 │ const startEditor = startScheduledTaskEditor; 2026-10-24T14:24:40.0088276Z 100 │ const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]); 2026-10-24T14:24:40.0088646Z ·  ─────┬───── 2026-10-24T14:24:40.0089009Z · ╰── Unnecessary dependency `startEditor` 2026-10-24T14:24:40.0089283Z 101 │ const readEditor = useCallback( 2026-10-24T14:24:40.0089439Z ╰──── 2026-10-24T14:24:40.0089821Z  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-24T14:24:40.0090449Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0090759Z 2026-10-24T14:24:40.0090952Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T14:24:40.0091305Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:121:7] 2026-10-24T14:24:40.0091544Z 120 │ setEditor, 2026-10-24T14:24:40.0091693Z 121 │ startEditor, 2026-10-24T14:24:40.0091861Z ·  ─────┬───── 2026-10-24T14:24:40.0092105Z · ╰── Unnecessary dependency `startEditor` 2026-10-24T14:24:40.0092325Z 122 │ hasChanges, 2026-10-24T14:24:40.0092461Z ╰──── 2026-10-24T14:24:40.0092851Z  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-24T14:24:40.0093465Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0093769Z 2026-10-24T14:24:40.0093968Z ⚠ eslint(require-yield): This generator function does not have `yield` 2026-10-24T14:24:40.0094313Z ╭─[packages/provider-acp/src/server/mcpOverAcpBridge.ts:81:78] 2026-10-24T14:24:40.0094533Z  80 │ 2026-10-24T14:24:40.0094886Z  81 │ ╭─▶ export const makeAcpMcpOverAcpBridge = Effect.fn("AcpMcpOverAcpBridge.make")(function* ( 2026-10-24T14:24:40.0095274Z  82 │ │ options: AcpMcpOverAcpBridgeOptions, 2026-10-24T14:24:40.0095614Z  83 │ │ ): Effect.fn.Return { 2026-10-24T14:24:40.0095968Z  84 │ │ const fetchImplementation = options.fetchImplementation ?? fetch; 2026-10-24T14:24:40.0096281Z  85 │ │ const connections = new Map(); 2026-10-24T14:24:40.0096585Z  86 │ │ 2026-10-24T14:24:40.0096896Z  87 │ │ const connectionFor = (connectionId: string): Effect.Effect => 2026-10-24T14:24:40.0097217Z  88 │ │ Effect.suspend(() => { 2026-10-24T14:24:40.0097474Z  89 │ │ const connection = connections.get(connectionId); 2026-10-24T14:24:40.0097739Z  90 │ │ return connection === undefined 2026-10-24T14:24:40.0098094Z  91 │ │ ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`)) 2026-10-24T14:24:40.0098462Z  92 │ │ : Effect.succeed(connection); 2026-10-24T14:24:40.0098666Z  93 │ │ }); 2026-10-24T14:24:40.0098833Z  94 │ │ 2026-10-24T14:24:40.0099016Z  95 │ │ const send = ( 2026-10-24T14:24:40.0099221Z  96 │ │ connection: Connection, 2026-10-24T14:24:40.0099438Z  97 │ │ message: unknown, 2026-10-24T14:24:40.0099710Z  98 │ │ ): Effect.Effect, AcpMcpOverAcpError> => 2026-10-24T14:24:40.0100000Z  99 │ │ connection.mutex.withPermits(1)( 2026-10-24T14:24:40.0100240Z 100 │ │ Effect.gen(function* () { 2026-10-24T14:24:40.0100501Z 101 │ │ const body = JSON.stringify(message); 2026-10-24T14:24:40.0100788Z 102 │ │ if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) { 2026-10-24T14:24:40.0101168Z 103 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB.")); 2026-10-24T14:24:40.0101459Z 104 │ │ } 2026-10-24T14:24:40.0101698Z 105 │ │ const response = yield* Effect.tryPromise({ 2026-10-24T14:24:40.0101947Z 106 │ │ try: (signal) => 2026-10-24T14:24:40.0102201Z 107 │ │ fetchImplementation(options.endpoint, { 2026-10-24T14:24:40.0102454Z 108 │ │ method: "POST", 2026-10-24T14:24:40.0102670Z 109 │ │ signal, 2026-10-24T14:24:40.0103039Z 110 │ │ headers: { 2026-10-24T14:24:40.0103337Z 111 │ │ "content-type": "application/json", 2026-10-24T14:24:40.0103632Z 112 │ │ accept: "application/json, text/event-stream", 2026-10-24T14:24:40.0103923Z 113 │ │ authorization: options.authorization, 2026-10-24T14:24:40.0104203Z 114 │ │ ...(connection.sessionId === null 2026-10-24T14:24:40.0104439Z 115 │ │ ? {} 2026-10-24T14:24:40.0104705Z 116 │ │ : { "mcp-session-id": connection.sessionId }), 2026-10-24T14:24:40.0104995Z 117 │ │ ...(connection.protocolVersion === null 2026-10-24T14:24:40.0105237Z 118 │ │ ? {} 2026-10-24T14:24:40.0105525Z 119 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-24T14:24:40.0105790Z 120 │ │ }, 2026-10-24T14:24:40.0105987Z 121 │ │ body, 2026-10-24T14:24:40.0106185Z 122 │ │ }), 2026-10-24T14:24:40.0106393Z 123 │ │ catch: bridgeError, 2026-10-24T14:24:40.0106598Z 124 │ │ }); 2026-10-24T14:24:40.0106914Z 125 │ │ connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId; 2026-10-24T14:24:40.0107237Z 126 │ │ if (!response.ok) { 2026-10-24T14:24:40.0107464Z 127 │ │ yield* Effect.promise( 2026-10-24T14:24:40.0107786Z 128 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-24T14:24:40.0108063Z 129 │ │ ); 2026-10-24T14:24:40.0108281Z 130 │ │ return yield* Effect.fail( 2026-10-24T14:24:40.0108659Z 131 │ │ new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`), 2026-10-24T14:24:40.0108956Z 132 │ │ ); 2026-10-24T14:24:40.0109135Z 133 │ │ } 2026-10-24T14:24:40.0109449Z 134 │ │ const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))]; 2026-10-24T14:24:40.0109831Z 135 │ │ for (const payload of payloads) { 2026-10-24T14:24:40.0110186Z 136 │ │ connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion; 2026-10-24T14:24:40.0110492Z 137 │ │ } 2026-10-24T14:24:40.0110695Z 138 │ │ return payloads; 2026-10-24T14:24:40.0110940Z 139 │ │ }).pipe(Effect.mapError(bridgeError)), 2026-10-24T14:24:40.0111155Z 140 │ │ ); 2026-10-24T14:24:40.0111326Z 141 │ │ 2026-10-24T14:24:40.0111596Z 142 │ │ const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* ( 2026-10-24T14:24:40.0111914Z 143 │ │ request: AcpSchema.DisconnectMcpRequest, 2026-10-24T14:24:40.0112244Z 144 │ │ ): Effect.fn.Return { 2026-10-24T14:24:40.0112608Z 145 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T14:24:40.0112986Z 146 │ │ connections.delete(request.connectionId); 2026-10-24T14:24:40.0113293Z 147 │ │ const sessionId = connection.sessionId; 2026-10-24T14:24:40.0113535Z 148 │ │ if (sessionId !== null) { 2026-10-24T14:24:40.0113793Z 149 │ │ const response = yield* Effect.tryPromise({ 2026-10-24T14:24:40.0114038Z 150 │ │ try: (signal) => 2026-10-24T14:24:40.0114291Z 151 │ │ fetchImplementation(options.endpoint, { 2026-10-24T14:24:40.0114538Z 152 │ │ method: "DELETE", 2026-10-24T14:24:40.0114749Z 153 │ │ signal, 2026-10-24T14:24:40.0114959Z 154 │ │ headers: { 2026-10-24T14:24:40.0115207Z 155 │ │ authorization: options.authorization, 2026-10-24T14:24:40.0115482Z 156 │ │ "mcp-session-id": sessionId, 2026-10-24T14:24:40.0115755Z 157 │ │ ...(connection.protocolVersion === null 2026-10-24T14:24:40.0115993Z 158 │ │ ? {} 2026-10-24T14:24:40.0116266Z 159 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-24T14:24:40.0116526Z 160 │ │ }, 2026-10-24T14:24:40.0116710Z 161 │ │ }), 2026-10-24T14:24:40.0116914Z 162 │ │ catch: bridgeError, 2026-10-24T14:24:40.0117108Z 163 │ │ }); 2026-10-24T14:24:40.0117341Z 164 │ │ if (!response.ok && response.status !== 404) { 2026-10-24T14:24:40.0117600Z 165 │ │ return yield* Effect.fail( 2026-10-24T14:24:40.0117844Z 166 │ │ new AcpMcpOverAcpError( 2026-10-24T14:24:40.0118163Z 167 │ │ `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`, 2026-10-24T14:24:40.0118461Z 168 │ │ ), 2026-10-24T14:24:40.0118639Z 169 │ │ ); 2026-10-24T14:24:40.0118815Z 170 │ │ } 2026-10-24T14:24:40.0119019Z 171 │ │ yield* Effect.promise( 2026-10-24T14:24:40.0119321Z 172 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-24T14:24:40.0119585Z 173 │ │ ); 2026-10-24T14:24:40.0119756Z 174 │ │ } 2026-10-24T14:24:40.0119938Z 175 │ │ return {}; 2026-10-24T14:24:40.0120120Z 176 │ │ }); 2026-10-24T14:24:40.0120292Z 177 │ │ 2026-10-24T14:24:40.0120459Z 178 │ │ return { 2026-10-24T14:24:40.0120736Z 179 │ │ connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) { 2026-10-24T14:24:40.0121039Z 180 │ │ if (request.serverId !== "t3-code") { 2026-10-24T14:24:40.0121282Z 181 │ │ return yield* Effect.fail( 2026-10-24T14:24:40.0121601Z 182 │ │ new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`), 2026-10-24T14:24:40.0121871Z 183 │ │ ); 2026-10-24T14:24:40.0122044Z 184 │ │ } 2026-10-24T14:24:40.0122268Z 185 │ │ if (connections.size >= MAX_CONNECTIONS) { 2026-10-24T14:24:40.0122706Z 186 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections.")); 2026-10-24T14:24:40.0123024Z 187 │ │ } 2026-10-24T14:24:40.0123280Z 188 │ │ const connectionId = yield* options.allocateConnectionId; 2026-10-24T14:24:40.0123558Z 189 │ │ connections.set(connectionId, { 2026-10-24T14:24:40.0123809Z 190 │ │ mutex: yield* Semaphore.make(1), 2026-10-24T14:24:40.0124039Z 191 │ │ sessionId: null, 2026-10-24T14:24:40.0124262Z 192 │ │ protocolVersion: null, 2026-10-24T14:24:40.0124484Z 193 │ │ nextRequestId: 0, 2026-10-24T14:24:40.0124679Z 194 │ │ }); 2026-10-24T14:24:40.0124891Z 195 │ │ return { connectionId }; 2026-10-24T14:24:40.0125092Z 196 │ │ }), 2026-10-24T14:24:40.0125362Z 197 │ │ message: Effect.fn("mcpOverAcpBridge.message")(function* (request) { 2026-10-24T14:24:40.0125704Z 198 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T14:24:40.0126000Z 199 │ │ const id = ++connection.nextRequestId; 2026-10-24T14:24:40.0126265Z 200 │ │ const payloads = yield* send(connection, { 2026-10-24T14:24:40.0126507Z 201 │ │ jsonrpc: "2.0", 2026-10-24T14:24:40.0126701Z 202 │ │ id, 2026-10-24T14:24:40.0126907Z 203 │ │ method: request.method, 2026-10-24T14:24:40.0127196Z 204 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-24T14:24:40.0127448Z 205 │ │ }); 2026-10-24T14:24:40.0127735Z 206 │ │ const response = payloads.find((payload) => asEnvelope(payload)?.id === id); 2026-10-24T14:24:40.0128054Z 207 │ │ const envelope = asEnvelope(response); 2026-10-24T14:24:40.0128295Z 208 │ │ if (envelope === null) { 2026-10-24T14:24:40.0128566Z 209 │ │ return yield* Effect.fail( 2026-10-24T14:24:40.0128882Z 210 │ │ new AcpMcpOverAcpError("MCP server did not return a matching response."), 2026-10-24T14:24:40.0129153Z 211 │ │ ); 2026-10-24T14:24:40.0129327Z 212 │ │ } 2026-10-24T14:24:40.0129540Z 213 │ │ if (envelope.error !== undefined) { 2026-10-24T14:24:40.0129876Z 214 │ │ return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error))); 2026-10-24T14:24:40.0130159Z 215 │ │ } 2026-10-24T14:24:40.0130427Z 216 │ │ return (envelope.result ?? null) as AcpSchema.MessageMcpResponse; 2026-10-24T14:24:40.0130681Z 217 │ │ }), 2026-10-24T14:24:40.0130972Z 218 │ │ notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) { 2026-10-24T14:24:40.0131332Z 219 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T14:24:40.0131605Z 220 │ │ yield* send(connection, { 2026-10-24T14:24:40.0131823Z 221 │ │ jsonrpc: "2.0", 2026-10-24T14:24:40.0132042Z 222 │ │ method: request.method, 2026-10-24T14:24:40.0132396Z 223 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-24T14:24:40.0132682Z 224 │ │ }); 2026-10-24T14:24:40.0132852Z 225 │ │ }), 2026-10-24T14:24:40.0133034Z 226 │ │ disconnect, 2026-10-24T14:24:40.0133248Z 227 │ │ dispose: Effect.suspend(() => 2026-10-24T14:24:40.0133474Z 228 │ │ Effect.forEach( 2026-10-24T14:24:40.0133692Z 229 │ │ [...connections.keys()], 2026-10-24T14:24:40.0133988Z 230 │ │ (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore), 2026-10-24T14:24:40.0134264Z 231 │ │ { discard: true }, 2026-10-24T14:24:40.0134457Z 232 │ │ ), 2026-10-24T14:24:40.0134637Z 233 │ │ ), 2026-10-24T14:24:40.0134813Z 234 │ │ }; 2026-10-24T14:24:40.0135035Z 235 │ ╰─▶ }); 2026-10-24T14:24:40.0135227Z ╰──── 2026-10-24T14:24:40.0135540Z  help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed. 2026-10-24T14:24:40.0135786Z 2026-10-24T14:24:40.0136057Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:24:40.0136559Z ╭─[apps/mobile/src/features/terminal/terminalLaunchContext.ts:117:5] 2026-10-24T14:24:40.0136902Z 112 │ const [entry, setEntry] = useState(() => ({ key: input.targetKey, location: candidate })); 2026-10-24T14:24:40.0137547Z 113 │ useEffect(() => { 2026-10-24T14:24:40.0137714Z ·  ────┬──── 2026-10-24T14:24:40.0137944Z · ╰── This is the containing effect 2026-10-24T14:24:40.0138251Z 114 │ if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) { 2026-10-24T14:24:40.0138524Z 115 │ return; 2026-10-24T14:24:40.0138658Z 116 │ } 2026-10-24T14:24:40.0138840Z 117 │ setEntry({ key: input.targetKey, location: candidate }); 2026-10-24T14:24:40.0139043Z ·  ────┬─── 2026-10-24T14:24:40.0139304Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:40.0139595Z 118 │ }, [candidate, entry.key, entry.location, input.targetKey]); 2026-10-24T14:24:40.0139787Z ╰──── 2026-10-24T14:24:40.0140466Z  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-24T14:24:40.0141350Z  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-24T14:24:40.0141664Z 2026-10-24T14:24:40.0141866Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T14:24:40.0142217Z ╭─[apps/mobile/src/components/ComposerContextSheet.tsx:272:25] 2026-10-24T14:24:40.0142484Z 271 │ {record.elements?.map((element, index) => ( 2026-10-24T14:24:40.0142778Z 272 │ 2026-10-24T14:24:40.0143203Z ·  ─────────────────────────────────────────────────────── 2026-10-24T14:24:40.0143479Z 273 │ (null); 2026-10-24T14:24:40.0145255Z 168 │ useLayoutEffect(() => { 2026-10-24T14:24:40.0145423Z ·  ───────┬─────── 2026-10-24T14:24:40.0145665Z · ╰── This is the containing effect 2026-10-24T14:24:40.0145900Z 169 │ if (faviconRequest === null) return; 2026-10-24T14:24:40.0146060Z 170 │ 2026-10-24T14:24:40.0146258Z 171 │ const endRequest = beginProjectFaviconRequest(faviconRequest); 2026-10-24T14:24:40.0146499Z 172 │ setActiveFaviconRequest(faviconRequest); 2026-10-24T14:24:40.0146708Z ·  ───────────┬─────────── 2026-10-24T14:24:40.0146984Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:40.0147229Z 173 │ return endRequest; 2026-10-24T14:24:40.0147369Z ╰──── 2026-10-24T14:24:40.0148048Z  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-24T14:24:40.0148972Z  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-24T14:24:40.0149282Z 2026-10-24T14:24:40.0149483Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T14:24:40.0149838Z ╭─[apps/mobile/src/features/terminal/TerminalContextSheet.tsx:72:15] 2026-10-24T14:24:40.0150070Z 71 │ { 2026-10-24T14:24:40.0153732Z 201 │ terminalDebugLog("native:surface", { 2026-10-24T14:24:40.0153924Z 202 │ terminalKey: props.terminalKey, 2026-10-24T14:24:40.0154109Z 203 │ native: hasNativeSurface, 2026-10-24T14:24:40.0154342Z 204 │ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(), 2026-10-24T14:24:40.0154576Z 205 │ bufferLen: props.buffer.length, 2026-10-24T14:24:40.0154757Z 206 │ isRunning: props.isRunning, 2026-10-24T14:24:40.0154914Z 207 │ }); 2026-10-24T14:24:40.0155145Z 208 │ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]); 2026-10-24T14:24:40.0155407Z 209 │ const handleNativeInput = useCallback( 2026-10-24T14:24:40.0155635Z 210 │ (event: NativeSyntheticEvent) => { 2026-10-24T14:24:40.0155876Z 211 │ if (!props.isRunning || props.readOnly) { 2026-10-24T14:24:40.0156061Z 212 │ return; 2026-10-24T14:24:40.0156193Z 213 │ } 2026-10-24T14:24:40.0156354Z 214 │ terminalDebugLog("native:onInput", { 2026-10-24T14:24:40.0156615Z 215 │ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)), 2026-10-24T14:24:40.0156838Z 216 │ }); 2026-10-24T14:24:40.0156993Z 217 │ onInput(event.nativeEvent.data); 2026-10-24T14:24:40.0157156Z 218 │ }, 2026-10-24T14:24:40.0157318Z 219 │ [onInput, props.isRunning, props.readOnly], 2026-10-24T14:24:40.0157494Z 220 │ ); 2026-10-24T14:24:40.0157650Z 221 │ const handleNativeResize = useCallback( 2026-10-24T14:24:40.0157873Z 222 │ (event: NativeSyntheticEvent) => { 2026-10-24T14:24:40.0158073Z 223 │ onResize({ 2026-10-24T14:24:40.0158241Z 224 │ cols: event.nativeEvent.cols, 2026-10-24T14:24:40.0158454Z 225 │ rows: event.nativeEvent.rows, 2026-10-24T14:24:40.0158614Z 226 │ }); 2026-10-24T14:24:40.0158739Z 227 │ }, 2026-10-24T14:24:40.0158867Z 228 │ [onResize], 2026-10-24T14:24:40.0158996Z 229 │ ); 2026-10-24T14:24:40.0159117Z 230 │ 2026-10-24T14:24:40.0159260Z 231 │ if (NativeTerminalSurfaceView) { 2026-10-24T14:24:40.0159424Z 232 │ return ( 2026-10-24T14:24:40.0159573Z 233 │ 2026-10-24T14:24:40.0159756Z 234 │ { 2026-10-24T14:24:40.0163194Z ·  ────┬──── 2026-10-24T14:24:40.0163421Z · ╰── This is the containing effect 2026-10-24T14:24:40.0163677Z 640 │ if (pendingLaunchEntry.key === launchTargetKey) { 2026-10-24T14:24:40.0163866Z 641 │ return; 2026-10-24T14:24:40.0163999Z 642 │ } 2026-10-24T14:24:40.0164139Z 643 │ setPendingLaunchEntry({ 2026-10-24T14:24:40.0164326Z ·  ──────────┬────────── 2026-10-24T14:24:40.0164604Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:40.0164848Z 644 │ key: launchTargetKey, 2026-10-24T14:24:40.0164991Z ╰──── 2026-10-24T14:24:40.0165659Z  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-24T14:24:40.0166539Z  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-24T14:24:40.0166855Z 2026-10-24T14:24:40.0167121Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:24:40.0167544Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5] 2026-10-24T14:24:40.0167778Z 648 │ 2026-10-24T14:24:40.0167901Z 649 │ useEffect(() => { 2026-10-24T14:24:40.0168063Z ·  ────┬──── 2026-10-24T14:24:40.0168282Z · ╰── This is the containing effect 2026-10-24T14:24:40.0168562Z 650 │ if (initialAttachGridEntry.key === launchTargetKey) { 2026-10-24T14:24:40.0168760Z 651 │ return; 2026-10-24T14:24:40.0168895Z 652 │ } 2026-10-24T14:24:40.0169043Z 653 │ setInitialAttachGridEntry({ 2026-10-24T14:24:40.0169239Z ·  ────────────┬──────────── 2026-10-24T14:24:40.0169521Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:40.0169764Z 654 │ key: launchTargetKey, 2026-10-24T14:24:40.0169909Z ╰──── 2026-10-24T14:24:40.0170577Z  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-24T14:24:40.0171541Z  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-24T14:24:40.0171883Z 2026-10-24T14:24:40.0172145Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:24:40.0172569Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7] 2026-10-24T14:24:40.0172804Z 743 │ 2026-10-24T14:24:40.0172936Z 744 │ useEffect(() => { 2026-10-24T14:24:40.0173094Z ·  ────┬──── 2026-10-24T14:24:40.0173318Z · ╰── This is the containing effect 2026-10-24T14:24:40.0173559Z 745 │ if (!routeEnvironmentId || !routeThreadId) { 2026-10-24T14:24:40.0173752Z 746 │ setLastGridSize({ 2026-10-24T14:24:40.0173926Z ·  ───────┬─────── 2026-10-24T14:24:40.0174206Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:40.0174470Z 747 │ cols: DEFAULT_TERMINAL_COLS, 2026-10-24T14:24:40.0174628Z ╰──── 2026-10-24T14:24:40.0175296Z  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-24T14:24:40.0176168Z  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-24T14:24:40.0176585Z 2026-10-24T14:24:40.0176796Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:24:40.0177182Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24] 2026-10-24T14:24:40.0177424Z 537 │ }); 2026-10-24T14:24:40.0177624Z 538 │ }, [terminal.buffer, terminal.buffer.length, terminalKey]); 2026-10-24T14:24:40.0177880Z ·  ───────────┬────────── 2026-10-24T14:24:40.0178252Z · ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead 2026-10-24T14:24:40.0178770Z 539 │ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null; 2026-10-24T14:24:40.0178999Z ╰──── 2026-10-24T14:24:40.0179363Z  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-24T14:24:40.0179973Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0180282Z 2026-10-24T14:24:40.0180488Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:24:40.0180868Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7] 2026-10-24T14:24:40.0181145Z 708 │ sentInitialInputKeyRef.current = null; 2026-10-24T14:24:40.0181330Z 709 │ }, [terminalKey]); 2026-10-24T14:24:40.0181500Z ·  ─────┬───── 2026-10-24T14:24:40.0181741Z · ╰── Unnecessary dependency `terminalKey` 2026-10-24T14:24:40.0181950Z 710 │ 2026-10-24T14:24:40.0182065Z ╰──── 2026-10-24T14:24:40.0182518Z  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-24T14:24:40.0183170Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0183477Z 2026-10-24T14:24:40.0183687Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:24:40.0184066Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52] 2026-10-24T14:24:40.0184306Z 799 │ }; 2026-10-24T14:24:40.0184559Z 800 │ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]); 2026-10-24T14:24:40.0184937Z ·  ────────────┬──────────── ─────┬───── 2026-10-24T14:24:40.0185348Z · │ ╰── Unnecessary dependency `terminalKey` 2026-10-24T14:24:40.0185781Z · ╰── Unnecessary dependency `terminal.lifecycleVersion` 2026-10-24T14:24:40.0186037Z 801 │ 2026-10-24T14:24:40.0186156Z ╰──── 2026-10-24T14:24:40.0186514Z  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-24T14:24:40.0187116Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0187420Z 2026-10-24T14:24:40.0187576Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0187913Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24] 2026-10-24T14:24:40.0188145Z 792 │ } 2026-10-24T14:24:40.0188321Z 793 │ const pasteSession = pasteSessionRef.current; 2026-10-24T14:24:40.0188592Z ·  ───────────┬─────────── 2026-10-24T14:24:40.0188883Z · ╰── Cannot access ref value during render 2026-10-24T14:24:40.0189099Z 794 │ 2026-10-24T14:24:40.0189217Z ╰──── 2026-10-24T14:24:40.0189760Z  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-24T14:24:40.0190503Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0190789Z 2026-10-24T14:24:40.0191058Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:24:40.0191453Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:68:5] 2026-10-24T14:24:40.0191711Z 66 │ const { id: attachmentId, fileUri } = attachment; 2026-10-24T14:24:40.0191904Z 67 │ useEffect(() => { 2026-10-24T14:24:40.0192062Z ·  ────┬──── 2026-10-24T14:24:40.0192288Z · ╰── This is the containing effect 2026-10-24T14:24:40.0192493Z 68 │ setUri(null); 2026-10-24T14:24:40.0192646Z ·  ───┬── 2026-10-24T14:24:40.0192990Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:40.0193265Z 69 │ setError(null); 2026-10-24T14:24:40.0193407Z ╰──── 2026-10-24T14:24:40.0194079Z  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-24T14:24:40.0194952Z  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-24T14:24:40.0195264Z 2026-10-24T14:24:40.0195471Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:24:40.0195825Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:91:7] 2026-10-24T14:24:40.0196035Z 90 │ }; 2026-10-24T14:24:40.0196185Z 91 │ }, [attachmentId, fileUri]); 2026-10-24T14:24:40.0196405Z ·  ──────┬───── ───┬─── 2026-10-24T14:24:40.0196720Z · │ ╰── Unnecessary dependency `fileUri` 2026-10-24T14:24:40.0197048Z · ╰── Unnecessary dependency `attachmentId` 2026-10-24T14:24:40.0197343Z 92 │ const mimeType = videoMimeType(attachment) ?? attachment.mimeType; 2026-10-24T14:24:40.0197550Z ╰──── 2026-10-24T14:24:40.0197910Z  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-24T14:24:40.0198545Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0198858Z 2026-10-24T14:24:40.0199083Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T14:24:40.0199441Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:213:34] 2026-10-24T14:24:40.0199663Z 212 │ useEffect(() => { 2026-10-24T14:24:40.0199864Z 213 │ if (!isFocused && hasSource) props.onRequestClose(); 2026-10-24T14:24:40.0200098Z ·  ──┬── 2026-10-24T14:24:40.0200365Z · ╰── Missing dependency `props` 2026-10-24T14:24:40.0200626Z 214 │ }, [isFocused, hasSource, props.onRequestClose]); 2026-10-24T14:24:40.0200872Z ·  ──────────┬───────── 2026-10-24T14:24:40.0201232Z · ╰── Overly precise dependency `props.onRequestClose`, use `props` instead 2026-10-24T14:24:40.0201525Z 215 │ const { source } = props; 2026-10-24T14:24:40.0201678Z ╰──── 2026-10-24T14:24:40.0202177Z  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-24T14:24:40.0202895Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0203194Z 2026-10-24T14:24:40.0203656Z ⚠ 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-24T14:24:40.0204157Z ╭─[packages/contracts/src/auth.test.ts:17:12] 2026-10-24T14:24:40.0204450Z 16 │ it("decodes legacy review credentials without offering them in new grants", () => { 2026-10-24T14:24:40.0204798Z 17 │ expect(Schema.decodeUnknownSync(AuthEnvironmentScopes)(["review:write"])).toEqual([ 2026-10-24T14:24:40.0205085Z ·  ──────────────────────── 2026-10-24T14:24:40.0205273Z 18 │ "review:write", 2026-10-24T14:24:40.0205414Z ╰──── 2026-10-24T14:24:40.0205475Z 2026-10-24T14:24:40.0205849Z ⚠ 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-24T14:24:40.0206308Z ╭─[packages/contracts/src/auth.test.ts:20:18] 2026-10-24T14:24:40.0206507Z 19 │ ]); 2026-10-24T14:24:40.0206747Z 20 │ expect(() => Schema.decodeUnknownSync(AuthGrantScopes)(["review:write"])).toThrow(); 2026-10-24T14:24:40.0207032Z ·  ──────────────────────── 2026-10-24T14:24:40.0207282Z 21 │ expect(AuthStandardClientScopes).not.toContain("review:write"); 2026-10-24T14:24:40.0207483Z ╰──── 2026-10-24T14:24:40.0207543Z 2026-10-24T14:24:40.0207917Z ⚠ 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-24T14:24:40.0208406Z ╭─[packages/contracts/src/auth.test.ts:58:21] 2026-10-24T14:24:40.0208709Z 57 │ it("ignores unknown response permissions without falling back to broader scopes", () => { 2026-10-24T14:24:40.0209024Z 58 │ const session = Schema.decodeUnknownSync(AuthSessionState)({ 2026-10-24T14:24:40.0209283Z ·  ──────────────────────── 2026-10-24T14:24:40.0209473Z 59 │ authenticated: true, 2026-10-24T14:24:40.0209619Z ╰──── 2026-10-24T14:24:40.0209678Z 2026-10-24T14:24:40.0209944Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:24:40.0210381Z ╭─[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:60:5] 2026-10-24T14:24:40.0210620Z 58 │ 2026-10-24T14:24:40.0210752Z 59 │ useEffect(() => { 2026-10-24T14:24:40.0210912Z ·  ────┬──── 2026-10-24T14:24:40.0211137Z · ╰── This is the containing effect 2026-10-24T14:24:40.0211359Z 60 │ setMountedModes((current) => { 2026-10-24T14:24:40.0211632Z ·  ───────┬─────── 2026-10-24T14:24:40.0211942Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:40.0212199Z 61 │ if (current.has(props.mode)) { 2026-10-24T14:24:40.0212360Z ╰──── 2026-10-24T14:24:40.0213028Z  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-24T14:24:40.0213912Z  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-24T14:24:40.0214226Z 2026-10-24T14:24:40.0214396Z ⚠ react(immutability): This value cannot be modified 2026-10-24T14:24:40.0214722Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-24T14:24:40.0214945Z 83 │ 2026-10-24T14:24:40.0215103Z 84 │ const cardCoverage = props.cardCoverage; 2026-10-24T14:24:40.0215296Z ·  ──────┬───── 2026-10-24T14:24:40.0215536Z · ╰── `cardCoverage` originates here 2026-10-24T14:24:40.0215762Z 85 │ const barHeightRef = useRef(0); 2026-10-24T14:24:40.0215946Z 86 │ const cardHeightRef = useRef(0); 2026-10-24T14:24:40.0216133Z 87 │ const cardHeight = useSharedValue(0); 2026-10-24T14:24:40.0216747Z 88 │ const notifyCoverage = useCallback(() => { 2026-10-24T14:24:40.0216932Z 89 │ if (!cardCoverage) { 2026-10-24T14:24:40.0217087Z 90 │ return; 2026-10-24T14:24:40.0217222Z 91 │ } 2026-10-24T14:24:40.0217467Z 92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-24T14:24:40.0217751Z 93 │ // feed inset and floating controls trailing it. 2026-10-24T14:24:40.0218034Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T14:24:40.0218291Z ·  ──────┬───── 2026-10-24T14:24:40.0218544Z · ╰── `cardCoverage` cannot be modified 2026-10-24T14:24:40.0218760Z 95 │ }, [cardCoverage]); 2026-10-24T14:24:40.0218901Z ╰──── 2026-10-24T14:24:40.0219266Z  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-24T14:24:40.0219868Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:24:40.0220171Z 2026-10-24T14:24:40.0220337Z ⚠ react(immutability): This value cannot be modified 2026-10-24T14:24:40.0226908Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:106:7] 2026-10-24T14:24:40.0227168Z  86 │ const cardHeightRef = useRef(0); 2026-10-24T14:24:40.0227358Z  87 │ const cardHeight = useSharedValue(0); 2026-10-24T14:24:40.0227544Z ·  ─────┬──── 2026-10-24T14:24:40.0227778Z · ╰── `cardHeight` originates here 2026-10-24T14:24:40.0228014Z  88 │ const notifyCoverage = useCallback(() => { 2026-10-24T14:24:40.0228192Z  89 │ if (!cardCoverage) { 2026-10-24T14:24:40.0228376Z  90 │ return; 2026-10-24T14:24:40.0228507Z  91 │ } 2026-10-24T14:24:40.0228864Z  92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-24T14:24:40.0229183Z  93 │ // feed inset and floating controls trailing it. 2026-10-24T14:24:40.0229456Z  94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T14:24:40.0229689Z  95 │ }, [cardCoverage]); 2026-10-24T14:24:40.0229857Z  96 │ const handleBarLayout = useCallback( 2026-10-24T14:24:40.0230042Z  97 │ (event: LayoutChangeEvent) => { 2026-10-24T14:24:40.0230262Z  98 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T14:24:40.0230464Z  99 │ notifyCoverage(); 2026-10-24T14:24:40.0230606Z 100 │ }, 2026-10-24T14:24:40.0230735Z 101 │ [notifyCoverage], 2026-10-24T14:24:40.0230872Z 102 │ ); 2026-10-24T14:24:40.0231021Z 103 │ const handleCardLayout = useCallback( 2026-10-24T14:24:40.0231217Z 104 │ (event: LayoutChangeEvent) => { 2026-10-24T14:24:40.0231450Z 105 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T14:24:40.0231704Z 106 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-24T14:24:40.0231911Z ·  ─────┬──── 2026-10-24T14:24:40.0232144Z · ╰── `cardHeight` cannot be modified 2026-10-24T14:24:40.0232352Z 107 │ notifyCoverage(); 2026-10-24T14:24:40.0232494Z ╰──── 2026-10-24T14:24:40.0232825Z  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-24T14:24:40.0233397Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:24:40.0233695Z 2026-10-24T14:24:40.0233912Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T14:24:40.0234278Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-24T14:24:40.0234530Z 87 │ const cardHeight = useSharedValue(0); 2026-10-24T14:24:40.0234730Z 88 │ const notifyCoverage = useCallback(() => { 2026-10-24T14:24:40.0234946Z ·  ───┬─── 2026-10-24T14:24:40.0235307Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-24T14:24:40.0235598Z 89 │ if (!cardCoverage) { 2026-10-24T14:24:40.0235746Z 90 │ return; 2026-10-24T14:24:40.0235876Z 91 │ } 2026-10-24T14:24:40.0236107Z 92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-24T14:24:40.0236386Z 93 │ // feed inset and floating controls trailing it. 2026-10-24T14:24:40.0236666Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T14:24:40.0236909Z ·  ──────┬───── 2026-10-24T14:24:40.0237132Z · ╰── This modifies `cardCoverage` 2026-10-24T14:24:40.0237342Z 95 │ }, [cardCoverage]); 2026-10-24T14:24:40.0237480Z ╰──── 2026-10-24T14:24:40.0237886Z  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-24T14:24:40.0238552Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:24:40.0238850Z 2026-10-24T14:24:40.0239140Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T14:24:40.0239535Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-24T14:24:40.0239801Z 93 │ // feed inset and floating controls trailing it. 2026-10-24T14:24:40.0240077Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T14:24:40.0240320Z ·  ──────┬───── 2026-10-24T14:24:40.0240542Z · ╰── This modifies `cardCoverage` 2026-10-24T14:24:40.0240746Z 95 │ }, [cardCoverage]); 2026-10-24T14:24:40.0240915Z 96 │ const handleBarLayout = useCallback( 2026-10-24T14:24:40.0241098Z 97 │ (event: LayoutChangeEvent) => { 2026-10-24T14:24:40.0241308Z ·  ───────────────┬─────────────── 2026-10-24T14:24:40.0241658Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-24T14:24:40.0241998Z 98 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T14:24:40.0242187Z ╰──── 2026-10-24T14:24:40.0242585Z  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-24T14:24:40.0243210Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:24:40.0243505Z 2026-10-24T14:24:40.0243710Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T14:24:40.0244072Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:106:7] 2026-10-24T14:24:40.0244327Z 103 │ const handleCardLayout = useCallback( 2026-10-24T14:24:40.0244514Z 104 │ (event: LayoutChangeEvent) => { 2026-10-24T14:24:40.0244725Z ·  ───────────────┬─────────────── 2026-10-24T14:24:40.0245060Z · ╰── This function may (indirectly) reassign or modify `cardHeight` after render 2026-10-24T14:24:40.0245401Z 105 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T14:24:40.0245655Z 106 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-24T14:24:40.0245864Z ·  ─────┬──── 2026-10-24T14:24:40.0246087Z · ╰── This modifies `cardHeight` 2026-10-24T14:24:40.0246293Z 107 │ notifyCoverage(); 2026-10-24T14:24:40.0246429Z ╰──── 2026-10-24T14:24:40.0246834Z  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-24T14:24:40.0247461Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:24:40.0247758Z 2026-10-24T14:24:40.0248064Z ⚠ eslint(no-unused-vars): Variable 'layerFromProviderAdapter' is declared but never used. Unused variables should start with a '_'. 2026-10-24T14:24:40.0248547Z ╭─[apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts:346:7] 2026-10-24T14:24:40.0248774Z 345 │ 2026-10-24T14:24:40.0248934Z 346 │ const layerFromProviderAdapter: Layer.Layer< 2026-10-24T14:24:40.0249145Z ·  ────────────┬─────────── 2026-10-24T14:24:40.0249497Z · ╰── 'layerFromProviderAdapter' is declared here 2026-10-24T14:24:40.0249781Z 347 │ ProviderAdapterRegistryV2, 2026-10-24T14:24:40.0249930Z ╰──── 2026-10-24T14:24:40.0250089Z  help: Consider removing this declaration. 2026-10-24T14:24:40.0250206Z 2026-10-24T14:24:40.0250441Z ⚠ eslint(no-unused-vars): Function 'resolveThreadWorkspaceCwd' is declared but never used. 2026-10-24T14:24:40.0250783Z ╭─[apps/server/src/checkpointing/Utils.ts:12:10] 2026-10-24T14:24:40.0250968Z 11 │ 2026-10-24T14:24:40.0251124Z 12 │ function resolveThreadWorkspaceCwd(input: { 2026-10-24T14:24:40.0251339Z ·  ────────────┬──────────── 2026-10-24T14:24:40.0251622Z · ╰── 'resolveThreadWorkspaceCwd' is declared here 2026-10-24T14:24:40.0251865Z 13 │ readonly thread: { 2026-10-24T14:24:40.0252007Z ╰──── 2026-10-24T14:24:40.0252164Z  help: Consider removing this declaration. 2026-10-24T14:24:40.0252284Z 2026-10-24T14:24:40.0252549Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:24:40.0252991Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:119:10] 2026-10-24T14:24:40.0253236Z 117 │ 2026-10-24T14:24:40.0253362Z 118 │ useEffect(() => { 2026-10-24T14:24:40.0253520Z ·  ────┬──── 2026-10-24T14:24:40.0253741Z · ╰── This is the containing effect 2026-10-24T14:24:40.0253958Z 119 │ void refreshNotifications(); 2026-10-24T14:24:40.0254151Z ·  ──────────┬───────── 2026-10-24T14:24:40.0254438Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:40.0254757Z 120 │ const subscription = AppState.addEventListener("change", (state) => { 2026-10-24T14:24:40.0254966Z ╰──── 2026-10-24T14:24:40.0255634Z  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-24T14:24:40.0256578Z  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-24T14:24:40.0256884Z 2026-10-24T14:24:40.0257235Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:24:40.0257725Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7] 2026-10-24T14:24:40.0257972Z 125 │ 2026-10-24T14:24:40.0258099Z 126 │ useEffect(() => { 2026-10-24T14:24:40.0258252Z ·  ────┬──── 2026-10-24T14:24:40.0258501Z · ╰── This is the containing effect 2026-10-24T14:24:40.0258702Z 127 │ if (!isLoaded) { 2026-10-24T14:24:40.0258879Z 128 │ setLiveActivityStatus("checking"); 2026-10-24T14:24:40.0259078Z ·  ──────────┬────────── 2026-10-24T14:24:40.0259350Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:40.0259585Z 129 │ return; 2026-10-24T14:24:40.0259711Z ╰──── 2026-10-24T14:24:40.0260383Z  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-24T14:24:40.0261256Z  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-24T14:24:40.0261561Z 2026-10-24T14:24:40.0261831Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-24T14:24:40.0262216Z ╭─[apps/server/src/telemetry/AnalyticsService.ts:340:7] 2026-10-24T14:24:40.0262413Z 339 │ 2026-10-24T14:24:40.0262582Z 340 │ const layerTest = AnalyticsService.layerTest; 2026-10-24T14:24:40.0262781Z ·  ────┬──── 2026-10-24T14:24:40.0263004Z · ╰── 'layerTest' is declared here 2026-10-24T14:24:40.0263193Z ╰──── 2026-10-24T14:24:40.0263351Z  help: Consider removing this declaration. 2026-10-24T14:24:40.0263471Z 2026-10-24T14:24:40.0263733Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T14:24:40.0264212Z ╭─[apps/server/src/orchestration-v2/ThreadPullRequestService.ts:410:7] 2026-10-24T14:24:40.0264440Z 409 │ 2026-10-24T14:24:40.0264625Z 410 │ const layer = Layer.effect(ThreadPullRequestServiceV2, make); 2026-10-24T14:24:40.0264836Z ·  ──┬── 2026-10-24T14:24:40.0265053Z · ╰── 'layer' is declared here 2026-10-24T14:24:40.0265241Z ╰──── 2026-10-24T14:24:40.0265399Z  help: Consider removing this declaration. 2026-10-24T14:24:40.0265520Z 2026-10-24T14:24:40.0265783Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T14:24:40.0266150Z ╭─[apps/server/src/serverRuntimeStartup.ts:728:7] 2026-10-24T14:24:40.0266338Z 727 │ 2026-10-24T14:24:40.0266478Z 728 │ const layer = layerWithOptions(); 2026-10-24T14:24:40.0266651Z ·  ──┬── 2026-10-24T14:24:40.0266859Z · ╰── 'layer' is declared here 2026-10-24T14:24:40.0267040Z ╰──── 2026-10-24T14:24:40.0267197Z  help: Consider removing this declaration. 2026-10-24T14:24:40.0267313Z 2026-10-24T14:24:40.0267929Z ⚠ 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-24T14:24:40.0268537Z ╭─[packages/contracts/src/baseSchemas.test.ts:39:9] 2026-10-24T14:24:40.0268739Z 38 │ JSON.stringify( 2026-10-24T14:24:40.0268944Z 39 │ Schema.encodeUnknownSync(Schema.toCodecJson(Named))([ 2026-10-24T14:24:40.0269173Z ·  ──────────────────────── 2026-10-24T14:24:40.0269343Z 40 │ { name: "a" }, 2026-10-24T14:24:40.0269477Z ╰──── 2026-10-24T14:24:40.0269533Z 2026-10-24T14:24:40.0269748Z ⚠ eslint(no-unused-vars): Function 'describeSchedule' is declared but never used. 2026-10-24T14:24:40.0270084Z ╭─[apps/server/src/scheduledTasks/Schedule.ts:79:10] 2026-10-24T14:24:40.0270274Z 78 │ 2026-10-24T14:24:40.0270467Z 79 │ function describeSchedule(schedule: ScheduledTaskSchedule): string { 2026-10-24T14:24:40.0270704Z ·  ────────┬─────── 2026-10-24T14:24:40.0270951Z · ╰── 'describeSchedule' is declared here 2026-10-24T14:24:40.0271210Z 80 │ if (schedule.type === "webhook") return "On webhook"; 2026-10-24T14:24:40.0271383Z ╰──── 2026-10-24T14:24:40.0271540Z  help: Consider removing this declaration. 2026-10-24T14:24:40.0271656Z 2026-10-24T14:24:40.0271919Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:24:40.0272328Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-24T14:24:40.0272567Z 259 │ .join("|"); 2026-10-24T14:24:40.0272714Z 260 │ useEffect(() => { 2026-10-24T14:24:40.0272866Z ·  ────┬──── 2026-10-24T14:24:40.0273082Z · ╰── This is the containing effect 2026-10-24T14:24:40.0273281Z 261 │ stop(); 2026-10-24T14:24:40.0273420Z ·  ──┬─ 2026-10-24T14:24:40.0273669Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:40.0273898Z 262 │ }, [orderVersion]); 2026-10-24T14:24:40.0274036Z ╰──── 2026-10-24T14:24:40.0274696Z  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-24T14:24:40.0275570Z  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-24T14:24:40.0275881Z 2026-10-24T14:24:40.0276100Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T14:24:40.0276473Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-24T14:24:40.0276702Z 260 │ useEffect(() => { 2026-10-24T14:24:40.0276843Z 261 │ stop(); 2026-10-24T14:24:40.0276981Z ·  ──┬─ 2026-10-24T14:24:40.0277189Z · ╰── Missing dependency `stop` 2026-10-24T14:24:40.0277386Z 262 │ }, [orderVersion]); 2026-10-24T14:24:40.0277547Z ·  ──────┬───── 2026-10-24T14:24:40.0277872Z · ╰── Unnecessary dependency `orderVersion` 2026-10-24T14:24:40.0278121Z 263 │ useEffect( 2026-10-24T14:24:40.0278245Z ╰──── 2026-10-24T14:24:40.0278750Z  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-24T14:24:40.0279456Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0279757Z 2026-10-24T14:24:40.0279906Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0280217Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9] 2026-10-24T14:24:40.0280465Z 95 │ const latest = useRef(props); 2026-10-24T14:24:40.0280633Z 96 │ latest.current = props; 2026-10-24T14:24:40.0280826Z ·  ───┬──────┬─── 2026-10-24T14:24:40.0281117Z · │ ╰── Cannot update ref value during render 2026-10-24T14:24:40.0281405Z · ╰── This value is a ref 2026-10-24T14:24:40.0281595Z 97 │ const gesture = useMemo( 2026-10-24T14:24:40.0281731Z ╰──── 2026-10-24T14:24:40.0282264Z  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-24T14:24:40.0282992Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0283273Z 2026-10-24T14:24:40.0283421Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0283734Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18] 2026-10-24T14:24:40.0283968Z 103 │ .runOnJS(true) 2026-10-24T14:24:40.0284151Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T14:24:40.0284384Z ·  ───────────────┬────────────── 2026-10-24T14:24:40.0284708Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T14:24:40.0285034Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T14:24:40.0285230Z ╰──── 2026-10-24T14:24:40.0285761Z  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-24T14:24:40.0286478Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0286758Z 2026-10-24T14:24:40.0286904Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0287215Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19] 2026-10-24T14:24:40.0287479Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T14:24:40.0287723Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T14:24:40.0288091Z ·  ──────────────────────────┬───────────────────────── 2026-10-24T14:24:40.0288499Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T14:24:40.0288824Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T14:24:40.0289012Z ╰──── 2026-10-24T14:24:40.0289540Z  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-24T14:24:40.0290260Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0290542Z 2026-10-24T14:24:40.0290694Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0291005Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16] 2026-10-24T14:24:40.0291301Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T14:24:40.0291567Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T14:24:40.0291848Z ·  ──────────────────────────┬───────────────────────── 2026-10-24T14:24:40.0292194Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T14:24:40.0292514Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T14:24:40.0292704Z ╰──── 2026-10-24T14:24:40.0293239Z  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-24T14:24:40.0293963Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0294243Z 2026-10-24T14:24:40.0294389Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0294696Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21] 2026-10-24T14:24:40.0294981Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T14:24:40.0295238Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T14:24:40.0295514Z ·  ───────────────────────┬────────────────────── 2026-10-24T14:24:40.0295931Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T14:24:40.0296231Z 108 │ [props.disabled], 2026-10-24T14:24:40.0296431Z ╰──── 2026-10-24T14:24:40.0296959Z  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-24T14:24:40.0297677Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0297960Z 2026-10-24T14:24:40.0298105Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0298450Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:249:9] 2026-10-24T14:24:40.0298732Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-24T14:24:40.0298964Z 249 │ latest.current = { rows, planners, moveThread }; 2026-10-24T14:24:40.0299191Z ·  ───┬──────┬─── 2026-10-24T14:24:40.0299482Z · │ ╰── Cannot update ref value during render 2026-10-24T14:24:40.0299770Z · ╰── This value is a ref 2026-10-24T14:24:40.0299942Z 250 │ 2026-10-24T14:24:40.0300052Z ╰──── 2026-10-24T14:24:40.0300577Z  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-24T14:24:40.0301302Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0301587Z 2026-10-24T14:24:40.0301733Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0302043Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:247:22] 2026-10-24T14:24:40.0302330Z 246 │ const [preview, setPreview] = useState(null); 2026-10-24T14:24:40.0302580Z 247 │ const translateY = useRef(new Animated.Value(0)).current; 2026-10-24T14:24:40.0302838Z ·  ──────────────────┬────────────────── 2026-10-24T14:24:40.0303134Z · ╰── Cannot access ref value during render 2026-10-24T14:24:40.0303412Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-24T14:24:40.0303593Z ╰──── 2026-10-24T14:24:40.0304116Z  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-24T14:24:40.0304412Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0304415Z 2026-10-24T14:24:40.0304586Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T14:24:40.0304747Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:324:16] 2026-10-24T14:24:40.0304812Z 323 │ update(0); 2026-10-24T14:24:40.0304986Z 324 │ let last = performance.now(); 2026-10-24T14:24:40.0305128Z ·  ────────┬──────── 2026-10-24T14:24:40.0305272Z · ╰── Cannot call impure function 2026-10-24T14:24:40.0305342Z 325 │ const tick = () => { 2026-10-24T14:24:40.0305395Z ╰──── 2026-10-24T14:24:40.0305700Z  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-24T14:24:40.0305998Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T14:24:40.0306001Z 2026-10-24T14:24:40.0306191Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T14:24:40.0306356Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15] 2026-10-24T14:24:40.0306421Z  98 │ () => 2026-10-24T14:24:40.0306490Z  99 │ Gesture.Pan() 2026-10-24T14:24:40.0306566Z ·  ─┬─ 2026-10-24T14:24:40.0306702Z · ╰── `Pan` may be a component 2026-10-24T14:24:40.0306784Z 100 │ .enabled(!props.disabled) 2026-10-24T14:24:40.0306838Z ╰──── 2026-10-24T14:24:40.0307114Z  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-24T14:24:40.0307568Z  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-24T14:24:40.0307570Z 2026-10-24T14:24:40.0307766Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T14:24:40.0307929Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5] 2026-10-24T14:24:40.0307998Z 103 │ .runOnJS(true) 2026-10-24T14:24:40.0308096Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T14:24:40.0308186Z ·  ───┬── 2026-10-24T14:24:40.0308643Z · ╰── 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-24T14:24:40.0308777Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T14:24:40.0308907Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T14:24:40.0309035Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T14:24:40.0309103Z 108 │ [props.disabled], 2026-10-24T14:24:40.0309187Z ·  ────────┬─────── 2026-10-24T14:24:40.0309376Z · ╰── This dependency list is missing values used by the callback 2026-10-24T14:24:40.0309432Z 109 │ ); 2026-10-24T14:24:40.0309485Z ╰──── 2026-10-24T14:24:40.0309694Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T14:24:40.0310007Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0310012Z 2026-10-24T14:24:40.0310274Z ⚠ eslint(no-unsafe-optional-chaining): Unsafe usage of optional chaining 2026-10-24T14:24:40.0310482Z ╭─[apps/server/src/orchestration-v2/ThreadLaunchService.test.ts:1783:8] 2026-10-24T14:24:40.0310550Z 1782 │ assert.equal( 2026-10-24T14:24:40.0310698Z 1783 │ (stored.context?.records[0] as { attachmentId: string }).attachmentId, 2026-10-24T14:24:40.0310801Z ·  ────────────────────────── 2026-10-24T14:24:40.0310882Z 1784 │ stored.attachments[0]?.id, 2026-10-24T14:24:40.0310935Z ╰──── 2026-10-24T14:24:40.0311109Z  help: If this short-circuits with 'undefined' the evaluation will throw TypeError 2026-10-24T14:24:40.0311111Z 2026-10-24T14:24:40.0311578Z ⚠ 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-24T14:24:40.0311719Z ╭─[packages/contracts/src/composerContext.test.ts:181:18] 2026-10-24T14:24:40.0311859Z 180 │ it("sends a message without the records the wire cannot carry", () => { 2026-10-24T14:24:40.0312042Z 181 │ const wire = Schema.encodeUnknownSync(Schema.toCodecJson(OrchestrationMessageContext))({ 2026-10-24T14:24:40.0312149Z ·  ──────────────────────── 2026-10-24T14:24:40.0312215Z 182 │ version: 1, 2026-10-24T14:24:40.0312267Z ╰──── 2026-10-24T14:24:40.0312270Z 2026-10-24T14:24:40.0312750Z ⚠ 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-24T14:24:40.0312939Z ╭─[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:521:13] 2026-10-24T14:24:40.0313014Z 520 │ })).delivery; 2026-10-24T14:24:40.0313216Z 521 │ ╭─▶ while (delivery.outcome === "accepted") { 2026-10-24T14:24:40.0313333Z 522 │ │ yield* Effect.yieldNow; 2026-10-24T14:24:40.0313483Z 523 │ │ delivery = (yield* service.getWebhookDelivery({ 2026-10-24T14:24:40.0313584Z 524 │ │ id: task.id, 2026-10-24T14:24:40.0313705Z 525 │ │ deliveryId: deliveryId!, 2026-10-24T14:24:40.0313806Z 526 │ │ })).delivery; 2026-10-24T14:24:40.0313947Z 527 │ ╰─▶ } 2026-10-24T14:24:40.0314070Z 528 │ assert.equal(delivery.outcome, "dispatch_failed"); 2026-10-24T14:24:40.0314128Z ╰──── 2026-10-24T14:24:40.0314131Z 2026-10-24T14:24:40.0314322Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T14:24:40.0314440Z ╭─[apps/mobile/src/lib/useHoverGesture.ts:8:15] 2026-10-24T14:24:40.0314498Z 7 │ () => 2026-10-24T14:24:40.0314565Z 8 │ Gesture.Hover() 2026-10-24T14:24:40.0314643Z ·  ──┬── 2026-10-24T14:24:40.0314780Z · ╰── `Hover` may be a component 2026-10-24T14:24:40.0314853Z 9 │ .manualActivation(true) 2026-10-24T14:24:40.0314909Z ╰──── 2026-10-24T14:24:40.0315194Z  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-24T14:24:40.0315708Z  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-24T14:24:40.0315745Z 2026-10-24T14:24:40.0315943Z ⚠ eslint(no-unused-vars): Identifier 'Fiber' is imported but never used. 2026-10-24T14:24:40.0316041Z ╭─[apps/server/src/ws.ts:10:13] 2026-10-24T14:24:40.0316131Z  9 │ import * as Effect from "effect/Effect"; 2026-10-24T14:24:40.0316217Z 10 │ import * as Fiber from "effect/Fiber"; 2026-10-24T14:24:40.0316294Z ·  ──┬── 2026-10-24T14:24:40.0316424Z · ╰── 'Fiber' is imported here 2026-10-24T14:24:40.0316529Z 11 │ import * as FileSystem from "effect/FileSystem"; 2026-10-24T14:24:40.0316590Z ╰──── 2026-10-24T14:24:40.0316695Z  help: Consider removing this import. 2026-10-24T14:24:40.0316697Z 2026-10-24T14:24:40.0316899Z ⚠ eslint(no-unused-vars): Identifier 'Schedule' is imported but never used. 2026-10-24T14:24:40.0316994Z ╭─[apps/server/src/ws.ts:17:13] 2026-10-24T14:24:40.0317077Z 16 │ import * as Ref from "effect/Ref"; 2026-10-24T14:24:40.0317170Z 17 │ import * as Schedule from "effect/Schedule"; 2026-10-24T14:24:40.0317247Z ·  ────┬─── 2026-10-24T14:24:40.0317385Z · ╰── 'Schedule' is imported here 2026-10-24T14:24:40.0317471Z 18 │ import * as Schema from "effect/Schema"; 2026-10-24T14:24:40.0317525Z ╰──── 2026-10-24T14:24:40.0317621Z  help: Consider removing this import. 2026-10-24T14:24:40.0317623Z 2026-10-24T14:24:40.0317936Z ⚠ eslint(no-unused-vars): Variable 'projectSetupScriptRunner' is declared but never used. Unused variables should start with a '_'. 2026-10-24T14:24:40.0318039Z ╭─[apps/server/src/ws.ts:1286:13] 2026-10-24T14:24:40.0318195Z 1285 │ const usageLimitSources = yield* UsageLimitSources.UsageLimitSources; 2026-10-24T14:24:40.0318432Z 1286 │ const projectSetupScriptRunner = yield* ProjectSetupScriptRunner.ProjectSetupScriptRunner; 2026-10-24T14:24:40.0318541Z ·  ────────────┬─────────── 2026-10-24T14:24:40.0318718Z · ╰── 'projectSetupScriptRunner' is declared here 2026-10-24T14:24:40.0318888Z 1287 │ const worktreeSetupTracker = yield* WorktreeSetupTracker.WorktreeSetupTracker; 2026-10-24T14:24:40.0318941Z ╰──── 2026-10-24T14:24:40.0319053Z  help: Consider removing this declaration. 2026-10-24T14:24:40.0319059Z 2026-10-24T14:24:40.0319266Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-24T14:24:40.0319374Z ╭─[packages/contracts/src/rpc.ts:297:8] 2026-10-24T14:24:40.0319444Z 296 │ } from "./device.ts"; 2026-10-24T14:24:40.0319535Z 297 │ import {} from "./previewAutomation.ts"; 2026-10-24T14:24:40.0319606Z ·  ── 2026-10-24T14:24:40.0319665Z 298 │ import { 2026-10-24T14:24:40.0319717Z ╰──── 2026-10-24T14:24:40.0319799Z  help: Remove empty braces 2026-10-24T14:24:40.0319802Z 2026-10-24T14:24:40.0320332Z ⚠ 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-24T14:24:40.0320502Z ╭─[packages/client-runtime/src/rpc/session.test.ts:226:3] 2026-10-24T14:24:40.0320560Z 225 │ ) { 2026-10-24T14:24:40.0320769Z 226 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T14:24:40.0320884Z 227 │ │ const socket = sockets[index]; 2026-10-24T14:24:40.0320975Z 228 │ │ if (socket) { 2026-10-24T14:24:40.0321071Z 229 │ │ return socket; 2026-10-24T14:24:40.0321145Z 230 │ │ } 2026-10-24T14:24:40.0321248Z 231 │ │ yield* Effect.yieldNow; 2026-10-24T14:24:40.0321375Z 232 │ ╰─▶ } 2026-10-24T14:24:40.0321559Z 233 │ return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket.")); 2026-10-24T14:24:40.0321616Z ╰──── 2026-10-24T14:24:40.0321618Z 2026-10-24T14:24:40.0322089Z ⚠ 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-24T14:24:40.0322227Z ╭─[packages/client-runtime/src/rpc/session.test.ts:240:3] 2026-10-24T14:24:40.0322284Z 239 │ ) { 2026-10-24T14:24:40.0322488Z 240 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T14:24:40.0322705Z 241 │ │ const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index]; 2026-10-24T14:24:40.0322803Z 242 │ │ if (request) { 2026-10-24T14:24:40.0322901Z 243 │ │ return request; 2026-10-24T14:24:40.0322975Z 244 │ │ } 2026-10-24T14:24:40.0323076Z 245 │ │ yield* Effect.yieldNow; 2026-10-24T14:24:40.0323203Z 246 │ ╰─▶ } 2026-10-24T14:24:40.0323372Z 247 │ return yield* Effect.die(new Error("Expected the RPC protocol to send a request.")); 2026-10-24T14:24:40.0323426Z ╰──── 2026-10-24T14:24:40.0323428Z 2026-10-24T14:24:40.0323877Z ⚠ 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-24T14:24:40.0324063Z ╭─[apps/server/src/serverSettings.test.ts:1741:32] 2026-10-24T14:24:40.0324271Z 1740 │ const model = createModelSelection(ProviderInstanceId.make("codex"), "gpt-5.5"); 2026-10-24T14:24:40.0324462Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-24T14:24:40.0324578Z ·  ─────────────────── 2026-10-24T14:24:40.0324687Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-24T14:24:40.0324741Z ╰──── 2026-10-24T14:24:40.0324744Z 2026-10-24T14:24:40.0325193Z ⚠ 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-24T14:24:40.0325317Z ╭─[apps/server/src/serverSettings.test.ts:1742:34] 2026-10-24T14:24:40.0325508Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-24T14:24:40.0325619Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-24T14:24:40.0325737Z ·  ─────────────────── 2026-10-24T14:24:40.0325853Z 1743 │ Schema.fromJsonString(Schema.Array(ProjectScript)), 2026-10-24T14:24:40.0325906Z ╰──── 2026-10-24T14:24:40.0325908Z 2026-10-24T14:24:40.0326377Z ⚠ 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-24T14:24:40.0326513Z ╭─[packages/client-runtime/src/rpc/client.test.ts:131:9] 2026-10-24T14:24:40.0326576Z 130 │ ) { 2026-10-24T14:24:40.0326794Z 131 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T14:24:40.0326925Z 132 │ │ if (subscriptions.length >= count) { 2026-10-24T14:24:40.0327017Z 133 │ │ return; 2026-10-24T14:24:40.0327099Z 134 │ │ } 2026-10-24T14:24:40.0327208Z 135 │ │ yield* Effect.yieldNow; 2026-10-24T14:24:40.0327342Z 136 │ ╰─▶ } 2026-10-24T14:24:40.0327508Z 137 │ return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`)); 2026-10-24T14:24:40.0327560Z ╰──── 2026-10-24T14:24:40.0327563Z 2026-10-24T14:24:40.0328035Z ⚠ 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-24T14:24:40.0328171Z ╭─[packages/client-runtime/src/rpc/client.test.ts:252:7] 2026-10-24T14:24:40.0328335Z 251 │ yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient))); 2026-10-24T14:24:40.0328621Z 252 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) { 2026-10-24T14:24:40.0328728Z 253 │ │ yield* Effect.yieldNow; 2026-10-24T14:24:40.0328859Z 254 │ ╰─▶ } 2026-10-24T14:24:40.0328983Z 255 │ yield* SubscriptionRef.set(activeSession, Option.none()); 2026-10-24T14:24:40.0329036Z ╰──── 2026-10-24T14:24:40.0329039Z 2026-10-24T14:24:40.0329556Z ⚠ 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-24T14:24:40.0329726Z ╭─[packages/client-runtime/src/rpc/client.test.ts:258:7] 2026-10-24T14:24:40.0329780Z 257 │ 2026-10-24T14:24:40.0330033Z 258 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-24T14:24:40.0330138Z 259 │ │ yield* Effect.yieldNow; 2026-10-24T14:24:40.0330269Z 260 │ ╰─▶ } 2026-10-24T14:24:40.0330373Z 261 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-24T14:24:40.0330426Z ╰──── 2026-10-24T14:24:40.0330432Z 2026-10-24T14:24:40.0330895Z ⚠ 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-24T14:24:40.0331027Z ╭─[packages/client-runtime/src/rpc/client.test.ts:322:7] 2026-10-24T14:24:40.0331090Z 321 │ ); 2026-10-24T14:24:40.0331348Z 322 │ ╭─▶ for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) { 2026-10-24T14:24:40.0331453Z 323 │ │ yield* Effect.yieldNow; 2026-10-24T14:24:40.0331583Z 324 │ ╰─▶ } 2026-10-24T14:24:40.0331637Z 325 │ 2026-10-24T14:24:40.0331689Z ╰──── 2026-10-24T14:24:40.0331696Z 2026-10-24T14:24:40.0332163Z ⚠ 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-24T14:24:40.0332294Z ╭─[packages/client-runtime/src/rpc/client.test.ts:330:7] 2026-10-24T14:24:40.0332459Z 329 │ yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient))); 2026-10-24T14:24:40.0332711Z 330 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-24T14:24:40.0332815Z 331 │ │ yield* Effect.yieldNow; 2026-10-24T14:24:40.0332945Z 332 │ ╰─▶ } 2026-10-24T14:24:40.0333053Z 333 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-24T14:24:40.0333108Z ╰──── 2026-10-24T14:24:40.0333111Z 2026-10-24T14:24:40.0333573Z ⚠ 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-24T14:24:40.0333709Z ╭─[apps/server/src/project/ProjectService.test.ts:94:3] 2026-10-24T14:24:40.0333765Z 93 │ ) { 2026-10-24T14:24:40.0333963Z 94 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T14:24:40.0334137Z 95 │ │ const project = Option.getOrThrow(yield* service.getById(projectId)); 2026-10-24T14:24:40.0334318Z 96 │ │ if (predicate(project)) return project; 2026-10-24T14:24:40.0334448Z 97 │ │ yield* Effect.yieldNow; 2026-10-24T14:24:40.0334572Z 98 │ ╰─▶ } 2026-10-24T14:24:40.0334722Z 99 │ return yield* Effect.die(`Project ${projectId} was not enriched in time.`); 2026-10-24T14:24:40.0334775Z ╰──── 2026-10-24T14:24:40.0334777Z 2026-10-24T14:24:40.0335040Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:24:40.0335191Z ╭─[apps/mobile/src/components/VideoPreviewModal.ios.tsx:63:55] 2026-10-24T14:24:40.0335249Z 61 │ }, []); 2026-10-24T14:24:40.0335315Z 62 │ useEffect(() => { 2026-10-24T14:24:40.0335389Z ·  ────┬──── 2026-10-24T14:24:40.0335526Z · ╰── This is the containing effect 2026-10-24T14:24:40.0335680Z 63 │ if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl); 2026-10-24T14:24:40.0335805Z ·  ───────┬────── 2026-10-24T14:24:40.0336015Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:40.0336095Z 64 │ }, [playbackUrl, resolvedUrl]); 2026-10-24T14:24:40.0336148Z ╰──── 2026-10-24T14:24:40.0336842Z  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-24T14:24:40.0337176Z  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-24T14:24:40.0337184Z 2026-10-24T14:24:40.0337444Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:24:40.0337576Z ╭─[apps/mobile/src/state/use-vcs-action-state.ts:86:5] 2026-10-24T14:24:40.0337687Z 83 │ const [nowMs, setNowMs] = useState(() => Date.now()); 2026-10-24T14:24:40.0337752Z 84 │ useEffect(() => { 2026-10-24T14:24:40.0337824Z ·  ────┬──── 2026-10-24T14:24:40.0337954Z · ╰── This is the containing effect 2026-10-24T14:24:40.0338042Z 85 │ if (!actionState.isRunning) return; 2026-10-24T14:24:40.0338109Z 86 │ setNowMs(Date.now()); 2026-10-24T14:24:40.0338187Z ·  ────┬─── 2026-10-24T14:24:40.0338378Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:40.0338506Z 87 │ const interval = setInterval(() => setNowMs(Date.now()), 1000); 2026-10-24T14:24:40.0338557Z ╰──── 2026-10-24T14:24:40.0339161Z  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-24T14:24:40.0339486Z  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-24T14:24:40.0339489Z 2026-10-24T14:24:40.0339762Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:24:40.0339938Z ╭─[apps/mobile/src/components/ComposerEditor.tsx:82:6] 2026-10-24T14:24:40.0339993Z 81 │ }, 2026-10-24T14:24:40.0340057Z 82 │ [draftKey], 2026-10-24T14:24:40.0340130Z ·  ────┬─── 2026-10-24T14:24:40.0340269Z · ╰── Unnecessary dependency `draftKey` 2026-10-24T14:24:40.0340326Z 83 │ ); 2026-10-24T14:24:40.0340378Z ╰──── 2026-10-24T14:24:40.0340675Z  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-24T14:24:40.0340994Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0341000Z 2026-10-24T14:24:40.0341168Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T14:24:40.0341316Z ╭─[apps/web/src/components/chat/useThreadLifecycle.tsx:178:58] 2026-10-24T14:24:40.0341432Z 177 │ if (snoozeClockState.shell !== activeThreadShell) { 2026-10-24T14:24:40.0341599Z 178 │ setSnoozeClockState({ shell: activeThreadShell, now: new Date().toISOString() }); 2026-10-24T14:24:40.0341722Z ·  ─────┬──── 2026-10-24T14:24:40.0341896Z · ╰── Cannot call impure function 2026-10-24T14:24:40.0341952Z 179 │ } 2026-10-24T14:24:40.0342005Z ╰──── 2026-10-24T14:24:40.0342292Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T14:24:40.0342592Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T14:24:40.0342595Z 2026-10-24T14:24:40.0342857Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:24:40.0342993Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:60:5] 2026-10-24T14:24:40.0343047Z 57 │ 2026-10-24T14:24:40.0343111Z 58 │ useEffect(() => { 2026-10-24T14:24:40.0343183Z ·  ────┬──── 2026-10-24T14:24:40.0343312Z · ╰── This is the containing effect 2026-10-24T14:24:40.0343412Z 59 │ const controller = new AbortController(); 2026-10-24T14:24:40.0343487Z 60 │ setLoadState("pending"); 2026-10-24T14:24:40.0343562Z ·  ──────┬───── 2026-10-24T14:24:40.0343730Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:40.0343890Z 61 │ // A renewed signature is used on Retry, not as a reason to reset the native player. 2026-10-24T14:24:40.0343942Z ╰──── 2026-10-24T14:24:40.0344545Z  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-24T14:24:40.0344922Z  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-24T14:24:40.0344956Z 2026-10-24T14:24:40.0345160Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:24:40.0345296Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:71:7] 2026-10-24T14:24:40.0345377Z 70 │ return () => controller.abort(); 2026-10-24T14:24:40.0345475Z 71 │ }, [player, props.playRequested, attempt]); 2026-10-24T14:24:40.0345652Z ·  ───┬── ─────────┬───────── ───┬─── 2026-10-24T14:24:40.0345883Z · │ │ ╰── Unnecessary dependency `attempt` 2026-10-24T14:24:40.0346093Z · │ ╰── Unnecessary dependency `props.playRequested` 2026-10-24T14:24:40.0346236Z · ╰── Unnecessary dependency `player_0` 2026-10-24T14:24:40.0346290Z 72 │ 2026-10-24T14:24:40.0346343Z ╰──── 2026-10-24T14:24:40.0346642Z  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-24T14:24:40.0346955Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0346958Z 2026-10-24T14:24:40.0347165Z ⚠ typescript(no-extraneous-class): Unexpected class with only a constructor. 2026-10-24T14:24:40.0347292Z ╭─[apps/desktop/src/preview/Manager.test.ts:158:18] 2026-10-24T14:24:40.0347399Z 157 │ BrowserWindow: browserWindowConstructor, 2026-10-24T14:24:40.0347563Z 158 │ ╭─▶ ClipboardItem: class { 2026-10-24T14:24:40.0347693Z 159 │ │ constructor(data: Record) { 2026-10-24T14:24:40.0347814Z 160 │ │ clipboardItemConstructor(data); 2026-10-24T14:24:40.0347889Z 161 │ │ } 2026-10-24T14:24:40.0348016Z 162 │ ╰─▶ }, 2026-10-24T14:24:40.0348081Z 163 │ clipboard: { 2026-10-24T14:24:40.0348134Z ╰──── 2026-10-24T14:24:40.0348305Z  help: Try replacing this class with a standalone function or deleting it entirely 2026-10-24T14:24:40.0348307Z 2026-10-24T14:24:40.0348679Z ⚠ 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-24T14:24:40.0348827Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:50:18] 2026-10-24T14:24:40.0348990Z 49 │ for (const tool of ["sendMessage", "followupTask", "interruptAgent", "listAgents"]) { 2026-10-24T14:24:40.0349163Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-24T14:24:40.0349250Z ·  ───────── 2026-10-24T14:24:40.0349431Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-24T14:24:40.0349484Z ╰──── 2026-10-24T14:24:40.0349486Z 2026-10-24T14:24:40.0349823Z ⚠ 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-24T14:24:40.0350021Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:51:18] 2026-10-24T14:24:40.0350226Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-24T14:24:40.0350403Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-24T14:24:40.0350489Z ·  ───────── 2026-10-24T14:24:40.0350543Z 52 │ } 2026-10-24T14:24:40.0350594Z ╰──── 2026-10-24T14:24:40.0350596Z 2026-10-24T14:24:40.0350932Z ⚠ 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-24T14:24:40.0351073Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:55:5] 2026-10-24T14:24:40.0351137Z 54 │ assert.equal( 2026-10-24T14:24:40.0351311Z 55 │ Schema.is(CodexSchema.ServerNotification__CollabAgentToolCallStatus)("interrupted"), 2026-10-24T14:24:40.0351389Z ·  ───────── 2026-10-24T14:24:40.0351448Z 56 │ true, 2026-10-24T14:24:40.0351500Z ╰──── 2026-10-24T14:24:40.0351502Z 2026-10-24T14:24:40.0351835Z ⚠ 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-24T14:24:40.0351974Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:59:5] 2026-10-24T14:24:40.0352036Z 58 │ assert.equal( 2026-10-24T14:24:40.0352219Z 59 │ Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentToolCallStatus)("interrupted"), 2026-10-24T14:24:40.0352290Z ·  ───────── 2026-10-24T14:24:40.0352349Z 60 │ true, 2026-10-24T14:24:40.0352402Z ╰──── 2026-10-24T14:24:40.0352404Z 2026-10-24T14:24:40.0352744Z ⚠ 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-24T14:24:40.0352897Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:103:16] 2026-10-24T14:24:40.0352950Z 102 │ 2026-10-24T14:24:40.0353119Z 103 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse)(resumeResponse), true); 2026-10-24T14:24:40.0353204Z ·  ───────── 2026-10-24T14:24:40.0353258Z 104 │ }); 2026-10-24T14:24:40.0353309Z ╰──── 2026-10-24T14:24:40.0353311Z 2026-10-24T14:24:40.0353518Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-24T14:24:40.0353643Z ╭─[apps/web/src/contextMenuFallback.test.ts:38:9] 2026-10-24T14:24:40.0353712Z 37 │ get isConnected() { 2026-10-24T14:24:40.0353856Z 38 │ let current: FakeElement | null = this; 2026-10-24T14:24:40.0353964Z ·  ─────── 2026-10-24T14:24:40.0354037Z 39 │ while (current?.parent) { 2026-10-24T14:24:40.0354089Z ╰──── 2026-10-24T14:24:40.0354369Z  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-24T14:24:40.0354372Z 2026-10-24T14:24:40.0354518Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0354671Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:152:27] 2026-10-24T14:24:40.0354853Z 151 │ 2026-10-24T14:24:40.0354932Z 152 │ {props.children(open)} 2026-10-24T14:24:40.0355032Z ·  ──┬─ 2026-10-24T14:24:40.0355198Z · ╰── Cannot access ref value during render 2026-10-24T14:24:40.0355262Z 153 │ 2026-10-24T14:24:40.0355313Z ╰──── 2026-10-24T14:24:40.0355791Z  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-24T14:24:40.0356086Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0356088Z 2026-10-24T14:24:40.0356287Z ⚠ react(memo-dependencies): Found missing/extra memoization dependencies 2026-10-24T14:24:40.0356443Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:140:9] 2026-10-24T14:24:40.0356528Z 139 │ if (action.id !== undefined) { 2026-10-24T14:24:40.0356607Z 140 │ props.onPressAction?.({ 2026-10-24T14:24:40.0356680Z ·  ──┬── 2026-10-24T14:24:40.0356812Z · ╰── Missing dependency `props` 2026-10-24T14:24:40.0356903Z 141 │ nativeEvent: { event: action.id }, 2026-10-24T14:24:40.0357050Z 142 │ } as Parameters>[0]); 2026-10-24T14:24:40.0357107Z 143 │ } 2026-10-24T14:24:40.0357164Z 144 │ }, 2026-10-24T14:24:40.0357246Z 145 │ [close, props.onPressAction], 2026-10-24T14:24:40.0357342Z ·  ─────────┬───────── 2026-10-24T14:24:40.0357568Z · ╰── Overly precise dependency `props.onPressAction`, use `props` instead 2026-10-24T14:24:40.0357630Z 146 │ ); 2026-10-24T14:24:40.0357684Z ╰──── 2026-10-24T14:24:40.0358172Z  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-24T14:24:40.0358517Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0358520Z 2026-10-24T14:24:40.0358749Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T14:24:40.0358886Z ╭─[apps/mobile/src/state/use-composer-drafts.ts:1022:15] 2026-10-24T14:24:40.0359019Z 1021 │ instanceId, 2026-10-24T14:24:40.0359263Z 1022 │ { ...(persisted.modelOptionMemory[instanceId] ?? {}), ...models }, 2026-10-24T14:24:40.0359407Z ·  ────────────────────────────────────────────────── 2026-10-24T14:24:40.0359469Z 1023 │ ]), 2026-10-24T14:24:40.0359526Z ╰──── 2026-10-24T14:24:40.0359796Z  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-24T14:24:40.0359798Z 2026-10-24T14:24:40.0360001Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:24:40.0360117Z ╭─[apps/mobile/src/state/thread-order.ts:29:7] 2026-10-24T14:24:40.0360191Z 28 │ getPendingThreadOrder(); 2026-10-24T14:24:40.0360279Z 29 │ }, [nowMinute, snoozeWakeTick]); 2026-10-24T14:24:40.0360409Z ·  ────┬──── ───────┬────── 2026-10-24T14:24:40.0360605Z · │ ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T14:24:40.0360745Z · ╰── Unnecessary dependency `nowMinute` 2026-10-24T14:24:40.0360813Z 30 │ return pending; 2026-10-24T14:24:40.0360866Z ╰──── 2026-10-24T14:24:40.0361165Z  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-24T14:24:40.0361480Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0361482Z 2026-10-24T14:24:40.0361968Z ⚠ 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-24T14:24:40.0362143Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7] 2026-10-24T14:24:40.0362251Z 565 │ let afterSequence = created[0]!.sequence; 2026-10-24T14:24:40.0362452Z 566 │ ╭─▶ for (let index = 1; index <= 32; index += 1) { 2026-10-24T14:24:40.0362556Z 567 │ │ const nextEvent = { 2026-10-24T14:24:40.0362718Z 568 │ │ id: EventId.make(`event:foundation-stream-race:${index}`), 2026-10-24T14:24:40.0362855Z 569 │ │ type: "thread.metadata-updated" as const, 2026-10-24T14:24:40.0362955Z 570 │ │ threadId, 2026-10-24T14:24:40.0363063Z 571 │ │ providerInstanceId, 2026-10-24T14:24:40.0363164Z 572 │ │ occurredAt: now, 2026-10-24T14:24:40.0363315Z 573 │ │ payload: { ...thread, title: `Race update ${index}` }, 2026-10-24T14:24:40.0363445Z 574 │ │ } satisfies OrchestrationV2DomainEvent; 2026-10-24T14:24:40.0363560Z 575 │ │ const reader = yield* eventSink 2026-10-24T14:24:40.0363683Z 576 │ │ .stream({ threadId, afterSequence }) 2026-10-24T14:24:40.0363818Z 577 │ │ .pipe(Stream.runHead, Effect.forkChild); 2026-10-24T14:24:40.0363923Z 578 │ │ yield* Effect.yieldNow; 2026-10-24T14:24:40.0364140Z 579 │ │ const written = yield* eventSink.write({ events: [nextEvent] }); 2026-10-24T14:24:40.0364306Z 580 │ │ const received = yield* Fiber.join(reader); 2026-10-24T14:24:40.0364427Z 581 │ │ if (Option.isNone(received)) { 2026-10-24T14:24:40.0364633Z 582 │ │ return yield* Effect.die("The event stream ended before delivering the live event."); 2026-10-24T14:24:40.0364715Z 583 │ │ } 2026-10-24T14:24:40.0364878Z 584 │ │ assert.equal(received.value.sequence, written[0]?.sequence); 2026-10-24T14:24:40.0365027Z 585 │ │ assert.equal(received.value.event.id, nextEvent.id); 2026-10-24T14:24:40.0365158Z 586 │ │ afterSequence = received.value.sequence; 2026-10-24T14:24:40.0365297Z 587 │ ╰─▶ } 2026-10-24T14:24:40.0365361Z 588 │ }), 2026-10-24T14:24:40.0365420Z ╰──── 2026-10-24T14:24:40.0365422Z 2026-10-24T14:24:40.0365898Z ⚠ 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-24T14:24:40.0366079Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:2327:9] 2026-10-24T14:24:40.0366156Z 2326 │ let settled = false; 2026-10-24T14:24:40.0366320Z 2327 │ ╭─▶ while (!settled) { 2026-10-24T14:24:40.0366480Z 2328 │ │ settled = (yield* outbox.listByCommandId(commandId)).every( 2026-10-24T14:24:40.0366621Z 2329 │ │ (effect) => effect.status === "succeeded", 2026-10-24T14:24:40.0366705Z 2330 │ │ ); 2026-10-24T14:24:40.0366835Z 2331 │ │ if (!settled) yield* Effect.yieldNow; 2026-10-24T14:24:40.0366975Z 2332 │ ╰─▶ } 2026-10-24T14:24:40.0367098Z 2333 │ }).pipe(Effect.provide(layerWorker), Effect.scoped); 2026-10-24T14:24:40.0367153Z ╰──── 2026-10-24T14:24:40.0367158Z 2026-10-24T14:24:40.0367327Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T14:24:40.0367465Z ╭─[apps/web/src/components/CustomSnoozeDialog.tsx:140:58] 2026-10-24T14:24:40.0367601Z 139 │ {...(weekStartsOn === undefined ? {} : { weekStartsOn })} 2026-10-24T14:24:40.0367759Z 140 │ disabled={{ before: new Date(new Date().setHours(0, 0, 0, 0)) }} 2026-10-24T14:24:40.0367887Z ·  ─────┬──── 2026-10-24T14:24:40.0368066Z · ╰── Cannot call impure function 2026-10-24T14:24:40.0368166Z 141 │ onSelect={(selected) => { 2026-10-24T14:24:40.0368218Z ╰──── 2026-10-24T14:24:40.0368536Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T14:24:40.0368835Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T14:24:40.0368837Z 2026-10-24T14:24:40.0369133Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-24T14:24:40.0369339Z ╭─[apps/web/src/components/pullRequest/pullRequestList.logic.ts:262:9] 2026-10-24T14:24:40.0369404Z 261 │ ): boolean { 2026-10-24T14:24:40.0369555Z 262 │ const labels = entry.labels.map((label) => label.name.trim().toLowerCase()); 2026-10-24T14:24:40.0369721Z ·  ───────────────────────────────────────────────────────────────────── 2026-10-24T14:24:40.0369869Z 263 │ const holds = (label: string) => labels.includes(label.trim().toLowerCase()); 2026-10-24T14:24:40.0369922Z ╰──── 2026-10-24T14:24:40.0369998Z  help: Switch to `Set` 2026-10-24T14:24:40.0370001Z 2026-10-24T14:24:40.0370296Z ⚠ eslint(no-unused-vars): Variable 'layerUnavailable' is declared but never used. Unused variables should start with a '_'. 2026-10-24T14:24:40.0370449Z ╭─[apps/server/src/orchestration-v2/Orchestrator.ts:12380:7] 2026-10-24T14:24:40.0370507Z 12379 │ 2026-10-24T14:24:40.0370650Z 12380 │ const layerUnavailable: Layer.Layer = Layer.succeed( 2026-10-24T14:24:40.0370740Z ·  ────────┬─────── 2026-10-24T14:24:40.0370892Z · ╰── 'layerUnavailable' is declared here 2026-10-24T14:24:40.0370965Z 12381 │ OrchestratorV2, 2026-10-24T14:24:40.0371020Z ╰──── 2026-10-24T14:24:40.0371126Z  help: Consider removing this declaration. 2026-10-24T14:24:40.0371129Z 2026-10-24T14:24:40.0371390Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T14:24:40.0371540Z ╭─[packages/provider-opencode/src/server/adapter.ts:3755:7] 2026-10-24T14:24:40.0371598Z 3754 │ 2026-10-24T14:24:40.0371800Z 3755 │ const layer: Layer.Layer = 2026-10-24T14:24:40.0371873Z ·  ──┬── 2026-10-24T14:24:40.0371999Z · ╰── 'layer' is declared here 2026-10-24T14:24:40.0372064Z 3756 │ Layer.effect( 2026-10-24T14:24:40.0372120Z ╰──── 2026-10-24T14:24:40.0372225Z  help: Consider removing this declaration. 2026-10-24T14:24:40.0372228Z 2026-10-24T14:24:40.0372395Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T14:24:40.0372585Z ╭─[packages/provider-opencode/src/server/OpenCodeRuntime.environment.test.ts:53:14] 2026-10-24T14:24:40.0372639Z 52 │ 2026-10-24T14:24:40.0372713Z 53 │ for (const {} of [ 2026-10-24T14:24:40.0372791Z ·  ── 2026-10-24T14:24:40.0372857Z 54 │ { healthy: true }, 2026-10-24T14:24:40.0372910Z ╰──── 2026-10-24T14:24:40.0373144Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T14:24:40.0373147Z 2026-10-24T14:24:40.0373342Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T14:24:40.0373513Z ╭─[apps/web/src/components/pullRequest/PullRequestChecksPopover.tsx:88:15] 2026-10-24T14:24:40.0373578Z 87 │
  • { 2026-10-24T14:24:40.0384021Z ╰──── 2026-10-24T14:24:40.0384315Z  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-24T14:24:40.0384616Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T14:24:40.0384619Z 2026-10-24T14:24:40.0384766Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0384920Z ╭─[apps/mobile/src/features/home/thread-swipe-actions.tsx:494:27] 2026-10-24T14:24:40.0384979Z 493 │ > 2026-10-24T14:24:40.0385060Z 494 │ {props.children(close)} 2026-10-24T14:24:40.0385151Z ·  ──┬── 2026-10-24T14:24:40.0385313Z · ╰── Cannot access ref value during render 2026-10-24T14:24:40.0385396Z 495 │ 2026-10-24T14:24:40.0385452Z ╰──── 2026-10-24T14:24:40.0385925Z  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-24T14:24:40.0386219Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0386222Z 2026-10-24T14:24:40.0386437Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T14:24:40.0386564Z ╭─[apps/web/src/lib/announce.browser.test.ts:41:46] 2026-10-24T14:24:40.0386622Z 40 │ 2026-10-24T14:24:40.0386738Z 41 │ expect(regionTexts()).toEqual([...first].reverse()); 2026-10-24T14:24:40.0386852Z ·  ─────── 2026-10-24T14:24:40.0386947Z 42 │ expect(regionTexts()).toContain("Claude"); 2026-10-24T14:24:40.0387001Z ╰──── 2026-10-24T14:24:40.0387267Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T14:24:40.0387269Z 2026-10-24T14:24:40.0387481Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T14:24:40.0387614Z ╭─[apps/web/src/lib/composerContextReferences.ts:90:40] 2026-10-24T14:24:40.0387690Z 89 │ let cursor = prompt.length; 2026-10-24T14:24:40.0387798Z 90 │ for (const occurrence of occurrences.reverse()) { 2026-10-24T14:24:40.0387905Z ·  ─────── 2026-10-24T14:24:40.0388044Z 91 │ let { start, end } = occurrence; 2026-10-24T14:24:40.0388149Z ╰──── 2026-10-24T14:24:40.0388452Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T14:24:40.0388455Z 2026-10-24T14:24:40.0388672Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T14:24:40.0388776Z ╭─[apps/mobile/src/Stack.tsx:1079:21] 2026-10-24T14:24:40.0388842Z 1078 │ } 2026-10-24T14:24:40.0389115Z ·  ───────────────────────────────────────────── 2026-10-24T14:24:40.0389200Z 1080 │ screenOptions={({ route }) => 2026-10-24T14:24:40.0389257Z ╰──── 2026-10-24T14:24:40.0389634Z  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-24T14:24:40.0389640Z 2026-10-24T14:24:40.0390020Z ⚠ 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-24T14:24:40.0390145Z ╭─[packages/shared/src/otelEnvironment.ts:146:14] 2026-10-24T14:24:40.0390204Z 145 │ name, 2026-10-24T14:24:40.0390347Z 146 │ (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()), 2026-10-24T14:24:40.0390454Z ·  ────────────────────────── 2026-10-24T14:24:40.0390577Z 147 │ `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`, 2026-10-24T14:24:40.0390634Z ╰──── 2026-10-24T14:24:40.0390640Z 2026-10-24T14:24:40.0390843Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:24:40.0390990Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7] 2026-10-24T14:24:40.0391089Z 256 │ return () => cancelAnimationFrame(frame); 2026-10-24T14:24:40.0391168Z 257 │ }, [props.path, targetIndex]); 2026-10-24T14:24:40.0391246Z ·  ─────┬──── 2026-10-24T14:24:40.0391397Z · ╰── Unnecessary dependency `props.path` 2026-10-24T14:24:40.0391452Z 258 │ 2026-10-24T14:24:40.0391504Z ╰──── 2026-10-24T14:24:40.0391808Z  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-24T14:24:40.0392129Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0392134Z 2026-10-24T14:24:40.0392330Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T14:24:40.0392480Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23] 2026-10-24T14:24:40.0392553Z 292 │ 2026-10-24T14:24:40.0393730Z ·  ─────────── 2026-10-24T14:24:40.0393798Z 310 │ {body} 2026-10-24T14:24:40.0393850Z ╰──── 2026-10-24T14:24:40.0394000Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T14:24:40.0394002Z 2026-10-24T14:24:40.0394215Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T14:24:40.0394361Z ╭─[packages/shared/src/composerContextLegacySend.ts:19:45] 2026-10-24T14:24:40.0394490Z 18 │ const occurrences = collectComposerContextReferences(text); 2026-10-24T14:24:40.0394600Z 19 │ for (const occurrence of [...occurrences].reverse()) { 2026-10-24T14:24:40.0394712Z ·  ─────── 2026-10-24T14:24:40.0394825Z 20 │ const record = recordsById.get(occurrence.contextId); 2026-10-24T14:24:40.0394876Z ╰──── 2026-10-24T14:24:40.0395139Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T14:24:40.0395142Z 2026-10-24T14:24:40.0395402Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:24:40.0395549Z ╭─[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5] 2026-10-24T14:24:40.0395606Z 150 │ 2026-10-24T14:24:40.0395671Z 151 │ useEffect(() => { 2026-10-24T14:24:40.0395744Z ·  ────┬──── 2026-10-24T14:24:40.0395880Z · ╰── This is the containing effect 2026-10-24T14:24:40.0395963Z 152 │ if (!controlledSelectedPath) { 2026-10-24T14:24:40.0396028Z 153 │ return; 2026-10-24T14:24:40.0396087Z 154 │ } 2026-10-24T14:24:40.0396173Z 155 │ setExpandedPaths((current) => { 2026-10-24T14:24:40.0396254Z ·  ────────┬─────── 2026-10-24T14:24:40.0396428Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:40.0396554Z 156 │ const ancestors = ancestorPaths(controlledSelectedPath); 2026-10-24T14:24:40.0396607Z ╰──── 2026-10-24T14:24:40.0397271Z  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-24T14:24:40.0397630Z  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-24T14:24:40.0397633Z 2026-10-24T14:24:40.0397862Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T14:24:40.0397988Z ╭─[apps/server/src/terminal/Manager.test.ts:731:31] 2026-10-24T14:24:40.0398047Z 730 │ ); 2026-10-24T14:24:40.0398231Z 731 │ const snapshot = events.filter((event) => event.type === "snapshot").at(-1)?.snapshot; 2026-10-24T14:24:40.0398332Z ·  ────── 2026-10-24T14:24:40.0398477Z 732 │ expect(snapshot?.history).toBe("aa😀\rEND"); 2026-10-24T14:24:40.0398531Z ╰──── 2026-10-24T14:24:40.0398706Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T14:24:40.0398709Z 2026-10-24T14:24:40.0398967Z ⚠ eslint(no-unused-vars): Function 'normalizeTerminalContextSelection' is declared but never used. 2026-10-24T14:24:40.0399084Z ╭─[apps/web/src/lib/terminalContext.ts:56:10] 2026-10-24T14:24:40.0399139Z 55 │ 2026-10-24T14:24:40.0399242Z 56 │ function normalizeTerminalContextSelection( 2026-10-24T14:24:40.0399355Z ·  ────────────────┬──────────────── 2026-10-24T14:24:40.0399561Z · ╰── 'normalizeTerminalContextSelection' is declared here 2026-10-24T14:24:40.0399658Z 57 │ selection: TerminalContextSelection, 2026-10-24T14:24:40.0399713Z ╰──── 2026-10-24T14:24:40.0399818Z  help: Consider removing this declaration. 2026-10-24T14:24:40.0399821Z 2026-10-24T14:24:40.0400304Z ⚠ 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-24T14:24:40.0400490Z ╭─[apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts:223:5] 2026-10-24T14:24:40.0400566Z 222 │ let idlePasses = 0; 2026-10-24T14:24:40.0439976Z 223 │ ╭─▶ for (;;) { 2026-10-24T14:24:40.0440208Z 224 │ │ yield* Effect.promise(() => Promise.resolve()); 2026-10-24T14:24:40.0440370Z 225 │ │ const pending = backgroundRuntime.pending.shift(); 2026-10-24T14:24:40.0440473Z 226 │ │ if (!pending) { 2026-10-24T14:24:40.0440571Z 227 │ │ idlePasses++; 2026-10-24T14:24:40.0440682Z 228 │ │ if (idlePasses >= 3) { 2026-10-24T14:24:40.0440775Z 229 │ │ return; 2026-10-24T14:24:40.0440856Z 230 │ │ } 2026-10-24T14:24:40.0440945Z 231 │ │ continue; 2026-10-24T14:24:40.0441024Z 232 │ │ } 2026-10-24T14:24:40.0441119Z 233 │ │ idlePasses = 0; 2026-10-24T14:24:40.0441239Z 234 │ │ const exit = yield* Effect.exit( 2026-10-24T14:24:40.0441607Z 235 │ │ pending.operation as Effect.Effect, 2026-10-24T14:24:40.0441734Z 236 │ │ ); 2026-10-24T14:24:40.0441844Z 237 │ │ yield* Effect.sync(() => { 2026-10-24T14:24:40.0441949Z 238 │ │ pending.resolve(exit); 2026-10-24T14:24:40.0442027Z 239 │ │ }); 2026-10-24T14:24:40.0442161Z 240 │ ╰─▶ } 2026-10-24T14:24:40.0442221Z 241 │ }, 2026-10-24T14:24:40.0442273Z ╰──── 2026-10-24T14:24:40.0442278Z 2026-10-24T14:24:40.0442501Z ⚠ eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used. 2026-10-24T14:24:40.0442611Z ╭─[infra/relay/src/http/Api.ts:69:13] 2026-10-24T14:24:40.0442762Z 68 │ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts"; 2026-10-24T14:24:40.0442882Z 69 │ import * as HookForwarder from "../hooks/HookForwarder.ts"; 2026-10-24T14:24:40.0442972Z ·  ──────┬────── 2026-10-24T14:24:40.0443123Z · ╰── 'HookForwarder' is imported here 2026-10-24T14:24:40.0443228Z 70 │ import * as HeldHooks from "../hooks/HeldHooks.ts"; 2026-10-24T14:24:40.0443280Z ╰──── 2026-10-24T14:24:40.0443380Z  help: Consider removing this import. 2026-10-24T14:24:40.0443383Z 2026-10-24T14:24:40.0443574Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T14:24:40.0443768Z ╭─[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:116:34] 2026-10-24T14:24:40.0443848Z 115 │ return [...commands]; 2026-10-24T14:24:40.0443986Z 116 │ }, [activeThreadRef, pathname, registrationVersion, navigation]); 2026-10-24T14:24:40.0444105Z ·  ─────────┬───────── 2026-10-24T14:24:40.0444299Z · ╰── Unnecessary dependency `registrationVersion` 2026-10-24T14:24:40.0444354Z 117 │ 2026-10-24T14:24:40.0444405Z ╰──── 2026-10-24T14:24:40.0444736Z  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-24T14:24:40.0445064Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0445067Z 2026-10-24T14:24:40.0445309Z ⚠ eslint(no-unused-vars): Function 'assertUserMessagesExclude' is declared but never used. 2026-10-24T14:24:40.0445481Z ╭─[apps/server/src/orchestration-v2/testkit/fixtures/shared.ts:1398:10] 2026-10-24T14:24:40.0445535Z 1397 │ 2026-10-24T14:24:40.0445624Z 1398 │ function assertUserMessagesExclude( 2026-10-24T14:24:40.0445730Z ·  ────────────┬──────────── 2026-10-24T14:24:40.0445904Z · ╰── 'assertUserMessagesExclude' is declared here 2026-10-24T14:24:40.0446013Z 1399 │ projection: OrchestrationV2ThreadProjection, 2026-10-24T14:24:40.0446066Z ╰──── 2026-10-24T14:24:40.0446173Z  help: Consider removing this declaration. 2026-10-24T14:24:40.0446176Z 2026-10-24T14:24:40.0446335Z ⚠ react(immutability): This value cannot be modified 2026-10-24T14:24:40.0446562Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5] 2026-10-24T14:24:40.0446649Z 90 │ }) { 2026-10-24T14:24:40.0446764Z 91 │ const rotation = useSharedValue(props.hidden ? 1 : 0); 2026-10-24T14:24:40.0446841Z ·  ────┬─── 2026-10-24T14:24:40.0446976Z · ╰── `rotation` originates here 2026-10-24T14:24:40.0447049Z 92 │ useLayoutEffect(() => { 2026-10-24T14:24:40.0447195Z 93 │ rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING); 2026-10-24T14:24:40.0447267Z ·  ────┬─── 2026-10-24T14:24:40.0447401Z · ╰── `rotation` cannot be modified 2026-10-24T14:24:40.0447479Z 94 │ }, [props.hidden, rotation]); 2026-10-24T14:24:40.0447531Z ╰──── 2026-10-24T14:24:40.0447814Z  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-24T14:24:40.0448132Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:24:40.0448134Z 2026-10-24T14:24:40.0448295Z ⚠ react(immutability): This value cannot be modified 2026-10-24T14:24:40.0448501Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:269:5] 2026-10-24T14:24:40.0448597Z 266 │ const variant = props.variant ?? "plain"; 2026-10-24T14:24:40.0448730Z 267 │ const loadingVisibility = useSharedValue(props.loading ? 1 : 0); 2026-10-24T14:24:40.0448818Z ·  ────────┬──────── 2026-10-24T14:24:40.0448976Z · ╰── `loadingVisibility` originates here 2026-10-24T14:24:40.0449049Z 268 │ useLayoutEffect(() => { 2026-10-24T14:24:40.0449208Z 269 │ loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING); 2026-10-24T14:24:40.0449291Z ·  ────────┬──────── 2026-10-24T14:24:40.0449441Z · ╰── `loadingVisibility` cannot be modified 2026-10-24T14:24:40.0449533Z 270 │ }, [loadingVisibility, props.loading]); 2026-10-24T14:24:40.0449584Z ╰──── 2026-10-24T14:24:40.0449853Z  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-24T14:24:40.0450165Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:24:40.0450168Z 2026-10-24T14:24:40.0450330Z ⚠ react(immutability): This value cannot be modified 2026-10-24T14:24:40.0450504Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:328:5] 2026-10-24T14:24:40.0450558Z 325 │ }) { 2026-10-24T14:24:40.0450717Z 326 │ const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0); 2026-10-24T14:24:40.0450807Z ·  ─────────┬───────── 2026-10-24T14:24:40.0450963Z · ╰── `recordingVisibility` originates here 2026-10-24T14:24:40.0451032Z 327 │ useLayoutEffect(() => { 2026-10-24T14:24:40.0451226Z 328 │ recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING); 2026-10-24T14:24:40.0451313Z ·  ─────────┬───────── 2026-10-24T14:24:40.0451526Z · ╰── `recordingVisibility` cannot be modified 2026-10-24T14:24:40.0451648Z 329 │ }, [props.phase, recordingVisibility]); 2026-10-24T14:24:40.0451700Z ╰──── 2026-10-24T14:24:40.0451974Z  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-24T14:24:40.0452284Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:24:40.0452286Z 2026-10-24T14:24:40.0452433Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0452602Z ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14] 2026-10-24T14:24:40.0452684Z 26 │ const latestInput = useRef(input); 2026-10-24T14:24:40.0452765Z 27 │ latestInput.current = input; 2026-10-24T14:24:40.0452879Z ·  ─────┬─────────┬─── 2026-10-24T14:24:40.0453068Z · │ ╰── Cannot update ref value during render 2026-10-24T14:24:40.0453186Z · ╰── This value is a ref 2026-10-24T14:24:40.0453264Z 28 │ const mounted = useRef(true); 2026-10-24T14:24:40.0453315Z ╰──── 2026-10-24T14:24:40.0453804Z  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-24T14:24:40.0454104Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0454114Z 2026-10-24T14:24:40.0454274Z ⚠ react(immutability): This value cannot be modified 2026-10-24T14:24:40.0454443Z ╭─[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5] 2026-10-24T14:24:40.0454545Z 65 │ const [expanded, setExpanded] = useState(false); 2026-10-24T14:24:40.0454630Z 66 │ const progress = useSharedValue(0); 2026-10-24T14:24:40.0454704Z ·  ────┬─── 2026-10-24T14:24:40.0454837Z · ╰── `progress` originates here 2026-10-24T14:24:40.0454903Z 67 │ useEffect(() => { 2026-10-24T14:24:40.0455028Z 68 │ progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING); 2026-10-24T14:24:40.0455099Z ·  ────┬─── 2026-10-24T14:24:40.0455232Z · ╰── `progress` cannot be modified 2026-10-24T14:24:40.0455309Z 69 │ }, [expanded, progress]); 2026-10-24T14:24:40.0455365Z ╰──── 2026-10-24T14:24:40.0455635Z  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-24T14:24:40.0455946Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:24:40.0455949Z 2026-10-24T14:24:40.0456215Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:24:40.0456463Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:333:7] 2026-10-24T14:24:40.0456518Z 328 │ }; 2026-10-24T14:24:40.0456586Z 329 │ useEffect(() => { 2026-10-24T14:24:40.0456722Z ·  ────┬──── 2026-10-24T14:24:40.0456996Z · ╰── This is the containing effect 2026-10-24T14:24:40.0457097Z 330 │ if (!guidesEnabled && section === "guide") { 2026-10-24T14:24:40.0457193Z 331 │ requestedSection.current = "overview"; 2026-10-24T14:24:40.0457363Z 332 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-24T14:24:40.0457435Z 333 │ setSection("overview"); 2026-10-24T14:24:40.0457512Z ·  ─────┬──── 2026-10-24T14:24:40.0457684Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:40.0457740Z 334 │ } 2026-10-24T14:24:40.0457790Z ╰──── 2026-10-24T14:24:40.0458449Z  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-24T14:24:40.0458784Z  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-24T14:24:40.0458787Z 2026-10-24T14:24:40.0458995Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T14:24:40.0459169Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:335:6] 2026-10-24T14:24:40.0459266Z 330 │ if (!guidesEnabled && section === "guide") { 2026-10-24T14:24:40.0459362Z 331 │ requestedSection.current = "overview"; 2026-10-24T14:24:40.0459446Z ·  ────────┬─────── 2026-10-24T14:24:40.0459912Z · ╰── 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-24T14:24:40.0460080Z 332 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-24T14:24:40.0460232Z ·  ─────────┬───────── ──────┬────── 2026-10-24T14:24:40.0460746Z · │ ╰── 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-24T14:24:40.0461258Z · ╰── 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-24T14:24:40.0461362Z 333 │ setSection("overview"); 2026-10-24T14:24:40.0461416Z 334 │ } 2026-10-24T14:24:40.0461509Z 335 │ }, [guidesEnabled, section, insets.top]); 2026-10-24T14:24:40.0461623Z ·  ──────────────────┬───────────────── 2026-10-24T14:24:40.0461823Z · ╰── This dependency list is missing values used by the callback 2026-10-24T14:24:40.0461910Z 336 │ const tabContent = activityContent; 2026-10-24T14:24:40.0461962Z ╰──── 2026-10-24T14:24:40.0462134Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T14:24:40.0462463Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0462469Z 2026-10-24T14:24:40.0462678Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T14:24:40.0462852Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:877:6] 2026-10-24T14:24:40.0462912Z 860 │ if ( 2026-10-24T14:24:40.0463030Z 861 │ lastSelection.current.path === route.params.path && 2026-10-24T14:24:40.0463109Z ·  ──────┬────── 2026-10-24T14:24:40.0463561Z · ╰── 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-24T14:24:40.0463695Z 862 │ lastSelection.current.id === route.params.fileSelectionId 2026-10-24T14:24:40.0463753Z 863 │ ) 2026-10-24T14:24:40.0463817Z 864 │ return; 2026-10-24T14:24:40.0463996Z 865 │ lastSelection.current = { path: route.params.path, id: route.params.fileSelectionId }; 2026-10-24T14:24:40.0464134Z 866 │ if (route.params.focus) navigation.setParams({ focus: undefined }); 2026-10-24T14:24:40.0464221Z 867 │ setJumpPath(route.params.path); 2026-10-24T14:24:40.0464294Z 868 │ setSelectedRowId(null); 2026-10-24T14:24:40.0464372Z 869 │ jumpStarted.current = false; 2026-10-24T14:24:40.0464522Z 870 │ const file = data.files.find((entry) => entry.path === route.params.path); 2026-10-24T14:24:40.0464616Z 871 │ if (!file || !nativeView.current) return; 2026-10-24T14:24:40.0464706Z ·  ─────┬──── 2026-10-24T14:24:40.0465161Z · ╰── 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-24T14:24:40.0465290Z 872 │ setCollapsedIds((ids) => ids.filter((id) => id !== file.id)); 2026-10-24T14:24:40.0465368Z 873 │ jumpStarted.current = true; 2026-10-24T14:24:40.0465505Z 874 │ void nativeView.current.scrollToFile(file.id, false).catch(() => { 2026-10-24T14:24:40.0465587Z 875 │ jumpStarted.current = false; 2026-10-24T14:24:40.0465645Z 876 │ }); 2026-10-24T14:24:40.0465847Z 877 │ }, [route.params.path, route.params.fileSelectionId, route.params.focus, data.files, navigation]); 2026-10-24T14:24:40.0466054Z ·  ──────────────────────────────────────────────┬────────────────────────────────────────────── 2026-10-24T14:24:40.0466336Z · ╰── This dependency list is missing values used by the callback 2026-10-24T14:24:40.0466499Z 878 │ const appliedFilter = useRef(filter.hideTestFiles); 2026-10-24T14:24:40.0466552Z ╰──── 2026-10-24T14:24:40.0466722Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T14:24:40.0467042Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0467046Z 2026-10-24T14:24:40.0467192Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0467355Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:122:38] 2026-10-24T14:24:40.0467520Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-24T14:24:40.0467647Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-24T14:24:40.0467769Z ·  ───────────┬────────── 2026-10-24T14:24:40.0467947Z · ╰── Cannot access ref value during render 2026-10-24T14:24:40.0468067Z 123 │ const sessionRef = useRef(null); 2026-10-24T14:24:40.0468119Z ╰──── 2026-10-24T14:24:40.0468626Z  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-24T14:24:40.0468928Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0468934Z 2026-10-24T14:24:40.0469081Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0469239Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8] 2026-10-24T14:24:40.0469293Z 125 │ 2026-10-24T14:24:40.0469401Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T14:24:40.0469490Z ·  ─────────┬──────── 2026-10-24T14:24:40.0469642Z · ╰── Cannot access ref value during render 2026-10-24T14:24:40.0469745Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T14:24:40.0469795Z ╰──── 2026-10-24T14:24:40.0470285Z  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-24T14:24:40.0470585Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0470588Z 2026-10-24T14:24:40.0470734Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0470892Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7] 2026-10-24T14:24:40.0470945Z 125 │ 2026-10-24T14:24:40.0471051Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T14:24:40.0471139Z ·  ─────────┬───────── 2026-10-24T14:24:40.0471289Z · ╰── Cannot access ref value during render 2026-10-24T14:24:40.0471441Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T14:24:40.0471524Z ╰──── 2026-10-24T14:24:40.0472004Z  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-24T14:24:40.0472300Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0472302Z 2026-10-24T14:24:40.0472446Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0472606Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31] 2026-10-24T14:24:40.0472659Z 125 │ 2026-10-24T14:24:40.0472769Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T14:24:40.0472885Z ·  ─────────┬───────── 2026-10-24T14:24:40.0473058Z · ╰── Cannot access ref value during render 2026-10-24T14:24:40.0473158Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T14:24:40.0473209Z ╰──── 2026-10-24T14:24:40.0473685Z  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-24T14:24:40.0473981Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0473984Z 2026-10-24T14:24:40.0474136Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0474299Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30] 2026-10-24T14:24:40.0474351Z 125 │ 2026-10-24T14:24:40.0474455Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T14:24:40.0474570Z ·  ──────────┬───────── 2026-10-24T14:24:40.0474740Z · ╰── Cannot access ref value during render 2026-10-24T14:24:40.0474839Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T14:24:40.0474890Z ╰──── 2026-10-24T14:24:40.0475375Z  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-24T14:24:40.0475675Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0475677Z 2026-10-24T14:24:40.0475822Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0475983Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46] 2026-10-24T14:24:40.0476093Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T14:24:40.0476291Z 127 │ ╭─▶ const recorder = createLazyVoiceRecorder({ 2026-10-24T14:24:40.0476468Z 128 │ │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-24T14:24:40.0476651Z 129 │ │ onStatus: (status: RecordingStatus) => { 2026-10-24T14:24:40.0476836Z 130 │ │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-24T14:24:40.0476957Z 131 │ │ isFinished: status.isFinished, 2026-10-24T14:24:40.0477138Z 132 │ │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-24T14:24:40.0477242Z 133 │ │ error: status.error, 2026-10-24T14:24:40.0477342Z 134 │ │ url: status.url, 2026-10-24T14:24:40.0477422Z 135 │ │ }); 2026-10-24T14:24:40.0477501Z 136 │ │ }, 2026-10-24T14:24:40.0477700Z 137 │ │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-24T14:24:40.0477815Z 138 │ │ selectInput: (inputs) => { 2026-10-24T14:24:40.0477972Z 139 │ │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-24T14:24:40.0478119Z 140 │ │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-24T14:24:40.0478288Z 141 │ │ const known = microphoneOrder(preferences.value.microphones); 2026-10-24T14:24:40.0478452Z 142 │ │ const order = rememberMicrophones(known, inputs); 2026-10-24T14:24:40.0478553Z 143 │ │ if (order !== known) { 2026-10-24T14:24:40.0478692Z 144 │ │ registry.set(updateMobilePreferencesAtom, { 2026-10-24T14:24:40.0478809Z 145 │ │ transform: (current) => ({ 2026-10-24T14:24:40.0479026Z 146 │ │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-24T14:24:40.0479113Z 147 │ │ }), 2026-10-24T14:24:40.0479196Z 148 │ │ }); 2026-10-24T14:24:40.0479273Z 149 │ │ } 2026-10-24T14:24:40.0479415Z 150 │ │ return preferredMicrophoneInput(inputs, order); 2026-10-24T14:24:40.0479491Z 151 │ │ }, 2026-10-24T14:24:40.0479623Z 152 │ ├─▶ }); 2026-10-24T14:24:40.0479868Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T14:24:40.0479955Z 153 │ recorderRef.current = recorder; 2026-10-24T14:24:40.0480006Z ╰──── 2026-10-24T14:24:40.0480543Z  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-24T14:24:40.0480876Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0480878Z 2026-10-24T14:24:40.0481026Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0481187Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16] 2026-10-24T14:24:40.0481244Z 152 │ }); 2026-10-24T14:24:40.0481327Z 153 │ recorderRef.current = recorder; 2026-10-24T14:24:40.0481444Z ·  ─────┬─────────┬─── 2026-10-24T14:24:40.0481639Z · │ ╰── Cannot update ref value during render 2026-10-24T14:24:40.0481759Z · ╰── This value is a ref 2026-10-24T14:24:40.0481866Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T14:24:40.0481918Z ╰──── 2026-10-24T14:24:40.0482399Z  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-24T14:24:40.0482694Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0482696Z 2026-10-24T14:24:40.0482841Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0483005Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48] 2026-10-24T14:24:40.0483094Z 153 │ recorderRef.current = recorder; 2026-10-24T14:24:40.0483291Z 154 │ ╭─▶ sessionRef.current = new VoiceInputSession({ 2026-10-24T14:24:40.0483377Z 155 │ │ recorder, 2026-10-24T14:24:40.0483509Z 156 │ │ getTranscriber: getLocalVoiceTranscriber, 2026-10-24T14:24:40.0483626Z 157 │ │ requestPermission: async () => { 2026-10-24T14:24:40.0483794Z 158 │ │ const permission = await requestRecordingPermissionsAsync(); 2026-10-24T14:24:40.0483988Z 159 │ │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-24T14:24:40.0484072Z 160 │ │ }, 2026-10-24T14:24:40.0484218Z 161 │ │ configureRecording: configureVoiceRecordingAudio, 2026-10-24T14:24:40.0484354Z 162 │ │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-24T14:24:40.0484488Z 163 │ │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-24T14:24:40.0484607Z 164 │ │ onStateChange: (nextState) => 2026-10-24T14:24:40.0484698Z 165 │ │ setState({ 2026-10-24T14:24:40.0484801Z 166 │ │ state: nextState, 2026-10-24T14:24:40.0484939Z 167 │ │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-24T14:24:40.0485068Z 168 │ │ label: sessionRef.current?.label ?? null, 2026-10-24T14:24:40.0485148Z 169 │ │ }), 2026-10-24T14:24:40.0485334Z 170 │ ├─▶ }); 2026-10-24T14:24:40.0485568Z · ╰──── Cannot access ref value during render 2026-10-24T14:24:40.0485624Z 171 │ } 2026-10-24T14:24:40.0485676Z ╰──── 2026-10-24T14:24:40.0486150Z  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-24T14:24:40.0486446Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0486449Z 2026-10-24T14:24:40.0486598Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0486760Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15] 2026-10-24T14:24:40.0486843Z 153 │ recorderRef.current = recorder; 2026-10-24T14:24:40.0486946Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T14:24:40.0487058Z ·  ─────┬────────┬─── 2026-10-24T14:24:40.0487247Z · │ ╰── Cannot update ref value during render 2026-10-24T14:24:40.0487365Z · ╰── This value is a ref 2026-10-24T14:24:40.0487429Z 155 │ recorder, 2026-10-24T14:24:40.0487479Z ╰──── 2026-10-24T14:24:40.0487966Z  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-24T14:24:40.0488267Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0488270Z 2026-10-24T14:24:40.0488469Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0488630Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7] 2026-10-24T14:24:40.0488716Z 184 │ return () => subscription.remove(); 2026-10-24T14:24:40.0488783Z 185 │ }, [controller]); 2026-10-24T14:24:40.0488860Z ·  ─────┬──── 2026-10-24T14:24:40.0489008Z · ╰── Cannot access ref value during render 2026-10-24T14:24:40.0489061Z 186 │ 2026-10-24T14:24:40.0489114Z ╰──── 2026-10-24T14:24:40.0489595Z  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-24T14:24:40.0489897Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0489899Z 2026-10-24T14:24:40.0490045Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0490202Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6] 2026-10-24T14:24:40.0490289Z 184 │ return () => subscription.remove(); 2026-10-24T14:24:40.0490356Z 185 │ }, [controller]); 2026-10-24T14:24:40.0490486Z ·  ──────┬───── 2026-10-24T14:24:40.0490661Z · ╰── Cannot access ref value during render 2026-10-24T14:24:40.0490714Z 186 │ 2026-10-24T14:24:40.0490764Z ╰──── 2026-10-24T14:24:40.0491246Z  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-24T14:24:40.0491541Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0491543Z 2026-10-24T14:24:40.0491688Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0491849Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6] 2026-10-24T14:24:40.0491911Z 191 │ }, 2026-10-24T14:24:40.0491981Z 192 │ [controller, recorder], 2026-10-24T14:24:40.0492058Z ·  ─────┬──── 2026-10-24T14:24:40.0492203Z · ╰── Cannot access ref value during render 2026-10-24T14:24:40.0492258Z 193 │ ); 2026-10-24T14:24:40.0492308Z ╰──── 2026-10-24T14:24:40.0492786Z  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-24T14:24:40.0493081Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0493084Z 2026-10-24T14:24:40.0493233Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0493396Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20] 2026-10-24T14:24:40.0493486Z 174 │ const controller = session.controller; 2026-10-24T14:24:40.0493575Z 175 │ const recorder = recorderRef.current; 2026-10-24T14:24:40.0493681Z ·  ─────────┬───────── 2026-10-24T14:24:40.0493845Z · ╰── Cannot access ref value during render 2026-10-24T14:24:40.0493897Z 176 │ 2026-10-24T14:24:40.0493948Z ╰──── 2026-10-24T14:24:40.0494423Z  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-24T14:24:40.0494725Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0494731Z 2026-10-24T14:24:40.0494878Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0495035Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5] 2026-10-24T14:24:40.0495092Z 191 │ }, 2026-10-24T14:24:40.0495165Z 192 │ [controller, recorder], 2026-10-24T14:24:40.0495255Z ·  ───────────┬────────── 2026-10-24T14:24:40.0495404Z · ╰── Cannot access ref value during render 2026-10-24T14:24:40.0495459Z 193 │ ); 2026-10-24T14:24:40.0495509Z ╰──── 2026-10-24T14:24:40.0496043Z  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-24T14:24:40.0496445Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0496448Z 2026-10-24T14:24:40.0496593Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0496752Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20] 2026-10-24T14:24:40.0496843Z 245 │ return () => clearInterval(intervalId); 2026-10-24T14:24:40.0496954Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-24T14:24:40.0497043Z ·  ─────┬──── 2026-10-24T14:24:40.0497207Z · ╰── Cannot access ref value during render 2026-10-24T14:24:40.0497263Z 247 │ 2026-10-24T14:24:40.0497313Z ╰──── 2026-10-24T14:24:40.0497790Z  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-24T14:24:40.0498086Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0498088Z 2026-10-24T14:24:40.0498233Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0498436Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6] 2026-10-24T14:24:40.0498530Z 245 │ return () => clearInterval(intervalId); 2026-10-24T14:24:40.0498643Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-24T14:24:40.0498773Z ·  ────────────────────────┬─────────────────────── 2026-10-24T14:24:40.0498936Z · ╰── Cannot access ref value during render 2026-10-24T14:24:40.0498988Z 247 │ 2026-10-24T14:24:40.0499038Z ╰──── 2026-10-24T14:24:40.0499516Z  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-24T14:24:40.0499811Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0499818Z 2026-10-24T14:24:40.0499966Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0500121Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5] 2026-10-24T14:24:40.0500190Z 260 │ setOwnerFocused, 2026-10-24T14:24:40.0500252Z 261 │ session, 2026-10-24T14:24:40.0500325Z ·  ───┬─── 2026-10-24T14:24:40.0500465Z · ╰── Cannot access ref value during render 2026-10-24T14:24:40.0500524Z 262 │ stop, 2026-10-24T14:24:40.0500575Z ╰──── 2026-10-24T14:24:40.0501049Z  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-24T14:24:40.0501407Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0501452Z 2026-10-24T14:24:40.0501595Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0501755Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10] 2026-10-24T14:24:40.0501809Z 250 │ 2026-10-24T14:24:40.0501950Z 251 │ ╭─▶ return { 2026-10-24T14:24:40.0502162Z 252 │ │ isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null, 2026-10-24T14:24:40.0502245Z 253 │ │ state, 2026-10-24T14:24:40.0502336Z 254 │ │ audioLevels, 2026-10-24T14:24:40.0502435Z 255 │ │ elapsedSeconds, 2026-10-24T14:24:40.0502568Z 256 │ │ isBusy: voiceInputBlocksSubmission(state), 2026-10-24T14:24:40.0502650Z 257 │ │ ownerKey, 2026-10-24T14:24:40.0502728Z 258 │ │ label, 2026-10-24T14:24:40.0502818Z 259 │ │ focusedOwners, 2026-10-24T14:24:40.0502911Z 260 │ │ setOwnerFocused, 2026-10-24T14:24:40.0502992Z 261 │ │ session, 2026-10-24T14:24:40.0503069Z 262 │ │ stop, 2026-10-24T14:24:40.0503148Z 263 │ │ cancel, 2026-10-24T14:24:40.0503279Z 264 │ ├─▶ }; 2026-10-24T14:24:40.0503489Z · ╰──── Cannot access ref value during render 2026-10-24T14:24:40.0503548Z 265 │ } 2026-10-24T14:24:40.0503597Z ╰──── 2026-10-24T14:24:40.0504074Z  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-24T14:24:40.0504371Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0504374Z 2026-10-24T14:24:40.0504537Z ⚠ react(immutability): This value cannot be modified 2026-10-24T14:24:40.0504699Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-24T14:24:40.0504864Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-24T14:24:40.0504994Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-24T14:24:40.0505074Z ·  ─────┬───── 2026-10-24T14:24:40.0505211Z · ╰── `audioLevels` originates here 2026-10-24T14:24:40.0505329Z 123 │ const sessionRef = useRef(null); 2026-10-24T14:24:40.0505476Z 124 │ const recorderRef = useRef | null>(null); 2026-10-24T14:24:40.0505528Z 125 │ 2026-10-24T14:24:40.0505635Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T14:24:40.0505734Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T14:24:40.0505872Z 128 │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-24T14:24:40.0505967Z 129 │ onStatus: (status: RecordingStatus) => { 2026-10-24T14:24:40.0506151Z 130 │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-24T14:24:40.0506267Z 131 │ isFinished: status.isFinished, 2026-10-24T14:24:40.0506410Z 132 │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-24T14:24:40.0506484Z 133 │ error: status.error, 2026-10-24T14:24:40.0506553Z 134 │ url: status.url, 2026-10-24T14:24:40.0506611Z 135 │ }); 2026-10-24T14:24:40.0506669Z 136 │ }, 2026-10-24T14:24:40.0506834Z 137 │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-24T14:24:40.0506912Z 138 │ selectInput: (inputs) => { 2026-10-24T14:24:40.0507033Z 139 │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-24T14:24:40.0507148Z 140 │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-24T14:24:40.0507287Z 141 │ const known = microphoneOrder(preferences.value.microphones); 2026-10-24T14:24:40.0507397Z 142 │ const order = rememberMicrophones(known, inputs); 2026-10-24T14:24:40.0507468Z 143 │ if (order !== known) { 2026-10-24T14:24:40.0507574Z 144 │ registry.set(updateMobilePreferencesAtom, { 2026-10-24T14:24:40.0507658Z 145 │ transform: (current) => ({ 2026-10-24T14:24:40.0507833Z 146 │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-24T14:24:40.0507894Z 147 │ }), 2026-10-24T14:24:40.0507956Z 148 │ }); 2026-10-24T14:24:40.0508013Z 149 │ } 2026-10-24T14:24:40.0508124Z 150 │ return preferredMicrophoneInput(inputs, order); 2026-10-24T14:24:40.0508180Z 151 │ }, 2026-10-24T14:24:40.0508235Z 152 │ }); 2026-10-24T14:24:40.0508323Z 153 │ recorderRef.current = recorder; 2026-10-24T14:24:40.0508470Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T14:24:40.0508530Z 155 │ recorder, 2026-10-24T14:24:40.0508629Z 156 │ getTranscriber: getLocalVoiceTranscriber, 2026-10-24T14:24:40.0508714Z 157 │ requestPermission: async () => { 2026-10-24T14:24:40.0508844Z 158 │ const permission = await requestRecordingPermissionsAsync(); 2026-10-24T14:24:40.0509000Z 159 │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-24T14:24:40.0509056Z 160 │ }, 2026-10-24T14:24:40.0509167Z 161 │ configureRecording: configureVoiceRecordingAudio, 2026-10-24T14:24:40.0509273Z 162 │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-24T14:24:40.0509375Z 163 │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-24T14:24:40.0509454Z 164 │ onStateChange: (nextState) => 2026-10-24T14:24:40.0509573Z 165 │ setState({ 2026-10-24T14:24:40.0509682Z 166 │ state: nextState, 2026-10-24T14:24:40.0509787Z 167 │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-24T14:24:40.0509886Z 168 │ label: sessionRef.current?.label ?? null, 2026-10-24T14:24:40.0509945Z 169 │ }), 2026-10-24T14:24:40.0509999Z 170 │ }); 2026-10-24T14:24:40.0510053Z 171 │ } 2026-10-24T14:24:40.0510105Z 172 │ 2026-10-24T14:24:40.0510190Z 173 │ const session = sessionRef.current; 2026-10-24T14:24:40.0510277Z 174 │ const controller = session.controller; 2026-10-24T14:24:40.0510363Z 175 │ const recorder = recorderRef.current; 2026-10-24T14:24:40.0510415Z 176 │ 2026-10-24T14:24:40.0510481Z 177 │ useEffect(() => { 2026-10-24T14:24:40.0510630Z 178 │ const subscription = AppState.addEventListener("change", (nextState) => { 2026-10-24T14:24:40.0510778Z 179 │ // iOS reports `inactive` while its permission dialog is open. Only the 2026-10-24T14:24:40.0510922Z 180 │ // real background state cancels preparation; recorder status handles 2026-10-24T14:24:40.0511027Z 181 │ // calls and route interruptions during capture. 2026-10-24T14:24:40.0511162Z 182 │ if (nextState === "background") controller.appMovedToBackground(); 2026-10-24T14:24:40.0511217Z 183 │ }); 2026-10-24T14:24:40.0511303Z 184 │ return () => subscription.remove(); 2026-10-24T14:24:40.0511368Z 185 │ }, [controller]); 2026-10-24T14:24:40.0511418Z 186 │ 2026-10-24T14:24:40.0511479Z 187 │ useEffect( 2026-10-24T14:24:40.0511542Z 188 │ () => () => { 2026-10-24T14:24:40.0511614Z 189 │ controller.dispose(); 2026-10-24T14:24:40.0511681Z 190 │ recorder.release(); 2026-10-24T14:24:40.0511736Z 191 │ }, 2026-10-24T14:24:40.0511812Z 192 │ [controller, recorder], 2026-10-24T14:24:40.0511869Z 193 │ ); 2026-10-24T14:24:40.0511921Z 194 │ 2026-10-24T14:24:40.0511985Z 195 │ useEffect(() => { 2026-10-24T14:24:40.0512078Z 196 │ if (state.phase !== "recording") return; 2026-10-24T14:24:40.0512129Z 197 │ 2026-10-24T14:24:40.0512278Z 198 │ const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`; 2026-10-24T14:24:40.0512383Z 199 │ const activation = activateKeepAwakeAsync(tag); 2026-10-24T14:24:40.0512465Z 200 │ void activation.catch(() => {}); 2026-10-24T14:24:40.0512526Z 201 │ return () => { 2026-10-24T14:24:40.0512678Z 202 │ // Release after activation settles, even if the recording ends immediately. 2026-10-24T14:24:40.0512818Z 203 │ void activation.then(() => deactivateKeepAwake(tag)).catch(() => {}); 2026-10-24T14:24:40.0512874Z 204 │ }; 2026-10-24T14:24:40.0512957Z 205 │ }, [keepAwakeId, state.phase]); 2026-10-24T14:24:40.0513011Z 206 │ 2026-10-24T14:24:40.0513075Z 207 │ useEffect(() => { 2026-10-24T14:24:40.0513209Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-24T14:24:40.0513260Z 209 │ 2026-10-24T14:24:40.0513380Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-24T14:24:40.0513535Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-24T14:24:40.0513638Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-24T14:24:40.0513715Z ·  ─────┬───── 2026-10-24T14:24:40.0513860Z · ╰── `audioLevels` cannot be modified 2026-10-24T14:24:40.0513914Z 213 │ } 2026-10-24T14:24:40.0513965Z ╰──── 2026-10-24T14:24:40.0514293Z  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-24T14:24:40.0514639Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:24:40.0514642Z 2026-10-24T14:24:40.0514847Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T14:24:40.0515009Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-24T14:24:40.0515060Z 206 │ 2026-10-24T14:24:40.0515125Z 207 │ useEffect(() => { 2026-10-24T14:24:40.0515204Z ·  ───┬─── 2026-10-24T14:24:40.0515430Z · ╰── This function may (indirectly) reassign or modify `audioLevels` after render 2026-10-24T14:24:40.0515574Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-24T14:24:40.0515629Z 209 │ 2026-10-24T14:24:40.0515748Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-24T14:24:40.0515902Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-24T14:24:40.0516002Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-24T14:24:40.0516079Z ·  ─────┬───── 2026-10-24T14:24:40.0516215Z · ╰── This modifies `audioLevels` 2026-10-24T14:24:40.0516270Z 213 │ } 2026-10-24T14:24:40.0516319Z ╰──── 2026-10-24T14:24:40.0516669Z  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-24T14:24:40.0516986Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:24:40.0516991Z 2026-10-24T14:24:40.0517473Z ⚠ 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-24T14:24:40.0517600Z ╭─[packages/shared/src/atomicWrite.test.ts:139:5] 2026-10-24T14:24:40.0517677Z 138 │ Effect.gen(function* () { 2026-10-24T14:24:40.0517876Z 139 │ ╭─▶ while (fiber.pollUnsafe() === undefined) { 2026-10-24T14:24:40.0518001Z 140 │ │ yield* TestClock.adjust("100 millis"); 2026-10-24T14:24:40.0518337Z 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-24T14:24:40.0518551Z 142 │ │ yield* Effect.promise(() => new Promise((resolve) => setImmediate(resolve))); 2026-10-24T14:24:40.0518679Z 143 │ ╰─▶ } 2026-10-24T14:24:40.0518765Z 144 │ return yield* Fiber.join(fiber); 2026-10-24T14:24:40.0518816Z ╰──── 2026-10-24T14:24:40.0518819Z 2026-10-24T14:24:40.0519046Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T14:24:40.0519176Z ╭─[scripts/lib/cli-external-packages.test.ts:114:11] 2026-10-24T14:24:40.0519248Z 113 │ const declared = { 2026-10-24T14:24:40.0519389Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-24T14:24:40.0519538Z ·  ──────────────────────────────── 2026-10-24T14:24:40.0519642Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T14:24:40.0519694Z ╰──── 2026-10-24T14:24:40.0519968Z  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-24T14:24:40.0519971Z 2026-10-24T14:24:40.0520196Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T14:24:40.0520323Z ╭─[scripts/lib/cli-external-packages.test.ts:115:11] 2026-10-24T14:24:40.0520414Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-24T14:24:40.0520518Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T14:24:40.0520647Z ·  ──────────────────────────────────────── 2026-10-24T14:24:40.0520748Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-24T14:24:40.0520800Z ╰──── 2026-10-24T14:24:40.0521068Z  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-24T14:24:40.0521070Z 2026-10-24T14:24:40.0521293Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T14:24:40.0521419Z ╭─[scripts/lib/cli-external-packages.test.ts:116:11] 2026-10-24T14:24:40.0521520Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T14:24:40.0521617Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-24T14:24:40.0521733Z ·  ──────────────────────────────────── 2026-10-24T14:24:40.0521793Z 117 │ }; 2026-10-24T14:24:40.0521849Z ╰──── 2026-10-24T14:24:40.0522120Z  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-24T14:24:40.0522122Z 2026-10-24T14:24:40.0522328Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:24:40.0522495Z ╭─[apps/mobile/src/features/workspace/WorkspaceToolbar.ios.tsx:114:33] 2026-10-24T14:24:40.0522591Z 113 │ return () => cancelAnimationFrame(frame); 2026-10-24T14:24:40.0522690Z 114 │ }, [restoreSearch, tabActive, bottomSearch]); 2026-10-24T14:24:40.0522797Z ·  ──────┬───── 2026-10-24T14:24:40.0522971Z · ╰── Unnecessary dependency `bottomSearch` 2026-10-24T14:24:40.0523080Z 115 │ const composeButton = nativeToolbarCompose ? ( 2026-10-24T14:24:40.0523133Z ╰──── 2026-10-24T14:24:40.0523436Z  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-24T14:24:40.0523756Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0523758Z 2026-10-24T14:24:40.0523949Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T14:24:40.0524121Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:555:70] 2026-10-24T14:24:40.0524204Z 554 │ assert.deepStrictEqual( 2026-10-24T14:24:40.0524427Z 555 │ (yield* Ref.get(fixture.syncCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-24T14:24:40.0524580Z ·  ┬ 2026-10-24T14:24:40.0524749Z · ╰── '_' is declared here 2026-10-24T14:24:40.0524812Z 556 │ [ 2026-10-24T14:24:40.0524863Z ╰──── 2026-10-24T14:24:40.0524965Z  help: Consider removing this parameter. 2026-10-24T14:24:40.0524968Z 2026-10-24T14:24:40.0525156Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T14:24:40.0525335Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:1155:70] 2026-10-24T14:24:40.0525417Z 1154 │ assert.deepStrictEqual( 2026-10-24T14:24:40.0525590Z 1155 │ (yield* Ref.get(fixture.linkCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-24T14:24:40.0525716Z ·  ┬ 2026-10-24T14:24:40.0525886Z · ╰── '_' is declared here 2026-10-24T14:24:40.0525949Z 1156 │ [ 2026-10-24T14:24:40.0526001Z ╰──── 2026-10-24T14:24:40.0526101Z  help: Consider removing this parameter. 2026-10-24T14:24:40.0526104Z 2026-10-24T14:24:40.0526274Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T14:24:40.0526407Z ╭─[apps/web/src/components/CommandPalette.tsx:2037:20] 2026-10-24T14:24:40.0526526Z 2036 │ title: inferProjectTitleFromPath(destinationPath), 2026-10-24T14:24:40.0526619Z 2037 │ createdAt: new Date().toISOString(), 2026-10-24T14:24:40.0526716Z ·  ─────┬──── 2026-10-24T14:24:40.0526865Z · ╰── Cannot call impure function 2026-10-24T14:24:40.0526972Z 2038 │ remoteUrl: addProjectCloneFlow.remoteUrl, 2026-10-24T14:24:40.0527023Z ╰──── 2026-10-24T14:24:40.0527312Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T14:24:40.0527614Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T14:24:40.0527617Z 2026-10-24T14:24:40.0527905Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-24T14:24:40.0528041Z ╭─[apps/server/src/provider/AntigravityAuth.ts:285:20] 2026-10-24T14:24:40.0528099Z 284 │ }, 2026-10-24T14:24:40.0528183Z 285 │ (effect, flow, stopSessions) => 2026-10-24T14:24:40.0528276Z ·  ──────┬───── 2026-10-24T14:24:40.0528450Z · ╰── 'stopSessions' is declared here 2026-10-24T14:24:40.0528515Z 286 │ effect.pipe( 2026-10-24T14:24:40.0528566Z ╰──── 2026-10-24T14:24:40.0528666Z  help: Consider removing this parameter. 2026-10-24T14:24:40.0528669Z 2026-10-24T14:24:40.0528904Z ⚠ eslint(no-unneeded-ternary): Unnecessary use of boolean literals in conditional expression 2026-10-24T14:24:40.0529030Z ╭─[packages/shared/src/serverSettings.test.ts:35:7] 2026-10-24T14:24:40.0529270Z 34 │ const fallback = fallbackTextGenerationModelSelection(providerInstances, (instanceId) => 2026-10-24T14:24:40.0529402Z 35 │ instanceId === configured ? true : false, 2026-10-24T14:24:40.0529520Z ·  ──────────────────────────────────────── 2026-10-24T14:24:40.0529573Z 36 │ ); 2026-10-24T14:24:40.0529626Z ╰──── 2026-10-24T14:24:40.0529721Z  help: Remove this ternary operator 2026-10-24T14:24:40.0529724Z 2026-10-24T14:24:40.0530002Z ⚠ eslint(no-unused-vars): Variable 'claudeCaps' is declared but never used. Unused variables should start with a '_'. 2026-10-24T14:24:40.0530113Z ╭─[packages/shared/src/model.test.ts:36:7] 2026-10-24T14:24:40.0530165Z 35 │ 2026-10-24T14:24:40.0530296Z 36 │ const claudeCaps: ModelCapabilities = createModelCapabilities({ 2026-10-24T14:24:40.0530372Z ·  ─────┬──── 2026-10-24T14:24:40.0530514Z · ╰── 'claudeCaps' is declared here 2026-10-24T14:24:40.0530588Z 37 │ optionDescriptors: [ 2026-10-24T14:24:40.0530639Z ╰──── 2026-10-24T14:24:40.0530744Z  help: Consider removing this declaration. 2026-10-24T14:24:40.0530747Z 2026-10-24T14:24:40.0530893Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0531056Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39] 2026-10-24T14:24:40.0531111Z 276 │ 2026-10-24T14:24:40.0531297Z 277 │ ╭─▶ return createElement(RawNativeView, { 2026-10-24T14:24:40.0531392Z 278 │ │ ...nativeProps, 2026-10-24T14:24:40.0531538Z 279 │ │ refreshEnabled: props.onPullToRefresh !== undefined, 2026-10-24T14:24:40.0531635Z 280 │ │ ref: nativeRef, 2026-10-24T14:24:40.0531767Z 281 │ ├─▶ }); 2026-10-24T14:24:40.0532010Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T14:24:40.0532064Z 282 │ } 2026-10-24T14:24:40.0532115Z ╰──── 2026-10-24T14:24:40.0532604Z  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-24T14:24:40.0532903Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0532906Z 2026-10-24T14:24:40.0533155Z ⚠ eslint(no-unused-vars): Identifier 'Image' is imported but never used. 2026-10-24T14:24:40.0533328Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:17:10] 2026-10-24T14:24:40.0533464Z 16 │ import type { NativeSyntheticEvent, ViewProps } from "react-native"; 2026-10-24T14:24:40.0533581Z 17 │ import { Image, Platform, StyleSheet } from "react-native"; 2026-10-24T14:24:40.0533654Z ·  ──┬── 2026-10-24T14:24:40.0533781Z · ╰── 'Image' is imported here 2026-10-24T14:24:40.0533834Z 18 │ 2026-10-24T14:24:40.0533885Z ╰──── 2026-10-24T14:24:40.0533983Z  help: Consider removing this import. 2026-10-24T14:24:40.0533987Z 2026-10-24T14:24:40.0534194Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T14:24:40.0534343Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:229:6] 2026-10-24T14:24:40.0534510Z 225 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-24T14:24:40.0534603Z 226 │ nativeEventSnapshotsRef.current, 2026-10-24T14:24:40.0534693Z ·  ───────────┬─────────── 2026-10-24T14:24:40.0535170Z · ╰── 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-24T14:24:40.0535244Z 227 │ mostRecentEventCount, 2026-10-24T14:24:40.0535300Z 228 │ ); 2026-10-24T14:24:40.0535421Z 229 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-24T14:24:40.0535565Z ·  ──────────────────────────┬────────────────────────── 2026-10-24T14:24:40.0535774Z · ╰── This dependency list is missing values used by the callback 2026-10-24T14:24:40.0535857Z 230 │ const assumedValue = props.value; 2026-10-24T14:24:40.0535907Z ╰──── 2026-10-24T14:24:40.0536077Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T14:24:40.0536453Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0536456Z 2026-10-24T14:24:40.0536677Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T14:24:40.0536818Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:237:7] 2026-10-24T14:24:40.0536966Z 236 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-24T14:24:40.0537059Z 237 │ nativeEventSnapshotsRef.current, 2026-10-24T14:24:40.0537150Z ·  ───────────┬─────────── 2026-10-24T14:24:40.0537620Z · ╰── 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-24T14:24:40.0537693Z 238 │ controlledEventCount, 2026-10-24T14:24:40.0537759Z 239 │ assumedValue, 2026-10-24T14:24:40.0537814Z 240 │ ); 2026-10-24T14:24:40.0537972Z 241 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-24T14:24:40.0538110Z ·  ───────────┬────────── 2026-10-24T14:24:40.0538436Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-24T14:24:40.0538569Z 242 │ const acceptNativeEvent = useCallback( 2026-10-24T14:24:40.0538620Z ╰──── 2026-10-24T14:24:40.0539053Z  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-24T14:24:40.0539374Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0539376Z 2026-10-24T14:24:40.0539527Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0539683Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29] 2026-10-24T14:24:40.0539811Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T14:24:40.0539923Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T14:24:40.0540042Z ·  ─────────────┬──────────── 2026-10-24T14:24:40.0540217Z · ╰── Cannot access ref value during render 2026-10-24T14:24:40.0540273Z 163 │ }); 2026-10-24T14:24:40.0540323Z ╰──── 2026-10-24T14:24:40.0540807Z  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-24T14:24:40.0541111Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0541117Z 2026-10-24T14:24:40.0541264Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0541409Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29] 2026-10-24T14:24:40.0541530Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T14:24:40.0541642Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T14:24:40.0541760Z ·  ─────────────┬──────────── 2026-10-24T14:24:40.0541976Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T14:24:40.0542031Z 163 │ }); 2026-10-24T14:24:40.0542082Z ╰──── 2026-10-24T14:24:40.0542570Z  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-24T14:24:40.0542869Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0542871Z 2026-10-24T14:24:40.0543019Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0543162Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:164:23] 2026-10-24T14:24:40.0543218Z 163 │ }); 2026-10-24T14:24:40.0543308Z 164 │ confirmedTokensRef.current = tokens; 2026-10-24T14:24:40.0543482Z ·  ─────────┬────────────┬─── 2026-10-24T14:24:40.0543709Z · │ ╰── Cannot update ref value during render 2026-10-24T14:24:40.0543828Z · ╰── This value is a ref 2026-10-24T14:24:40.0543900Z 165 │ return JSON.stringify( 2026-10-24T14:24:40.0543950Z ╰──── 2026-10-24T14:24:40.0544425Z  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-24T14:24:40.0544722Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0544725Z 2026-10-24T14:24:40.0544876Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0545021Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:206:5] 2026-10-24T14:24:40.0545092Z 205 │ mostRecentEventCount, 2026-10-24T14:24:40.0545179Z 206 │ nativeEventSnapshotsRef.current, 2026-10-24T14:24:40.0545285Z ·  ───────────────┬─────────────── 2026-10-24T14:24:40.0545479Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T14:24:40.0545534Z 207 │ ); 2026-10-24T14:24:40.0545584Z ╰──── 2026-10-24T14:24:40.0546066Z  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-24T14:24:40.0546369Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0546374Z 2026-10-24T14:24:40.0546521Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0546663Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:212:5] 2026-10-24T14:24:40.0546735Z 211 │ mostRecentEventCount, 2026-10-24T14:24:40.0546821Z 212 │ nativeEventSnapshotsRef.current, 2026-10-24T14:24:40.0546927Z ·  ───────────────┬─────────────── 2026-10-24T14:24:40.0547116Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T14:24:40.0547171Z 213 │ ); 2026-10-24T14:24:40.0547222Z ╰──── 2026-10-24T14:24:40.0547704Z  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-24T14:24:40.0548004Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0548007Z 2026-10-24T14:24:40.0548196Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T14:24:40.0548371Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:197:6] 2026-10-24T14:24:40.0548494Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T14:24:40.0548607Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T14:24:40.0548774Z ·  ─────────┬──────── 2026-10-24T14:24:40.0549298Z · ╰── 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-24T14:24:40.0549354Z 163 │ }); 2026-10-24T14:24:40.0549445Z 164 │ confirmedTokensRef.current = tokens; 2026-10-24T14:24:40.0549514Z 165 │ return JSON.stringify( 2026-10-24T14:24:40.0549678Z 166 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-24T14:24:40.0549746Z 167 │ const record = 2026-10-24T14:24:40.0549825Z 168 │ token.type === "context" 2026-10-24T14:24:40.0549992Z 169 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-24T14:24:40.0550065Z 170 │ : undefined; 2026-10-24T14:24:40.0550176Z 171 │ const presentation = contextChipPresentation( 2026-10-24T14:24:40.0550286Z 172 │ token.type === "context" ? token.kind : token.type, 2026-10-24T14:24:40.0550348Z 173 │ record, 2026-10-24T14:24:40.0550407Z 174 │ ); 2026-10-24T14:24:40.0550490Z 175 │ const icon = contextChipIcon( 2026-10-24T14:24:40.0550557Z 176 │ presentation, 2026-10-24T14:24:40.0550701Z 177 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-24T14:24:40.0550760Z 178 │ ); 2026-10-24T14:24:40.0550821Z 179 │ return { 2026-10-24T14:24:40.0550892Z 180 │ type: token.type, 2026-10-24T14:24:40.0550966Z 181 │ source: token.source, 2026-10-24T14:24:40.0551038Z 182 │ start: token.start, 2026-10-24T14:24:40.0551112Z 183 │ end: token.end, 2026-10-24T14:24:40.0551263Z 184 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-24T14:24:40.0551323Z 185 │ label: 2026-10-24T14:24:40.0551401Z 186 │ token.type === "skill" 2026-10-24T14:24:40.0551510Z 187 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-24T14:24:40.0551593Z 188 │ : token.type === "context" 2026-10-24T14:24:40.0551836Z 189 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-24T14:24:40.0551919Z 190 │ : basename(token.value), 2026-10-24T14:24:40.0552066Z 191 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-24T14:24:40.0552160Z 192 │ iconUri: contextChipIconUri(icon), 2026-10-24T14:24:40.0552254Z 193 │ tintsIcon: icon.kind === "chip", 2026-10-24T14:24:40.0552315Z 194 │ }; 2026-10-24T14:24:40.0552372Z 195 │ }), 2026-10-24T14:24:40.0552427Z 196 │ ); 2026-10-24T14:24:40.0552560Z 197 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-24T14:24:40.0552714Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-24T14:24:40.0552925Z · ╰── This dependency list is missing values used by the callback 2026-10-24T14:24:40.0553066Z 198 │ // Every render resolves against the snapshot history, so a render whose 2026-10-24T14:24:40.0553116Z ╰──── 2026-10-24T14:24:40.0553328Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T14:24:40.0553703Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0553739Z 2026-10-24T14:24:40.0553930Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T14:24:40.0554072Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:259:5] 2026-10-24T14:24:40.0554203Z 251 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-24T14:24:40.0554305Z 252 │ nativeEventSnapshotsRef.current.push({ 2026-10-24T14:24:40.0554399Z ·  ───────────┬─────────── 2026-10-24T14:24:40.0554875Z · ╰── 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-24T14:24:40.0554974Z 253 │ eventCount: acknowledgedEventCount, 2026-10-24T14:24:40.0555039Z 254 │ value, 2026-10-24T14:24:40.0555117Z 255 │ selection: nextSelection, 2026-10-24T14:24:40.0555174Z 256 │ }); 2026-10-24T14:24:40.0555256Z 257 │ return acknowledgedEventCount; 2026-10-24T14:24:40.0555311Z 258 │ }, 2026-10-24T14:24:40.0555367Z 259 │ [], 2026-10-24T14:24:40.0555434Z ·  ─┬ 2026-10-24T14:24:40.0555620Z · ╰── This dependency list is missing values used by the callback 2026-10-24T14:24:40.0555674Z 260 │ ); 2026-10-24T14:24:40.0555725Z ╰──── 2026-10-24T14:24:40.0555933Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T14:24:40.0556260Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0556265Z 2026-10-24T14:24:40.0556473Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T14:24:40.0556611Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:231:6] 2026-10-24T14:24:40.0556775Z 227 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-24T14:24:40.0556864Z 228 │ nativeEventSnapshotsRef.current, 2026-10-24T14:24:40.0556957Z ·  ───────────┬─────────── 2026-10-24T14:24:40.0557427Z · ╰── 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-24T14:24:40.0557555Z 229 │ mostRecentEventCount, 2026-10-24T14:24:40.0557649Z 230 │ ); 2026-10-24T14:24:40.0557772Z 231 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-24T14:24:40.0557910Z ·  ──────────────────────────┬────────────────────────── 2026-10-24T14:24:40.0558115Z · ╰── This dependency list is missing values used by the callback 2026-10-24T14:24:40.0558197Z 232 │ const assumedValue = props.value; 2026-10-24T14:24:40.0558248Z ╰──── 2026-10-24T14:24:40.0558444Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T14:24:40.0558765Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0558767Z 2026-10-24T14:24:40.0558992Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T14:24:40.0559131Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:239:7] 2026-10-24T14:24:40.0559275Z 238 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-24T14:24:40.0559363Z 239 │ nativeEventSnapshotsRef.current, 2026-10-24T14:24:40.0559456Z ·  ───────────┬─────────── 2026-10-24T14:24:40.0559923Z · ╰── 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-24T14:24:40.0559996Z 240 │ controlledEventCount, 2026-10-24T14:24:40.0560061Z 241 │ assumedValue, 2026-10-24T14:24:40.0560121Z 242 │ ); 2026-10-24T14:24:40.0560280Z 243 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-24T14:24:40.0560421Z ·  ───────────┬────────── 2026-10-24T14:24:40.0560641Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-24T14:24:40.0560730Z 244 │ const acceptNativeEvent = useCallback( 2026-10-24T14:24:40.0560780Z ╰──── 2026-10-24T14:24:40.0561217Z  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-24T14:24:40.0561545Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0561551Z 2026-10-24T14:24:40.0561699Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0561836Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29] 2026-10-24T14:24:40.0561959Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T14:24:40.0562071Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T14:24:40.0562192Z ·  ─────────────┬──────────── 2026-10-24T14:24:40.0562365Z · ╰── Cannot access ref value during render 2026-10-24T14:24:40.0562420Z 165 │ }); 2026-10-24T14:24:40.0562471Z ╰──── 2026-10-24T14:24:40.0563007Z  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-24T14:24:40.0563337Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0563340Z 2026-10-24T14:24:40.0563487Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0563624Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29] 2026-10-24T14:24:40.0563745Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T14:24:40.0563857Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T14:24:40.0563978Z ·  ─────────────┬──────────── 2026-10-24T14:24:40.0564193Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T14:24:40.0564249Z 165 │ }); 2026-10-24T14:24:40.0564300Z ╰──── 2026-10-24T14:24:40.0564780Z  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-24T14:24:40.0565076Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0565079Z 2026-10-24T14:24:40.0565224Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0565365Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:166:23] 2026-10-24T14:24:40.0565422Z 165 │ }); 2026-10-24T14:24:40.0565511Z 166 │ confirmedTokensRef.current = tokens; 2026-10-24T14:24:40.0565635Z ·  ─────────┬────────────┬─── 2026-10-24T14:24:40.0565829Z · │ ╰── Cannot update ref value during render 2026-10-24T14:24:40.0565948Z · ╰── This value is a ref 2026-10-24T14:24:40.0566020Z 167 │ return JSON.stringify( 2026-10-24T14:24:40.0566070Z ╰──── 2026-10-24T14:24:40.0566551Z  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-24T14:24:40.0566853Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0566859Z 2026-10-24T14:24:40.0567006Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0567141Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:208:5] 2026-10-24T14:24:40.0567211Z 207 │ mostRecentEventCount, 2026-10-24T14:24:40.0567299Z 208 │ nativeEventSnapshotsRef.current, 2026-10-24T14:24:40.0567405Z ·  ───────────────┬─────────────── 2026-10-24T14:24:40.0567600Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T14:24:40.0567654Z 209 │ ); 2026-10-24T14:24:40.0567706Z ╰──── 2026-10-24T14:24:40.0568247Z  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-24T14:24:40.0568630Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0568633Z 2026-10-24T14:24:40.0568776Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0568910Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:214:5] 2026-10-24T14:24:40.0568982Z 213 │ mostRecentEventCount, 2026-10-24T14:24:40.0569071Z 214 │ nativeEventSnapshotsRef.current, 2026-10-24T14:24:40.0569176Z ·  ───────────────┬─────────────── 2026-10-24T14:24:40.0569375Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T14:24:40.0569436Z 215 │ ); 2026-10-24T14:24:40.0569489Z ╰──── 2026-10-24T14:24:40.0569967Z  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-24T14:24:40.0570264Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0570266Z 2026-10-24T14:24:40.0570460Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T14:24:40.0570604Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:199:6] 2026-10-24T14:24:40.0570732Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T14:24:40.0570845Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T14:24:40.0570958Z ·  ─────────┬──────── 2026-10-24T14:24:40.0571439Z · ╰── 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-24T14:24:40.0571499Z 165 │ }); 2026-10-24T14:24:40.0571593Z 166 │ confirmedTokensRef.current = tokens; 2026-10-24T14:24:40.0571663Z 167 │ return JSON.stringify( 2026-10-24T14:24:40.0571831Z 168 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-24T14:24:40.0571906Z 169 │ const record = 2026-10-24T14:24:40.0571991Z 170 │ token.type === "context" 2026-10-24T14:24:40.0572158Z 171 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-24T14:24:40.0572228Z 172 │ : undefined; 2026-10-24T14:24:40.0572340Z 173 │ const presentation = contextChipPresentation( 2026-10-24T14:24:40.0572452Z 174 │ token.type === "context" ? token.kind : token.type, 2026-10-24T14:24:40.0572515Z 175 │ record, 2026-10-24T14:24:40.0572576Z 176 │ ); 2026-10-24T14:24:40.0572663Z 177 │ const icon = contextChipIcon( 2026-10-24T14:24:40.0572730Z 178 │ presentation, 2026-10-24T14:24:40.0572878Z 179 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-24T14:24:40.0572940Z 180 │ ); 2026-10-24T14:24:40.0573059Z 181 │ return { 2026-10-24T14:24:40.0573159Z 182 │ type: token.type, 2026-10-24T14:24:40.0573238Z 183 │ source: token.source, 2026-10-24T14:24:40.0573313Z 184 │ start: token.start, 2026-10-24T14:24:40.0573384Z 185 │ end: token.end, 2026-10-24T14:24:40.0573533Z 186 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-24T14:24:40.0573598Z 187 │ label: 2026-10-24T14:24:40.0573683Z 188 │ token.type === "skill" 2026-10-24T14:24:40.0573794Z 189 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-24T14:24:40.0573878Z 190 │ : token.type === "context" 2026-10-24T14:24:40.0574119Z 191 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-24T14:24:40.0574206Z 192 │ : basename(token.value), 2026-10-24T14:24:40.0574360Z 193 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-24T14:24:40.0574455Z 194 │ iconUri: contextChipIconUri(icon), 2026-10-24T14:24:40.0574548Z 195 │ tintsIcon: icon.kind === "chip", 2026-10-24T14:24:40.0574609Z 196 │ }; 2026-10-24T14:24:40.0574673Z 197 │ }), 2026-10-24T14:24:40.0574729Z 198 │ ); 2026-10-24T14:24:40.0574888Z 199 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-24T14:24:40.0575079Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-24T14:24:40.0575331Z · ╰── This dependency list is missing values used by the callback 2026-10-24T14:24:40.0575490Z 200 │ // Every render resolves against the snapshot history, so a render whose 2026-10-24T14:24:40.0575705Z ╰──── 2026-10-24T14:24:40.0575968Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T14:24:40.0576472Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0576475Z 2026-10-24T14:24:40.0576684Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T14:24:40.0576849Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:261:5] 2026-10-24T14:24:40.0577036Z 253 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-24T14:24:40.0577176Z 254 │ nativeEventSnapshotsRef.current.push({ 2026-10-24T14:24:40.0577289Z ·  ───────────┬─────────── 2026-10-24T14:24:40.0577874Z · ╰── 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-24T14:24:40.0578050Z 255 │ eventCount: acknowledgedEventCount, 2026-10-24T14:24:40.0578158Z 256 │ value, 2026-10-24T14:24:40.0578269Z 257 │ selection: nextSelection, 2026-10-24T14:24:40.0578366Z 258 │ }); 2026-10-24T14:24:40.0578477Z 259 │ return acknowledgedEventCount; 2026-10-24T14:24:40.0578588Z 260 │ }, 2026-10-24T14:24:40.0578679Z 261 │ [], 2026-10-24T14:24:40.0578846Z ·  ─┬ 2026-10-24T14:24:40.0579070Z · ╰── This dependency list is missing values used by the callback 2026-10-24T14:24:40.0579167Z 262 │ ); 2026-10-24T14:24:40.0579265Z ╰──── 2026-10-24T14:24:40.0579496Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T14:24:40.0579854Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0579857Z 2026-10-24T14:24:40.0580081Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T14:24:40.0580290Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:223:31] 2026-10-24T14:24:40.0580416Z 222 │ ? snippetTokens.map((line, lineIndex) => ( 2026-10-24T14:24:40.0580548Z 223 │ 2026-10-24T14:24:40.0580689Z ·  ─────────────── 2026-10-24T14:24:40.0580830Z 224 │ {lineIndex > 0 ? "\n" : ""} 2026-10-24T14:24:40.0580928Z ╰──── 2026-10-24T14:24:40.0581093Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T14:24:40.0581096Z 2026-10-24T14:24:40.0581332Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T14:24:40.0581514Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25] 2026-10-24T14:24:40.0581648Z 226 │ (null); 2026-10-24T14:24:40.0589734Z 495 │ const showcasedReviewDrawRef = useRef(null); 2026-10-24T14:24:40.0589904Z 496 │ const [isPullRefreshing, setIsPullRefreshing] = useState(false); 2026-10-24T14:24:40.0590014Z 497 │ const handlePullToRefresh = async () => { 2026-10-24T14:24:40.0590123Z 498 │ setIsPullRefreshing(true); 2026-10-24T14:24:40.0590262Z 499 │ await refreshSelectedSection(); 2026-10-24T14:24:40.0590435Z 500 │ setIsPullRefreshing(false); 2026-10-24T14:24:40.0590545Z 501 │ }; 2026-10-24T14:24:40.0590807Z 502 │ const reviewFileNavigatorRef = useRef(null); 2026-10-24T14:24:40.0590999Z 503 │ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : []; 2026-10-24T14:24:40.0591152Z 504 │ const fileVisibility = useReviewFileVisibility({ 2026-10-24T14:24:40.0591260Z 505 │ threadKey: reviewCache.threadKey, 2026-10-24T14:24:40.0591388Z 506 │ sectionId: selectedSection?.id ?? null, 2026-10-24T14:24:40.0591483Z 507 │ files: reviewFiles, 2026-10-24T14:24:40.0591634Z 508 │ cachedExpandedFileIds: selectedSection?.id 2026-10-24T14:24:40.0591783Z 509 │ ? reviewCache.expandedFileIdsBySection[selectedSection.id] 2026-10-24T14:24:40.0591887Z 510 │ : undefined, 2026-10-24T14:24:40.0592016Z 511 │ cachedViewedFileIds: selectedSection?.id 2026-10-24T14:24:40.0592185Z 512 │ ? reviewCache.viewedFileIdsBySection[selectedSection.id] 2026-10-24T14:24:40.0592278Z 513 │ : undefined, 2026-10-24T14:24:40.0592373Z 514 │ }); 2026-10-24T14:24:40.0592603Z 515 │ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility; 2026-10-24T14:24:40.0592765Z 516 │ const commentSelection = useReviewCommentSelectionController({ 2026-10-24T14:24:40.0592852Z 517 │ environmentId, 2026-10-24T14:24:40.0592962Z 518 │ threadId, 2026-10-24T14:24:40.0593065Z 519 │ selectedSection, 2026-10-24T14:24:40.0593238Z 520 │ nativeReviewDiffData, 2026-10-24T14:24:40.0593302Z 521 │ }); 2026-10-24T14:24:40.0593464Z 522 │ const nativeBridge = useNativeReviewDiffBridge({ 2026-10-24T14:24:40.0593586Z 523 │ threadKey: reviewCache.threadKey, 2026-10-24T14:24:40.0593719Z 524 │ sectionId: selectedSection?.id ?? null, 2026-10-24T14:24:40.0593815Z 525 │ diff: selectedSection?.diff, 2026-10-24T14:24:40.0593933Z 526 │ data: nativeReviewDiffData, 2026-10-24T14:24:40.0594047Z 527 │ collapsedFileIds, 2026-10-24T14:24:40.0594145Z 528 │ viewedFileIds, 2026-10-24T14:24:40.0594271Z 529 │ selectedRowIds: commentSelection.selectedRowIds, 2026-10-24T14:24:40.0594397Z 530 │ canHighlight: parsedDiff.kind === "files", 2026-10-24T14:24:40.0594511Z 531 │ }); 2026-10-24T14:24:40.0594617Z 532 │ const showcaseReviewKey = 2026-10-24T14:24:40.0594767Z 533 │ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection 2026-10-24T14:24:40.0595013Z 534 │ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}` 2026-10-24T14:24:40.0595121Z 535 │ : null; 2026-10-24T14:24:40.0595335Z 536 │ const handleNativeDebug = (event: NativeSyntheticEvent>) => { 2026-10-24T14:24:40.0595431Z 537 │ nativeBridge.onDebug(event); 2026-10-24T14:24:40.0595599Z 538 │ if ( 2026-10-24T14:24:40.0595704Z 539 │ showcaseReviewKey === null || 2026-10-24T14:24:40.0595885Z 540 │ showcasedReviewDrawRef.current === showcaseReviewKey || 2026-10-24T14:24:40.0596013Z 541 │ !isNativeReviewDiffDrawEvent(event.nativeEvent) 2026-10-24T14:24:40.0596102Z 542 │ ) { 2026-10-24T14:24:40.0596199Z 543 │ return; 2026-10-24T14:24:40.0596292Z 544 │ } 2026-10-24T14:24:40.0596430Z 545 │ showcasedReviewDrawRef.current = showcaseReviewKey; 2026-10-24T14:24:40.0596631Z 546 │ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId }); 2026-10-24T14:24:40.0596721Z 547 │ }; 2026-10-24T14:24:40.0596806Z 548 │ 2026-10-24T14:24:40.0597015Z 549 │ const handleSelectFile = async (fileId: string | null) => { 2026-10-24T14:24:40.0597176Z 550 │ loadVisibleFile(fileId, true); 2026-10-24T14:24:40.0597304Z 551 │ commentSelection.clearSelection(); 2026-10-24T14:24:40.0597460Z 552 │ if (fileId !== null && collapsedFileIds.includes(fileId)) { 2026-10-24T14:24:40.0597548Z 553 │ toggleExpandedFile(fileId); 2026-10-24T14:24:40.0597656Z 554 │ } 2026-10-24T14:24:40.0597891Z 555 │ const nativeView = nativeReviewDiffViewRef.current; 2026-10-24T14:24:40.0597998Z 556 │ if (!nativeView) return; 2026-10-24T14:24:40.0598109Z 557 │ const result = await settlePromise(() => 2026-10-24T14:24:40.0598325Z 558 │ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true), 2026-10-24T14:24:40.0598503Z 559 │ ); 2026-10-24T14:24:40.0598629Z 560 │ if (AsyncResult.isFailure(result)) { 2026-10-24T14:24:40.0598834Z 561 │ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result)); 2026-10-24T14:24:40.0598920Z 562 │ } 2026-10-24T14:24:40.0599030Z 563 │ }; 2026-10-24T14:24:40.0599152Z 564 │ const handleVisibleFileChange = ( 2026-10-24T14:24:40.0599302Z 565 │ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>, 2026-10-24T14:24:40.0599394Z 566 │ ) => { 2026-10-24T14:24:40.0599539Z 567 │ loadVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-24T14:24:40.0599756Z 568 │ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-24T14:24:40.0599829Z 569 │ }; 2026-10-24T14:24:40.0599945Z 570 │ const renderInspector = () => ( 2026-10-24T14:24:40.0600040Z 571 │ void handleSelectFile(fileId)} 2026-10-24T14:24:40.0600848Z 577 │ /> 2026-10-24T14:24:40.0600937Z 578 │ ); 2026-10-24T14:24:40.0601023Z 579 │ 2026-10-24T14:24:40.0601239Z 580 │ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => { 2026-10-24T14:24:40.0601355Z 581 │ const { fileId } = event.nativeEvent; 2026-10-24T14:24:40.0601465Z 582 │ if (fileId) { 2026-10-24T14:24:40.0601585Z 583 │ loadVisibleFile(fileId, true); 2026-10-24T14:24:40.0601700Z 584 │ toggleExpandedFile(fileId); 2026-10-24T14:24:40.0601761Z 585 │ } 2026-10-24T14:24:40.0601882Z 586 │ }; 2026-10-24T14:24:40.0601968Z 587 │ 2026-10-24T14:24:40.0602099Z 588 │ const handleNativeToggleViewedFile = ( 2026-10-24T14:24:40.0602238Z 589 │ event: NativeSyntheticEvent<{ readonly fileId?: string }>, 2026-10-24T14:24:40.0602338Z 590 │ ) => { 2026-10-24T14:24:40.0602547Z 591 │ const { fileId } = event.nativeEvent; 2026-10-24T14:24:40.0602646Z 592 │ if (fileId) { 2026-10-24T14:24:40.0602738Z 593 │ toggleViewedFile(fileId); 2026-10-24T14:24:40.0602822Z 594 │ } 2026-10-24T14:24:40.0602933Z 595 │ }; 2026-10-24T14:24:40.0603001Z 596 │ 2026-10-24T14:24:40.0603107Z 597 │ const parsedDiffNotice = 2026-10-24T14:24:40.0603312Z 598 │ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null; 2026-10-24T14:24:40.0603474Z 599 │ const hasCachedSelectedDiff = selectedSection?.diff != null; 2026-10-24T14:24:40.0603660Z 600 │ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null); 2026-10-24T14:24:40.0603876Z 601 │ const sectionMenu = buildReviewSectionMenu(reviewSections); 2026-10-24T14:24:40.0604114Z 602 │ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({ 2026-10-24T14:24:40.0604252Z 603 │ hasEnvironmentPresentation: environment.isReady, 2026-10-24T14:24:40.0604405Z 604 │ isEnvironmentConnected: isEnvironmentReady, 2026-10-24T14:24:40.0604493Z 605 │ hasCachedSelectedDiff, 2026-10-24T14:24:40.0604600Z 606 │ hasAnyCachedDiff, 2026-10-24T14:24:40.0604688Z 607 │ }); 2026-10-24T14:24:40.0604893Z 608 │ const handleRetryEnvironment = () => { 2026-10-24T14:24:40.0605007Z 609 │ void retryEnvironment(environmentId); 2026-10-24T14:24:40.0605098Z 610 │ }; 2026-10-24T14:24:40.0605218Z 611 │ const handleReturnToThread = () => { 2026-10-24T14:24:40.0605314Z 612 │ if (navigation.canGoBack()) { 2026-10-24T14:24:40.0605428Z 613 │ navigation.goBack(); 2026-10-24T14:24:40.0605541Z 614 │ return; 2026-10-24T14:24:40.0605628Z 615 │ } 2026-10-24T14:24:40.0605729Z 616 │ navigation.navigate("Thread", { 2026-10-24T14:24:40.0605847Z 617 │ environmentId: String(environmentId), 2026-10-24T14:24:40.0605979Z 618 │ threadId: String(threadId), 2026-10-24T14:24:40.0606076Z 619 │ }); 2026-10-24T14:24:40.0606145Z 620 │ }; 2026-10-24T14:24:40.0606260Z 621 │ const androidHeaderSubtitle = [ 2026-10-24T14:24:40.0606366Z 622 │ selectedSection?.title, 2026-10-24T14:24:40.0606493Z 623 │ headerDiffSummary.additions, 2026-10-24T14:24:40.0606588Z 624 │ headerDiffSummary.deletions, 2026-10-24T14:24:40.0606676Z 625 │ ] 2026-10-24T14:24:40.0606874Z 626 │ .filter((part): part is string => Boolean(part)) 2026-10-24T14:24:40.0606993Z 627 │ .join(" · "); 2026-10-24T14:24:40.0607070Z 628 │ 2026-10-24T14:24:40.0607185Z 629 │ const showChangedFilesPane = 2026-10-24T14:24:40.0607293Z 630 │ !showConnectionNotice && 2026-10-24T14:24:40.0607404Z 631 │ selectedSection !== null && 2026-10-24T14:24:40.0607513Z 632 │ parsedDiff.kind === "files" && 2026-10-24T14:24:40.0607623Z 633 │ NativeReviewDiffView !== null; 2026-10-24T14:24:40.0607829Z 634 │ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined); 2026-10-24T14:24:40.0608028Z 635 │ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane; 2026-10-24T14:24:40.0608111Z 636 │ 2026-10-24T14:24:40.0608227Z 637 │ const listHeader = (() => { 2026-10-24T14:24:40.0608381Z 638 │ const children: ReactElement[] = []; 2026-10-24T14:24:40.0608470Z 639 │ 2026-10-24T14:24:40.0608541Z 640 │ if (error) { 2026-10-24T14:24:40.0608671Z 641 │ children.push( 2026-10-24T14:24:40.0608771Z 642 │ 2026-10-24T14:24:40.0609736Z 649 │ Review unavailable 2026-10-24T14:24:40.0613451Z 650 │ {error} 2026-10-24T14:24:40.0613517Z 651 │ , 2026-10-24T14:24:40.0613574Z 652 │ ); 2026-10-24T14:24:40.0613627Z 653 │ } 2026-10-24T14:24:40.0613679Z 654 │ 2026-10-24T14:24:40.0613827Z 655 │ if (parsedDiffNotice) { 2026-10-24T14:24:40.0614027Z 656 │ children.push(); 2026-10-24T14:24:40.0614080Z 657 │ } 2026-10-24T14:24:40.0614133Z 658 │ 2026-10-24T14:24:40.0614212Z 659 │ if (children.length === 0) { 2026-10-24T14:24:40.0614277Z 660 │ return null; 2026-10-24T14:24:40.0614329Z 661 │ } 2026-10-24T14:24:40.0614381Z 662 │ 2026-10-24T14:24:40.0614452Z 663 │ return <>{children}; 2026-10-24T14:24:40.0614507Z 664 │ })(); 2026-10-24T14:24:40.0614576Z 665 │ const headerSubtitle = [ 2026-10-24T14:24:40.0614657Z 666 │ headerDiffSummary.additions, 2026-10-24T14:24:40.0614737Z 667 │ headerDiffSummary.deletions, 2026-10-24T14:24:40.0614816Z 668 │ pendingReviewCommentCount > 0 2026-10-24T14:24:40.0615002Z 669 │ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}` 2026-10-24T14:24:40.0615072Z 670 │ : null, 2026-10-24T14:24:40.0615127Z 671 │ ] 2026-10-24T14:24:40.0615192Z 672 │ .filter(Boolean) 2026-10-24T14:24:40.0615257Z 673 │ .join(" · "); 2026-10-24T14:24:40.0615395Z 674 │ const headerTitleText = selectedSection?.title ?? "Review changes"; 2026-10-24T14:24:40.0615447Z 675 │ 2026-10-24T14:24:40.0615506Z 676 │ return ( 2026-10-24T14:24:40.0615562Z 677 │ <> 2026-10-24T14:24:40.0615627Z 678 │ 2026-10-24T14:24:40.0617029Z 694 │ 2026-10-24T14:24:40.0617094Z 695 │ 2026-10-24T14:24:40.0617300Z 696 │ 2026-10-24T14:24:40.0617426Z 697 │ {showConnectionNotice ? ( 2026-10-24T14:24:40.0617575Z 698 │ 2026-10-24T14:24:40.0617666Z 699 │ 2026-10-24T14:24:40.0618746Z 711 │ 2026-10-24T14:24:40.0618907Z 712 │ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? ( 2026-10-24T14:24:40.0618969Z 713 │ 2026-10-24T14:24:40.0619409Z 719 │ 2026-10-24T14:24:40.0619781Z 723 │ {listHeader} 2026-10-24T14:24:40.0619904Z 724 │ 2026-10-24T14:24:40.0619987Z 725 │ { 2026-10-24T14:24:40.0621670Z ·  ────┬──── 2026-10-24T14:24:40.0621806Z · ╰── This is the containing effect 2026-10-24T14:24:40.0621910Z 102 │ if (!target || selectedLines.length === 0) { 2026-10-24T14:24:40.0621993Z 103 │ setHighlightedLinesById({}); 2026-10-24T14:24:40.0622148Z ·  ───────────┬─────────── 2026-10-24T14:24:40.0622360Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:40.0622422Z 104 │ return; 2026-10-24T14:24:40.0622474Z ╰──── 2026-10-24T14:24:40.0623100Z  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-24T14:24:40.0623434Z  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-24T14:24:40.0623437Z 2026-10-24T14:24:40.0623709Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:24:40.0623891Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:60:5] 2026-10-24T14:24:40.0623943Z 55 │ 2026-10-24T14:24:40.0624008Z 56 │ useEffect(() => { 2026-10-24T14:24:40.0624084Z ·  ────┬──── 2026-10-24T14:24:40.0624215Z · ╰── This is the containing effect 2026-10-24T14:24:40.0624283Z 57 │ scheduler.reset(); 2026-10-24T14:24:40.0624383Z 58 │ highlightedRowIdsRef.current = new Set(); 2026-10-24T14:24:40.0624470Z 59 │ visibleChunkIndexRef.current = 0; 2026-10-24T14:24:40.0624589Z 60 │ setVisibleRange({ firstRowIndex: 0, lastRowIndex: 80 }); 2026-10-24T14:24:40.0624668Z ·  ───────┬─────── 2026-10-24T14:24:40.0624850Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:40.0624969Z 61 │ setTokensPatchJson(createEmptyTokenPatch(resetKey)); 2026-10-24T14:24:40.0625022Z ╰──── 2026-10-24T14:24:40.0625642Z  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-24T14:24:40.0625973Z  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-24T14:24:40.0625975Z 2026-10-24T14:24:40.0626185Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:24:40.0626368Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:63:7] 2026-10-24T14:24:40.0626452Z 62 │ return () => scheduler.cancel(); 2026-10-24T14:24:40.0626554Z 63 │ }, [enabled, resetKey, rows.length, scheduler]); 2026-10-24T14:24:40.0626684Z ·  ───┬─── ─────┬───── 2026-10-24T14:24:40.0626882Z · │ ╰── Unnecessary dependency `rows.length` 2026-10-24T14:24:40.0627025Z · ╰── Unnecessary dependency `enabled` 2026-10-24T14:24:40.0627077Z 64 │ 2026-10-24T14:24:40.0627129Z ╰──── 2026-10-24T14:24:40.0627434Z  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-24T14:24:40.0627816Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0627856Z 2026-10-24T14:24:40.0628371Z ⚠ 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-24T14:24:40.0628500Z ╭─[packages/effect-acp/src/protocol.test.ts:500:31] 2026-10-24T14:24:40.0628553Z 499 │ 2026-10-24T14:24:40.0628669Z 500 │ const response = yield* Schema.decodeUnknownEffect( 2026-10-24T14:24:40.0628792Z ·  ────────────────────────── 2026-10-24T14:24:40.0628901Z 501 │ Schema.fromJsonString(JsonRpcErrorResponse), 2026-10-24T14:24:40.0628953Z ╰──── 2026-10-24T14:24:40.0628962Z 2026-10-24T14:24:40.0629443Z ⚠ 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-24T14:24:40.0629564Z ╭─[packages/effect-acp/src/errors.test.ts:129:28] 2026-10-24T14:24:40.0629655Z 128 │ const secret = "acp-summary-secret"; 2026-10-24T14:24:40.0629767Z 129 │ const cause = yield* Schema.decodeUnknownEffect( 2026-10-24T14:24:40.0629886Z ·  ────────────────────────── 2026-10-24T14:24:40.0629955Z 130 │ Schema.Struct({ 2026-10-24T14:24:40.0630005Z ╰──── 2026-10-24T14:24:40.0630007Z 2026-10-24T14:24:40.0630156Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0630282Z ╭─[apps/mobile/src/native/StackHeader.tsx:185:9] 2026-10-24T14:24:40.0630351Z 184 │ "options", 2026-10-24T14:24:40.0630445Z 185 │ latestOptionFunctionsRef.current, 2026-10-24T14:24:40.0630554Z ·  ────────────────┬─────────────── 2026-10-24T14:24:40.0630754Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T14:24:40.0630848Z 186 │ optionFunctionWrappersRef.current, 2026-10-24T14:24:40.0630898Z ╰──── 2026-10-24T14:24:40.0631386Z  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-24T14:24:40.0631693Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0631699Z 2026-10-24T14:24:40.0631848Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:24:40.0631967Z ╭─[apps/mobile/src/native/StackHeader.tsx:186:9] 2026-10-24T14:24:40.0632059Z 185 │ latestOptionFunctionsRef.current, 2026-10-24T14:24:40.0632152Z 186 │ optionFunctionWrappersRef.current, 2026-10-24T14:24:40.0632263Z ·  ────────────────┬──────────────── 2026-10-24T14:24:40.0632462Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T14:24:40.0632552Z 187 │ ) as NativeStackNavigationOptions) 2026-10-24T14:24:40.0632604Z ╰──── 2026-10-24T14:24:40.0633142Z  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-24T14:24:40.0633474Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:24:40.0633477Z 2026-10-24T14:24:40.0633863Z ⚠ 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-24T14:24:40.0633979Z ╭─[packages/effect-acp/src/client.ts:1269:11] 2026-10-24T14:24:40.0634133Z 1268 │ extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) => 2026-10-24T14:24:40.0634313Z 1269 │ Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe( 2026-10-24T14:24:40.0634423Z ·  ────────────────────────── 2026-10-24T14:24:40.0634571Z 1270 │ Effect.mapError(() => AcpError.AcpRequestError.invalidParams()), 2026-10-24T14:24:40.0634624Z ╰──── 2026-10-24T14:24:40.0634626Z 2026-10-24T14:24:40.0635116Z ⚠ 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-24T14:24:40.0635268Z ╭─[apps/server/src/background/HostPowerMonitor.test.ts:133:11] 2026-10-24T14:24:40.0635401Z 132 │ const monitor = yield* HostPowerMonitor.HostPowerMonitor; 2026-10-24T14:24:40.0635555Z 133 │ ╭─▶ for ( 2026-10-24T14:24:40.0635663Z 134 │ │ let attempt = 0; 2026-10-24T14:24:40.0635837Z 135 │ │ attempt < 100 && (yield* monitor.snapshot).onBattery !== "true"; 2026-10-24T14:24:40.0635937Z 136 │ │ attempt += 1 2026-10-24T14:24:40.0636018Z 137 │ │ ) { 2026-10-24T14:24:40.0636131Z 138 │ │ yield* Effect.yieldNow; 2026-10-24T14:24:40.0636268Z 139 │ ╰─▶ } 2026-10-24T14:24:40.0636393Z 140 │ expect((yield* monitor.snapshot).onBattery).toBe("true"); 2026-10-24T14:24:40.0636444Z ╰──── 2026-10-24T14:24:40.0636446Z 2026-10-24T14:24:40.0636721Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:24:40.0636917Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:107:5] 2026-10-24T14:24:40.0636970Z 104 │ 2026-10-24T14:24:40.0637035Z 105 │ useEffect(() => { 2026-10-24T14:24:40.0637108Z ·  ────┬──── 2026-10-24T14:24:40.0637242Z · ╰── This is the containing effect 2026-10-24T14:24:40.0637323Z 106 │ clearReviewCommentTarget(); 2026-10-24T14:24:40.0637419Z 107 │ setPendingNativeCommentSelection(null); 2026-10-24T14:24:40.0637527Z ·  ────────────────┬─────────────── 2026-10-24T14:24:40.0637709Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:40.0637784Z 108 │ }, [selectedSection?.id]); 2026-10-24T14:24:40.0637835Z ╰──── 2026-10-24T14:24:40.0638534Z  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-24T14:24:40.0638903Z  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-24T14:24:40.0638906Z 2026-10-24T14:24:40.0639171Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:24:40.0639360Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7] 2026-10-24T14:24:40.0639412Z 109 │ 2026-10-24T14:24:40.0639482Z 110 │ useEffect(() => { 2026-10-24T14:24:40.0639558Z ·  ────┬──── 2026-10-24T14:24:40.0639689Z · ╰── This is the containing effect 2026-10-24T14:24:40.0639775Z 111 │ if (activeCommentTarget === null) { 2026-10-24T14:24:40.0639876Z 112 │ setPendingNativeCommentSelection(null); 2026-10-24T14:24:40.0639985Z ·  ────────────────┬─────────────── 2026-10-24T14:24:40.0640169Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:40.0640224Z 113 │ } 2026-10-24T14:24:40.0640276Z ╰──── 2026-10-24T14:24:40.0640896Z  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-24T14:24:40.0641232Z  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-24T14:24:40.0641235Z 2026-10-24T14:24:40.0641442Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:24:40.0641628Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7] 2026-10-24T14:24:40.0641726Z 107 │ setPendingNativeCommentSelection(null); 2026-10-24T14:24:40.0641800Z 108 │ }, [selectedSection?.id]); 2026-10-24T14:24:40.0641891Z ·  ─────────┬───────── 2026-10-24T14:24:40.0642056Z · ╰── Unnecessary dependency `selectedSection?.id` 2026-10-24T14:24:40.0642159Z 109 │ 2026-10-24T14:24:40.0642245Z ╰──── 2026-10-24T14:24:40.0642549Z  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-24T14:24:40.0642868Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0642872Z 2026-10-24T14:24:40.0643136Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T14:24:40.0643269Z ╭─[packages/provider-grok/src/server/adapter.ts:408:7] 2026-10-24T14:24:40.0643322Z 407 │ 2026-10-24T14:24:40.0643392Z 408 │ const layer: Layer.Layer< 2026-10-24T14:24:40.0643465Z ·  ──┬── 2026-10-24T14:24:40.0643595Z · ╰── 'layer' is declared here 2026-10-24T14:24:40.0643686Z 409 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T14:24:40.0643738Z ╰──── 2026-10-24T14:24:40.0643842Z  help: Consider removing this declaration. 2026-10-24T14:24:40.0643845Z 2026-10-24T14:24:40.0644116Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-24T14:24:40.0644233Z ╭─[apps/server/src/usage/UsageService.ts:169:7] 2026-10-24T14:24:40.0644286Z 168 │ 2026-10-24T14:24:40.0644364Z 169 │ const layerTest = Layer.succeed( 2026-10-24T14:24:40.0644439Z ·  ────┬──── 2026-10-24T14:24:40.0644575Z · ╰── 'layerTest' is declared here 2026-10-24T14:24:40.0644646Z 170 │ UsageService, 2026-10-24T14:24:40.0644698Z ╰──── 2026-10-24T14:24:40.0644804Z  help: Consider removing this declaration. 2026-10-24T14:24:40.0644806Z 2026-10-24T14:24:40.0645079Z ⚠ eslint(no-unused-vars): Variable 'layerDaemon' is declared but never used. Unused variables should start with a '_'. 2026-10-24T14:24:40.0645217Z ╭─[apps/server/src/orchestration-v2/EffectWorker.ts:914:7] 2026-10-24T14:24:40.0645269Z 913 │ 2026-10-24T14:24:40.0645459Z 914 │ const layerDaemon: Layer.Layer = Layer.effectDiscard( 2026-10-24T14:24:40.0645537Z ·  ─────┬───── 2026-10-24T14:24:40.0645674Z · ╰── 'layerDaemon' is declared here 2026-10-24T14:24:40.0645758Z 915 │ runDaemon.pipe(Effect.forkScoped), 2026-10-24T14:24:40.0645810Z ╰──── 2026-10-24T14:24:40.0645918Z  help: Consider removing this declaration. 2026-10-24T14:24:40.0645925Z 2026-10-24T14:24:40.0646144Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T14:24:40.0646286Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:773:7] 2026-10-24T14:24:40.0646390Z 772 │ if (settingsSheetPresentation.isActive) { 2026-10-24T14:24:40.0646523Z 773 │ settingsRoutePresentation.present(settingsRouteSession); 2026-10-24T14:24:40.0646618Z ·  ────────────┬──────────── 2026-10-24T14:24:40.0646795Z · ╰── Missing dependency `settingsRoutePresentation` 2026-10-24T14:24:40.0646852Z 774 │ } 2026-10-24T14:24:40.0647125Z 775 │ }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]); 2026-10-24T14:24:40.0647272Z ·  ────────────────┬──────────────── 2026-10-24T14:24:40.0647560Z · ╰── Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead 2026-10-24T14:24:40.0647614Z 776 │ 2026-10-24T14:24:40.0647667Z ╰──── 2026-10-24T14:24:40.0648101Z  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-24T14:24:40.0648437Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0648440Z 2026-10-24T14:24:40.0648604Z ⚠ react(immutability): This value cannot be modified 2026-10-24T14:24:40.0648751Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:391:5] 2026-10-24T14:24:40.0648915Z 387 │ typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0; 2026-10-24T14:24:40.0649052Z 388 │ const animatedBorderRadius = useSharedValue(targetBorderRadius); 2026-10-24T14:24:40.0649144Z ·  ──────────┬───────── 2026-10-24T14:24:40.0649303Z · ╰── `animatedBorderRadius` originates here 2026-10-24T14:24:40.0649464Z 389 │ const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android"; 2026-10-24T14:24:40.0649535Z 390 │ useLayoutEffect(() => { 2026-10-24T14:24:40.0649635Z 391 │ animatedBorderRadius.value = shouldAnimate 2026-10-24T14:24:40.0649723Z ·  ──────────┬───────── 2026-10-24T14:24:40.0649891Z · ╰── `animatedBorderRadius` cannot be modified 2026-10-24T14:24:40.0649985Z 392 │ ? withTiming(targetBorderRadius, { 2026-10-24T14:24:40.0650036Z ╰──── 2026-10-24T14:24:40.0650309Z  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-24T14:24:40.0650622Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:24:40.0650625Z 2026-10-24T14:24:40.0650888Z ⚠ eslint(no-unused-vars): Function 'promptResponseHasMissingXAiStopReason' is declared but never used. 2026-10-24T14:24:40.0651043Z ╭─[packages/provider-grok/src/server/xaiAcpExtension.ts:1620:10] 2026-10-24T14:24:40.0651102Z 1619 │ 2026-10-24T14:24:40.0651317Z 1620 │ function promptResponseHasMissingXAiStopReason(response: EffectAcpSchema.PromptResponse): boolean { 2026-10-24T14:24:40.0651438Z ·  ──────────────────┬────────────────── 2026-10-24T14:24:40.0651646Z · ╰── 'promptResponseHasMissingXAiStopReason' is declared here 2026-10-24T14:24:40.0651724Z 1621 │ const meta = response._meta; 2026-10-24T14:24:40.0651777Z ╰──── 2026-10-24T14:24:40.0651881Z  help: Consider removing this declaration. 2026-10-24T14:24:40.0651884Z 2026-10-24T14:24:40.0652370Z ⚠ 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-24T14:24:40.0652562Z ╭─[apps/server/src/usage/UsageService.test.ts:2615:7] 2026-10-24T14:24:40.0652696Z 2614 │ let orphanedAt: number | undefined; 2026-10-24T14:24:40.0652935Z 2615 │ ╭─▶ for (let interruptAt = 1; interruptAt <= 31; interruptAt += 1) { 2026-10-24T14:24:40.0653060Z 2616 │ │ const tasks: Array<() => void> = []; 2026-10-24T14:24:40.0653211Z 2617 │ │ const dispatcher: Scheduler.SchedulerDispatcher = { 2026-10-24T14:24:40.0653344Z 2618 │ │ scheduleTask: (task) => tasks.push(task), 2026-10-24T14:24:40.0653444Z 2619 │ │ flush: () => { 2026-10-24T14:24:40.0653570Z 2620 │ │ let task: (() => void) | undefined; 2026-10-24T14:24:40.0653728Z 2621 │ │ while ((task = tasks.shift()) !== undefined) task(); 2026-10-24T14:24:40.0653812Z 2622 │ │ }, 2026-10-24T14:24:40.0653896Z 2623 │ │ }; 2026-10-24T14:24:40.0653967Z 2624 │ │ 2026-10-24T14:24:40.0654129Z 2625 │ │ let requestFiber: Fiber.Fiber | undefined; 2026-10-24T14:24:40.0654235Z 2626 │ │ let requestChecks = 0; 2026-10-24T14:24:40.0654366Z 2627 │ │ const scheduler: Scheduler.Scheduler = { 2026-10-24T14:24:40.0654476Z 2628 │ │ executionMode: "async", 2026-10-24T14:24:40.0654598Z 2629 │ │ makeDispatcher: () => dispatcher, 2026-10-24T14:24:40.0654710Z 2630 │ │ shouldYield: (fiber) => { 2026-10-24T14:24:40.0654853Z 2631 │ │ if (fiber !== requestFiber) return false; 2026-10-24T14:24:40.0654962Z 2632 │ │ requestChecks += 1; 2026-10-24T14:24:40.0655107Z 2633 │ │ if (requestChecks !== interruptAt) return false; 2026-10-24T14:24:40.0655222Z 2634 │ │ fiber.interruptUnsafe(); 2026-10-24T14:24:40.0655322Z 2635 │ │ return true; 2026-10-24T14:24:40.0655403Z 2636 │ │ }, 2026-10-24T14:24:40.0655484Z 2637 │ │ }; 2026-10-24T14:24:40.0655554Z 2638 │ │ 2026-10-24T14:24:40.0655678Z 2639 │ │ const input: UsageSummaryInput = { 2026-10-24T14:24:40.0655774Z 2640 │ │ ...WINDOW, 2026-10-24T14:24:40.0655909Z 2641 │ │ sinceDay: UsageDay.make("2026-09-01"), 2026-10-24T14:24:40.0656109Z 2642 │ │ untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`), 2026-10-24T14:24:40.0656191Z 2643 │ │ }; 2026-10-24T14:24:40.0656305Z 2644 │ │ const first = yield* service 2026-10-24T14:24:40.0656487Z 2645 │ │ .readSummary(input) 2026-10-24T14:24:40.0656576Z 2646 │ │ .pipe( 2026-10-24T14:24:40.0656675Z 2647 │ │ Effect.exit, 2026-10-24T14:24:40.0656837Z 2648 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-24T14:24:40.0656942Z 2649 │ │ Effect.forkChild, 2026-10-24T14:24:40.0657023Z 2650 │ │ ); 2026-10-24T14:24:40.0657198Z 2651 │ │ requestFiber = first; 2026-10-24T14:24:40.0657346Z 2652 │ │ yield* Effect.yieldNow; 2026-10-24T14:24:40.0657451Z 2653 │ │ dispatcher.flush(); 2026-10-24T14:24:40.0657521Z 2654 │ │ 2026-10-24T14:24:40.0657674Z 2655 │ │ const second = yield* service.readSummary(input).pipe( 2026-10-24T14:24:40.0657772Z 2656 │ │ Effect.match({ 2026-10-24T14:24:40.0657897Z 2657 │ │ onFailure: (error) => error.reason, 2026-10-24T14:24:40.0658021Z 2658 │ │ onSuccess: () => "success" as const, 2026-10-24T14:24:40.0658105Z 2659 │ │ }), 2026-10-24T14:24:40.0658267Z 2660 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-24T14:24:40.0658411Z 2661 │ │ Effect.forkChild, 2026-10-24T14:24:40.0658493Z 2662 │ │ ); 2026-10-24T14:24:40.0658598Z 2663 │ │ yield* Effect.yieldNow; 2026-10-24T14:24:40.0658700Z 2664 │ │ dispatcher.flush(); 2026-10-24T14:24:40.0658828Z 2665 │ │ const secondExit = second.pollUnsafe(); 2026-10-24T14:24:40.0658945Z 2666 │ │ if (secondExit === undefined) { 2026-10-24T14:24:40.0659059Z 2667 │ │ second.interruptUnsafe(); 2026-10-24T14:24:40.0659173Z 2668 │ │ orphanedAt = interruptAt; 2026-10-24T14:24:40.0659261Z 2669 │ │ break; 2026-10-24T14:24:40.0659347Z 2670 │ │ } 2026-10-24T14:24:40.0659470Z 2671 │ │ if (Exit.isFailure(secondExit)) { 2026-10-24T14:24:40.0659631Z 2672 │ │ assert.fail("the matching request fiber was interrupted"); 2026-10-24T14:24:40.0659710Z 2673 │ │ } 2026-10-24T14:24:40.0659862Z 2674 │ │ assert.strictEqual(secondExit.value, "invalidWindow"); 2026-10-24T14:24:40.0659995Z 2675 │ ╰─▶ } 2026-10-24T14:24:40.0660051Z 2676 │ 2026-10-24T14:24:40.0660105Z ╰──── 2026-10-24T14:24:40.0660108Z 2026-10-24T14:24:40.0660268Z ⚠ react(immutability): This value cannot be modified 2026-10-24T14:24:40.0660416Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:174:5] 2026-10-24T14:24:40.0660569Z 170 │ const expandedAngle = props.collapsedDirection === "right" ? 90 : 180; 2026-10-24T14:24:40.0660708Z 171 │ const rotation = useSharedValue(props.expanded ? expandedAngle : 0); 2026-10-24T14:24:40.0660786Z ·  ────┬─── 2026-10-24T14:24:40.0660920Z · ╰── `rotation` originates here 2026-10-24T14:24:40.0660973Z 172 │ 2026-10-24T14:24:40.0661043Z 173 │ useLayoutEffect(() => { 2026-10-24T14:24:40.0661179Z 174 │ rotation.value = withTiming(props.expanded ? expandedAngle : 0, { 2026-10-24T14:24:40.0661251Z ·  ────┬─── 2026-10-24T14:24:40.0661387Z · ╰── `rotation` cannot be modified 2026-10-24T14:24:40.0661487Z 175 │ duration: THREAD_DISCLOSURE_TRANSITION_MS, 2026-10-24T14:24:40.0661539Z ╰──── 2026-10-24T14:24:40.0661869Z  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-24T14:24:40.0662219Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:24:40.0662222Z 2026-10-24T14:24:40.0662424Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T14:24:40.0662578Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:1246:23] 2026-10-24T14:24:40.0662645Z 1245 │ = 2026-10-24T14:24:40.0674188Z ·  ──┬── 2026-10-24T14:24:40.0674319Z · ╰── 'layer' is declared here 2026-10-24T14:24:40.0674388Z 3406 │ Layer.effect( 2026-10-24T14:24:40.0674439Z ╰──── 2026-10-24T14:24:40.0674544Z  help: Consider removing this declaration. 2026-10-24T14:24:40.0674547Z 2026-10-24T14:24:40.0674762Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T14:24:40.0674887Z ╭─[apps/mobile/src/lib/markdownDocument.ts:259:28] 2026-10-24T14:24:40.0674987Z 258 │ visit(parser.parse(markdown), false, false); 2026-10-24T14:24:40.0675073Z 259 │ for (const edit of edits.reverse()) 2026-10-24T14:24:40.0675169Z ·  ─────── 2026-10-24T14:24:40.0675336Z 260 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-24T14:24:40.0675440Z ╰──── 2026-10-24T14:24:40.0675742Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T14:24:40.0675745Z 2026-10-24T14:24:40.0675959Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T14:24:40.0676082Z ╭─[apps/mobile/src/lib/markdownDocument.ts:290:28] 2026-10-24T14:24:40.0676161Z 289 │ visit(parser.parse(markdown)); 2026-10-24T14:24:40.0676246Z 290 │ for (const edit of edits.reverse()) 2026-10-24T14:24:40.0676342Z ·  ─────── 2026-10-24T14:24:40.0676505Z 291 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-24T14:24:40.0676556Z ╰──── 2026-10-24T14:24:40.0676826Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T14:24:40.0676831Z 2026-10-24T14:24:40.0677043Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T14:24:40.0677165Z ╭─[apps/mobile/src/lib/markdownDocument.ts:344:38] 2026-10-24T14:24:40.0677243Z 343 │ visit(parser.parse(markdown)); 2026-10-24T14:24:40.0677349Z 344 │ for (const lineStart of lineStarts.reverse()) { 2026-10-24T14:24:40.0677453Z ·  ─────── 2026-10-24T14:24:40.0677621Z 345 │ // The header row may be a lazy line without its container markers (`>` or list indent), 2026-10-24T14:24:40.0677672Z ╰──── 2026-10-24T14:24:40.0677941Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T14:24:40.0677947Z 2026-10-24T14:24:40.0678150Z ⚠ eslint(no-unused-vars): Identifier 'Duration' is imported but never used. 2026-10-24T14:24:40.0678287Z ╭─[packages/provider-pi/src/server/adapter.test.ts:24:13] 2026-10-24T14:24:40.0678419Z 23 │ import * as Deferred from "effect/Deferred"; 2026-10-24T14:24:40.0678512Z 24 │ import * as Duration from "effect/Duration"; 2026-10-24T14:24:40.0678591Z ·  ────┬─── 2026-10-24T14:24:40.0678730Z · ╰── 'Duration' is imported here 2026-10-24T14:24:40.0678818Z 25 │ import * as Effect from "effect/Effect"; 2026-10-24T14:24:40.0678868Z ╰──── 2026-10-24T14:24:40.0678968Z  help: Consider removing this import. 2026-10-24T14:24:40.0678970Z 2026-10-24T14:24:40.0679241Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:24:40.0679397Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:406:5] 2026-10-24T14:24:40.0679449Z 404 │ 2026-10-24T14:24:40.0679517Z 405 │ useEffect(() => { 2026-10-24T14:24:40.0679589Z ·  ────┬──── 2026-10-24T14:24:40.0679723Z · ╰── This is the containing effect 2026-10-24T14:24:40.0679814Z 406 │ setInspectorSelection((current) => { 2026-10-24T14:24:40.0679902Z ·  ──────────┬────────── 2026-10-24T14:24:40.0680078Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:40.0680180Z 407 │ if (props.renderInspector === undefined) { 2026-10-24T14:24:40.0680230Z ╰──── 2026-10-24T14:24:40.0680902Z  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-24T14:24:40.0681269Z  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-24T14:24:40.0681272Z 2026-10-24T14:24:40.0681491Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T14:24:40.0681644Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:534:24] 2026-10-24T14:24:40.0681805Z 533 │ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top; 2026-10-24T14:24:40.0681981Z 534 │ ╭─▶ const GitInspector = () => ( 2026-10-24T14:24:40.0682083Z 535 │ │ 2026-10-24T14:24:40.0682698Z 540 │ ╰─▶ ); 2026-10-24T14:24:40.0682779Z 541 │ const FilesInspector = () => 2026-10-24T14:24:40.0682832Z ╰──── 2026-10-24T14:24:40.0683066Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-24T14:24:40.0683072Z 2026-10-24T14:24:40.0683291Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T14:24:40.0683445Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:541:26] 2026-10-24T14:24:40.0683502Z 540 │ ); 2026-10-24T14:24:40.0683671Z 541 │ ╭─▶ const FilesInspector = () => 2026-10-24T14:24:40.0683824Z 542 │ │ selectedThread !== null && selectedThreadCwd !== null ? ( 2026-10-24T14:24:40.0683931Z 543 │ │ 2026-10-24T14:24:40.0684906Z 551 │ ╰─▶ ) : null; 2026-10-24T14:24:40.0685058Z 552 │ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset); 2026-10-24T14:24:40.0685110Z ╰──── 2026-10-24T14:24:40.0685332Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-24T14:24:40.0685335Z 2026-10-24T14:24:40.0685551Z ⚠ react(immutability): This value cannot be modified 2026-10-24T14:24:40.0685749Z ╭─[apps/mobile/src/features/connection/ConnectionStatusDot.tsx:58:7] 2026-10-24T14:24:40.0685847Z 53 │ function usePulseAnimation(pulse: boolean) { 2026-10-24T14:24:40.0685940Z 54 │ const pulseProgress = useSharedValue(0); 2026-10-24T14:24:40.0686023Z ·  ──────┬────── 2026-10-24T14:24:40.0686165Z · ╰── `pulseProgress` originates here 2026-10-24T14:24:40.0686219Z 55 │ 2026-10-24T14:24:40.0686285Z 56 │ useEffect(() => { 2026-10-24T14:24:40.0686350Z 57 │ if (pulse) { 2026-10-24T14:24:40.0686436Z 58 │ pulseProgress.value = withRepeat( 2026-10-24T14:24:40.0686515Z ·  ──────┬────── 2026-10-24T14:24:40.0686669Z · ╰── `pulseProgress` cannot be modified 2026-10-24T14:24:40.0686742Z 59 │ withTiming(1, { 2026-10-24T14:24:40.0686793Z ╰──── 2026-10-24T14:24:40.0687068Z  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-24T14:24:40.0687383Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:24:40.0687385Z 2026-10-24T14:24:40.0687649Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:24:40.0687821Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:79:5] 2026-10-24T14:24:40.0687873Z 76 │ 2026-10-24T14:24:40.0687943Z 77 │ useEffect(() => { 2026-10-24T14:24:40.0688018Z ·  ────┬──── 2026-10-24T14:24:40.0688149Z · ╰── This is the containing effect 2026-10-24T14:24:40.0688276Z 78 │ const { host, code } = parsePairingUrl(connectionPairingUrl); 2026-10-24T14:24:40.0688386Z 79 │ setHostInput(host); 2026-10-24T14:24:40.0688463Z ·  ──────┬───── 2026-10-24T14:24:40.0688632Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:40.0688699Z 80 │ setCodeInput(code); 2026-10-24T14:24:40.0688749Z ╰──── 2026-10-24T14:24:40.0689421Z  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-24T14:24:40.0689784Z  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-24T14:24:40.0689787Z 2026-10-24T14:24:40.0690050Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:24:40.0690221Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:89:5] 2026-10-24T14:24:40.0690272Z 82 │ 2026-10-24T14:24:40.0690337Z 83 │ useEffect(() => { 2026-10-24T14:24:40.0690406Z ·  ────┬──── 2026-10-24T14:24:40.0690538Z · ╰── This is the containing effect 2026-10-24T14:24:40.0690627Z 84 │ if (routePairingUrl.length === 0) { 2026-10-24T14:24:40.0690693Z 85 │ return; 2026-10-24T14:24:40.0690751Z 86 │ } 2026-10-24T14:24:40.0690803Z 87 │ 2026-10-24T14:24:40.0690919Z 88 │ const { host, code } = parsePairingUrl(routePairingUrl); 2026-10-24T14:24:40.0690984Z 89 │ setHostInput(host); 2026-10-24T14:24:40.0691059Z ·  ──────┬───── 2026-10-24T14:24:40.0691229Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:40.0691295Z 90 │ setCodeInput(code); 2026-10-24T14:24:40.0691349Z ╰──── 2026-10-24T14:24:40.0691965Z  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-24T14:24:40.0692296Z  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-24T14:24:40.0692299Z 2026-10-24T14:24:40.0692560Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:24:40.0692733Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:95:7] 2026-10-24T14:24:40.0692787Z 92 │ 2026-10-24T14:24:40.0692849Z 93 │ useEffect(() => { 2026-10-24T14:24:40.0692920Z ·  ────┬──── 2026-10-24T14:24:40.0693048Z · ╰── This is the containing effect 2026-10-24T14:24:40.0693131Z 94 │ if (pairingConnectionError) { 2026-10-24T14:24:40.0693203Z 95 │ setIsSubmitting(false); 2026-10-24T14:24:40.0693289Z ·  ───────┬─────── 2026-10-24T14:24:40.0693466Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:40.0693521Z 96 │ } 2026-10-24T14:24:40.0693570Z ╰──── 2026-10-24T14:24:40.0694189Z  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-24T14:24:40.0694515Z  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-24T14:24:40.0694518Z 2026-10-24T14:24:40.0694740Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T14:24:40.0694930Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:698:76] 2026-10-24T14:24:40.0695111Z 697 │ const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() })); 2026-10-24T14:24:40.0695281Z 698 │ if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() }); 2026-10-24T14:24:40.0695423Z ·  ─────┬──── 2026-10-24T14:24:40.0695616Z · ╰── Cannot call impure function 2026-10-24T14:24:40.0695752Z 699 │ const snoozeGateNow = new Date(snoozeGateClock.now).toISOString(); 2026-10-24T14:24:40.0695804Z ╰──── 2026-10-24T14:24:40.0696108Z  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-24T14:24:40.0696468Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T14:24:40.0696471Z 2026-10-24T14:24:40.0696640Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T14:24:40.0696798Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:719:71] 2026-10-24T14:24:40.0696881Z 718 │ const snoozePresets = useMemo( 2026-10-24T14:24:40.0697063Z 719 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-24T14:24:40.0697200Z ·  ─────┬──── 2026-10-24T14:24:40.0697392Z · ╰── Cannot call impure function 2026-10-24T14:24:40.0697515Z 720 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-24T14:24:40.0697567Z ╰──── 2026-10-24T14:24:40.0697853Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T14:24:40.0698154Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T14:24:40.0698159Z 2026-10-24T14:24:40.0698366Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T14:24:40.0698524Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:720:6] 2026-10-24T14:24:40.0698708Z 719 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-24T14:24:40.0698826Z 720 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-24T14:24:40.0698920Z ·  ────────────┬─────────── 2026-10-24T14:24:40.0699100Z · ╰── Unnecessary dependency `props.snoozePresetMinute` 2026-10-24T14:24:40.0699157Z 721 │ ); 2026-10-24T14:24:40.0699208Z ╰──── 2026-10-24T14:24:40.0699531Z  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-24T14:24:40.0699853Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0699856Z 2026-10-24T14:24:40.0700106Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T14:24:40.0700309Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:766:7] 2026-10-24T14:24:40.0700377Z 765 │ thread.pinnedAt, 2026-10-24T14:24:40.0700441Z 766 │ variant, 2026-10-24T14:24:40.0700515Z ·  ───┬─── 2026-10-24T14:24:40.0700653Z · ╰── Unnecessary dependency `variant` 2026-10-24T14:24:40.0700710Z 767 │ ], 2026-10-24T14:24:40.0700763Z ╰──── 2026-10-24T14:24:40.0701084Z  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-24T14:24:40.0701407Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0701414Z 2026-10-24T14:24:40.0701615Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T14:24:40.0701776Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1216:21] 2026-10-24T14:24:40.0701908Z 1215 │ {providerDrivers.slice(0, -1).map((driver, index) => ( 2026-10-24T14:24:40.0702046Z 1216 │ 2026-10-24T14:24:40.0702163Z ·  ────────────────────────── 2026-10-24T14:24:40.0702274Z 1217 │ 2026-10-24T14:24:40.0702329Z ╰──── 2026-10-24T14:24:40.0702479Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T14:24:40.0702488Z 2026-10-24T14:24:40.0702782Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-24T14:24:40.0702912Z ╭─[packages/provider-cursor/src/server/auth.ts:249:20] 2026-10-24T14:24:40.0702969Z 248 │ }, 2026-10-24T14:24:40.0703053Z 249 │ (effect, flow, stopSessions) => 2026-10-24T14:24:40.0703147Z ·  ──────┬───── 2026-10-24T14:24:40.0703298Z · ╰── 'stopSessions' is declared here 2026-10-24T14:24:40.0703365Z 250 │ effect.pipe( 2026-10-24T14:24:40.0703417Z ╰──── 2026-10-24T14:24:40.0703523Z  help: Consider removing this parameter. 2026-10-24T14:24:40.0703525Z 2026-10-24T14:24:40.0703723Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T14:24:40.0703884Z ╭─[apps/mobile/src/features/threads/ThreadQueueControl.tsx:602:27] 2026-10-24T14:24:40.0704057Z 601 │ const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success)); 2026-10-24T14:24:40.0704137Z 602 │ const gesture = Gesture.Pan() 2026-10-24T14:24:40.0704224Z ·  ─┬─ 2026-10-24T14:24:40.0704367Z · ╰── `Pan` may be a component 2026-10-24T14:24:40.0704444Z 603 │ .enabled(!props.disabled) 2026-10-24T14:24:40.0704496Z ╰──── 2026-10-24T14:24:40.0704782Z  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-24T14:24:40.0705295Z  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-24T14:24:40.0705329Z 2026-10-24T14:24:40.0705590Z ⚠ eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used. 2026-10-24T14:24:40.0705775Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:960:10] 2026-10-24T14:24:40.0705829Z 959 │ 2026-10-24T14:24:40.0705938Z 960 │ function layerClaudeAgentSdkReplayQueryRunner( 2026-10-24T14:24:40.0706054Z ·  ──────────────────┬───────────────── 2026-10-24T14:24:40.0706259Z · ╰── 'layerClaudeAgentSdkReplayQueryRunner' is declared here 2026-10-24T14:24:40.0706368Z 961 │ transcript: ClaudeAgentSdkReplayTranscript, 2026-10-24T14:24:40.0706421Z ╰──── 2026-10-24T14:24:40.0706527Z  help: Consider removing this declaration. 2026-10-24T14:24:40.0706529Z 2026-10-24T14:24:40.0706760Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T14:24:40.0706933Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:1998:15] 2026-10-24T14:24:40.0707001Z 1997 │ assert.equal( 2026-10-24T14:24:40.0707151Z 1998 │ items.filter((item) => item.type === "assistant_message").at(-1)?.text, 2026-10-24T14:24:40.0707232Z ·  ────── 2026-10-24T14:24:40.0707310Z 1999 │ "authoritative answer", 2026-10-24T14:24:40.0707363Z ╰──── 2026-10-24T14:24:40.0707542Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T14:24:40.0707548Z 2026-10-24T14:24:40.0708036Z ⚠ 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-24T14:24:40.0708208Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:3951:7] 2026-10-24T14:24:40.0708419Z 3950 │ const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped); 2026-10-24T14:24:40.0708633Z 3951 │ ╭─▶ while (!responseLifecycle.includes("failed")) { 2026-10-24T14:24:40.0708743Z 3952 │ │ yield* Effect.yieldNow; 2026-10-24T14:24:40.0708878Z 3953 │ ╰─▶ } 2026-10-24T14:24:40.0709006Z 3954 │ const responseExit = yield* Fiber.join(responseFiber); 2026-10-24T14:24:40.0709061Z ╰──── 2026-10-24T14:24:40.0709066Z 2026-10-24T14:24:40.0709544Z ⚠ 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-24T14:24:40.0709715Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6062:9] 2026-10-24T14:24:40.0709805Z 6061 │ .pipe(Effect.forkScoped); 2026-10-24T14:24:40.0709993Z 6062 │ ╭─▶ while (promptGates.length < 1) { 2026-10-24T14:24:40.0710104Z 6063 │ │ yield* Effect.yieldNow; 2026-10-24T14:24:40.0710294Z 6064 │ ╰─▶ } 2026-10-24T14:24:40.0710497Z 6065 │ assert.isDefined(sessionUpdateHandler, "session update handler must be wired"); 2026-10-24T14:24:40.0710549Z ╰──── 2026-10-24T14:24:40.0710552Z 2026-10-24T14:24:40.0711029Z ⚠ 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-24T14:24:40.0711197Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6197:9] 2026-10-24T14:24:40.0711286Z 6196 │ .pipe(Effect.forkScoped); 2026-10-24T14:24:40.0711474Z 6197 │ ╭─▶ while (promptGates.length < 2) { 2026-10-24T14:24:40.0711588Z 6198 │ │ yield* Effect.yieldNow; 2026-10-24T14:24:40.0711727Z 6199 │ ╰─▶ } 2026-10-24T14:24:40.0711896Z 6200 │ if (sessionUpdateHandler === undefined || capturedMutation.current === null) { 2026-10-24T14:24:40.0711949Z ╰──── 2026-10-24T14:24:40.0711952Z 2026-10-24T14:24:40.0712124Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T14:24:40.0712274Z ╭─[apps/server/src/provider/Drivers/CodexDriver.test.ts:466:14] 2026-10-24T14:24:40.0712327Z 465 │ 2026-10-24T14:24:40.0712435Z 466 │ for (const {} of ["direct", "wrapper"] as const) { 2026-10-24T14:24:40.0712509Z ·  ── 2026-10-24T14:24:40.0712563Z 467 │ } 2026-10-24T14:24:40.0712614Z ╰──── 2026-10-24T14:24:40.0712859Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T14:24:40.0712864Z 2026-10-24T14:24:40.0713033Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T14:24:40.0713152Z ╭─[apps/web/src/components/Sidebar.tsx:1136:11] 2026-10-24T14:24:40.0713252Z 1135 │ foldSearchQuery(threadSearchQuery), 2026-10-24T14:24:40.0713320Z 1136 │ Date.now(), 2026-10-24T14:24:40.0713402Z ·  ─────┬──── 2026-10-24T14:24:40.0713539Z · ╰── Cannot call impure function 2026-10-24T14:24:40.0713678Z 1137 │ // A list filter, as on mobile: a pick would move rows unexplained. 2026-10-24T14:24:40.0713732Z ╰──── 2026-10-24T14:24:40.0714073Z  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-24T14:24:40.0714410Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T14:24:40.0714413Z 2026-10-24T14:24:40.0714677Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:24:40.0714841Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:279:5] 2026-10-24T14:24:40.0714963Z 277 │ const [snoozeWakeTick, bumpSnoozeWakeTick] = useState(0); 2026-10-24T14:24:40.0715030Z 278 │ useEffect(() => { 2026-10-24T14:24:40.0715102Z ·  ────┬──── 2026-10-24T14:24:40.0715237Z · ╰── This is the containing effect 2026-10-24T14:24:40.0715331Z 279 │ setNow(new Date().toISOString()); 2026-10-24T14:24:40.0715403Z ·  ───┬── 2026-10-24T14:24:40.0715571Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:40.0715711Z 280 │ const id = setInterval(() => setNow(new Date().toISOString()), 60_000); 2026-10-24T14:24:40.0715762Z ╰──── 2026-10-24T14:24:40.0716383Z  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-24T14:24:40.0716717Z  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-24T14:24:40.0716722Z 2026-10-24T14:24:40.0716954Z ⚠ eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used. 2026-10-24T14:24:40.0717117Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:13:8] 2026-10-24T14:24:40.0717191Z 12 │ threadSearchMatchKey, 2026-10-24T14:24:40.0717277Z 13 │ type EnvironmentThreadSearchMatch, 2026-10-24T14:24:40.0717381Z ·  ──────────────┬───────────── 2026-10-24T14:24:40.0717563Z · ╰── 'EnvironmentThreadSearchMatch' is imported here 2026-10-24T14:24:40.0717674Z 14 │ } from "@t3tools/client-runtime/state/thread-search"; 2026-10-24T14:24:40.0717725Z ╰──── 2026-10-24T14:24:40.0717823Z  help: Consider removing this import. 2026-10-24T14:24:40.0717826Z 2026-10-24T14:24:40.0718037Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:24:40.0718207Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:359:25] 2026-10-24T14:24:40.0718375Z 358 │ // range) the boundary string is identical and the chain would die. 2026-10-24T14:24:40.0718466Z 359 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-24T14:24:40.0718569Z ·  ───────┬────── 2026-10-24T14:24:40.0718740Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T14:24:40.0718854Z 360 │ const listItems = ((): readonly SidebarListItem[] => { 2026-10-24T14:24:40.0718905Z ╰──── 2026-10-24T14:24:40.0719270Z  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-24T14:24:40.0719620Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0719623Z 2026-10-24T14:24:40.0719794Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T14:24:40.0719960Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:350:53] 2026-10-24T14:24:40.0720046Z 349 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-24T14:24:40.0720204Z 350 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-24T14:24:40.0720326Z ·  ─────┬──── 2026-10-24T14:24:40.0720504Z · ╰── Cannot call impure function 2026-10-24T14:24:40.0720585Z 351 │ const id = setTimeout(() => { 2026-10-24T14:24:40.0720637Z ╰──── 2026-10-24T14:24:40.0720930Z  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-24T14:24:40.0721230Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T14:24:40.0721233Z 2026-10-24T14:24:40.0721392Z ⚠ react(immutability): This value cannot be modified 2026-10-24T14:24:40.0721553Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:42:5] 2026-10-24T14:24:40.0721606Z 35 │ 2026-10-24T14:24:40.0721744Z 36 │ const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0); 2026-10-24T14:24:40.0721836Z ·  ────────┬──────── 2026-10-24T14:24:40.0721988Z · ╰── `inspectorProgress` originates here 2026-10-24T14:24:40.0722083Z 37 │ const { renderedInspectorWidth } = props; 2026-10-24T14:24:40.0722236Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-24T14:24:40.0722288Z 39 │ 2026-10-24T14:24:40.0722367Z 40 │ const onClosed = props.onClosed; 2026-10-24T14:24:40.0722433Z 41 │ useEffect(() => { 2026-10-24T14:24:40.0722522Z 42 │ inspectorProgress.value = withTiming( 2026-10-24T14:24:40.0722605Z ·  ────────┬──────── 2026-10-24T14:24:40.0722758Z · ╰── `inspectorProgress` cannot be modified 2026-10-24T14:24:40.0722836Z 43 │ inspectorVisible ? 1 : 0, 2026-10-24T14:24:40.0722888Z ╰──── 2026-10-24T14:24:40.0723166Z  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-24T14:24:40.0723479Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:24:40.0723482Z 2026-10-24T14:24:40.0723641Z ⚠ react(immutability): This value cannot be modified 2026-10-24T14:24:40.0723801Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:67:7] 2026-10-24T14:24:40.0723895Z 37 │ const { renderedInspectorWidth } = props; 2026-10-24T14:24:40.0724027Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-24T14:24:40.0724118Z ·  ──────────┬───────── 2026-10-24T14:24:40.0724332Z · ╰── `renderedContentWidth` originates here 2026-10-24T14:24:40.0724421Z 39 │ 2026-10-24T14:24:40.0724500Z 40 │ const onClosed = props.onClosed; 2026-10-24T14:24:40.0724566Z 41 │ useEffect(() => { 2026-10-24T14:24:40.0724655Z 42 │ inspectorProgress.value = withTiming( 2026-10-24T14:24:40.0724732Z 43 │ inspectorVisible ? 1 : 0, 2026-10-24T14:24:40.0724804Z 44 │ WORKSPACE_PANE_TIMING, 2026-10-24T14:24:40.0724871Z 45 │ (finished) => { 2026-10-24T14:24:40.0725012Z 46 │ if (finished === true && !inspectorVisible && onClosed !== undefined) { 2026-10-24T14:24:40.0725085Z 47 │ runOnJS(onClosed)(); 2026-10-24T14:24:40.0725141Z 48 │ } 2026-10-24T14:24:40.0725197Z 49 │ }, 2026-10-24T14:24:40.0725252Z 50 │ ); 2026-10-24T14:24:40.0725385Z 51 │ const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0; 2026-10-24T14:24:40.0725468Z 52 │ renderedInspectorWidth.set( 2026-10-24T14:24:40.0725615Z 53 │ resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING), 2026-10-24T14:24:40.0725669Z 54 │ ); 2026-10-24T14:24:40.0725722Z 55 │ }, [ 2026-10-24T14:24:40.0725792Z 56 │ inspectorProgress, 2026-10-24T14:24:40.0725859Z 57 │ inspectorVisible, 2026-10-24T14:24:40.0725923Z 58 │ inspectorWidth, 2026-10-24T14:24:40.0725983Z 59 │ onClosed, 2026-10-24T14:24:40.0726055Z 60 │ renderedInspectorWidth, 2026-10-24T14:24:40.0726115Z 61 │ resizing, 2026-10-24T14:24:40.0726169Z 62 │ ]); 2026-10-24T14:24:40.0726220Z 63 │ 2026-10-24T14:24:40.0726283Z 64 │ useEffect(() => { 2026-10-24T14:24:40.0726375Z 65 │ const targetWidth = inspectorWidth ?? 0; 2026-10-24T14:24:40.0726460Z 66 │ if (!inspectorVisible || resizing) { 2026-10-24T14:24:40.0726564Z 67 │ renderedContentWidth.value = targetWidth; 2026-10-24T14:24:40.0726657Z ·  ──────────┬───────── 2026-10-24T14:24:40.0726822Z · ╰── `renderedContentWidth` cannot be modified 2026-10-24T14:24:40.0726881Z 68 │ return; 2026-10-24T14:24:40.0726932Z ╰──── 2026-10-24T14:24:40.0727204Z  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-24T14:24:40.0727518Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:24:40.0727521Z 2026-10-24T14:24:40.0727788Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T14:24:40.0727966Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10578:7] 2026-10-24T14:24:40.0728024Z 10577 │ 2026-10-24T14:24:40.0728098Z 10578 │ const layer: Layer.Layer< 2026-10-24T14:24:40.0728171Z ·  ──┬── 2026-10-24T14:24:40.0728299Z · ╰── 'layer' is declared here 2026-10-24T14:24:40.0728425Z 10579 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T14:24:40.0728479Z ╰──── 2026-10-24T14:24:40.0728586Z  help: Consider removing this declaration. 2026-10-24T14:24:40.0728588Z 2026-10-24T14:24:40.0728794Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:24:40.0728959Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:155:7] 2026-10-24T14:24:40.0729015Z 154 │ } 2026-10-24T14:24:40.0729140Z 155 │ }, [wrappedRender]); 2026-10-24T14:24:40.0729258Z ·  ──────┬────── 2026-10-24T14:24:40.0729412Z · ╰── Unnecessary dependency `wrappedRender` 2026-10-24T14:24:40.0729465Z 156 │ 2026-10-24T14:24:40.0729517Z ╰──── 2026-10-24T14:24:40.0729817Z  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-24T14:24:40.0730137Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0730140Z 2026-10-24T14:24:40.0730389Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T14:24:40.0730560Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:800:42] 2026-10-24T14:24:40.0730617Z 799 │ > 2026-10-24T14:24:40.0730745Z 800 │ 2026-10-24T14:24:40.0730868Z ·  ──────────────────── 2026-10-24T14:24:40.0730969Z 801 │ 2026-10-24T14:24:40.0731021Z ╰──── 2026-10-24T14:24:40.0731253Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T14:24:40.0731394Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T14:24:40.0731397Z 2026-10-24T14:24:40.0731642Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T14:24:40.0731805Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:290:50] 2026-10-24T14:24:40.0731867Z 289 │ return ( 2026-10-24T14:24:40.0732005Z 290 │ 2026-10-24T14:24:40.0732127Z ·  ───────────── 2026-10-24T14:24:40.0732198Z 291 │ {props.children} 2026-10-24T14:24:40.0732248Z ╰──── 2026-10-24T14:24:40.0732475Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T14:24:40.0732615Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T14:24:40.0732618Z 2026-10-24T14:24:40.0732864Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T14:24:40.0733026Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:654:44] 2026-10-24T14:24:40.0733088Z 653 │ return ( 2026-10-24T14:24:40.0733210Z 654 │ 2026-10-24T14:24:40.0733327Z ·  ───────────── 2026-10-24T14:24:40.0733394Z 655 │ {props.children} 2026-10-24T14:24:40.0733444Z ╰──── 2026-10-24T14:24:40.0733670Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T14:24:40.0733809Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T14:24:40.0733811Z 2026-10-24T14:24:40.0734056Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T14:24:40.0734270Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1462:55] 2026-10-24T14:24:40.0734366Z 1461 │ return ( 2026-10-24T14:24:40.0734529Z 1462 │ 2026-10-24T14:24:40.0734665Z ·  ──────────────────── 2026-10-24T14:24:40.0734763Z 1463 │ { 2026-10-24T14:24:40.0738412Z ·  ────┬──── 2026-10-24T14:24:40.0738543Z · ╰── This is the containing effect 2026-10-24T14:24:40.0738612Z 57 │ setDecodedSize(null); 2026-10-24T14:24:40.0738690Z ·  ───────┬────── 2026-10-24T14:24:40.0738864Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:40.0738935Z 58 │ }, [props.sourceKey]); 2026-10-24T14:24:40.0738987Z ╰──── 2026-10-24T14:24:40.0739614Z  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-24T14:24:40.0739948Z  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-24T14:24:40.0739951Z 2026-10-24T14:24:40.0740216Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:24:40.0740368Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5] 2026-10-24T14:24:40.0740422Z 59 │ 2026-10-24T14:24:40.0740485Z 60 │ useEffect(() => { 2026-10-24T14:24:40.0740556Z ·  ────┬──── 2026-10-24T14:24:40.0740689Z · ╰── This is the containing effect 2026-10-24T14:24:40.0740763Z 61 │ setFailedUri(null); 2026-10-24T14:24:40.0740840Z ·  ──────┬───── 2026-10-24T14:24:40.0741009Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:40.0741076Z 62 │ }, [props.uri]); 2026-10-24T14:24:40.0741127Z ╰──── 2026-10-24T14:24:40.0741742Z  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-24T14:24:40.0742069Z  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-24T14:24:40.0742072Z 2026-10-24T14:24:40.0742298Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-24T14:24:40.0742454Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10] 2026-10-24T14:24:40.0742580Z 6 │ import { parse, SvgAst, type JsxAST } from "react-native-svg"; 2026-10-24T14:24:40.0742759Z 7 │ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native"; 2026-10-24T14:24:40.0742848Z ·  ────────┬──────── 2026-10-24T14:24:40.0743000Z · ╰── 'ActivityIndicator' is imported here 2026-10-24T14:24:40.0743055Z 8 │ 2026-10-24T14:24:40.0743105Z ╰──── 2026-10-24T14:24:40.0743207Z  help: Consider removing this import. 2026-10-24T14:24:40.0743210Z 2026-10-24T14:24:40.0743555Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:24:40.0743753Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7] 2026-10-24T14:24:40.0743821Z 57 │ setDecodedSize(null); 2026-10-24T14:24:40.0743891Z 58 │ }, [props.sourceKey]); 2026-10-24T14:24:40.0743974Z ·  ───────┬─────── 2026-10-24T14:24:40.0744130Z · ╰── Unnecessary dependency `props.sourceKey` 2026-10-24T14:24:40.0744182Z 59 │ 2026-10-24T14:24:40.0744233Z ╰──── 2026-10-24T14:24:40.0744535Z  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-24T14:24:40.0744854Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0744862Z 2026-10-24T14:24:40.0745068Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:24:40.0745219Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7] 2026-10-24T14:24:40.0745286Z 61 │ setFailedUri(null); 2026-10-24T14:24:40.0745352Z 62 │ }, [props.uri]); 2026-10-24T14:24:40.0745425Z ·  ────┬──── 2026-10-24T14:24:40.0745570Z · ╰── Unnecessary dependency `props.uri` 2026-10-24T14:24:40.0745623Z 63 │ 2026-10-24T14:24:40.0745676Z ╰──── 2026-10-24T14:24:40.0745976Z  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-24T14:24:40.0746301Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0746307Z 2026-10-24T14:24:40.0746570Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:24:40.0746733Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:40:5] 2026-10-24T14:24:40.0746847Z 37 │ const [initialized, setInitialized] = useState(false); 2026-10-24T14:24:40.0746914Z 38 │ useLayoutEffect(() => { 2026-10-24T14:24:40.0746992Z ·  ───────┬─────── 2026-10-24T14:24:40.0747124Z · ╰── This is the containing effect 2026-10-24T14:24:40.0747186Z 39 │ reset(); 2026-10-24T14:24:40.0747253Z 40 │ setInitialized(true); 2026-10-24T14:24:40.0747330Z ·  ───────┬────── 2026-10-24T14:24:40.0747508Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:40.0747572Z 41 │ }, [reset]); 2026-10-24T14:24:40.0747622Z ╰──── 2026-10-24T14:24:40.0748240Z  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-24T14:24:40.0748594Z  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-24T14:24:40.0748597Z 2026-10-24T14:24:40.0748909Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:24:40.0749099Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:93:5] 2026-10-24T14:24:40.0749150Z 88 │ 2026-10-24T14:24:40.0749216Z 89 │ useEffect(() => { 2026-10-24T14:24:40.0749285Z ·  ────┬──── 2026-10-24T14:24:40.0749415Z · ╰── This is the containing effect 2026-10-24T14:24:40.0749575Z 90 │ if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return; 2026-10-24T14:24:40.0749679Z 91 │ const branchName = initialProjectRef.branch; 2026-10-24T14:24:40.0749744Z 92 │ let active = true; 2026-10-24T14:24:40.0749841Z 93 │ setPendingCheckouts((count) => count + 1); 2026-10-24T14:24:40.0749925Z ·  ─────────┬───────── 2026-10-24T14:24:40.0750104Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:40.0750264Z 94 │ // Serialize replacements: ignoring a stale result cannot undo its Git mutation. 2026-10-24T14:24:40.0750315Z ╰──── 2026-10-24T14:24:40.0750926Z  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-24T14:24:40.0751255Z  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-24T14:24:40.0751257Z 2026-10-24T14:24:40.0751418Z ⚠ react(immutability): This value cannot be modified 2026-10-24T14:24:40.0751589Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:111:5] 2026-10-24T14:24:40.0751647Z 107 │ ); 2026-10-24T14:24:40.0751799Z 108 │ const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0); 2026-10-24T14:24:40.0751889Z ·  ─────────┬──────── 2026-10-24T14:24:40.0752046Z · ╰── `separationProgress` originates here 2026-10-24T14:24:40.0752099Z 109 │ 2026-10-24T14:24:40.0752164Z 110 │ useEffect(() => { 2026-10-24T14:24:40.0752343Z 111 │ separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING); 2026-10-24T14:24:40.0752428Z ·  ─────────┬──────── 2026-10-24T14:24:40.0752582Z · ╰── `separationProgress` cannot be modified 2026-10-24T14:24:40.0752698Z 112 │ }, [props.showScrollToEnd, separationProgress]); 2026-10-24T14:24:40.0752754Z ╰──── 2026-10-24T14:24:40.0753025Z  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-24T14:24:40.0753335Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:24:40.0753338Z 2026-10-24T14:24:40.0753496Z ⚠ react(immutability): This value cannot be modified 2026-10-24T14:24:40.0753660Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-24T14:24:40.0753775Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-24T14:24:40.0753891Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-24T14:24:40.0753971Z ·  ──────┬───── 2026-10-24T14:24:40.0754164Z · ╰── `capsuleWidth` originates here 2026-10-24T14:24:40.0754310Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T14:24:40.0754426Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T14:24:40.0754533Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T14:24:40.0754630Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T14:24:40.0754694Z 134 │ return; 2026-10-24T14:24:40.0754749Z 135 │ } 2026-10-24T14:24:40.0754854Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T14:24:40.0754941Z 137 │ measuredWidthRef.current = width; 2026-10-24T14:24:40.0755084Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T14:24:40.0755161Z ·  ──────┬───── 2026-10-24T14:24:40.0755309Z · ╰── `capsuleWidth` cannot be modified 2026-10-24T14:24:40.0755370Z 139 │ }; 2026-10-24T14:24:40.0755422Z ╰──── 2026-10-24T14:24:40.0755694Z  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-24T14:24:40.0756003Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:24:40.0756008Z 2026-10-24T14:24:40.0756165Z ⚠ react(immutability): This value cannot be modified 2026-10-24T14:24:40.0756330Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-24T14:24:40.0756441Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-24T14:24:40.0756559Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-24T14:24:40.0756641Z ·  ──────┬───── 2026-10-24T14:24:40.0756779Z · ╰── `capsuleWidth` originates here 2026-10-24T14:24:40.0756890Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T14:24:40.0757006Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T14:24:40.0757109Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T14:24:40.0757205Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T14:24:40.0757267Z 134 │ return; 2026-10-24T14:24:40.0757323Z 135 │ } 2026-10-24T14:24:40.0757429Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T14:24:40.0757515Z 137 │ measuredWidthRef.current = width; 2026-10-24T14:24:40.0757662Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T14:24:40.0757719Z 139 │ }; 2026-10-24T14:24:40.0757811Z 140 │ const hasStatus = props.status !== null; 2026-10-24T14:24:40.0757945Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-24T14:24:40.0758011Z 142 │ useEffect(() => { 2026-10-24T14:24:40.0758077Z 143 │ if (!hasStatus) { 2026-10-24T14:24:40.0758164Z 144 │ measuredWidthRef.current = null; 2026-10-24T14:24:40.0758242Z 145 │ capsuleWidth.value = null; 2026-10-24T14:24:40.0758319Z ·  ──────┬───── 2026-10-24T14:24:40.0758495Z · ╰── `capsuleWidth` cannot be modified 2026-10-24T14:24:40.0758552Z 146 │ } 2026-10-24T14:24:40.0758604Z ╰──── 2026-10-24T14:24:40.0758931Z  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-24T14:24:40.0759275Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:24:40.0759280Z 2026-10-24T14:24:40.0759483Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T14:24:40.0759648Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-24T14:24:40.0759787Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-24T14:24:40.0759854Z 142 │ useEffect(() => { 2026-10-24T14:24:40.0759931Z ·  ───┬─── 2026-10-24T14:24:40.0760160Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-24T14:24:40.0760232Z 143 │ if (!hasStatus) { 2026-10-24T14:24:40.0760323Z 144 │ measuredWidthRef.current = null; 2026-10-24T14:24:40.0760400Z 145 │ capsuleWidth.value = null; 2026-10-24T14:24:40.0760478Z ·  ──────┬───── 2026-10-24T14:24:40.0760615Z · ╰── This modifies `capsuleWidth` 2026-10-24T14:24:40.0760671Z 146 │ } 2026-10-24T14:24:40.0760722Z ╰──── 2026-10-24T14:24:40.0761075Z  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-24T14:24:40.0761389Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:24:40.0761391Z 2026-10-24T14:24:40.0761599Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T14:24:40.0761768Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-24T14:24:40.0761884Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T14:24:40.0762001Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T14:24:40.0762128Z ·  ───────────────┬─────────────── 2026-10-24T14:24:40.0762377Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-24T14:24:40.0762481Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T14:24:40.0762579Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T14:24:40.0762699Z 134 │ return; 2026-10-24T14:24:40.0762785Z 135 │ } 2026-10-24T14:24:40.0762893Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T14:24:40.0762980Z 137 │ measuredWidthRef.current = width; 2026-10-24T14:24:40.0763123Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T14:24:40.0763200Z ·  ──────┬───── 2026-10-24T14:24:40.0763337Z · ╰── This modifies `capsuleWidth` 2026-10-24T14:24:40.0763391Z 139 │ }; 2026-10-24T14:24:40.0763444Z ╰──── 2026-10-24T14:24:40.0763787Z  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-24T14:24:40.0764104Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:24:40.0764110Z 2026-10-24T14:24:40.0764342Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T14:24:40.0764488Z ╭─[packages/client-runtime/src/operations/projects.ts:238:51] 2026-10-24T14:24:40.0764550Z 237 │ ): string { 2026-10-24T14:24:40.0764705Z 238 │ const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? ""; 2026-10-24T14:24:40.0764818Z ·  ────── 2026-10-24T14:24:40.0764951Z 239 │ return target.owner ? `${target.owner}/${folderName}` : folderName; 2026-10-24T14:24:40.0765002Z ╰──── 2026-10-24T14:24:40.0765176Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T14:24:40.0765178Z 2026-10-24T14:24:40.0765361Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T14:24:40.0765511Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:372:47] 2026-10-24T14:24:40.0765644Z 371 │ const { open, onOpenChange, onSnooze, timestampFormat } = props; 2026-10-24T14:24:40.0765798Z 372 │ const presets = open ? resolveSnoozePresets(new Date(), timestampFormat) : []; 2026-10-24T14:24:40.0765914Z ·  ─────┬──── 2026-10-24T14:24:40.0766081Z · ╰── Cannot call impure function 2026-10-24T14:24:40.0766141Z 373 │ return ( 2026-10-24T14:24:40.0766192Z ╰──── 2026-10-24T14:24:40.0766484Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T14:24:40.0766787Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T14:24:40.0766790Z 2026-10-24T14:24:40.0766960Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T14:24:40.0767108Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:853:39] 2026-10-24T14:24:40.0767202Z 852 │ if (snoozeGateClock.thread !== thread) { 2026-10-24T14:24:40.0767332Z 853 │ setSnoozeGateClock({ thread, now: new Date().toISOString() }); 2026-10-24T14:24:40.0767444Z ·  ─────┬──── 2026-10-24T14:24:40.0767603Z · ╰── Cannot call impure function 2026-10-24T14:24:40.0767708Z 854 │ } 2026-10-24T14:24:40.0767789Z ╰──── 2026-10-24T14:24:40.0768069Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T14:24:40.0768389Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T14:24:40.0768391Z 2026-10-24T14:24:40.0768656Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:24:40.0768794Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2146:5] 2026-10-24T14:24:40.0768851Z 2144 │ ); 2026-10-24T14:24:40.0768920Z 2145 │ useEffect(() => { 2026-10-24T14:24:40.0768994Z ·  ────┬──── 2026-10-24T14:24:40.0769132Z · ╰── This is the containing effect 2026-10-24T14:24:40.0769208Z 2146 │ setExpandedVideo(null); 2026-10-24T14:24:40.0769292Z ·  ────────┬─────── 2026-10-24T14:24:40.0769468Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:40.0769541Z 2147 │ setExpandedFile(null); 2026-10-24T14:24:40.0769594Z ╰──── 2026-10-24T14:24:40.0770214Z  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-24T14:24:40.0770550Z  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-24T14:24:40.0770555Z 2026-10-24T14:24:40.0770819Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:24:40.0770956Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2647:9] 2026-10-24T14:24:40.0771095Z 2638 │ const stopFollowingEnd = useEffectEvent(() => setEndFollow(false)); 2026-10-24T14:24:40.0771162Z 2639 │ useEffect(() => { 2026-10-24T14:24:40.0771237Z ·  ────┬──── 2026-10-24T14:24:40.0771368Z · ╰── This is the containing effect 2026-10-24T14:24:40.0771498Z 2640 │ if (!jumpToMessageId || loadedListKey !== listMountKey) return; 2026-10-24T14:24:40.0771596Z 2641 │ const index = presentedFeed.findIndex( 2026-10-24T14:24:40.0771738Z 2642 │ (entry) => entry.type === "message" && entry.id === jumpToMessageId, 2026-10-24T14:24:40.0771797Z 2643 │ ); 2026-10-24T14:24:40.0771867Z 2644 │ if (index === -1) { 2026-10-24T14:24:40.0771996Z 2645 │ const runId = messageFoldRunId(props.feed, jumpToMessageId); 2026-10-24T14:24:40.0772100Z 2646 │ if (runId && !expandedTurnIds.has(runId)) { 2026-10-24T14:24:40.0772194Z 2647 │ setInteractionState((current) => ({ 2026-10-24T14:24:40.0772285Z ·  ─────────┬───────── 2026-10-24T14:24:40.0772468Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:40.0772535Z 2648 │ ...current, 2026-10-24T14:24:40.0772587Z ╰──── 2026-10-24T14:24:40.0773260Z  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-24T14:24:40.0773626Z  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-24T14:24:40.0773629Z 2026-10-24T14:24:40.0773865Z ⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used. 2026-10-24T14:24:40.0774000Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:66:10] 2026-10-24T14:24:40.0774136Z 65 │ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets"; 2026-10-24T14:24:40.0774278Z 66 │ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks"; 2026-10-24T14:24:40.0774381Z ·  ───────────┬─────────── 2026-10-24T14:24:40.0774554Z · ╰── 'isMarkdownFileLinkLabel' is imported here 2026-10-24T14:24:40.0774711Z 67 │ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments"; 2026-10-24T14:24:40.0774763Z ╰──── 2026-10-24T14:24:40.0774862Z  help: Consider removing this import. 2026-10-24T14:24:40.0774865Z 2026-10-24T14:24:40.0775081Z ⚠ eslint(no-unused-vars): Identifier 'createContext' is imported but never used. 2026-10-24T14:24:40.0775212Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:92:3] 2026-10-24T14:24:40.0775271Z 91 │ import { 2026-10-24T14:24:40.0775335Z 92 │ createContext, 2026-10-24T14:24:40.0775410Z ·  ──────┬────── 2026-10-24T14:24:40.0775552Z · ╰── 'createContext' is imported here 2026-10-24T14:24:40.0775612Z 93 │ memo, 2026-10-24T14:24:40.0775663Z ╰──── 2026-10-24T14:24:40.0775762Z  help: Consider removing this import. 2026-10-24T14:24:40.0775764Z 2026-10-24T14:24:40.0777547Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-24T14:24:40.0777697Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:108:3] 2026-10-24T14:24:40.0777757Z 107 │ import { 2026-10-24T14:24:40.0777826Z 108 │ ActivityIndicator, 2026-10-24T14:24:40.0777909Z ·  ────────┬──────── 2026-10-24T14:24:40.0778058Z · ╰── 'ActivityIndicator' is imported here 2026-10-24T14:24:40.0778116Z 109 │ Image, 2026-10-24T14:24:40.0778168Z ╰──── 2026-10-24T14:24:40.0778274Z  help: Consider removing this import. 2026-10-24T14:24:40.0778283Z 2026-10-24T14:24:40.0778527Z ⚠ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used. 2026-10-24T14:24:40.0778662Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:115:3] 2026-10-24T14:24:40.0778725Z 114 │ Pressable, 2026-10-24T14:24:40.0778788Z 115 │ ScrollView, 2026-10-24T14:24:40.0778861Z ·  ─────┬──── 2026-10-24T14:24:40.0778994Z · ╰── 'ScrollView' is imported here 2026-10-24T14:24:40.0779056Z 116 │ StyleSheet, 2026-10-24T14:24:40.0779106Z ╰──── 2026-10-24T14:24:40.0779203Z  help: Consider removing this import. 2026-10-24T14:24:40.0779206Z 2026-10-24T14:24:40.0779408Z ⚠ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used. 2026-10-24T14:24:40.0779645Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:117:11] 2026-10-24T14:24:40.0779749Z 116 │ StyleSheet, 2026-10-24T14:24:40.0779816Z 117 │ Text as NativeText, 2026-10-24T14:24:40.0779896Z ·  ─────┬──── 2026-10-24T14:24:40.0780036Z · ╰── 'NativeText' is imported here 2026-10-24T14:24:40.0780101Z 118 │ type ColorValue, 2026-10-24T14:24:40.0780153Z ╰──── 2026-10-24T14:24:40.0780249Z  help: Consider removing this import. 2026-10-24T14:24:40.0780252Z 2026-10-24T14:24:40.0780470Z ⚠ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used. 2026-10-24T14:24:40.0780604Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:140:10] 2026-10-24T14:24:40.0780746Z 139 │ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic"; 2026-10-24T14:24:40.0780877Z 140 │ import { tryOpenExternalUrl } from "../../lib/openExternalUrl"; 2026-10-24T14:24:40.0780968Z ·  ─────────┬──────── 2026-10-24T14:24:40.0781122Z · ╰── 'tryOpenExternalUrl' is imported here 2026-10-24T14:24:40.0781271Z 141 │ import { downloadAndShareAttachment } from "../../lib/attachmentDownload"; 2026-10-24T14:24:40.0781323Z ╰──── 2026-10-24T14:24:40.0781420Z  help: Consider removing this import. 2026-10-24T14:24:40.0781422Z 2026-10-24T14:24:40.0781642Z ⚠ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used. 2026-10-24T14:24:40.0781775Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:143:10] 2026-10-24T14:24:40.0781920Z 142 │ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks"; 2026-10-24T14:24:40.0782048Z 143 │ import { faviconUrlForOrigin } from "@t3tools/shared/favicon"; 2026-10-24T14:24:40.0782139Z ·  ─────────┬───────── 2026-10-24T14:24:40.0782295Z · ╰── 'faviconUrlForOrigin' is imported here 2026-10-24T14:24:40.0782354Z 144 │ import { 2026-10-24T14:24:40.0782405Z ╰──── 2026-10-24T14:24:40.0782500Z  help: Consider removing this import. 2026-10-24T14:24:40.0782502Z 2026-10-24T14:24:40.0782719Z ⚠ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used. 2026-10-24T14:24:40.0782851Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:157:10] 2026-10-24T14:24:40.0782999Z 156 │ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile"; 2026-10-24T14:24:40.0783138Z 157 │ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer"; 2026-10-24T14:24:40.0783230Z ·  ────────┬─────── 2026-10-24T14:24:40.0783381Z · ╰── 'MediaVideoPlayer' is imported here 2026-10-24T14:24:40.0783521Z 158 │ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia"; 2026-10-24T14:24:40.0783573Z ╰──── 2026-10-24T14:24:40.0783667Z  help: Consider removing this import. 2026-10-24T14:24:40.0783670Z 2026-10-24T14:24:40.0783894Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used. 2026-10-24T14:24:40.0784027Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:161:3] 2026-10-24T14:24:40.0784109Z 160 │ attachmentVideoPreviewSource, 2026-10-24T14:24:40.0784179Z 161 │ mediaVideoPreviewUri, 2026-10-24T14:24:40.0784322Z ·  ──────────┬───────── 2026-10-24T14:24:40.0784509Z · ╰── 'mediaVideoPreviewUri' is imported here 2026-10-24T14:24:40.0784582Z 162 │ mediaVideoThumbnailKey, 2026-10-24T14:24:40.0784632Z ╰──── 2026-10-24T14:24:40.0784729Z  help: Consider removing this import. 2026-10-24T14:24:40.0784731Z 2026-10-24T14:24:40.0784959Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used. 2026-10-24T14:24:40.0785090Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:162:3] 2026-10-24T14:24:40.0785159Z 161 │ mediaVideoPreviewUri, 2026-10-24T14:24:40.0785230Z 162 │ mediaVideoThumbnailKey, 2026-10-24T14:24:40.0785318Z ·  ───────────┬────────── 2026-10-24T14:24:40.0785485Z · ╰── 'mediaVideoThumbnailKey' is imported here 2026-10-24T14:24:40.0785568Z 163 │ type MediaVideoPreviewSource, 2026-10-24T14:24:40.0785618Z ╰──── 2026-10-24T14:24:40.0785713Z  help: Consider removing this import. 2026-10-24T14:24:40.0785715Z 2026-10-24T14:24:40.0785931Z ⚠ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used. 2026-10-24T14:24:40.0786061Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:163:8] 2026-10-24T14:24:40.0786132Z 162 │ mediaVideoThumbnailKey, 2026-10-24T14:24:40.0786211Z 163 │ type MediaVideoPreviewSource, 2026-10-24T14:24:40.0786307Z ·  ───────────┬─────────── 2026-10-24T14:24:40.0786473Z · ╰── 'MediaVideoPreviewSource' is imported here 2026-10-24T14:24:40.0786560Z 164 │ } from "../../lib/videoPreviewSource"; 2026-10-24T14:24:40.0786616Z ╰──── 2026-10-24T14:24:40.0786716Z  help: Consider removing this import. 2026-10-24T14:24:40.0786718Z 2026-10-24T14:24:40.0786919Z ⚠ eslint(no-unused-vars): Type 'ReviewDiffTheme' is imported but never used. 2026-10-24T14:24:40.0787050Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:171:15] 2026-10-24T14:24:40.0787226Z 170 │ import { parseReviewCommentMessageSegments } from "../review/reviewCommentSelection"; 2026-10-24T14:24:40.0787365Z 171 │ import type { ReviewDiffTheme } from "../review/shikiReviewHighlighter"; 2026-10-24T14:24:40.0787455Z ·  ───────┬─────── 2026-10-24T14:24:40.0787607Z · ╰── 'ReviewDiffTheme' is imported here 2026-10-24T14:24:40.0787666Z 172 │ import { 2026-10-24T14:24:40.0787717Z ╰──── 2026-10-24T14:24:40.0787867Z  help: Consider removing this import. 2026-10-24T14:24:40.0787908Z 2026-10-24T14:24:40.0788143Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used. 2026-10-24T14:24:40.0788275Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:186:3] 2026-10-24T14:24:40.0788332Z 185 │ import { 2026-10-24T14:24:40.0788428Z 186 │ resolveMarkdownFontSizes, 2026-10-24T14:24:40.0788519Z ·  ────────────┬─────────── 2026-10-24T14:24:40.0788681Z · ╰── 'resolveMarkdownFontSizes' is imported here 2026-10-24T14:24:40.0788768Z 187 │ resolveNativeMarkdownTypography, 2026-10-24T14:24:40.0788817Z ╰──── 2026-10-24T14:24:40.0788913Z  help: Consider removing this import. 2026-10-24T14:24:40.0788915Z 2026-10-24T14:24:40.0789185Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used. 2026-10-24T14:24:40.0789321Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:193:3] 2026-10-24T14:24:40.0789399Z 192 │ normalizeNativeMarkdownUrl, 2026-10-24T14:24:40.0789493Z 193 │ resolveMarkdownInlineCodePresentation, 2026-10-24T14:24:40.0789605Z ·  ──────────────────┬────────────────── 2026-10-24T14:24:40.0789806Z · ╰── 'resolveMarkdownInlineCodePresentation' is imported here 2026-10-24T14:24:40.0789892Z 194 │ resolveMarkdownLinkPresentation, 2026-10-24T14:24:40.0789942Z ╰──── 2026-10-24T14:24:40.0790037Z  help: Consider removing this import. 2026-10-24T14:24:40.0790039Z 2026-10-24T14:24:40.0790280Z ⚠ eslint(no-unused-vars): Identifier 'useMarkdownCodeHighlight' is imported but never used. 2026-10-24T14:24:40.0790418Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:233:10] 2026-10-24T14:24:40.0790520Z 232 │ import { ThreadMcpApp } from "./McpAppWebView"; 2026-10-24T14:24:40.0790665Z 233 │ import { useMarkdownCodeHighlight } from "./markdownCodeHighlightState"; 2026-10-24T14:24:40.0790766Z ·  ────────────┬─────────── 2026-10-24T14:24:40.0790938Z · ╰── 'useMarkdownCodeHighlight' is imported here 2026-10-24T14:24:40.0790996Z 234 │ import { 2026-10-24T14:24:40.0791046Z ╰──── 2026-10-24T14:24:40.0791142Z  help: Consider removing this import. 2026-10-24T14:24:40.0791144Z 2026-10-24T14:24:40.0791360Z ⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used. 2026-10-24T14:24:40.0791497Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:237:3] 2026-10-24T14:24:40.0791564Z 236 │ useAssetUrl, 2026-10-24T14:24:40.0791631Z 237 │ useAssetUrlState, 2026-10-24T14:24:40.0791712Z ·  ────────┬─────── 2026-10-24T14:24:40.0791854Z · ╰── 'useAssetUrlState' is imported here 2026-10-24T14:24:40.0791923Z 238 │ useRefreshAssetUrl, 2026-10-24T14:24:40.0791974Z ╰──── 2026-10-24T14:24:40.0792069Z  help: Consider removing this import. 2026-10-24T14:24:40.0792071Z 2026-10-24T14:24:40.0792275Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:24:40.0792411Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2148:7] 2026-10-24T14:24:40.0792485Z 2147 │ setExpandedFile(null); 2026-10-24T14:24:40.0792709Z 2148 │ }, [props.environmentId, props.threadId, props.contentPresentation.kind]); 2026-10-24T14:24:40.0792971Z ·  ─────────┬───────── ───────┬────── ───────────────┬────────────── 2026-10-24T14:24:40.0793276Z · │ │ ╰── Unnecessary dependency `props.contentPresentation.kind` 2026-10-24T14:24:40.0793484Z · │ ╰── Unnecessary dependency `props.threadId` 2026-10-24T14:24:40.0793651Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-24T14:24:40.0793793Z 2149 │ const horizontalPadding = props.layoutVariant === "split" ? 20 : 16; 2026-10-24T14:24:40.0793844Z ╰──── 2026-10-24T14:24:40.0794158Z  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-24T14:24:40.0794484Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0794486Z 2026-10-24T14:24:40.0794693Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:24:40.0794829Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2616:7] 2026-10-24T14:24:40.0794925Z 2615 │ reportHeaderMaterialVisibility(false); 2026-10-24T14:24:40.0795041Z 2616 │ }, [feedThreadKey, reportHeaderMaterialVisibility]); 2026-10-24T14:24:40.0795122Z ·  ──────┬────── 2026-10-24T14:24:40.0795279Z · ╰── Unnecessary dependency `feedThreadKey` 2026-10-24T14:24:40.0795336Z 2617 │ 2026-10-24T14:24:40.0795387Z ╰──── 2026-10-24T14:24:40.0795688Z  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-24T14:24:40.0796007Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0796010Z 2026-10-24T14:24:40.0796213Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:24:40.0796348Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2632:7] 2026-10-24T14:24:40.0796405Z 2631 │ } 2026-10-24T14:24:40.0796542Z 2632 │ }, [listMountKey, props.contentInsetEndAdjustment, listRef]); 2026-10-24T14:24:40.0796623Z ·  ──────┬───── 2026-10-24T14:24:40.0796772Z · ╰── Unnecessary dependency `listMountKey` 2026-10-24T14:24:40.0796919Z 2633 │ // Opening at a message: its run unfolds, the list stops following the end 2026-10-24T14:24:40.0796971Z ╰──── 2026-10-24T14:24:40.0797270Z  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-24T14:24:40.0797589Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0797591Z 2026-10-24T14:24:40.0797795Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:24:40.0797982Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2828:7] 2026-10-24T14:24:40.0798070Z 2827 │ } 2026-10-24T14:24:40.0798255Z 2828 │ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]); 2026-10-24T14:24:40.0798482Z ·  ───────┬─────── ─────────┬──────── ────────┬─────── 2026-10-24T14:24:40.0798744Z · │ │ ╰── Unnecessary dependency `expandedWorkRows` 2026-10-24T14:24:40.0798956Z · │ ╰── Unnecessary dependency `expandedWorkGroups` 2026-10-24T14:24:40.0799113Z · ╰── Unnecessary dependency `expandedTurnIds` 2026-10-24T14:24:40.0799175Z 2829 │ 2026-10-24T14:24:40.0799229Z ╰──── 2026-10-24T14:24:40.0799527Z  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-24T14:24:40.0799843Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0799846Z 2026-10-24T14:24:40.0800030Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T14:24:40.0800165Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:618:9] 2026-10-24T14:24:40.0800224Z 617 │ }; 2026-10-24T14:24:40.0800341Z 618 │ }, [props.environmentId, attachment.id, httpBaseUrl]), 2026-10-24T14:24:40.0800539Z ·  ─────────┬───────── ──────┬────── ─────┬───── 2026-10-24T14:24:40.0800791Z · │ │ ╰── Unnecessary dependency `httpBaseUrl` 2026-10-24T14:24:40.0800994Z · │ ╰── Unnecessary dependency `attachment.id` 2026-10-24T14:24:40.0801162Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-24T14:24:40.0801216Z 619 │ ); 2026-10-24T14:24:40.0801267Z ╰──── 2026-10-24T14:24:40.0801586Z  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-24T14:24:40.0801958Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0801992Z 2026-10-24T14:24:40.0802180Z ⚠ eslint(no-unused-vars): Type 'Scope' is imported but never used. 2026-10-24T14:24:40.0802317Z ╭─[apps/server/src/provider/ProviderAuthService.ts:15:18] 2026-10-24T14:24:40.0802406Z 14 │ import * as Layer from "effect/Layer"; 2026-10-24T14:24:40.0802501Z 15 │ import type * as Scope from "effect/Scope"; 2026-10-24T14:24:40.0802580Z ·  ──┬── 2026-10-24T14:24:40.0802714Z · ╰── 'Scope' is imported here 2026-10-24T14:24:40.0802801Z 16 │ import * as Stream from "effect/Stream"; 2026-10-24T14:24:40.0802853Z ╰──── 2026-10-24T14:24:40.0802950Z  help: Consider removing this import. 2026-10-24T14:24:40.0802960Z 2026-10-24T14:24:40.0803408Z ⚠ 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-24T14:24:40.0803558Z ╭─[apps/server/src/provider/acp/AntigravityProtocol.ts:263:20] 2026-10-24T14:24:40.0803639Z 262 │ ...(update._meta !== undefined 2026-10-24T14:24:40.0803810Z 263 │ ? { _meta: Schema.is(Schema.Record(Schema.String, Schema.Json))(meta) ? meta : null } 2026-10-24T14:24:40.0803897Z ·  ───────── 2026-10-24T14:24:40.0803960Z 264 │ : {}), 2026-10-24T14:24:40.0804012Z ╰──── 2026-10-24T14:24:40.0804014Z 2026-10-24T14:24:40.0804226Z ⚠ eslint(no-unused-vars): Function 'nonEmptyString' is declared but never used. 2026-10-24T14:24:40.0804381Z ╭─[packages/client-runtime/src/work-log/presentation.ts:237:10] 2026-10-24T14:24:40.0804436Z 236 │ 2026-10-24T14:24:40.0804553Z 237 │ function nonEmptyString(value: unknown): string | null { 2026-10-24T14:24:40.0804639Z ·  ───────┬────── 2026-10-24T14:24:40.0804783Z · ╰── 'nonEmptyString' is declared here 2026-10-24T14:24:40.0804929Z 238 │ return typeof value === "string" && value.trim().length > 0 ? value : null; 2026-10-24T14:24:40.0804980Z ╰──── 2026-10-24T14:24:40.0805087Z  help: Consider removing this declaration. 2026-10-24T14:24:40.0805090Z 2026-10-24T14:24:40.0805357Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:24:40.0805515Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:361:7] 2026-10-24T14:24:40.0805655Z 355 │ }, [cancelledIncomingShareId, navigation, props.incomingShareId]); 2026-10-24T14:24:40.0805722Z 356 │ useEffect(() => { 2026-10-24T14:24:40.0805795Z ·  ────┬──── 2026-10-24T14:24:40.0805923Z · ╰── This is the containing effect 2026-10-24T14:24:40.0806014Z 357 │ if (!isReturningToProjectPicker) { 2026-10-24T14:24:40.0806076Z 358 │ return; 2026-10-24T14:24:40.0806131Z 359 │ } 2026-10-24T14:24:40.0806227Z 360 │ if (requestedInitialProjectAvailable) { 2026-10-24T14:24:40.0806320Z 361 │ setIsReturningToProjectPicker(false); 2026-10-24T14:24:40.0806424Z ·  ──────────────┬────────────── 2026-10-24T14:24:40.0806663Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:40.0806761Z 362 │ return; 2026-10-24T14:24:40.0806812Z ╰──── 2026-10-24T14:24:40.0807436Z  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-24T14:24:40.0807768Z  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-24T14:24:40.0807770Z 2026-10-24T14:24:40.0808034Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:24:40.0808190Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:504:9] 2026-10-24T14:24:40.0808246Z 447 │ 2026-10-24T14:24:40.0808311Z 448 │ useEffect(() => { 2026-10-24T14:24:40.0808416Z ·  ────┬──── 2026-10-24T14:24:40.0808547Z · ╰── This is the containing effect 2026-10-24T14:24:40.0808650Z 449 │ if (props.pendingTaskId || props.draftId) { 2026-10-24T14:24:40.0808710Z 450 │ return; 2026-10-24T14:24:40.0808763Z 451 │ } 2026-10-24T14:24:40.0808906Z 452 │ if (lastInitialProjectRefRef.current !== props.initialProjectRef) { 2026-10-24T14:24:40.0809039Z 453 │ lastInitialProjectRefRef.current = props.initialProjectRef; 2026-10-24T14:24:40.0809147Z 454 │ appliedInitialProjectKeyRef.current = null; 2026-10-24T14:24:40.0809200Z 455 │ } 2026-10-24T14:24:40.0809342Z 456 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-24T14:24:40.0809476Z 457 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-24T14:24:40.0809586Z 458 │ if (initialEnvironmentId && initialProjectId) { 2026-10-24T14:24:40.0809658Z 459 │ const directProject = 2026-10-24T14:24:40.0809726Z 460 │ projects.find( 2026-10-24T14:24:40.0809791Z 461 │ (project) => 2026-10-24T14:24:40.0809970Z 462 │ project.environmentId === initialEnvironmentId && project.id === initialProjectId, 2026-10-24T14:24:40.0810031Z 463 │ ) ?? null; 2026-10-24T14:24:40.0810083Z 464 │ 2026-10-24T14:24:40.0810153Z 465 │ if (directProject) { 2026-10-24T14:24:40.0810292Z 466 │ // Apply the route's project once. Re-applying on every change would 2026-10-24T14:24:40.0810431Z 467 │ // instantly revert environment/project switches made in the picker. 2026-10-24T14:24:40.0810600Z 468 │ const directProjectKey = `${directProject.environmentId}:${directProject.id}`; 2026-10-24T14:24:40.0810739Z 469 │ if (appliedInitialProjectKeyRef.current === directProjectKey) { 2026-10-24T14:24:40.0810801Z 470 │ return; 2026-10-24T14:24:40.0810858Z 471 │ } 2026-10-24T14:24:40.0810956Z 472 │ if (props.initialProjectRef?.branch) { 2026-10-24T14:24:40.0811016Z 473 │ if ( 2026-10-24T14:24:40.0811161Z 474 │ selectedProject?.environmentId !== directProject.environmentId || 2026-10-24T14:24:40.0811261Z 475 │ selectedProject.id !== directProject.id 2026-10-24T14:24:40.0811319Z 476 │ ) { 2026-10-24T14:24:40.0811403Z 477 │ setProject(directProject); 2026-10-24T14:24:40.0811466Z 478 │ return; 2026-10-24T14:24:40.0811524Z 479 │ } 2026-10-24T14:24:40.0811607Z 480 │ if (!flow.draftKey) return; 2026-10-24T14:24:40.0811802Z 481 │ // The route completes checkout before mounting this composer. Local 2026-10-24T14:24:40.0811980Z 482 │ // mode reuses an existing worktree; worktree mode would create another. 2026-10-24T14:24:40.0812089Z 483 │ updateComposerDraftSettings(flow.draftKey, { 2026-10-24T14:24:40.0812168Z 484 │ workspaceSelection: { 2026-10-24T14:24:40.0812239Z 485 │ mode: "local", 2026-10-24T14:24:40.0812344Z 486 │ branch: props.initialProjectRef.branch, 2026-10-24T14:24:40.0812479Z 487 │ worktreePath: props.initialProjectRef.worktreePath ?? null, 2026-10-24T14:24:40.0812560Z 488 │ startFromOrigin: false, 2026-10-24T14:24:40.0812620Z 489 │ }, 2026-10-24T14:24:40.0812679Z 490 │ }); 2026-10-24T14:24:40.0812735Z 491 │ } 2026-10-24T14:24:40.0812869Z 492 │ appliedInitialProjectKeyRef.current = directProjectKey; 2026-10-24T14:24:40.0812931Z 493 │ if ( 2026-10-24T14:24:40.0813073Z 494 │ selectedProject?.environmentId === directProject.environmentId && 2026-10-24T14:24:40.0813171Z 495 │ selectedProject.id === directProject.id 2026-10-24T14:24:40.0813229Z 496 │ ) { 2026-10-24T14:24:40.0813291Z 497 │ return; 2026-10-24T14:24:40.0813347Z 498 │ } 2026-10-24T14:24:40.0813428Z 499 │ setProject(directProject); 2026-10-24T14:24:40.0813489Z 500 │ return; 2026-10-24T14:24:40.0813544Z 501 │ } 2026-10-24T14:24:40.0813595Z 502 │ 2026-10-24T14:24:40.0813673Z 503 │ if (projects.length > 0) { 2026-10-24T14:24:40.0813770Z 504 │ setIsReturningToProjectPicker(true); 2026-10-24T14:24:40.0813879Z ·  ──────────────┬────────────── 2026-10-24T14:24:40.0814072Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:40.0814132Z 505 │ } 2026-10-24T14:24:40.0814183Z ╰──── 2026-10-24T14:24:40.0814807Z  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-24T14:24:40.0815135Z  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-24T14:24:40.0815140Z 2026-10-24T14:24:40.0815407Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:24:40.0815564Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:604:5] 2026-10-24T14:24:40.0815617Z 545 │ 2026-10-24T14:24:40.0815683Z 546 │ useEffect(() => { 2026-10-24T14:24:40.0815756Z ·  ────┬──── 2026-10-24T14:24:40.0815886Z · ╰── This is the containing effect 2026-10-24T14:24:40.0815981Z 547 │ const shareId = props.incomingShareId; 2026-10-24T14:24:40.0816062Z 548 │ const draftKey = flow.draftKey; 2026-10-24T14:24:40.0816165Z 549 │ const destinationProject = selectedProject; 2026-10-24T14:24:40.0816305Z 550 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-24T14:24:40.0816508Z 551 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-24T14:24:40.0816597Z 552 │ const selectedProjectMatchesRoute = 2026-10-24T14:24:40.0816739Z 553 │ !initialEnvironmentId || 2026-10-24T14:24:40.0816936Z 554 │ !initialProjectId || 2026-10-24T14:24:40.0817068Z 555 │ (destinationProject?.environmentId === initialEnvironmentId && 2026-10-24T14:24:40.0817174Z 556 │ destinationProject.id === initialProjectId); 2026-10-24T14:24:40.0817230Z 557 │ if ( 2026-10-24T14:24:40.0817293Z 558 │ !shareId || 2026-10-24T14:24:40.0817356Z 559 │ !draftKey || 2026-10-24T14:24:40.0817428Z 560 │ !destinationProject || 2026-10-24T14:24:40.0817516Z 561 │ !selectedProjectMatchesRoute || 2026-10-24T14:24:40.0817607Z 562 │ cancelledIncomingShareId === shareId 2026-10-24T14:24:40.0817662Z 563 │ ) { 2026-10-24T14:24:40.0817721Z 564 │ return; 2026-10-24T14:24:40.0817775Z 565 │ } 2026-10-24T14:24:40.0817870Z 566 │ const importKey = `${shareId}:${draftKey}`; 2026-10-24T14:24:40.0817933Z 567 │ if ( 2026-10-24T14:24:40.0818047Z 568 │ startedShareImportKeyRef.current === importKey || 2026-10-24T14:24:40.0818159Z 569 │ cancellingShareImportKeyRef.current === importKey 2026-10-24T14:24:40.0818215Z 570 │ ) { 2026-10-24T14:24:40.0818276Z 571 │ return; 2026-10-24T14:24:40.0818328Z 572 │ } 2026-10-24T14:24:40.0818412Z 573 │ 2026-10-24T14:24:40.0818480Z 574 │ if (!incomingShare) { 2026-10-24T14:24:40.0818678Z 575 │ if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) { 2026-10-24T14:24:40.0818806Z 576 │ alertedUnavailableIncomingShareIdRef.current = shareId; 2026-10-24T14:24:40.0818872Z 577 │ Dialog.alert( 2026-10-24T14:24:40.0818956Z 578 │ "Shared content unavailable", 2026-10-24T14:24:40.0819141Z 579 │ "The shared content is no longer in the inbox. You can continue editing this task draft.", 2026-10-24T14:24:40.0819202Z 580 │ ); 2026-10-24T14:24:40.0819257Z 581 │ } 2026-10-24T14:24:40.0819315Z 582 │ return; 2026-10-24T14:24:40.0819367Z 583 │ } 2026-10-24T14:24:40.0819419Z 584 │ 2026-10-24T14:24:40.0819475Z 585 │ if ( 2026-10-24T14:24:40.0819638Z 586 │ incomingShare.attachments.some((attachment) => attachment.type === "file") && 2026-10-24T14:24:40.0819738Z 587 │ selectedEnvironmentServerConfig === null 2026-10-24T14:24:40.0819793Z 588 │ ) { 2026-10-24T14:24:40.0819851Z 589 │ return; 2026-10-24T14:24:40.0819905Z 590 │ } 2026-10-24T14:24:40.0819956Z 591 │ 2026-10-24T14:24:40.0820093Z 592 │ if (alertedUnavailableIncomingShareIdRef.current === shareId) { 2026-10-24T14:24:40.0820215Z 593 │ alertedUnavailableIncomingShareIdRef.current = null; 2026-10-24T14:24:40.0820274Z 594 │ } 2026-10-24T14:24:40.0820384Z 595 │ startedShareImportKeyRef.current = importKey; 2026-10-24T14:24:40.0820452Z 596 │ const draftBackup = 2026-10-24T14:24:40.0820640Z 597 │ shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey); 2026-10-24T14:24:40.0820777Z 598 │ shareImportDraftBackupRef.current.set(importKey, draftBackup); 2026-10-24T14:24:40.0820866Z 599 │ const importToken = Symbol(importKey); 2026-10-24T14:24:40.0820944Z 600 │ let didReserveShare = false; 2026-10-24T14:24:40.0821021Z 601 │ let didConsumeShare = false; 2026-10-24T14:24:40.0821101Z 602 │ let needsDraftRestore = false; 2026-10-24T14:24:40.0821211Z 603 │ activeShareImportTokenRef.current = importToken; 2026-10-24T14:24:40.0821295Z 604 │ setImportingShareKey(importKey); 2026-10-24T14:24:40.0821383Z ·  ──────────┬───────── 2026-10-24T14:24:40.0821622Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:24:40.0821727Z 605 │ void (async () => { 2026-10-24T14:24:40.0821779Z ╰──── 2026-10-24T14:24:40.0822395Z  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-24T14:24:40.0822726Z  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-24T14:24:40.0822728Z 2026-10-24T14:24:40.0822940Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:24:40.0823094Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:524:5] 2026-10-24T14:24:40.0823170Z 523 │ props.initialProjectRef, 2026-10-24T14:24:40.0823242Z 524 │ props.incomingShareId, 2026-10-24T14:24:40.0823331Z ·  ──────────┬────────── 2026-10-24T14:24:40.0823500Z · ╰── Unnecessary dependency `props.incomingShareId` 2026-10-24T14:24:40.0823573Z 525 │ props.pendingTaskId, 2026-10-24T14:24:40.0823624Z ╰──── 2026-10-24T14:24:40.0823925Z  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-24T14:24:40.0824249Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0824256Z 2026-10-24T14:24:40.0824474Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T14:24:40.0824628Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:543:5] 2026-10-24T14:24:40.0824745Z 542 │ loadedBranchesProjectKeyRef.current = projectKey; 2026-10-24T14:24:40.0824812Z 543 │ flow.loadBranches(); 2026-10-24T14:24:40.0824882Z ·  ──┬─ 2026-10-24T14:24:40.0825007Z · ╰── Missing dependency `flow` 2026-10-24T14:24:40.0825101Z 544 │ }, [flow.loadBranches, selectedProject]); 2026-10-24T14:24:40.0825186Z ·  ────────┬──────── 2026-10-24T14:24:40.0825390Z · ╰── Overly precise dependency `flow.loadBranches`, use `flow` instead 2026-10-24T14:24:40.0825450Z 545 │ 2026-10-24T14:24:40.0825505Z ╰──── 2026-10-24T14:24:40.0825936Z  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-24T14:24:40.0826255Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0826258Z 2026-10-24T14:24:40.0826463Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:24:40.0826616Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:766:5] 2026-10-24T14:24:40.0826681Z 765 │ flow.draftKey, 2026-10-24T14:24:40.0826815Z 766 │ hasImportedIncomingShare, 2026-10-24T14:24:40.0826950Z ·  ────────────┬─────────── 2026-10-24T14:24:40.0827129Z · ╰── Unnecessary dependency `hasImportedIncomingShare` 2026-10-24T14:24:40.0827194Z 767 │ incomingShare, 2026-10-24T14:24:40.0827273Z 768 │ isIncomingShareInboxLoading, 2026-10-24T14:24:40.0827369Z ·  ─────────────┬───────────── 2026-10-24T14:24:40.0827555Z · ╰── Unnecessary dependency `isIncomingShareInboxLoading` 2026-10-24T14:24:40.0827635Z 769 │ isIncomingShareUnavailable, 2026-10-24T14:24:40.0827707Z 770 │ props.incomingShareId, 2026-10-24T14:24:40.0827802Z 771 │ props.initialProjectRef?.environmentId, 2026-10-24T14:24:40.0827890Z 772 │ props.initialProjectRef?.projectId, 2026-10-24T14:24:40.0827964Z 773 │ releaseShareReservation, 2026-10-24T14:24:40.0828034Z 774 │ reserveShare, 2026-10-24T14:24:40.0828124Z 775 │ selectedEnvironmentServerConfig, 2026-10-24T14:24:40.0828191Z 776 │ selectedProject, 2026-10-24T14:24:40.0828260Z 777 │ shareImportAttempt, 2026-10-24T14:24:40.0828367Z ·  ─────────┬──────── 2026-10-24T14:24:40.0828536Z · ╰── Unnecessary dependency `shareImportAttempt` 2026-10-24T14:24:40.0828591Z 778 │ ]); 2026-10-24T14:24:40.0828641Z ╰──── 2026-10-24T14:24:40.0828942Z  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-24T14:24:40.0829261Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:24:40.0829269Z 2026-10-24T14:24:40.0829759Z ⚠ 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-24T14:24:40.0829918Z ╭─[apps/server/src/project/ProjectEnrichmentService.test.ts:28:3] 2026-10-24T14:24:40.0829973Z 27 │ ) { 2026-10-24T14:24:40.0830180Z 28 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T14:24:40.0830325Z 29 │ │ const available = yield* service.peek(workspaceRoot); 2026-10-24T14:24:40.0830452Z 30 │ │ if (predicate(available)) return available; 2026-10-24T14:24:40.0830555Z 31 │ │ yield* Effect.yieldNow; 2026-10-24T14:24:40.0830733Z 32 │ ╰─▶ } 2026-10-24T14:24:40.0830948Z 33 │ return yield* Effect.die(`Project metadata for ${workspaceRoot} was not resolved in time.`); 2026-10-24T14:24:40.0830999Z ╰──── 2026-10-24T14:24:40.0831002Z 2026-10-24T14:24:40.0831298Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T14:24:40.0831453Z ╭─[apps/web/src/components/settings/SettingInheritance.tsx:163:24] 2026-10-24T14:24:40.0831511Z 162 │ keys, 2026-10-24T14:24:40.0831583Z 163 │ overridingProjects = [], 2026-10-24T14:24:40.0831666Z ·  ── 2026-10-24T14:24:40.0831732Z 164 │ onClearOverrides, 2026-10-24T14:24:40.0831784Z ╰──── 2026-10-24T14:24:40.0832122Z  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-24T14:24:40.0832127Z 2026-10-24T14:24:40.0832298Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T14:24:40.0832418Z ╭─[apps/server/src/processRunner.test.ts:266:14] 2026-10-24T14:24:40.0832470Z 265 │ 2026-10-24T14:24:40.0832577Z 266 │ for (const {} of ["timeout", "success"] as const) { 2026-10-24T14:24:40.0832650Z ·  ── 2026-10-24T14:24:40.0832703Z 267 │ } 2026-10-24T14:24:40.0832755Z ╰──── 2026-10-24T14:24:40.0832992Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T14:24:40.0832995Z 2026-10-24T14:24:40.0833487Z ⚠ 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-24T14:24:40.0833647Z ╭─[packages/client-runtime/src/connection/supervisor.test.ts:135:3] 2026-10-24T14:24:40.0833758Z 134 │ let lastState = yield* SubscriptionRef.get(state); 2026-10-24T14:24:40.0833975Z 135 │ ╭─▶ for (let iteration = 0; iteration < 100; iteration += 1) { 2026-10-24T14:24:40.0834111Z 136 │ │ lastState = yield* SubscriptionRef.get(state); 2026-10-24T14:24:40.0834218Z 137 │ │ if (predicate(lastState)) { 2026-10-24T14:24:40.0834315Z 138 │ │ return lastState; 2026-10-24T14:24:40.0834389Z 139 │ │ } 2026-10-24T14:24:40.0834495Z 140 │ │ yield* Effect.yieldNow; 2026-10-24T14:24:40.0834623Z 141 │ ╰─▶ } 2026-10-24T14:24:40.0834696Z 142 │ return yield* Effect.die( 2026-10-24T14:24:40.0834748Z ╰──── 2026-10-24T14:24:40.0834751Z 2026-10-24T14:24:40.0834910Z ⚠ eslint(no-new): Do not use 'new' for side effects. 2026-10-24T14:24:40.0835036Z ╭─[apps/server/src/mcp/McpToolAccess.test.ts:168:3] 2026-10-24T14:24:40.0835146Z 167 │ // @ts-expect-error a declaration constructed directly 2026-10-24T14:24:40.0835242Z 168 │ new McpToolAccess.Declaration(unchecked); 2026-10-24T14:24:40.0835341Z ·  ───────────────────────────── 2026-10-24T14:24:40.0835470Z 169 │ // @ts-expect-error a handlers layer built outside McpToolAccess 2026-10-24T14:24:40.0835574Z ╰──── 2026-10-24T14:24:40.0835766Z  help: Assign the result of 'new' to a variable or compare it to a reference. 2026-10-24T14:24:40.0835769Z 2026-10-24T14:24:40.0836153Z ⚠ 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-24T14:24:40.0836282Z ╭─[apps/server/src/assets/AssetAccess.test.ts:975:35] 2026-10-24T14:24:40.0836431Z 974 │ // Every client and server release spells the resource this way on the wire. 2026-10-24T14:24:40.0836586Z 975 │ const { resource } = yield* Schema.decodeUnknownEffect(AssetCreateUrlInput)({ 2026-10-24T14:24:40.0836711Z ·  ────────────────────────── 2026-10-24T14:24:40.0836826Z 976 │ resource: { _tag: "github-media", cwd: "/repo", url }, 2026-10-24T14:24:40.0836882Z ╰──── 2026-10-24T14:24:40.0836888Z 2026-10-24T14:24:40.0837348Z ⚠ 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-24T14:24:40.0837480Z ╭─[apps/server/src/assets/AssetAccess.test.ts:1012:32] 2026-10-24T14:24:40.0837618Z 1011 │ expect(error._tag).toBe("AssetGitHubMediaUrlValidationError"); 2026-10-24T14:24:40.0837810Z 1012 │ const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(AssetAccessError))(error); 2026-10-24T14:24:40.0837924Z ·  ─────────────────── 2026-10-24T14:24:40.0838018Z 1013 │ expect(encoded).not.toContain(url); 2026-10-24T14:24:40.0838071Z ╰──── 2026-10-24T14:24:40.0838073Z 2026-10-24T14:24:40.0838270Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T14:24:40.0838432Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:121:27] 2026-10-24T14:24:40.0838598Z 120 │ const scope = makeScope(options.capabilities ?? new Set(["preview", "worktree"])); 2026-10-24T14:24:40.0838687Z 121 │ const dispatch = vi.fn((_: unknown) => 2026-10-24T14:24:40.0838772Z ·  ┬ 2026-10-24T14:24:40.0838905Z · ╰── '_' is declared here 2026-10-24T14:24:40.0839008Z 122 │ (options.dispatchGate ?? Effect.void).pipe( 2026-10-24T14:24:40.0839062Z ╰──── 2026-10-24T14:24:40.0839165Z  help: Consider removing this parameter. 2026-10-24T14:24:40.0839168Z 2026-10-24T14:24:40.0839361Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T14:24:40.0839501Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:134:39] 2026-10-24T14:24:40.0839556Z 133 │ ); 2026-10-24T14:24:40.0839663Z 134 │ const listLocalBranchNames = vi.fn((_: string) => 2026-10-24T14:24:40.0839760Z ·  ┬ 2026-10-24T14:24:40.0839904Z · ╰── '_' is declared here 2026-10-24T14:24:40.0839972Z 135 │ Effect.succeed( 2026-10-24T14:24:40.0840023Z ╰──── 2026-10-24T14:24:40.0840123Z  help: Consider removing this parameter. 2026-10-24T14:24:40.0840127Z 2026-10-24T14:24:40.0840312Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T14:24:40.0840501Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:178:31] 2026-10-24T14:24:40.0840588Z 177 │ }); 2026-10-24T14:24:40.0840689Z 178 │ const sendToThread = vi.fn((_: unknown) => { 2026-10-24T14:24:40.0840775Z ·  ┬ 2026-10-24T14:24:40.0840912Z · ╰── '_' is declared here 2026-10-24T14:24:40.0841011Z 179 │ switch (options.continuation ?? "queued") { 2026-10-24T14:24:40.0841062Z ╰──── 2026-10-24T14:24:40.0841161Z  help: Consider removing this parameter. 2026-10-24T14:24:40.0841164Z 2026-10-24T14:24:40.0841349Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T14:24:40.0841484Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:203:33] 2026-10-24T14:24:40.0841538Z 202 │ ); 2026-10-24T14:24:40.0841642Z 203 │ const removeWorktree = vi.fn((_: unknown) => 2026-10-24T14:24:40.0841737Z ·  ┬ 2026-10-24T14:24:40.0841876Z · ╰── '_' is declared here 2026-10-24T14:24:40.0841956Z 204 │ options.removeWorktreeFails 2026-10-24T14:24:40.0842006Z ╰──── 2026-10-24T14:24:40.0842107Z  help: Consider removing this parameter. 2026-10-24T14:24:40.0842110Z 2026-10-24T14:24:40.0842293Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T14:24:40.0842426Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:208:36] 2026-10-24T14:24:40.0842479Z 207 │ ); 2026-10-24T14:24:40.0842581Z 208 │ const deleteLocalBranch = vi.fn((_: unknown) => 2026-10-24T14:24:40.0842675Z ·  ┬ 2026-10-24T14:24:40.0842823Z · ╰── '_' is declared here 2026-10-24T14:24:40.0842911Z 209 │ options.deleteLocalBranchFails 2026-10-24T14:24:40.0842963Z ╰──── 2026-10-24T14:24:40.0843061Z  help: Consider removing this parameter. 2026-10-24T14:24:40.0843064Z 2026-10-24T14:24:40.0843247Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T14:24:40.0843380Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:213:42] 2026-10-24T14:24:40.0843434Z 212 │ ); 2026-10-24T14:24:40.0843547Z 213 │ const fetchWorktreeBaseCommit = vi.fn((_: unknown) => 2026-10-24T14:24:40.0843645Z ·  ┬ 2026-10-24T14:24:40.0843797Z · ╰── '_' is declared here 2026-10-24T14:24:40.0843885Z 214 │ options.fetchWorktreeBaseFails 2026-10-24T14:24:40.0843936Z ╰──── 2026-10-24T14:24:40.0844035Z  help: Consider removing this parameter. 2026-10-24T14:24:40.0844038Z 2026-10-24T14:24:40.0844221Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T14:24:40.0844355Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:254:30] 2026-10-24T14:24:40.0844409Z 253 │ ); 2026-10-24T14:24:40.0844501Z 254 │ const localStatus = vi.fn((_: unknown) => 2026-10-24T14:24:40.0844587Z ·  ┬ 2026-10-24T14:24:40.0844723Z · ╰── '_' is declared here 2026-10-24T14:24:40.0844791Z 255 │ Effect.succeed({ 2026-10-24T14:24:40.0844842Z ╰──── 2026-10-24T14:24:40.0845002Z  help: Consider removing this parameter. 2026-10-24T14:24:40.0845036Z 2026-10-24T14:24:40.0845219Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T14:24:40.0845352Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:264:32] 2026-10-24T14:24:40.0845406Z 263 │ ); 2026-10-24T14:24:40.0845557Z 264 │ const refreshStatus = vi.fn((_: string) => Effect.die("refreshStatus stub")); 2026-10-24T14:24:40.0845647Z ·  ┬ 2026-10-24T14:24:40.0845786Z · ╰── '_' is declared here 2026-10-24T14:24:40.0845935Z 265 │ const runForThread = vi.fn((input: { readonly worktreePath: string }) => { 2026-10-24T14:24:40.0845985Z ╰──── 2026-10-24T14:24:40.0846085Z  help: Consider removing this parameter. 2026-10-24T14:24:40.0846092Z 2026-10-24T14:24:40.0846582Z ⚠ 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-24T14:24:40.0846729Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:169:7] 2026-10-24T14:24:40.0846791Z 168 │ }); 2026-10-24T14:24:40.0846991Z 169 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T14:24:40.0847190Z 170 │ │ if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break; 2026-10-24T14:24:40.0847297Z 171 │ │ yield* Effect.yieldNow; 2026-10-24T14:24:40.0847435Z 172 │ ╰─▶ } 2026-10-24T14:24:40.0847491Z 173 │ 2026-10-24T14:24:40.0847543Z ╰──── 2026-10-24T14:24:40.0847545Z 2026-10-24T14:24:40.0848024Z ⚠ 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-24T14:24:40.0848171Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:178:7] 2026-10-24T14:24:40.0848282Z 177 │ yield* Deferred.succeed(releaseSave, undefined); 2026-10-24T14:24:40.0848513Z 178 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T14:24:40.0848650Z 179 │ │ if ((yield* Ref.get(saved)).length > 0) break; 2026-10-24T14:24:40.0848759Z 180 │ │ yield* Effect.yieldNow; 2026-10-24T14:24:40.0848894Z 181 │ ╰─▶ } 2026-10-24T14:24:40.0848947Z 182 │ 2026-10-24T14:24:40.0848999Z ╰──── 2026-10-24T14:24:40.0849001Z 2026-10-24T14:24:40.0849477Z ⚠ 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-24T14:24:40.0849623Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7] 2026-10-24T14:24:40.0849750Z 306 │ yield* Deferred.succeed(releaseUnenrichedSave, undefined); 2026-10-24T14:24:40.0849947Z 307 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T14:24:40.0850123Z 308 │ │ const values = yield* Ref.get(saved); 2026-10-24T14:24:40.0850354Z 309 │ │ if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) { 2026-10-24T14:24:40.0850441Z 310 │ │ break; 2026-10-24T14:24:40.0850520Z 311 │ │ } 2026-10-24T14:24:40.0850626Z 312 │ │ yield* Effect.yieldNow; 2026-10-24T14:24:40.0850756Z 313 │ ╰─▶ } 2026-10-24T14:24:40.0850809Z 314 │ 2026-10-24T14:24:40.0850861Z ╰──── 2026-10-24T14:24:40.0850864Z 2026-10-24T14:24:40.0851070Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T14:24:40.0851209Z ╭─[packages/client-runtime/src/state/usageAccess.ts:3:8] 2026-10-24T14:24:40.0851285Z 2 │ AuthDiagnosticsReadScope, 2026-10-24T14:24:40.0851354Z 3 │ type AuthSessionState, 2026-10-24T14:24:40.0851439Z ·  ────────┬─────── 2026-10-24T14:24:40.0851588Z · ╰── 'AuthSessionState' is imported here 2026-10-24T14:24:40.0851655Z 4 │ sessionGrantsScope, 2026-10-24T14:24:40.0851707Z ╰──── 2026-10-24T14:24:40.0851805Z  help: Consider removing this import. 2026-10-24T14:24:40.0851807Z 2026-10-24T14:24:40.0852014Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T14:24:40.0852182Z ╭─[apps/web/src/components/settings/ProviderSettingsPanel.logic.ts:4:8] 2026-10-24T14:24:40.0852255Z 3 │ AuthProvidersManageScope, 2026-10-24T14:24:40.0852324Z 4 │ type AuthSessionState, 2026-10-24T14:24:40.0852413Z ·  ────────┬─────── 2026-10-24T14:24:40.0852561Z · ╰── 'AuthSessionState' is imported here 2026-10-24T14:24:40.0852628Z 5 │ type EnvironmentId, 2026-10-24T14:24:40.0852679Z ╰──── 2026-10-24T14:24:40.0852776Z  help: Consider removing this import. 2026-10-24T14:24:40.0852778Z 2026-10-24T14:24:40.0853254Z ⚠ 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-24T14:24:40.0853410Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1680:7] 2026-10-24T14:24:40.0853504Z 1679 │ yield* harness.replaceSession; 2026-10-24T14:24:40.0853724Z 1680 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T14:24:40.0853882Z 1681 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) { 2026-10-24T14:24:40.0853968Z 1682 │ │ break; 2026-10-24T14:24:40.0854048Z 1683 │ │ } 2026-10-24T14:24:40.0854156Z 1684 │ │ yield* Effect.yieldNow; 2026-10-24T14:24:40.0854292Z 1685 │ ╰─▶ } 2026-10-24T14:24:40.0854366Z 1686 │ yield* Queue.offer( 2026-10-24T14:24:40.0854419Z ╰──── 2026-10-24T14:24:40.0854421Z 2026-10-24T14:24:40.0854950Z ⚠ 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-24T14:24:40.0855142Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1789:7] 2026-10-24T14:24:40.0855232Z 1788 │ yield* harness.replaceSession; 2026-10-24T14:24:40.0855440Z 1789 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T14:24:40.0855603Z 1790 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break; 2026-10-24T14:24:40.0855709Z 1791 │ │ yield* Effect.yieldNow; 2026-10-24T14:24:40.0855840Z 1792 │ ╰─▶ } 2026-10-24T14:24:40.0855970Z 1793 │ expect(yield* Ref.get(harness.subscriptionCount)).toBe(2); 2026-10-24T14:24:40.0856022Z ╰──── 2026-10-24T14:24:40.0856025Z 2026-10-24T14:24:40.0856223Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-24T14:24:40.0856404Z ╭─[packages/client-runtime/src/state/shell.ts:189:5] 2026-10-24T14:24:40.0856513Z 186 │ let waiting = yield* Ref.get(awaitingCompletion); 2026-10-24T14:24:40.0856581Z 187 │ let next = initial; 2026-10-24T14:24:40.0856654Z ·  ──┬─ 2026-10-24T14:24:40.0856775Z · ╰── From this accumulator 2026-10-24T14:24:40.0856854Z 188 │ let receivedSnapshot = false; 2026-10-24T14:24:40.0856929Z 189 │ for (const item of items) { 2026-10-24T14:24:40.0856998Z ·  ─┬─ 2026-10-24T14:24:40.0857103Z · ╰── For this loop 2026-10-24T14:24:40.0857191Z 190 │ if (item.kind === "synchronized") { 2026-10-24T14:24:40.0857265Z 191 │ waiting = false; 2026-10-24T14:24:40.0857358Z 192 │ if (Option.isSome(next.snapshot)) { 2026-10-24T14:24:40.0857476Z 193 │ next = { ...next, status: "live", error: Option.none() }; 2026-10-24T14:24:40.0857562Z ·  ───┬─── 2026-10-24T14:24:40.0857692Z · ╰── From this spread 2026-10-24T14:24:40.0857752Z 194 │ } 2026-10-24T14:24:40.0857804Z ╰──── 2026-10-24T14:24:40.0857962Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-24T14:24:40.0858125Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T14:24:40.0858128Z 2026-10-24T14:24:40.0858300Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T14:24:40.0858547Z ╭─[apps/web/src/components/CommandPaletteThreadItems.tsx:152:58] 2026-10-24T14:24:40.0858776Z 151 │ if (threadSearchQuery.trim().length > 0 && !threadSearchQuery.startsWith(">") && !isOpen) { 2026-10-24T14:24:40.0858910Z 152 │ claimThreadOpen(thread.environmentId, thread.id, Date.now()); 2026-10-24T14:24:40.0859035Z ·  ─────┬──── 2026-10-24T14:24:40.0859212Z · ╰── Cannot call impure function 2026-10-24T14:24:40.0859268Z 153 │ } 2026-10-24T14:24:40.0859320Z ╰──── 2026-10-24T14:24:40.0859620Z  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-24T14:24:40.0859937Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T14:24:40.0859942Z 2026-10-24T14:24:40.0860149Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T14:24:40.0860279Z ╭─[packages/client-runtime/src/state/filesystem.ts:3:8] 2026-10-24T14:24:40.0860353Z 2 │ AuthFilesystemReadScope, 2026-10-24T14:24:40.0860423Z 3 │ type AuthSessionState, 2026-10-24T14:24:40.0860506Z ·  ────────┬─────── 2026-10-24T14:24:40.0860650Z · ╰── 'AuthSessionState' is imported here 2026-10-24T14:24:40.0860725Z 4 │ type FilesystemBrowseEntry, 2026-10-24T14:24:40.0860776Z ╰──── 2026-10-24T14:24:40.0860874Z  help: Consider removing this import. 2026-10-24T14:24:40.0860876Z 2026-10-24T14:24:40.0861082Z ⚠ eslint(no-unused-vars): Type 'EnvironmentId' is imported but never used. 2026-10-24T14:24:40.0861222Z ╭─[packages/client-runtime/src/state/sharedSettings.ts:2:3] 2026-10-24T14:24:40.0861286Z 1 │ import type { 2026-10-24T14:24:40.0861351Z 2 │ EnvironmentId, 2026-10-24T14:24:40.0861426Z ·  ──────┬────── 2026-10-24T14:24:40.0861563Z · ╰── 'EnvironmentId' is imported here 2026-10-24T14:24:40.0861649Z 3 │ ExecutionEnvironmentCapabilities, 2026-10-24T14:24:40.0861699Z ╰──── 2026-10-24T14:24:40.0861795Z  help: Consider removing this import. 2026-10-24T14:24:40.0861798Z 2026-10-24T14:24:40.0862063Z ⚠ unicorn(prefer-add-event-listener): Prefer `addEventListener()` over their `on`-function counterparts. 2026-10-24T14:24:40.0862215Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:12:14] 2026-10-24T14:24:40.0862376Z 11 │ addEventListener(_type: string, listener: (event: { data: string }) => void) { 2026-10-24T14:24:40.0862454Z 12 │ this.onmessage = listener; 2026-10-24T14:24:40.0862534Z ·  ───────── 2026-10-24T14:24:40.0862590Z 13 │ } 2026-10-24T14:24:40.0862641Z ╰──── 2026-10-24T14:24:40.0862969Z  help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on` replaces any previously registered handler. 2026-10-24T14:24:40.0862972Z 2026-10-24T14:24:40.0863181Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-24T14:24:40.0863322Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:16:9] 2026-10-24T14:24:40.0863446Z 15 │ constructor() { 2026-10-24T14:24:40.0863548Z 16 │ source = this; 2026-10-24T14:24:40.0863621Z ·  ────── 2026-10-24T14:24:40.0863676Z 17 │ } 2026-10-24T14:24:40.0863728Z ╰──── 2026-10-24T14:24:40.0864008Z  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-24T14:24:40.0864011Z 2026-10-24T14:24:40.0864204Z ⚠ eslint(no-unused-vars): Identifier 'Arr' is imported but never used. 2026-10-24T14:24:40.0864336Z ╭─[packages/client-runtime/src/state/threadSort.ts:4:13] 2026-10-24T14:24:40.0864454Z 3 │ import type { EnvironmentThreadShell } from "./models.ts"; 2026-10-24T14:24:40.0864535Z 4 │ import * as Arr from "effect/Array"; 2026-10-24T14:24:40.0864606Z ·  ─┬─ 2026-10-24T14:24:40.0864738Z · ╰── 'Arr' is imported here 2026-10-24T14:24:40.0864825Z 5 │ import * as Order from "effect/Order"; 2026-10-24T14:24:40.0864876Z ╰──── 2026-10-24T14:24:40.0864975Z  help: Consider removing this import. 2026-10-24T14:24:40.0864977Z 2026-10-24T14:24:40.0865173Z ⚠ eslint(no-unused-vars): Identifier 'Order' is imported but never used. 2026-10-24T14:24:40.0865303Z ╭─[packages/client-runtime/src/state/threadSort.ts:5:13] 2026-10-24T14:24:40.0865383Z 4 │ import * as Arr from "effect/Array"; 2026-10-24T14:24:40.0865464Z 5 │ import * as Order from "effect/Order"; 2026-10-24T14:24:40.0865538Z ·  ──┬── 2026-10-24T14:24:40.0865668Z · ╰── 'Order' is imported here 2026-10-24T14:24:40.0865719Z 6 │ 2026-10-24T14:24:40.0865777Z ╰──── 2026-10-24T14:24:40.0865876Z  help: Consider removing this import. 2026-10-24T14:24:40.0865879Z 2026-10-24T14:24:40.0866117Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-24T14:24:40.0866253Z ╭─[apps/web/src/components/chat/useComposerSend.ts:985:13] 2026-10-24T14:24:40.0866376Z 984 │ const changedBeforeDecline = draftChangedSinceSend(); 2026-10-24T14:24:40.0866622Z 985 │ ╭─▶ const pendingIdsBeforeDecline = pendingApprovalsRef.current.map( 2026-10-24T14:24:40.0866743Z 986 │ │ (approval) => approval.requestId, 2026-10-24T14:24:40.0866877Z 987 │ ╰─▶ ); 2026-10-24T14:24:40.0867021Z 988 │ const approvalResponding = approvalsToDecline.some((approval) => 2026-10-24T14:24:40.0867076Z ╰──── 2026-10-24T14:24:40.0867153Z  help: Switch to `Set` 2026-10-24T14:24:40.0867155Z 2026-10-24T14:24:40.0867343Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T14:24:40.0867448Z ╭─[packages/shared/src/qrCode.ts:458:44] 2026-10-24T14:24:40.0867515Z 457 │ ): Array { 2026-10-24T14:24:40.0867621Z 458 │ let result: Array = divisor.map((_) => 0); 2026-10-24T14:24:40.0867723Z ·  ┬ 2026-10-24T14:24:40.0867870Z · ╰── '_' is declared here 2026-10-24T14:24:40.0867941Z 459 │ for (const b of data) { 2026-10-24T14:24:40.0867992Z ╰──── 2026-10-24T14:24:40.0868158Z  help: Consider removing this parameter. 2026-10-24T14:24:40.0868191Z 2026-10-24T14:24:40.0868455Z ⚠ unicorn(prefer-string-starts-ends-with): Prefer String#startsWith over a regex with a caret. 2026-10-24T14:24:40.0868580Z ╭─[apps/server/src/vcs/GitVcsDriverCore.ts:517:11] 2026-10-24T14:24:40.0868680Z 516 │ GIT_DIAGNOSTIC_LINE_PATTERN.test(line) || 2026-10-24T14:24:40.0868818Z 517 │ (!/^remote:/.test(line) && SSH_TRANSPORT_REFUSAL_PATTERN.test(line)), 2026-10-24T14:24:40.0868904Z ·  ─────────────── 2026-10-24T14:24:40.0868960Z 518 │ ) 2026-10-24T14:24:40.0869011Z ╰──── 2026-10-24T14:24:40.0869167Z  help: Replace `/^remote:/.test(line)` with `line.startsWith('remote:')`. 2026-10-24T14:24:40.0869170Z 2026-10-24T14:24:40.0869543Z ⚠ 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-24T14:24:40.0869682Z ╭─[apps/server/src/vcs/GitVcsDriverCore.test.ts:1786:34] 2026-10-24T14:24:40.0869816Z 1785 │ const stat = branch.files!.find((file) => file.path === path)!; 2026-10-24T14:24:40.0869965Z 1786 │ const request = yield* Schema.decodeEffect(ReviewDiffPreviewInput)({ 2026-10-24T14:24:40.0870080Z ·  ─────────────────── 2026-10-24T14:24:40.0870144Z 1787 │ cwd, 2026-10-24T14:24:40.0870197Z ╰──── 2026-10-24T14:24:40.0870199Z 2026-10-24T14:24:40.0870426Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T14:24:40.0870543Z ╭─[packages/shared/src/serverSettings.ts:346:9] 2026-10-24T14:24:40.0870651Z 345 │ const entry: ProjectSettingsOverrides = { 2026-10-24T14:24:40.0870784Z 346 │ ...(entries.get(projectId) ?? currentEntries[projectId] ?? {}), 2026-10-24T14:24:40.0870938Z ·  ────────────────────────────────────────────────────────────── 2026-10-24T14:24:40.0870995Z 347 │ }; 2026-10-24T14:24:40.0871046Z ╰──── 2026-10-24T14:24:40.0871318Z  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-24T14:24:40.0871321Z 2026-10-24T14:24:40.0871544Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in Array.prototype.reduce() 2026-10-24T14:24:40.0871663Z ╭─[packages/shared/src/serverSettings.ts:448:24] 2026-10-24T14:24:40.0871729Z 447 │ const favorites = 2026-10-24T14:24:40.0871845Z 448 │ setModelFavorites?.reduce((current, change) => { 2026-10-24T14:24:40.0871936Z ·  ───┬── 2026-10-24T14:24:40.0872063Z · ╰── For this reduce 2026-10-24T14:24:40.0872143Z 449 │ const exists = current.some( 2026-10-24T14:24:40.0872320Z 450 │ (favorite) => favorite.provider === change.provider && favorite.model === change.model, 2026-10-24T14:24:40.0872377Z 451 │ ); 2026-10-24T14:24:40.0872451Z 452 │ return change.favorite 2026-10-24T14:24:40.0872513Z 453 │ ? exists 2026-10-24T14:24:40.0872576Z 454 │ ? current 2026-10-24T14:24:40.0872713Z 455 │ : [...current, { provider: change.provider, model: change.model }] 2026-10-24T14:24:40.0872797Z ·  ─────┬──── 2026-10-24T14:24:40.0872973Z · ╰── From this spread 2026-10-24T14:24:40.0873074Z 456 │ : current.filter( 2026-10-24T14:24:40.0873126Z ╰──── 2026-10-24T14:24:40.0873336Z  help: Consider using `Object.assign()` or `Array.prototype.push()` to mutate the accumulator instead. 2026-10-24T14:24:40.0873493Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T14:24:40.0873496Z 2026-10-24T14:24:40.0873684Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-24T14:24:40.0873801Z ╭─[packages/shared/src/serverSettings.ts:466:3] 2026-10-24T14:24:40.0873860Z 464 │ null; 2026-10-24T14:24:40.0873975Z 465 │ let nextModelPreferences = initialModelPreferences; 2026-10-24T14:24:40.0874065Z ·  ──────────┬───────── 2026-10-24T14:24:40.0874200Z · ╰── From this accumulator 2026-10-24T14:24:40.0874303Z 466 │ for (const change of setModelsHidden ?? []) { 2026-10-24T14:24:40.0874368Z ·  ─┬─ 2026-10-24T14:24:40.0874474Z · ╰── For this loop 2026-10-24T14:24:40.0874610Z 467 │ const preferences = nextModelPreferences?.[change.provider] ?? { 2026-10-24T14:24:40.0874679Z 468 │ hiddenModels: [], 2026-10-24T14:24:40.0874744Z 469 │ modelOrder: [], 2026-10-24T14:24:40.0874799Z 470 │ }; 2026-10-24T14:24:40.0874979Z 471 │ const hiddenModels = preferences.hiddenModels.filter((model) => model !== change.model); 2026-10-24T14:24:40.0875088Z 472 │ if (change.hidden) hiddenModels.push(change.model); 2026-10-24T14:24:40.0875161Z 473 │ nextModelPreferences = { 2026-10-24T14:24:40.0875239Z 474 │ ...nextModelPreferences, 2026-10-24T14:24:40.0875341Z ·  ───────────┬─────────── 2026-10-24T14:24:40.0875467Z · ╰── From this spread 2026-10-24T14:24:40.0875578Z 475 │ [change.provider]: { ...preferences, hiddenModels }, 2026-10-24T14:24:40.0875629Z ╰──── 2026-10-24T14:24:40.0875785Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-24T14:24:40.0875942Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T14:24:40.0875945Z 2026-10-24T14:24:40.0876319Z ⚠ 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-24T14:24:40.0876445Z ╭─[apps/server/src/auth/RpcAuthorization.ts:237:17] 2026-10-24T14:24:40.0876634Z 236 │ const requiredScopesForSettingsUpdate = (payload: unknown) => { 2026-10-24T14:24:40.0876807Z 237 │ const input = Schema.decodeUnknownSync(SettingsUpdate)(payload); 2026-10-24T14:24:40.0876913Z ·  ──────────────────────── 2026-10-24T14:24:40.0877050Z 238 │ const scopes = requiredScopesForServerSettingsPatch(input.patch); 2026-10-24T14:24:40.0877101Z ╰──── 2026-10-24T14:24:40.0877104Z 2026-10-24T14:24:40.0877474Z ⚠ 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-24T14:24:40.0877598Z ╭─[apps/server/src/auth/RpcAuthorization.ts:256:26] 2026-10-24T14:24:40.0877697Z 255 │ if (method === WS_METHODS.assetsCreateUrl) { 2026-10-24T14:24:40.0877853Z 256 │ const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload); 2026-10-24T14:24:40.0877973Z ·  ──────────────────────── 2026-10-24T14:24:40.0878037Z 257 │ return [ 2026-10-24T14:24:40.0878088Z ╰──── 2026-10-24T14:24:40.0878090Z 2026-10-24T14:24:40.0878290Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T14:24:40.0878458Z ╭─[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9] 2026-10-24T14:24:40.0878547Z 35 │ => 2026-10-24T14:24:40.0881855Z ·  ──────────┬────────── 2026-10-24T14:24:40.0882018Z · ╰── 'revokeActiveMcpThread' is declared here 2026-10-24T14:24:40.0882206Z 219 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeThread(threadId) : Effect.void; 2026-10-24T14:24:40.0882258Z ╰──── 2026-10-24T14:24:40.0882362Z  help: Consider removing this declaration. 2026-10-24T14:24:40.0882365Z 2026-10-24T14:24:40.0882680Z ⚠ eslint(no-unused-vars): Variable 'revokeAllActiveMcpCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-24T14:24:40.0882808Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:221:7] 2026-10-24T14:24:40.0882865Z 220 │ 2026-10-24T14:24:40.0882999Z 221 │ const revokeAllActiveMcpCredentials = (): Effect.Effect => 2026-10-24T14:24:40.0883103Z ·  ──────────────┬────────────── 2026-10-24T14:24:40.0883284Z · ╰── 'revokeAllActiveMcpCredentials' is declared here 2026-10-24T14:24:40.0883446Z 222 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void; 2026-10-24T14:24:40.0883497Z ╰──── 2026-10-24T14:24:40.0883601Z  help: Consider removing this declaration. 2026-10-24T14:24:40.0883604Z 2026-10-24T14:24:40.0883784Z ⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`. 2026-10-24T14:24:40.0883906Z ╭─[apps/web/src/terminal/ghostty/core.ts:194:19] 2026-10-24T14:24:40.0884035Z 193 │ const count = Math.min(CHUNK_SIZE, graphemeLength - start); 2026-10-24T14:24:40.0884129Z 194 │ const codes = new Array(count); 2026-10-24T14:24:40.0884236Z ·  ──────────────────────── 2026-10-24T14:24:40.0884340Z 195 │ for (let index = 0; index < count; index += 1) { 2026-10-24T14:24:40.0884391Z ╰──── 2026-10-24T14:24:40.0884828Z  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-24T14:24:40.0884830Z 2026-10-24T14:24:40.0885036Z ⚠ eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used. 2026-10-24T14:24:40.0885127Z ╭─[apps/web/src/types.ts:22:3] 2026-10-24T14:24:40.0885206Z 21 │ EnvironmentThreadShell, 2026-10-24T14:24:40.0885277Z 22 │ ThreadRunSummary, 2026-10-24T14:24:40.0885357Z ·  ────────┬─────── 2026-10-24T14:24:40.0885500Z · ╰── 'ThreadRunSummary' is imported here 2026-10-24T14:24:40.0885570Z 23 │ ThreadRuntimeSummary, 2026-10-24T14:24:40.0885622Z ╰──── 2026-10-24T14:24:40.0885720Z  help: Consider removing this import. 2026-10-24T14:24:40.0885723Z 2026-10-24T14:24:40.0885891Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T14:24:40.0886012Z ╭─[apps/web/src/hooks/useThreadActions.ts:821:56] 2026-10-24T14:24:40.0886115Z 820 │ const resolved = resolveThreadTarget(target); 2026-10-24T14:24:40.0886276Z 821 │ if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) { 2026-10-24T14:24:40.0886452Z ·  ─────┬──── 2026-10-24T14:24:40.0886675Z · ╰── Cannot call impure function 2026-10-24T14:24:40.0886756Z 822 │ return AsyncResult.failure( 2026-10-24T14:24:40.0886807Z ╰──── 2026-10-24T14:24:40.0887092Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T14:24:40.0887398Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T14:24:40.0887401Z 2026-10-24T14:24:40.0887569Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T14:24:40.0887694Z ╭─[apps/web/src/hooks/useThreadActions.ts:709:46] 2026-10-24T14:24:40.0887769Z 708 │ const wokeAt = resolved 2026-10-24T14:24:40.0887903Z 709 │ ? threadWokeAt(resolved.thread, { now: new Date().toISOString() }) 2026-10-24T14:24:40.0888016Z ·  ─────┬──── 2026-10-24T14:24:40.0888180Z · ╰── Cannot call impure function 2026-10-24T14:24:40.0888242Z 710 │ : null; 2026-10-24T14:24:40.0888293Z ╰──── 2026-10-24T14:24:40.0888596Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T14:24:40.0888898Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T14:24:40.0888906Z 2026-10-24T14:24:40.0888993Z Found 0 errors and 367 warnings in 5477 files (6.0s, 8 threads) 2026-10-24T14:24:40.1353978Z Post job cleanup. 2026-10-24T14:24:40.1990646Z Cache hit occurred on the primary key electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309, not saving cache. 2026-10-24T14:24:40.2073453Z Post job cleanup. 2026-10-24T14:24:40.2086169Z ##[start-action display=Cache full pnpm store;id=__48c6f2dc-6752-4976-b7f5-fb336e52ecb5.__actions_cache] 2026-10-24T14:24:40.2432672Z Post job cleanup. 2026-10-24T14:24:40.3048932Z Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-fa50cf9b003d547cd32552f61b874eb4abe5dace3fdb4b1abd9610da2da24074, not saving cache. 2026-10-24T14:24:40.3085358Z ##[end-action id=__48c6f2dc-6752-4976-b7f5-fb336e52ecb5.__actions_cache;outcome=success;conclusion=success;duration_ms=99] 2026-10-24T14:24:40.3086663Z ##[start-action display=Cache Vite+;id=__48c6f2dc-6752-4976-b7f5-fb336e52ecb5.vp_cache] 2026-10-24T14:24:40.3104957Z Post job cleanup. 2026-10-24T14:24:40.3766839Z 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-24T14:24:40.3809367Z ##[end-action id=__48c6f2dc-6752-4976-b7f5-fb336e52ecb5.vp_cache;outcome=success;conclusion=success;duration_ms=72] 2026-10-24T14:24:40.3848779Z Post job cleanup. 2026-10-24T14:24:40.4298377Z [command]/usr/local/bin/git version 2026-10-24T14:24:40.4328831Z git version 2.55.0 2026-10-24T14:24:40.4348260Z Temporarily overriding HOME='/home/runner/_work/_temp/94c41c10-167b-4dab-9d3f-45c0fa0ade31' before making global git config changes 2026-10-24T14:24:40.4348652Z Adding repository directory to the temporary git global config as a safe directory 2026-10-24T14:24:40.4351590Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-24T14:24:40.4373057Z Removing SSH command configuration 2026-10-24T14:24:40.4376461Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-24T14:24:40.4399596Z [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-24T14:24:40.4534965Z fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules 2026-10-24T14:24:40.4560744Z ##[warning]The process '/usr/local/bin/git' failed with exit code 128 2026-10-24T14:24:40.4608424Z A job completed hook has been configured by the self-hosted runner administrator 2026-10-24T14:24:40.4632021Z ##[group]Run '/job_completed.sh' 2026-10-24T14:24:40.4642628Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T14:24:40.4642803Z env: 2026-10-24T14:24:40.4642917Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 150 2026-10-24T14:24:40.4643067Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 397 2026-10-24T14:24:40.4643209Z BLACKSMITH_CHECK_RUN_ID: 120896785339 2026-10-24T14:24:40.4643351Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-24T14:24:40.4643509Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-24T14:24:40.4643646Z ##[endgroup] 2026-10-24T14:24:40.4727387Z Docker container cache not activated, skipping hash computation. 2026-10-24T14:24:40.4997992Z No active SSH sessions detected. Proceeding with shutdown immediately. 2026-10-24T14:24:40.5042380Z Cleaning up orphan processes