2026-10-22T19:29:48.8730325Z Current runner version: '2.337.0' 2026-10-22T19:29:48.8734820Z Runner name: 'blacksmith-8vcpu-ubuntu-2404-fd4dd7hlvzurjkts' 2026-10-22T19:29:48.8735851Z Runner group name: 'blacksmith scale sets - blacksmith-8vcpu-ubuntu-2404' 2026-10-22T19:29:48.8736834Z Machine name: 'ip-172-31-73-130' 2026-10-22T19:29:48.8738674Z ##[group]GITHUB_TOKEN Permissions 2026-10-22T19:29:48.8740389Z Contents: read 2026-10-22T19:29:48.8740869Z Metadata: read 2026-10-22T19:29:48.8741347Z ##[endgroup] 2026-10-22T19:29:48.8742955Z Secret source: Actions 2026-10-22T19:29:48.8743776Z Cache mode: write 2026-10-22T19:29:48.8744406Z Prepare workflow directory 2026-10-22T19:29:48.8991344Z Prepare all required actions 2026-10-22T19:29:48.9031598Z Getting action download info 2026-10-22T19:29:49.0358797Z Download action repository 'actions/checkout@v6' (SHA:d23441a48e516b6c34aea4fa41551a30e30af803) 2026-10-22T19:29:49.0897247Z Download action repository 'actions/cache@v6' (SHA:55cc8345863c7cc4c66a329aec7e433d2d1c52a9) 2026-10-22T19:29:49.2404039Z Setting BLACKSMITH_ACTIONS_RESULTS_URL to https://results-receiver.actions.githubusercontent.com/ 2026-10-22T19:29:49.2463457Z Complete job name: Lint 2026-10-22T19:29:49.2982131Z A job started hook has been configured by the self-hosted runner administrator 2026-10-22T19:29:49.3083100Z ##[group]Run '/setup.sh' 2026-10-22T19:29:49.3109159Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-22T19:29:49.3109950Z env: 2026-10-22T19:29:49.3110204Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 200 2026-10-22T19:29:49.3110520Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 513 2026-10-22T19:29:49.3110817Z BLACKSMITH_CHECK_RUN_ID: 120040171121 2026-10-22T19:29:49.3111113Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-22T19:29:49.3111399Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-22T19:29:49.3111670Z ##[endgroup] 2026-10-22T19:29:49.3486565Z Logging daemon started (blacksmithd for logs) 2026-10-22T19:29:49.3628100Z Results daemon started (blacksmithd for results) 2026-10-22T19:29:49.3843205Z Background adoption and SSH setup started (PID: 3137) 2026-10-22T19:29:49.3843687Z 2026-10-22T19:29:49.3843817Z ---------------------------------------- 2026-10-22T19:29:49.3844447Z View this job: https://app.blacksmith.sh/pingdotgg/runs/39840568012/jobs/120040171121 2026-10-22T19:29:49.3844960Z SSH Access (using your GitHub SSH key): 2026-10-22T19:29:49.3845437Z ssh -p 64001 runner@blacksmith-8vcpu-ubuntu-2404-fd4dd7hlvzurjkts.vm.blacksmith.sh 2026-10-22T19:29:49.3845785Z 2026-10-22T19:29:49.3845901Z No GitHub SSH key? Add one at: 2026-10-22T19:29:49.3846436Z https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account 2026-10-22T19:29:49.3846882Z 2026-10-22T19:29:49.3846998Z ---------------------------------------- 2026-10-22T19:29:49.3847197Z 2026-10-22T19:29:49.3847354Z VM ID: blacksmith-8vcpu-ubuntu-2404-fd4dd7hlvzurjkts 2026-10-22T19:29:49.3847714Z Host: production-152.236.40.168-x8664 2026-10-22T19:29:49.3848018Z Host Agent PID: 2124137 2026-10-22T19:29:49.3848293Z Host Agent Git SHA: 266f03d96 2026-10-22T19:29:49.3848582Z Host CPU Manufacturer: AuthenticAMD 2026-10-22T19:29:49.3848903Z Blacksmith Host Generation: gen 2 2026-10-22T19:29:49.3849212Z Petname: production-rare-phoenix-78b4ff3b 2026-10-22T19:29:49.3849530Z Region: us-east 2026-10-22T19:29:49.3849789Z Rootfs Version: ubuntu24-full-x64-081926 2026-10-22T19:29:49.3863466Z OS Version: Ubuntu 24.04.4 LTS 2026-10-22T19:29:49.3864037Z 2026-10-22T19:29:49.3864262Z Enabling Blacksmith transparent cache 2026-10-22T19:29:49.4280988Z ##[group]Run actions/checkout@v6 2026-10-22T19:29:49.4281579Z with: 2026-10-22T19:29:49.4282144Z sparse-checkout: /* !/.repos/ !/apps/mobile/modules/t3-terminal/Vendor/**/*.a 2026-10-22T19:29:49.4282623Z sparse-checkout-cone-mode: false 2026-10-22T19:29:49.4282943Z repository: pingdotgg/t3code 2026-10-22T19:29:49.4285817Z token: *** 2026-10-22T19:29:49.4286093Z ssh-strict: true 2026-10-22T19:29:49.4286342Z ssh-user: git 2026-10-22T19:29:49.4286598Z persist-credentials: true 2026-10-22T19:29:49.4287225Z clean: true 2026-10-22T19:29:49.4287550Z fetch-depth: 1 2026-10-22T19:29:49.4287946Z fetch-tags: false 2026-10-22T19:29:49.4288540Z show-progress: true 2026-10-22T19:29:49.4288862Z lfs: false 2026-10-22T19:29:49.4289105Z submodules: false 2026-10-22T19:29:49.4289363Z set-safe-directory: true 2026-10-22T19:29:49.4289653Z allow-unsafe-pr-checkout: false 2026-10-22T19:29:49.4289969Z env: 2026-10-22T19:29:49.4290263Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 200 2026-10-22T19:29:49.4290582Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 513 2026-10-22T19:29:49.4290904Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T19:29:49.4291198Z ##[endgroup] 2026-10-22T19:29:49.5713974Z Syncing repository: pingdotgg/t3code 2026-10-22T19:29:49.5715750Z ##[group]Getting Git version info 2026-10-22T19:29:49.5716367Z Working directory is '/home/runner/_work/t3code/t3code' 2026-10-22T19:29:49.5717250Z [command]/usr/local/bin/git version 2026-10-22T19:29:49.5804196Z git version 2.55.0 2026-10-22T19:29:49.5819156Z ##[endgroup] 2026-10-22T19:29:49.5829057Z Temporarily overriding HOME='/home/runner/_work/_temp/46b5dcf5-7bd8-4e69-8523-023194888108' before making global git config changes 2026-10-22T19:29:49.5830525Z Adding repository directory to the temporary git global config as a safe directory 2026-10-22T19:29:49.5833377Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-22T19:29:49.5878741Z Deleting the contents of '/home/runner/_work/t3code/t3code' 2026-10-22T19:29:49.5881340Z ##[group]Determining repository object format 2026-10-22T19:29:49.5883297Z ##[endgroup] 2026-10-22T19:29:49.5883694Z ##[group]Initializing the repository 2026-10-22T19:29:49.5887061Z [command]/usr/local/bin/git init /home/runner/_work/t3code/t3code 2026-10-22T19:29:49.5939031Z hint: Using 'master' as the name for the initial branch. This default branch name 2026-10-22T19:29:49.5939658Z hint: will change to "main" in Git 3.0. To configure the initial branch name 2026-10-22T19:29:49.5940211Z hint: to use in all of your new repositories, which will suppress this warning, 2026-10-22T19:29:49.5940614Z hint: call: 2026-10-22T19:29:49.5940837Z hint: 2026-10-22T19:29:49.5941161Z hint: git config --global init.defaultBranch 2026-10-22T19:29:49.5941514Z hint: 2026-10-22T19:29:49.5941830Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and 2026-10-22T19:29:49.5942449Z hint: 'development'. The just-created branch can be renamed via this command: 2026-10-22T19:29:49.5942860Z hint: 2026-10-22T19:29:49.5943101Z hint: git branch -m 2026-10-22T19:29:49.5943362Z hint: 2026-10-22T19:29:49.5943714Z hint: Disable this message with "git config set advice.defaultBranchName false" 2026-10-22T19:29:49.5944353Z Initialized empty Git repository in /home/runner/_work/t3code/t3code/.git/ 2026-10-22T19:29:49.5945995Z [command]/usr/local/bin/git remote add origin https://github.com/pingdotgg/t3code 2026-10-22T19:29:49.5981275Z ##[endgroup] 2026-10-22T19:29:49.5981735Z ##[group]Disabling automatic garbage collection 2026-10-22T19:29:49.5983676Z [command]/usr/local/bin/git config --local gc.auto 0 2026-10-22T19:29:49.6010966Z ##[endgroup] 2026-10-22T19:29:49.6011392Z ##[group]Setting up auth 2026-10-22T19:29:49.6011716Z Removing SSH command configuration 2026-10-22T19:29:49.6016301Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-22T19:29:49.6042379Z [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-22T19:29:49.6203019Z Removing HTTP extra header 2026-10-22T19:29:49.6207286Z [command]/usr/local/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader 2026-10-22T19:29:49.6236245Z [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-22T19:29:49.6347248Z Removing includeIf entries pointing to credentials config files 2026-10-22T19:29:49.6347855Z [command]/usr/local/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: 2026-10-22T19:29:49.6373956Z [command]/usr/local/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url 2026-10-22T19:29:49.6483192Z [command]/usr/local/bin/git config --file /home/runner/_work/_temp/git-credentials-7ece5c32-867f-41ad-b641-d634082a64a6.config http.https://github.com/.extraheader AUTHORIZATION: basic *** 2026-10-22T19:29:49.6510565Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git.path /home/runner/_work/_temp/git-credentials-7ece5c32-867f-41ad-b641-d634082a64a6.config 2026-10-22T19:29:49.6532265Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git/worktrees/*.path /home/runner/_work/_temp/git-credentials-7ece5c32-867f-41ad-b641-d634082a64a6.config 2026-10-22T19:29:49.6554046Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-7ece5c32-867f-41ad-b641-d634082a64a6.config 2026-10-22T19:29:49.6577045Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-7ece5c32-867f-41ad-b641-d634082a64a6.config 2026-10-22T19:29:49.6600121Z ##[endgroup] 2026-10-22T19:29:49.6600776Z ##[group]Fetching the repository 2026-10-22T19:29:49.6605535Z [command]/usr/local/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --filter=blob:none --depth=1 origin +01347cdaba67e743e671f4c0e357f2c9efc20d21:refs/remotes/pull/23789/merge 2026-10-22T19:29:50.3129298Z From https://github.com/pingdotgg/t3code 2026-10-22T19:29:50.3130966Z * [new ref] 01347cdaba67e743e671f4c0e357f2c9efc20d21 -> pull/23789/merge 2026-10-22T19:29:50.3160563Z ##[endgroup] 2026-10-22T19:29:50.3161630Z ##[group]Determining the checkout info 2026-10-22T19:29:50.3162647Z ##[endgroup] 2026-10-22T19:29:50.3163525Z ##[group]Setting up sparse checkout 2026-10-22T19:29:50.3165630Z [command]/usr/local/bin/git config core.sparseCheckout true 2026-10-22T19:29:50.3196383Z [command]/usr/local/bin/git rev-parse --git-path info/sparse-checkout 2026-10-22T19:29:50.3216378Z .git/info/sparse-checkout 2026-10-22T19:29:50.3221554Z ##[endgroup] 2026-10-22T19:29:50.3222579Z ##[group]Checking out the ref 2026-10-22T19:29:50.3224851Z [command]/usr/local/bin/git checkout --progress --force refs/remotes/pull/23789/merge 2026-10-22T19:30:02.9238004Z Updating files: 0% (1/6303) 2026-10-22T19:30:02.9280280Z Updating files: 1% (64/6303) 2026-10-22T19:30:02.9305427Z Updating files: 2% (127/6303) 2026-10-22T19:30:02.9331630Z Updating files: 3% (190/6303) 2026-10-22T19:30:02.9356554Z Updating files: 4% (253/6303) 2026-10-22T19:30:02.9392719Z Updating files: 5% (316/6303) 2026-10-22T19:30:02.9417023Z Updating files: 6% (379/6303) 2026-10-22T19:30:02.9484856Z Updating files: 7% (442/6303) 2026-10-22T19:30:02.9519928Z Updating files: 8% (505/6303) 2026-10-22T19:30:02.9550366Z Updating files: 9% (568/6303) 2026-10-22T19:30:02.9915501Z Updating files: 10% (631/6303) 2026-10-22T19:30:02.9932152Z Updating files: 11% (694/6303) 2026-10-22T19:30:02.9945394Z Updating files: 12% (757/6303) 2026-10-22T19:30:02.9964481Z Updating files: 13% (820/6303) 2026-10-22T19:30:02.9985233Z Updating files: 14% (883/6303) 2026-10-22T19:30:03.0009302Z Updating files: 15% (946/6303) 2026-10-22T19:30:03.0032712Z Updating files: 16% (1009/6303) 2026-10-22T19:30:03.0052549Z Updating files: 17% (1072/6303) 2026-10-22T19:30:03.0075043Z Updating files: 18% (1135/6303) 2026-10-22T19:30:03.0093506Z Updating files: 19% (1198/6303) 2026-10-22T19:30:03.0126360Z Updating files: 20% (1261/6303) 2026-10-22T19:30:03.0149046Z Updating files: 21% (1324/6303) 2026-10-22T19:30:03.0174007Z Updating files: 22% (1387/6303) 2026-10-22T19:30:03.0191133Z Updating files: 23% (1450/6303) 2026-10-22T19:30:03.0208710Z Updating files: 24% (1513/6303) 2026-10-22T19:30:03.0230014Z Updating files: 25% (1576/6303) 2026-10-22T19:30:03.0248847Z Updating files: 26% (1639/6303) 2026-10-22T19:30:03.0267060Z Updating files: 27% (1702/6303) 2026-10-22T19:30:03.0296222Z Updating files: 28% (1765/6303) 2026-10-22T19:30:03.0339162Z Updating files: 29% (1828/6303) 2026-10-22T19:30:03.0364162Z Updating files: 30% (1891/6303) 2026-10-22T19:30:03.0393118Z Updating files: 31% (1954/6303) 2026-10-22T19:30:03.0427969Z Updating files: 32% (2017/6303) 2026-10-22T19:30:03.0470177Z Updating files: 33% (2080/6303) 2026-10-22T19:30:03.0557612Z Updating files: 34% (2144/6303) 2026-10-22T19:30:03.0628315Z Updating files: 35% (2207/6303) 2026-10-22T19:30:03.0672943Z Updating files: 36% (2270/6303) 2026-10-22T19:30:03.0717842Z Updating files: 37% (2333/6303) 2026-10-22T19:30:03.0773319Z Updating files: 38% (2396/6303) 2026-10-22T19:30:03.0812484Z Updating files: 39% (2459/6303) 2026-10-22T19:30:03.0858351Z Updating files: 40% (2522/6303) 2026-10-22T19:30:03.0901019Z Updating files: 41% (2585/6303) 2026-10-22T19:30:03.0925851Z Updating files: 42% (2648/6303) 2026-10-22T19:30:03.0938113Z Updating files: 43% (2711/6303) 2026-10-22T19:30:03.0961243Z Updating files: 44% (2774/6303) 2026-10-22T19:30:03.1000572Z Updating files: 45% (2837/6303) 2026-10-22T19:30:03.1033094Z Updating files: 46% (2900/6303) 2026-10-22T19:30:03.1067904Z Updating files: 47% (2963/6303) 2026-10-22T19:30:03.1106873Z Updating files: 48% (3026/6303) 2026-10-22T19:30:03.1142578Z Updating files: 49% (3089/6303) 2026-10-22T19:30:03.1192461Z Updating files: 50% (3152/6303) 2026-10-22T19:30:03.1214855Z Updating files: 51% (3215/6303) 2026-10-22T19:30:03.1255485Z Updating files: 52% (3278/6303) 2026-10-22T19:30:03.1293097Z Updating files: 53% (3341/6303) 2026-10-22T19:30:03.1319511Z Updating files: 54% (3404/6303) 2026-10-22T19:30:03.1348116Z Updating files: 55% (3467/6303) 2026-10-22T19:30:03.1374291Z Updating files: 56% (3530/6303) 2026-10-22T19:30:03.1396962Z Updating files: 57% (3593/6303) 2026-10-22T19:30:03.1421783Z Updating files: 58% (3656/6303) 2026-10-22T19:30:03.1900307Z Updating files: 59% (3719/6303) 2026-10-22T19:30:03.1921101Z Updating files: 60% (3782/6303) 2026-10-22T19:30:03.1944318Z Updating files: 61% (3845/6303) 2026-10-22T19:30:03.1967127Z Updating files: 62% (3908/6303) 2026-10-22T19:30:03.1993949Z Updating files: 63% (3971/6303) 2026-10-22T19:30:03.2028156Z Updating files: 64% (4034/6303) 2026-10-22T19:30:03.2054956Z Updating files: 65% (4097/6303) 2026-10-22T19:30:03.2074109Z Updating files: 66% (4160/6303) 2026-10-22T19:30:03.2105087Z Updating files: 67% (4224/6303) 2026-10-22T19:30:03.2122026Z Updating files: 68% (4287/6303) 2026-10-22T19:30:03.2146139Z Updating files: 69% (4350/6303) 2026-10-22T19:30:03.2162494Z Updating files: 70% (4413/6303) 2026-10-22T19:30:03.2182609Z Updating files: 71% (4476/6303) 2026-10-22T19:30:03.2203203Z Updating files: 72% (4539/6303) 2026-10-22T19:30:03.2237646Z Updating files: 73% (4602/6303) 2026-10-22T19:30:03.2554090Z Updating files: 74% (4665/6303) 2026-10-22T19:30:03.2782410Z Updating files: 75% (4728/6303) 2026-10-22T19:30:03.2814637Z Updating files: 76% (4791/6303) 2026-10-22T19:30:03.2839500Z Updating files: 77% (4854/6303) 2026-10-22T19:30:03.2870511Z Updating files: 78% (4917/6303) 2026-10-22T19:30:03.2897005Z Updating files: 79% (4980/6303) 2026-10-22T19:30:03.2923171Z Updating files: 80% (5043/6303) 2026-10-22T19:30:03.2946664Z Updating files: 81% (5106/6303) 2026-10-22T19:30:03.2978117Z Updating files: 82% (5169/6303) 2026-10-22T19:30:03.3006482Z Updating files: 83% (5232/6303) 2026-10-22T19:30:03.3032408Z Updating files: 84% (5295/6303) 2026-10-22T19:30:03.3058134Z Updating files: 85% (5358/6303) 2026-10-22T19:30:03.3098190Z Updating files: 86% (5421/6303) 2026-10-22T19:30:03.3194309Z Updating files: 87% (5484/6303) 2026-10-22T19:30:03.3233577Z Updating files: 88% (5547/6303) 2026-10-22T19:30:03.3259656Z Updating files: 89% (5610/6303) 2026-10-22T19:30:03.3293792Z Updating files: 90% (5673/6303) 2026-10-22T19:30:03.3343665Z Updating files: 91% (5736/6303) 2026-10-22T19:30:03.3366150Z Updating files: 92% (5799/6303) 2026-10-22T19:30:03.3393625Z Updating files: 93% (5862/6303) 2026-10-22T19:30:03.3424362Z Updating files: 94% (5925/6303) 2026-10-22T19:30:03.3450847Z Updating files: 95% (5988/6303) 2026-10-22T19:30:03.3504063Z Updating files: 96% (6051/6303) 2026-10-22T19:30:03.3512543Z Updating files: 96% (6105/6303) 2026-10-22T19:30:03.3546567Z Updating files: 97% (6114/6303) 2026-10-22T19:30:03.3605598Z Updating files: 98% (6177/6303) 2026-10-22T19:30:03.3629910Z Updating files: 99% (6240/6303) 2026-10-22T19:30:03.3630206Z Updating files: 100% (6303/6303) 2026-10-22T19:30:03.3630353Z Updating files: 100% (6303/6303), done. 2026-10-22T19:30:03.3855408Z Note: switching to 'refs/remotes/pull/23789/merge'. 2026-10-22T19:30:03.3855799Z 2026-10-22T19:30:03.3855926Z You are in 'detached HEAD' state. You can look around, make experimental 2026-10-22T19:30:03.3856229Z changes and commit them, and you can discard any commits you make in this 2026-10-22T19:30:03.3856482Z state without impacting any branches by switching back to a branch. 2026-10-22T19:30:03.3856628Z 2026-10-22T19:30:03.3856733Z If you want to create a new branch to retain commits you create, you may 2026-10-22T19:30:03.3856976Z do so (now or later) by using -c with the switch command. Example: 2026-10-22T19:30:03.3857115Z 2026-10-22T19:30:03.3857188Z git switch -c 2026-10-22T19:30:03.3857287Z 2026-10-22T19:30:03.3857346Z Or undo this operation with: 2026-10-22T19:30:03.3857443Z 2026-10-22T19:30:03.3857541Z git switch - 2026-10-22T19:30:03.3857625Z 2026-10-22T19:30:03.3857735Z Turn off this advice by setting config variable advice.detachedHead to false 2026-10-22T19:30:03.3857894Z 2026-10-22T19:30:03.3858067Z HEAD is now at 01347cd Merge c502579298f719c4346f48ff75f3b7d896ba17c4 into 044f07257c9684ae4543bd1e1ebf9c394e9e3830 2026-10-22T19:30:03.3877198Z ##[endgroup] 2026-10-22T19:30:03.3943224Z [command]/usr/local/bin/git log -1 --format=%H 2026-10-22T19:30:03.3981459Z 01347cdaba67e743e671f4c0e357f2c9efc20d21 2026-10-22T19:30:03.4109966Z ##[group]Run files="$(git ls-files .github/pr-assets)" 2026-10-22T19:30:03.4110418Z files="$(git ls-files .github/pr-assets)" 2026-10-22T19:30:03.4110720Z if test -n "$files"; then 2026-10-22T19:30:03.4111058Z  printf 'PR evidence must be uploaded to GitHub, not committed:\n%s\n' "$files" >&2 2026-10-22T19:30:03.4111398Z  exit 1 2026-10-22T19:30:03.4111581Z fi 2026-10-22T19:30:03.4139960Z shell: /usr/bin/bash -e {0} 2026-10-22T19:30:03.4140308Z env: 2026-10-22T19:30:03.4140609Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 200 2026-10-22T19:30:03.4140856Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 513 2026-10-22T19:30:03.4141099Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T19:30:03.4141332Z ##[endgroup] 2026-10-22T19:30:03.4387157Z Prepare all required actions 2026-10-22T19:30:03.4387635Z Getting action download info 2026-10-22T19:30:03.5385085Z Download action repository 'voidzero-dev/setup-vp@v1' (SHA:250f29ce396baf5e8f24498e17c0dfdebabc26eb) 2026-10-22T19:30:03.6976217Z ##[group]Run ./.github/actions/setup-ci-deps 2026-10-22T19:30:03.6976416Z env: 2026-10-22T19:30:03.6976544Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 200 2026-10-22T19:30:03.6976703Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 513 2026-10-22T19:30:03.6976860Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T19:30:03.6977042Z ##[endgroup] 2026-10-22T19:30:03.7100867Z ##[start-action display=Resolve Vite+ version;id=__self.vp] 2026-10-22T19:30:03.7123703Z ##[group]Run echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-22T19:30:03.7124290Z echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-22T19:30:03.7124625Z echo "node=$(jq -r '.engines.node' package.json)" >> "$GITHUB_OUTPUT" 2026-10-22T19:30:03.7124878Z echo "pnpm=$(jq -r '.packageManager' package.json)" >> "$GITHUB_OUTPUT" 2026-10-22T19:30:03.7152351Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-22T19:30:03.7152628Z env: 2026-10-22T19:30:03.7152772Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 200 2026-10-22T19:30:03.7152995Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 513 2026-10-22T19:30:03.7153237Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T19:30:03.7153472Z ##[endgroup] 2026-10-22T19:30:03.7290082Z ##[end-action id=__self.vp;outcome=success;conclusion=success;duration_ms=18] 2026-10-22T19:30:03.7294451Z ##[start-action display=Cache Vite+;id=__self.vp_cache] 2026-10-22T19:30:03.7380960Z ##[group]Run actions/cache@v6 2026-10-22T19:30:03.7381145Z with: 2026-10-22T19:30:03.7381268Z path: ~/.vite-plus 2026-10-22T19:30:03.7381449Z key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-22T19:30:03.7381683Z enableCrossOsArchive: false 2026-10-22T19:30:03.7381832Z fail-on-cache-miss: false 2026-10-22T19:30:03.7381975Z lookup-only: false 2026-10-22T19:30:03.7382097Z save-always: false 2026-10-22T19:30:03.7382253Z env: 2026-10-22T19:30:03.7382417Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 200 2026-10-22T19:30:03.7382627Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 513 2026-10-22T19:30:03.7382813Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T19:30:03.7382963Z ##[endgroup] 2026-10-22T19:30:03.9768747Z Cache hit for: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-22T19:30:04.5231897Z Received 170349591 of 170349591 (100.0%), 311.2 MBs/sec 2026-10-22T19:30:04.5237108Z Cache Size: ~162 MB (170349591 B) 2026-10-22T19:30:04.5278298Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/1885edd3-9efc-4ae5-87c7-3c11edba6345/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-22T19:30:05.5190112Z Cache restored successfully 2026-10-22T19:30:05.5380896Z Cache restored from key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-22T19:30:05.5500042Z ##[end-action id=__self.vp_cache;outcome=success;conclusion=success;duration_ms=1820] 2026-10-22T19:30:05.5503331Z ##[start-action display=Use cached Vite+;id=__self.__run] 2026-10-22T19:30:05.5538848Z ##[group]Run echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-22T19:30:05.5539122Z echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-22T19:30:05.5539311Z "$HOME/.vite-plus/bin/vp" env use "26.12.1" 2026-10-22T19:30:05.5562752Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-22T19:30:05.5562996Z env: 2026-10-22T19:30:05.5563137Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 200 2026-10-22T19:30:05.5563304Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 513 2026-10-22T19:30:05.5563477Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T19:30:05.5563641Z ##[endgroup] 2026-10-22T19:30:05.5628959Z Using Node.js v26.12.1 (resolved from 26.12.1) 2026-10-22T19:30:05.5645363Z ##[end-action id=__self.__run;outcome=success;conclusion=success;duration_ms=14] 2026-10-22T19:30:05.5648094Z ##[start-action display=Setup Vite+;id=__self.__voidzero-dev_setup-vp] 2026-10-22T19:30:05.5655952Z ##[end-action id=__self.__voidzero-dev_setup-vp;outcome=skipped;conclusion=skipped;duration_ms=0] 2026-10-22T19:30:05.5658072Z ##[start-action display=Resolve pnpm store path;id=__self.pnpm_store] 2026-10-22T19:30:05.5675236Z ##[group]Run store_path="$(vp pm cache dir)" 2026-10-22T19:30:05.5691114Z store_path="$(vp pm cache dir)" 2026-10-22T19:30:05.5691341Z echo "path=$store_path" >> "$GITHUB_OUTPUT" 2026-10-22T19:30:05.5715760Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-22T19:30:05.5716047Z env: 2026-10-22T19:30:05.5716233Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 200 2026-10-22T19:30:05.5717547Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 513 2026-10-22T19:30:05.5717725Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T19:30:05.5717888Z ##[endgroup] 2026-10-22T19:30:05.5951625Z ##[end-action id=__self.pnpm_store;outcome=success;conclusion=success;duration_ms=29] 2026-10-22T19:30:05.5954530Z ##[start-action display=Cache full pnpm store;id=__self.__actions_cache] 2026-10-22T19:30:05.6883686Z ##[group]Run actions/cache@v6 2026-10-22T19:30:05.6883851Z with: 2026-10-22T19:30:05.6883985Z path: /home/runner/.local/share/pnpm/store/v11 2026-10-22T19:30:05.6884271Z key: pnpm-full-v1-Linux-X64-d651407d7d0c7ecacd035718e6d120760bb0bb1ea0b966bcda4a8197c80ebc8f 2026-10-22T19:30:05.6884552Z restore-keys: pnpm-full-v1-Linux-X64- 2026-10-22T19:30:05.6884714Z enableCrossOsArchive: false 2026-10-22T19:30:05.6884853Z fail-on-cache-miss: false 2026-10-22T19:30:05.6884979Z lookup-only: false 2026-10-22T19:30:05.6885182Z save-always: false 2026-10-22T19:30:05.6885323Z env: 2026-10-22T19:30:05.6885444Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 200 2026-10-22T19:30:05.6885613Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 513 2026-10-22T19:30:05.6885764Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T19:30:05.6885919Z ##[endgroup] 2026-10-22T19:30:05.9271487Z Cache hit for: pnpm-full-v1-Linux-X64-d651407d7d0c7ecacd035718e6d120760bb0bb1ea0b966bcda4a8197c80ebc8f 2026-10-22T19:30:06.9526747Z Received 499122176 of 994453879 (50.2%), 474.1 MBs/sec 2026-10-22T19:30:08.0024608Z Received 939524096 of 994453879 (94.5%), 436.4 MBs/sec 2026-10-22T19:30:08.1368361Z Received 994453879 of 994453879 (100.0%), 433.4 MBs/sec 2026-10-22T19:30:08.1371256Z Cache Size: ~948 MB (994453879 B) 2026-10-22T19:30:08.1403678Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/3572e4aa-5a66-4aa3-8fa1-506c20211dad/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-22T19:30:15.5203704Z Cache restored successfully 2026-10-22T19:30:15.5876437Z Cache restored from key: pnpm-full-v1-Linux-X64-d651407d7d0c7ecacd035718e6d120760bb0bb1ea0b966bcda4a8197c80ebc8f 2026-10-22T19:30:15.6012347Z ##[end-action id=__self.__actions_cache;outcome=success;conclusion=success;duration_ms=10005] 2026-10-22T19:30:15.6016783Z ##[start-action display=Install dependencies;id=__self.__run_2] 2026-10-22T19:30:15.6036926Z ##[group]Run vp install 2026-10-22T19:30:15.6037099Z vp install 2026-10-22T19:30:15.6066334Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-22T19:30:15.6066631Z env: 2026-10-22T19:30:15.6066838Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 200 2026-10-22T19:30:15.6067094Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 513 2026-10-22T19:30:15.6067347Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T19:30:15.6067582Z ##[endgroup] 2026-10-22T19:30:15.6501666Z Scope: all 33 workspace projects 2026-10-22T19:30:15.7976627Z ? Verifying lockfile against supply-chain policies (2088 entries)... 2026-10-22T19:30:16.2022045Z Packages are hard linked from the content-addressable store to the virtual store. 2026-10-22T19:30:16.2022597Z Content-addressable store is at: /home/runner/.local/share/pnpm/store/v11 2026-10-22T19:30:16.2022981Z Virtual store is at: node_modules/.pnpm 2026-10-22T19:30:19.7190424Z ✓ Lockfile passes supply-chain policies (2088 entries in 3.9s) 2026-10-22T19:30:19.7190938Z Lockfile is up to date, resolution step is skipped 2026-10-22T19:30:19.7547560Z Packages: +1721 2026-10-22T19:30:19.7547996Z ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2026-10-22T19:30:19.8237606Z Progress: resolved 1721, reused 1718, downloaded 0, added 1721, done 2026-10-22T19:30:21.1029205Z . prepare$ vp config --no-agent 2026-10-22T19:30:21.2637130Z . prepare: Done 2026-10-22T19:30:21.2653311Z 2026-10-22T19:30:21.2653761Z devDependencies: 2026-10-22T19:30:21.2653966Z + @coderabbitai/config 1.1.0 2026-10-22T19:30:21.2654129Z + @shadcn/lint 0.1.5 2026-10-22T19:30:21.2654278Z + @types/node 24.12.4 2026-10-22T19:30:21.2654403Z + knip 6.34.0 2026-10-22T19:30:21.2654569Z + typescript <- @tsc-rs/typescript 0.8.0 2026-10-22T19:30:21.2654729Z + vite-plus 1.3.0 2026-10-22T19:30:21.2654808Z 2026-10-22T19:30:21.2676928Z Done in 5.6s using pnpm v12.14.0 2026-10-22T19:30:21.2878206Z ##[end-action id=__self.__run_2;outcome=success;conclusion=success;duration_ms=5686] 2026-10-22T19:30:21.3633425Z ##[group]Run actions/cache@v6 2026-10-22T19:30:21.3633586Z with: 2026-10-22T19:30:21.3633698Z path: ~/.cache/electron 2026-10-22T19:30:21.3633928Z key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-22T19:30:21.3634186Z enableCrossOsArchive: false 2026-10-22T19:30:21.3634332Z fail-on-cache-miss: false 2026-10-22T19:30:21.3634492Z lookup-only: false 2026-10-22T19:30:21.3634629Z save-always: false 2026-10-22T19:30:21.3634746Z env: 2026-10-22T19:30:21.3634866Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 200 2026-10-22T19:30:21.3635025Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 513 2026-10-22T19:30:21.3635169Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T19:30:21.3635316Z ##[endgroup] 2026-10-22T19:30:21.5853816Z Cache hit for: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-22T19:30:21.8490294Z Received 122906203 of 122906203 (100.0%), 482.4 MBs/sec 2026-10-22T19:30:21.8491216Z Cache Size: ~117 MB (122906203 B) 2026-10-22T19:30:21.8521151Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/bfeaa497-9cca-4d1e-84bb-df5796a85773/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-22T19:30:21.9907804Z Cache restored successfully 2026-10-22T19:30:22.0094067Z Cache restored from key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-22T19:30:22.0266199Z ##[group]Run vp run --filter @t3tools/desktop ensure:electron 2026-10-22T19:30:22.0266694Z vp run --filter @t3tools/desktop ensure:electron 2026-10-22T19:30:22.0291401Z shell: /usr/bin/bash -e {0} 2026-10-22T19:30:22.0291647Z env: 2026-10-22T19:30:22.0291891Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 200 2026-10-22T19:30:22.0292140Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 513 2026-10-22T19:30:22.0292632Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T19:30:22.0292864Z ##[endgroup] 2026-10-22T19:30:22.2755681Z ~/apps/desktop$ node scripts/ensure-electron-runtime.mjs ⊘ cache disabled 2026-10-22T19:30:22.9479181Z /home/runner/_work/t3code/t3code/node_modules/.pnpm/electron@44.9.3_supports-color@8.1.1/node_modules/electron/dist/electron 2026-10-22T19:30:22.9514519Z 2026-10-22T19:30:22.9653730Z ##[group]Run vp run knip:check 2026-10-22T19:30:22.9654355Z vp run knip:check 2026-10-22T19:30:22.9682140Z shell: /usr/bin/bash -e {0} 2026-10-22T19:30:22.9700266Z env: 2026-10-22T19:30:22.9700435Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 200 2026-10-22T19:30:22.9700683Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 513 2026-10-22T19:30:22.9700932Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T19:30:22.9701155Z ##[endgroup] 2026-10-22T19:30:23.1789741Z $ knip --include files,dependencies --no-config-hints ⊘ cache disabled 2026-10-22T19:30:28.6027609Z 2026-10-22T19:30:28.6032747Z $ 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-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-22T19:31:12.5594923Z 2026-10-22T19:31:12.5596977Z --- 2026-10-22T19:31:12.5597260Z vp run: 2/2 successful. (Run `vp run --last-details` for full details) 2026-10-22T19:31:12.5697944Z ##[group]Run vp run --filter @t3tools/source-control-github generate --check 2026-10-22T19:31:12.5698430Z vp run --filter @t3tools/source-control-github generate --check 2026-10-22T19:31:12.5723530Z shell: /usr/bin/bash -e {0} 2026-10-22T19:31:12.5723744Z env: 2026-10-22T19:31:12.5723919Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 200 2026-10-22T19:31:12.5724156Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 513 2026-10-22T19:31:12.5724377Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T19:31:12.5724585Z ##[endgroup] 2026-10-22T19:31:12.7620931Z ~/packages/source-control-github$ graphqlgen --check ⊘ cache disabled 2026-10-22T19:31:13.0178669Z 2026-10-22T19:31:13.0280610Z ##[group]Run vp run --filter t3 generate --check 2026-10-22T19:31:13.0280875Z vp run --filter t3 generate --check 2026-10-22T19:31:13.0303188Z shell: /usr/bin/bash -e {0} 2026-10-22T19:31:13.0303374Z env: 2026-10-22T19:31:13.0303525Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 200 2026-10-22T19:31:13.0303693Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 513 2026-10-22T19:31:13.0303854Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T19:31:13.0304006Z ##[endgroup] 2026-10-22T19:31:13.2677965Z ~/apps/server$ graphqlgen --check ⊘ cache disabled 2026-10-22T19:31:13.5155911Z 2026-10-22T19:31:13.5340235Z ##[group]Run vp check 2026-10-22T19:31:13.5340510Z vp check 2026-10-22T19:31:13.5366591Z shell: /usr/bin/bash -e {0} 2026-10-22T19:31:13.5366795Z env: 2026-10-22T19:31:13.5366981Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 200 2026-10-22T19:31:13.5367223Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 513 2026-10-22T19:31:13.5367452Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T19:31:13.5367672Z ##[endgroup] 2026-10-22T19:31:14.4201626Z pass: All 5661 files are correctly formatted (660ms, 8 threads) 2026-10-22T19:31:22.8868503Z warn: Lint warnings found 2026-10-22T19:31:22.8871410Z ⚠ unicorn(prefer-add-event-listener): Prefer `addEventListener()` over their `on`-function counterparts. 2026-10-22T19:31:22.8872142Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:12:14] 2026-10-22T19:31:22.8872728Z 11 │ addEventListener(_type: string, listener: (event: { data: string }) => void) { 2026-10-22T19:31:22.8873252Z 12 │ this.onmessage = listener; 2026-10-22T19:31:22.8873568Z ·  ───────── 2026-10-22T19:31:22.8873824Z 13 │ } 2026-10-22T19:31:22.8874020Z ╰──── 2026-10-22T19:31:22.8874703Z  help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on` replaces any previously registered handler. 2026-10-22T19:31:22.8875213Z 2026-10-22T19:31:22.8875614Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-22T19:31:22.8876198Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:16:9] 2026-10-22T19:31:22.8876558Z 15 │ constructor() { 2026-10-22T19:31:22.8876924Z 16 │ source = this; 2026-10-22T19:31:22.8877191Z ·  ────── 2026-10-22T19:31:22.8877442Z 17 │ } 2026-10-22T19:31:22.8877652Z ╰──── 2026-10-22T19:31:22.8878227Z  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-22T19:31:22.8878675Z 2026-10-22T19:31:22.8878930Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.8879453Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:152:27] 2026-10-22T19:31:22.8880081Z 151 │ 2026-10-22T19:31:22.8880546Z 152 │ {props.children(open)} 2026-10-22T19:31:22.8880878Z ·  ──┬─ 2026-10-22T19:31:22.8881326Z · ╰── Cannot access ref value during render 2026-10-22T19:31:22.8881698Z 153 │ 2026-10-22T19:31:22.8881917Z ╰──── 2026-10-22T19:31:22.8882805Z  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-22T19:31:22.8884070Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.8884651Z 2026-10-22T19:31:22.8885037Z ⚠ react(memo-dependencies): Found missing/extra memoization dependencies 2026-10-22T19:31:22.8885613Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:140:9] 2026-10-22T19:31:22.8886016Z 139 │ if (action.id !== undefined) { 2026-10-22T19:31:22.8886311Z 140 │ props.onPressAction?.({ 2026-10-22T19:31:22.8886610Z ·  ──┬── 2026-10-22T19:31:22.8886992Z · ╰── Missing dependency `props` 2026-10-22T19:31:22.8887369Z 141 │ nativeEvent: { event: action.id }, 2026-10-22T19:31:22.8887808Z 142 │ } as Parameters>[0]); 2026-10-22T19:31:22.8888150Z 143 │ } 2026-10-22T19:31:22.8888353Z 144 │ }, 2026-10-22T19:31:22.8889106Z 145 │ [close, props.onPressAction], 2026-10-22T19:31:22.8889573Z ·  ─────────┬───────── 2026-10-22T19:31:22.8890101Z · ╰── Overly precise dependency `props.onPressAction`, use `props` instead 2026-10-22T19:31:22.8890530Z 146 │ ); 2026-10-22T19:31:22.8890711Z ╰──── 2026-10-22T19:31:22.8891600Z  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-22T19:31:22.8892905Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.8893396Z 2026-10-22T19:31:22.8893826Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T19:31:22.8894477Z ╭─[apps/mobile/src/components/ProjectFavicon.tsx:158:5] 2026-10-22T19:31:22.8895138Z 153 │ const [activeFaviconRequest, setActiveFaviconRequest] = useState(null); 2026-10-22T19:31:22.8895563Z 154 │ useLayoutEffect(() => { 2026-10-22T19:31:22.8895845Z ·  ───────┬─────── 2026-10-22T19:31:22.8896210Z · ╰── This is the containing effect 2026-10-22T19:31:22.8896588Z 155 │ if (faviconRequest === null) return; 2026-10-22T19:31:22.8896850Z 156 │ 2026-10-22T19:31:22.8897168Z 157 │ const endRequest = beginProjectFaviconRequest(faviconRequest); 2026-10-22T19:31:22.8897580Z 158 │ setActiveFaviconRequest(faviconRequest); 2026-10-22T19:31:22.8897946Z ·  ───────────┬─────────── 2026-10-22T19:31:22.8898452Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:22.8898866Z 159 │ return endRequest; 2026-10-22T19:31:22.8899095Z ╰──── 2026-10-22T19:31:22.8900189Z  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-22T19:31:22.8901657Z  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-22T19:31:22.8902184Z 2026-10-22T19:31:22.8902525Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-22T19:31:22.8903121Z ╭─[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9] 2026-10-22T19:31:22.8903525Z 35 │ ( 2026-10-22T19:31:22.8907416Z 267 │ 2026-10-22T19:31:22.8907986Z ·  ─────────────────────────────────────────────────────── 2026-10-22T19:31:22.8908358Z 268 │ 2026-10-22T19:31:22.8911865Z 1269 │ Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe( 2026-10-22T19:31:22.8912328Z ·  ────────────────────────── 2026-10-22T19:31:22.8912744Z 1270 │ Effect.mapError(() => AcpError.AcpRequestError.invalidParams()), 2026-10-22T19:31:22.8913087Z ╰──── 2026-10-22T19:31:22.8913187Z 2026-10-22T19:31:22.8913968Z ⚠ 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-22T19:31:22.8914924Z ╭─[packages/effect-acp/src/protocol.test.ts:500:31] 2026-10-22T19:31:22.8915240Z 499 │ 2026-10-22T19:31:22.8915520Z 500 │ const response = yield* Schema.decodeUnknownEffect( 2026-10-22T19:31:22.8915915Z ·  ────────────────────────── 2026-10-22T19:31:22.8916317Z 501 │ Schema.fromJsonString(JsonRpcErrorResponse), 2026-10-22T19:31:22.8916590Z ╰──── 2026-10-22T19:31:22.8916687Z 2026-10-22T19:31:22.8917126Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T19:31:22.8917749Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:68:5] 2026-10-22T19:31:22.8918178Z 66 │ const { id: attachmentId, fileUri } = attachment; 2026-10-22T19:31:22.8918469Z 67 │ useEffect(() => { 2026-10-22T19:31:22.8918728Z ·  ────┬──── 2026-10-22T19:31:22.8919073Z · ╰── This is the containing effect 2026-10-22T19:31:22.8919397Z 68 │ setUri(null); 2026-10-22T19:31:22.8919653Z ·  ───┬── 2026-10-22T19:31:22.8920070Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:22.8920469Z 69 │ setError(null); 2026-10-22T19:31:22.8920687Z ╰──── 2026-10-22T19:31:22.8921830Z  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-22T19:31:22.8923307Z  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-22T19:31:22.8923817Z 2026-10-22T19:31:22.8924733Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T19:31:22.8925428Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:91:7] 2026-10-22T19:31:22.8925757Z 90 │ }; 2026-10-22T19:31:22.8925996Z 91 │ }, [attachmentId, fileUri]); 2026-10-22T19:31:22.8926361Z ·  ──────┬───── ───┬─── 2026-10-22T19:31:22.8926868Z · │ ╰── Unnecessary dependency `fileUri` 2026-10-22T19:31:22.8927414Z · ╰── Unnecessary dependency `attachmentId` 2026-10-22T19:31:22.8927877Z 92 │ const mimeType = videoMimeType(attachment) ?? attachment.mimeType; 2026-10-22T19:31:22.8928212Z ╰──── 2026-10-22T19:31:22.8928808Z  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-22T19:31:22.8929869Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.8930398Z 2026-10-22T19:31:22.8930756Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-22T19:31:22.8931351Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:213:34] 2026-10-22T19:31:22.8931702Z 212 │ useEffect(() => { 2026-10-22T19:31:22.8932055Z 213 │ if (!isFocused && hasSource) props.onRequestClose(); 2026-10-22T19:31:22.8932425Z ·  ──┬── 2026-10-22T19:31:22.8932871Z · ╰── Missing dependency `props` 2026-10-22T19:31:22.8933310Z 214 │ }, [isFocused, hasSource, props.onRequestClose]); 2026-10-22T19:31:22.8933713Z ·  ──────────┬───────── 2026-10-22T19:31:22.8934300Z · ╰── Overly precise dependency `props.onRequestClose`, use `props` instead 2026-10-22T19:31:22.8934849Z 215 │ const { source } = props; 2026-10-22T19:31:22.8935090Z ╰──── 2026-10-22T19:31:22.8935879Z  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-22T19:31:22.8937031Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.8937542Z 2026-10-22T19:31:22.8938154Z ⚠ 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-22T19:31:22.8938868Z ╭─[packages/effect-acp/src/schema.test.ts:18:12] 2026-10-22T19:31:22.8939655Z 17 │ const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } }; 2026-10-22T19:31:22.8940150Z 18 │ expect(Schema.is(V1.AvailableCommand)(command)).toBe(true); 2026-10-22T19:31:22.8940491Z ·  ───────── 2026-10-22T19:31:22.8940749Z 19 │ expect( 2026-10-22T19:31:22.8940946Z ╰──── 2026-10-22T19:31:22.8941035Z 2026-10-22T19:31:22.8941607Z ⚠ 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-22T19:31:22.8942621Z ╭─[packages/effect-acp/src/schema.test.ts:20:7] 2026-10-22T19:31:22.8943032Z 19 │ expect( 2026-10-22T19:31:22.8943426Z 20 │ Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }), 2026-10-22T19:31:22.8943835Z ·  ───────── 2026-10-22T19:31:22.8944128Z 21 │ ).toBe(true); 2026-10-22T19:31:22.8944348Z ╰──── 2026-10-22T19:31:22.8944444Z 2026-10-22T19:31:22.8945285Z ⚠ 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-22T19:31:22.8946194Z ╭─[packages/effect-acp/src/errors.test.ts:129:28] 2026-10-22T19:31:22.8946562Z 128 │ const secret = "acp-summary-secret"; 2026-10-22T19:31:22.8946924Z 129 │ const cause = yield* Schema.decodeUnknownEffect( 2026-10-22T19:31:22.8947352Z ·  ────────────────────────── 2026-10-22T19:31:22.8947681Z 130 │ Schema.Struct({ 2026-10-22T19:31:22.8947921Z ╰──── 2026-10-22T19:31:22.8948017Z 2026-10-22T19:31:22.8948300Z ⚠ react(purity): Cannot call impure function during render 2026-10-22T19:31:22.8948827Z ╭─[apps/web/src/components/CustomSnoozeDialog.tsx:140:58] 2026-10-22T19:31:22.8949304Z 139 │ {...(weekStartsOn === undefined ? {} : { weekStartsOn })} 2026-10-22T19:31:22.8950680Z 140 │ disabled={{ before: new Date(new Date().setHours(0, 0, 0, 0)) }} 2026-10-22T19:31:22.8951132Z ·  ─────┬──── 2026-10-22T19:31:22.8951672Z · ╰── Cannot call impure function 2026-10-22T19:31:22.8952122Z 141 │ onSelect={(selected) => { 2026-10-22T19:31:22.8952405Z ╰──── 2026-10-22T19:31:22.8953004Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-22T19:31:22.8954013Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-22T19:31:22.8954500Z 2026-10-22T19:31:22.8954808Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.8956859Z ╭─[apps/mobile/src/components/ui/Menu.tsx:54:36] 2026-10-22T19:31:22.8957315Z 53 │ const child = children as ReactElement>; 2026-10-22T19:31:22.8958860Z 54 │ ╭─▶ children = cloneElement(child, { 2026-10-22T19:31:22.8959793Z 55 │ │ onTouchStart: (event) => { 2026-10-22T19:31:22.8960342Z 56 │ │ // Reset for a new touch, not onPressIn, which also fires when a 2026-10-22T19:31:22.8960900Z 57 │ │ // finger moves out of the row and back during the same gesture. 2026-10-22T19:31:22.8961425Z 58 │ │ menuPress.current.isPreparing = false; 2026-10-22T19:31:22.8961990Z 59 │ │ menuPress.current.suppressPress = menuPress.current.isOpen; 2026-10-22T19:31:22.8962529Z 60 │ │ pendingPress.current = null; 2026-10-22T19:31:22.8962829Z 61 │ │ child.props.onTouchStart?.(event); 2026-10-22T19:31:22.8963102Z 62 │ │ }, 2026-10-22T19:31:22.8963399Z 63 │ │ onPress: (event) => { 2026-10-22T19:31:22.8963903Z 64 │ │ // Accessibility clicks have no touch identifier and must not inherit 2026-10-22T19:31:22.8964445Z 65 │ │ // cancellation from a previous physical gesture. 2026-10-22T19:31:22.8964979Z 66 │ │ const isTouch = typeof event.nativeEvent.identifier === "number"; 2026-10-22T19:31:22.8965396Z 67 │ │ if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) { 2026-10-22T19:31:22.8965724Z 68 │ │ return; 2026-10-22T19:31:22.8965958Z 69 │ │ } 2026-10-22T19:31:22.8966233Z 70 │ │ if (isTouch && menuPress.current.isPreparing) { 2026-10-22T19:31:22.8966629Z 71 │ │ // A release can arrive between native menu preparation and display. 2026-10-22T19:31:22.8967013Z 72 │ │ // Let UIKit's display/cancel callback decide this press's outcome. 2026-10-22T19:31:22.8967329Z 73 │ │ event.persist(); 2026-10-22T19:31:22.8967656Z 74 │ │ pendingPress.current = () => child.props.onPress?.(event); 2026-10-22T19:31:22.8968068Z 75 │ │ return; 2026-10-22T19:31:22.8968406Z 76 │ │ } 2026-10-22T19:31:22.8968798Z 77 │ │ child.props.onPress?.(event); 2026-10-22T19:31:22.8969163Z 78 │ │ }, 2026-10-22T19:31:22.8969582Z 79 │ ├─▶ }); 2026-10-22T19:31:22.8970293Z · ╰──── Passing a ref to a function may read its value during render 2026-10-22T19:31:22.8970903Z 80 │ menuProps.onMenuInteractionStart = () => { 2026-10-22T19:31:22.8971197Z ╰──── 2026-10-22T19:31:22.8971913Z  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-22T19:31:22.8972932Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.8973257Z 2026-10-22T19:31:22.8973602Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-22T19:31:22.9010237Z ╭─[apps/mobile/src/lib/markdownDocument.ts:138:28] 2026-10-22T19:31:22.9010706Z 137 │ visit(parser.parse(markdown)); 2026-10-22T19:31:22.9010931Z 138 │ for (const edit of edits.reverse()) 2026-10-22T19:31:22.9011187Z ·  ─────── 2026-10-22T19:31:22.9011505Z 139 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-22T19:31:22.9011759Z ╰──── 2026-10-22T19:31:22.9012146Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-22T19:31:22.9012427Z 2026-10-22T19:31:22.9012689Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-22T19:31:22.9013063Z ╭─[apps/mobile/src/lib/markdownDocument.ts:169:28] 2026-10-22T19:31:22.9013320Z 168 │ visit(parser.parse(markdown)); 2026-10-22T19:31:22.9013536Z 169 │ for (const edit of edits.reverse()) 2026-10-22T19:31:22.9013758Z ·  ─────── 2026-10-22T19:31:22.9014071Z 170 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-22T19:31:22.9014317Z ╰──── 2026-10-22T19:31:22.9014745Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-22T19:31:22.9015103Z 2026-10-22T19:31:22.9015398Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-22T19:31:22.9015860Z ╭─[apps/mobile/src/lib/markdownDocument.ts:223:38] 2026-10-22T19:31:22.9016157Z 222 │ visit(parser.parse(markdown)); 2026-10-22T19:31:22.9016569Z 223 │ for (const lineStart of lineStarts.reverse()) { 2026-10-22T19:31:22.9016959Z ·  ─────── 2026-10-22T19:31:22.9017415Z 224 │ // The header row may be a lazy line without its container markers (`>` or list indent), 2026-10-22T19:31:22.9017688Z ╰──── 2026-10-22T19:31:22.9018041Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-22T19:31:22.9018315Z 2026-10-22T19:31:22.9018551Z ⚠ eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used. 2026-10-22T19:31:22.9018875Z ╭─[apps/web/src/types.ts:22:3] 2026-10-22T19:31:22.9019085Z 21 │ EnvironmentThreadShell, 2026-10-22T19:31:22.9019273Z 22 │ ThreadRunSummary, 2026-10-22T19:31:22.9019478Z ·  ────────┬─────── 2026-10-22T19:31:22.9019754Z · ╰── 'ThreadRunSummary' is imported here 2026-10-22T19:31:22.9020013Z 23 │ ThreadRuntimeSummary, 2026-10-22T19:31:22.9020169Z ╰──── 2026-10-22T19:31:22.9020395Z  help: Consider removing this import. 2026-10-22T19:31:22.9020532Z 2026-10-22T19:31:22.9020732Z ⚠ react(purity): Cannot call impure function during render 2026-10-22T19:31:22.9021092Z ╭─[apps/web/src/components/chat/useThreadLifecycle.tsx:178:58] 2026-10-22T19:31:22.9021385Z 177 │ if (snoozeClockState.shell !== activeThreadShell) { 2026-10-22T19:31:22.9021708Z 178 │ setSnoozeClockState({ shell: activeThreadShell, now: new Date().toISOString() }); 2026-10-22T19:31:22.9022034Z ·  ─────┬──── 2026-10-22T19:31:22.9022677Z · ╰── Cannot call impure function 2026-10-22T19:31:22.9022996Z 179 │ } 2026-10-22T19:31:22.9023193Z ╰──── 2026-10-22T19:31:22.9023623Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-22T19:31:22.9024725Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-22T19:31:22.9025241Z 2026-10-22T19:31:22.9026098Z ⚠ 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-22T19:31:22.9027230Z ╭─[apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts:223:5] 2026-10-22T19:31:22.9027681Z 222 │ let idlePasses = 0; 2026-10-22T19:31:22.9028098Z 223 │ ╭─▶ for (;;) { 2026-10-22T19:31:22.9028607Z 224 │ │ yield* Effect.promise(() => Promise.resolve()); 2026-10-22T19:31:22.9029118Z 225 │ │ const pending = backgroundRuntime.pending.shift(); 2026-10-22T19:31:22.9029703Z 226 │ │ if (!pending) { 2026-10-22T19:31:22.9030063Z 227 │ │ idlePasses++; 2026-10-22T19:31:22.9030440Z 228 │ │ if (idlePasses >= 3) { 2026-10-22T19:31:22.9030797Z 229 │ │ return; 2026-10-22T19:31:22.9031123Z 230 │ │ } 2026-10-22T19:31:22.9031456Z 231 │ │ continue; 2026-10-22T19:31:22.9031782Z 232 │ │ } 2026-10-22T19:31:22.9032122Z 233 │ │ idlePasses = 0; 2026-10-22T19:31:22.9032533Z 234 │ │ const exit = yield* Effect.exit( 2026-10-22T19:31:22.9033158Z 235 │ │ pending.operation as Effect.Effect, 2026-10-22T19:31:22.9033678Z 236 │ │ ); 2026-10-22T19:31:22.9034045Z 237 │ │ yield* Effect.sync(() => { 2026-10-22T19:31:22.9034454Z 238 │ │ pending.resolve(exit); 2026-10-22T19:31:22.9034854Z 239 │ │ }); 2026-10-22T19:31:22.9035229Z 240 │ ╰─▶ } 2026-10-22T19:31:22.9035594Z 241 │ }, 2026-10-22T19:31:22.9035826Z ╰──── 2026-10-22T19:31:22.9035939Z 2026-10-22T19:31:22.9036264Z ⚠ react(purity): Cannot call impure function during render 2026-10-22T19:31:22.9036798Z ╭─[apps/web/src/hooks/useThreadActions.ts:821:56] 2026-10-22T19:31:22.9037236Z 820 │ const resolved = resolveThreadTarget(target); 2026-10-22T19:31:22.9037732Z 821 │ if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) { 2026-10-22T19:31:22.9038158Z ·  ─────┬──── 2026-10-22T19:31:22.9038486Z · ╰── Cannot call impure function 2026-10-22T19:31:22.9038884Z 822 │ return AsyncResult.failure( 2026-10-22T19:31:22.9039057Z ╰──── 2026-10-22T19:31:22.9039731Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-22T19:31:22.9040660Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-22T19:31:22.9041098Z 2026-10-22T19:31:22.9041295Z ⚠ react(purity): Cannot call impure function during render 2026-10-22T19:31:22.9041621Z ╭─[apps/web/src/hooks/useThreadActions.ts:709:46] 2026-10-22T19:31:22.9041858Z 708 │ const wokeAt = resolved 2026-10-22T19:31:22.9042120Z 709 │ ? threadWokeAt(resolved.thread, { now: new Date().toISOString() }) 2026-10-22T19:31:22.9042416Z ·  ─────┬──── 2026-10-22T19:31:22.9042735Z · ╰── Cannot call impure function 2026-10-22T19:31:22.9042981Z 710 │ : null; 2026-10-22T19:31:22.9043124Z ╰──── 2026-10-22T19:31:22.9043615Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-22T19:31:22.9044477Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-22T19:31:22.9044868Z 2026-10-22T19:31:22.9045206Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-22T19:31:22.9045710Z ╭─[apps/web/src/components/settings/SettingInheritance.tsx:163:24] 2026-10-22T19:31:22.9046094Z 162 │ keys, 2026-10-22T19:31:22.9046256Z 163 │ overridingProjects = [], 2026-10-22T19:31:22.9046464Z ·  ── 2026-10-22T19:31:22.9046665Z 164 │ onClearOverrides, 2026-10-22T19:31:22.9046820Z ╰──── 2026-10-22T19:31:22.9047238Z  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-22T19:31:22.9047712Z 2026-10-22T19:31:22.9048029Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-22T19:31:22.9048446Z ╭─[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:116:34] 2026-10-22T19:31:22.9048723Z 115 │ return [...commands]; 2026-10-22T19:31:22.9049083Z 116 │ }, [activeThreadRef, pathname, registrationVersion, navigation]); 2026-10-22T19:31:22.9049538Z ·  ─────────┬───────── 2026-10-22T19:31:22.9050126Z · ╰── Unnecessary dependency `registrationVersion` 2026-10-22T19:31:22.9050397Z 117 │ 2026-10-22T19:31:22.9050539Z ╰──── 2026-10-22T19:31:22.9051082Z  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-22T19:31:22.9052213Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9052694Z 2026-10-22T19:31:22.9053185Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T19:31:22.9053897Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:60:5] 2026-10-22T19:31:22.9054666Z 57 │ 2026-10-22T19:31:22.9055011Z 58 │ useEffect(() => { 2026-10-22T19:31:22.9055290Z ·  ────┬──── 2026-10-22T19:31:22.9055691Z · ╰── This is the containing effect 2026-10-22T19:31:22.9056116Z 59 │ const controller = new AbortController(); 2026-10-22T19:31:22.9056462Z 60 │ setLoadState("pending"); 2026-10-22T19:31:22.9056775Z ·  ──────┬───── 2026-10-22T19:31:22.9057245Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:22.9057848Z 61 │ // A renewed signature is used on Retry, not as a reason to reset the native player. 2026-10-22T19:31:22.9058241Z ╰──── 2026-10-22T19:31:22.9059485Z  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-22T19:31:22.9061095Z  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-22T19:31:22.9061675Z 2026-10-22T19:31:22.9062070Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T19:31:22.9062707Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:71:7] 2026-10-22T19:31:22.9063138Z 70 │ return () => controller.abort(); 2026-10-22T19:31:22.9063523Z 71 │ }, [player, props.playRequested, attempt]); 2026-10-22T19:31:22.9064072Z ·  ───┬── ─────────┬───────── ───┬─── 2026-10-22T19:31:22.9064863Z · │ │ ╰── Unnecessary dependency `attempt` 2026-10-22T19:31:22.9065610Z · │ ╰── Unnecessary dependency `props.playRequested` 2026-10-22T19:31:22.9066203Z · ╰── Unnecessary dependency `player_0` 2026-10-22T19:31:22.9066549Z 72 │ 2026-10-22T19:31:22.9066739Z ╰──── 2026-10-22T19:31:22.9067360Z  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-22T19:31:22.9068394Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9068741Z 2026-10-22T19:31:22.9069185Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-22T19:31:22.9070001Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10555:7] 2026-10-22T19:31:22.9070420Z 10554 │ 2026-10-22T19:31:22.9070664Z 10555 │ const layer: Layer.Layer< 2026-10-22T19:31:22.9070961Z ·  ──┬── 2026-10-22T19:31:22.9071353Z · ╰── 'layer' is declared here 2026-10-22T19:31:22.9071792Z 10556 │ ProviderAdapter.ProviderAdapterV2, 2026-10-22T19:31:22.9072084Z ╰──── 2026-10-22T19:31:22.9072380Z  help: Consider removing this declaration. 2026-10-22T19:31:22.9072598Z 2026-10-22T19:31:22.9073275Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-22T19:31:22.9073918Z ╭─[apps/mobile/src/lib/useHoverGesture.ts:8:15] 2026-10-22T19:31:22.9074249Z 7 │ () => 2026-10-22T19:31:22.9074490Z 8 │ Gesture.Hover() 2026-10-22T19:31:22.9074942Z ·  ──┬── 2026-10-22T19:31:22.9075345Z · ╰── `Hover` may be a component 2026-10-22T19:31:22.9075743Z 9 │ .manualActivation(true) 2026-10-22T19:31:22.9076015Z ╰──── 2026-10-22T19:31:22.9076638Z  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-22T19:31:22.9077949Z  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-22T19:31:22.9078732Z 2026-10-22T19:31:22.9079240Z ⚠ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'. 2026-10-22T19:31:22.9079977Z ╭─[apps/web/src/components/preview/PreviewPanelShell.tsx:61:9] 2026-10-22T19:31:22.9080362Z 60 │ ) { 2026-10-22T19:31:22.9080775Z 61 │ const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded"; 2026-10-22T19:31:22.9081243Z ·  ──────┬────── 2026-10-22T19:31:22.9081663Z · ╰── 'useDragRegion' is declared here 2026-10-22T19:31:22.9082077Z 62 │ const isInline = props.mode === "inline"; 2026-10-22T19:31:22.9082361Z ╰──── 2026-10-22T19:31:22.9082656Z  help: Consider removing this declaration. 2026-10-22T19:31:22.9082876Z 2026-10-22T19:31:22.9083503Z ⚠ eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'. 2026-10-22T19:31:22.9084369Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1432:7] 2026-10-22T19:31:22.9084811Z 1431 │ 2026-10-22T19:31:22.9085162Z 1432 │ const layerCodexAppServerClientFactoryCommand = ( 2026-10-22T19:31:22.9085615Z ·  ───────────────────┬─────────────────── 2026-10-22T19:31:22.9086175Z · ╰── 'layerCodexAppServerClientFactoryCommand' is declared here 2026-10-22T19:31:22.9086760Z 1433 │ options: CodexClient.CodexAppServerClientOptions & { 2026-10-22T19:31:22.9087097Z ╰──── 2026-10-22T19:31:22.9087383Z  help: Consider removing this declaration. 2026-10-22T19:31:22.9087831Z 2026-10-22T19:31:22.9088394Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-22T19:31:22.9089136Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1668:7] 2026-10-22T19:31:22.9089546Z 1667 │ 2026-10-22T19:31:22.9089802Z 1668 │ const layer: Layer.Layer< 2026-10-22T19:31:22.9090110Z ·  ──┬── 2026-10-22T19:31:22.9090492Z · ╰── 'layer' is declared here 2026-10-22T19:31:22.9090908Z 1669 │ ProviderAdapter.ProviderAdapterV2, 2026-10-22T19:31:22.9091207Z ╰──── 2026-10-22T19:31:22.9091482Z  help: Consider removing this declaration. 2026-10-22T19:31:22.9091706Z 2026-10-22T19:31:22.9091978Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9092535Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39] 2026-10-22T19:31:22.9092938Z 276 │ 2026-10-22T19:31:22.9093384Z 277 │ ╭─▶ return createElement(RawNativeView, { 2026-10-22T19:31:22.9093893Z 278 │ │ ...nativeProps, 2026-10-22T19:31:22.9094347Z 279 │ │ refreshEnabled: props.onPullToRefresh !== undefined, 2026-10-22T19:31:22.9094819Z 280 │ │ ref: nativeRef, 2026-10-22T19:31:22.9095254Z 281 │ ├─▶ }); 2026-10-22T19:31:22.9095803Z · ╰──── Passing a ref to a function may read its value during render 2026-10-22T19:31:22.9096135Z 282 │ } 2026-10-22T19:31:22.9096290Z ╰──── 2026-10-22T19:31:22.9096906Z  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-22T19:31:22.9098159Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9098501Z 2026-10-22T19:31:22.9098763Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-22T19:31:22.9099221Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:1998:15] 2026-10-22T19:31:22.9099494Z 1997 │ assert.equal( 2026-10-22T19:31:22.9099790Z 1998 │ items.filter((item) => item.type === "assistant_message").at(-1)?.text, 2026-10-22T19:31:22.9100228Z ·  ────── 2026-10-22T19:31:22.9100539Z 1999 │ "authoritative answer", 2026-10-22T19:31:22.9100731Z ╰──── 2026-10-22T19:31:22.9100986Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-22T19:31:22.9101188Z 2026-10-22T19:31:22.9101946Z ⚠ 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-22T19:31:22.9102716Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:3951:7] 2026-10-22T19:31:22.9103143Z 3950 │ const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped); 2026-10-22T19:31:22.9103772Z 3951 │ ╭─▶ while (!responseLifecycle.includes("failed")) { 2026-10-22T19:31:22.9104388Z 3952 │ │ yield* Effect.yieldNow; 2026-10-22T19:31:22.9104767Z 3953 │ ╰─▶ } 2026-10-22T19:31:22.9105079Z 3954 │ const responseExit = yield* Fiber.join(responseFiber); 2026-10-22T19:31:22.9105292Z ╰──── 2026-10-22T19:31:22.9105373Z 2026-10-22T19:31:22.9106089Z ⚠ 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-22T19:31:22.9106985Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6062:9] 2026-10-22T19:31:22.9107330Z 6061 │ .pipe(Effect.forkScoped); 2026-10-22T19:31:22.9107891Z 6062 │ ╭─▶ while (promptGates.length < 1) { 2026-10-22T19:31:22.9108505Z 6063 │ │ yield* Effect.yieldNow; 2026-10-22T19:31:22.9109032Z 6064 │ ╰─▶ } 2026-10-22T19:31:22.9109864Z 6065 │ assert.isDefined(sessionUpdateHandler, "session update handler must be wired"); 2026-10-22T19:31:22.9110259Z ╰──── 2026-10-22T19:31:22.9110346Z 2026-10-22T19:31:22.9110865Z ⚠ 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-22T19:31:22.9111526Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6197:9] 2026-10-22T19:31:22.9111842Z 6196 │ .pipe(Effect.forkScoped); 2026-10-22T19:31:22.9112187Z 6197 │ ╭─▶ while (promptGates.length < 2) { 2026-10-22T19:31:22.9112538Z 6198 │ │ yield* Effect.yieldNow; 2026-10-22T19:31:22.9112833Z 6199 │ ╰─▶ } 2026-10-22T19:31:22.9113176Z 6200 │ if (sessionUpdateHandler === undefined || capturedMutation.current === null) { 2026-10-22T19:31:22.9113425Z ╰──── 2026-10-22T19:31:22.9113496Z 2026-10-22T19:31:22.9113800Z ⚠ eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used. 2026-10-22T19:31:22.9114285Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:960:10] 2026-10-22T19:31:22.9114630Z 959 │ 2026-10-22T19:31:22.9114841Z 960 │ function layerClaudeAgentSdkReplayQueryRunner( 2026-10-22T19:31:22.9115265Z ·  ──────────────────┬───────────────── 2026-10-22T19:31:22.9115911Z · ╰── 'layerClaudeAgentSdkReplayQueryRunner' is declared here 2026-10-22T19:31:22.9116388Z 961 │ transcript: ClaudeAgentSdkReplayTranscript, 2026-10-22T19:31:22.9116680Z ╰──── 2026-10-22T19:31:22.9116874Z  help: Consider removing this declaration. 2026-10-22T19:31:22.9117005Z 2026-10-22T19:31:22.9117332Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T19:31:22.9118287Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:107:5] 2026-10-22T19:31:22.9118682Z 104 │ 2026-10-22T19:31:22.9118895Z 105 │ useEffect(() => { 2026-10-22T19:31:22.9119153Z ·  ────┬──── 2026-10-22T19:31:22.9119473Z · ╰── This is the containing effect 2026-10-22T19:31:22.9119736Z 106 │ clearReviewCommentTarget(); 2026-10-22T19:31:22.9119978Z 107 │ setPendingNativeCommentSelection(null); 2026-10-22T19:31:22.9120314Z ·  ────────────────┬─────────────── 2026-10-22T19:31:22.9120694Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:22.9120984Z 108 │ }, [selectedSection?.id]); 2026-10-22T19:31:22.9121218Z ╰──── 2026-10-22T19:31:22.9121996Z  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-22T19:31:22.9123027Z  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-22T19:31:22.9123402Z 2026-10-22T19:31:22.9123709Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T19:31:22.9124306Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7] 2026-10-22T19:31:22.9124705Z 109 │ 2026-10-22T19:31:22.9124868Z 110 │ useEffect(() => { 2026-10-22T19:31:22.9125061Z ·  ────┬──── 2026-10-22T19:31:22.9125320Z · ╰── This is the containing effect 2026-10-22T19:31:22.9125590Z 111 │ if (activeCommentTarget === null) { 2026-10-22T19:31:22.9125823Z 112 │ setPendingNativeCommentSelection(null); 2026-10-22T19:31:22.9126101Z ·  ────────────────┬─────────────── 2026-10-22T19:31:22.9126457Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:22.9126801Z 113 │ } 2026-10-22T19:31:22.9126937Z ╰──── 2026-10-22T19:31:22.9127658Z  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-22T19:31:22.9128795Z  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-22T19:31:22.9129133Z 2026-10-22T19:31:22.9129439Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T19:31:22.9129936Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7] 2026-10-22T19:31:22.9130314Z 107 │ setPendingNativeCommentSelection(null); 2026-10-22T19:31:22.9130580Z 108 │ }, [selectedSection?.id]); 2026-10-22T19:31:22.9130801Z ·  ─────────┬───────── 2026-10-22T19:31:22.9131112Z · ╰── Unnecessary dependency `selectedSection?.id` 2026-10-22T19:31:22.9131371Z 109 │ 2026-10-22T19:31:22.9131517Z ╰──── 2026-10-22T19:31:22.9132095Z  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-22T19:31:22.9133111Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9133600Z 2026-10-22T19:31:22.9133913Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T19:31:22.9134406Z ╭─[apps/mobile/src/features/review/ReviewCommentComposerSheet.tsx:103:7] 2026-10-22T19:31:22.9134840Z 100 │ 2026-10-22T19:31:22.9135018Z 101 │ useEffect(() => { 2026-10-22T19:31:22.9135194Z ·  ────┬──── 2026-10-22T19:31:22.9135461Z · ╰── This is the containing effect 2026-10-22T19:31:22.9135899Z 102 │ if (!target || selectedLines.length === 0) { 2026-10-22T19:31:22.9136274Z 103 │ setHighlightedLinesById({}); 2026-10-22T19:31:22.9136694Z ·  ───────────┬─────────── 2026-10-22T19:31:22.9137181Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:22.9137638Z 104 │ return; 2026-10-22T19:31:22.9137866Z ╰──── 2026-10-22T19:31:22.9138811Z  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-22T19:31:22.9140008Z  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-22T19:31:22.9140352Z 2026-10-22T19:31:22.9140714Z ⚠ eslint(no-unused-vars): Variable 'layerDaemon' is declared but never used. Unused variables should start with a '_'. 2026-10-22T19:31:22.9141436Z ╭─[apps/server/src/orchestration-v2/EffectWorker.ts:911:7] 2026-10-22T19:31:22.9141796Z 910 │ 2026-10-22T19:31:22.9142258Z 911 │ const layerDaemon: Layer.Layer = Layer.effectDiscard( 2026-10-22T19:31:22.9142664Z ·  ─────┬───── 2026-10-22T19:31:22.9142984Z · ╰── 'layerDaemon' is declared here 2026-10-22T19:31:22.9143402Z 912 │ runDaemon.pipe(Effect.forkScoped), 2026-10-22T19:31:22.9143753Z ╰──── 2026-10-22T19:31:22.9144046Z  help: Consider removing this declaration. 2026-10-22T19:31:22.9144188Z 2026-10-22T19:31:22.9144453Z ⚠ eslint(no-unused-vars): Identifier 'HostProcess' is imported but never used. 2026-10-22T19:31:22.9145069Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:25:13] 2026-10-22T19:31:22.9145474Z 24 │ import * as Schema from "effect/Schema"; 2026-10-22T19:31:22.9145839Z 25 │ import * as HostProcess from "@t3tools/shared/HostProcess"; 2026-10-22T19:31:22.9146105Z ·  ─────┬───── 2026-10-22T19:31:22.9146392Z · ╰── 'HostProcess' is imported here 2026-10-22T19:31:22.9146625Z 26 │ 2026-10-22T19:31:22.9146764Z ╰──── 2026-10-22T19:31:22.9147022Z  help: Consider removing this import. 2026-10-22T19:31:22.9147233Z 2026-10-22T19:31:22.9147910Z ⚠ eslint(no-unused-vars): Variable 'serverConfig' is declared but never used. Unused variables should start with a '_'. 2026-10-22T19:31:22.9148846Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:124:11] 2026-10-22T19:31:22.9149369Z 123 │ const path = yield* Path.Path; 2026-10-22T19:31:22.9149892Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-22T19:31:22.9150150Z ·  ──────┬───── 2026-10-22T19:31:22.9150424Z · ╰── 'serverConfig' is declared here 2026-10-22T19:31:22.9150858Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-22T19:31:22.9151094Z ╰──── 2026-10-22T19:31:22.9151275Z  help: Consider removing this declaration. 2026-10-22T19:31:22.9151413Z 2026-10-22T19:31:22.9151806Z ⚠ eslint(no-unused-vars): Variable 'serverSettings' is declared but never used. Unused variables should start with a '_'. 2026-10-22T19:31:22.9152291Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:125:11] 2026-10-22T19:31:22.9152698Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-22T19:31:22.9152996Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-22T19:31:22.9153278Z ·  ───────┬────── 2026-10-22T19:31:22.9153550Z · ╰── 'serverSettings' is declared here 2026-10-22T19:31:22.9153865Z 126 │ const gitWorkflow = yield* GitWorkflowService.GitWorkflowService; 2026-10-22T19:31:22.9154151Z ╰──── 2026-10-22T19:31:22.9154347Z  help: Consider removing this declaration. 2026-10-22T19:31:22.9154489Z 2026-10-22T19:31:22.9154866Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-22T19:31:22.9155265Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:223:31] 2026-10-22T19:31:22.9155664Z 222 │ ? snippetTokens.map((line, lineIndex) => ( 2026-10-22T19:31:22.9156058Z 223 │ 2026-10-22T19:31:22.9156438Z ·  ─────────────── 2026-10-22T19:31:22.9156818Z 224 │ {lineIndex > 0 ? "\n" : ""} 2026-10-22T19:31:22.9157109Z ╰──── 2026-10-22T19:31:22.9157451Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-22T19:31:22.9157713Z 2026-10-22T19:31:22.9158036Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-22T19:31:22.9158971Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25] 2026-10-22T19:31:22.9159478Z 226 │ { 2026-10-22T19:31:22.9163489Z ·  ────┬──── 2026-10-22T19:31:22.9163856Z · ╰── This is the containing effect 2026-10-22T19:31:22.9164112Z 119 │ void refreshNotifications(); 2026-10-22T19:31:22.9164327Z ·  ──────────┬───────── 2026-10-22T19:31:22.9164702Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:22.9165061Z 120 │ const subscription = AppState.addEventListener("change", (state) => { 2026-10-22T19:31:22.9165294Z ╰──── 2026-10-22T19:31:22.9166023Z  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-22T19:31:22.9167029Z  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-22T19:31:22.9167361Z 2026-10-22T19:31:22.9167652Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T19:31:22.9168153Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7] 2026-10-22T19:31:22.9168557Z 125 │ 2026-10-22T19:31:22.9168710Z 126 │ useEffect(() => { 2026-10-22T19:31:22.9168890Z ·  ────┬──── 2026-10-22T19:31:22.9169305Z · ╰── This is the containing effect 2026-10-22T19:31:22.9169535Z 127 │ if (!isLoaded) { 2026-10-22T19:31:22.9169795Z 128 │ setLiveActivityStatus("checking"); 2026-10-22T19:31:22.9170129Z ·  ──────────┬────────── 2026-10-22T19:31:22.9170442Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:22.9170886Z 129 │ return; 2026-10-22T19:31:22.9171027Z ╰──── 2026-10-22T19:31:22.9172037Z  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-22T19:31:22.9173013Z  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-22T19:31:22.9173345Z 2026-10-22T19:31:22.9173912Z ⚠ 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-22T19:31:22.9174573Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:50:18] 2026-10-22T19:31:22.9175050Z 49 │ for (const tool of ["sendMessage", "followupTask", "interruptAgent", "listAgents"]) { 2026-10-22T19:31:22.9175559Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-22T19:31:22.9175958Z ·  ───────── 2026-10-22T19:31:22.9176363Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-22T19:31:22.9176824Z ╰──── 2026-10-22T19:31:22.9176900Z 2026-10-22T19:31:22.9177280Z ⚠ 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-22T19:31:22.9177952Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:51:18] 2026-10-22T19:31:22.9178439Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-22T19:31:22.9178973Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-22T19:31:22.9179292Z ·  ───────── 2026-10-22T19:31:22.9179485Z 52 │ } 2026-10-22T19:31:22.9179716Z ╰──── 2026-10-22T19:31:22.9179836Z 2026-10-22T19:31:22.9180262Z ⚠ 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-22T19:31:22.9180880Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:55:5] 2026-10-22T19:31:22.9181137Z 54 │ assert.equal( 2026-10-22T19:31:22.9181545Z 55 │ Schema.is(CodexSchema.ServerNotification__CollabAgentToolCallStatus)("interrupted"), 2026-10-22T19:31:22.9181939Z ·  ───────── 2026-10-22T19:31:22.9182102Z 56 │ true, 2026-10-22T19:31:22.9182233Z ╰──── 2026-10-22T19:31:22.9182298Z 2026-10-22T19:31:22.9183998Z ⚠ 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-22T19:31:22.9184751Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:59:5] 2026-10-22T19:31:22.9185001Z 58 │ assert.equal( 2026-10-22T19:31:22.9185290Z 59 │ Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentToolCallStatus)("interrupted"), 2026-10-22T19:31:22.9185599Z ·  ───────── 2026-10-22T19:31:22.9185896Z 60 │ true, 2026-10-22T19:31:22.9186082Z ╰──── 2026-10-22T19:31:22.9186150Z 2026-10-22T19:31:22.9186511Z ⚠ 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-22T19:31:22.9187020Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:103:16] 2026-10-22T19:31:22.9187255Z 102 │ 2026-10-22T19:31:22.9187518Z 103 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse)(resumeResponse), true); 2026-10-22T19:31:22.9187804Z ·  ───────── 2026-10-22T19:31:22.9187982Z 104 │ }); 2026-10-22T19:31:22.9188113Z ╰──── 2026-10-22T19:31:22.9188187Z 2026-10-22T19:31:22.9188363Z ⚠ react(immutability): This value cannot be modified 2026-10-22T19:31:22.9188858Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5] 2026-10-22T19:31:22.9189180Z 90 │ }) { 2026-10-22T19:31:22.9189376Z 91 │ const rotation = useSharedValue(props.hidden ? 1 : 0); 2026-10-22T19:31:22.9189864Z ·  ────┬─── 2026-10-22T19:31:22.9190255Z · ╰── `rotation` originates here 2026-10-22T19:31:22.9190488Z 92 │ useLayoutEffect(() => { 2026-10-22T19:31:22.9190751Z 93 │ rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING); 2026-10-22T19:31:22.9190994Z ·  ────┬─── 2026-10-22T19:31:22.9191242Z · ╰── `rotation` cannot be modified 2026-10-22T19:31:22.9191502Z 94 │ }, [props.hidden, rotation]); 2026-10-22T19:31:22.9191782Z ╰──── 2026-10-22T19:31:22.9192150Z  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-22T19:31:22.9192781Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T19:31:22.9193099Z 2026-10-22T19:31:22.9193278Z ⚠ react(immutability): This value cannot be modified 2026-10-22T19:31:22.9193645Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:269:5] 2026-10-22T19:31:22.9193949Z 266 │ const variant = props.variant ?? "plain"; 2026-10-22T19:31:22.9194231Z 267 │ const loadingVisibility = useSharedValue(props.loading ? 1 : 0); 2026-10-22T19:31:22.9194528Z ·  ────────┬──────── 2026-10-22T19:31:22.9195038Z · ╰── `loadingVisibility` originates here 2026-10-22T19:31:22.9195282Z 268 │ useLayoutEffect(() => { 2026-10-22T19:31:22.9195566Z 269 │ loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING); 2026-10-22T19:31:22.9195948Z ·  ────────┬──────── 2026-10-22T19:31:22.9196219Z · ╰── `loadingVisibility` cannot be modified 2026-10-22T19:31:22.9196494Z 270 │ }, [loadingVisibility, props.loading]); 2026-10-22T19:31:22.9196676Z ╰──── 2026-10-22T19:31:22.9197044Z  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-22T19:31:22.9197657Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T19:31:22.9197973Z 2026-10-22T19:31:22.9198157Z ⚠ react(immutability): This value cannot be modified 2026-10-22T19:31:22.9198665Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:328:5] 2026-10-22T19:31:22.9198962Z 325 │ }) { 2026-10-22T19:31:22.9199211Z 326 │ const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0); 2026-10-22T19:31:22.9199512Z ·  ─────────┬───────── 2026-10-22T19:31:22.9199787Z · ╰── `recordingVisibility` originates here 2026-10-22T19:31:22.9200040Z 327 │ useLayoutEffect(() => { 2026-10-22T19:31:22.9200348Z 328 │ recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING); 2026-10-22T19:31:22.9200660Z ·  ─────────┬───────── 2026-10-22T19:31:22.9201358Z · ╰── `recordingVisibility` cannot be modified 2026-10-22T19:31:22.9201742Z 329 │ }, [props.phase, recordingVisibility]); 2026-10-22T19:31:22.9202003Z ╰──── 2026-10-22T19:31:22.9202511Z  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-22T19:31:22.9203136Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T19:31:22.9203609Z 2026-10-22T19:31:22.9203859Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T19:31:22.9204441Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:454:7] 2026-10-22T19:31:22.9204802Z 453 │ showAuxiliaryPane("inspector"); 2026-10-22T19:31:22.9205037Z 454 │ }, [environmentId, showAuxiliaryPane, threadId]); 2026-10-22T19:31:22.9205343Z ·  ──────┬────── ────┬─── 2026-10-22T19:31:22.9205736Z · │ ╰── Unnecessary dependency `threadId` 2026-10-22T19:31:22.9206200Z · ╰── Unnecessary dependency `environmentId` 2026-10-22T19:31:22.9206575Z 455 │ const { 2026-10-22T19:31:22.9206712Z ╰──── 2026-10-22T19:31:22.9207110Z  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-22T19:31:22.9207921Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9208246Z 2026-10-22T19:31:22.9208461Z ⚠ react(static-components): Cannot create components during render 2026-10-22T19:31:22.9208817Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:725:20] 2026-10-22T19:31:22.9209053Z 492 │ // same check. 2026-10-22T19:31:22.9209286Z 493 │ const NativeReviewDiffView = resolveNativeReviewDiffView(); 2026-10-22T19:31:22.9209583Z ·  ─────────────┬───────────── 2026-10-22T19:31:22.9209927Z · ╰── The component is created during render here 2026-10-22T19:31:22.9210289Z 494 │ const nativeReviewDiffViewRef = useRef(null); 2026-10-22T19:31:22.9210601Z 495 │ const showcasedReviewDrawRef = useRef(null); 2026-10-22T19:31:22.9210898Z 496 │ const [isPullRefreshing, setIsPullRefreshing] = useState(false); 2026-10-22T19:31:22.9211262Z 497 │ const handlePullToRefresh = async () => { 2026-10-22T19:31:22.9211517Z 498 │ setIsPullRefreshing(true); 2026-10-22T19:31:22.9211721Z 499 │ await refreshSelectedSection(); 2026-10-22T19:31:22.9211926Z 500 │ setIsPullRefreshing(false); 2026-10-22T19:31:22.9212095Z 501 │ }; 2026-10-22T19:31:22.9212322Z 502 │ const reviewFileNavigatorRef = useRef(null); 2026-10-22T19:31:22.9212649Z 503 │ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : []; 2026-10-22T19:31:22.9212936Z 504 │ const fileVisibility = useReviewFileVisibility({ 2026-10-22T19:31:22.9213175Z 505 │ threadKey: reviewCache.threadKey, 2026-10-22T19:31:22.9213396Z 506 │ sectionId: selectedSection?.id ?? null, 2026-10-22T19:31:22.9213613Z 507 │ files: reviewFiles, 2026-10-22T19:31:22.9213826Z 508 │ cachedExpandedFileIds: selectedSection?.id 2026-10-22T19:31:22.9214115Z 509 │ ? reviewCache.expandedFileIdsBySection[selectedSection.id] 2026-10-22T19:31:22.9214368Z 510 │ : undefined, 2026-10-22T19:31:22.9214729Z 511 │ cachedViewedFileIds: selectedSection?.id 2026-10-22T19:31:22.9214994Z 512 │ ? reviewCache.viewedFileIdsBySection[selectedSection.id] 2026-10-22T19:31:22.9215221Z 513 │ : undefined, 2026-10-22T19:31:22.9215370Z 514 │ }); 2026-10-22T19:31:22.9215651Z 515 │ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility; 2026-10-22T19:31:22.9216009Z 516 │ const commentSelection = useReviewCommentSelectionController({ 2026-10-22T19:31:22.9216365Z 517 │ environmentId, 2026-10-22T19:31:22.9216578Z 518 │ threadId, 2026-10-22T19:31:22.9216738Z 519 │ selectedSection, 2026-10-22T19:31:22.9216921Z 520 │ nativeReviewDiffData, 2026-10-22T19:31:22.9217093Z 521 │ }); 2026-10-22T19:31:22.9217299Z 522 │ const nativeBridge = useNativeReviewDiffBridge({ 2026-10-22T19:31:22.9217534Z 523 │ threadKey: reviewCache.threadKey, 2026-10-22T19:31:22.9217752Z 524 │ sectionId: selectedSection?.id ?? null, 2026-10-22T19:31:22.9217975Z 525 │ diff: selectedSection?.diff, 2026-10-22T19:31:22.9218180Z 526 │ data: nativeReviewDiffData, 2026-10-22T19:31:22.9218390Z 527 │ collapsedFileIds, 2026-10-22T19:31:22.9218564Z 528 │ viewedFileIds, 2026-10-22T19:31:22.9218804Z 529 │ selectedRowIds: commentSelection.selectedRowIds, 2026-10-22T19:31:22.9219052Z 530 │ canHighlight: parsedDiff.kind === "files", 2026-10-22T19:31:22.9219251Z 531 │ }); 2026-10-22T19:31:22.9219406Z 532 │ const showcaseReviewKey = 2026-10-22T19:31:22.9219660Z 533 │ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection 2026-10-22T19:31:22.9220077Z 534 │ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}` 2026-10-22T19:31:22.9220375Z 535 │ : null; 2026-10-22T19:31:22.9220663Z 536 │ const handleNativeDebug = (event: NativeSyntheticEvent>) => { 2026-10-22T19:31:22.9220957Z 537 │ nativeBridge.onDebug(event); 2026-10-22T19:31:22.9221149Z 538 │ if ( 2026-10-22T19:31:22.9221329Z 539 │ showcaseReviewKey === null || 2026-10-22T19:31:22.9221602Z 540 │ showcasedReviewDrawRef.current === showcaseReviewKey || 2026-10-22T19:31:22.9221880Z 541 │ !isNativeReviewDiffDrawEvent(event.nativeEvent) 2026-10-22T19:31:22.9222083Z 542 │ ) { 2026-10-22T19:31:22.9222227Z 543 │ return; 2026-10-22T19:31:22.9222368Z 544 │ } 2026-10-22T19:31:22.9222575Z 545 │ showcasedReviewDrawRef.current = showcaseReviewKey; 2026-10-22T19:31:22.9223052Z 546 │ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId }); 2026-10-22T19:31:22.9223398Z 547 │ }; 2026-10-22T19:31:22.9223540Z 548 │ 2026-10-22T19:31:22.9223745Z 549 │ const handleSelectFile = async (fileId: string | null) => { 2026-10-22T19:31:22.9223999Z 550 │ loadVisibleFile(fileId, true); 2026-10-22T19:31:22.9224225Z 551 │ commentSelection.clearSelection(); 2026-10-22T19:31:22.9224487Z 552 │ if (fileId !== null && collapsedFileIds.includes(fileId)) { 2026-10-22T19:31:22.9224840Z 553 │ toggleExpandedFile(fileId); 2026-10-22T19:31:22.9225013Z 554 │ } 2026-10-22T19:31:22.9225218Z 555 │ const nativeView = nativeReviewDiffViewRef.current; 2026-10-22T19:31:22.9225474Z 556 │ if (!nativeView) return; 2026-10-22T19:31:22.9225690Z 557 │ const result = await settlePromise(() => 2026-10-22T19:31:22.9226030Z 558 │ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true), 2026-10-22T19:31:22.9226294Z 559 │ ); 2026-10-22T19:31:22.9226491Z 560 │ if (AsyncResult.isFailure(result)) { 2026-10-22T19:31:22.9226810Z 561 │ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result)); 2026-10-22T19:31:22.9227105Z 562 │ } 2026-10-22T19:31:22.9227256Z 563 │ }; 2026-10-22T19:31:22.9227421Z 564 │ const handleVisibleFileChange = ( 2026-10-22T19:31:22.9227684Z 565 │ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>, 2026-10-22T19:31:22.9227907Z 566 │ ) => { 2026-10-22T19:31:22.9228125Z 567 │ loadVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-22T19:31:22.9228453Z 568 │ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-22T19:31:22.9228712Z 569 │ }; 2026-10-22T19:31:22.9228873Z 570 │ const renderInspector = () => ( 2026-10-22T19:31:22.9229069Z 571 │ void handleSelectFile(fileId)} 2026-10-22T19:31:22.9230526Z 577 │ /> 2026-10-22T19:31:22.9230665Z 578 │ ); 2026-10-22T19:31:22.9230793Z 579 │ 2026-10-22T19:31:22.9231078Z 580 │ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => { 2026-10-22T19:31:22.9231401Z 581 │ const { fileId } = event.nativeEvent; 2026-10-22T19:31:22.9231621Z 582 │ if (fileId) { 2026-10-22T19:31:22.9231814Z 583 │ loadVisibleFile(fileId, true); 2026-10-22T19:31:22.9232025Z 584 │ toggleExpandedFile(fileId); 2026-10-22T19:31:22.9232194Z 585 │ } 2026-10-22T19:31:22.9232334Z 586 │ }; 2026-10-22T19:31:22.9232482Z 587 │ 2026-10-22T19:31:22.9232660Z 588 │ const handleNativeToggleViewedFile = ( 2026-10-22T19:31:22.9232928Z 589 │ event: NativeSyntheticEvent<{ readonly fileId?: string }>, 2026-10-22T19:31:22.9233141Z 590 │ ) => { 2026-10-22T19:31:22.9233332Z 591 │ const { fileId } = event.nativeEvent; 2026-10-22T19:31:22.9233524Z 592 │ if (fileId) { 2026-10-22T19:31:22.9233705Z 593 │ toggleViewedFile(fileId); 2026-10-22T19:31:22.9233891Z 594 │ } 2026-10-22T19:31:22.9234051Z 595 │ }; 2026-10-22T19:31:22.9234184Z 596 │ 2026-10-22T19:31:22.9234338Z 597 │ const parsedDiffNotice = 2026-10-22T19:31:22.9234925Z 598 │ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null; 2026-10-22T19:31:22.9235428Z 599 │ const hasCachedSelectedDiff = selectedSection?.diff != null; 2026-10-22T19:31:22.9235953Z 600 │ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null); 2026-10-22T19:31:22.9236269Z 601 │ const sectionMenu = buildReviewSectionMenu(reviewSections); 2026-10-22T19:31:22.9236597Z 602 │ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({ 2026-10-22T19:31:22.9236912Z 603 │ hasEnvironmentPresentation: environment.isReady, 2026-10-22T19:31:22.9237166Z 604 │ isEnvironmentConnected: isEnvironmentReady, 2026-10-22T19:31:22.9237380Z 605 │ hasCachedSelectedDiff, 2026-10-22T19:31:22.9237555Z 606 │ hasAnyCachedDiff, 2026-10-22T19:31:22.9237722Z 607 │ }); 2026-10-22T19:31:22.9237892Z 608 │ const handleRetryEnvironment = () => { 2026-10-22T19:31:22.9238117Z 609 │ void retryEnvironment(environmentId); 2026-10-22T19:31:22.9238299Z 610 │ }; 2026-10-22T19:31:22.9238461Z 611 │ const handleReturnToThread = () => { 2026-10-22T19:31:22.9238660Z 612 │ if (navigation.canGoBack()) { 2026-10-22T19:31:22.9238856Z 613 │ navigation.goBack(); 2026-10-22T19:31:22.9239027Z 614 │ return; 2026-10-22T19:31:22.9239185Z 615 │ } 2026-10-22T19:31:22.9239362Z 616 │ navigation.navigate("Thread", { 2026-10-22T19:31:22.9239572Z 617 │ environmentId: String(environmentId), 2026-10-22T19:31:22.9239782Z 618 │ threadId: String(threadId), 2026-10-22T19:31:22.9239955Z 619 │ }); 2026-10-22T19:31:22.9240090Z 620 │ }; 2026-10-22T19:31:22.9240245Z 621 │ const androidHeaderSubtitle = [ 2026-10-22T19:31:22.9240434Z 622 │ selectedSection?.title, 2026-10-22T19:31:22.9240638Z 623 │ headerDiffSummary.additions, 2026-10-22T19:31:22.9240843Z 624 │ headerDiffSummary.deletions, 2026-10-22T19:31:22.9260914Z 625 │ ] 2026-10-22T19:31:22.9261169Z 626 │ .filter((part): part is string => Boolean(part)) 2026-10-22T19:31:22.9261415Z 627 │ .join(" · "); 2026-10-22T19:31:22.9261578Z 628 │ 2026-10-22T19:31:22.9261751Z 629 │ const showChangedFilesPane = 2026-10-22T19:31:22.9261958Z 630 │ !showConnectionNotice && 2026-10-22T19:31:22.9262163Z 631 │ selectedSection !== null && 2026-10-22T19:31:22.9262376Z 632 │ parsedDiff.kind === "files" && 2026-10-22T19:31:22.9262587Z 633 │ NativeReviewDiffView !== null; 2026-10-22T19:31:22.9262902Z 634 │ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined); 2026-10-22T19:31:22.9263312Z 635 │ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane; 2026-10-22T19:31:22.9263576Z 636 │ 2026-10-22T19:31:22.9263737Z 637 │ const listHeader = (() => { 2026-10-22T19:31:22.9263973Z 638 │ const children: ReactElement[] = []; 2026-10-22T19:31:22.9264164Z 639 │ 2026-10-22T19:31:22.9264333Z 640 │ if (error) { 2026-10-22T19:31:22.9264514Z 641 │ children.push( 2026-10-22T19:31:22.9264764Z 642 │ 2026-10-22T19:31:22.9266503Z 649 │ Review unavailable 2026-10-22T19:31:22.9267563Z 650 │ {error} 2026-10-22T19:31:22.9268119Z 651 │ , 2026-10-22T19:31:22.9269711Z 652 │ ); 2026-10-22T19:31:22.9269859Z 653 │ } 2026-10-22T19:31:22.9270017Z 654 │ 2026-10-22T19:31:22.9270277Z 655 │ if (parsedDiffNotice) { 2026-10-22T19:31:22.9270740Z 656 │ children.push(); 2026-10-22T19:31:22.9270994Z 657 │ } 2026-10-22T19:31:22.9271132Z 658 │ 2026-10-22T19:31:22.9271298Z 659 │ if (children.length === 0) { 2026-10-22T19:31:22.9271490Z 660 │ return null; 2026-10-22T19:31:22.9271645Z 661 │ } 2026-10-22T19:31:22.9271771Z 662 │ 2026-10-22T19:31:22.9271921Z 663 │ return <>{children}; 2026-10-22T19:31:22.9272097Z 664 │ })(); 2026-10-22T19:31:22.9272261Z 665 │ const headerSubtitle = [ 2026-10-22T19:31:22.9272464Z 666 │ headerDiffSummary.additions, 2026-10-22T19:31:22.9272667Z 667 │ headerDiffSummary.deletions, 2026-10-22T19:31:22.9272881Z 668 │ pendingReviewCommentCount > 0 2026-10-22T19:31:22.9273187Z 669 │ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}` 2026-10-22T19:31:22.9273475Z 670 │ : null, 2026-10-22T19:31:22.9273634Z 671 │ ] 2026-10-22T19:31:22.9273783Z 672 │ .filter(Boolean) 2026-10-22T19:31:22.9274007Z 673 │ .join(" · "); 2026-10-22T19:31:22.9274263Z 674 │ const headerTitleText = selectedSection?.title ?? "Review changes"; 2026-10-22T19:31:22.9274504Z 675 │ 2026-10-22T19:31:22.9274699Z 676 │ return ( 2026-10-22T19:31:22.9274878Z 677 │ <> 2026-10-22T19:31:22.9275114Z 678 │ 2026-10-22T19:31:22.9278988Z 694 │ 2026-10-22T19:31:22.9279152Z 695 │ 2026-10-22T19:31:22.9279390Z 696 │ 2026-10-22T19:31:22.9279646Z 697 │ {showConnectionNotice ? ( 2026-10-22T19:31:22.9279944Z 698 │ 2026-10-22T19:31:22.9280235Z 699 │ 2026-10-22T19:31:22.9284233Z 711 │ 2026-10-22T19:31:22.9284744Z 712 │ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? ( 2026-10-22T19:31:22.9285009Z 713 │ 2026-10-22T19:31:22.9286148Z 719 │ 2026-10-22T19:31:22.9287054Z 723 │ {listHeader} 2026-10-22T19:31:22.9287301Z 724 │ 2026-10-22T19:31:22.9287546Z 725 │ (VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-22T19:31:22.9291680Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-22T19:31:22.9291994Z ·  ───────────┬────────── 2026-10-22T19:31:22.9292338Z · ╰── Cannot access ref value during render 2026-10-22T19:31:22.9292667Z 123 │ const sessionRef = useRef(null); 2026-10-22T19:31:22.9292872Z ╰──── 2026-10-22T19:31:22.9293474Z  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-22T19:31:22.9294324Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9294713Z 2026-10-22T19:31:22.9295096Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9295696Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8] 2026-10-22T19:31:22.9296203Z 125 │ 2026-10-22T19:31:22.9296503Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-22T19:31:22.9296784Z ·  ─────────┬──────── 2026-10-22T19:31:22.9297086Z · ╰── Cannot access ref value during render 2026-10-22T19:31:22.9297372Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-22T19:31:22.9297571Z ╰──── 2026-10-22T19:31:22.9298158Z  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-22T19:31:22.9299274Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9299582Z 2026-10-22T19:31:22.9299753Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9300097Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7] 2026-10-22T19:31:22.9300345Z 125 │ 2026-10-22T19:31:22.9300542Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-22T19:31:22.9300793Z ·  ─────────┬───────── 2026-10-22T19:31:22.9301090Z · ╰── Cannot access ref value during render 2026-10-22T19:31:22.9301541Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-22T19:31:22.9301867Z ╰──── 2026-10-22T19:31:22.9302590Z  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-22T19:31:22.9303387Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9303797Z 2026-10-22T19:31:22.9304108Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9304471Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31] 2026-10-22T19:31:22.9304911Z 125 │ 2026-10-22T19:31:22.9305139Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-22T19:31:22.9305407Z ·  ─────────┬───────── 2026-10-22T19:31:22.9305732Z · ╰── Cannot access ref value during render 2026-10-22T19:31:22.9306096Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-22T19:31:22.9306443Z ╰──── 2026-10-22T19:31:22.9307049Z  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-22T19:31:22.9307862Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9308391Z 2026-10-22T19:31:22.9308659Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9309266Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30] 2026-10-22T19:31:22.9309850Z 125 │ 2026-10-22T19:31:22.9310083Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-22T19:31:22.9310363Z ·  ──────────┬───────── 2026-10-22T19:31:22.9310690Z · ╰── Cannot access ref value during render 2026-10-22T19:31:22.9311009Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-22T19:31:22.9311271Z ╰──── 2026-10-22T19:31:22.9311999Z  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-22T19:31:22.9312970Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9313302Z 2026-10-22T19:31:22.9313479Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9313826Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46] 2026-10-22T19:31:22.9314162Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-22T19:31:22.9314514Z 127 │ ╭─▶ const recorder = createLazyVoiceRecorder({ 2026-10-22T19:31:22.9315026Z 128 │ │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-22T19:31:22.9315483Z 129 │ │ onStatus: (status: RecordingStatus) => { 2026-10-22T19:31:22.9315822Z 130 │ │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-22T19:31:22.9316134Z 131 │ │ isFinished: status.isFinished, 2026-10-22T19:31:22.9316507Z 132 │ │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-22T19:31:22.9316877Z 133 │ │ error: status.error, 2026-10-22T19:31:22.9317248Z 134 │ │ url: status.url, 2026-10-22T19:31:22.9317477Z 135 │ │ }); 2026-10-22T19:31:22.9317698Z 136 │ │ }, 2026-10-22T19:31:22.9318106Z 137 │ │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-22T19:31:22.9318444Z 138 │ │ selectInput: (inputs) => { 2026-10-22T19:31:22.9318751Z 139 │ │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-22T19:31:22.9319297Z 140 │ │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-22T19:31:22.9319786Z 141 │ │ const known = microphoneOrder(preferences.value.microphones); 2026-10-22T19:31:22.9320280Z 142 │ │ const order = rememberMicrophones(known, inputs); 2026-10-22T19:31:22.9320559Z 143 │ │ if (order !== known) { 2026-10-22T19:31:22.9320844Z 144 │ │ registry.set(updateMobilePreferencesAtom, { 2026-10-22T19:31:22.9321132Z 145 │ │ transform: (current) => ({ 2026-10-22T19:31:22.9321512Z 146 │ │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-22T19:31:22.9321831Z 147 │ │ }), 2026-10-22T19:31:22.9322337Z 148 │ │ }); 2026-10-22T19:31:22.9322744Z 149 │ │ } 2026-10-22T19:31:22.9323151Z 150 │ │ return preferredMicrophoneInput(inputs, order); 2026-10-22T19:31:22.9323501Z 151 │ │ }, 2026-10-22T19:31:22.9323855Z 152 │ ├─▶ }); 2026-10-22T19:31:22.9324365Z · ╰──── Passing a ref to a function may read its value during render 2026-10-22T19:31:22.9324939Z 153 │ recorderRef.current = recorder; 2026-10-22T19:31:22.9325161Z ╰──── 2026-10-22T19:31:22.9326062Z  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-22T19:31:22.9326994Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9327302Z 2026-10-22T19:31:22.9327462Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9327816Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16] 2026-10-22T19:31:22.9328070Z 152 │ }); 2026-10-22T19:31:22.9328272Z 153 │ recorderRef.current = recorder; 2026-10-22T19:31:22.9328666Z ·  ─────┬─────────┬─── 2026-10-22T19:31:22.9329007Z · │ ╰── Cannot update ref value during render 2026-10-22T19:31:22.9329324Z · ╰── This value is a ref 2026-10-22T19:31:22.9329604Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-22T19:31:22.9329801Z ╰──── 2026-10-22T19:31:22.9330469Z  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-22T19:31:22.9331255Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9331568Z 2026-10-22T19:31:22.9331740Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9332165Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48] 2026-10-22T19:31:22.9332611Z 153 │ recorderRef.current = recorder; 2026-10-22T19:31:22.9333126Z 154 │ ╭─▶ sessionRef.current = new VoiceInputSession({ 2026-10-22T19:31:22.9333605Z 155 │ │ recorder, 2026-10-22T19:31:22.9333876Z 156 │ │ getTranscriber: getLocalVoiceTranscriber, 2026-10-22T19:31:22.9334171Z 157 │ │ requestPermission: async () => { 2026-10-22T19:31:22.9334524Z 158 │ │ const permission = await requestRecordingPermissionsAsync(); 2026-10-22T19:31:22.9335048Z 159 │ │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-22T19:31:22.9335577Z 160 │ │ }, 2026-10-22T19:31:22.9336066Z 161 │ │ configureRecording: configureVoiceRecordingAudio, 2026-10-22T19:31:22.9336651Z 162 │ │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-22T19:31:22.9336966Z 163 │ │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-22T19:31:22.9337274Z 164 │ │ onStateChange: (nextState) => 2026-10-22T19:31:22.9337650Z 165 │ │ setState({ 2026-10-22T19:31:22.9338032Z 166 │ │ state: nextState, 2026-10-22T19:31:22.9338314Z 167 │ │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-22T19:31:22.9338626Z 168 │ │ label: sessionRef.current?.label ?? null, 2026-10-22T19:31:22.9338872Z 169 │ │ }), 2026-10-22T19:31:22.9339181Z 170 │ ├─▶ }); 2026-10-22T19:31:22.9339768Z · ╰──── Cannot access ref value during render 2026-10-22T19:31:22.9340059Z 171 │ } 2026-10-22T19:31:22.9340194Z ╰──── 2026-10-22T19:31:22.9340778Z  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-22T19:31:22.9341951Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9342429Z 2026-10-22T19:31:22.9342616Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9342963Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15] 2026-10-22T19:31:22.9343384Z 153 │ recorderRef.current = recorder; 2026-10-22T19:31:22.9343627Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-22T19:31:22.9343975Z ·  ─────┬────────┬─── 2026-10-22T19:31:22.9344432Z · │ ╰── Cannot update ref value during render 2026-10-22T19:31:22.9344973Z · ╰── This value is a ref 2026-10-22T19:31:22.9345504Z 155 │ recorder, 2026-10-22T19:31:22.9345746Z ╰──── 2026-10-22T19:31:22.9346337Z  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-22T19:31:22.9347520Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9347896Z 2026-10-22T19:31:22.9348064Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9348650Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7] 2026-10-22T19:31:22.9348968Z 184 │ return () => subscription.remove(); 2026-10-22T19:31:22.9349184Z 185 │ }, [controller]); 2026-10-22T19:31:22.9349371Z ·  ─────┬──── 2026-10-22T19:31:22.9349794Z · ╰── Cannot access ref value during render 2026-10-22T19:31:22.9350026Z 186 │ 2026-10-22T19:31:22.9350161Z ╰──── 2026-10-22T19:31:22.9350774Z  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-22T19:31:22.9351358Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9351366Z 2026-10-22T19:31:22.9351607Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9351780Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6] 2026-10-22T19:31:22.9351882Z 184 │ return () => subscription.remove(); 2026-10-22T19:31:22.9351964Z 185 │ }, [controller]); 2026-10-22T19:31:22.9352057Z ·  ──────┬───── 2026-10-22T19:31:22.9352218Z · ╰── Cannot access ref value during render 2026-10-22T19:31:22.9352293Z 186 │ 2026-10-22T19:31:22.9352374Z ╰──── 2026-10-22T19:31:22.9352892Z  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-22T19:31:22.9353207Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9353216Z 2026-10-22T19:31:22.9353374Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9353556Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6] 2026-10-22T19:31:22.9353627Z 191 │ }, 2026-10-22T19:31:22.9353707Z 192 │ [controller, recorder], 2026-10-22T19:31:22.9353809Z ·  ─────┬──── 2026-10-22T19:31:22.9353978Z · ╰── Cannot access ref value during render 2026-10-22T19:31:22.9354076Z 193 │ ); 2026-10-22T19:31:22.9354170Z ╰──── 2026-10-22T19:31:22.9355116Z  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-22T19:31:22.9355446Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9355449Z 2026-10-22T19:31:22.9355608Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9356012Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20] 2026-10-22T19:31:22.9356294Z 174 │ const controller = session.controller; 2026-10-22T19:31:22.9356446Z 175 │ const recorder = recorderRef.current; 2026-10-22T19:31:22.9356632Z ·  ─────────┬───────── 2026-10-22T19:31:22.9356970Z · ╰── Cannot access ref value during render 2026-10-22T19:31:22.9357037Z 176 │ 2026-10-22T19:31:22.9357108Z ╰──── 2026-10-22T19:31:22.9357626Z  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-22T19:31:22.9357963Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9357970Z 2026-10-22T19:31:22.9358142Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9358314Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5] 2026-10-22T19:31:22.9358417Z 191 │ }, 2026-10-22T19:31:22.9358546Z 192 │ [controller, recorder], 2026-10-22T19:31:22.9358718Z ·  ───────────┬────────── 2026-10-22T19:31:22.9358958Z · ╰── Cannot access ref value during render 2026-10-22T19:31:22.9359034Z 193 │ ); 2026-10-22T19:31:22.9359096Z ╰──── 2026-10-22T19:31:22.9359613Z  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-22T19:31:22.9359937Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9359941Z 2026-10-22T19:31:22.9360190Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9360486Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20] 2026-10-22T19:31:22.9360669Z 245 │ return () => clearInterval(intervalId); 2026-10-22T19:31:22.9360882Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-22T19:31:22.9361036Z ·  ─────┬──── 2026-10-22T19:31:22.9361312Z · ╰── Cannot access ref value during render 2026-10-22T19:31:22.9361380Z 247 │ 2026-10-22T19:31:22.9361452Z ╰──── 2026-10-22T19:31:22.9361980Z  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-22T19:31:22.9362303Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9362307Z 2026-10-22T19:31:22.9362473Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9362651Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6] 2026-10-22T19:31:22.9362756Z 245 │ return () => clearInterval(intervalId); 2026-10-22T19:31:22.9362883Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-22T19:31:22.9363177Z ·  ────────────────────────┬─────────────────────── 2026-10-22T19:31:22.9363527Z · ╰── Cannot access ref value during render 2026-10-22T19:31:22.9363636Z 247 │ 2026-10-22T19:31:22.9363709Z ╰──── 2026-10-22T19:31:22.9364319Z  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-22T19:31:22.9364715Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9364719Z 2026-10-22T19:31:22.9364889Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9365070Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5] 2026-10-22T19:31:22.9365157Z 260 │ setOwnerFocused, 2026-10-22T19:31:22.9365234Z 261 │ session, 2026-10-22T19:31:22.9365318Z ·  ───┬─── 2026-10-22T19:31:22.9365468Z · ╰── Cannot access ref value during render 2026-10-22T19:31:22.9365543Z 262 │ stop, 2026-10-22T19:31:22.9365609Z ╰──── 2026-10-22T19:31:22.9366125Z  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-22T19:31:22.9366441Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9366452Z 2026-10-22T19:31:22.9366614Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9366792Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10] 2026-10-22T19:31:22.9366860Z 250 │ 2026-10-22T19:31:22.9367021Z 251 │ ╭─▶ return { 2026-10-22T19:31:22.9367253Z 252 │ │ isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null, 2026-10-22T19:31:22.9367350Z 253 │ │ state, 2026-10-22T19:31:22.9367459Z 254 │ │ audioLevels, 2026-10-22T19:31:22.9367637Z 255 │ │ elapsedSeconds, 2026-10-22T19:31:22.9367876Z 256 │ │ isBusy: voiceInputBlocksSubmission(state), 2026-10-22T19:31:22.9367995Z 257 │ │ ownerKey, 2026-10-22T19:31:22.9368096Z 258 │ │ label, 2026-10-22T19:31:22.9368203Z 259 │ │ focusedOwners, 2026-10-22T19:31:22.9368329Z 260 │ │ setOwnerFocused, 2026-10-22T19:31:22.9368477Z 261 │ │ session, 2026-10-22T19:31:22.9368625Z 262 │ │ stop, 2026-10-22T19:31:22.9368786Z 263 │ │ cancel, 2026-10-22T19:31:22.9369007Z 264 │ ├─▶ }; 2026-10-22T19:31:22.9369239Z · ╰──── Cannot access ref value during render 2026-10-22T19:31:22.9369309Z 265 │ } 2026-10-22T19:31:22.9369375Z ╰──── 2026-10-22T19:31:22.9370120Z  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-22T19:31:22.9370667Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9370673Z 2026-10-22T19:31:22.9370868Z ⚠ react(immutability): This value cannot be modified 2026-10-22T19:31:22.9371048Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-22T19:31:22.9371227Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-22T19:31:22.9371365Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-22T19:31:22.9371470Z ·  ─────┬───── 2026-10-22T19:31:22.9371626Z · ╰── `audioLevels` originates here 2026-10-22T19:31:22.9371765Z 123 │ const sessionRef = useRef(null); 2026-10-22T19:31:22.9371923Z 124 │ const recorderRef = useRef | null>(null); 2026-10-22T19:31:22.9371983Z 125 │ 2026-10-22T19:31:22.9372102Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-22T19:31:22.9372217Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-22T19:31:22.9372376Z 128 │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-22T19:31:22.9372490Z 129 │ onStatus: (status: RecordingStatus) => { 2026-10-22T19:31:22.9372624Z 130 │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-22T19:31:22.9372722Z 131 │ isFinished: status.isFinished, 2026-10-22T19:31:22.9372886Z 132 │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-22T19:31:22.9372975Z 133 │ error: status.error, 2026-10-22T19:31:22.9373066Z 134 │ url: status.url, 2026-10-22T19:31:22.9373131Z 135 │ }); 2026-10-22T19:31:22.9373206Z 136 │ }, 2026-10-22T19:31:22.9373399Z 137 │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-22T19:31:22.9373491Z 138 │ selectInput: (inputs) => { 2026-10-22T19:31:22.9373626Z 139 │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-22T19:31:22.9373751Z 140 │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-22T19:31:22.9373899Z 141 │ const known = microphoneOrder(preferences.value.microphones); 2026-10-22T19:31:22.9374026Z 142 │ const order = rememberMicrophones(known, inputs); 2026-10-22T19:31:22.9374120Z 143 │ if (order !== known) { 2026-10-22T19:31:22.9374252Z 144 │ registry.set(updateMobilePreferencesAtom, { 2026-10-22T19:31:22.9374347Z 145 │ transform: (current) => ({ 2026-10-22T19:31:22.9374593Z 146 │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-22T19:31:22.9374663Z 147 │ }), 2026-10-22T19:31:22.9374744Z 148 │ }); 2026-10-22T19:31:22.9374817Z 149 │ } 2026-10-22T19:31:22.9374941Z 150 │ return preferredMicrophoneInput(inputs, order); 2026-10-22T19:31:22.9375004Z 151 │ }, 2026-10-22T19:31:22.9375075Z 152 │ }); 2026-10-22T19:31:22.9375172Z 153 │ recorderRef.current = recorder; 2026-10-22T19:31:22.9375294Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-22T19:31:22.9375365Z 155 │ recorder, 2026-10-22T19:31:22.9375564Z 156 │ getTranscriber: getLocalVoiceTranscriber, 2026-10-22T19:31:22.9375792Z 157 │ requestPermission: async () => { 2026-10-22T19:31:22.9376011Z 158 │ const permission = await requestRecordingPermissionsAsync(); 2026-10-22T19:31:22.9376272Z 159 │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-22T19:31:22.9376387Z 160 │ }, 2026-10-22T19:31:22.9376562Z 161 │ configureRecording: configureVoiceRecordingAudio, 2026-10-22T19:31:22.9376685Z 162 │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-22T19:31:22.9376801Z 163 │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-22T19:31:22.9376891Z 164 │ onStateChange: (nextState) => 2026-10-22T19:31:22.9376966Z 165 │ setState({ 2026-10-22T19:31:22.9377054Z 166 │ state: nextState, 2026-10-22T19:31:22.9377178Z 167 │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-22T19:31:22.9377298Z 168 │ label: sessionRef.current?.label ?? null, 2026-10-22T19:31:22.9377365Z 169 │ }), 2026-10-22T19:31:22.9377428Z 170 │ }); 2026-10-22T19:31:22.9377485Z 171 │ } 2026-10-22T19:31:22.9377550Z 172 │ 2026-10-22T19:31:22.9377649Z 173 │ const session = sessionRef.current; 2026-10-22T19:31:22.9377749Z 174 │ const controller = session.controller; 2026-10-22T19:31:22.9377851Z 175 │ const recorder = recorderRef.current; 2026-10-22T19:31:22.9377913Z 176 │ 2026-10-22T19:31:22.9377992Z 177 │ useEffect(() => { 2026-10-22T19:31:22.9378155Z 178 │ const subscription = AppState.addEventListener("change", (nextState) => { 2026-10-22T19:31:22.9378310Z 179 │ // iOS reports `inactive` while its permission dialog is open. Only the 2026-10-22T19:31:22.9378473Z 180 │ // real background state cancels preparation; recorder status handles 2026-10-22T19:31:22.9378599Z 181 │ // calls and route interruptions during capture. 2026-10-22T19:31:22.9378745Z 182 │ if (nextState === "background") controller.appMovedToBackground(); 2026-10-22T19:31:22.9378812Z 183 │ }); 2026-10-22T19:31:22.9378908Z 184 │ return () => subscription.remove(); 2026-10-22T19:31:22.9378985Z 185 │ }, [controller]); 2026-10-22T19:31:22.9379045Z 186 │ 2026-10-22T19:31:22.9379117Z 187 │ useEffect( 2026-10-22T19:31:22.9379187Z 188 │ () => () => { 2026-10-22T19:31:22.9379272Z 189 │ controller.dispose(); 2026-10-22T19:31:22.9379349Z 190 │ recorder.release(); 2026-10-22T19:31:22.9379417Z 191 │ }, 2026-10-22T19:31:22.9379498Z 192 │ [controller, recorder], 2026-10-22T19:31:22.9379561Z 193 │ ); 2026-10-22T19:31:22.9379615Z 194 │ 2026-10-22T19:31:22.9379785Z 195 │ useEffect(() => { 2026-10-22T19:31:22.9380014Z 196 │ if (state.phase !== "recording") return; 2026-10-22T19:31:22.9380070Z 197 │ 2026-10-22T19:31:22.9380244Z 198 │ const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`; 2026-10-22T19:31:22.9380371Z 199 │ const activation = activateKeepAwakeAsync(tag); 2026-10-22T19:31:22.9380464Z 200 │ void activation.catch(() => {}); 2026-10-22T19:31:22.9380533Z 201 │ return () => { 2026-10-22T19:31:22.9380704Z 202 │ // Release after activation settles, even if the recording ends immediately. 2026-10-22T19:31:22.9380860Z 203 │ void activation.then(() => deactivateKeepAwake(tag)).catch(() => {}); 2026-10-22T19:31:22.9380927Z 204 │ }; 2026-10-22T19:31:22.9381015Z 205 │ }, [keepAwakeId, state.phase]); 2026-10-22T19:31:22.9381075Z 206 │ 2026-10-22T19:31:22.9381147Z 207 │ useEffect(() => { 2026-10-22T19:31:22.9381306Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-22T19:31:22.9381366Z 209 │ 2026-10-22T19:31:22.9381505Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-22T19:31:22.9381673Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-22T19:31:22.9381791Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-22T19:31:22.9381876Z ·  ─────┬───── 2026-10-22T19:31:22.9382039Z · ╰── `audioLevels` cannot be modified 2026-10-22T19:31:22.9382110Z 213 │ } 2026-10-22T19:31:22.9382176Z ╰──── 2026-10-22T19:31:22.9382474Z  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-22T19:31:22.9382825Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T19:31:22.9382830Z 2026-10-22T19:31:22.9383060Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-22T19:31:22.9383233Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-22T19:31:22.9383290Z 206 │ 2026-10-22T19:31:22.9383365Z 207 │ useEffect(() => { 2026-10-22T19:31:22.9383457Z ·  ───┬─── 2026-10-22T19:31:22.9383708Z · ╰── This function may (indirectly) reassign or modify `audioLevels` after render 2026-10-22T19:31:22.9383853Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-22T19:31:22.9383917Z 209 │ 2026-10-22T19:31:22.9384055Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-22T19:31:22.9384231Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-22T19:31:22.9384341Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-22T19:31:22.9384434Z ·  ─────┬───── 2026-10-22T19:31:22.9384641Z · ╰── This modifies `audioLevels` 2026-10-22T19:31:22.9384714Z 213 │ } 2026-10-22T19:31:22.9384769Z ╰──── 2026-10-22T19:31:22.9385151Z  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-22T19:31:22.9385489Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T19:31:22.9385573Z 2026-10-22T19:31:22.9385845Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9386044Z ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14] 2026-10-22T19:31:22.9386144Z 26 │ const latestInput = useRef(input); 2026-10-22T19:31:22.9386243Z 27 │ latestInput.current = input; 2026-10-22T19:31:22.9386369Z ·  ─────┬─────────┬─── 2026-10-22T19:31:22.9386574Z · │ ╰── Cannot update ref value during render 2026-10-22T19:31:22.9386704Z · ╰── This value is a ref 2026-10-22T19:31:22.9386798Z 28 │ const mounted = useRef(true); 2026-10-22T19:31:22.9386863Z ╰──── 2026-10-22T19:31:22.9387392Z  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-22T19:31:22.9387709Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9387715Z 2026-10-22T19:31:22.9387885Z ⚠ react(immutability): This value cannot be modified 2026-10-22T19:31:22.9388082Z ╭─[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5] 2026-10-22T19:31:22.9388210Z 65 │ const [expanded, setExpanded] = useState(false); 2026-10-22T19:31:22.9388303Z 66 │ const progress = useSharedValue(0); 2026-10-22T19:31:22.9388386Z ·  ────┬─── 2026-10-22T19:31:22.9388541Z · ╰── `progress` originates here 2026-10-22T19:31:22.9388627Z 67 │ useEffect(() => { 2026-10-22T19:31:22.9388771Z 68 │ progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING); 2026-10-22T19:31:22.9388852Z ·  ────┬─── 2026-10-22T19:31:22.9389006Z · ╰── `progress` cannot be modified 2026-10-22T19:31:22.9389096Z 69 │ }, [expanded, progress]); 2026-10-22T19:31:22.9389158Z ╰──── 2026-10-22T19:31:22.9389617Z  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-22T19:31:22.9389950Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T19:31:22.9389954Z 2026-10-22T19:31:22.9390250Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T19:31:22.9390447Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:60:5] 2026-10-22T19:31:22.9390506Z 55 │ 2026-10-22T19:31:22.9390587Z 56 │ useEffect(() => { 2026-10-22T19:31:22.9390672Z ·  ────┬──── 2026-10-22T19:31:22.9390819Z · ╰── This is the containing effect 2026-10-22T19:31:22.9390891Z 57 │ scheduler.reset(); 2026-10-22T19:31:22.9391008Z 58 │ highlightedRowIdsRef.current = new Set(); 2026-10-22T19:31:22.9391118Z 59 │ visibleChunkIndexRef.current = 0; 2026-10-22T19:31:22.9391251Z 60 │ setVisibleRange({ firstRowIndex: 0, lastRowIndex: 80 }); 2026-10-22T19:31:22.9391338Z ·  ───────┬─────── 2026-10-22T19:31:22.9391708Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:22.9391977Z 61 │ setTokensPatchJson(createEmptyTokenPatch(resetKey)); 2026-10-22T19:31:22.9392041Z ╰──── 2026-10-22T19:31:22.9392793Z  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-22T19:31:22.9393154Z  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-22T19:31:22.9393157Z 2026-10-22T19:31:22.9393388Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T19:31:22.9393588Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:63:7] 2026-10-22T19:31:22.9393689Z 62 │ return () => scheduler.cancel(); 2026-10-22T19:31:22.9393796Z 63 │ }, [enabled, resetKey, rows.length, scheduler]); 2026-10-22T19:31:22.9393942Z ·  ───┬─── ─────┬───── 2026-10-22T19:31:22.9394171Z · │ ╰── Unnecessary dependency `rows.length` 2026-10-22T19:31:22.9394375Z · ╰── Unnecessary dependency `enabled` 2026-10-22T19:31:22.9394473Z 64 │ 2026-10-22T19:31:22.9394615Z ╰──── 2026-10-22T19:31:22.9395134Z  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-22T19:31:22.9395493Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9395501Z 2026-10-22T19:31:22.9395829Z ⚠ eslint(no-unused-vars): Variable 'legacyCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-22T19:31:22.9396001Z ╭─[packages/provider-cursor/src/server/credentialStore.test.ts:15:7] 2026-10-22T19:31:22.9396066Z 14 │ 2026-10-22T19:31:22.9396159Z 15 │ const legacyCredentials = { 2026-10-22T19:31:22.9396269Z ·  ────────┬──────── 2026-10-22T19:31:22.9396492Z · ╰── 'legacyCredentials' is declared here 2026-10-22T19:31:22.9396622Z 16 │ version: 1 as const, 2026-10-22T19:31:22.9396704Z ╰──── 2026-10-22T19:31:22.9396832Z  help: Consider removing this declaration. 2026-10-22T19:31:22.9396837Z 2026-10-22T19:31:22.9397148Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-22T19:31:22.9397298Z ╭─[packages/provider-cursor/src/server/auth.ts:249:20] 2026-10-22T19:31:22.9397376Z 248 │ }, 2026-10-22T19:31:22.9397475Z 249 │ (effect, flow, stopSessions) => 2026-10-22T19:31:22.9397577Z ·  ──────┬───── 2026-10-22T19:31:22.9397748Z · ╰── 'stopSessions' is declared here 2026-10-22T19:31:22.9397841Z 250 │ effect.pipe( 2026-10-22T19:31:22.9397905Z ╰──── 2026-10-22T19:31:22.9398019Z  help: Consider removing this parameter. 2026-10-22T19:31:22.9398021Z 2026-10-22T19:31:22.9398299Z ⚠ react(immutability): This value cannot be modified 2026-10-22T19:31:22.9398606Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:111:5] 2026-10-22T19:31:22.9398688Z 107 │ ); 2026-10-22T19:31:22.9398866Z 108 │ const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0); 2026-10-22T19:31:22.9398980Z ·  ─────────┬──────── 2026-10-22T19:31:22.9399161Z · ╰── `separationProgress` originates here 2026-10-22T19:31:22.9399230Z 109 │ 2026-10-22T19:31:22.9399304Z 110 │ useEffect(() => { 2026-10-22T19:31:22.9399504Z 111 │ separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING); 2026-10-22T19:31:22.9399603Z ·  ─────────┬──────── 2026-10-22T19:31:22.9399778Z · ╰── `separationProgress` cannot be modified 2026-10-22T19:31:22.9399904Z 112 │ }, [props.showScrollToEnd, separationProgress]); 2026-10-22T19:31:22.9399980Z ╰──── 2026-10-22T19:31:22.9400281Z  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-22T19:31:22.9400622Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T19:31:22.9400626Z 2026-10-22T19:31:22.9400812Z ⚠ react(immutability): This value cannot be modified 2026-10-22T19:31:22.9400990Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-22T19:31:22.9401122Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-22T19:31:22.9401269Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-22T19:31:22.9401371Z ·  ──────┬───── 2026-10-22T19:31:22.9401519Z · ╰── `capsuleWidth` originates here 2026-10-22T19:31:22.9401652Z 130 │ const measuredWidthRef = useRef(null); 2026-10-22T19:31:22.9401785Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-22T19:31:22.9401907Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-22T19:31:22.9402012Z 133 │ if (width === measuredWidthRef.current) { 2026-10-22T19:31:22.9402090Z 134 │ return; 2026-10-22T19:31:22.9402160Z 135 │ } 2026-10-22T19:31:22.9402282Z 136 │ const first = measuredWidthRef.current === null; 2026-10-22T19:31:22.9402375Z 137 │ measuredWidthRef.current = width; 2026-10-22T19:31:22.9402558Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-22T19:31:22.9402653Z ·  ──────┬───── 2026-10-22T19:31:22.9402810Z · ╰── `capsuleWidth` cannot be modified 2026-10-22T19:31:22.9402871Z 139 │ }; 2026-10-22T19:31:22.9402937Z ╰──── 2026-10-22T19:31:22.9403231Z  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-22T19:31:22.9403692Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T19:31:22.9403697Z 2026-10-22T19:31:22.9403883Z ⚠ react(immutability): This value cannot be modified 2026-10-22T19:31:22.9404149Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-22T19:31:22.9404393Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-22T19:31:22.9404578Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-22T19:31:22.9404677Z ·  ──────┬───── 2026-10-22T19:31:22.9404840Z · ╰── `capsuleWidth` originates here 2026-10-22T19:31:22.9404965Z 130 │ const measuredWidthRef = useRef(null); 2026-10-22T19:31:22.9405093Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-22T19:31:22.9405205Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-22T19:31:22.9405314Z 133 │ if (width === measuredWidthRef.current) { 2026-10-22T19:31:22.9405386Z 134 │ return; 2026-10-22T19:31:22.9405450Z 135 │ } 2026-10-22T19:31:22.9405570Z 136 │ const first = measuredWidthRef.current === null; 2026-10-22T19:31:22.9405668Z 137 │ measuredWidthRef.current = width; 2026-10-22T19:31:22.9405828Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-22T19:31:22.9405893Z 139 │ }; 2026-10-22T19:31:22.9405992Z 140 │ const hasStatus = props.status !== null; 2026-10-22T19:31:22.9406148Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-22T19:31:22.9406224Z 142 │ useEffect(() => { 2026-10-22T19:31:22.9406300Z 143 │ if (!hasStatus) { 2026-10-22T19:31:22.9406393Z 144 │ measuredWidthRef.current = null; 2026-10-22T19:31:22.9406486Z 145 │ capsuleWidth.value = null; 2026-10-22T19:31:22.9406584Z ·  ──────┬───── 2026-10-22T19:31:22.9406738Z · ╰── `capsuleWidth` cannot be modified 2026-10-22T19:31:22.9406798Z 146 │ } 2026-10-22T19:31:22.9406865Z ╰──── 2026-10-22T19:31:22.9407156Z  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-22T19:31:22.9407487Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T19:31:22.9407491Z 2026-10-22T19:31:22.9407710Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-22T19:31:22.9407891Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-22T19:31:22.9408050Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-22T19:31:22.9408138Z 142 │ useEffect(() => { 2026-10-22T19:31:22.9408223Z ·  ───┬─── 2026-10-22T19:31:22.9408550Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-22T19:31:22.9408712Z 143 │ if (!hasStatus) { 2026-10-22T19:31:22.9408825Z 144 │ measuredWidthRef.current = null; 2026-10-22T19:31:22.9408908Z 145 │ capsuleWidth.value = null; 2026-10-22T19:31:22.9408997Z ·  ──────┬───── 2026-10-22T19:31:22.9409152Z · ╰── This modifies `capsuleWidth` 2026-10-22T19:31:22.9409219Z 146 │ } 2026-10-22T19:31:22.9409278Z ╰──── 2026-10-22T19:31:22.9409654Z  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-22T19:31:22.9409988Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T19:31:22.9409993Z 2026-10-22T19:31:22.9410225Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-22T19:31:22.9410407Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-22T19:31:22.9410530Z 130 │ const measuredWidthRef = useRef(null); 2026-10-22T19:31:22.9410666Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-22T19:31:22.9410812Z ·  ───────────────┬─────────────── 2026-10-22T19:31:22.9411088Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-22T19:31:22.9411218Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-22T19:31:22.9411344Z 133 │ if (width === measuredWidthRef.current) { 2026-10-22T19:31:22.9411458Z 134 │ return; 2026-10-22T19:31:22.9411527Z 135 │ } 2026-10-22T19:31:22.9411643Z 136 │ const first = measuredWidthRef.current === null; 2026-10-22T19:31:22.9411742Z 137 │ measuredWidthRef.current = width; 2026-10-22T19:31:22.9411898Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-22T19:31:22.9411985Z ·  ──────┬───── 2026-10-22T19:31:22.9412135Z · ╰── This modifies `capsuleWidth` 2026-10-22T19:31:22.9412203Z 139 │ }; 2026-10-22T19:31:22.9412274Z ╰──── 2026-10-22T19:31:22.9412661Z  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-22T19:31:22.9412990Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T19:31:22.9412994Z 2026-10-22T19:31:22.9413261Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-22T19:31:22.9413443Z ╭─[apps/web/src/components/pullRequest/pullRequestList.logic.ts:187:9] 2026-10-22T19:31:22.9413524Z 186 │ ): boolean { 2026-10-22T19:31:22.9413698Z 187 │ const labels = entry.labels.map((label) => label.name.trim().toLowerCase()); 2026-10-22T19:31:22.9413884Z ·  ───────────────────────────────────────────────────────────────────── 2026-10-22T19:31:22.9414052Z 188 │ const holds = (label: string) => labels.includes(label.trim().toLowerCase()); 2026-10-22T19:31:22.9414204Z ╰──── 2026-10-22T19:31:22.9414359Z  help: Switch to `Set` 2026-10-22T19:31:22.9414363Z 2026-10-22T19:31:22.9414666Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-22T19:31:22.9414862Z ╭─[apps/web/src/components/settings/ProviderSettingsPanel.logic.ts:4:8] 2026-10-22T19:31:22.9414988Z 3 │ AuthProvidersManageScope, 2026-10-22T19:31:22.9415116Z 4 │ type AuthSessionState, 2026-10-22T19:31:22.9415220Z ·  ────────┬─────── 2026-10-22T19:31:22.9415395Z · ╰── 'AuthSessionState' is imported here 2026-10-22T19:31:22.9415474Z 5 │ type EnvironmentId, 2026-10-22T19:31:22.9415537Z ╰──── 2026-10-22T19:31:22.9415646Z  help: Consider removing this import. 2026-10-22T19:31:22.9415649Z 2026-10-22T19:31:22.9415876Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-22T19:31:22.9416081Z ╭─[apps/mobile/src/features/terminal/TerminalContextSheet.tsx:72:15] 2026-10-22T19:31:22.9416219Z 71 │ ({ thread, now: Date.now() })); 2026-10-22T19:31:22.9417532Z 697 │ if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() }); 2026-10-22T19:31:22.9417690Z ·  ─────┬──── 2026-10-22T19:31:22.9417912Z · ╰── Cannot call impure function 2026-10-22T19:31:22.9418063Z 698 │ const snoozeGateNow = new Date(snoozeGateClock.now).toISOString(); 2026-10-22T19:31:22.9418120Z ╰──── 2026-10-22T19:31:22.9418438Z  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-22T19:31:22.9418776Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-22T19:31:22.9418780Z 2026-10-22T19:31:22.9418978Z ⚠ react(purity): Cannot call impure function during render 2026-10-22T19:31:22.9419165Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:718:71] 2026-10-22T19:31:22.9419254Z 717 │ const snoozePresets = useMemo( 2026-10-22T19:31:22.9419459Z 718 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-22T19:31:22.9419608Z ·  ─────┬──── 2026-10-22T19:31:22.9419816Z · ╰── Cannot call impure function 2026-10-22T19:31:22.9420052Z 719 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-22T19:31:22.9420192Z ╰──── 2026-10-22T19:31:22.9420586Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-22T19:31:22.9420914Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-22T19:31:22.9420917Z 2026-10-22T19:31:22.9421129Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-22T19:31:22.9421298Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:719:6] 2026-10-22T19:31:22.9421501Z 718 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-22T19:31:22.9421642Z 719 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-22T19:31:22.9421756Z ·  ────────────┬─────────── 2026-10-22T19:31:22.9421953Z · ╰── Unnecessary dependency `props.snoozePresetMinute` 2026-10-22T19:31:22.9422021Z 720 │ ); 2026-10-22T19:31:22.9422085Z ╰──── 2026-10-22T19:31:22.9422427Z  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-22T19:31:22.9422761Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9422773Z 2026-10-22T19:31:22.9422975Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-22T19:31:22.9423156Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:765:7] 2026-10-22T19:31:22.9423246Z 764 │ thread.pinnedAt, 2026-10-22T19:31:22.9423322Z 765 │ variant, 2026-10-22T19:31:22.9423407Z ·  ───┬─── 2026-10-22T19:31:22.9423567Z · ╰── Unnecessary dependency `variant` 2026-10-22T19:31:22.9423643Z 766 │ ], 2026-10-22T19:31:22.9423700Z ╰──── 2026-10-22T19:31:22.9424058Z  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-22T19:31:22.9424399Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9424404Z 2026-10-22T19:31:22.9424659Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-22T19:31:22.9424851Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1215:21] 2026-10-22T19:31:22.9425000Z 1214 │ {providerDrivers.slice(0, -1).map((driver, index) => ( 2026-10-22T19:31:22.9425159Z 1215 │ 2026-10-22T19:31:22.9425299Z ·  ────────────────────────── 2026-10-22T19:31:22.9425425Z 1216 │ 2026-10-22T19:31:22.9425484Z ╰──── 2026-10-22T19:31:22.9425645Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-22T19:31:22.9425648Z 2026-10-22T19:31:22.9426038Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T19:31:22.9426374Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:40:5] 2026-10-22T19:31:22.9426512Z 37 │ const [initialized, setInitialized] = useState(false); 2026-10-22T19:31:22.9426588Z 38 │ useLayoutEffect(() => { 2026-10-22T19:31:22.9426691Z ·  ───────┬─────── 2026-10-22T19:31:22.9426842Z · ╰── This is the containing effect 2026-10-22T19:31:22.9426919Z 39 │ reset(); 2026-10-22T19:31:22.9426992Z 40 │ setInitialized(true); 2026-10-22T19:31:22.9427084Z ·  ───────┬────── 2026-10-22T19:31:22.9427274Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:22.9427339Z 41 │ }, [reset]); 2026-10-22T19:31:22.9427401Z ╰──── 2026-10-22T19:31:22.9428072Z  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-22T19:31:22.9428433Z  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-22T19:31:22.9428437Z 2026-10-22T19:31:22.9428726Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T19:31:22.9428899Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:93:5] 2026-10-22T19:31:22.9428960Z 88 │ 2026-10-22T19:31:22.9429037Z 89 │ useEffect(() => { 2026-10-22T19:31:22.9429121Z ·  ────┬──── 2026-10-22T19:31:22.9429263Z · ╰── This is the containing effect 2026-10-22T19:31:22.9429647Z 90 │ if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return; 2026-10-22T19:31:22.9429824Z 91 │ const branchName = initialProjectRef.branch; 2026-10-22T19:31:22.9429936Z 92 │ let active = true; 2026-10-22T19:31:22.9430043Z 93 │ setPendingCheckouts((count) => count + 1); 2026-10-22T19:31:22.9430142Z ·  ─────────┬───────── 2026-10-22T19:31:22.9430334Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:22.9430505Z 94 │ // Serialize replacements: ignoring a stale result cannot undo its Git mutation. 2026-10-22T19:31:22.9430562Z ╰──── 2026-10-22T19:31:22.9431221Z  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-22T19:31:22.9431572Z  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-22T19:31:22.9431575Z 2026-10-22T19:31:22.9431860Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T19:31:22.9432049Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:643:5] 2026-10-22T19:31:22.9432108Z 638 │ 2026-10-22T19:31:22.9432188Z 639 │ useEffect(() => { 2026-10-22T19:31:22.9432415Z ·  ────┬──── 2026-10-22T19:31:22.9432621Z · ╰── This is the containing effect 2026-10-22T19:31:22.9432742Z 640 │ if (pendingLaunchEntry.key === launchTargetKey) { 2026-10-22T19:31:22.9432815Z 641 │ return; 2026-10-22T19:31:22.9432882Z 642 │ } 2026-10-22T19:31:22.9432965Z 643 │ setPendingLaunchEntry({ 2026-10-22T19:31:22.9433064Z ·  ──────────┬────────── 2026-10-22T19:31:22.9433258Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:22.9433341Z 644 │ key: launchTargetKey, 2026-10-22T19:31:22.9433404Z ╰──── 2026-10-22T19:31:22.9434052Z  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-22T19:31:22.9434411Z  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-22T19:31:22.9434414Z 2026-10-22T19:31:22.9434731Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T19:31:22.9435024Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5] 2026-10-22T19:31:22.9435119Z 648 │ 2026-10-22T19:31:22.9435228Z 649 │ useEffect(() => { 2026-10-22T19:31:22.9435357Z ·  ────┬──── 2026-10-22T19:31:22.9435589Z · ╰── This is the containing effect 2026-10-22T19:31:22.9435808Z 650 │ if (initialAttachGridEntry.key === launchTargetKey) { 2026-10-22T19:31:22.9435919Z 651 │ return; 2026-10-22T19:31:22.9436002Z 652 │ } 2026-10-22T19:31:22.9436096Z 653 │ setInitialAttachGridEntry({ 2026-10-22T19:31:22.9436251Z ·  ────────────┬──────────── 2026-10-22T19:31:22.9436542Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:22.9436676Z 654 │ key: launchTargetKey, 2026-10-22T19:31:22.9436753Z ╰──── 2026-10-22T19:31:22.9437404Z  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-22T19:31:22.9437822Z  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-22T19:31:22.9437903Z 2026-10-22T19:31:22.9438180Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T19:31:22.9438368Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7] 2026-10-22T19:31:22.9438430Z 743 │ 2026-10-22T19:31:22.9438502Z 744 │ useEffect(() => { 2026-10-22T19:31:22.9438580Z ·  ────┬──── 2026-10-22T19:31:22.9438726Z · ╰── This is the containing effect 2026-10-22T19:31:22.9438848Z 745 │ if (!routeEnvironmentId || !routeThreadId) { 2026-10-22T19:31:22.9438927Z 746 │ setLastGridSize({ 2026-10-22T19:31:22.9439021Z ·  ───────┬─────── 2026-10-22T19:31:22.9439216Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:22.9439315Z 747 │ cols: DEFAULT_TERMINAL_COLS, 2026-10-22T19:31:22.9439390Z ╰──── 2026-10-22T19:31:22.9440040Z  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-22T19:31:22.9440384Z  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-22T19:31:22.9440387Z 2026-10-22T19:31:22.9440614Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T19:31:22.9440807Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24] 2026-10-22T19:31:22.9440872Z 537 │ }); 2026-10-22T19:31:22.9441011Z 538 │ }, [terminal.buffer, terminal.buffer.length, terminalKey]); 2026-10-22T19:31:22.9441141Z ·  ───────────┬────────── 2026-10-22T19:31:22.9441425Z · ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead 2026-10-22T19:31:22.9441605Z 539 │ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null; 2026-10-22T19:31:22.9441660Z ╰──── 2026-10-22T19:31:22.9441989Z  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-22T19:31:22.9442328Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9442331Z 2026-10-22T19:31:22.9442549Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T19:31:22.9442739Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7] 2026-10-22T19:31:22.9442854Z 708 │ sentInitialInputKeyRef.current = null; 2026-10-22T19:31:22.9442938Z 709 │ }, [terminalKey]); 2026-10-22T19:31:22.9443029Z ·  ─────┬───── 2026-10-22T19:31:22.9443190Z · ╰── Unnecessary dependency `terminalKey` 2026-10-22T19:31:22.9443249Z 710 │ 2026-10-22T19:31:22.9443318Z ╰──── 2026-10-22T19:31:22.9443874Z  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-22T19:31:22.9444270Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9444274Z 2026-10-22T19:31:22.9444493Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T19:31:22.9444747Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52] 2026-10-22T19:31:22.9444815Z 799 │ }; 2026-10-22T19:31:22.9445015Z 800 │ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]); 2026-10-22T19:31:22.9445218Z ·  ────────────┬──────────── ─────┬───── 2026-10-22T19:31:22.9445480Z · │ ╰── Unnecessary dependency `terminalKey` 2026-10-22T19:31:22.9445717Z · ╰── Unnecessary dependency `terminal.lifecycleVersion` 2026-10-22T19:31:22.9445792Z 801 │ 2026-10-22T19:31:22.9445857Z ╰──── 2026-10-22T19:31:22.9446170Z  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-22T19:31:22.9446505Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9446515Z 2026-10-22T19:31:22.9446679Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9446865Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24] 2026-10-22T19:31:22.9446925Z 792 │ } 2026-10-22T19:31:22.9447053Z 793 │ const pasteSession = pasteSessionRef.current; 2026-10-22T19:31:22.9447182Z ·  ───────────┬─────────── 2026-10-22T19:31:22.9447363Z · ╰── Cannot access ref value during render 2026-10-22T19:31:22.9447419Z 794 │ 2026-10-22T19:31:22.9447478Z ╰──── 2026-10-22T19:31:22.9448002Z  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-22T19:31:22.9448324Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9448327Z 2026-10-22T19:31:22.9448533Z ⚠ react(static-components): Cannot create components during render 2026-10-22T19:31:22.9448705Z ╭─[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10] 2026-10-22T19:31:22.9448815Z 196 │ const { onInput, onResize } = props; 2026-10-22T19:31:22.9448976Z 197 │ const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView(); 2026-10-22T19:31:22.9449124Z ·  ────────────────┬─────────────── 2026-10-22T19:31:22.9449404Z · ╰── The component is created during render here 2026-10-22T19:31:22.9449601Z 198 │ const hasNativeSurface = Boolean(NativeTerminalSurfaceView); 2026-10-22T19:31:22.9449669Z 199 │ 2026-10-22T19:31:22.9449753Z 200 │ useEffect(() => { 2026-10-22T19:31:22.9449852Z 201 │ terminalDebugLog("native:surface", { 2026-10-22T19:31:22.9449957Z 202 │ terminalKey: props.terminalKey, 2026-10-22T19:31:22.9450049Z 203 │ native: hasNativeSurface, 2026-10-22T19:31:22.9450205Z 204 │ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(), 2026-10-22T19:31:22.9450298Z 205 │ bufferLen: props.buffer.length, 2026-10-22T19:31:22.9450394Z 206 │ isRunning: props.isRunning, 2026-10-22T19:31:22.9450459Z 207 │ }); 2026-10-22T19:31:22.9450632Z 208 │ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]); 2026-10-22T19:31:22.9450737Z 209 │ const handleNativeInput = useCallback( 2026-10-22T19:31:22.9450877Z 210 │ (event: NativeSyntheticEvent) => { 2026-10-22T19:31:22.9450989Z 211 │ if (!props.isRunning || props.readOnly) { 2026-10-22T19:31:22.9451064Z 212 │ return; 2026-10-22T19:31:22.9451127Z 213 │ } 2026-10-22T19:31:22.9451233Z 214 │ terminalDebugLog("native:onInput", { 2026-10-22T19:31:22.9451411Z 215 │ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)), 2026-10-22T19:31:22.9451485Z 216 │ }); 2026-10-22T19:31:22.9451585Z 217 │ onInput(event.nativeEvent.data); 2026-10-22T19:31:22.9451651Z 218 │ }, 2026-10-22T19:31:22.9451763Z 219 │ [onInput, props.isRunning, props.readOnly], 2026-10-22T19:31:22.9451828Z 220 │ ); 2026-10-22T19:31:22.9451929Z 221 │ const handleNativeResize = useCallback( 2026-10-22T19:31:22.9452068Z 222 │ (event: NativeSyntheticEvent) => { 2026-10-22T19:31:22.9452145Z 223 │ onResize({ 2026-10-22T19:31:22.9452237Z 224 │ cols: event.nativeEvent.cols, 2026-10-22T19:31:22.9452334Z 225 │ rows: event.nativeEvent.rows, 2026-10-22T19:31:22.9452403Z 226 │ }); 2026-10-22T19:31:22.9452471Z 227 │ }, 2026-10-22T19:31:22.9452541Z 228 │ [onResize], 2026-10-22T19:31:22.9452611Z 229 │ ); 2026-10-22T19:31:22.9452682Z 230 │ 2026-10-22T19:31:22.9452783Z 231 │ if (NativeTerminalSurfaceView) { 2026-10-22T19:31:22.9452850Z 232 │ return ( 2026-10-22T19:31:22.9452942Z 233 │ 2026-10-22T19:31:22.9453044Z 234 │ ({ key: input.targetKey, location: candidate })); 2026-10-22T19:31:22.9455054Z 113 │ useEffect(() => { 2026-10-22T19:31:22.9455131Z ·  ────┬──── 2026-10-22T19:31:22.9455281Z · ╰── This is the containing effect 2026-10-22T19:31:22.9455462Z 114 │ if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) { 2026-10-22T19:31:22.9455535Z 115 │ return; 2026-10-22T19:31:22.9455600Z 116 │ } 2026-10-22T19:31:22.9455732Z 117 │ setEntry({ key: input.targetKey, location: candidate }); 2026-10-22T19:31:22.9455817Z ·  ────┬─── 2026-10-22T19:31:22.9456000Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:22.9456140Z 118 │ }, [candidate, entry.key, entry.location, input.targetKey]); 2026-10-22T19:31:22.9456205Z ╰──── 2026-10-22T19:31:22.9456868Z  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-22T19:31:22.9457227Z  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-22T19:31:22.9457230Z 2026-10-22T19:31:22.9457505Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T19:31:22.9457683Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:444:5] 2026-10-22T19:31:22.9457757Z 434 │ : null; 2026-10-22T19:31:22.9457837Z 435 │ useEffect(() => { 2026-10-22T19:31:22.9457919Z ·  ────┬──── 2026-10-22T19:31:22.9458066Z · ╰── This is the containing effect 2026-10-22T19:31:22.9458137Z 436 │ if ( 2026-10-22T19:31:22.9458234Z 437 │ props.active === false || 2026-10-22T19:31:22.9458316Z 438 │ activeDraftKey !== null || 2026-10-22T19:31:22.9458414Z 439 │ editingPendingTask !== null || 2026-10-22T19:31:22.9458504Z 440 │ selectedProject === null 2026-10-22T19:31:22.9458575Z 441 │ ) { 2026-10-22T19:31:22.9458641Z 442 │ return; 2026-10-22T19:31:22.9458713Z 443 │ } 2026-10-22T19:31:22.9458804Z 444 │ setActiveDraftKey( 2026-10-22T19:31:22.9458909Z ·  ────────┬──────── 2026-10-22T19:31:22.9459096Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:22.9459197Z 445 │ createNewTaskDraft({ 2026-10-22T19:31:22.9459275Z ╰──── 2026-10-22T19:31:22.9459924Z  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-22T19:31:22.9460266Z  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-22T19:31:22.9460275Z 2026-10-22T19:31:22.9460541Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-22T19:31:22.9460781Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1244:36] 2026-10-22T19:31:22.9460956Z 1243 │ 2026-10-22T19:31:22.9461204Z 1244 │ {props.children} 2026-10-22T19:31:22.9461337Z ·  ───────────── 2026-10-22T19:31:22.9461424Z 1245 │ 2026-10-22T19:31:22.9461484Z ╰──── 2026-10-22T19:31:22.9531012Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-22T19:31:22.9531346Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-22T19:31:22.9531353Z 2026-10-22T19:31:22.9531903Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-22T19:31:22.9532119Z ╭─[apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx:814:17] 2026-10-22T19:31:22.9532202Z 813 │
{ 2026-10-22T19:31:22.9539149Z ·  ────┬──── 2026-10-22T19:31:22.9539292Z · ╰── This is the containing effect 2026-10-22T19:31:22.9539437Z 30 │ if (snapshot && snapshot !== live) setHeld({ key, snapshot }); 2026-10-22T19:31:22.9539558Z ·  ───┬─── 2026-10-22T19:31:22.9539777Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:22.9539858Z 31 │ }, [key, live, snapshot]); 2026-10-22T19:31:22.9539931Z ╰──── 2026-10-22T19:31:22.9540602Z  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-22T19:31:22.9540958Z  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-22T19:31:22.9540961Z 2026-10-22T19:31:22.9541239Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T19:31:22.9541401Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:57:5] 2026-10-22T19:31:22.9541464Z 55 │ 2026-10-22T19:31:22.9541604Z 56 │ useEffect(() => { 2026-10-22T19:31:22.9541737Z ·  ────┬──── 2026-10-22T19:31:22.9541966Z · ╰── This is the containing effect 2026-10-22T19:31:22.9542095Z 57 │ setDecodedSize(null); 2026-10-22T19:31:22.9542187Z ·  ───────┬────── 2026-10-22T19:31:22.9542378Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:22.9542452Z 58 │ }, [props.sourceKey]); 2026-10-22T19:31:22.9542518Z ╰──── 2026-10-22T19:31:22.9543172Z  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-22T19:31:22.9543537Z  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-22T19:31:22.9543544Z 2026-10-22T19:31:22.9543824Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T19:31:22.9543984Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5] 2026-10-22T19:31:22.9544043Z 59 │ 2026-10-22T19:31:22.9544113Z 60 │ useEffect(() => { 2026-10-22T19:31:22.9544188Z ·  ────┬──── 2026-10-22T19:31:22.9544333Z · ╰── This is the containing effect 2026-10-22T19:31:22.9544411Z 61 │ setFailedUri(null); 2026-10-22T19:31:22.9544496Z ·  ──────┬───── 2026-10-22T19:31:22.9544789Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:22.9544867Z 62 │ }, [props.uri]); 2026-10-22T19:31:22.9544930Z ╰──── 2026-10-22T19:31:22.9545571Z  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-22T19:31:22.9545917Z  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-22T19:31:22.9545920Z 2026-10-22T19:31:22.9546152Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-22T19:31:22.9546321Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10] 2026-10-22T19:31:22.9546463Z 6 │ import { parse, SvgAst, type JsxAST } from "react-native-svg"; 2026-10-22T19:31:22.9546661Z 7 │ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native"; 2026-10-22T19:31:22.9546769Z ·  ────────┬──────── 2026-10-22T19:31:22.9546930Z · ╰── 'ActivityIndicator' is imported here 2026-10-22T19:31:22.9546996Z 8 │ 2026-10-22T19:31:22.9547054Z ╰──── 2026-10-22T19:31:22.9547167Z  help: Consider removing this import. 2026-10-22T19:31:22.9547176Z 2026-10-22T19:31:22.9547394Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T19:31:22.9547693Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7] 2026-10-22T19:31:22.9547852Z 57 │ setDecodedSize(null); 2026-10-22T19:31:22.9547977Z 58 │ }, [props.sourceKey]); 2026-10-22T19:31:22.9548072Z ·  ───────┬─────── 2026-10-22T19:31:22.9548250Z · ╰── Unnecessary dependency `props.sourceKey` 2026-10-22T19:31:22.9548315Z 59 │ 2026-10-22T19:31:22.9548371Z ╰──── 2026-10-22T19:31:22.9548699Z  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-22T19:31:22.9549035Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9549037Z 2026-10-22T19:31:22.9549266Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T19:31:22.9549584Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7] 2026-10-22T19:31:22.9549675Z 61 │ setFailedUri(null); 2026-10-22T19:31:22.9549753Z 62 │ }, [props.uri]); 2026-10-22T19:31:22.9549838Z ·  ────┬──── 2026-10-22T19:31:22.9550006Z · ╰── Unnecessary dependency `props.uri` 2026-10-22T19:31:22.9550065Z 63 │ 2026-10-22T19:31:22.9550125Z ╰──── 2026-10-22T19:31:22.9550455Z  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-22T19:31:22.9550795Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9550803Z 2026-10-22T19:31:22.9550988Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-22T19:31:22.9551146Z ╭─[apps/server/src/process/externalLauncher.test.ts:186:12] 2026-10-22T19:31:22.9551215Z 185 │ 2026-10-22T19:31:22.9551338Z 186 │ for (const {} of ["darwin", "linux"] as const) { 2026-10-22T19:31:22.9551414Z ·  ── 2026-10-22T19:31:22.9551475Z 187 │ } 2026-10-22T19:31:22.9551539Z ╰──── 2026-10-22T19:31:22.9551790Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-22T19:31:22.9551793Z 2026-10-22T19:31:22.9551976Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-22T19:31:22.9552132Z ╭─[apps/server/src/process/externalLauncher.test.ts:189:12] 2026-10-22T19:31:22.9552195Z 188 │ 2026-10-22T19:31:22.9552271Z 189 │ for (const {} of [ 2026-10-22T19:31:22.9552346Z ·  ── 2026-10-22T19:31:22.9552452Z 190 │ { kind: "browser", folderVerb: "none" }, 2026-10-22T19:31:22.9552512Z ╰──── 2026-10-22T19:31:22.9552755Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-22T19:31:22.9552758Z 2026-10-22T19:31:22.9552938Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-22T19:31:22.9553083Z ╭─[apps/server/src/process/externalLauncher.test.ts:311:12] 2026-10-22T19:31:22.9553140Z 310 │ 2026-10-22T19:31:22.9553290Z 311 │ for (const {} of ["rejected", "spawn-error", "stalled"] as const) { 2026-10-22T19:31:22.9553373Z ·  ── 2026-10-22T19:31:22.9553615Z 312 │ } 2026-10-22T19:31:22.9553752Z ╰──── 2026-10-22T19:31:22.9554051Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-22T19:31:22.9554054Z 2026-10-22T19:31:22.9554235Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-22T19:31:22.9554383Z ╭─[apps/server/src/process/externalLauncher.test.ts:314:12] 2026-10-22T19:31:22.9554448Z 313 │ 2026-10-22T19:31:22.9554520Z 314 │ for (const {} of [ 2026-10-22T19:31:22.9554687Z ·  ── 2026-10-22T19:31:22.9554778Z 315 │ { 2026-10-22T19:31:22.9554843Z ╰──── 2026-10-22T19:31:22.9555088Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-22T19:31:22.9555090Z 2026-10-22T19:31:22.9555412Z ⚠ eslint(no-unused-vars): Variable 'revokeActiveMcpThread' is declared but never used. Unused variables should start with a '_'. 2026-10-22T19:31:22.9555548Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:218:7] 2026-10-22T19:31:22.9555606Z 217 │ 2026-10-22T19:31:22.9555764Z 218 │ const revokeActiveMcpThread = (threadId: ThreadId): Effect.Effect => 2026-10-22T19:31:22.9555873Z ·  ──────────┬────────── 2026-10-22T19:31:22.9556045Z · ╰── 'revokeActiveMcpThread' is declared here 2026-10-22T19:31:22.9556258Z 219 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeThread(threadId) : Effect.void; 2026-10-22T19:31:22.9556323Z ╰──── 2026-10-22T19:31:22.9556448Z  help: Consider removing this declaration. 2026-10-22T19:31:22.9556451Z 2026-10-22T19:31:22.9556789Z ⚠ eslint(no-unused-vars): Variable 'revokeAllActiveMcpCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-22T19:31:22.9556934Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:221:7] 2026-10-22T19:31:22.9556994Z 220 │ 2026-10-22T19:31:22.9557145Z 221 │ const revokeAllActiveMcpCredentials = (): Effect.Effect => 2026-10-22T19:31:22.9557263Z ·  ──────────────┬────────────── 2026-10-22T19:31:22.9557459Z · ╰── 'revokeAllActiveMcpCredentials' is declared here 2026-10-22T19:31:22.9557640Z 222 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void; 2026-10-22T19:31:22.9557704Z ╰──── 2026-10-22T19:31:22.9557818Z  help: Consider removing this declaration. 2026-10-22T19:31:22.9557821Z 2026-10-22T19:31:22.9558258Z ⚠ eslint(no-unused-vars): Function 'assertUserMessagesExclude' is declared but never used. 2026-10-22T19:31:22.9558595Z ╭─[apps/server/src/orchestration-v2/testkit/fixtures/shared.ts:1398:10] 2026-10-22T19:31:22.9558664Z 1397 │ 2026-10-22T19:31:22.9558760Z 1398 │ function assertUserMessagesExclude( 2026-10-22T19:31:22.9558880Z ·  ────────────┬──────────── 2026-10-22T19:31:22.9559070Z · ╰── 'assertUserMessagesExclude' is declared here 2026-10-22T19:31:22.9559203Z 1399 │ projection: OrchestrationV2ThreadProjection, 2026-10-22T19:31:22.9559263Z ╰──── 2026-10-22T19:31:22.9559384Z  help: Consider removing this declaration. 2026-10-22T19:31:22.9559387Z 2026-10-22T19:31:22.9559619Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T19:31:22.9559778Z ╭─[apps/mobile/src/state/use-thread-outbox-drain.ts:1315:5] 2026-10-22T19:31:22.9559877Z 1314 │ queuedMessagesByThreadKey, 2026-10-22T19:31:22.9559946Z 1315 │ retryTick, 2026-10-22T19:31:22.9560033Z ·  ────┬──── 2026-10-22T19:31:22.9560187Z · ╰── Unnecessary dependency `retryTick` 2026-10-22T19:31:22.9560272Z 1316 │ restoreQueuedMessage, 2026-10-22T19:31:22.9560329Z ╰──── 2026-10-22T19:31:22.9560649Z  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-22T19:31:22.9560985Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9560993Z 2026-10-22T19:31:22.9561261Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-22T19:31:22.9561514Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:290:50] 2026-10-22T19:31:22.9561636Z 289 │ return ( 2026-10-22T19:31:22.9561865Z 290 │ 2026-10-22T19:31:22.9562069Z ·  ───────────── 2026-10-22T19:31:22.9562175Z 291 │ {props.children} 2026-10-22T19:31:22.9562265Z ╰──── 2026-10-22T19:31:22.9562632Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-22T19:31:22.9562896Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-22T19:31:22.9562904Z 2026-10-22T19:31:22.9563214Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-22T19:31:22.9563383Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:654:44] 2026-10-22T19:31:22.9563463Z 653 │ return ( 2026-10-22T19:31:22.9563603Z 654 │ 2026-10-22T19:31:22.9563736Z ·  ───────────── 2026-10-22T19:31:22.9563813Z 655 │ {props.children} 2026-10-22T19:31:22.9563877Z ╰──── 2026-10-22T19:31:22.9564119Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-22T19:31:22.9564264Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-22T19:31:22.9564363Z 2026-10-22T19:31:22.9564765Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-22T19:31:22.9564943Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1462:55] 2026-10-22T19:31:22.9565013Z 1461 │ return ( 2026-10-22T19:31:22.9565199Z 1462 │ 2026-10-22T19:31:22.9565343Z ·  ──────────────────── 2026-10-22T19:31:22.9565459Z 1463 │ { 2026-10-22T19:31:22.9566603Z ·  ────┬──── 2026-10-22T19:31:22.9566752Z · ╰── This is the containing effect 2026-10-22T19:31:22.9566826Z 261 │ stop(); 2026-10-22T19:31:22.9566901Z ·  ──┬─ 2026-10-22T19:31:22.9567090Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:22.9567175Z 262 │ }, [orderVersion]); 2026-10-22T19:31:22.9567240Z ╰──── 2026-10-22T19:31:22.9567882Z  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-22T19:31:22.9568232Z  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-22T19:31:22.9568234Z 2026-10-22T19:31:22.9568471Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-22T19:31:22.9568649Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-22T19:31:22.9568726Z 260 │ useEffect(() => { 2026-10-22T19:31:22.9568790Z 261 │ stop(); 2026-10-22T19:31:22.9568867Z ·  ──┬─ 2026-10-22T19:31:22.9569009Z · ╰── Missing dependency `stop` 2026-10-22T19:31:22.9569081Z 262 │ }, [orderVersion]); 2026-10-22T19:31:22.9569167Z ·  ──────┬───── 2026-10-22T19:31:22.9569336Z · ╰── Unnecessary dependency `orderVersion` 2026-10-22T19:31:22.9569406Z 263 │ useEffect( 2026-10-22T19:31:22.9569464Z ╰──── 2026-10-22T19:31:22.9569916Z  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-22T19:31:22.9570339Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9570394Z 2026-10-22T19:31:22.9570672Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9570868Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9] 2026-10-22T19:31:22.9570960Z 95 │ const latest = useRef(props); 2026-10-22T19:31:22.9571034Z 96 │ latest.current = props; 2026-10-22T19:31:22.9571164Z ·  ───┬──────┬─── 2026-10-22T19:31:22.9571362Z · │ ╰── Cannot update ref value during render 2026-10-22T19:31:22.9571495Z · ╰── This value is a ref 2026-10-22T19:31:22.9571569Z 97 │ const gesture = useMemo( 2026-10-22T19:31:22.9571627Z ╰──── 2026-10-22T19:31:22.9572148Z  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-22T19:31:22.9572475Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9572477Z 2026-10-22T19:31:22.9572637Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9572813Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18] 2026-10-22T19:31:22.9572890Z 103 │ .runOnJS(true) 2026-10-22T19:31:22.9573010Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-22T19:31:22.9573142Z ·  ───────────────┬────────────── 2026-10-22T19:31:22.9573366Z · ╰── Passing a ref to a function may read its value during render 2026-10-22T19:31:22.9573513Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-22T19:31:22.9573572Z ╰──── 2026-10-22T19:31:22.9574075Z  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-22T19:31:22.9574391Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9574403Z 2026-10-22T19:31:22.9574621Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9574817Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19] 2026-10-22T19:31:22.9574931Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-22T19:31:22.9575078Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-22T19:31:22.9575233Z ·  ──────────────────────────┬───────────────────────── 2026-10-22T19:31:22.9575465Z · ╰── Passing a ref to a function may read its value during render 2026-10-22T19:31:22.9575605Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-22T19:31:22.9575670Z ╰──── 2026-10-22T19:31:22.9576339Z  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-22T19:31:22.9576841Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9576844Z 2026-10-22T19:31:22.9577014Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9577190Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16] 2026-10-22T19:31:22.9577338Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-22T19:31:22.9577469Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-22T19:31:22.9577634Z ·  ──────────────────────────┬───────────────────────── 2026-10-22T19:31:22.9577872Z · ╰── Passing a ref to a function may read its value during render 2026-10-22T19:31:22.9578016Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-22T19:31:22.9578073Z ╰──── 2026-10-22T19:31:22.9578575Z  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-22T19:31:22.9578888Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9578891Z 2026-10-22T19:31:22.9579052Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9579227Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21] 2026-10-22T19:31:22.9579361Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-22T19:31:22.9579503Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-22T19:31:22.9579659Z ·  ───────────────────────┬────────────────────── 2026-10-22T19:31:22.9579888Z · ╰── Passing a ref to a function may read its value during render 2026-10-22T19:31:22.9579962Z 108 │ [props.disabled], 2026-10-22T19:31:22.9580023Z ╰──── 2026-10-22T19:31:22.9580531Z  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-22T19:31:22.9580848Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9580851Z 2026-10-22T19:31:22.9581008Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9581175Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:249:9] 2026-10-22T19:31:22.9581307Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-22T19:31:22.9581426Z 249 │ latest.current = { rows, planners, moveThread }; 2026-10-22T19:31:22.9581543Z ·  ───┬──────┬─── 2026-10-22T19:31:22.9581737Z · │ ╰── Cannot update ref value during render 2026-10-22T19:31:22.9581939Z · ╰── This value is a ref 2026-10-22T19:31:22.9582066Z 250 │ 2026-10-22T19:31:22.9582128Z ╰──── 2026-10-22T19:31:22.9582624Z  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-22T19:31:22.9582945Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9582947Z 2026-10-22T19:31:22.9583102Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9583274Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:247:22] 2026-10-22T19:31:22.9583412Z 246 │ const [preview, setPreview] = useState(null); 2026-10-22T19:31:22.9583538Z 247 │ const translateY = useRef(new Animated.Value(0)).current; 2026-10-22T19:31:22.9583683Z ·  ──────────────────┬────────────────── 2026-10-22T19:31:22.9583867Z · ╰── Cannot access ref value during render 2026-10-22T19:31:22.9583992Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-22T19:31:22.9584048Z ╰──── 2026-10-22T19:31:22.9584602Z  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-22T19:31:22.9584940Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9584946Z 2026-10-22T19:31:22.9585133Z ⚠ react(purity): Cannot call impure function during render 2026-10-22T19:31:22.9585309Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:324:16] 2026-10-22T19:31:22.9585379Z 323 │ update(0); 2026-10-22T19:31:22.9585470Z 324 │ let last = performance.now(); 2026-10-22T19:31:22.9585579Z ·  ────────┬──────── 2026-10-22T19:31:22.9585744Z · ╰── Cannot call impure function 2026-10-22T19:31:22.9585819Z 325 │ const tick = () => { 2026-10-22T19:31:22.9585881Z ╰──── 2026-10-22T19:31:22.9586220Z  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-22T19:31:22.9586606Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-22T19:31:22.9586646Z 2026-10-22T19:31:22.9586849Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-22T19:31:22.9587030Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15] 2026-10-22T19:31:22.9587097Z  98 │ () => 2026-10-22T19:31:22.9587171Z  99 │ Gesture.Pan() 2026-10-22T19:31:22.9587252Z ·  ─┬─ 2026-10-22T19:31:22.9587400Z · ╰── `Pan` may be a component 2026-10-22T19:31:22.9587495Z 100 │ .enabled(!props.disabled) 2026-10-22T19:31:22.9587560Z ╰──── 2026-10-22T19:31:22.9587861Z  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-22T19:31:22.9588344Z  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-22T19:31:22.9588346Z 2026-10-22T19:31:22.9588565Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-22T19:31:22.9588736Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5] 2026-10-22T19:31:22.9588821Z 103 │ .runOnJS(true) 2026-10-22T19:31:22.9588934Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-22T19:31:22.9589040Z ·  ───┬── 2026-10-22T19:31:22.9589757Z · ╰── 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-22T19:31:22.9589929Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-22T19:31:22.9590063Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-22T19:31:22.9590197Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-22T19:31:22.9590281Z 108 │ [props.disabled], 2026-10-22T19:31:22.9590400Z ·  ────────┬─────── 2026-10-22T19:31:22.9590609Z · ╰── This dependency list is missing values used by the callback 2026-10-22T19:31:22.9590676Z 109 │ ); 2026-10-22T19:31:22.9590739Z ╰──── 2026-10-22T19:31:22.9590977Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-22T19:31:22.9591324Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9591336Z 2026-10-22T19:31:22.9591644Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-22T19:31:22.9591840Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:387:19] 2026-10-22T19:31:22.9591917Z 386 │ onFilters, 2026-10-22T19:31:22.9592008Z 387 │ authorOptions = [], 2026-10-22T19:31:22.9592090Z ·  ── 2026-10-22T19:31:22.9592169Z 388 │ labelOptions = [], 2026-10-22T19:31:22.9592230Z ╰──── 2026-10-22T19:31:22.9592775Z  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-22T19:31:22.9592853Z 2026-10-22T19:31:22.9593229Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-22T19:31:22.9593416Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:388:18] 2026-10-22T19:31:22.9593494Z 387 │ authorOptions = [], 2026-10-22T19:31:22.9593575Z 388 │ labelOptions = [], 2026-10-22T19:31:22.9593660Z ·  ── 2026-10-22T19:31:22.9593738Z 389 │ host, 2026-10-22T19:31:22.9593810Z ╰──── 2026-10-22T19:31:22.9594154Z  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-22T19:31:22.9594159Z 2026-10-22T19:31:22.9594340Z ⚠ react(purity): Cannot call impure function during render 2026-10-22T19:31:22.9594502Z ╭─[apps/web/src/components/CommandPalette.tsx:1996:20] 2026-10-22T19:31:22.9594756Z 1995 │ title: inferProjectTitleFromPath(destinationPath), 2026-10-22T19:31:22.9594863Z 1996 │ createdAt: new Date().toISOString(), 2026-10-22T19:31:22.9594961Z ·  ─────┬──── 2026-10-22T19:31:22.9595117Z · ╰── Cannot call impure function 2026-10-22T19:31:22.9595241Z 1997 │ remoteUrl: addProjectCloneFlow.remoteUrl, 2026-10-22T19:31:22.9595306Z ╰──── 2026-10-22T19:31:22.9595612Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-22T19:31:22.9595931Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-22T19:31:22.9595934Z 2026-10-22T19:31:22.9596112Z ⚠ react(immutability): This value cannot be modified 2026-10-22T19:31:22.9596284Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-22T19:31:22.9596343Z  86 │ 2026-10-22T19:31:22.9596495Z  87 │ const cardCoverage = props.cardCoverage; 2026-10-22T19:31:22.9596592Z ·  ──────┬───── 2026-10-22T19:31:22.9596745Z · ╰── `cardCoverage` originates here 2026-10-22T19:31:22.9596834Z  88 │ const barHeightRef = useRef(0); 2026-10-22T19:31:22.9596925Z  89 │ const cardHeightRef = useRef(0); 2026-10-22T19:31:22.9597023Z  90 │ const cardHeight = useSharedValue(0); 2026-10-22T19:31:22.9597127Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-22T19:31:22.9597212Z  92 │ if (!cardCoverage) { 2026-10-22T19:31:22.9597280Z  93 │ return; 2026-10-22T19:31:22.9597348Z  94 │ } 2026-10-22T19:31:22.9597512Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-22T19:31:22.9597609Z  96 │ if (coverage === cardCoverage.value) { 2026-10-22T19:31:22.9597671Z  97 │ return; 2026-10-22T19:31:22.9597731Z  98 │ } 2026-10-22T19:31:22.9597819Z  99 │ if (cardCoverage.value === 0) { 2026-10-22T19:31:22.9597912Z 100 │ cardCoverage.value = coverage; 2026-10-22T19:31:22.9598011Z ·  ──────┬───── 2026-10-22T19:31:22.9598249Z · ╰── `cardCoverage` cannot be modified 2026-10-22T19:31:22.9598374Z 101 │ return; 2026-10-22T19:31:22.9598454Z ╰──── 2026-10-22T19:31:22.9598775Z  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-22T19:31:22.9599106Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T19:31:22.9599109Z 2026-10-22T19:31:22.9599278Z ⚠ react(immutability): This value cannot be modified 2026-10-22T19:31:22.9599451Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7] 2026-10-22T19:31:22.9599536Z  89 │ const cardHeightRef = useRef(0); 2026-10-22T19:31:22.9599637Z  90 │ const cardHeight = useSharedValue(0); 2026-10-22T19:31:22.9599724Z ·  ─────┬──── 2026-10-22T19:31:22.9599876Z · ╰── `cardHeight` originates here 2026-10-22T19:31:22.9599975Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-22T19:31:22.9600048Z  92 │ if (!cardCoverage) { 2026-10-22T19:31:22.9600122Z  93 │ return; 2026-10-22T19:31:22.9600185Z  94 │ } 2026-10-22T19:31:22.9600344Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-22T19:31:22.9600441Z  96 │ if (coverage === cardCoverage.value) { 2026-10-22T19:31:22.9600508Z  97 │ return; 2026-10-22T19:31:22.9600567Z  98 │ } 2026-10-22T19:31:22.9600659Z  99 │ if (cardCoverage.value === 0) { 2026-10-22T19:31:22.9600753Z 100 │ cardCoverage.value = coverage; 2026-10-22T19:31:22.9600822Z 101 │ return; 2026-10-22T19:31:22.9600885Z 102 │ } 2026-10-22T19:31:22.9601048Z 103 │ cardCoverage.value = withTiming(coverage, { 2026-10-22T19:31:22.9601174Z 104 │ duration: USER_INPUT_TOGGLE_DURATION_MS, 2026-10-22T19:31:22.9601314Z 105 │ easing: Easing.out(Easing.cubic), 2026-10-22T19:31:22.9601461Z 106 │ }); 2026-10-22T19:31:22.9601577Z 107 │ }, [cardCoverage]); 2026-10-22T19:31:22.9601752Z 108 │ const handleBarLayout = useCallback( 2026-10-22T19:31:22.9601892Z 109 │ (event: LayoutChangeEvent) => { 2026-10-22T19:31:22.9602093Z 110 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-22T19:31:22.9602232Z 111 │ notifyCoverage(); 2026-10-22T19:31:22.9602304Z 112 │ }, 2026-10-22T19:31:22.9602387Z 113 │ [notifyCoverage], 2026-10-22T19:31:22.9602452Z 114 │ ); 2026-10-22T19:31:22.9602570Z 115 │ const handleCardLayout = useCallback( 2026-10-22T19:31:22.9602689Z 116 │ (event: LayoutChangeEvent) => { 2026-10-22T19:31:22.9602845Z 117 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-22T19:31:22.9602974Z 118 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-22T19:31:22.9603112Z ·  ─────┬──── 2026-10-22T19:31:22.9603355Z · ╰── `cardHeight` cannot be modified 2026-10-22T19:31:22.9603466Z 119 │ notifyCoverage(); 2026-10-22T19:31:22.9603557Z ╰──── 2026-10-22T19:31:22.9604066Z  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-22T19:31:22.9604683Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T19:31:22.9604776Z 2026-10-22T19:31:22.9605212Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-22T19:31:22.9605469Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-22T19:31:22.9605620Z  90 │ const cardHeight = useSharedValue(0); 2026-10-22T19:31:22.9605790Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-22T19:31:22.9606002Z ·  ───┬─── 2026-10-22T19:31:22.9606458Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-22T19:31:22.9606593Z  92 │ if (!cardCoverage) { 2026-10-22T19:31:22.9606713Z  93 │ return; 2026-10-22T19:31:22.9606812Z  94 │ } 2026-10-22T19:31:22.9607090Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-22T19:31:22.9607261Z  96 │ if (coverage === cardCoverage.value) { 2026-10-22T19:31:22.9607376Z  97 │ return; 2026-10-22T19:31:22.9607478Z  98 │ } 2026-10-22T19:31:22.9607611Z  99 │ if (cardCoverage.value === 0) { 2026-10-22T19:31:22.9607754Z 100 │ cardCoverage.value = coverage; 2026-10-22T19:31:22.9607889Z ·  ──────┬───── 2026-10-22T19:31:22.9608078Z · ╰── This modifies `cardCoverage` 2026-10-22T19:31:22.9608141Z 101 │ return; 2026-10-22T19:31:22.9608207Z ╰──── 2026-10-22T19:31:22.9608590Z  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-22T19:31:22.9608929Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T19:31:22.9608935Z 2026-10-22T19:31:22.9609153Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-22T19:31:22.9609330Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-22T19:31:22.9609430Z  99 │ if (cardCoverage.value === 0) { 2026-10-22T19:31:22.9609529Z 100 │ cardCoverage.value = coverage; 2026-10-22T19:31:22.9609618Z ·  ──────┬───── 2026-10-22T19:31:22.9609767Z · ╰── This modifies `cardCoverage` 2026-10-22T19:31:22.9609838Z 101 │ return; 2026-10-22T19:31:22.9609899Z 102 │ } 2026-10-22T19:31:22.9610006Z 103 │ cardCoverage.value = withTiming(coverage, { 2026-10-22T19:31:22.9610118Z 104 │ duration: USER_INPUT_TOGGLE_DURATION_MS, 2026-10-22T19:31:22.9610219Z 105 │ easing: Easing.out(Easing.cubic), 2026-10-22T19:31:22.9610285Z 106 │ }); 2026-10-22T19:31:22.9610357Z 107 │ }, [cardCoverage]); 2026-10-22T19:31:22.9610453Z 108 │ const handleBarLayout = useCallback( 2026-10-22T19:31:22.9610547Z 109 │ (event: LayoutChangeEvent) => { 2026-10-22T19:31:22.9610671Z ·  ───────────────┬─────────────── 2026-10-22T19:31:22.9610914Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-22T19:31:22.9611056Z 110 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-22T19:31:22.9611120Z ╰──── 2026-10-22T19:31:22.9611582Z  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-22T19:31:22.9612045Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T19:31:22.9612061Z 2026-10-22T19:31:22.9612290Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-22T19:31:22.9612468Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7] 2026-10-22T19:31:22.9612567Z 115 │ const handleCardLayout = useCallback( 2026-10-22T19:31:22.9612661Z 116 │ (event: LayoutChangeEvent) => { 2026-10-22T19:31:22.9612775Z ·  ───────────────┬─────────────── 2026-10-22T19:31:22.9613027Z · ╰── This function may (indirectly) reassign or modify `cardHeight` after render 2026-10-22T19:31:22.9613175Z 117 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-22T19:31:22.9613312Z 118 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-22T19:31:22.9613394Z ·  ─────┬──── 2026-10-22T19:31:22.9613545Z · ╰── This modifies `cardHeight` 2026-10-22T19:31:22.9613628Z 119 │ notifyCoverage(); 2026-10-22T19:31:22.9613691Z ╰──── 2026-10-22T19:31:22.9614053Z  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-22T19:31:22.9614388Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T19:31:22.9614391Z 2026-10-22T19:31:22.9614728Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T19:31:22.9614931Z ╭─[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:60:5] 2026-10-22T19:31:22.9614991Z 58 │ 2026-10-22T19:31:22.9615065Z 59 │ useEffect(() => { 2026-10-22T19:31:22.9615145Z ·  ────┬──── 2026-10-22T19:31:22.9615292Z · ╰── This is the containing effect 2026-10-22T19:31:22.9615382Z 60 │ setMountedModes((current) => { 2026-10-22T19:31:22.9615469Z ·  ───────┬─────── 2026-10-22T19:31:22.9615656Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:22.9615746Z 61 │ if (current.has(props.mode)) { 2026-10-22T19:31:22.9615805Z ╰──── 2026-10-22T19:31:22.9616543Z  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-22T19:31:22.9617001Z  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-22T19:31:22.9617004Z 2026-10-22T19:31:22.9617230Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T19:31:22.9617365Z ╭─[apps/mobile/src/state/thread-order.ts:29:7] 2026-10-22T19:31:22.9617450Z 28 │ getPendingThreadOrder(); 2026-10-22T19:31:22.9617551Z 29 │ }, [nowMinute, snoozeWakeTick]); 2026-10-22T19:31:22.9617705Z ·  ────┬──── ───────┬────── 2026-10-22T19:31:22.9617922Z · │ ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-22T19:31:22.9618078Z · ╰── Unnecessary dependency `nowMinute` 2026-10-22T19:31:22.9618154Z 30 │ return pending; 2026-10-22T19:31:22.9618220Z ╰──── 2026-10-22T19:31:22.9618655Z  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-22T19:31:22.9619275Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9619279Z 2026-10-22T19:31:22.9619597Z ⚠ react(immutability): This value cannot be modified 2026-10-22T19:31:22.9619887Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:174:5] 2026-10-22T19:31:22.9620158Z 170 │ const expandedAngle = props.collapsedDirection === "right" ? 90 : 180; 2026-10-22T19:31:22.9620354Z 171 │ const rotation = useSharedValue(props.expanded ? expandedAngle : 0); 2026-10-22T19:31:22.9620436Z ·  ────┬─── 2026-10-22T19:31:22.9620589Z · ╰── `rotation` originates here 2026-10-22T19:31:22.9620653Z 172 │ 2026-10-22T19:31:22.9620731Z 173 │ useLayoutEffect(() => { 2026-10-22T19:31:22.9620880Z 174 │ rotation.value = withTiming(props.expanded ? expandedAngle : 0, { 2026-10-22T19:31:22.9620961Z ·  ────┬─── 2026-10-22T19:31:22.9621118Z · ╰── `rotation` cannot be modified 2026-10-22T19:31:22.9621242Z 175 │ duration: THREAD_DISCLOSURE_TRANSITION_MS, 2026-10-22T19:31:22.9621301Z ╰──── 2026-10-22T19:31:22.9621595Z  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-22T19:31:22.9621933Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T19:31:22.9621936Z 2026-10-22T19:31:22.9622237Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-22T19:31:22.9622411Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:1246:23] 2026-10-22T19:31:22.9622483Z 1245 │ { 2026-10-22T19:31:22.9625373Z ·  ────┬──── 2026-10-22T19:31:22.9625522Z · ╰── This is the containing effect 2026-10-22T19:31:22.9625615Z 508 │ setKeyboardStateSuspect(false); 2026-10-22T19:31:22.9625729Z ·  ───────────┬─────────── 2026-10-22T19:31:22.9625932Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:22.9626068Z 509 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-22T19:31:22.9626123Z ╰──── 2026-10-22T19:31:22.9626855Z  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-22T19:31:22.9627286Z  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-22T19:31:22.9627290Z 2026-10-22T19:31:22.9627585Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T19:31:22.9627812Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:868:7] 2026-10-22T19:31:22.9628083Z 865 │ const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0); 2026-10-22T19:31:22.9628196Z 866 │ useEffect(() => { 2026-10-22T19:31:22.9628286Z ·  ────┬──── 2026-10-22T19:31:22.9628430Z · ╰── This is the containing effect 2026-10-22T19:31:22.9628599Z 867 │ if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) { 2026-10-22T19:31:22.9628732Z 868 │ setLastKnownKeyboardHeight(liveKeyboardHeight); 2026-10-22T19:31:22.9628848Z ·  ─────────────┬──────────── 2026-10-22T19:31:22.9629116Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:22.9629217Z 869 │ } 2026-10-22T19:31:22.9629280Z ╰──── 2026-10-22T19:31:22.9630065Z  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-22T19:31:22.9630439Z  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-22T19:31:22.9630443Z 2026-10-22T19:31:22.9630742Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T19:31:22.9630920Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1115:5] 2026-10-22T19:31:22.9630997Z 1113 │ 2026-10-22T19:31:22.9631080Z 1114 │ useEffect(() => { 2026-10-22T19:31:22.9631168Z ·  ────┬──── 2026-10-22T19:31:22.9631309Z · ╰── This is the containing effect 2026-10-22T19:31:22.9631409Z 1115 │ setAnchorMessageId(null); 2026-10-22T19:31:22.9631512Z ·  ─────────┬──────── 2026-10-22T19:31:22.9631705Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:22.9631795Z 1116 │ setSubmittedMessageId(null); 2026-10-22T19:31:22.9631858Z ╰──── 2026-10-22T19:31:22.9632632Z  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-22T19:31:22.9633274Z  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-22T19:31:22.9633278Z 2026-10-22T19:31:22.9633698Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T19:31:22.9633986Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:509:7] 2026-10-22T19:31:22.9634122Z 508 │ setKeyboardStateSuspect(false); 2026-10-22T19:31:22.9634236Z 509 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-22T19:31:22.9634401Z ·  ────────┬──────── ─────────┬──────── 2026-10-22T19:31:22.9634698Z · │ ╰── Unnecessary dependency `liveKeyboardHeight` 2026-10-22T19:31:22.9634881Z · ╰── Unnecessary dependency `isKeyboardVisible` 2026-10-22T19:31:22.9635023Z 510 │ const handleOwnedInputFocusChange = (focused: boolean) => { 2026-10-22T19:31:22.9635086Z ╰──── 2026-10-22T19:31:22.9635404Z  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-22T19:31:22.9635733Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9635736Z 2026-10-22T19:31:22.9636187Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T19:31:22.9636506Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1063:7] 2026-10-22T19:31:22.9636613Z 1062 │ userInputInsetProgress.set(1); 2026-10-22T19:31:22.9636786Z 1063 │ }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]); 2026-10-22T19:31:22.9636896Z ·  ────────────┬─────────── 2026-10-22T19:31:22.9637094Z · ╰── Unnecessary dependency `activeUserInputRequestId` 2026-10-22T19:31:22.9637240Z 1064 │ const showContent = props.showContent ?? true; 2026-10-22T19:31:22.9637338Z ╰──── 2026-10-22T19:31:22.9637695Z  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-22T19:31:22.9638040Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9638046Z 2026-10-22T19:31:22.9638271Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T19:31:22.9638443Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1121:15] 2026-10-22T19:31:22.9638517Z 1120 │ freeze.set(false); 2026-10-22T19:31:22.9638607Z 1121 │ }, [freeze, selectedThreadKey]); 2026-10-22T19:31:22.9638718Z ·  ────────┬──────── 2026-10-22T19:31:22.9638902Z · ╰── Unnecessary dependency `selectedThreadKey` 2026-10-22T19:31:22.9638958Z 1122 │ 2026-10-22T19:31:22.9639022Z ╰──── 2026-10-22T19:31:22.9639341Z  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-22T19:31:22.9639683Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9639686Z 2026-10-22T19:31:22.9639852Z ⚠ react(immutability): This value cannot be modified 2026-10-22T19:31:22.9640016Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:951:5] 2026-10-22T19:31:22.9640140Z 946 │ const composerPopoverHeight = useSharedValue(0); 2026-10-22T19:31:22.9640256Z 947 │ const floatingControlCoverage = useSharedValue( 2026-10-22T19:31:22.9640358Z ·  ───────────┬─────────── 2026-10-22T19:31:22.9640541Z · ╰── `floatingControlCoverage` originates here 2026-10-22T19:31:22.9640683Z 948 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-22T19:31:22.9640751Z 949 │ ); 2026-10-22T19:31:22.9640822Z 950 │ useEffect(() => { 2026-10-22T19:31:22.9640950Z 951 │ floatingControlCoverage.value = withTiming( 2026-10-22T19:31:22.9641076Z ·  ───────────┬─────────── 2026-10-22T19:31:22.9641261Z · ╰── `floatingControlCoverage` cannot be modified 2026-10-22T19:31:22.9641399Z 952 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-22T19:31:22.9641462Z ╰──── 2026-10-22T19:31:22.9641861Z  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-22T19:31:22.9642496Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T19:31:22.9642561Z 2026-10-22T19:31:22.9642872Z ⚠ react(immutability): This value cannot be modified 2026-10-22T19:31:22.9643157Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:969:7] 2026-10-22T19:31:22.9643492Z 959 │ const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null; 2026-10-22T19:31:22.9643733Z 960 │ const combinedContentInsetEndAdjustment = useSharedValue( 2026-10-22T19:31:22.9643928Z ·  ────────────────┬──────────────── 2026-10-22T19:31:22.9644168Z · ╰── `combinedContentInsetEndAdjustment` originates here 2026-10-22T19:31:22.9644406Z 961 │ Math.max(0, estimatedOverlayHeight - nativeInsetOvercount), 2026-10-22T19:31:22.9644585Z 962 │ ); 2026-10-22T19:31:22.9644736Z 963 │ useAnimatedReaction( 2026-10-22T19:31:22.9644839Z 964 │ () => 2026-10-22T19:31:22.9644953Z 965 │ contentInsetEndAdjustment.value + 2026-10-22T19:31:22.9645117Z 966 │ floatingControlCoverage.value + 2026-10-22T19:31:22.9645502Z 967 │ (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0), 2026-10-22T19:31:22.9645599Z 968 │ (value) => { 2026-10-22T19:31:22.9645730Z 969 │ combinedContentInsetEndAdjustment.value = value; 2026-10-22T19:31:22.9645911Z ·  ────────────────┬──────────────── 2026-10-22T19:31:22.9646280Z · ╰── `combinedContentInsetEndAdjustment` cannot be modified 2026-10-22T19:31:22.9646381Z 970 │ }, 2026-10-22T19:31:22.9646464Z ╰──── 2026-10-22T19:31:22.9646903Z  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-22T19:31:22.9647396Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T19:31:22.9647403Z 2026-10-22T19:31:22.9647763Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-22T19:31:22.9647992Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:121:27] 2026-10-22T19:31:22.9648237Z 120 │ const scope = makeScope(options.capabilities ?? new Set(["preview", "worktree"])); 2026-10-22T19:31:22.9648416Z 121 │ const dispatch = vi.fn((_: unknown) => 2026-10-22T19:31:22.9648577Z ·  ┬ 2026-10-22T19:31:22.9648904Z · ╰── '_' is declared here 2026-10-22T19:31:22.9649163Z 122 │ (options.dispatchGate ?? Effect.void).pipe( 2026-10-22T19:31:22.9649264Z ╰──── 2026-10-22T19:31:22.9649467Z  help: Consider removing this parameter. 2026-10-22T19:31:22.9649470Z 2026-10-22T19:31:22.9649793Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-22T19:31:22.9650066Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:134:39] 2026-10-22T19:31:22.9650174Z 133 │ ); 2026-10-22T19:31:22.9650361Z 134 │ const listLocalBranchNames = vi.fn((_: string) => 2026-10-22T19:31:22.9650473Z ·  ┬ 2026-10-22T19:31:22.9650637Z · ╰── '_' is declared here 2026-10-22T19:31:22.9650762Z 135 │ Effect.succeed( 2026-10-22T19:31:22.9650877Z ╰──── 2026-10-22T19:31:22.9651067Z  help: Consider removing this parameter. 2026-10-22T19:31:22.9651071Z 2026-10-22T19:31:22.9651417Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-22T19:31:22.9651580Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:178:31] 2026-10-22T19:31:22.9651670Z 177 │ }); 2026-10-22T19:31:22.9651858Z 178 │ const sendToThread = vi.fn((_: unknown) => { 2026-10-22T19:31:22.9652055Z ·  ┬ 2026-10-22T19:31:22.9652319Z · ╰── '_' is declared here 2026-10-22T19:31:22.9652459Z 179 │ switch (options.continuation ?? "queued") { 2026-10-22T19:31:22.9652521Z ╰──── 2026-10-22T19:31:22.9652707Z  help: Consider removing this parameter. 2026-10-22T19:31:22.9652718Z 2026-10-22T19:31:22.9653070Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-22T19:31:22.9653218Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:203:33] 2026-10-22T19:31:22.9653277Z 202 │ ); 2026-10-22T19:31:22.9653451Z 203 │ const removeWorktree = vi.fn((_: unknown) => 2026-10-22T19:31:22.9653629Z ·  ┬ 2026-10-22T19:31:22.9653892Z · ╰── '_' is declared here 2026-10-22T19:31:22.9654003Z 204 │ options.removeWorktreeFails 2026-10-22T19:31:22.9654072Z ╰──── 2026-10-22T19:31:22.9654223Z  help: Consider removing this parameter. 2026-10-22T19:31:22.9654228Z 2026-10-22T19:31:22.9654659Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-22T19:31:22.9654878Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:208:36] 2026-10-22T19:31:22.9654951Z 207 │ ); 2026-10-22T19:31:22.9655120Z 208 │ const deleteLocalBranch = vi.fn((_: unknown) => 2026-10-22T19:31:22.9655317Z ·  ┬ 2026-10-22T19:31:22.9655583Z · ╰── '_' is declared here 2026-10-22T19:31:22.9655718Z 209 │ options.deleteLocalBranchFails 2026-10-22T19:31:22.9655778Z ╰──── 2026-10-22T19:31:22.9655937Z  help: Consider removing this parameter. 2026-10-22T19:31:22.9655941Z 2026-10-22T19:31:22.9656290Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-22T19:31:22.9656498Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:213:42] 2026-10-22T19:31:22.9656636Z 212 │ ); 2026-10-22T19:31:22.9656906Z 213 │ const fetchWorktreeBaseCommit = vi.fn((_: unknown) => 2026-10-22T19:31:22.9657085Z ·  ┬ 2026-10-22T19:31:22.9657330Z · ╰── '_' is declared here 2026-10-22T19:31:22.9657430Z 214 │ options.fetchWorktreeBaseFails 2026-10-22T19:31:22.9657497Z ╰──── 2026-10-22T19:31:22.9657671Z  help: Consider removing this parameter. 2026-10-22T19:31:22.9657675Z 2026-10-22T19:31:22.9658019Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-22T19:31:22.9658214Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:254:30] 2026-10-22T19:31:22.9658280Z 253 │ ); 2026-10-22T19:31:22.9658398Z 254 │ const localStatus = vi.fn((_: unknown) => 2026-10-22T19:31:22.9658568Z ·  ┬ 2026-10-22T19:31:22.9658822Z · ╰── '_' is declared here 2026-10-22T19:31:22.9658950Z 255 │ Effect.succeed({ 2026-10-22T19:31:22.9659005Z ╰──── 2026-10-22T19:31:22.9659121Z  help: Consider removing this parameter. 2026-10-22T19:31:22.9659124Z 2026-10-22T19:31:22.9659434Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-22T19:31:22.9659691Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:264:32] 2026-10-22T19:31:22.9659798Z 263 │ ); 2026-10-22T19:31:22.9660001Z 264 │ const refreshStatus = vi.fn((_: string) => Effect.die("refreshStatus stub")); 2026-10-22T19:31:22.9660154Z ·  ┬ 2026-10-22T19:31:22.9660423Z · ╰── '_' is declared here 2026-10-22T19:31:22.9660692Z 265 │ const runForThread = vi.fn((input: { readonly worktreePath: string }) => { 2026-10-22T19:31:22.9660751Z ╰──── 2026-10-22T19:31:22.9660889Z  help: Consider removing this parameter. 2026-10-22T19:31:22.9660894Z 2026-10-22T19:31:22.9661186Z ⚠ eslint(no-new): Do not use 'new' for side effects. 2026-10-22T19:31:22.9661442Z ╭─[apps/server/src/mcp/McpToolAccess.test.ts:168:3] 2026-10-22T19:31:22.9661615Z 167 │ // @ts-expect-error a declaration constructed directly 2026-10-22T19:31:22.9661739Z 168 │ new McpToolAccess.Declaration(unchecked); 2026-10-22T19:31:22.9661930Z ·  ───────────────────────────── 2026-10-22T19:31:22.9662182Z 169 │ // @ts-expect-error a handlers layer built outside McpToolAccess 2026-10-22T19:31:22.9662281Z ╰──── 2026-10-22T19:31:22.9662549Z  help: Assign the result of 'new' to a variable or compare it to a reference. 2026-10-22T19:31:22.9662553Z 2026-10-22T19:31:22.9662991Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T19:31:22.9663301Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:215:7] 2026-10-22T19:31:22.9663409Z 211 │ }; 2026-10-22T19:31:22.9663547Z 212 │ useEffect(() => { 2026-10-22T19:31:22.9663693Z ·  ────┬──── 2026-10-22T19:31:22.9663951Z · ╰── This is the containing effect 2026-10-22T19:31:22.9664289Z 213 │ const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null; 2026-10-22T19:31:22.9664405Z 214 │ if (inserted) { 2026-10-22T19:31:22.9664743Z 215 │ setSelection((current) => 2026-10-22T19:31:22.9665051Z ·  ──────┬───── 2026-10-22T19:31:22.9665401Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:22.9665701Z 216 │ current.start === inserted.start && current.end === inserted.end ? current : inserted, 2026-10-22T19:31:22.9665832Z ╰──── 2026-10-22T19:31:22.9666824Z  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-22T19:31:22.9667208Z  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-22T19:31:22.9667214Z 2026-10-22T19:31:22.9667494Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T19:31:22.9667679Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:296:7] 2026-10-22T19:31:22.9667782Z 284 │ }, [hasWorkspaceSnapshot]); 2026-10-22T19:31:22.9667867Z 285 │ useEffect(() => { 2026-10-22T19:31:22.9667944Z ·  ────┬──── 2026-10-22T19:31:22.9668089Z · ╰── This is the containing effect 2026-10-22T19:31:22.9668271Z 286 │ if (!environmentId || !projectCwd || !selectedProviderInstanceId) return; 2026-10-22T19:31:22.9668563Z 287 │ const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`; 2026-10-22T19:31:22.9668657Z 288 │ const now = Date.now(); 2026-10-22T19:31:22.9668823Z 289 │ const lastRequest = workspaceRefreshKeyRef.current; 2026-10-22T19:31:22.9668902Z 290 │ if ( 2026-10-22T19:31:22.9669037Z 291 │ lastRequest?.key === key && 2026-10-22T19:31:22.9669222Z 292 │ now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS 2026-10-22T19:31:22.9669291Z 293 │ ) 2026-10-22T19:31:22.9669366Z 294 │ return; 2026-10-22T19:31:22.9669724Z 295 │ if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) { 2026-10-22T19:31:22.9669822Z 296 │ setWorkspaceRefreshRetry(null); 2026-10-22T19:31:22.9669947Z ·  ────────────┬─────────── 2026-10-22T19:31:22.9670245Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:22.9670325Z 297 │ return; 2026-10-22T19:31:22.9670402Z ╰──── 2026-10-22T19:31:22.9671099Z  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-22T19:31:22.9671499Z  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-22T19:31:22.9671507Z 2026-10-22T19:31:22.9671822Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T19:31:22.9672004Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:326:5] 2026-10-22T19:31:22.9672066Z 325 │ }, [ 2026-10-22T19:31:22.9672361Z 326 │ draftMessage, 2026-10-22T19:31:22.9672634Z ·  ──────┬───── 2026-10-22T19:31:22.9672823Z · ╰── Unnecessary dependency `draftMessage` 2026-10-22T19:31:22.9672899Z 327 │ environmentId, 2026-10-22T19:31:22.9672968Z ╰──── 2026-10-22T19:31:22.9673366Z  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-22T19:31:22.9673719Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9673722Z 2026-10-22T19:31:22.9673995Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T19:31:22.9674163Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2109:5] 2026-10-22T19:31:22.9674239Z 2107 │ ); 2026-10-22T19:31:22.9674325Z 2108 │ useEffect(() => { 2026-10-22T19:31:22.9674405Z ·  ────┬──── 2026-10-22T19:31:22.9674619Z · ╰── This is the containing effect 2026-10-22T19:31:22.9674713Z 2109 │ setExpandedVideo(null); 2026-10-22T19:31:22.9674813Z ·  ────────┬─────── 2026-10-22T19:31:22.9675001Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:22.9675115Z 2110 │ setExpandedFile(null); 2026-10-22T19:31:22.9675188Z ╰──── 2026-10-22T19:31:22.9675845Z  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-22T19:31:22.9676200Z  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-22T19:31:22.9676203Z 2026-10-22T19:31:22.9676449Z ⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used. 2026-10-22T19:31:22.9676601Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:62:10] 2026-10-22T19:31:22.9676758Z 61 │ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets"; 2026-10-22T19:31:22.9676921Z 62 │ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks"; 2026-10-22T19:31:22.9677031Z ·  ───────────┬─────────── 2026-10-22T19:31:22.9677222Z · ╰── 'isMarkdownFileLinkLabel' is imported here 2026-10-22T19:31:22.9677401Z 63 │ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments"; 2026-10-22T19:31:22.9677469Z ╰──── 2026-10-22T19:31:22.9677579Z  help: Consider removing this import. 2026-10-22T19:31:22.9677581Z 2026-10-22T19:31:22.9677826Z ⚠ eslint(no-unused-vars): Identifier 'createContext' is imported but never used. 2026-10-22T19:31:22.9677998Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:88:3] 2026-10-22T19:31:22.9678089Z 87 │ import { 2026-10-22T19:31:22.9678207Z 88 │ createContext, 2026-10-22T19:31:22.9678364Z ·  ──────┬────── 2026-10-22T19:31:22.9678656Z · ╰── 'createContext' is imported here 2026-10-22T19:31:22.9678938Z 89 │ memo, 2026-10-22T19:31:22.9679134Z ╰──── 2026-10-22T19:31:22.9679331Z  help: Consider removing this import. 2026-10-22T19:31:22.9679335Z 2026-10-22T19:31:22.9679793Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-22T19:31:22.9680031Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:103:3] 2026-10-22T19:31:22.9680095Z 102 │ import { 2026-10-22T19:31:22.9680182Z 103 │ ActivityIndicator, 2026-10-22T19:31:22.9680280Z ·  ────────┬──────── 2026-10-22T19:31:22.9680445Z · ╰── 'ActivityIndicator' is imported here 2026-10-22T19:31:22.9680507Z 104 │ Image, 2026-10-22T19:31:22.9680569Z ╰──── 2026-10-22T19:31:22.9680675Z  help: Consider removing this import. 2026-10-22T19:31:22.9680679Z 2026-10-22T19:31:22.9680904Z ⚠ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used. 2026-10-22T19:31:22.9681049Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:110:3] 2026-10-22T19:31:22.9681125Z 109 │ Pressable, 2026-10-22T19:31:22.9681208Z 110 │ ScrollView, 2026-10-22T19:31:22.9681297Z ·  ─────┬──── 2026-10-22T19:31:22.9681436Z · ╰── 'ScrollView' is imported here 2026-10-22T19:31:22.9681513Z 111 │ StyleSheet, 2026-10-22T19:31:22.9681578Z ╰──── 2026-10-22T19:31:22.9681740Z  help: Consider removing this import. 2026-10-22T19:31:22.9681744Z 2026-10-22T19:31:22.9681987Z ⚠ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used. 2026-10-22T19:31:22.9682151Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:112:11] 2026-10-22T19:31:22.9682234Z 111 │ StyleSheet, 2026-10-22T19:31:22.9682324Z 112 │ Text as NativeText, 2026-10-22T19:31:22.9682418Z ·  ─────┬──── 2026-10-22T19:31:22.9682571Z · ╰── 'NativeText' is imported here 2026-10-22T19:31:22.9682659Z 113 │ type ColorValue, 2026-10-22T19:31:22.9682768Z ╰──── 2026-10-22T19:31:22.9682905Z  help: Consider removing this import. 2026-10-22T19:31:22.9682907Z 2026-10-22T19:31:22.9683152Z ⚠ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used. 2026-10-22T19:31:22.9683349Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:134:10] 2026-10-22T19:31:22.9683548Z 133 │ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic"; 2026-10-22T19:31:22.9683837Z 134 │ import { tryOpenExternalUrl } from "../../lib/openExternalUrl"; 2026-10-22T19:31:22.9684112Z ·  ─────────┬──────── 2026-10-22T19:31:22.9684342Z · ╰── 'tryOpenExternalUrl' is imported here 2026-10-22T19:31:22.9684517Z 135 │ import { downloadAndShareAttachment } from "../../lib/attachmentDownload"; 2026-10-22T19:31:22.9684649Z ╰──── 2026-10-22T19:31:22.9684759Z  help: Consider removing this import. 2026-10-22T19:31:22.9684762Z 2026-10-22T19:31:22.9685007Z ⚠ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used. 2026-10-22T19:31:22.9685151Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:137:10] 2026-10-22T19:31:22.9685308Z 136 │ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks"; 2026-10-22T19:31:22.9685451Z 137 │ import { faviconUrlForOrigin } from "@t3tools/shared/favicon"; 2026-10-22T19:31:22.9685552Z ·  ─────────┬───────── 2026-10-22T19:31:22.9685727Z · ╰── 'faviconUrlForOrigin' is imported here 2026-10-22T19:31:22.9685794Z 138 │ import { 2026-10-22T19:31:22.9685854Z ╰──── 2026-10-22T19:31:22.9685968Z  help: Consider removing this import. 2026-10-22T19:31:22.9685971Z 2026-10-22T19:31:22.9686204Z ⚠ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used. 2026-10-22T19:31:22.9686354Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:151:10] 2026-10-22T19:31:22.9686514Z 150 │ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile"; 2026-10-22T19:31:22.9686672Z 151 │ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer"; 2026-10-22T19:31:22.9686779Z ·  ────────┬─────── 2026-10-22T19:31:22.9686943Z · ╰── 'MediaVideoPlayer' is imported here 2026-10-22T19:31:22.9687092Z 152 │ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia"; 2026-10-22T19:31:22.9687152Z ╰──── 2026-10-22T19:31:22.9687260Z  help: Consider removing this import. 2026-10-22T19:31:22.9687263Z 2026-10-22T19:31:22.9687508Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used. 2026-10-22T19:31:22.9687657Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:155:3] 2026-10-22T19:31:22.9687761Z 154 │ attachmentVideoPreviewSource, 2026-10-22T19:31:22.9687853Z 155 │ mediaVideoPreviewUri, 2026-10-22T19:31:22.9687968Z ·  ──────────┬───────── 2026-10-22T19:31:22.9688152Z · ╰── 'mediaVideoPreviewUri' is imported here 2026-10-22T19:31:22.9688258Z 156 │ mediaVideoThumbnailKey, 2026-10-22T19:31:22.9688389Z ╰──── 2026-10-22T19:31:22.9688508Z  help: Consider removing this import. 2026-10-22T19:31:22.9688511Z 2026-10-22T19:31:22.9688754Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used. 2026-10-22T19:31:22.9688920Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:156:3] 2026-10-22T19:31:22.9689022Z 155 │ mediaVideoPreviewUri, 2026-10-22T19:31:22.9689133Z 156 │ mediaVideoThumbnailKey, 2026-10-22T19:31:22.9689246Z ·  ───────────┬────────── 2026-10-22T19:31:22.9689451Z · ╰── 'mediaVideoThumbnailKey' is imported here 2026-10-22T19:31:22.9689667Z 157 │ type MediaVideoPreviewSource, 2026-10-22T19:31:22.9689832Z ╰──── 2026-10-22T19:31:22.9689946Z  help: Consider removing this import. 2026-10-22T19:31:22.9689969Z 2026-10-22T19:31:22.9690201Z ⚠ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used. 2026-10-22T19:31:22.9690356Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:157:8] 2026-10-22T19:31:22.9690486Z 156 │ mediaVideoThumbnailKey, 2026-10-22T19:31:22.9690655Z 157 │ type MediaVideoPreviewSource, 2026-10-22T19:31:22.9690865Z ·  ───────────┬─────────── 2026-10-22T19:31:22.9691204Z · ╰── 'MediaVideoPreviewSource' is imported here 2026-10-22T19:31:22.9691314Z 158 │ } from "../../lib/videoPreviewSource"; 2026-10-22T19:31:22.9691381Z ╰──── 2026-10-22T19:31:22.9691492Z  help: Consider removing this import. 2026-10-22T19:31:22.9691497Z 2026-10-22T19:31:22.9691729Z ⚠ eslint(no-unused-vars): Type 'ReviewDiffTheme' is imported but never used. 2026-10-22T19:31:22.9691894Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:165:15] 2026-10-22T19:31:22.9692113Z 164 │ import { parseReviewCommentMessageSegments } from "../review/reviewCommentSelection"; 2026-10-22T19:31:22.9692266Z 165 │ import type { ReviewDiffTheme } from "../review/shikiReviewHighlighter"; 2026-10-22T19:31:22.9692376Z ·  ───────┬─────── 2026-10-22T19:31:22.9692554Z · ╰── 'ReviewDiffTheme' is imported here 2026-10-22T19:31:22.9692635Z 166 │ import { 2026-10-22T19:31:22.9692694Z ╰──── 2026-10-22T19:31:22.9692814Z  help: Consider removing this import. 2026-10-22T19:31:22.9692820Z 2026-10-22T19:31:22.9693079Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used. 2026-10-22T19:31:22.9693232Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:180:3] 2026-10-22T19:31:22.9693300Z 179 │ import { 2026-10-22T19:31:22.9693407Z 180 │ resolveMarkdownFontSizes, 2026-10-22T19:31:22.9693532Z ·  ────────────┬─────────── 2026-10-22T19:31:22.9693722Z · ╰── 'resolveMarkdownFontSizes' is imported here 2026-10-22T19:31:22.9693826Z 181 │ resolveNativeMarkdownTypography, 2026-10-22T19:31:22.9693894Z ╰──── 2026-10-22T19:31:22.9694006Z  help: Consider removing this import. 2026-10-22T19:31:22.9694008Z 2026-10-22T19:31:22.9694269Z ⚠ eslint(no-unused-vars): Identifier 'markdownLinkIconSource' is imported but never used. 2026-10-22T19:31:22.9694416Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:185:10] 2026-10-22T19:31:22.9694643Z 184 │ import { PierreEntryIcon } from "../../components/PierreEntryIcon"; 2026-10-22T19:31:22.9694810Z 185 │ import { markdownLinkIconSource } from "../../lib/markdownLinkIcons"; 2026-10-22T19:31:22.9694922Z ·  ───────────┬────────── 2026-10-22T19:31:22.9695106Z · ╰── 'markdownLinkIconSource' is imported here 2026-10-22T19:31:22.9695187Z 186 │ import { 2026-10-22T19:31:22.9695325Z ╰──── 2026-10-22T19:31:22.9695549Z  help: Consider removing this import. 2026-10-22T19:31:22.9695552Z 2026-10-22T19:31:22.9695985Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used. 2026-10-22T19:31:22.9696600Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:188:3] 2026-10-22T19:31:22.9696791Z 187 │ normalizeNativeMarkdownUrl, 2026-10-22T19:31:22.9697454Z 188 │ resolveMarkdownInlineCodePresentation, 2026-10-22T19:31:22.9697682Z ·  ──────────────────┬────────────────── 2026-10-22T19:31:22.9697953Z · ╰── 'resolveMarkdownInlineCodePresentation' is imported here 2026-10-22T19:31:22.9698320Z 189 │ resolveMarkdownLinkIcon, 2026-10-22T19:31:22.9698415Z ╰──── 2026-10-22T19:31:22.9698574Z  help: Consider removing this import. 2026-10-22T19:31:22.9698578Z 2026-10-22T19:31:22.9698888Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownLinkIcon' is imported but never used. 2026-10-22T19:31:22.9699081Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:189:3] 2026-10-22T19:31:22.9699240Z 188 │ resolveMarkdownInlineCodePresentation, 2026-10-22T19:31:22.9699326Z 189 │ resolveMarkdownLinkIcon, 2026-10-22T19:31:22.9699504Z ·  ───────────┬─────────── 2026-10-22T19:31:22.9699721Z · ╰── 'resolveMarkdownLinkIcon' is imported here 2026-10-22T19:31:22.9699854Z 190 │ resolveMarkdownLinkPresentation, 2026-10-22T19:31:22.9699935Z ╰──── 2026-10-22T19:31:22.9700091Z  help: Consider removing this import. 2026-10-22T19:31:22.9700094Z 2026-10-22T19:31:22.9700396Z ⚠ eslint(no-unused-vars): Identifier 'useMarkdownCodeHighlight' is imported but never used. 2026-10-22T19:31:22.9700609Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:228:10] 2026-10-22T19:31:22.9700781Z 227 │ import { ThreadMcpApp } from "./McpAppWebView"; 2026-10-22T19:31:22.9700947Z 228 │ import { useMarkdownCodeHighlight } from "./markdownCodeHighlightState"; 2026-10-22T19:31:22.9701133Z ·  ────────────┬─────────── 2026-10-22T19:31:22.9701360Z · ╰── 'useMarkdownCodeHighlight' is imported here 2026-10-22T19:31:22.9701633Z 229 │ import { 2026-10-22T19:31:22.9701718Z ╰──── 2026-10-22T19:31:22.9701867Z  help: Consider removing this import. 2026-10-22T19:31:22.9701870Z 2026-10-22T19:31:22.9702142Z ⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used. 2026-10-22T19:31:22.9702319Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:232:3] 2026-10-22T19:31:22.9702409Z 231 │ useAssetUrl, 2026-10-22T19:31:22.9702513Z 232 │ useAssetUrlState, 2026-10-22T19:31:22.9702754Z ·  ────────┬─────── 2026-10-22T19:31:22.9702999Z · ╰── 'useAssetUrlState' is imported here 2026-10-22T19:31:22.9703091Z 233 │ useRefreshAssetUrl, 2026-10-22T19:31:22.9703194Z ╰──── 2026-10-22T19:31:22.9703343Z  help: Consider removing this import. 2026-10-22T19:31:22.9703345Z 2026-10-22T19:31:22.9703619Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T19:31:22.9703784Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2111:7] 2026-10-22T19:31:22.9703899Z 2110 │ setExpandedFile(null); 2026-10-22T19:31:22.9704099Z 2111 │ }, [props.environmentId, props.threadId, props.contentPresentation.kind]); 2026-10-22T19:31:22.9704634Z ·  ─────────┬───────── ───────┬────── ───────────────┬────────────── 2026-10-22T19:31:22.9705034Z · │ │ ╰── Unnecessary dependency `props.contentPresentation.kind` 2026-10-22T19:31:22.9705279Z · │ ╰── Unnecessary dependency `props.threadId` 2026-10-22T19:31:22.9705508Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-22T19:31:22.9705706Z 2112 │ const horizontalPadding = props.layoutVariant === "split" ? 20 : 16; 2026-10-22T19:31:22.9705821Z ╰──── 2026-10-22T19:31:22.9706160Z  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-22T19:31:22.9706548Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9706554Z 2026-10-22T19:31:22.9706797Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T19:31:22.9707024Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2578:7] 2026-10-22T19:31:22.9707222Z 2577 │ reportHeaderMaterialVisibility(false); 2026-10-22T19:31:22.9707436Z 2578 │ }, [feedThreadKey, reportHeaderMaterialVisibility]); 2026-10-22T19:31:22.9707622Z ·  ──────┬────── 2026-10-22T19:31:22.9707880Z · ╰── Unnecessary dependency `feedThreadKey` 2026-10-22T19:31:22.9708002Z 2579 │ 2026-10-22T19:31:22.9708079Z ╰──── 2026-10-22T19:31:22.9708451Z  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-22T19:31:22.9708824Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9708827Z 2026-10-22T19:31:22.9709268Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T19:31:22.9709599Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2594:7] 2026-10-22T19:31:22.9709677Z 2593 │ } 2026-10-22T19:31:22.9709863Z 2594 │ }, [listMountKey, props.contentInsetEndAdjustment, listRef]); 2026-10-22T19:31:22.9710002Z ·  ──────┬───── 2026-10-22T19:31:22.9710390Z · ╰── Unnecessary dependency `listMountKey` 2026-10-22T19:31:22.9710520Z 2595 │ 2026-10-22T19:31:22.9710624Z ╰──── 2026-10-22T19:31:22.9710967Z  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-22T19:31:22.9711374Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9711376Z 2026-10-22T19:31:22.9711632Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T19:31:22.9711805Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2751:7] 2026-10-22T19:31:22.9711906Z 2750 │ } 2026-10-22T19:31:22.9712154Z 2751 │ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]); 2026-10-22T19:31:22.9712419Z ·  ───────┬─────── ─────────┬──────── ────────┬─────── 2026-10-22T19:31:22.9712712Z · │ │ ╰── Unnecessary dependency `expandedWorkRows` 2026-10-22T19:31:22.9712982Z · │ ╰── Unnecessary dependency `expandedWorkGroups` 2026-10-22T19:31:22.9713345Z · ╰── Unnecessary dependency `expandedTurnIds` 2026-10-22T19:31:22.9713462Z 2752 │ 2026-10-22T19:31:22.9713535Z ╰──── 2026-10-22T19:31:22.9713899Z  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-22T19:31:22.9714278Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9714285Z 2026-10-22T19:31:22.9714554Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-22T19:31:22.9714779Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:603:9] 2026-10-22T19:31:22.9714882Z 602 │ }; 2026-10-22T19:31:22.9715048Z 603 │ }, [props.environmentId, attachment.id, httpBaseUrl]), 2026-10-22T19:31:22.9715284Z ·  ─────────┬───────── ──────┬────── ─────┬───── 2026-10-22T19:31:22.9715608Z · │ │ ╰── Unnecessary dependency `httpBaseUrl` 2026-10-22T19:31:22.9715875Z · │ ╰── Unnecessary dependency `attachment.id` 2026-10-22T19:31:22.9716073Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-22T19:31:22.9716169Z 604 │ ); 2026-10-22T19:31:22.9716271Z ╰──── 2026-10-22T19:31:22.9716654Z  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-22T19:31:22.9717002Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9717027Z 2026-10-22T19:31:22.9717749Z ⚠ 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-22T19:31:22.9717964Z ╭─[packages/contracts/src/composerContext.test.ts:181:18] 2026-10-22T19:31:22.9718235Z 180 │ it("sends a message without the records the wire cannot carry", () => { 2026-10-22T19:31:22.9718579Z 181 │ const wire = Schema.encodeUnknownSync(Schema.toCodecJson(OrchestrationMessageContext))({ 2026-10-22T19:31:22.9718765Z ·  ──────────────────────── 2026-10-22T19:31:22.9718877Z 182 │ version: 1, 2026-10-22T19:31:22.9719016Z ╰──── 2026-10-22T19:31:22.9719019Z 2026-10-22T19:31:22.9719279Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T19:31:22.9719440Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:542:25] 2026-10-22T19:31:22.9719621Z 541 │ // range) the boundary string is identical and the chain would die. 2026-10-22T19:31:22.9719755Z 542 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-22T19:31:22.9719928Z ·  ───────┬────── 2026-10-22T19:31:22.9720146Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-22T19:31:22.9720307Z 543 │ const v2SearchQuery = props.searchQuery.trim().toLocaleLowerCase(); 2026-10-22T19:31:22.9720403Z ╰──── 2026-10-22T19:31:22.9720772Z  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-22T19:31:22.9721156Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9721161Z 2026-10-22T19:31:22.9721515Z ⚠ react(purity): Cannot call impure function during render 2026-10-22T19:31:22.9721697Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:533:53] 2026-10-22T19:31:22.9721824Z 532 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-22T19:31:22.9722071Z 533 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-22T19:31:22.9722246Z ·  ─────┬──── 2026-10-22T19:31:22.9722442Z · ╰── Cannot call impure function 2026-10-22T19:31:22.9722570Z 534 │ const id = setTimeout(() => { 2026-10-22T19:31:22.9722660Z ╰──── 2026-10-22T19:31:22.9723015Z  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-22T19:31:22.9723347Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-22T19:31:22.9723350Z 2026-10-22T19:31:22.9723783Z ⚠ 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-22T19:31:22.9723931Z ╭─[packages/contracts/src/auth.test.ts:17:12] 2026-10-22T19:31:22.9724161Z 16 │ it("decodes legacy review credentials without offering them in new grants", () => { 2026-10-22T19:31:22.9724380Z 17 │ expect(Schema.decodeUnknownSync(AuthEnvironmentScopes)(["review:write"])).toEqual([ 2026-10-22T19:31:22.9724672Z ·  ──────────────────────── 2026-10-22T19:31:22.9724823Z 18 │ "review:write", 2026-10-22T19:31:22.9724921Z ╰──── 2026-10-22T19:31:22.9724924Z 2026-10-22T19:31:22.9725499Z ⚠ 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-22T19:31:22.9725634Z ╭─[packages/contracts/src/auth.test.ts:20:18] 2026-10-22T19:31:22.9725730Z 19 │ ]); 2026-10-22T19:31:22.9725924Z 20 │ expect(() => Schema.decodeUnknownSync(AuthGrantScopes)(["review:write"])).toThrow(); 2026-10-22T19:31:22.9726105Z ·  ──────────────────────── 2026-10-22T19:31:22.9726263Z 21 │ expect(AuthStandardClientScopes).not.toContain("review:write"); 2026-10-22T19:31:22.9726361Z ╰──── 2026-10-22T19:31:22.9726364Z 2026-10-22T19:31:22.9726791Z ⚠ 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-22T19:31:22.9726959Z ╭─[packages/contracts/src/auth.test.ts:58:21] 2026-10-22T19:31:22.9727190Z 57 │ it("ignores unknown response permissions without falling back to broader scopes", () => { 2026-10-22T19:31:22.9727340Z 58 │ const session = Schema.decodeUnknownSync(AuthSessionState)({ 2026-10-22T19:31:22.9727490Z ·  ──────────────────────── 2026-10-22T19:31:22.9727592Z 59 │ authenticated: true, 2026-10-22T19:31:22.9727715Z ╰──── 2026-10-22T19:31:22.9727718Z 2026-10-22T19:31:22.9727914Z ⚠ react(purity): Cannot call impure function during render 2026-10-22T19:31:22.9728126Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:372:47] 2026-10-22T19:31:22.9728305Z 371 │ const { open, onOpenChange, onSnooze, timestampFormat } = props; 2026-10-22T19:31:22.9728520Z 372 │ const presets = open ? resolveSnoozePresets(new Date(), timestampFormat) : []; 2026-10-22T19:31:22.9728819Z ·  ─────┬──── 2026-10-22T19:31:22.9729004Z · ╰── Cannot call impure function 2026-10-22T19:31:22.9729116Z 373 │ return ( 2026-10-22T19:31:22.9729208Z ╰──── 2026-10-22T19:31:22.9729582Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-22T19:31:22.9729984Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-22T19:31:22.9730032Z 2026-10-22T19:31:22.9730258Z ⚠ react(purity): Cannot call impure function during render 2026-10-22T19:31:22.9730449Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:853:39] 2026-10-22T19:31:22.9730603Z 852 │ if (snoozeGateClock.thread !== thread) { 2026-10-22T19:31:22.9730771Z 853 │ setSnoozeGateClock({ thread, now: new Date().toISOString() }); 2026-10-22T19:31:22.9730927Z ·  ─────┬──── 2026-10-22T19:31:22.9731138Z · ╰── Cannot call impure function 2026-10-22T19:31:22.9731225Z 854 │ } 2026-10-22T19:31:22.9731375Z ╰──── 2026-10-22T19:31:22.9731691Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-22T19:31:22.9732061Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-22T19:31:22.9732064Z 2026-10-22T19:31:22.9732532Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T19:31:22.9732750Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:361:7] 2026-10-22T19:31:22.9732936Z 355 │ }, [cancelledIncomingShareId, navigation, props.incomingShareId]); 2026-10-22T19:31:22.9733053Z 356 │ useEffect(() => { 2026-10-22T19:31:22.9733173Z ·  ────┬──── 2026-10-22T19:31:22.9733340Z · ╰── This is the containing effect 2026-10-22T19:31:22.9733503Z 357 │ if (!isReturningToProjectPicker) { 2026-10-22T19:31:22.9733604Z 358 │ return; 2026-10-22T19:31:22.9733709Z 359 │ } 2026-10-22T19:31:22.9733882Z 360 │ if (requestedInitialProjectAvailable) { 2026-10-22T19:31:22.9733989Z 361 │ setIsReturningToProjectPicker(false); 2026-10-22T19:31:22.9734169Z ·  ──────────────┬────────────── 2026-10-22T19:31:22.9734405Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:22.9734506Z 362 │ return; 2026-10-22T19:31:22.9734622Z ╰──── 2026-10-22T19:31:22.9735315Z  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-22T19:31:22.9735719Z  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-22T19:31:22.9735725Z 2026-10-22T19:31:22.9736050Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T19:31:22.9736492Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:504:9] 2026-10-22T19:31:22.9736601Z 447 │ 2026-10-22T19:31:22.9736702Z 448 │ useEffect(() => { 2026-10-22T19:31:22.9736819Z ·  ────┬──── 2026-10-22T19:31:22.9737005Z · ╰── This is the containing effect 2026-10-22T19:31:22.9737146Z 449 │ if (props.pendingTaskId || props.draftId) { 2026-10-22T19:31:22.9737256Z 450 │ return; 2026-10-22T19:31:22.9737454Z 451 │ } 2026-10-22T19:31:22.9737682Z 452 │ if (lastInitialProjectRefRef.current !== props.initialProjectRef) { 2026-10-22T19:31:22.9737872Z 453 │ lastInitialProjectRefRef.current = props.initialProjectRef; 2026-10-22T19:31:22.9737994Z 454 │ appliedInitialProjectKeyRef.current = null; 2026-10-22T19:31:22.9738125Z 455 │ } 2026-10-22T19:31:22.9738315Z 456 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-22T19:31:22.9738494Z 457 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-22T19:31:22.9738620Z 458 │ if (initialEnvironmentId && initialProjectId) { 2026-10-22T19:31:22.9738738Z 459 │ const directProject = 2026-10-22T19:31:22.9738862Z 460 │ projects.find( 2026-10-22T19:31:22.9739145Z 461 │ (project) => 2026-10-22T19:31:22.9739362Z 462 │ project.environmentId === initialEnvironmentId && project.id === initialProjectId, 2026-10-22T19:31:22.9739465Z 463 │ ) ?? null; 2026-10-22T19:31:22.9739604Z 464 │ 2026-10-22T19:31:22.9739726Z 465 │ if (directProject) { 2026-10-22T19:31:22.9739900Z 466 │ // Apply the route's project once. Re-applying on every change would 2026-10-22T19:31:22.9740097Z 467 │ // instantly revert environment/project switches made in the picker. 2026-10-22T19:31:22.9740319Z 468 │ const directProjectKey = `${directProject.environmentId}:${directProject.id}`; 2026-10-22T19:31:22.9740523Z 469 │ if (appliedInitialProjectKeyRef.current === directProjectKey) { 2026-10-22T19:31:22.9740611Z 470 │ return; 2026-10-22T19:31:22.9740724Z 471 │ } 2026-10-22T19:31:22.9740859Z 472 │ if (props.initialProjectRef?.branch) { 2026-10-22T19:31:22.9741014Z 473 │ if ( 2026-10-22T19:31:22.9741187Z 474 │ selectedProject?.environmentId !== directProject.environmentId || 2026-10-22T19:31:22.9741344Z 475 │ selectedProject.id !== directProject.id 2026-10-22T19:31:22.9741447Z 476 │ ) { 2026-10-22T19:31:22.9741579Z 477 │ setProject(directProject); 2026-10-22T19:31:22.9741670Z 478 │ return; 2026-10-22T19:31:22.9741981Z 479 │ } 2026-10-22T19:31:22.9742109Z 480 │ if (!flow.draftKey) return; 2026-10-22T19:31:22.9742293Z 481 │ // The route completes checkout before mounting this composer. Local 2026-10-22T19:31:22.9742488Z 482 │ // mode reuses an existing worktree; worktree mode would create another. 2026-10-22T19:31:22.9742689Z 483 │ updateComposerDraftSettings(flow.draftKey, { 2026-10-22T19:31:22.9742810Z 484 │ workspaceSelection: { 2026-10-22T19:31:22.9742922Z 485 │ mode: "local", 2026-10-22T19:31:22.9743046Z 486 │ branch: props.initialProjectRef.branch, 2026-10-22T19:31:22.9743274Z 487 │ worktreePath: props.initialProjectRef.worktreePath ?? null, 2026-10-22T19:31:22.9743410Z 488 │ startFromOrigin: false, 2026-10-22T19:31:22.9743519Z 489 │ }, 2026-10-22T19:31:22.9743613Z 490 │ }); 2026-10-22T19:31:22.9743741Z 491 │ } 2026-10-22T19:31:22.9743940Z 492 │ appliedInitialProjectKeyRef.current = directProjectKey; 2026-10-22T19:31:22.9744043Z 493 │ if ( 2026-10-22T19:31:22.9744212Z 494 │ selectedProject?.environmentId === directProject.environmentId && 2026-10-22T19:31:22.9744349Z 495 │ selectedProject.id === directProject.id 2026-10-22T19:31:22.9744475Z 496 │ ) { 2026-10-22T19:31:22.9744763Z 497 │ return; 2026-10-22T19:31:22.9744841Z 498 │ } 2026-10-22T19:31:22.9745051Z 499 │ setProject(directProject); 2026-10-22T19:31:22.9745220Z 500 │ return; 2026-10-22T19:31:22.9745336Z 501 │ } 2026-10-22T19:31:22.9745413Z 502 │ 2026-10-22T19:31:22.9745537Z 503 │ if (projects.length > 0) { 2026-10-22T19:31:22.9745684Z 504 │ setIsReturningToProjectPicker(true); 2026-10-22T19:31:22.9745867Z ·  ──────────────┬────────────── 2026-10-22T19:31:22.9746073Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:22.9746177Z 505 │ } 2026-10-22T19:31:22.9746278Z ╰──── 2026-10-22T19:31:22.9762729Z  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-22T19:31:22.9763252Z  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-22T19:31:22.9763256Z 2026-10-22T19:31:22.9763562Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T19:31:22.9763741Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:604:5] 2026-10-22T19:31:22.9763803Z 545 │ 2026-10-22T19:31:22.9763881Z 546 │ useEffect(() => { 2026-10-22T19:31:22.9763964Z ·  ────┬──── 2026-10-22T19:31:22.9764106Z · ╰── This is the containing effect 2026-10-22T19:31:22.9764220Z 547 │ const shareId = props.incomingShareId; 2026-10-22T19:31:22.9764321Z 548 │ const draftKey = flow.draftKey; 2026-10-22T19:31:22.9764435Z 549 │ const destinationProject = selectedProject; 2026-10-22T19:31:22.9764647Z 550 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-22T19:31:22.9764793Z 551 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-22T19:31:22.9764895Z 552 │ const selectedProjectMatchesRoute = 2026-10-22T19:31:22.9764986Z 553 │ !initialEnvironmentId || 2026-10-22T19:31:22.9765062Z 554 │ !initialProjectId || 2026-10-22T19:31:22.9765216Z 555 │ (destinationProject?.environmentId === initialEnvironmentId && 2026-10-22T19:31:22.9765331Z 556 │ destinationProject.id === initialProjectId); 2026-10-22T19:31:22.9765403Z 557 │ if ( 2026-10-22T19:31:22.9765475Z 558 │ !shareId || 2026-10-22T19:31:22.9765555Z 559 │ !draftKey || 2026-10-22T19:31:22.9765642Z 560 │ !destinationProject || 2026-10-22T19:31:22.9765737Z 561 │ !selectedProjectMatchesRoute || 2026-10-22T19:31:22.9765832Z 562 │ cancelledIncomingShareId === shareId 2026-10-22T19:31:22.9765910Z 563 │ ) { 2026-10-22T19:31:22.9765996Z 564 │ return; 2026-10-22T19:31:22.9766074Z 565 │ } 2026-10-22T19:31:22.9766178Z 566 │ const importKey = `${shareId}:${draftKey}`; 2026-10-22T19:31:22.9766243Z 567 │ if ( 2026-10-22T19:31:22.9766376Z 568 │ startedShareImportKeyRef.current === importKey || 2026-10-22T19:31:22.9766498Z 569 │ cancellingShareImportKeyRef.current === importKey 2026-10-22T19:31:22.9766558Z 570 │ ) { 2026-10-22T19:31:22.9766627Z 571 │ return; 2026-10-22T19:31:22.9766688Z 572 │ } 2026-10-22T19:31:22.9766744Z 573 │ 2026-10-22T19:31:22.9767052Z 574 │ if (!incomingShare) { 2026-10-22T19:31:22.9767325Z 575 │ if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) { 2026-10-22T19:31:22.9767469Z 576 │ alertedUnavailableIncomingShareIdRef.current = shareId; 2026-10-22T19:31:22.9767539Z 577 │ Dialog.alert( 2026-10-22T19:31:22.9767635Z 578 │ "Shared content unavailable", 2026-10-22T19:31:22.9767838Z 579 │ "The shared content is no longer in the inbox. You can continue editing this task draft.", 2026-10-22T19:31:22.9767911Z 580 │ ); 2026-10-22T19:31:22.9767975Z 581 │ } 2026-10-22T19:31:22.9768052Z 582 │ return; 2026-10-22T19:31:22.9768114Z 583 │ } 2026-10-22T19:31:22.9768179Z 584 │ 2026-10-22T19:31:22.9768243Z 585 │ if ( 2026-10-22T19:31:22.9768418Z 586 │ incomingShare.attachments.some((attachment) => attachment.type === "file") && 2026-10-22T19:31:22.9768538Z 587 │ selectedEnvironmentServerConfig === null 2026-10-22T19:31:22.9768606Z 588 │ ) { 2026-10-22T19:31:22.9768668Z 589 │ return; 2026-10-22T19:31:22.9768734Z 590 │ } 2026-10-22T19:31:22.9768793Z 591 │ 2026-10-22T19:31:22.9768948Z 592 │ if (alertedUnavailableIncomingShareIdRef.current === shareId) { 2026-10-22T19:31:22.9769079Z 593 │ alertedUnavailableIncomingShareIdRef.current = null; 2026-10-22T19:31:22.9769149Z 594 │ } 2026-10-22T19:31:22.9769271Z 595 │ startedShareImportKeyRef.current = importKey; 2026-10-22T19:31:22.9769344Z 596 │ const draftBackup = 2026-10-22T19:31:22.9769550Z 597 │ shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey); 2026-10-22T19:31:22.9769702Z 598 │ shareImportDraftBackupRef.current.set(importKey, draftBackup); 2026-10-22T19:31:22.9769812Z 599 │ const importToken = Symbol(importKey); 2026-10-22T19:31:22.9769901Z 600 │ let didReserveShare = false; 2026-10-22T19:31:22.9769993Z 601 │ let didConsumeShare = false; 2026-10-22T19:31:22.9770089Z 602 │ let needsDraftRestore = false; 2026-10-22T19:31:22.9770213Z 603 │ activeShareImportTokenRef.current = importToken; 2026-10-22T19:31:22.9770303Z 604 │ setImportingShareKey(importKey); 2026-10-22T19:31:22.9770403Z ·  ──────────┬───────── 2026-10-22T19:31:22.9770600Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:22.9770683Z 605 │ void (async () => { 2026-10-22T19:31:22.9770738Z ╰──── 2026-10-22T19:31:22.9771396Z  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-22T19:31:22.9771755Z  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-22T19:31:22.9771758Z 2026-10-22T19:31:22.9771978Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T19:31:22.9772151Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:524:5] 2026-10-22T19:31:22.9772234Z 523 │ props.initialProjectRef, 2026-10-22T19:31:22.9772324Z 524 │ props.incomingShareId, 2026-10-22T19:31:22.9772427Z ·  ──────────┬────────── 2026-10-22T19:31:22.9772704Z · ╰── Unnecessary dependency `props.incomingShareId` 2026-10-22T19:31:22.9772829Z 525 │ props.pendingTaskId, 2026-10-22T19:31:22.9772895Z ╰──── 2026-10-22T19:31:22.9773212Z  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-22T19:31:22.9773548Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9773551Z 2026-10-22T19:31:22.9773792Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-22T19:31:22.9773955Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:543:5] 2026-10-22T19:31:22.9774088Z 542 │ loadedBranchesProjectKeyRef.current = projectKey; 2026-10-22T19:31:22.9774169Z 543 │ flow.loadBranches(); 2026-10-22T19:31:22.9774255Z ·  ──┬─ 2026-10-22T19:31:22.9774391Z · ╰── Missing dependency `flow` 2026-10-22T19:31:22.9774502Z 544 │ }, [flow.loadBranches, selectedProject]); 2026-10-22T19:31:22.9774693Z ·  ────────┬──────── 2026-10-22T19:31:22.9774925Z · ╰── Overly precise dependency `flow.loadBranches`, use `flow` instead 2026-10-22T19:31:22.9774989Z 545 │ 2026-10-22T19:31:22.9775056Z ╰──── 2026-10-22T19:31:22.9775507Z  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-22T19:31:22.9775845Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9775850Z 2026-10-22T19:31:22.9776065Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T19:31:22.9776225Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:766:5] 2026-10-22T19:31:22.9776301Z 765 │ flow.draftKey, 2026-10-22T19:31:22.9776389Z 766 │ hasImportedIncomingShare, 2026-10-22T19:31:22.9776493Z ·  ────────────┬─────────── 2026-10-22T19:31:22.9776688Z · ╰── Unnecessary dependency `hasImportedIncomingShare` 2026-10-22T19:31:22.9776772Z 767 │ incomingShare, 2026-10-22T19:31:22.9776871Z 768 │ isIncomingShareInboxLoading, 2026-10-22T19:31:22.9776998Z ·  ─────────────┬───────────── 2026-10-22T19:31:22.9777199Z · ╰── Unnecessary dependency `isIncomingShareInboxLoading` 2026-10-22T19:31:22.9777296Z 769 │ isIncomingShareUnavailable, 2026-10-22T19:31:22.9777377Z 770 │ props.incomingShareId, 2026-10-22T19:31:22.9777485Z 771 │ props.initialProjectRef?.environmentId, 2026-10-22T19:31:22.9777579Z 772 │ props.initialProjectRef?.projectId, 2026-10-22T19:31:22.9777664Z 773 │ releaseShareReservation, 2026-10-22T19:31:22.9777737Z 774 │ reserveShare, 2026-10-22T19:31:22.9777827Z 775 │ selectedEnvironmentServerConfig, 2026-10-22T19:31:22.9777909Z 776 │ selectedProject, 2026-10-22T19:31:22.9777993Z 777 │ shareImportAttempt, 2026-10-22T19:31:22.9778090Z ·  ─────────┬──────── 2026-10-22T19:31:22.9778271Z · ╰── Unnecessary dependency `shareImportAttempt` 2026-10-22T19:31:22.9778409Z 778 │ ]); 2026-10-22T19:31:22.9778514Z ╰──── 2026-10-22T19:31:22.9778833Z  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-22T19:31:22.9779158Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9779168Z 2026-10-22T19:31:22.9779660Z ⚠ 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-22T19:31:22.9779806Z ╭─[packages/contracts/src/baseSchemas.test.ts:39:9] 2026-10-22T19:31:22.9779889Z 38 │ JSON.stringify( 2026-10-22T19:31:22.9780027Z 39 │ Schema.encodeUnknownSync(Schema.toCodecJson(Named))([ 2026-10-22T19:31:22.9780134Z ·  ──────────────────────── 2026-10-22T19:31:22.9780219Z 40 │ { name: "a" }, 2026-10-22T19:31:22.9780282Z ╰──── 2026-10-22T19:31:22.9780286Z 2026-10-22T19:31:22.9780452Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9780619Z ╭─[apps/mobile/src/features/home/thread-swipe-actions.tsx:494:27] 2026-10-22T19:31:22.9780686Z 493 │ > 2026-10-22T19:31:22.9780777Z 494 │ {props.children(close)} 2026-10-22T19:31:22.9780879Z ·  ──┬── 2026-10-22T19:31:22.9781048Z · ╰── Cannot access ref value during render 2026-10-22T19:31:22.9781141Z 495 │ 2026-10-22T19:31:22.9781211Z ╰──── 2026-10-22T19:31:22.9781720Z  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-22T19:31:22.9782032Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9782040Z 2026-10-22T19:31:22.9782316Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T19:31:22.9782494Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:285:5] 2026-10-22T19:31:22.9782629Z 283 │ const [snoozeWakeTick, bumpSnoozeWakeTick] = useState(0); 2026-10-22T19:31:22.9782785Z 284 │ useEffect(() => { 2026-10-22T19:31:22.9782899Z ·  ────┬──── 2026-10-22T19:31:22.9783045Z · ╰── This is the containing effect 2026-10-22T19:31:22.9783141Z 285 │ setNow(new Date().toISOString()); 2026-10-22T19:31:22.9783222Z ·  ───┬── 2026-10-22T19:31:22.9783400Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:22.9783553Z 286 │ const id = setInterval(() => setNow(new Date().toISOString()), 60_000); 2026-10-22T19:31:22.9783622Z ╰──── 2026-10-22T19:31:22.9784271Z  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-22T19:31:22.9784696Z  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-22T19:31:22.9784699Z 2026-10-22T19:31:22.9784913Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T19:31:22.9785093Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:365:25] 2026-10-22T19:31:22.9785238Z 364 │ // range) the boundary string is identical and the chain would die. 2026-10-22T19:31:22.9785337Z 365 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-22T19:31:22.9785446Z ·  ───────┬────── 2026-10-22T19:31:22.9785631Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-22T19:31:22.9785757Z 366 │ const listItems = ((): readonly SidebarListItem[] => { 2026-10-22T19:31:22.9785815Z ╰──── 2026-10-22T19:31:22.9786125Z  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-22T19:31:22.9786458Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9786461Z 2026-10-22T19:31:22.9786648Z ⚠ react(purity): Cannot call impure function during render 2026-10-22T19:31:22.9786828Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:356:53] 2026-10-22T19:31:22.9786922Z 355 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-22T19:31:22.9787093Z 356 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-22T19:31:22.9787228Z ·  ─────┬──── 2026-10-22T19:31:22.9787409Z · ╰── Cannot call impure function 2026-10-22T19:31:22.9787502Z 357 │ const id = setTimeout(() => { 2026-10-22T19:31:22.9787557Z ╰──── 2026-10-22T19:31:22.9787866Z  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-22T19:31:22.9788181Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-22T19:31:22.9788184Z 2026-10-22T19:31:22.9788647Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-22T19:31:22.9788857Z ╭─[packages/provider-opencode/src/server/adapter.ts:3755:7] 2026-10-22T19:31:22.9788914Z 3754 │ 2026-10-22T19:31:22.9789128Z 3755 │ const layer: Layer.Layer = 2026-10-22T19:31:22.9789210Z ·  ──┬── 2026-10-22T19:31:22.9789349Z · ╰── 'layer' is declared here 2026-10-22T19:31:22.9789492Z 3756 │ Layer.effect( 2026-10-22T19:31:22.9789553Z ╰──── 2026-10-22T19:31:22.9789672Z  help: Consider removing this declaration. 2026-10-22T19:31:22.9789675Z 2026-10-22T19:31:22.9789934Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-22T19:31:22.9790087Z ╭─[apps/web/src/components/chat/useComposerSend.ts:978:13] 2026-10-22T19:31:22.9790224Z 977 │ const changedBeforeDecline = draftChangedSinceSend(); 2026-10-22T19:31:22.9790483Z 978 │ ╭─▶ const pendingIdsBeforeDecline = pendingApprovalsRef.current.map( 2026-10-22T19:31:22.9790621Z 979 │ │ (approval) => approval.requestId, 2026-10-22T19:31:22.9790763Z 980 │ ╰─▶ ); 2026-10-22T19:31:22.9790921Z 981 │ const approvalResponding = approvalsToDecline.some((approval) => 2026-10-22T19:31:22.9790987Z ╰──── 2026-10-22T19:31:22.9791076Z  help: Switch to `Set` 2026-10-22T19:31:22.9791079Z 2026-10-22T19:31:22.9791261Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-22T19:31:22.9791478Z ╭─[packages/provider-opencode/src/server/OpenCodeRuntime.environment.test.ts:53:14] 2026-10-22T19:31:22.9791545Z 52 │ 2026-10-22T19:31:22.9791628Z 53 │ for (const {} of [ 2026-10-22T19:31:22.9791713Z ·  ── 2026-10-22T19:31:22.9791798Z 54 │ { healthy: true }, 2026-10-22T19:31:22.9791867Z ╰──── 2026-10-22T19:31:22.9792121Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-22T19:31:22.9792124Z 2026-10-22T19:31:22.9792345Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-22T19:31:22.9792486Z ╭─[apps/web/src/contextMenuFallback.test.ts:38:9] 2026-10-22T19:31:22.9792563Z 37 │ get isConnected() { 2026-10-22T19:31:22.9792674Z 38 │ let current: FakeElement | null = this; 2026-10-22T19:31:22.9792757Z ·  ─────── 2026-10-22T19:31:22.9792842Z 39 │ while (current?.parent) { 2026-10-22T19:31:22.9792914Z ╰──── 2026-10-22T19:31:22.9793218Z  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-22T19:31:22.9793221Z 2026-10-22T19:31:22.9793730Z ⚠ 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-22T19:31:22.9793904Z ╭─[packages/client-runtime/src/connection/supervisor.test.ts:135:3] 2026-10-22T19:31:22.9794036Z 134 │ let lastState = yield* SubscriptionRef.get(state); 2026-10-22T19:31:22.9794377Z 135 │ ╭─▶ for (let iteration = 0; iteration < 100; iteration += 1) { 2026-10-22T19:31:22.9794629Z 136 │ │ lastState = yield* SubscriptionRef.get(state); 2026-10-22T19:31:22.9794748Z 137 │ │ if (predicate(lastState)) { 2026-10-22T19:31:22.9794857Z 138 │ │ return lastState; 2026-10-22T19:31:22.9794943Z 139 │ │ } 2026-10-22T19:31:22.9795057Z 140 │ │ yield* Effect.yieldNow; 2026-10-22T19:31:22.9795189Z 141 │ ╰─▶ } 2026-10-22T19:31:22.9795274Z 142 │ return yield* Effect.die( 2026-10-22T19:31:22.9795334Z ╰──── 2026-10-22T19:31:22.9795336Z 2026-10-22T19:31:22.9795553Z ⚠ eslint(require-yield): This generator function does not have `yield` 2026-10-22T19:31:22.9795712Z ╭─[packages/provider-acp/src/server/mcpOverAcpBridge.ts:81:78] 2026-10-22T19:31:22.9795776Z  80 │ 2026-10-22T19:31:22.9796066Z  81 │ ╭─▶ export const makeAcpMcpOverAcpBridge = Effect.fn("AcpMcpOverAcpBridge.make")(function* ( 2026-10-22T19:31:22.9796199Z  82 │ │ options: AcpMcpOverAcpBridgeOptions, 2026-10-22T19:31:22.9796329Z  83 │ │ ): Effect.fn.Return { 2026-10-22T19:31:22.9796510Z  84 │ │ const fetchImplementation = options.fetchImplementation ?? fetch; 2026-10-22T19:31:22.9796655Z  85 │ │ const connections = new Map(); 2026-10-22T19:31:22.9796731Z  86 │ │ 2026-10-22T19:31:22.9796964Z  87 │ │ const connectionFor = (connectionId: string): Effect.Effect => 2026-10-22T19:31:22.9797077Z  88 │ │ Effect.suspend(() => { 2026-10-22T19:31:22.9797224Z  89 │ │ const connection = connections.get(connectionId); 2026-10-22T19:31:22.9797348Z  90 │ │ return connection === undefined 2026-10-22T19:31:22.9797578Z  91 │ │ ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`)) 2026-10-22T19:31:22.9797694Z  92 │ │ : Effect.succeed(connection); 2026-10-22T19:31:22.9797781Z  93 │ │ }); 2026-10-22T19:31:22.9797857Z  94 │ │ 2026-10-22T19:31:22.9797953Z  95 │ │ const send = ( 2026-10-22T19:31:22.9798067Z  96 │ │ connection: Connection, 2026-10-22T19:31:22.9798181Z  97 │ │ message: unknown, 2026-10-22T19:31:22.9798357Z  98 │ │ ): Effect.Effect, AcpMcpOverAcpError> => 2026-10-22T19:31:22.9798486Z  99 │ │ connection.mutex.withPermits(1)( 2026-10-22T19:31:22.9798598Z 100 │ │ Effect.gen(function* () { 2026-10-22T19:31:22.9798730Z 101 │ │ const body = JSON.stringify(message); 2026-10-22T19:31:22.9798882Z 102 │ │ if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) { 2026-10-22T19:31:22.9799111Z 103 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB.")); 2026-10-22T19:31:22.9799194Z 104 │ │ } 2026-10-22T19:31:22.9799396Z 105 │ │ const response = yield* Effect.tryPromise({ 2026-10-22T19:31:22.9799544Z 106 │ │ try: (signal) => 2026-10-22T19:31:22.9799687Z 107 │ │ fetchImplementation(options.endpoint, { 2026-10-22T19:31:22.9799793Z 108 │ │ method: "POST", 2026-10-22T19:31:22.9799896Z 109 │ │ signal, 2026-10-22T19:31:22.9800004Z 110 │ │ headers: { 2026-10-22T19:31:22.9800144Z 111 │ │ "content-type": "application/json", 2026-10-22T19:31:22.9800295Z 112 │ │ accept: "application/json, text/event-stream", 2026-10-22T19:31:22.9800442Z 113 │ │ authorization: options.authorization, 2026-10-22T19:31:22.9800585Z 114 │ │ ...(connection.sessionId === null 2026-10-22T19:31:22.9800698Z 115 │ │ ? {} 2026-10-22T19:31:22.9800852Z 116 │ │ : { "mcp-session-id": connection.sessionId }), 2026-10-22T19:31:22.9800998Z 117 │ │ ...(connection.protocolVersion === null 2026-10-22T19:31:22.9801098Z 118 │ │ ? {} 2026-10-22T19:31:22.9801278Z 119 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-22T19:31:22.9801368Z 120 │ │ }, 2026-10-22T19:31:22.9801466Z 121 │ │ body, 2026-10-22T19:31:22.9801559Z 122 │ │ }), 2026-10-22T19:31:22.9801670Z 123 │ │ catch: bridgeError, 2026-10-22T19:31:22.9801763Z 124 │ │ }); 2026-10-22T19:31:22.9801993Z 125 │ │ connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId; 2026-10-22T19:31:22.9802102Z 126 │ │ if (!response.ok) { 2026-10-22T19:31:22.9802216Z 127 │ │ yield* Effect.promise( 2026-10-22T19:31:22.9802415Z 128 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-22T19:31:22.9802501Z 129 │ │ ); 2026-10-22T19:31:22.9802622Z 130 │ │ return yield* Effect.fail( 2026-10-22T19:31:22.9802843Z 131 │ │ new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`), 2026-10-22T19:31:22.9802932Z 132 │ │ ); 2026-10-22T19:31:22.9803022Z 133 │ │ } 2026-10-22T19:31:22.9803250Z 134 │ │ const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))]; 2026-10-22T19:31:22.9803388Z 135 │ │ for (const payload of payloads) { 2026-10-22T19:31:22.9803621Z 136 │ │ connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion; 2026-10-22T19:31:22.9803704Z 137 │ │ } 2026-10-22T19:31:22.9803812Z 138 │ │ return payloads; 2026-10-22T19:31:22.9803951Z 139 │ │ }).pipe(Effect.mapError(bridgeError)), 2026-10-22T19:31:22.9804042Z 140 │ │ ); 2026-10-22T19:31:22.9804118Z 141 │ │ 2026-10-22T19:31:22.9804376Z 142 │ │ const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* ( 2026-10-22T19:31:22.9804591Z 143 │ │ request: AcpSchema.DisconnectMcpRequest, 2026-10-22T19:31:22.9804844Z 144 │ │ ): Effect.fn.Return { 2026-10-22T19:31:22.9805015Z 145 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-22T19:31:22.9805158Z 146 │ │ connections.delete(request.connectionId); 2026-10-22T19:31:22.9805295Z 147 │ │ const sessionId = connection.sessionId; 2026-10-22T19:31:22.9805407Z 148 │ │ if (sessionId !== null) { 2026-10-22T19:31:22.9805546Z 149 │ │ const response = yield* Effect.tryPromise({ 2026-10-22T19:31:22.9805652Z 150 │ │ try: (signal) => 2026-10-22T19:31:22.9805797Z 151 │ │ fetchImplementation(options.endpoint, { 2026-10-22T19:31:22.9805917Z 152 │ │ method: "DELETE", 2026-10-22T19:31:22.9806014Z 153 │ │ signal, 2026-10-22T19:31:22.9806117Z 154 │ │ headers: { 2026-10-22T19:31:22.9806258Z 155 │ │ authorization: options.authorization, 2026-10-22T19:31:22.9806386Z 156 │ │ "mcp-session-id": sessionId, 2026-10-22T19:31:22.9806528Z 157 │ │ ...(connection.protocolVersion === null 2026-10-22T19:31:22.9806628Z 158 │ │ ? {} 2026-10-22T19:31:22.9806804Z 159 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-22T19:31:22.9806902Z 160 │ │ }, 2026-10-22T19:31:22.9806995Z 161 │ │ }), 2026-10-22T19:31:22.9807101Z 162 │ │ catch: bridgeError, 2026-10-22T19:31:22.9807192Z 163 │ │ }); 2026-10-22T19:31:22.9807336Z 164 │ │ if (!response.ok && response.status !== 404) { 2026-10-22T19:31:22.9807459Z 165 │ │ return yield* Effect.fail( 2026-10-22T19:31:22.9807578Z 166 │ │ new AcpMcpOverAcpError( 2026-10-22T19:31:22.9807775Z 167 │ │ `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`, 2026-10-22T19:31:22.9807867Z 168 │ │ ), 2026-10-22T19:31:22.9807953Z 169 │ │ ); 2026-10-22T19:31:22.9808040Z 170 │ │ } 2026-10-22T19:31:22.9808157Z 171 │ │ yield* Effect.promise( 2026-10-22T19:31:22.9808353Z 172 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-22T19:31:22.9808440Z 173 │ │ ); 2026-10-22T19:31:22.9808521Z 174 │ │ } 2026-10-22T19:31:22.9808617Z 175 │ │ return {}; 2026-10-22T19:31:22.9808698Z 176 │ │ }); 2026-10-22T19:31:22.9808771Z 177 │ │ 2026-10-22T19:31:22.9808862Z 178 │ │ return { 2026-10-22T19:31:22.9809053Z 179 │ │ connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) { 2026-10-22T19:31:22.9809191Z 180 │ │ if (request.serverId !== "t3-code") { 2026-10-22T19:31:22.9809379Z 181 │ │ return yield* Effect.fail( 2026-10-22T19:31:22.9809615Z 182 │ │ new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`), 2026-10-22T19:31:22.9809705Z 183 │ │ ); 2026-10-22T19:31:22.9809789Z 184 │ │ } 2026-10-22T19:31:22.9809925Z 185 │ │ if (connections.size >= MAX_CONNECTIONS) { 2026-10-22T19:31:22.9810147Z 186 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections.")); 2026-10-22T19:31:22.9810232Z 187 │ │ } 2026-10-22T19:31:22.9810401Z 188 │ │ const connectionId = yield* options.allocateConnectionId; 2026-10-22T19:31:22.9810526Z 189 │ │ connections.set(connectionId, { 2026-10-22T19:31:22.9810659Z 190 │ │ mutex: yield* Semaphore.make(1), 2026-10-22T19:31:22.9810769Z 191 │ │ sessionId: null, 2026-10-22T19:31:22.9810884Z 192 │ │ protocolVersion: null, 2026-10-22T19:31:22.9810993Z 193 │ │ nextRequestId: 0, 2026-10-22T19:31:22.9811074Z 194 │ │ }); 2026-10-22T19:31:22.9811186Z 195 │ │ return { connectionId }; 2026-10-22T19:31:22.9811272Z 196 │ │ }), 2026-10-22T19:31:22.9811458Z 197 │ │ message: Effect.fn("mcpOverAcpBridge.message")(function* (request) { 2026-10-22T19:31:22.9811629Z 198 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-22T19:31:22.9811763Z 199 │ │ const id = ++connection.nextRequestId; 2026-10-22T19:31:22.9811908Z 200 │ │ const payloads = yield* send(connection, { 2026-10-22T19:31:22.9812019Z 201 │ │ jsonrpc: "2.0", 2026-10-22T19:31:22.9812106Z 202 │ │ id, 2026-10-22T19:31:22.9812220Z 203 │ │ method: request.method, 2026-10-22T19:31:22.9812392Z 204 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-22T19:31:22.9812478Z 205 │ │ }); 2026-10-22T19:31:22.9812678Z 206 │ │ const response = payloads.find((payload) => asEnvelope(payload)?.id === id); 2026-10-22T19:31:22.9812811Z 207 │ │ const envelope = asEnvelope(response); 2026-10-22T19:31:22.9812923Z 208 │ │ if (envelope === null) { 2026-10-22T19:31:22.9813250Z 209 │ │ return yield* Effect.fail( 2026-10-22T19:31:22.9813484Z 210 │ │ new AcpMcpOverAcpError("MCP server did not return a matching response."), 2026-10-22T19:31:22.9813571Z 211 │ │ ); 2026-10-22T19:31:22.9813654Z 212 │ │ } 2026-10-22T19:31:22.9813780Z 213 │ │ if (envelope.error !== undefined) { 2026-10-22T19:31:22.9813985Z 214 │ │ return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error))); 2026-10-22T19:31:22.9814072Z 215 │ │ } 2026-10-22T19:31:22.9814258Z 216 │ │ return (envelope.result ?? null) as AcpSchema.MessageMcpResponse; 2026-10-22T19:31:22.9814341Z 217 │ │ }), 2026-10-22T19:31:22.9814605Z 218 │ │ notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) { 2026-10-22T19:31:22.9814811Z 219 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-22T19:31:22.9814924Z 220 │ │ yield* send(connection, { 2026-10-22T19:31:22.9815031Z 221 │ │ jsonrpc: "2.0", 2026-10-22T19:31:22.9815142Z 222 │ │ method: request.method, 2026-10-22T19:31:22.9815310Z 223 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-22T19:31:22.9815401Z 224 │ │ }); 2026-10-22T19:31:22.9815483Z 225 │ │ }), 2026-10-22T19:31:22.9815577Z 226 │ │ disconnect, 2026-10-22T19:31:22.9815697Z 227 │ │ dispose: Effect.suspend(() => 2026-10-22T19:31:22.9815809Z 228 │ │ Effect.forEach( 2026-10-22T19:31:22.9815927Z 229 │ │ [...connections.keys()], 2026-10-22T19:31:22.9816111Z 230 │ │ (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore), 2026-10-22T19:31:22.9816223Z 231 │ │ { discard: true }, 2026-10-22T19:31:22.9816310Z 232 │ │ ), 2026-10-22T19:31:22.9816392Z 233 │ │ ), 2026-10-22T19:31:22.9816475Z 234 │ │ }; 2026-10-22T19:31:22.9816610Z 235 │ ╰─▶ }); 2026-10-22T19:31:22.9816675Z ╰──── 2026-10-22T19:31:22.9816950Z  help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed. 2026-10-22T19:31:22.9816953Z 2026-10-22T19:31:22.9817187Z ⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used. 2026-10-22T19:31:22.9817338Z ╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10] 2026-10-22T19:31:22.9817400Z 21 │ 2026-10-22T19:31:22.9817569Z 22 │ function summarizePayload(payload: unknown): Readonly> { 2026-10-22T19:31:22.9817675Z ·  ────────┬─────── 2026-10-22T19:31:22.9817839Z · ╰── 'summarizePayload' is declared here 2026-10-22T19:31:22.9817955Z 23 │ if (payload === null) return { valueType: "null" }; 2026-10-22T19:31:22.9818020Z ╰──── 2026-10-22T19:31:22.9818139Z  help: Consider removing this declaration. 2026-10-22T19:31:22.9818142Z 2026-10-22T19:31:22.9818475Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T19:31:22.9818707Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:335:7] 2026-10-22T19:31:22.9818772Z 330 │ }; 2026-10-22T19:31:22.9818847Z 331 │ useEffect(() => { 2026-10-22T19:31:22.9818923Z ·  ────┬──── 2026-10-22T19:31:22.9819071Z · ╰── This is the containing effect 2026-10-22T19:31:22.9819179Z 332 │ if (!guidesEnabled && section === "guide") { 2026-10-22T19:31:22.9819286Z 333 │ requestedSection.current = "overview"; 2026-10-22T19:31:22.9819466Z 334 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-22T19:31:22.9819550Z 335 │ setSection("overview"); 2026-10-22T19:31:22.9819639Z ·  ─────┬──── 2026-10-22T19:31:22.9819831Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:22.9819894Z 336 │ } 2026-10-22T19:31:22.9819953Z ╰──── 2026-10-22T19:31:22.9820594Z  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-22T19:31:22.9820943Z  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-22T19:31:22.9820946Z 2026-10-22T19:31:22.9821165Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-22T19:31:22.9821352Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:337:6] 2026-10-22T19:31:22.9821463Z 332 │ if (!guidesEnabled && section === "guide") { 2026-10-22T19:31:22.9821570Z 333 │ requestedSection.current = "overview"; 2026-10-22T19:31:22.9821662Z ·  ────────┬─────── 2026-10-22T19:31:22.9822138Z · ╰── 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-22T19:31:22.9822313Z 334 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-22T19:31:22.9822481Z ·  ─────────┬───────── ──────┬────── 2026-10-22T19:31:22.9823027Z · │ ╰── 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-22T19:31:22.9823530Z · ╰── 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-22T19:31:22.9823610Z 335 │ setSection("overview"); 2026-10-22T19:31:22.9823679Z 336 │ } 2026-10-22T19:31:22.9823795Z 337 │ }, [guidesEnabled, section, insets.top]); 2026-10-22T19:31:22.9823927Z ·  ──────────────────┬───────────────── 2026-10-22T19:31:22.9824202Z · ╰── This dependency list is missing values used by the callback 2026-10-22T19:31:22.9824331Z 338 │ const tabContent = activityContent; 2026-10-22T19:31:22.9824394Z ╰──── 2026-10-22T19:31:22.9824651Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-22T19:31:22.9824988Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9824994Z 2026-10-22T19:31:22.9825211Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-22T19:31:22.9825398Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:873:6] 2026-10-22T19:31:22.9825462Z 856 │ if ( 2026-10-22T19:31:22.9825590Z 857 │ lastSelection.current.path === route.params.path && 2026-10-22T19:31:22.9825680Z ·  ──────┬────── 2026-10-22T19:31:22.9826150Z · ╰── 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-22T19:31:22.9826287Z 858 │ lastSelection.current.id === route.params.fileSelectionId 2026-10-22T19:31:22.9826348Z 859 │ ) 2026-10-22T19:31:22.9826412Z 860 │ return; 2026-10-22T19:31:22.9826605Z 861 │ lastSelection.current = { path: route.params.path, id: route.params.fileSelectionId }; 2026-10-22T19:31:22.9826752Z 862 │ if (route.params.focus) navigation.setParams({ focus: undefined }); 2026-10-22T19:31:22.9826848Z 863 │ setJumpPath(route.params.path); 2026-10-22T19:31:22.9826927Z 864 │ setSelectedRowId(null); 2026-10-22T19:31:22.9827015Z 865 │ jumpStarted.current = false; 2026-10-22T19:31:22.9827180Z 866 │ const file = data.files.find((entry) => entry.path === route.params.path); 2026-10-22T19:31:22.9827286Z 867 │ if (!file || !nativeView.current) return; 2026-10-22T19:31:22.9827382Z ·  ─────┬──── 2026-10-22T19:31:22.9827855Z · ╰── 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-22T19:31:22.9827992Z 868 │ setCollapsedIds((ids) => ids.filter((id) => id !== file.id)); 2026-10-22T19:31:22.9828079Z 869 │ jumpStarted.current = true; 2026-10-22T19:31:22.9828279Z 870 │ void nativeView.current.scrollToFile(file.id, false).catch(() => { 2026-10-22T19:31:22.9828374Z 871 │ jumpStarted.current = false; 2026-10-22T19:31:22.9828445Z 872 │ }); 2026-10-22T19:31:22.9828660Z 873 │ }, [route.params.path, route.params.fileSelectionId, route.params.focus, data.files, navigation]); 2026-10-22T19:31:22.9828880Z ·  ──────────────────────────────────────────────┬────────────────────────────────────────────── 2026-10-22T19:31:22.9829120Z · ╰── This dependency list is missing values used by the callback 2026-10-22T19:31:22.9829240Z 874 │ const appliedFilter = useRef(filter.hideTestFiles); 2026-10-22T19:31:22.9829302Z ╰──── 2026-10-22T19:31:22.9829714Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-22T19:31:22.9830052Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9830159Z 2026-10-22T19:31:22.9830718Z ⚠ 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-22T19:31:22.9830866Z ╭─[packages/client-runtime/src/rpc/client.test.ts:131:9] 2026-10-22T19:31:22.9830939Z 130 │ ) { 2026-10-22T19:31:22.9831169Z 131 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-22T19:31:22.9831303Z 132 │ │ if (subscriptions.length >= count) { 2026-10-22T19:31:22.9831406Z 133 │ │ return; 2026-10-22T19:31:22.9831497Z 134 │ │ } 2026-10-22T19:31:22.9831621Z 135 │ │ yield* Effect.yieldNow; 2026-10-22T19:31:22.9831764Z 136 │ ╰─▶ } 2026-10-22T19:31:22.9831944Z 137 │ return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`)); 2026-10-22T19:31:22.9832001Z ╰──── 2026-10-22T19:31:22.9832004Z 2026-10-22T19:31:22.9832503Z ⚠ 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-22T19:31:22.9832644Z ╭─[packages/client-runtime/src/rpc/client.test.ts:252:7] 2026-10-22T19:31:22.9832821Z 251 │ yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient))); 2026-10-22T19:31:22.9833105Z 252 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) { 2026-10-22T19:31:22.9833224Z 253 │ │ yield* Effect.yieldNow; 2026-10-22T19:31:22.9833368Z 254 │ ╰─▶ } 2026-10-22T19:31:22.9833500Z 255 │ yield* SubscriptionRef.set(activeSession, Option.none()); 2026-10-22T19:31:22.9833560Z ╰──── 2026-10-22T19:31:22.9833562Z 2026-10-22T19:31:22.9834061Z ⚠ 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-22T19:31:22.9834211Z ╭─[packages/client-runtime/src/rpc/client.test.ts:258:7] 2026-10-22T19:31:22.9834269Z 257 │ 2026-10-22T19:31:22.9834596Z 258 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-22T19:31:22.9834734Z 259 │ │ yield* Effect.yieldNow; 2026-10-22T19:31:22.9834877Z 260 │ ╰─▶ } 2026-10-22T19:31:22.9834987Z 261 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-22T19:31:22.9835055Z ╰──── 2026-10-22T19:31:22.9835058Z 2026-10-22T19:31:22.9835552Z ⚠ 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-22T19:31:22.9835700Z ╭─[packages/client-runtime/src/rpc/client.test.ts:322:7] 2026-10-22T19:31:22.9835824Z 321 │ ); 2026-10-22T19:31:22.9836137Z 322 │ ╭─▶ for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) { 2026-10-22T19:31:22.9836252Z 323 │ │ yield* Effect.yieldNow; 2026-10-22T19:31:22.9836393Z 324 │ ╰─▶ } 2026-10-22T19:31:22.9836459Z 325 │ 2026-10-22T19:31:22.9836513Z ╰──── 2026-10-22T19:31:22.9836516Z 2026-10-22T19:31:22.9837010Z ⚠ 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-22T19:31:22.9837151Z ╭─[packages/client-runtime/src/rpc/client.test.ts:330:7] 2026-10-22T19:31:22.9837334Z 329 │ yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient))); 2026-10-22T19:31:22.9837599Z 330 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-22T19:31:22.9837708Z 331 │ │ yield* Effect.yieldNow; 2026-10-22T19:31:22.9837847Z 332 │ ╰─▶ } 2026-10-22T19:31:22.9837960Z 333 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-22T19:31:22.9838020Z ╰──── 2026-10-22T19:31:22.9838022Z 2026-10-22T19:31:22.9838510Z ⚠ 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-22T19:31:22.9838664Z ╭─[packages/client-runtime/src/rpc/session.test.ts:226:3] 2026-10-22T19:31:22.9838732Z 225 │ ) { 2026-10-22T19:31:22.9838946Z 226 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-22T19:31:22.9839062Z 227 │ │ const socket = sockets[index]; 2026-10-22T19:31:22.9839160Z 228 │ │ if (socket) { 2026-10-22T19:31:22.9839263Z 229 │ │ return socket; 2026-10-22T19:31:22.9839346Z 230 │ │ } 2026-10-22T19:31:22.9839452Z 231 │ │ yield* Effect.yieldNow; 2026-10-22T19:31:22.9839588Z 232 │ ╰─▶ } 2026-10-22T19:31:22.9839845Z 233 │ return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket.")); 2026-10-22T19:31:22.9839940Z ╰──── 2026-10-22T19:31:22.9839943Z 2026-10-22T19:31:22.9840588Z ⚠ 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-22T19:31:22.9840732Z ╭─[packages/client-runtime/src/rpc/session.test.ts:240:3] 2026-10-22T19:31:22.9840795Z 239 │ ) { 2026-10-22T19:31:22.9841008Z 240 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-22T19:31:22.9841237Z 241 │ │ const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index]; 2026-10-22T19:31:22.9841335Z 242 │ │ if (request) { 2026-10-22T19:31:22.9841444Z 243 │ │ return request; 2026-10-22T19:31:22.9841528Z 244 │ │ } 2026-10-22T19:31:22.9841640Z 245 │ │ yield* Effect.yieldNow; 2026-10-22T19:31:22.9841770Z 246 │ ╰─▶ } 2026-10-22T19:31:22.9841947Z 247 │ return yield* Effect.die(new Error("Expected the RPC protocol to send a request.")); 2026-10-22T19:31:22.9842006Z ╰──── 2026-10-22T19:31:22.9842009Z 2026-10-22T19:31:22.9842237Z ⚠ eslint(no-unused-vars): Function 'describeSchedule' is declared but never used. 2026-10-22T19:31:22.9842371Z ╭─[apps/server/src/scheduledTasks/Schedule.ts:79:10] 2026-10-22T19:31:22.9842430Z 78 │ 2026-10-22T19:31:22.9842577Z 79 │ function describeSchedule(schedule: ScheduledTaskSchedule): string { 2026-10-22T19:31:22.9842683Z ·  ────────┬─────── 2026-10-22T19:31:22.9842845Z · ╰── 'describeSchedule' is declared here 2026-10-22T19:31:22.9842963Z 80 │ if (schedule.type === "webhook") return "On webhook"; 2026-10-22T19:31:22.9843024Z ╰──── 2026-10-22T19:31:22.9843143Z  help: Consider removing this declaration. 2026-10-22T19:31:22.9843145Z 2026-10-22T19:31:22.9843349Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-22T19:31:22.9843492Z ╭─[packages/client-runtime/src/state/shell.ts:189:5] 2026-10-22T19:31:22.9843609Z 186 │ let waiting = yield* Ref.get(awaitingCompletion); 2026-10-22T19:31:22.9843686Z 187 │ let next = initial; 2026-10-22T19:31:22.9843762Z ·  ──┬─ 2026-10-22T19:31:22.9843900Z · ╰── From this accumulator 2026-10-22T19:31:22.9843995Z 188 │ let receivedSnapshot = false; 2026-10-22T19:31:22.9844081Z 189 │ for (const item of items) { 2026-10-22T19:31:22.9844154Z ·  ─┬─ 2026-10-22T19:31:22.9844270Z · ╰── For this loop 2026-10-22T19:31:22.9844368Z 190 │ if (item.kind === "synchronized") { 2026-10-22T19:31:22.9844443Z 191 │ waiting = false; 2026-10-22T19:31:22.9844577Z 192 │ if (Option.isSome(next.snapshot)) { 2026-10-22T19:31:22.9844728Z 193 │ next = { ...next, status: "live", error: Option.none() }; 2026-10-22T19:31:22.9844824Z ·  ───┬─── 2026-10-22T19:31:22.9844963Z · ╰── From this spread 2026-10-22T19:31:22.9845025Z 194 │ } 2026-10-22T19:31:22.9845081Z ╰──── 2026-10-22T19:31:22.9845312Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-22T19:31:22.9845530Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-22T19:31:22.9845532Z 2026-10-22T19:31:22.9846025Z ⚠ 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-22T19:31:22.9846222Z ╭─[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:521:13] 2026-10-22T19:31:22.9846305Z 520 │ })).delivery; 2026-10-22T19:31:22.9846521Z 521 │ ╭─▶ while (delivery.outcome === "accepted") { 2026-10-22T19:31:22.9846651Z 522 │ │ yield* Effect.yieldNow; 2026-10-22T19:31:22.9846810Z 523 │ │ delivery = (yield* service.getWebhookDelivery({ 2026-10-22T19:31:22.9846921Z 524 │ │ id: task.id, 2026-10-22T19:31:22.9847049Z 525 │ │ deliveryId: deliveryId!, 2026-10-22T19:31:22.9847157Z 526 │ │ })).delivery; 2026-10-22T19:31:22.9847299Z 527 │ ╰─▶ } 2026-10-22T19:31:22.9847426Z 528 │ assert.equal(delivery.outcome, "dispatch_failed"); 2026-10-22T19:31:22.9847485Z ╰──── 2026-10-22T19:31:22.9847487Z 2026-10-22T19:31:22.9847739Z ⚠ eslint(no-unused-vars): Function 'resolveThreadWorkspaceCwd' is declared but never used. 2026-10-22T19:31:22.9847871Z ╭─[apps/server/src/checkpointing/Utils.ts:12:10] 2026-10-22T19:31:22.9847934Z 11 │ 2026-10-22T19:31:22.9848041Z 12 │ function resolveThreadWorkspaceCwd(input: { 2026-10-22T19:31:22.9848154Z ·  ────────────┬──────────── 2026-10-22T19:31:22.9848335Z · ╰── 'resolveThreadWorkspaceCwd' is declared here 2026-10-22T19:31:22.9848409Z 13 │ readonly thread: { 2026-10-22T19:31:22.9848466Z ╰──── 2026-10-22T19:31:22.9848582Z  help: Consider removing this declaration. 2026-10-22T19:31:22.9848585Z 2026-10-22T19:31:22.9848777Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-22T19:31:22.9848954Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:100:85] 2026-10-22T19:31:22.9849076Z  99 │ const startEditor = startScheduledTaskEditor; 2026-10-22T19:31:22.9849281Z 100 │ const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]); 2026-10-22T19:31:22.9849435Z ·  ─────┬───── 2026-10-22T19:31:22.9849671Z · ╰── Unnecessary dependency `startEditor` 2026-10-22T19:31:22.9849764Z 101 │ const readEditor = useCallback( 2026-10-22T19:31:22.9849823Z ╰──── 2026-10-22T19:31:22.9850164Z  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-22T19:31:22.9850553Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9850601Z 2026-10-22T19:31:22.9850804Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-22T19:31:22.9850977Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:121:7] 2026-10-22T19:31:22.9851048Z 120 │ setEditor, 2026-10-22T19:31:22.9851136Z 121 │ startEditor, 2026-10-22T19:31:22.9851230Z ·  ─────┬───── 2026-10-22T19:31:22.9851391Z · ╰── Unnecessary dependency `startEditor` 2026-10-22T19:31:22.9851462Z 122 │ hasChanges, 2026-10-22T19:31:22.9851515Z ╰──── 2026-10-22T19:31:22.9851853Z  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-22T19:31:22.9852193Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9852199Z 2026-10-22T19:31:22.9852469Z ⚠ eslint(no-unused-vars): Function 'normalizeTerminalContextSelection' is declared but never used. 2026-10-22T19:31:22.9852593Z ╭─[apps/web/src/lib/terminalContext.ts:56:10] 2026-10-22T19:31:22.9852647Z 55 │ 2026-10-22T19:31:22.9852755Z 56 │ function normalizeTerminalContextSelection( 2026-10-22T19:31:22.9852877Z ·  ────────────────┬──────────────── 2026-10-22T19:31:22.9853083Z · ╰── 'normalizeTerminalContextSelection' is declared here 2026-10-22T19:31:22.9853176Z 57 │ selection: TerminalContextSelection, 2026-10-22T19:31:22.9853234Z ╰──── 2026-10-22T19:31:22.9853355Z  help: Consider removing this declaration. 2026-10-22T19:31:22.9853362Z 2026-10-22T19:31:22.9853859Z ⚠ 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-22T19:31:22.9854018Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:169:7] 2026-10-22T19:31:22.9854102Z 168 │ }); 2026-10-22T19:31:22.9854316Z 169 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-22T19:31:22.9854560Z 170 │ │ if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break; 2026-10-22T19:31:22.9854719Z 171 │ │ yield* Effect.yieldNow; 2026-10-22T19:31:22.9854863Z 172 │ ╰─▶ } 2026-10-22T19:31:22.9854929Z 173 │ 2026-10-22T19:31:22.9854987Z ╰──── 2026-10-22T19:31:22.9854990Z 2026-10-22T19:31:22.9855482Z ⚠ 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-22T19:31:22.9855638Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:178:7] 2026-10-22T19:31:22.9855762Z 177 │ yield* Deferred.succeed(releaseSave, undefined); 2026-10-22T19:31:22.9855971Z 178 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-22T19:31:22.9856180Z 179 │ │ if ((yield* Ref.get(saved)).length > 0) break; 2026-10-22T19:31:22.9856327Z 180 │ │ yield* Effect.yieldNow; 2026-10-22T19:31:22.9856467Z 181 │ ╰─▶ } 2026-10-22T19:31:22.9856526Z 182 │ 2026-10-22T19:31:22.9856582Z ╰──── 2026-10-22T19:31:22.9856585Z 2026-10-22T19:31:22.9857073Z ⚠ 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-22T19:31:22.9857232Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7] 2026-10-22T19:31:22.9857373Z 306 │ yield* Deferred.succeed(releaseUnenrichedSave, undefined); 2026-10-22T19:31:22.9857589Z 307 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-22T19:31:22.9857738Z 308 │ │ const values = yield* Ref.get(saved); 2026-10-22T19:31:22.9857942Z 309 │ │ if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) { 2026-10-22T19:31:22.9858039Z 310 │ │ break; 2026-10-22T19:31:22.9858130Z 311 │ │ } 2026-10-22T19:31:22.9858248Z 312 │ │ yield* Effect.yieldNow; 2026-10-22T19:31:22.9858387Z 313 │ ╰─▶ } 2026-10-22T19:31:22.9858454Z 314 │ 2026-10-22T19:31:22.9858513Z ╰──── 2026-10-22T19:31:22.9858516Z 2026-10-22T19:31:22.9858744Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-22T19:31:22.9858885Z ╭─[packages/client-runtime/src/state/usageAccess.ts:3:8] 2026-10-22T19:31:22.9858972Z 2 │ AuthDiagnosticsReadScope, 2026-10-22T19:31:22.9859051Z 3 │ type AuthSessionState, 2026-10-22T19:31:22.9859147Z ·  ────────┬─────── 2026-10-22T19:31:22.9859309Z · ╰── 'AuthSessionState' is imported here 2026-10-22T19:31:22.9859389Z 4 │ sessionGrantsScope, 2026-10-22T19:31:22.9859449Z ╰──── 2026-10-22T19:31:22.9859560Z  help: Consider removing this import. 2026-10-22T19:31:22.9859562Z 2026-10-22T19:31:22.9860058Z ⚠ 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-22T19:31:22.9860230Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1228:7] 2026-10-22T19:31:22.9860335Z 1227 │ yield* harness.replaceSession; 2026-10-22T19:31:22.9860561Z 1228 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-22T19:31:22.9860730Z 1229 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) { 2026-10-22T19:31:22.9860824Z 1230 │ │ break; 2026-10-22T19:31:22.9860913Z 1231 │ │ } 2026-10-22T19:31:22.9861027Z 1232 │ │ yield* Effect.yieldNow; 2026-10-22T19:31:22.9861173Z 1233 │ ╰─▶ } 2026-10-22T19:31:22.9861253Z 1234 │ yield* Queue.offer( 2026-10-22T19:31:22.9861377Z ╰──── 2026-10-22T19:31:22.9861434Z 2026-10-22T19:31:22.9861924Z ⚠ 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-22T19:31:22.9862089Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1337:7] 2026-10-22T19:31:22.9862185Z 1336 │ yield* harness.replaceSession; 2026-10-22T19:31:22.9862406Z 1337 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-22T19:31:22.9862582Z 1338 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break; 2026-10-22T19:31:22.9862696Z 1339 │ │ yield* Effect.yieldNow; 2026-10-22T19:31:22.9862845Z 1340 │ ╰─▶ } 2026-10-22T19:31:22.9862990Z 1341 │ expect(yield* Ref.get(harness.subscriptionCount)).toBe(2); 2026-10-22T19:31:22.9863050Z ╰──── 2026-10-22T19:31:22.9863053Z 2026-10-22T19:31:22.9863263Z ⚠ eslint(no-unused-vars): Identifier 'Arr' is imported but never used. 2026-10-22T19:31:22.9863408Z ╭─[packages/client-runtime/src/state/threadSort.ts:4:13] 2026-10-22T19:31:22.9863532Z 3 │ import type { EnvironmentThreadShell } from "./models.ts"; 2026-10-22T19:31:22.9863622Z 4 │ import * as Arr from "effect/Array"; 2026-10-22T19:31:22.9863703Z ·  ─┬─ 2026-10-22T19:31:22.9863840Z · ╰── 'Arr' is imported here 2026-10-22T19:31:22.9863928Z 5 │ import * as Order from "effect/Order"; 2026-10-22T19:31:22.9863990Z ╰──── 2026-10-22T19:31:22.9864106Z  help: Consider removing this import. 2026-10-22T19:31:22.9864111Z 2026-10-22T19:31:22.9864320Z ⚠ eslint(no-unused-vars): Identifier 'Order' is imported but never used. 2026-10-22T19:31:22.9864457Z ╭─[packages/client-runtime/src/state/threadSort.ts:5:13] 2026-10-22T19:31:22.9864563Z 4 │ import * as Arr from "effect/Array"; 2026-10-22T19:31:22.9864685Z 5 │ import * as Order from "effect/Order"; 2026-10-22T19:31:22.9864766Z ·  ──┬── 2026-10-22T19:31:22.9864904Z · ╰── 'Order' is imported here 2026-10-22T19:31:22.9864962Z 6 │ 2026-10-22T19:31:22.9865018Z ╰──── 2026-10-22T19:31:22.9865123Z  help: Consider removing this import. 2026-10-22T19:31:22.9865129Z 2026-10-22T19:31:22.9865315Z ⚠ eslint(no-control-regex): Unexpected control character 2026-10-22T19:31:22.9865530Z ╭─[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46] 2026-10-22T19:31:22.9865683Z 219 │ 2026-10-22T19:31:22.9865837Z 220 │ {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")} 2026-10-22T19:31:22.9865952Z ·  ──┬─ 2026-10-22T19:31:22.9866136Z · ╰── 'U+001B' is a control character. 2026-10-22T19:31:22.9866207Z 221 │ 2026-10-22T19:31:22.9866266Z ╰──── 2026-10-22T19:31:22.9866516Z  help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression. 2026-10-22T19:31:22.9866518Z 2026-10-22T19:31:22.9866858Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-22T19:31:22.9867037Z ╭─[packages/provider-grok/src/server/adapter.ts:408:7] 2026-10-22T19:31:22.9867102Z 407 │ 2026-10-22T19:31:22.9867186Z 408 │ const layer: Layer.Layer< 2026-10-22T19:31:22.9867266Z ·  ──┬── 2026-10-22T19:31:22.9867404Z · ╰── 'layer' is declared here 2026-10-22T19:31:22.9867511Z 409 │ ProviderAdapter.ProviderAdapterV2, 2026-10-22T19:31:22.9867564Z ╰──── 2026-10-22T19:31:22.9867681Z  help: Consider removing this declaration. 2026-10-22T19:31:22.9867684Z 2026-10-22T19:31:22.9867968Z ⚠ eslint(no-unused-vars): Function 'promptResponseHasMissingXAiStopReason' is declared but never used. 2026-10-22T19:31:22.9868139Z ╭─[packages/provider-grok/src/server/xaiAcpExtension.ts:1620:10] 2026-10-22T19:31:22.9868199Z 1619 │ 2026-10-22T19:31:22.9868426Z 1620 │ function promptResponseHasMissingXAiStopReason(response: EffectAcpSchema.PromptResponse): boolean { 2026-10-22T19:31:22.9868557Z ·  ──────────────────┬────────────────── 2026-10-22T19:31:22.9868777Z · ╰── 'promptResponseHasMissingXAiStopReason' is declared here 2026-10-22T19:31:22.9868865Z 1621 │ const meta = response._meta; 2026-10-22T19:31:22.9868920Z ╰──── 2026-10-22T19:31:22.9869035Z  help: Consider removing this declaration. 2026-10-22T19:31:22.9869038Z 2026-10-22T19:31:22.9869266Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-22T19:31:22.9869520Z ╭─[apps/web/src/lib/composerContextReferences.ts:90:40] 2026-10-22T19:31:22.9869603Z 89 │ let cursor = prompt.length; 2026-10-22T19:31:22.9869721Z 90 │ for (const occurrence of occurrences.reverse()) { 2026-10-22T19:31:22.9869833Z ·  ─────── 2026-10-22T19:31:22.9869928Z 91 │ let { start, end } = occurrence; 2026-10-22T19:31:22.9869981Z ╰──── 2026-10-22T19:31:22.9870262Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-22T19:31:22.9870265Z 2026-10-22T19:31:22.9870482Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-22T19:31:22.9870624Z ╭─[packages/client-runtime/src/state/filesystem.ts:3:8] 2026-10-22T19:31:22.9870924Z 2 │ AuthFilesystemReadScope, 2026-10-22T19:31:22.9871041Z 3 │ type AuthSessionState, 2026-10-22T19:31:22.9871133Z ·  ────────┬─────── 2026-10-22T19:31:22.9871301Z · ╰── 'AuthSessionState' is imported here 2026-10-22T19:31:22.9871380Z 4 │ type FilesystemBrowseEntry, 2026-10-22T19:31:22.9871439Z ╰──── 2026-10-22T19:31:22.9871547Z  help: Consider removing this import. 2026-10-22T19:31:22.9871550Z 2026-10-22T19:31:22.9871824Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T19:31:22.9871979Z ╭─[apps/mobile/src/components/VideoPreviewModal.ios.tsx:63:55] 2026-10-22T19:31:22.9872044Z 61 │ }, []); 2026-10-22T19:31:22.9872119Z 62 │ useEffect(() => { 2026-10-22T19:31:22.9872205Z ·  ────┬──── 2026-10-22T19:31:22.9872344Z · ╰── This is the containing effect 2026-10-22T19:31:22.9872509Z 63 │ if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl); 2026-10-22T19:31:22.9872644Z ·  ───────┬────── 2026-10-22T19:31:22.9872877Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:22.9872961Z 64 │ }, [playbackUrl, resolvedUrl]); 2026-10-22T19:31:22.9873018Z ╰──── 2026-10-22T19:31:22.9873670Z  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-22T19:31:22.9874018Z  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-22T19:31:22.9874021Z 2026-10-22T19:31:22.9874239Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T19:31:22.9874375Z ╭─[apps/mobile/src/components/ComposerEditor.tsx:82:6] 2026-10-22T19:31:22.9874441Z 81 │ }, 2026-10-22T19:31:22.9874509Z 82 │ [draftKey], 2026-10-22T19:31:22.9874669Z ·  ────┬─── 2026-10-22T19:31:22.9874815Z · ╰── Unnecessary dependency `draftKey` 2026-10-22T19:31:22.9874876Z 83 │ ); 2026-10-22T19:31:22.9874934Z ╰──── 2026-10-22T19:31:22.9875255Z  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-22T19:31:22.9875587Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9875594Z 2026-10-22T19:31:22.9875793Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-22T19:31:22.9875911Z ╭─[packages/shared/src/qrCode.ts:458:44] 2026-10-22T19:31:22.9875985Z 457 │ ): Array { 2026-10-22T19:31:22.9876105Z 458 │ let result: Array = divisor.map((_) => 0); 2026-10-22T19:31:22.9876212Z ·  ┬ 2026-10-22T19:31:22.9876432Z · ╰── '_' is declared here 2026-10-22T19:31:22.9876552Z 459 │ for (const b of data) { 2026-10-22T19:31:22.9876611Z ╰──── 2026-10-22T19:31:22.9876724Z  help: Consider removing this parameter. 2026-10-22T19:31:22.9876727Z 2026-10-22T19:31:22.9876887Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9877018Z ╭─[apps/mobile/src/native/StackHeader.tsx:184:9] 2026-10-22T19:31:22.9877092Z 183 │ "options", 2026-10-22T19:31:22.9877191Z 184 │ latestOptionFunctionsRef.current, 2026-10-22T19:31:22.9877312Z ·  ────────────────┬─────────────── 2026-10-22T19:31:22.9877523Z · ╰── Passing a ref to a function may read its value during render 2026-10-22T19:31:22.9877627Z 185 │ optionFunctionWrappersRef.current, 2026-10-22T19:31:22.9877689Z ╰──── 2026-10-22T19:31:22.9878198Z  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-22T19:31:22.9878511Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9878513Z 2026-10-22T19:31:22.9878669Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9878792Z ╭─[apps/mobile/src/native/StackHeader.tsx:185:9] 2026-10-22T19:31:22.9878894Z 184 │ latestOptionFunctionsRef.current, 2026-10-22T19:31:22.9878994Z 185 │ optionFunctionWrappersRef.current, 2026-10-22T19:31:22.9879120Z ·  ────────────────┬──────────────── 2026-10-22T19:31:22.9879332Z · ╰── Passing a ref to a function may read its value during render 2026-10-22T19:31:22.9879431Z 186 │ ) as NativeStackNavigationOptions) 2026-10-22T19:31:22.9879488Z ╰──── 2026-10-22T19:31:22.9879989Z  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-22T19:31:22.9880301Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9880304Z 2026-10-22T19:31:22.9880499Z ⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`. 2026-10-22T19:31:22.9880635Z ╭─[apps/web/src/terminal/ghostty/core.ts:194:19] 2026-10-22T19:31:22.9880770Z 193 │ const count = Math.min(CHUNK_SIZE, graphemeLength - start); 2026-10-22T19:31:22.9880870Z 194 │ const codes = new Array(count); 2026-10-22T19:31:22.9880984Z ·  ──────────────────────── 2026-10-22T19:31:22.9881099Z 195 │ for (let index = 0; index < count; index += 1) { 2026-10-22T19:31:22.9881158Z ╰──── 2026-10-22T19:31:22.9881610Z  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-22T19:31:22.9881612Z 2026-10-22T19:31:22.9881903Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-22T19:31:22.9882062Z ╭─[packages/shared/src/serverSettings.ts:346:9] 2026-10-22T19:31:22.9882177Z 345 │ const entry: ProjectSettingsOverrides = { 2026-10-22T19:31:22.9882323Z 346 │ ...(entries.get(projectId) ?? currentEntries[projectId] ?? {}), 2026-10-22T19:31:22.9882487Z ·  ────────────────────────────────────────────────────────────── 2026-10-22T19:31:22.9882550Z 347 │ }; 2026-10-22T19:31:22.9882609Z ╰──── 2026-10-22T19:31:22.9882897Z  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-22T19:31:22.9882900Z 2026-10-22T19:31:22.9883138Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in Array.prototype.reduce() 2026-10-22T19:31:22.9883270Z ╭─[packages/shared/src/serverSettings.ts:448:24] 2026-10-22T19:31:22.9883352Z 447 │ const favorites = 2026-10-22T19:31:22.9883483Z 448 │ setModelFavorites?.reduce((current, change) => { 2026-10-22T19:31:22.9883587Z ·  ───┬── 2026-10-22T19:31:22.9883724Z · ╰── For this reduce 2026-10-22T19:31:22.9883817Z 449 │ const exists = current.some( 2026-10-22T19:31:22.9884009Z 450 │ (favorite) => favorite.provider === change.provider && favorite.model === change.model, 2026-10-22T19:31:22.9884073Z 451 │ ); 2026-10-22T19:31:22.9884151Z 452 │ return change.favorite 2026-10-22T19:31:22.9884222Z 453 │ ? exists 2026-10-22T19:31:22.9884294Z 454 │ ? current 2026-10-22T19:31:22.9884439Z 455 │ : [...current, { provider: change.provider, model: change.model }] 2026-10-22T19:31:22.9884555Z ·  ─────┬──── 2026-10-22T19:31:22.9884728Z · ╰── From this spread 2026-10-22T19:31:22.9884805Z 456 │ : current.filter( 2026-10-22T19:31:22.9884867Z ╰──── 2026-10-22T19:31:22.9885089Z  help: Consider using `Object.assign()` or `Array.prototype.push()` to mutate the accumulator instead. 2026-10-22T19:31:22.9885262Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-22T19:31:22.9885264Z 2026-10-22T19:31:22.9885470Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-22T19:31:22.9885605Z ╭─[packages/shared/src/serverSettings.ts:466:3] 2026-10-22T19:31:22.9885669Z 464 │ null; 2026-10-22T19:31:22.9885800Z 465 │ let nextModelPreferences = initialModelPreferences; 2026-10-22T19:31:22.9885906Z ·  ──────────┬───────── 2026-10-22T19:31:22.9886049Z · ╰── From this accumulator 2026-10-22T19:31:22.9886156Z 466 │ for (const change of setModelsHidden ?? []) { 2026-10-22T19:31:22.9886231Z ·  ─┬─ 2026-10-22T19:31:22.9886346Z · ╰── For this loop 2026-10-22T19:31:22.9886492Z 467 │ const preferences = nextModelPreferences?.[change.provider] ?? { 2026-10-22T19:31:22.9886566Z 468 │ hiddenModels: [], 2026-10-22T19:31:22.9886641Z 469 │ modelOrder: [], 2026-10-22T19:31:22.9886706Z 470 │ }; 2026-10-22T19:31:22.9886899Z 471 │ const hiddenModels = preferences.hiddenModels.filter((model) => model !== change.model); 2026-10-22T19:31:22.9887014Z 472 │ if (change.hidden) hiddenModels.push(change.model); 2026-10-22T19:31:22.9887164Z 473 │ nextModelPreferences = { 2026-10-22T19:31:22.9887295Z 474 │ ...nextModelPreferences, 2026-10-22T19:31:22.9887413Z ·  ───────────┬─────────── 2026-10-22T19:31:22.9887552Z · ╰── From this spread 2026-10-22T19:31:22.9887679Z 475 │ [change.provider]: { ...preferences, hiddenModels }, 2026-10-22T19:31:22.9887738Z ╰──── 2026-10-22T19:31:22.9887907Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-22T19:31:22.9888071Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-22T19:31:22.9888074Z 2026-10-22T19:31:22.9888299Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-22T19:31:22.9888452Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:229:6] 2026-10-22T19:31:22.9888631Z 225 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-22T19:31:22.9888730Z 226 │ nativeEventSnapshotsRef.current, 2026-10-22T19:31:22.9888830Z ·  ───────────┬─────────── 2026-10-22T19:31:22.9889331Z · ╰── 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-22T19:31:22.9889415Z 227 │ mostRecentEventCount, 2026-10-22T19:31:22.9889480Z 228 │ ); 2026-10-22T19:31:22.9889611Z 229 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-22T19:31:22.9889764Z ·  ──────────────────────────┬────────────────────────── 2026-10-22T19:31:22.9889988Z · ╰── This dependency list is missing values used by the callback 2026-10-22T19:31:22.9890085Z 230 │ const assumedValue = props.value; 2026-10-22T19:31:22.9890139Z ╰──── 2026-10-22T19:31:22.9890328Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-22T19:31:22.9890667Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9890669Z 2026-10-22T19:31:22.9890900Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-22T19:31:22.9891043Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:237:7] 2026-10-22T19:31:22.9891194Z 236 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-22T19:31:22.9891344Z 237 │ nativeEventSnapshotsRef.current, 2026-10-22T19:31:22.9891480Z ·  ───────────┬─────────── 2026-10-22T19:31:22.9891969Z · ╰── 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-22T19:31:22.9892047Z 238 │ controlledEventCount, 2026-10-22T19:31:22.9892117Z 239 │ assumedValue, 2026-10-22T19:31:22.9892180Z 240 │ ); 2026-10-22T19:31:22.9892348Z 241 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-22T19:31:22.9892496Z ·  ───────────┬────────── 2026-10-22T19:31:22.9892731Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-22T19:31:22.9892835Z 242 │ const acceptNativeEvent = useCallback( 2026-10-22T19:31:22.9892892Z ╰──── 2026-10-22T19:31:22.9893341Z  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-22T19:31:22.9893678Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9893681Z 2026-10-22T19:31:22.9893838Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9893988Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:162:29] 2026-10-22T19:31:22.9894126Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-22T19:31:22.9894247Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-22T19:31:22.9894377Z ·  ─────────────┬──────────── 2026-10-22T19:31:22.9894620Z · ╰── Cannot access ref value during render 2026-10-22T19:31:22.9894701Z 163 │ }); 2026-10-22T19:31:22.9894755Z ╰──── 2026-10-22T19:31:22.9895261Z  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-22T19:31:22.9895582Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9895588Z 2026-10-22T19:31:22.9895743Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9895899Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:162:29] 2026-10-22T19:31:22.9896028Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-22T19:31:22.9896152Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-22T19:31:22.9896278Z ·  ─────────────┬──────────── 2026-10-22T19:31:22.9896503Z · ╰── Passing a ref to a function may read its value during render 2026-10-22T19:31:22.9896563Z 163 │ }); 2026-10-22T19:31:22.9896622Z ╰──── 2026-10-22T19:31:22.9897177Z  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-22T19:31:22.9897527Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9897529Z 2026-10-22T19:31:22.9897680Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9897829Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:23] 2026-10-22T19:31:22.9897895Z 163 │ }); 2026-10-22T19:31:22.9897993Z 164 │ confirmedTokensRef.current = tokens; 2026-10-22T19:31:22.9898126Z ·  ─────────┬────────────┬─── 2026-10-22T19:31:22.9898341Z · │ ╰── Cannot update ref value during render 2026-10-22T19:31:22.9898471Z · ╰── This value is a ref 2026-10-22T19:31:22.9898551Z 165 │ return JSON.stringify( 2026-10-22T19:31:22.9898608Z ╰──── 2026-10-22T19:31:22.9899101Z  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-22T19:31:22.9899410Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9899412Z 2026-10-22T19:31:22.9899570Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9899720Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:206:5] 2026-10-22T19:31:22.9899799Z 205 │ mostRecentEventCount, 2026-10-22T19:31:22.9899895Z 206 │ nativeEventSnapshotsRef.current, 2026-10-22T19:31:22.9900013Z ·  ───────────────┬─────────────── 2026-10-22T19:31:22.9900218Z · ╰── Passing a ref to a function may read its value during render 2026-10-22T19:31:22.9900279Z 207 │ ); 2026-10-22T19:31:22.9900338Z ╰──── 2026-10-22T19:31:22.9900841Z  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-22T19:31:22.9901155Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9901161Z 2026-10-22T19:31:22.9901318Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9901462Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:212:5] 2026-10-22T19:31:22.9901541Z 211 │ mostRecentEventCount, 2026-10-22T19:31:22.9901636Z 212 │ nativeEventSnapshotsRef.current, 2026-10-22T19:31:22.9901749Z ·  ───────────────┬─────────────── 2026-10-22T19:31:22.9901949Z · ╰── Passing a ref to a function may read its value during render 2026-10-22T19:31:22.9902011Z 213 │ ); 2026-10-22T19:31:22.9902069Z ╰──── 2026-10-22T19:31:22.9902623Z  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-22T19:31:22.9902959Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9902965Z 2026-10-22T19:31:22.9903166Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-22T19:31:22.9903312Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:197:6] 2026-10-22T19:31:22.9903444Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-22T19:31:22.9903572Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-22T19:31:22.9903691Z ·  ─────────┬──────── 2026-10-22T19:31:22.9904196Z · ╰── 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-22T19:31:22.9904261Z 163 │ }); 2026-10-22T19:31:22.9904360Z 164 │ confirmedTokensRef.current = tokens; 2026-10-22T19:31:22.9904434Z 165 │ return JSON.stringify( 2026-10-22T19:31:22.9904742Z 166 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-22T19:31:22.9904822Z 167 │ const record = 2026-10-22T19:31:22.9904915Z 168 │ token.type === "context" 2026-10-22T19:31:22.9905088Z 169 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-22T19:31:22.9905164Z 170 │ : undefined; 2026-10-22T19:31:22.9905293Z 171 │ const presentation = contextChipPresentation( 2026-10-22T19:31:22.9905415Z 172 │ token.type === "context" ? token.kind : token.type, 2026-10-22T19:31:22.9905486Z 173 │ record, 2026-10-22T19:31:22.9905554Z 174 │ ); 2026-10-22T19:31:22.9905650Z 175 │ const icon = contextChipIcon( 2026-10-22T19:31:22.9905729Z 176 │ presentation, 2026-10-22T19:31:22.9905879Z 177 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-22T19:31:22.9905951Z 178 │ ); 2026-10-22T19:31:22.9906030Z 179 │ return { 2026-10-22T19:31:22.9906111Z 180 │ type: token.type, 2026-10-22T19:31:22.9906190Z 181 │ source: token.source, 2026-10-22T19:31:22.9906271Z 182 │ start: token.start, 2026-10-22T19:31:22.9906351Z 183 │ end: token.end, 2026-10-22T19:31:22.9906443Z 184 │ accent: presentation.accent, 2026-10-22T19:31:22.9906518Z 185 │ label: 2026-10-22T19:31:22.9906605Z 186 │ token.type === "skill" 2026-10-22T19:31:22.9906721Z 187 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-22T19:31:22.9906810Z 188 │ : token.type === "context" 2026-10-22T19:31:22.9907066Z 189 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-22T19:31:22.9907160Z 190 │ : basename(token.value), 2026-10-22T19:31:22.9907315Z 191 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-22T19:31:22.9907418Z 192 │ iconUri: contextChipIconUri(icon), 2026-10-22T19:31:22.9907511Z 193 │ tintsIcon: icon.kind === "chip", 2026-10-22T19:31:22.9907576Z 194 │ }; 2026-10-22T19:31:22.9907642Z 195 │ }), 2026-10-22T19:31:22.9907758Z 196 │ ); 2026-10-22T19:31:22.9907907Z 197 │ }, [props.value, props.context, skillLabels]); 2026-10-22T19:31:22.9908039Z ·  ────────────────────┬──────────────────── 2026-10-22T19:31:22.9908261Z · ╰── This dependency list is missing values used by the callback 2026-10-22T19:31:22.9908414Z 198 │ // Every render resolves against the snapshot history, so a render whose 2026-10-22T19:31:22.9908470Z ╰──── 2026-10-22T19:31:22.9908694Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-22T19:31:22.9909029Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9909032Z 2026-10-22T19:31:22.9909240Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-22T19:31:22.9909388Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:259:5] 2026-10-22T19:31:22.9909595Z 251 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-22T19:31:22.9909706Z 252 │ nativeEventSnapshotsRef.current.push({ 2026-10-22T19:31:22.9909807Z ·  ───────────┬─────────── 2026-10-22T19:31:22.9910298Z · ╰── 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-22T19:31:22.9910401Z 253 │ eventCount: acknowledgedEventCount, 2026-10-22T19:31:22.9910471Z 254 │ value, 2026-10-22T19:31:22.9910565Z 255 │ selection: nextSelection, 2026-10-22T19:31:22.9910633Z 256 │ }); 2026-10-22T19:31:22.9910735Z 257 │ return acknowledgedEventCount; 2026-10-22T19:31:22.9910797Z 258 │ }, 2026-10-22T19:31:22.9910863Z 259 │ [], 2026-10-22T19:31:22.9910936Z ·  ─┬ 2026-10-22T19:31:22.9911136Z · ╰── This dependency list is missing values used by the callback 2026-10-22T19:31:22.9911202Z 260 │ ); 2026-10-22T19:31:22.9911262Z ╰──── 2026-10-22T19:31:22.9911480Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-22T19:31:22.9911827Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9911830Z 2026-10-22T19:31:22.9912144Z ⚠ eslint(no-unused-vars): Identifier 'Image' is imported but never used. 2026-10-22T19:31:22.9912343Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:17:10] 2026-10-22T19:31:22.9912498Z 16 │ import type { NativeSyntheticEvent, ViewProps } from "react-native"; 2026-10-22T19:31:22.9912622Z 17 │ import { Image, Platform, StyleSheet } from "react-native"; 2026-10-22T19:31:22.9912703Z ·  ──┬── 2026-10-22T19:31:22.9912846Z · ╰── 'Image' is imported here 2026-10-22T19:31:22.9912908Z 18 │ 2026-10-22T19:31:22.9912962Z ╰──── 2026-10-22T19:31:22.9913071Z  help: Consider removing this import. 2026-10-22T19:31:22.9913074Z 2026-10-22T19:31:22.9913291Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-22T19:31:22.9913452Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:227:6] 2026-10-22T19:31:22.9913627Z 223 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-22T19:31:22.9913728Z 224 │ nativeEventSnapshotsRef.current, 2026-10-22T19:31:22.9913827Z ·  ───────────┬─────────── 2026-10-22T19:31:22.9914317Z · ╰── 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-22T19:31:22.9914399Z 225 │ mostRecentEventCount, 2026-10-22T19:31:22.9914461Z 226 │ ); 2026-10-22T19:31:22.9914648Z 227 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-22T19:31:22.9914796Z ·  ──────────────────────────┬────────────────────────── 2026-10-22T19:31:22.9915015Z · ╰── This dependency list is missing values used by the callback 2026-10-22T19:31:22.9915113Z 228 │ const assumedValue = props.value; 2026-10-22T19:31:22.9915170Z ╰──── 2026-10-22T19:31:22.9915354Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-22T19:31:22.9915684Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9915691Z 2026-10-22T19:31:22.9915919Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-22T19:31:22.9916070Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:235:7] 2026-10-22T19:31:22.9916232Z 234 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-22T19:31:22.9916333Z 235 │ nativeEventSnapshotsRef.current, 2026-10-22T19:31:22.9916430Z ·  ───────────┬─────────── 2026-10-22T19:31:22.9916918Z · ╰── 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-22T19:31:22.9916998Z 236 │ controlledEventCount, 2026-10-22T19:31:22.9917072Z 237 │ assumedValue, 2026-10-22T19:31:22.9917130Z 238 │ ); 2026-10-22T19:31:22.9917307Z 239 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-22T19:31:22.9917457Z ·  ───────────┬────────── 2026-10-22T19:31:22.9917754Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-22T19:31:22.9917890Z 240 │ const acceptNativeEvent = useCallback( 2026-10-22T19:31:22.9917954Z ╰──── 2026-10-22T19:31:22.9918406Z  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-22T19:31:22.9918741Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9918743Z 2026-10-22T19:31:22.9918901Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9919091Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:160:29] 2026-10-22T19:31:22.9919226Z 159 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-22T19:31:22.9919348Z 160 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-22T19:31:22.9919476Z ·  ─────────────┬──────────── 2026-10-22T19:31:22.9919653Z · ╰── Cannot access ref value during render 2026-10-22T19:31:22.9919716Z 161 │ }); 2026-10-22T19:31:22.9919775Z ╰──── 2026-10-22T19:31:22.9920274Z  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-22T19:31:22.9920587Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9920597Z 2026-10-22T19:31:22.9920750Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9920910Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:160:29] 2026-10-22T19:31:22.9921043Z 159 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-22T19:31:22.9921168Z 160 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-22T19:31:22.9921290Z ·  ─────────────┬──────────── 2026-10-22T19:31:22.9921517Z · ╰── Passing a ref to a function may read its value during render 2026-10-22T19:31:22.9921580Z 161 │ }); 2026-10-22T19:31:22.9921639Z ╰──── 2026-10-22T19:31:22.9922401Z  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-22T19:31:22.9922722Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9922724Z 2026-10-22T19:31:22.9922935Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9923091Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:23] 2026-10-22T19:31:22.9923153Z 161 │ }); 2026-10-22T19:31:22.9923249Z 162 │ confirmedTokensRef.current = tokens; 2026-10-22T19:31:22.9923391Z ·  ─────────┬────────────┬─── 2026-10-22T19:31:22.9923714Z · │ ╰── Cannot update ref value during render 2026-10-22T19:31:22.9923888Z · ╰── This value is a ref 2026-10-22T19:31:22.9923965Z 163 │ return JSON.stringify( 2026-10-22T19:31:22.9924026Z ╰──── 2026-10-22T19:31:22.9924552Z  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-22T19:31:22.9924919Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9924922Z 2026-10-22T19:31:22.9925080Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9925238Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:204:5] 2026-10-22T19:31:22.9925320Z 203 │ mostRecentEventCount, 2026-10-22T19:31:22.9925417Z 204 │ nativeEventSnapshotsRef.current, 2026-10-22T19:31:22.9925529Z ·  ───────────────┬─────────────── 2026-10-22T19:31:22.9925734Z · ╰── Passing a ref to a function may read its value during render 2026-10-22T19:31:22.9925808Z 205 │ ); 2026-10-22T19:31:22.9925870Z ╰──── 2026-10-22T19:31:22.9926368Z  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-22T19:31:22.9926678Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9926684Z 2026-10-22T19:31:22.9926840Z ⚠ react(refs): Cannot access refs during render 2026-10-22T19:31:22.9926999Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:210:5] 2026-10-22T19:31:22.9927077Z 209 │ mostRecentEventCount, 2026-10-22T19:31:22.9927171Z 210 │ nativeEventSnapshotsRef.current, 2026-10-22T19:31:22.9927291Z ·  ───────────────┬─────────────── 2026-10-22T19:31:22.9927495Z · ╰── Passing a ref to a function may read its value during render 2026-10-22T19:31:22.9927561Z 211 │ ); 2026-10-22T19:31:22.9927616Z ╰──── 2026-10-22T19:31:22.9928122Z  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-22T19:31:22.9928440Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T19:31:22.9928442Z 2026-10-22T19:31:22.9928648Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-22T19:31:22.9928800Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:195:6] 2026-10-22T19:31:22.9928928Z 159 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-22T19:31:22.9929054Z 160 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-22T19:31:22.9929175Z ·  ─────────┬──────── 2026-10-22T19:31:22.9929740Z · ╰── 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-22T19:31:22.9929838Z 161 │ }); 2026-10-22T19:31:22.9929943Z 162 │ confirmedTokensRef.current = tokens; 2026-10-22T19:31:22.9930027Z 163 │ return JSON.stringify( 2026-10-22T19:31:22.9930205Z 164 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-22T19:31:22.9930277Z 165 │ const record = 2026-10-22T19:31:22.9930367Z 166 │ token.type === "context" 2026-10-22T19:31:22.9930546Z 167 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-22T19:31:22.9930620Z 168 │ : undefined; 2026-10-22T19:31:22.9930741Z 169 │ const presentation = contextChipPresentation( 2026-10-22T19:31:22.9930862Z 170 │ token.type === "context" ? token.kind : token.type, 2026-10-22T19:31:22.9930933Z 171 │ record, 2026-10-22T19:31:22.9930999Z 172 │ ); 2026-10-22T19:31:22.9931089Z 173 │ const icon = contextChipIcon( 2026-10-22T19:31:22.9931165Z 174 │ presentation, 2026-10-22T19:31:22.9931317Z 175 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-22T19:31:22.9931383Z 176 │ ); 2026-10-22T19:31:22.9931448Z 177 │ return { 2026-10-22T19:31:22.9931530Z 178 │ type: token.type, 2026-10-22T19:31:22.9931613Z 179 │ source: token.source, 2026-10-22T19:31:22.9931695Z 180 │ start: token.start, 2026-10-22T19:31:22.9931768Z 181 │ end: token.end, 2026-10-22T19:31:22.9931867Z 182 │ accent: presentation.accent, 2026-10-22T19:31:22.9931942Z 183 │ label: 2026-10-22T19:31:22.9932032Z 184 │ token.type === "skill" 2026-10-22T19:31:22.9932148Z 185 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-22T19:31:22.9932244Z 186 │ : token.type === "context" 2026-10-22T19:31:22.9932497Z 187 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-22T19:31:22.9932591Z 188 │ : basename(token.value), 2026-10-22T19:31:22.9932741Z 189 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-22T19:31:22.9932846Z 190 │ iconUri: contextChipIconUri(icon), 2026-10-22T19:31:22.9932941Z 191 │ tintsIcon: icon.kind === "chip", 2026-10-22T19:31:22.9933005Z 192 │ }; 2026-10-22T19:31:22.9933127Z 193 │ }), 2026-10-22T19:31:22.9933232Z 194 │ ); 2026-10-22T19:31:22.9933343Z 195 │ }, [props.value, props.context, skillLabels]); 2026-10-22T19:31:22.9933476Z ·  ────────────────────┬──────────────────── 2026-10-22T19:31:22.9933688Z · ╰── This dependency list is missing values used by the callback 2026-10-22T19:31:22.9933840Z 196 │ // Every render resolves against the snapshot history, so a render whose 2026-10-22T19:31:22.9933904Z ╰──── 2026-10-22T19:31:22.9934130Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-22T19:31:22.9934463Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9934466Z 2026-10-22T19:31:22.9934734Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-22T19:31:22.9934892Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:257:5] 2026-10-22T19:31:22.9935034Z 249 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-22T19:31:22.9935144Z 250 │ nativeEventSnapshotsRef.current.push({ 2026-10-22T19:31:22.9935248Z ·  ───────────┬─────────── 2026-10-22T19:31:22.9935747Z · ╰── 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-22T19:31:22.9935853Z 251 │ eventCount: acknowledgedEventCount, 2026-10-22T19:31:22.9935925Z 252 │ value, 2026-10-22T19:31:22.9936016Z 253 │ selection: nextSelection, 2026-10-22T19:31:22.9936085Z 254 │ }); 2026-10-22T19:31:22.9936180Z 255 │ return acknowledgedEventCount; 2026-10-22T19:31:22.9936238Z 256 │ }, 2026-10-22T19:31:22.9936306Z 257 │ [], 2026-10-22T19:31:22.9936381Z ·  ─┬ 2026-10-22T19:31:22.9936580Z · ╰── This dependency list is missing values used by the callback 2026-10-22T19:31:22.9936637Z 258 │ ); 2026-10-22T19:31:22.9936696Z ╰──── 2026-10-22T19:31:22.9936920Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-22T19:31:22.9937255Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9937258Z 2026-10-22T19:31:22.9937438Z ⚠ react(immutability): This value cannot be modified 2026-10-22T19:31:22.9937609Z ╭─[apps/mobile/src/features/connection/ConnectionStatusDot.tsx:58:7] 2026-10-22T19:31:22.9937719Z 53 │ function usePulseAnimation(pulse: boolean) { 2026-10-22T19:31:22.9937825Z 54 │ const pulseProgress = useSharedValue(0); 2026-10-22T19:31:22.9937919Z ·  ──────┬────── 2026-10-22T19:31:22.9938070Z · ╰── `pulseProgress` originates here 2026-10-22T19:31:22.9938133Z 55 │ 2026-10-22T19:31:22.9938206Z 56 │ useEffect(() => { 2026-10-22T19:31:22.9938277Z 57 │ if (pulse) { 2026-10-22T19:31:22.9938376Z 58 │ pulseProgress.value = withRepeat( 2026-10-22T19:31:22.9938468Z ·  ──────┬────── 2026-10-22T19:31:22.9938699Z · ╰── `pulseProgress` cannot be modified 2026-10-22T19:31:22.9938819Z 59 │ withTiming(1, { 2026-10-22T19:31:22.9938893Z ╰──── 2026-10-22T19:31:22.9939184Z  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-22T19:31:22.9939512Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T19:31:22.9939515Z 2026-10-22T19:31:22.9939795Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T19:31:22.9939978Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:79:5] 2026-10-22T19:31:22.9940041Z 76 │ 2026-10-22T19:31:22.9940115Z 77 │ useEffect(() => { 2026-10-22T19:31:22.9940208Z ·  ────┬──── 2026-10-22T19:31:22.9940351Z · ╰── This is the containing effect 2026-10-22T19:31:22.9940502Z 78 │ const { host, code } = parsePairingUrl(connectionPairingUrl); 2026-10-22T19:31:22.9940578Z 79 │ setHostInput(host); 2026-10-22T19:31:22.9940672Z ·  ──────┬───── 2026-10-22T19:31:22.9940853Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:22.9940933Z 80 │ setCodeInput(code); 2026-10-22T19:31:22.9944905Z ╰──── 2026-10-22T19:31:22.9945604Z  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-22T19:31:22.9945963Z  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-22T19:31:22.9945969Z 2026-10-22T19:31:22.9946255Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T19:31:22.9946446Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:89:5] 2026-10-22T19:31:22.9946508Z 82 │ 2026-10-22T19:31:22.9946580Z 83 │ useEffect(() => { 2026-10-22T19:31:22.9946657Z ·  ────┬──── 2026-10-22T19:31:22.9946799Z · ╰── This is the containing effect 2026-10-22T19:31:22.9946898Z 84 │ if (routePairingUrl.length === 0) { 2026-10-22T19:31:22.9946971Z 85 │ return; 2026-10-22T19:31:22.9947032Z 86 │ } 2026-10-22T19:31:22.9947092Z 87 │ 2026-10-22T19:31:22.9947222Z 88 │ const { host, code } = parsePairingUrl(routePairingUrl); 2026-10-22T19:31:22.9947296Z 89 │ setHostInput(host); 2026-10-22T19:31:22.9947384Z ·  ──────┬───── 2026-10-22T19:31:22.9947573Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:22.9947647Z 90 │ setCodeInput(code); 2026-10-22T19:31:22.9947702Z ╰──── 2026-10-22T19:31:22.9948348Z  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-22T19:31:22.9948794Z  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-22T19:31:22.9948836Z 2026-10-22T19:31:22.9949116Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T19:31:22.9949299Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:95:7] 2026-10-22T19:31:22.9949353Z 92 │ 2026-10-22T19:31:22.9949519Z 93 │ useEffect(() => { 2026-10-22T19:31:22.9949604Z ·  ────┬──── 2026-10-22T19:31:22.9949746Z · ╰── This is the containing effect 2026-10-22T19:31:22.9949835Z 94 │ if (pairingConnectionError) { 2026-10-22T19:31:22.9949924Z 95 │ setIsSubmitting(false); 2026-10-22T19:31:22.9950024Z ·  ───────┬─────── 2026-10-22T19:31:22.9950213Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:22.9950272Z 96 │ } 2026-10-22T19:31:22.9950337Z ╰──── 2026-10-22T19:31:22.9950981Z  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-22T19:31:22.9951328Z  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-22T19:31:22.9951331Z 2026-10-22T19:31:22.9951595Z ⚠ eslint(no-unneeded-ternary): Unnecessary use of boolean literals in conditional expression 2026-10-22T19:31:22.9951733Z ╭─[packages/shared/src/serverSettings.test.ts:35:7] 2026-10-22T19:31:22.9951931Z 34 │ const fallback = fallbackTextGenerationModelSelection(providerInstances, (instanceId) => 2026-10-22T19:31:22.9952041Z 35 │ instanceId === configured ? true : false, 2026-10-22T19:31:22.9952170Z ·  ──────────────────────────────────────── 2026-10-22T19:31:22.9952229Z 36 │ ); 2026-10-22T19:31:22.9952289Z ╰──── 2026-10-22T19:31:22.9952402Z  help: Remove this ternary operator 2026-10-22T19:31:22.9952404Z 2026-10-22T19:31:22.9952639Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-22T19:31:22.9952753Z ╭─[apps/mobile/src/Stack.tsx:1044:21] 2026-10-22T19:31:22.9952838Z 1043 │ } 2026-10-22T19:31:22.9953138Z ·  ───────────────────────────────────────────── 2026-10-22T19:31:22.9953212Z 1045 │ screenListeners={{ 2026-10-22T19:31:22.9953272Z ╰──── 2026-10-22T19:31:22.9953665Z  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-22T19:31:22.9953668Z 2026-10-22T19:31:22.9953909Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-22T19:31:22.9954060Z ╭─[apps/mobile/src/state/use-composer-drafts.ts:1022:15] 2026-10-22T19:31:22.9954130Z 1021 │ instanceId, 2026-10-22T19:31:22.9954426Z 1022 │ { ...(persisted.modelOptionMemory[instanceId] ?? {}), ...models }, 2026-10-22T19:31:22.9954976Z ·  ────────────────────────────────────────────────── 2026-10-22T19:31:22.9955052Z 1023 │ ]), 2026-10-22T19:31:22.9955107Z ╰──── 2026-10-22T19:31:22.9955398Z  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-22T19:31:22.9955400Z 2026-10-22T19:31:22.9955807Z ⚠ 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-22T19:31:22.9955942Z ╭─[packages/shared/src/otelEnvironment.ts:143:14] 2026-10-22T19:31:22.9956003Z 142 │ name, 2026-10-22T19:31:22.9956164Z 143 │ (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()), 2026-10-22T19:31:22.9956288Z ·  ────────────────────────── 2026-10-22T19:31:22.9956422Z 144 │ `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`, 2026-10-22T19:31:22.9956477Z ╰──── 2026-10-22T19:31:22.9956480Z 2026-10-22T19:31:22.9956763Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T19:31:22.9956929Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:400:5] 2026-10-22T19:31:22.9956989Z 398 │ 2026-10-22T19:31:22.9957063Z 399 │ useEffect(() => { 2026-10-22T19:31:22.9957144Z ·  ────┬──── 2026-10-22T19:31:22.9957287Z · ╰── This is the containing effect 2026-10-22T19:31:22.9957394Z 400 │ setInspectorSelection((current) => { 2026-10-22T19:31:22.9957496Z ·  ──────────┬────────── 2026-10-22T19:31:22.9957693Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:22.9957811Z 401 │ if (props.renderInspector === undefined) { 2026-10-22T19:31:22.9957883Z ╰──── 2026-10-22T19:31:22.9958519Z  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-22T19:31:22.9958867Z  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-22T19:31:22.9958870Z 2026-10-22T19:31:22.9959168Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-22T19:31:22.9959389Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:528:24] 2026-10-22T19:31:22.9959563Z 527 │ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top; 2026-10-22T19:31:22.9959751Z 528 │ ╭─▶ const GitInspector = () => ( 2026-10-22T19:31:22.9959857Z 529 │ │ 2026-10-22T19:31:22.9960909Z 534 │ ╰─▶ ); 2026-10-22T19:31:22.9961076Z 535 │ const FilesInspector = () => 2026-10-22T19:31:22.9961187Z ╰──── 2026-10-22T19:31:22.9961595Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-22T19:31:22.9961599Z 2026-10-22T19:31:22.9961989Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-22T19:31:22.9962266Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:535:26] 2026-10-22T19:31:22.9962376Z 534 │ ); 2026-10-22T19:31:22.9962677Z 535 │ ╭─▶ const FilesInspector = () => 2026-10-22T19:31:22.9962976Z 536 │ │ selectedThread !== null && selectedThreadCwd !== null ? ( 2026-10-22T19:31:22.9963187Z 537 │ │ 2026-10-22T19:31:22.9964736Z 545 │ ╰─▶ ) : null; 2026-10-22T19:31:22.9964988Z 546 │ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset); 2026-10-22T19:31:22.9965068Z ╰──── 2026-10-22T19:31:22.9965434Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-22T19:31:22.9965438Z 2026-10-22T19:31:22.9965767Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-22T19:31:22.9965954Z ╭─[apps/mobile/src/features/threads/ThreadQueueControl.tsx:602:27] 2026-10-22T19:31:22.9966157Z 601 │ const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success)); 2026-10-22T19:31:22.9966248Z 602 │ const gesture = Gesture.Pan() 2026-10-22T19:31:22.9966375Z ·  ─┬─ 2026-10-22T19:31:22.9966687Z · ╰── `Pan` may be a component 2026-10-22T19:31:22.9966956Z 603 │ .enabled(!props.disabled) 2026-10-22T19:31:22.9967057Z ╰──── 2026-10-22T19:31:22.9967602Z  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-22T19:31:22.9968460Z  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-22T19:31:22.9968469Z 2026-10-22T19:31:22.9968877Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-22T19:31:22.9969141Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:771:7] 2026-10-22T19:31:22.9969342Z 770 │ if (settingsSheetPresentation.isActive) { 2026-10-22T19:31:22.9969602Z 771 │ settingsRoutePresentation.present(settingsRouteSession); 2026-10-22T19:31:22.9969782Z ·  ────────────┬──────────── 2026-10-22T19:31:22.9970103Z · ╰── Missing dependency `settingsRoutePresentation` 2026-10-22T19:31:22.9970201Z 772 │ } 2026-10-22T19:31:22.9970580Z 773 │ }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]); 2026-10-22T19:31:22.9970778Z ·  ────────────────┬──────────────── 2026-10-22T19:31:22.9971291Z · ╰── Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead 2026-10-22T19:31:22.9971395Z 774 │ 2026-10-22T19:31:22.9971497Z ╰──── 2026-10-22T19:31:22.9972069Z  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-22T19:31:22.9972441Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9972444Z 2026-10-22T19:31:22.9972634Z ⚠ react(immutability): This value cannot be modified 2026-10-22T19:31:22.9972828Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:389:5] 2026-10-22T19:31:22.9973033Z 385 │ typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0; 2026-10-22T19:31:22.9973212Z 386 │ const animatedBorderRadius = useSharedValue(targetBorderRadius); 2026-10-22T19:31:22.9973336Z ·  ──────────┬───────── 2026-10-22T19:31:22.9973527Z · ╰── `animatedBorderRadius` originates here 2026-10-22T19:31:22.9973720Z 387 │ const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android"; 2026-10-22T19:31:22.9973820Z 388 │ useLayoutEffect(() => { 2026-10-22T19:31:22.9973945Z 389 │ animatedBorderRadius.value = shouldAnimate 2026-10-22T19:31:22.9974047Z ·  ──────────┬───────── 2026-10-22T19:31:22.9974240Z · ╰── `animatedBorderRadius` cannot be modified 2026-10-22T19:31:22.9974357Z 390 │ ? withTiming(targetBorderRadius, { 2026-10-22T19:31:22.9974436Z ╰──── 2026-10-22T19:31:22.9974797Z  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-22T19:31:22.9975566Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T19:31:22.9975693Z 2026-10-22T19:31:22.9976435Z ⚠ 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-22T19:31:22.9976769Z ╭─[apps/server/src/provider/acp/AntigravityProtocol.ts:263:20] 2026-10-22T19:31:22.9977002Z 262 │ ...(update._meta !== undefined 2026-10-22T19:31:22.9977233Z 263 │ ? { _meta: Schema.is(Schema.Record(Schema.String, Schema.Json))(meta) ? meta : null } 2026-10-22T19:31:22.9977393Z ·  ───────── 2026-10-22T19:31:22.9977524Z 264 │ : {}), 2026-10-22T19:31:22.9977608Z ╰──── 2026-10-22T19:31:22.9977644Z 2026-10-22T19:31:22.9978035Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T19:31:22.9978278Z ╭─[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5] 2026-10-22T19:31:22.9978385Z 150 │ 2026-10-22T19:31:22.9978514Z 151 │ useEffect(() => { 2026-10-22T19:31:22.9978622Z ·  ────┬──── 2026-10-22T19:31:22.9978873Z · ╰── This is the containing effect 2026-10-22T19:31:22.9979037Z 152 │ if (!controlledSelectedPath) { 2026-10-22T19:31:22.9979227Z 153 │ return; 2026-10-22T19:31:22.9979367Z 154 │ } 2026-10-22T19:31:22.9979531Z 155 │ setExpandedPaths((current) => { 2026-10-22T19:31:22.9979687Z ·  ────────┬─────── 2026-10-22T19:31:22.9979891Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:22.9980088Z 156 │ const ancestors = ancestorPaths(controlledSelectedPath); 2026-10-22T19:31:22.9980193Z ╰──── 2026-10-22T19:31:22.9980975Z  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-22T19:31:22.9981446Z  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-22T19:31:22.9981452Z 2026-10-22T19:31:22.9981687Z ⚠ typescript(no-extraneous-class): Unexpected class with only a constructor. 2026-10-22T19:31:22.9981920Z ╭─[apps/desktop/src/preview/Manager.test.ts:158:18] 2026-10-22T19:31:22.9982103Z 157 │ BrowserWindow: browserWindowConstructor, 2026-10-22T19:31:22.9982360Z 158 │ ╭─▶ ClipboardItem: class { 2026-10-22T19:31:22.9982508Z 159 │ │ constructor(data: Record) { 2026-10-22T19:31:22.9982637Z 160 │ │ clipboardItemConstructor(data); 2026-10-22T19:31:22.9982723Z 161 │ │ } 2026-10-22T19:31:22.9982948Z 162 │ ╰─▶ }, 2026-10-22T19:31:22.9983065Z 163 │ clipboard: { 2026-10-22T19:31:22.9983136Z ╰──── 2026-10-22T19:31:22.9983573Z  help: Try replacing this class with a standalone function or deleting it entirely 2026-10-22T19:31:22.9983678Z 2026-10-22T19:31:22.9984016Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-22T19:31:22.9984279Z ╭─[apps/server/src/provider/Drivers/CodexDriver.test.ts:418:14] 2026-10-22T19:31:22.9984375Z 417 │ 2026-10-22T19:31:22.9984620Z 418 │ for (const {} of ["direct", "wrapper"] as const) { 2026-10-22T19:31:22.9984768Z ·  ── 2026-10-22T19:31:22.9984875Z 419 │ } 2026-10-22T19:31:22.9984985Z ╰──── 2026-10-22T19:31:22.9985442Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-22T19:31:22.9985445Z 2026-10-22T19:31:22.9985710Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T19:31:22.9985887Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7] 2026-10-22T19:31:22.9986000Z 256 │ return () => cancelAnimationFrame(frame); 2026-10-22T19:31:22.9986093Z 257 │ }, [props.path, targetIndex]); 2026-10-22T19:31:22.9986178Z ·  ─────┬──── 2026-10-22T19:31:22.9986342Z · ╰── Unnecessary dependency `props.path` 2026-10-22T19:31:22.9986399Z 258 │ 2026-10-22T19:31:22.9986458Z ╰──── 2026-10-22T19:31:22.9986784Z  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-22T19:31:22.9987130Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9987134Z 2026-10-22T19:31:22.9987349Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-22T19:31:22.9987518Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23] 2026-10-22T19:31:22.9987606Z 292 │ 2026-10-22T19:31:22.9988866Z ·  ─────────── 2026-10-22T19:31:22.9988943Z 310 │ {body} 2026-10-22T19:31:22.9989010Z ╰──── 2026-10-22T19:31:22.9989177Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-22T19:31:22.9989180Z 2026-10-22T19:31:22.9989939Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T19:31:22.9990113Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:215:7] 2026-10-22T19:31:22.9990179Z 214 │ } 2026-10-22T19:31:22.9990275Z 215 │ }, [wrappedRender]); 2026-10-22T19:31:22.9990611Z ·  ──────┬────── 2026-10-22T19:31:22.9990973Z · ╰── Unnecessary dependency `wrappedRender` 2026-10-22T19:31:22.9991037Z 216 │ 2026-10-22T19:31:22.9991101Z ╰──── 2026-10-22T19:31:22.9991419Z  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-22T19:31:22.9991900Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T19:31:22.9991904Z 2026-10-22T19:31:22.9992173Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-22T19:31:22.9992356Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:817:35] 2026-10-22T19:31:22.9992429Z 816 │ > 2026-10-22T19:31:22.9992554Z 817 │ 2026-10-22T19:31:22.9992687Z ·  ──────────────────── 2026-10-22T19:31:22.9992796Z 818 │ 2026-10-22T19:31:22.9993899Z 832 │ 2026-10-22T19:31:22.9994035Z ·  ──────────────────── 2026-10-22T19:31:22.9994149Z 833 │ 2026-10-22T19:31:22.9994210Z ╰──── 2026-10-22T19:31:22.9994447Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-22T19:31:22.9994662Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-22T19:31:22.9994666Z 2026-10-22T19:31:22.9994862Z ⚠ react(immutability): This value cannot be modified 2026-10-22T19:31:22.9995047Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:42:5] 2026-10-22T19:31:22.9995205Z 35 │ 2026-10-22T19:31:22.9995445Z 36 │ const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0); 2026-10-22T19:31:22.9995545Z ·  ────────┬──────── 2026-10-22T19:31:22.9995713Z · ╰── `inspectorProgress` originates here 2026-10-22T19:31:22.9995816Z 37 │ const { renderedInspectorWidth } = props; 2026-10-22T19:31:22.9995967Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-22T19:31:22.9996034Z 39 │ 2026-10-22T19:31:22.9996151Z 40 │ const onClosed = props.onClosed; 2026-10-22T19:31:22.9996246Z 41 │ useEffect(() => { 2026-10-22T19:31:22.9996349Z 42 │ inspectorProgress.value = withTiming( 2026-10-22T19:31:22.9996445Z ·  ────────┬──────── 2026-10-22T19:31:22.9996610Z · ╰── `inspectorProgress` cannot be modified 2026-10-22T19:31:22.9996700Z 43 │ inspectorVisible ? 1 : 0, 2026-10-22T19:31:22.9996767Z ╰──── 2026-10-22T19:31:22.9997153Z  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-22T19:31:22.9997492Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T19:31:22.9997495Z 2026-10-22T19:31:22.9997660Z ⚠ react(immutability): This value cannot be modified 2026-10-22T19:31:22.9997834Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:67:7] 2026-10-22T19:31:22.9997939Z 37 │ const { renderedInspectorWidth } = props; 2026-10-22T19:31:22.9998084Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-22T19:31:22.9998188Z ·  ──────────┬───────── 2026-10-22T19:31:22.9998368Z · ╰── `renderedContentWidth` originates here 2026-10-22T19:31:22.9998425Z 39 │ 2026-10-22T19:31:22.9998514Z 40 │ const onClosed = props.onClosed; 2026-10-22T19:31:22.9998582Z 41 │ useEffect(() => { 2026-10-22T19:31:22.9998690Z 42 │ inspectorProgress.value = withTiming( 2026-10-22T19:31:22.9998776Z 43 │ inspectorVisible ? 1 : 0, 2026-10-22T19:31:22.9998860Z 44 │ WORKSPACE_PANE_TIMING, 2026-10-22T19:31:22.9998930Z 45 │ (finished) => { 2026-10-22T19:31:22.9999085Z 46 │ if (finished === true && !inspectorVisible && onClosed !== undefined) { 2026-10-22T19:31:22.9999175Z 47 │ runOnJS(onClosed)(); 2026-10-22T19:31:22.9999250Z 48 │ } 2026-10-22T19:31:22.9999310Z 49 │ }, 2026-10-22T19:31:22.9999380Z 50 │ ); 2026-10-22T19:31:22.9999531Z 51 │ const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0; 2026-10-22T19:31:22.9999619Z 52 │ renderedInspectorWidth.set( 2026-10-22T19:31:22.9999775Z 53 │ resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING), 2026-10-22T19:31:22.9999840Z 54 │ ); 2026-10-22T19:31:22.9999900Z 55 │ }, [ 2026-10-22T19:31:22.9999974Z 56 │ inspectorProgress, 2026-10-22T19:31:23.0000047Z 57 │ inspectorVisible, 2026-10-22T19:31:23.0000120Z 58 │ inspectorWidth, 2026-10-22T19:31:23.0000189Z 59 │ onClosed, 2026-10-22T19:31:23.0000266Z 60 │ renderedInspectorWidth, 2026-10-22T19:31:23.0000365Z 61 │ resizing, 2026-10-22T19:31:23.0000427Z 62 │ ]); 2026-10-22T19:31:23.0000493Z 63 │ 2026-10-22T19:31:23.0000561Z 64 │ useEffect(() => { 2026-10-22T19:31:23.0000740Z 65 │ const targetWidth = inspectorWidth ?? 0; 2026-10-22T19:31:23.0000925Z 66 │ if (!inspectorVisible || resizing) { 2026-10-22T19:31:23.0001037Z 67 │ renderedContentWidth.value = targetWidth; 2026-10-22T19:31:23.0001132Z ·  ──────────┬───────── 2026-10-22T19:31:23.0001313Z · ╰── `renderedContentWidth` cannot be modified 2026-10-22T19:31:23.0001386Z 68 │ return; 2026-10-22T19:31:23.0001447Z ╰──── 2026-10-22T19:31:23.0001820Z  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-22T19:31:23.0002153Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T19:31:23.0002156Z 2026-10-22T19:31:23.0002346Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-22T19:31:23.0002482Z ╭─[apps/server/src/processRunner.test.ts:266:14] 2026-10-22T19:31:23.0002539Z 265 │ 2026-10-22T19:31:23.0002662Z 266 │ for (const {} of ["timeout", "success"] as const) { 2026-10-22T19:31:23.0002748Z ·  ── 2026-10-22T19:31:23.0002813Z 267 │ } 2026-10-22T19:31:23.0002870Z ╰──── 2026-10-22T19:31:23.0003121Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-22T19:31:23.0003124Z 2026-10-22T19:31:23.0003428Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-22T19:31:23.0003561Z ╭─[apps/server/src/usage/UsageService.ts:169:7] 2026-10-22T19:31:23.0003621Z 168 │ 2026-10-22T19:31:23.0003714Z 169 │ const layerTest = Layer.succeed( 2026-10-22T19:31:23.0003800Z ·  ────┬──── 2026-10-22T19:31:23.0003950Z · ╰── 'layerTest' is declared here 2026-10-22T19:31:23.0004019Z 170 │ UsageService, 2026-10-22T19:31:23.0004079Z ╰──── 2026-10-22T19:31:23.0004201Z  help: Consider removing this declaration. 2026-10-22T19:31:23.0004204Z 2026-10-22T19:31:23.0004486Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T19:31:23.0004734Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:118:7] 2026-10-22T19:31:23.0004798Z 113 │ 2026-10-22T19:31:23.0004875Z 114 │ useEffect(() => { 2026-10-22T19:31:23.0004955Z ·  ────┬──── 2026-10-22T19:31:23.0005105Z · ╰── This is the containing effect 2026-10-22T19:31:23.0005204Z 115 │ if (orientationSettled) return; 2026-10-22T19:31:23.0005332Z 116 │ const orientation = getNativeShowcaseOrientation(); 2026-10-22T19:31:23.0005418Z 117 │ if (orientation === null) { 2026-10-22T19:31:23.0005509Z 118 │ setOrientationSettled(true); 2026-10-22T19:31:23.0005613Z ·  ──────────┬────────── 2026-10-22T19:31:23.0005809Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:23.0005882Z 119 │ return; 2026-10-22T19:31:23.0005964Z ╰──── 2026-10-22T19:31:23.0006749Z  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-22T19:31:23.0007235Z  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-22T19:31:23.0007238Z 2026-10-22T19:31:23.0007520Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T19:31:23.0007794Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:317:7] 2026-10-22T19:31:23.0007851Z 305 │ 2026-10-22T19:31:23.0007926Z 306 │ useEffect(() => { 2026-10-22T19:31:23.0008008Z ·  ────┬──── 2026-10-22T19:31:23.0008151Z · ╰── This is the containing effect 2026-10-22T19:31:23.0008218Z 307 │ if ( 2026-10-22T19:31:23.0008296Z 308 │ scene === null || 2026-10-22T19:31:23.0008386Z 309 │ requestedScene === null || 2026-10-22T19:31:23.0008472Z 310 │ scene !== requestedScene || 2026-10-22T19:31:23.0008540Z 311 │ !hasFixture || 2026-10-22T19:31:23.0008624Z 312 │ !orientationSettled || 2026-10-22T19:31:23.0008702Z 313 │ !themeApplied || 2026-10-22T19:31:23.0008837Z 314 │ (scene === "agent-activity" && !agentActivityStaged) || 2026-10-22T19:31:23.0008979Z 315 │ !isShowcaseNativeContentReady({ scene, themeId, renderSignal }) 2026-10-22T19:31:23.0009045Z 316 │ ) { 2026-10-22T19:31:23.0009123Z 317 │ setReadyScene(null); 2026-10-22T19:31:23.0009211Z ·  ──────┬────── 2026-10-22T19:31:23.0009401Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:23.0009472Z 318 │ return; 2026-10-22T19:31:23.0009530Z ╰──── 2026-10-22T19:31:23.0010174Z  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-22T19:31:23.0010517Z  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-22T19:31:23.0010525Z 2026-10-22T19:31:23.0010820Z ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'. 2026-10-22T19:31:23.0011011Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:123:9] 2026-10-22T19:31:23.0011093Z 122 │ let cancelled = false; 2026-10-22T19:31:23.0011192Z 123 │ let lastOutcome: string | null = null; 2026-10-22T19:31:23.0011276Z ·  ─────┬───── 2026-10-22T19:31:23.0011426Z · ╰── 'lastOutcome' is declared here 2026-10-22T19:31:23.0011617Z 124 │ void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), { 2026-10-22T19:31:23.0011675Z ╰──── 2026-10-22T19:31:23.0011788Z  help: Consider removing this declaration. 2026-10-22T19:31:23.0011791Z 2026-10-22T19:31:23.0012091Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-22T19:31:23.0012306Z ╭─[apps/server/src/provider/AntigravityAuth.ts:285:20] 2026-10-22T19:31:23.0012453Z 284 │ }, 2026-10-22T19:31:23.0012552Z 285 │ (effect, flow, stopSessions) => 2026-10-22T19:31:23.0012660Z ·  ──────┬───── 2026-10-22T19:31:23.0012822Z · ╰── 'stopSessions' is declared here 2026-10-22T19:31:23.0012895Z 286 │ effect.pipe( 2026-10-22T19:31:23.0012949Z ╰──── 2026-10-22T19:31:23.0013063Z  help: Consider removing this parameter. 2026-10-22T19:31:23.0013066Z 2026-10-22T19:31:23.0013422Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-22T19:31:23.0013601Z ╭─[apps/server/src/orchestration-v2/ThreadPullRequestService.ts:408:7] 2026-10-22T19:31:23.0013657Z 407 │ 2026-10-22T19:31:23.0013804Z 408 │ const layer = Layer.effect(ThreadPullRequestServiceV2, make); 2026-10-22T19:31:23.0013886Z ·  ──┬── 2026-10-22T19:31:23.0014025Z · ╰── 'layer' is declared here 2026-10-22T19:31:23.0014083Z ╰──── 2026-10-22T19:31:23.0014198Z  help: Consider removing this declaration. 2026-10-22T19:31:23.0014201Z 2026-10-22T19:31:23.0014883Z ⚠ 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-22T19:31:23.0015053Z ╭─[apps/server/src/usage/UsageService.test.ts:2383:7] 2026-10-22T19:31:23.0015166Z 2382 │ let orphanedAt: number | undefined; 2026-10-22T19:31:23.0015429Z 2383 │ ╭─▶ for (let interruptAt = 1; interruptAt <= 31; interruptAt += 1) { 2026-10-22T19:31:23.0015569Z 2384 │ │ const tasks: Array<() => void> = []; 2026-10-22T19:31:23.0015734Z 2385 │ │ const dispatcher: Scheduler.SchedulerDispatcher = { 2026-10-22T19:31:23.0015881Z 2386 │ │ scheduleTask: (task) => tasks.push(task), 2026-10-22T19:31:23.0015987Z 2387 │ │ flush: () => { 2026-10-22T19:31:23.0016175Z 2388 │ │ let task: (() => void) | undefined; 2026-10-22T19:31:23.0016458Z 2389 │ │ while ((task = tasks.shift()) !== undefined) task(); 2026-10-22T19:31:23.0016604Z 2390 │ │ }, 2026-10-22T19:31:23.0016746Z 2391 │ │ }; 2026-10-22T19:31:23.0016882Z 2392 │ │ 2026-10-22T19:31:23.0017179Z 2393 │ │ let requestFiber: Fiber.Fiber | undefined; 2026-10-22T19:31:23.0017374Z 2394 │ │ let requestChecks = 0; 2026-10-22T19:31:23.0017574Z 2395 │ │ const scheduler: Scheduler.Scheduler = { 2026-10-22T19:31:23.0017702Z 2396 │ │ executionMode: "async", 2026-10-22T19:31:23.0017836Z 2397 │ │ makeDispatcher: () => dispatcher, 2026-10-22T19:31:23.0017960Z 2398 │ │ shouldYield: (fiber) => { 2026-10-22T19:31:23.0018183Z 2399 │ │ if (fiber !== requestFiber) return false; 2026-10-22T19:31:23.0018370Z 2400 │ │ requestChecks += 1; 2026-10-22T19:31:23.0018661Z 2401 │ │ if (requestChecks !== interruptAt) return false; 2026-10-22T19:31:23.0018887Z 2402 │ │ fiber.interruptUnsafe(); 2026-10-22T19:31:23.0018993Z 2403 │ │ return true; 2026-10-22T19:31:23.0019130Z 2404 │ │ }, 2026-10-22T19:31:23.0019278Z 2405 │ │ }; 2026-10-22T19:31:23.0019406Z 2406 │ │ 2026-10-22T19:31:23.0019625Z 2407 │ │ const input: UsageSummaryInput = { 2026-10-22T19:31:23.0019798Z 2408 │ │ ...WINDOW, 2026-10-22T19:31:23.0020034Z 2409 │ │ sinceDay: UsageDay.make("2026-09-01"), 2026-10-22T19:31:23.0020400Z 2410 │ │ untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`), 2026-10-22T19:31:23.0020492Z 2411 │ │ }; 2026-10-22T19:31:23.0020625Z 2412 │ │ const first = yield* service 2026-10-22T19:31:23.0020744Z 2413 │ │ .readSummary(input) 2026-10-22T19:31:23.0020844Z 2414 │ │ .pipe( 2026-10-22T19:31:23.0020948Z 2415 │ │ Effect.exit, 2026-10-22T19:31:23.0021122Z 2416 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-22T19:31:23.0021239Z 2417 │ │ Effect.forkChild, 2026-10-22T19:31:23.0021333Z 2418 │ │ ); 2026-10-22T19:31:23.0021441Z 2419 │ │ requestFiber = first; 2026-10-22T19:31:23.0021562Z 2420 │ │ yield* Effect.yieldNow; 2026-10-22T19:31:23.0021686Z 2421 │ │ dispatcher.flush(); 2026-10-22T19:31:23.0021772Z 2422 │ │ 2026-10-22T19:31:23.0021939Z 2423 │ │ const second = yield* service.readSummary(input).pipe( 2026-10-22T19:31:23.0022048Z 2424 │ │ Effect.match({ 2026-10-22T19:31:23.0022183Z 2425 │ │ onFailure: (error) => error.reason, 2026-10-22T19:31:23.0022320Z 2426 │ │ onSuccess: () => "success" as const, 2026-10-22T19:31:23.0022414Z 2427 │ │ }), 2026-10-22T19:31:23.0022667Z 2428 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-22T19:31:23.0022856Z 2429 │ │ Effect.forkChild, 2026-10-22T19:31:23.0023012Z 2430 │ │ ); 2026-10-22T19:31:23.0023319Z 2431 │ │ yield* Effect.yieldNow; 2026-10-22T19:31:23.0023542Z 2432 │ │ dispatcher.flush(); 2026-10-22T19:31:23.0023779Z 2433 │ │ const secondExit = second.pollUnsafe(); 2026-10-22T19:31:23.0023994Z 2434 │ │ if (secondExit === undefined) { 2026-10-22T19:31:23.0024191Z 2435 │ │ second.interruptUnsafe(); 2026-10-22T19:31:23.0024387Z 2436 │ │ orphanedAt = interruptAt; 2026-10-22T19:31:23.0024495Z 2437 │ │ break; 2026-10-22T19:31:23.0024662Z 2438 │ │ } 2026-10-22T19:31:23.0024795Z 2439 │ │ if (Exit.isFailure(secondExit)) { 2026-10-22T19:31:23.0024966Z 2440 │ │ assert.fail("the matching request fiber was interrupted"); 2026-10-22T19:31:23.0025060Z 2441 │ │ } 2026-10-22T19:31:23.0025228Z 2442 │ │ assert.strictEqual(secondExit.value, "invalidWindow"); 2026-10-22T19:31:23.0025382Z 2443 │ ╰─▶ } 2026-10-22T19:31:23.0025442Z 2444 │ 2026-10-22T19:31:23.0025503Z ╰──── 2026-10-22T19:31:23.0025506Z 2026-10-22T19:31:23.0025732Z ⚠ eslint(no-unsafe-optional-chaining): Unsafe usage of optional chaining 2026-10-22T19:31:23.0025942Z ╭─[apps/server/src/orchestration-v2/ThreadLaunchService.test.ts:1783:8] 2026-10-22T19:31:23.0026057Z 1782 │ assert.equal( 2026-10-22T19:31:23.0026323Z 1783 │ (stored.context?.records[0] as { attachmentId: string }).attachmentId, 2026-10-22T19:31:23.0026510Z ·  ────────────────────────── 2026-10-22T19:31:23.0026659Z 1784 │ stored.attachments[0]?.id, 2026-10-22T19:31:23.0026717Z ╰──── 2026-10-22T19:31:23.0026903Z  help: If this short-circuits with 'undefined' the evaluation will throw TypeError 2026-10-22T19:31:23.0026906Z 2026-10-22T19:31:23.0027110Z ⚠ eslint(no-unused-vars): Type 'Scope' is imported but never used. 2026-10-22T19:31:23.0027258Z ╭─[apps/server/src/provider/ProviderAuthService.ts:15:18] 2026-10-22T19:31:23.0027349Z 14 │ import * as Layer from "effect/Layer"; 2026-10-22T19:31:23.0027452Z 15 │ import type * as Scope from "effect/Scope"; 2026-10-22T19:31:23.0027541Z ·  ──┬── 2026-10-22T19:31:23.0027689Z · ╰── 'Scope' is imported here 2026-10-22T19:31:23.0027780Z 16 │ import * as Stream from "effect/Stream"; 2026-10-22T19:31:23.0027846Z ╰──── 2026-10-22T19:31:23.0027957Z  help: Consider removing this import. 2026-10-22T19:31:23.0027960Z 2026-10-22T19:31:23.0028467Z ⚠ 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-22T19:31:23.0028600Z ╭─[packages/shared/src/atomicWrite.test.ts:139:5] 2026-10-22T19:31:23.0028684Z 138 │ Effect.gen(function* () { 2026-10-22T19:31:23.0028929Z 139 │ ╭─▶ while (fiber.pollUnsafe() === undefined) { 2026-10-22T19:31:23.0029156Z 140 │ │ yield* TestClock.adjust("100 millis"); 2026-10-22T19:31:23.0030002Z 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-22T19:31:23.0030416Z 142 │ │ yield* Effect.promise(() => new Promise((resolve) => setImmediate(resolve))); 2026-10-22T19:31:23.0030561Z 143 │ ╰─▶ } 2026-10-22T19:31:23.0030659Z 144 │ return yield* Fiber.join(fiber); 2026-10-22T19:31:23.0030718Z ╰──── 2026-10-22T19:31:23.0030722Z 2026-10-22T19:31:23.0031211Z ⚠ 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-22T19:31:23.0031354Z ╭─[apps/server/src/serverSettings.test.ts:1741:32] 2026-10-22T19:31:23.0031585Z 1740 │ const model = createModelSelection(ProviderInstanceId.make("codex"), "gpt-5.5"); 2026-10-22T19:31:23.0031937Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-22T19:31:23.0032148Z ·  ─────────────────── 2026-10-22T19:31:23.0032343Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-22T19:31:23.0032442Z ╰──── 2026-10-22T19:31:23.0032447Z 2026-10-22T19:31:23.0033282Z ⚠ 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-22T19:31:23.0033510Z ╭─[apps/server/src/serverSettings.test.ts:1742:34] 2026-10-22T19:31:23.0033857Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-22T19:31:23.0034071Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-22T19:31:23.0034257Z ·  ─────────────────── 2026-10-22T19:31:23.0034392Z 1743 │ Schema.fromJsonString(Schema.Array(ProjectScript)), 2026-10-22T19:31:23.0034449Z ╰──── 2026-10-22T19:31:23.0034453Z 2026-10-22T19:31:23.0034747Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-22T19:31:23.0034901Z ╭─[packages/shared/src/composerContextLegacySend.ts:19:45] 2026-10-22T19:31:23.0035043Z 18 │ const occurrences = collectComposerContextReferences(text); 2026-10-22T19:31:23.0035163Z 19 │ for (const occurrence of [...occurrences].reverse()) { 2026-10-22T19:31:23.0035282Z ·  ─────── 2026-10-22T19:31:23.0035463Z 20 │ const record = recordsById.get(occurrence.contextId); 2026-10-22T19:31:23.0035566Z ╰──── 2026-10-22T19:31:23.0035933Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-22T19:31:23.0035936Z 2026-10-22T19:31:23.0036332Z ⚠ 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-22T19:31:23.0036470Z ╭─[apps/server/src/auth/RpcAuthorization.ts:236:17] 2026-10-22T19:31:23.0036658Z 235 │ const requiredScopesForSettingsUpdate = (payload: unknown) => { 2026-10-22T19:31:23.0036905Z 236 │ const input = Schema.decodeUnknownSync(SettingsUpdate)(payload); 2026-10-22T19:31:23.0037093Z ·  ──────────────────────── 2026-10-22T19:31:23.0037461Z 237 │ const scopes = requiredScopesForServerSettingsPatch(input.patch); 2026-10-22T19:31:23.0037627Z ╰──── 2026-10-22T19:31:23.0037631Z 2026-10-22T19:31:23.0038101Z ⚠ 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-22T19:31:23.0038234Z ╭─[apps/server/src/auth/RpcAuthorization.ts:255:26] 2026-10-22T19:31:23.0038342Z 254 │ if (method === WS_METHODS.assetsCreateUrl) { 2026-10-22T19:31:23.0038514Z 255 │ const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload); 2026-10-22T19:31:23.0038639Z ·  ──────────────────────── 2026-10-22T19:31:23.0038710Z 256 │ return [ 2026-10-22T19:31:23.0038765Z ╰──── 2026-10-22T19:31:23.0038767Z 2026-10-22T19:31:23.0038998Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-22T19:31:23.0039181Z ╭─[apps/server/src/sourceControl/SourceControlProviderRegistry.ts:15:13] 2026-10-22T19:31:23.0039264Z 14 │ } from "@t3tools/contracts"; 2026-10-22T19:31:23.0039359Z 15 │ import type {} from "@t3tools/contracts"; 2026-10-22T19:31:23.0039439Z ·  ── 2026-10-22T19:31:23.0039639Z 16 │ import { detectSourceControlProviderFromRemoteUrl } from "@t3tools/shared/sourceControl"; 2026-10-22T19:31:23.0039700Z ╰──── 2026-10-22T19:31:23.0039789Z  help: Remove empty braces 2026-10-22T19:31:23.0039792Z 2026-10-22T19:31:23.0040039Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-22T19:31:23.0040177Z ╭─[apps/server/src/terminal/Manager.test.ts:731:31] 2026-10-22T19:31:23.0040242Z 730 │ ); 2026-10-22T19:31:23.0040485Z 731 │ const snapshot = events.filter((event) => event.type === "snapshot").at(-1)?.snapshot; 2026-10-22T19:31:23.0040663Z ·  ────── 2026-10-22T19:31:23.0040869Z 732 │ expect(snapshot?.history).toBe("aa😀\rEND"); 2026-10-22T19:31:23.0040968Z ╰──── 2026-10-22T19:31:23.0041230Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-22T19:31:23.0041233Z 2026-10-22T19:31:23.0041784Z ⚠ 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-22T19:31:23.0041934Z ╭─[apps/server/src/vcs/GitVcsDriverCore.test.ts:1713:34] 2026-10-22T19:31:23.0042091Z 1712 │ const stat = branch.files!.find((file) => file.path === path)!; 2026-10-22T19:31:23.0042254Z 1713 │ const request = yield* Schema.decodeEffect(ReviewDiffPreviewInput)({ 2026-10-22T19:31:23.0042380Z ·  ─────────────────── 2026-10-22T19:31:23.0042453Z 1714 │ cwd, 2026-10-22T19:31:23.0042511Z ╰──── 2026-10-22T19:31:23.0042514Z 2026-10-22T19:31:23.0042776Z ⚠ unicorn(prefer-string-starts-ends-with): Prefer String#startsWith over a regex with a caret. 2026-10-22T19:31:23.0042907Z ╭─[apps/server/src/vcs/GitVcsDriverCore.ts:509:11] 2026-10-22T19:31:23.0043025Z 508 │ GIT_DIAGNOSTIC_LINE_PATTERN.test(line) || 2026-10-22T19:31:23.0043247Z 509 │ (!/^remote:/.test(line) && SSH_TRANSPORT_REFUSAL_PATTERN.test(line)), 2026-10-22T19:31:23.0043405Z ·  ─────────────── 2026-10-22T19:31:23.0043612Z 510 │ ) 2026-10-22T19:31:23.0043782Z ╰──── 2026-10-22T19:31:23.0043994Z  help: Replace `/^remote:/.test(line)` with `line.startsWith('remote:')`. 2026-10-22T19:31:23.0043997Z 2026-10-22T19:31:23.0044481Z ⚠ 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-22T19:31:23.0044695Z ╭─[apps/server/src/assets/AssetAccess.test.ts:1043:32] 2026-10-22T19:31:23.0044846Z 1042 │ expect(error._tag).toBe("AssetGitHubMediaUrlValidationError"); 2026-10-22T19:31:23.0045055Z 1043 │ const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(AssetAccessError))(error); 2026-10-22T19:31:23.0045181Z ·  ─────────────────── 2026-10-22T19:31:23.0045291Z 1044 │ expect(encoded).not.toContain(url); 2026-10-22T19:31:23.0045353Z ╰──── 2026-10-22T19:31:23.0045355Z 2026-10-22T19:31:23.0045571Z ⚠ eslint(no-unused-vars): Identifier 'identity' is imported but never used. 2026-10-22T19:31:23.0045686Z ╭─[apps/server/src/auth/http.ts:28:10] 2026-10-22T19:31:23.0045780Z 27 │ import * as Schema from "effect/Schema"; 2026-10-22T19:31:23.0045888Z 28 │ import { identity } from "effect/Function"; 2026-10-22T19:31:23.0045977Z ·  ────┬─── 2026-10-22T19:31:23.0046130Z · ╰── 'identity' is imported here 2026-10-22T19:31:23.0046221Z 29 │ import * as Layer from "effect/Layer"; 2026-10-22T19:31:23.0046281Z ╰──── 2026-10-22T19:31:23.0046389Z  help: Consider removing this import. 2026-10-22T19:31:23.0046391Z 2026-10-22T19:31:23.0046642Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-22T19:31:23.0046793Z ╭─[apps/mobile/src/state/use-model-option-memory.ts:21:7] 2026-10-22T19:31:23.0046863Z 20 │ [instanceId]: { 2026-10-22T19:31:23.0046951Z 21 │ ...(state[instanceId] ?? {}), 2026-10-22T19:31:23.0047065Z ·  ──────────────────────────── 2026-10-22T19:31:23.0047137Z 22 │ [model]: options, 2026-10-22T19:31:23.0047193Z ╰──── 2026-10-22T19:31:23.0047483Z  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-22T19:31:23.0047486Z 2026-10-22T19:31:23.0047714Z ⚠ eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used. 2026-10-22T19:31:23.0047834Z ╭─[infra/relay/src/http/Api.ts:69:13] 2026-10-22T19:31:23.0047988Z 68 │ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts"; 2026-10-22T19:31:23.0048115Z 69 │ import * as HookForwarder from "../hooks/HookForwarder.ts"; 2026-10-22T19:31:23.0048208Z ·  ──────┬────── 2026-10-22T19:31:23.0048366Z · ╰── 'HookForwarder' is imported here 2026-10-22T19:31:23.0048477Z 70 │ import * as HeldHooks from "../hooks/HeldHooks.ts"; 2026-10-22T19:31:23.0048535Z ╰──── 2026-10-22T19:31:23.0048644Z  help: Consider removing this import. 2026-10-22T19:31:23.0048646Z 2026-10-22T19:31:23.0049227Z ⚠ 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-22T19:31:23.0049437Z ╭─[apps/server/src/project/ProjectEnrichmentService.test.ts:28:3] 2026-10-22T19:31:23.0049517Z 27 │ ) { 2026-10-22T19:31:23.0049737Z 28 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-22T19:31:23.0049895Z 29 │ │ const available = yield* service.peek(workspaceRoot); 2026-10-22T19:31:23.0050034Z 30 │ │ if (predicate(available)) return available; 2026-10-22T19:31:23.0050143Z 31 │ │ yield* Effect.yieldNow; 2026-10-22T19:31:23.0050278Z 32 │ ╰─▶ } 2026-10-22T19:31:23.0050476Z 33 │ return yield* Effect.die(`Project metadata for ${workspaceRoot} was not resolved in time.`); 2026-10-22T19:31:23.0050541Z ╰──── 2026-10-22T19:31:23.0050547Z 2026-10-22T19:31:23.0050825Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T19:31:23.0050968Z ╭─[apps/mobile/src/state/use-vcs-action-state.ts:86:5] 2026-10-22T19:31:23.0051086Z 83 │ const [nowMs, setNowMs] = useState(() => Date.now()); 2026-10-22T19:31:23.0051167Z 84 │ useEffect(() => { 2026-10-22T19:31:23.0051245Z ·  ────┬──── 2026-10-22T19:31:23.0051389Z · ╰── This is the containing effect 2026-10-22T19:31:23.0051487Z 85 │ if (!actionState.isRunning) return; 2026-10-22T19:31:23.0051564Z 86 │ setNowMs(Date.now()); 2026-10-22T19:31:23.0051641Z ·  ────┬─── 2026-10-22T19:31:23.0051830Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T19:31:23.0051977Z 87 │ const interval = setInterval(() => setNowMs(Date.now()), 1000); 2026-10-22T19:31:23.0052034Z ╰──── 2026-10-22T19:31:23.0052779Z  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-22T19:31:23.0053138Z  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-22T19:31:23.0053140Z 2026-10-22T19:31:23.0053871Z ⚠ 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-22T19:31:23.0054079Z ╭─[apps/server/src/project/ProjectService.test.ts:94:3] 2026-10-22T19:31:23.0054143Z 93 │ ) { 2026-10-22T19:31:23.0054356Z 94 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-22T19:31:23.0054574Z 95 │ │ const project = Option.getOrThrow(yield* service.getById(projectId)); 2026-10-22T19:31:23.0054781Z 96 │ │ if (predicate(project)) return project; 2026-10-22T19:31:23.0054892Z 97 │ │ yield* Effect.yieldNow; 2026-10-22T19:31:23.0055025Z 98 │ ╰─▶ } 2026-10-22T19:31:23.0055194Z 99 │ return yield* Effect.die(`Project ${projectId} was not enriched in time.`); 2026-10-22T19:31:23.0055257Z ╰──── 2026-10-22T19:31:23.0055259Z 2026-10-22T19:31:23.0055760Z ⚠ 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-22T19:31:23.0055950Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7] 2026-10-22T19:31:23.0056062Z 565 │ let afterSequence = created[0]!.sequence; 2026-10-22T19:31:23.0056280Z 566 │ ╭─▶ for (let index = 1; index <= 32; index += 1) { 2026-10-22T19:31:23.0056391Z 567 │ │ const nextEvent = { 2026-10-22T19:31:23.0056566Z 568 │ │ id: EventId.make(`event:foundation-stream-race:${index}`), 2026-10-22T19:31:23.0056715Z 569 │ │ type: "thread.metadata-updated" as const, 2026-10-22T19:31:23.0056823Z 570 │ │ threadId, 2026-10-22T19:31:23.0056940Z 571 │ │ providerInstanceId, 2026-10-22T19:31:23.0057047Z 572 │ │ occurredAt: now, 2026-10-22T19:31:23.0057208Z 573 │ │ payload: { ...thread, title: `Race update ${index}` }, 2026-10-22T19:31:23.0057352Z 574 │ │ } satisfies OrchestrationV2DomainEvent; 2026-10-22T19:31:23.0057475Z 575 │ │ const reader = yield* eventSink 2026-10-22T19:31:23.0057606Z 576 │ │ .stream({ threadId, afterSequence }) 2026-10-22T19:31:23.0057746Z 577 │ │ .pipe(Stream.runHead, Effect.forkChild); 2026-10-22T19:31:23.0057870Z 578 │ │ yield* Effect.yieldNow; 2026-10-22T19:31:23.0058052Z 579 │ │ const written = yield* eventSink.write({ events: [nextEvent] }); 2026-10-22T19:31:23.0058195Z 580 │ │ const received = yield* Fiber.join(reader); 2026-10-22T19:31:23.0058320Z 581 │ │ if (Option.isNone(received)) { 2026-10-22T19:31:23.0058534Z 582 │ │ return yield* Effect.die("The event stream ended before delivering the live event."); 2026-10-22T19:31:23.0058624Z 583 │ │ } 2026-10-22T19:31:23.0058800Z 584 │ │ assert.equal(received.value.sequence, written[0]?.sequence); 2026-10-22T19:31:23.0058959Z 585 │ │ assert.equal(received.value.event.id, nextEvent.id); 2026-10-22T19:31:23.0059153Z 586 │ │ afterSequence = received.value.sequence; 2026-10-22T19:31:23.0059331Z 587 │ ╰─▶ } 2026-10-22T19:31:23.0059400Z 588 │ }), 2026-10-22T19:31:23.0059460Z ╰──── 2026-10-22T19:31:23.0059462Z 2026-10-22T19:31:23.0059961Z ⚠ 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-22T19:31:23.0060151Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:2327:9] 2026-10-22T19:31:23.0060241Z 2326 │ let settled = false; 2026-10-22T19:31:23.0060415Z 2327 │ ╭─▶ while (!settled) { 2026-10-22T19:31:23.0060589Z 2328 │ │ settled = (yield* outbox.listByCommandId(commandId)).every( 2026-10-22T19:31:23.0060735Z 2329 │ │ (effect) => effect.status === "succeeded", 2026-10-22T19:31:23.0060828Z 2330 │ │ ); 2026-10-22T19:31:23.0060967Z 2331 │ │ if (!settled) yield* Effect.yieldNow; 2026-10-22T19:31:23.0061116Z 2332 │ ╰─▶ } 2026-10-22T19:31:23.0061244Z 2333 │ }).pipe(Effect.provide(layerWorker), Effect.scoped); 2026-10-22T19:31:23.0061305Z ╰──── 2026-10-22T19:31:23.0061307Z 2026-10-22T19:31:23.0061812Z ⚠ 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-22T19:31:23.0061977Z ╭─[apps/server/src/background/HostPowerMonitor.test.ts:133:11] 2026-10-22T19:31:23.0062118Z 132 │ const monitor = yield* HostPowerMonitor.HostPowerMonitor; 2026-10-22T19:31:23.0062273Z 133 │ ╭─▶ for ( 2026-10-22T19:31:23.0062387Z 134 │ │ let attempt = 0; 2026-10-22T19:31:23.0062570Z 135 │ │ attempt < 100 && (yield* monitor.snapshot).onBattery !== "true"; 2026-10-22T19:31:23.0062674Z 136 │ │ attempt += 1 2026-10-22T19:31:23.0062766Z 137 │ │ ) { 2026-10-22T19:31:23.0062888Z 138 │ │ yield* Effect.yieldNow; 2026-10-22T19:31:23.0063046Z 139 │ ╰─▶ } 2026-10-22T19:31:23.0063180Z 140 │ expect((yield* monitor.snapshot).onBattery).toBe("true"); 2026-10-22T19:31:23.0063238Z ╰──── 2026-10-22T19:31:23.0063240Z 2026-10-22T19:31:23.0063454Z ⚠ eslint(no-unused-vars): Identifier 'Fiber' is imported but never used. 2026-10-22T19:31:23.0063559Z ╭─[apps/server/src/ws.ts:9:13] 2026-10-22T19:31:23.0063655Z  8 │ import * as Effect from "effect/Effect"; 2026-10-22T19:31:23.0063742Z  9 │ import * as Fiber from "effect/Fiber"; 2026-10-22T19:31:23.0063829Z ·  ──┬── 2026-10-22T19:31:23.0063970Z · ╰── 'Fiber' is imported here 2026-10-22T19:31:23.0064082Z 10 │ import * as FileSystem from "effect/FileSystem"; 2026-10-22T19:31:23.0064141Z ╰──── 2026-10-22T19:31:23.0064311Z  help: Consider removing this import. 2026-10-22T19:31:23.0064352Z 2026-10-22T19:31:23.0064595Z ⚠ eslint(no-unused-vars): Identifier 'Schedule' is imported but never used. 2026-10-22T19:31:23.0064734Z ╭─[apps/server/src/ws.ts:16:13] 2026-10-22T19:31:23.0064832Z 15 │ import * as Ref from "effect/Ref"; 2026-10-22T19:31:23.0064968Z 16 │ import * as Schedule from "effect/Schedule"; 2026-10-22T19:31:23.0065106Z ·  ────┬─── 2026-10-22T19:31:23.0065334Z · ╰── 'Schedule' is imported here 2026-10-22T19:31:23.0065427Z 17 │ import * as Schema from "effect/Schema"; 2026-10-22T19:31:23.0065486Z ╰──── 2026-10-22T19:31:23.0065597Z  help: Consider removing this import. 2026-10-22T19:31:23.0065600Z 2026-10-22T19:31:23.0065937Z ⚠ eslint(no-unused-vars): Variable 'projectSetupScriptRunner' is declared but never used. Unused variables should start with a '_'. 2026-10-22T19:31:23.0066051Z ╭─[apps/server/src/ws.ts:1251:13] 2026-10-22T19:31:23.0066219Z 1250 │ const usageLimitSources = yield* UsageLimitSources.UsageLimitSources; 2026-10-22T19:31:23.0066438Z 1251 │ const projectSetupScriptRunner = yield* ProjectSetupScriptRunner.ProjectSetupScriptRunner; 2026-10-22T19:31:23.0066554Z ·  ────────────┬─────────── 2026-10-22T19:31:23.0066738Z · ╰── 'projectSetupScriptRunner' is declared here 2026-10-22T19:31:23.0066921Z 1252 │ const worktreeSetupTracker = yield* WorktreeSetupTracker.WorktreeSetupTracker; 2026-10-22T19:31:23.0066979Z ╰──── 2026-10-22T19:31:23.0067094Z  help: Consider removing this declaration. 2026-10-22T19:31:23.0067097Z 2026-10-22T19:31:23.0067424Z ⚠ eslint(no-unused-vars): Variable 'layerFromProviderAdapter' is declared but never used. Unused variables should start with a '_'. 2026-10-22T19:31:23.0067604Z ╭─[apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts:346:7] 2026-10-22T19:31:23.0067663Z 345 │ 2026-10-22T19:31:23.0067776Z 346 │ const layerFromProviderAdapter: Layer.Layer< 2026-10-22T19:31:23.0067877Z ·  ────────────┬─────────── 2026-10-22T19:31:23.0068059Z · ╰── 'layerFromProviderAdapter' is declared here 2026-10-22T19:31:23.0068154Z 347 │ ProviderAdapterRegistryV2, 2026-10-22T19:31:23.0068220Z ╰──── 2026-10-22T19:31:23.0068332Z  help: Consider removing this declaration. 2026-10-22T19:31:23.0068335Z 2026-10-22T19:31:23.0068646Z ⚠ eslint(no-unused-vars): Variable 'layerUnavailable' is declared but never used. Unused variables should start with a '_'. 2026-10-22T19:31:23.0068813Z ╭─[apps/server/src/orchestration-v2/Orchestrator.ts:12232:7] 2026-10-22T19:31:23.0068882Z 12231 │ 2026-10-22T19:31:23.0069037Z 12232 │ const layerUnavailable: Layer.Layer = Layer.succeed( 2026-10-22T19:31:23.0069133Z ·  ────────┬─────── 2026-10-22T19:31:23.0069299Z · ╰── 'layerUnavailable' is declared here 2026-10-22T19:31:23.0069377Z 12233 │ OrchestratorV2, 2026-10-22T19:31:23.0069525Z ╰──── 2026-10-22T19:31:23.0069646Z  help: Consider removing this declaration. 2026-10-22T19:31:23.0069648Z 2026-10-22T19:31:23.0069857Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-22T19:31:23.0070161Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:555:70] 2026-10-22T19:31:23.0070381Z 554 │ assert.deepStrictEqual( 2026-10-22T19:31:23.0070563Z 555 │ (yield* Ref.get(fixture.syncCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-22T19:31:23.0070702Z ·  ┬ 2026-10-22T19:31:23.0070886Z · ╰── '_' is declared here 2026-10-22T19:31:23.0070987Z 556 │ [ 2026-10-22T19:31:23.0071076Z ╰──── 2026-10-22T19:31:23.0071240Z  help: Consider removing this parameter. 2026-10-22T19:31:23.0071243Z 2026-10-22T19:31:23.0071444Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-22T19:31:23.0071640Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:1155:70] 2026-10-22T19:31:23.0071731Z 1154 │ assert.deepStrictEqual( 2026-10-22T19:31:23.0071912Z 1155 │ (yield* Ref.get(fixture.linkCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-22T19:31:23.0072047Z ·  ┬ 2026-10-22T19:31:23.0072226Z · ╰── '_' is declared here 2026-10-22T19:31:23.0072293Z 1156 │ [ 2026-10-22T19:31:23.0072352Z ╰──── 2026-10-22T19:31:23.0072466Z  help: Consider removing this parameter. 2026-10-22T19:31:23.0072469Z 2026-10-22T19:31:23.0072659Z ⚠ eslint(no-empty-pattern): Empty array binding pattern 2026-10-22T19:31:23.0072837Z ╭─[apps/server/src/pullRequest/PullRequestService.test.ts:1429:12] 2026-10-22T19:31:23.0072901Z 1428 │ 2026-10-22T19:31:23.0072976Z 1429 │ for (const [] of [ 2026-10-22T19:31:23.0073057Z ·  ── 2026-10-22T19:31:23.0073134Z 1430 │ ["github", "github.com"], 2026-10-22T19:31:23.0073192Z ╰──── 2026-10-22T19:31:23.0073496Z  help: Passing non-iterable values (null, undefined, numbers, booleans, etc.) will result in a runtime error because these values are not iterable. 2026-10-22T19:31:23.0073499Z 2026-10-22T19:31:23.0073777Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-22T19:31:23.0073920Z ╭─[packages/provider-pi/src/server/adapter.ts:3389:7] 2026-10-22T19:31:23.0073977Z 3388 │ 2026-10-22T19:31:23.0074186Z 3389 │ const layer: Layer.Layer = 2026-10-22T19:31:23.0074316Z ·  ──┬── 2026-10-22T19:31:23.0074486Z · ╰── 'layer' is declared here 2026-10-22T19:31:23.0074595Z 3390 │ Layer.effect( 2026-10-22T19:31:23.0074668Z ╰──── 2026-10-22T19:31:23.0074802Z  help: Consider removing this declaration. 2026-10-22T19:31:23.0074805Z 2026-10-22T19:31:23.0075092Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-22T19:31:23.0075232Z ╭─[apps/server/src/telemetry/AnalyticsService.ts:340:7] 2026-10-22T19:31:23.0075293Z 339 │ 2026-10-22T19:31:23.0075406Z 340 │ const layerTest = AnalyticsService.layerTest; 2026-10-22T19:31:23.0075492Z ·  ────┬──── 2026-10-22T19:31:23.0075721Z · ╰── 'layerTest' is declared here 2026-10-22T19:31:23.0075855Z ╰──── 2026-10-22T19:31:23.0075970Z  help: Consider removing this declaration. 2026-10-22T19:31:23.0075973Z 2026-10-22T19:31:23.0076203Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-22T19:31:23.0076316Z ╭─[packages/contracts/src/rpc.ts:295:8] 2026-10-22T19:31:23.0076396Z 294 │ } from "./device.ts"; 2026-10-22T19:31:23.0076526Z 295 │ import {} from "./previewAutomation.ts"; 2026-10-22T19:31:23.0076646Z ·  ── 2026-10-22T19:31:23.0076709Z 296 │ import { 2026-10-22T19:31:23.0076767Z ╰──── 2026-10-22T19:31:23.0076859Z  help: Remove empty braces 2026-10-22T19:31:23.0076862Z 2026-10-22T19:31:23.0077109Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-22T19:31:23.0077250Z ╭─[scripts/lib/cli-external-packages.test.ts:114:11] 2026-10-22T19:31:23.0077329Z 113 │ const declared = { 2026-10-22T19:31:23.0077430Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-22T19:31:23.0077551Z ·  ──────────────────────────────── 2026-10-22T19:31:23.0077662Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-22T19:31:23.0077724Z ╰──── 2026-10-22T19:31:23.0078014Z  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-22T19:31:23.0078017Z 2026-10-22T19:31:23.0078257Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-22T19:31:23.0078397Z ╭─[scripts/lib/cli-external-packages.test.ts:115:11] 2026-10-22T19:31:23.0078501Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-22T19:31:23.0078614Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-22T19:31:23.0078750Z ·  ──────────────────────────────────────── 2026-10-22T19:31:23.0078856Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-22T19:31:23.0078916Z ╰──── 2026-10-22T19:31:23.0079207Z  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-22T19:31:23.0079213Z 2026-10-22T19:31:23.0079455Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-22T19:31:23.0079595Z ╭─[scripts/lib/cli-external-packages.test.ts:116:11] 2026-10-22T19:31:23.0079773Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-22T19:31:23.0079955Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-22T19:31:23.0080081Z ·  ──────────────────────────────────── 2026-10-22T19:31:23.0080150Z 117 │ }; 2026-10-22T19:31:23.0080205Z ╰──── 2026-10-22T19:31:23.0080506Z  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-22T19:31:23.0080510Z 2026-10-22T19:31:23.0080653Z Found 0 errors and 358 warnings in 5395 files (8.4s, 8 threads) 2026-10-22T19:31:23.0711391Z Post job cleanup. 2026-10-22T19:31:23.1419211Z Cache hit occurred on the primary key electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309, not saving cache. 2026-10-22T19:31:23.1497115Z Post job cleanup. 2026-10-22T19:31:23.1520834Z ##[start-action display=Cache full pnpm store;id=__c45f0923-ff65-4b57-8dbd-ccb026d2da0c.__actions_cache] 2026-10-22T19:31:23.1931494Z Post job cleanup. 2026-10-22T19:31:23.2934984Z Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-d651407d7d0c7ecacd035718e6d120760bb0bb1ea0b966bcda4a8197c80ebc8f, not saving cache. 2026-10-22T19:31:23.2992066Z ##[end-action id=__c45f0923-ff65-4b57-8dbd-ccb026d2da0c.__actions_cache;outcome=success;conclusion=success;duration_ms=147] 2026-10-22T19:31:23.2994657Z ##[start-action display=Cache Vite+;id=__c45f0923-ff65-4b57-8dbd-ccb026d2da0c.vp_cache] 2026-10-22T19:31:23.3026220Z Post job cleanup. 2026-10-22T19:31:23.3966831Z 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-22T19:31:23.4013263Z ##[end-action id=__c45f0923-ff65-4b57-8dbd-ccb026d2da0c.vp_cache;outcome=success;conclusion=success;duration_ms=101] 2026-10-22T19:31:23.4074858Z Post job cleanup. 2026-10-22T19:31:23.4615752Z [command]/usr/local/bin/git version 2026-10-22T19:31:23.4659436Z git version 2.55.0 2026-10-22T19:31:23.4682273Z Temporarily overriding HOME='/home/runner/_work/_temp/a768a96b-7f5a-4a6b-b484-ca0bed299f56' before making global git config changes 2026-10-22T19:31:23.4682664Z Adding repository directory to the temporary git global config as a safe directory 2026-10-22T19:31:23.4685909Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-22T19:31:23.4721800Z Removing SSH command configuration 2026-10-22T19:31:23.4725774Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-22T19:31:23.4759445Z [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-22T19:31:23.4926852Z fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules 2026-10-22T19:31:23.4958913Z ##[warning]The process '/usr/local/bin/git' failed with exit code 128 2026-10-22T19:31:23.5006544Z A job completed hook has been configured by the self-hosted runner administrator 2026-10-22T19:31:23.5031423Z ##[group]Run '/job_completed.sh' 2026-10-22T19:31:23.5043654Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-22T19:31:23.5043849Z env: 2026-10-22T19:31:23.5043976Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 200 2026-10-22T19:31:23.5044145Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 513 2026-10-22T19:31:23.5044302Z BLACKSMITH_CHECK_RUN_ID: 120040171121 2026-10-22T19:31:23.5044458Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-22T19:31:23.5044659Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-22T19:31:23.5044816Z ##[endgroup] 2026-10-22T19:31:23.5148233Z Docker container cache not activated, skipping hash computation. 2026-10-22T19:31:23.5506222Z No active SSH sessions detected. Proceeding with shutdown immediately. 2026-10-22T19:31:23.5601928Z Cleaning up orphan processes