2026-10-23T22:24:18.9909787Z Current runner version: '2.337.0' 2026-10-23T22:24:18.9916296Z Runner name: 'blacksmith-8vcpu-ubuntu-2404-dpum22x7v4snmmq2' 2026-10-23T22:24:18.9917411Z Runner group name: 'blacksmith scale sets - blacksmith-8vcpu-ubuntu-2404' 2026-10-23T22:24:18.9918792Z Machine name: 'ip-172-31-73-130' 2026-10-23T22:24:18.9921313Z ##[group]GITHUB_TOKEN Permissions 2026-10-23T22:24:18.9923645Z Contents: read 2026-10-23T22:24:18.9924290Z Metadata: read 2026-10-23T22:24:18.9924933Z ##[endgroup] 2026-10-23T22:24:18.9927068Z Secret source: Actions 2026-10-23T22:24:18.9928105Z Cache mode: write 2026-10-23T22:24:18.9928943Z Prepare workflow directory 2026-10-23T22:24:19.0192301Z Prepare all required actions 2026-10-23T22:24:19.0224940Z Getting action download info 2026-10-23T22:24:19.1759808Z Download action repository 'actions/checkout@v6' (SHA:d23441a48e516b6c34aea4fa41551a30e30af803) 2026-10-23T22:24:19.2299249Z Download action repository 'actions/cache@v6' (SHA:55cc8345863c7cc4c66a329aec7e433d2d1c52a9) 2026-10-23T22:24:19.3785239Z Setting BLACKSMITH_ACTIONS_RESULTS_URL to https://results-receiver.actions.githubusercontent.com/ 2026-10-23T22:24:19.3833752Z Complete job name: Lint 2026-10-23T22:24:19.4253942Z A job started hook has been configured by the self-hosted runner administrator 2026-10-23T22:24:19.4330350Z ##[group]Run '/setup.sh' 2026-10-23T22:24:19.4344864Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T22:24:19.4345309Z env: 2026-10-23T22:24:19.4345560Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 193 2026-10-23T22:24:19.4345875Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 447 2026-10-23T22:24:19.4346173Z BLACKSMITH_CHECK_RUN_ID: 120686836548 2026-10-23T22:24:19.4346476Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-23T22:24:19.4346807Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-23T22:24:19.4347076Z ##[endgroup] 2026-10-23T22:24:19.4665281Z Logging daemon started (blacksmithd for logs) 2026-10-23T22:24:19.4771076Z Results daemon started (blacksmithd for results) 2026-10-23T22:24:19.4933656Z Background adoption and SSH setup started (PID: 3059) 2026-10-23T22:24:19.4934154Z 2026-10-23T22:24:19.4934283Z ---------------------------------------- 2026-10-23T22:24:19.4934837Z View this job: https://app.blacksmith.sh/pingdotgg/runs/40033376951/jobs/120686836548 2026-10-23T22:24:19.4935294Z SSH Access (using your GitHub SSH key): 2026-10-23T22:24:19.4935772Z ssh -p 64000 runner@blacksmith-8vcpu-ubuntu-2404-dpum22x7v4snmmq2.vm.blacksmith.sh 2026-10-23T22:24:19.4936118Z 2026-10-23T22:24:19.4936241Z No GitHub SSH key? Add one at: 2026-10-23T22:24:19.4936788Z https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account 2026-10-23T22:24:19.4937235Z 2026-10-23T22:24:19.4937356Z ---------------------------------------- 2026-10-23T22:24:19.4937589Z 2026-10-23T22:24:19.4937753Z VM ID: blacksmith-8vcpu-ubuntu-2404-dpum22x7v4snmmq2 2026-10-23T22:24:19.4938117Z Host: production-152.236.41.38-x8664 2026-10-23T22:24:19.4938422Z Host Agent PID: 3141526 2026-10-23T22:24:19.4938704Z Host Agent Git SHA: af74fd76b 2026-10-23T22:24:19.4939004Z Host CPU Manufacturer: AuthenticAMD 2026-10-23T22:24:19.4939325Z Blacksmith Host Generation: gen 2 2026-10-23T22:24:19.4939649Z Petname: production-current-firefly-41e87627 2026-10-23T22:24:19.4939984Z Region: us-east 2026-10-23T22:24:19.4940243Z Rootfs Version: ubuntu24-full-x64-081926 2026-10-23T22:24:19.4945574Z OS Version: Ubuntu 24.04.4 LTS 2026-10-23T22:24:19.4946020Z 2026-10-23T22:24:19.4946149Z Enabling Blacksmith transparent cache 2026-10-23T22:24:19.5280716Z ##[group]Run actions/checkout@v6 2026-10-23T22:24:19.5281057Z with: 2026-10-23T22:24:19.5281408Z sparse-checkout: /* !/.repos/ !/apps/mobile/modules/t3-terminal/Vendor/**/*.a 2026-10-23T22:24:19.5281823Z sparse-checkout-cone-mode: false 2026-10-23T22:24:19.5282117Z repository: pingdotgg/t3code 2026-10-23T22:24:19.5284151Z token: *** 2026-10-23T22:24:19.5284372Z ssh-strict: true 2026-10-23T22:24:19.5284601Z ssh-user: git 2026-10-23T22:24:19.5284833Z persist-credentials: true 2026-10-23T22:24:19.5285410Z clean: true 2026-10-23T22:24:19.5285633Z fetch-depth: 1 2026-10-23T22:24:19.5285864Z fetch-tags: false 2026-10-23T22:24:19.5286292Z show-progress: true 2026-10-23T22:24:19.5286532Z lfs: false 2026-10-23T22:24:19.5286757Z submodules: false 2026-10-23T22:24:19.5286992Z set-safe-directory: true 2026-10-23T22:24:19.5287265Z allow-unsafe-pr-checkout: false 2026-10-23T22:24:19.5287612Z env: 2026-10-23T22:24:19.5287893Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 193 2026-10-23T22:24:19.5288189Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 447 2026-10-23T22:24:19.5288492Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T22:24:19.5288760Z ##[endgroup] 2026-10-23T22:24:19.6905525Z Syncing repository: pingdotgg/t3code 2026-10-23T22:24:19.6906847Z ##[group]Getting Git version info 2026-10-23T22:24:19.6907227Z Working directory is '/home/runner/_work/t3code/t3code' 2026-10-23T22:24:19.6907868Z [command]/usr/local/bin/git version 2026-10-23T22:24:19.6985904Z git version 2.55.0 2026-10-23T22:24:19.7002214Z ##[endgroup] 2026-10-23T22:24:19.7011757Z Temporarily overriding HOME='/home/runner/_work/_temp/b6d10c13-74f3-4bc7-aa20-dacf28843b39' before making global git config changes 2026-10-23T22:24:19.7012491Z Adding repository directory to the temporary git global config as a safe directory 2026-10-23T22:24:19.7016156Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-23T22:24:19.7073459Z Deleting the contents of '/home/runner/_work/t3code/t3code' 2026-10-23T22:24:19.7076307Z ##[group]Determining repository object format 2026-10-23T22:24:19.7078367Z ##[endgroup] 2026-10-23T22:24:19.7078760Z ##[group]Initializing the repository 2026-10-23T22:24:19.7083523Z [command]/usr/local/bin/git init /home/runner/_work/t3code/t3code 2026-10-23T22:24:19.7148463Z hint: Using 'master' as the name for the initial branch. This default branch name 2026-10-23T22:24:19.7149061Z hint: will change to "main" in Git 3.0. To configure the initial branch name 2026-10-23T22:24:19.7149668Z hint: to use in all of your new repositories, which will suppress this warning, 2026-10-23T22:24:19.7150085Z hint: call: 2026-10-23T22:24:19.7150504Z hint: 2026-10-23T22:24:19.7150842Z hint: git config --global init.defaultBranch 2026-10-23T22:24:19.7151197Z hint: 2026-10-23T22:24:19.7151535Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and 2026-10-23T22:24:19.7152042Z hint: 'development'. The just-created branch can be renamed via this command: 2026-10-23T22:24:19.7152466Z hint: 2026-10-23T22:24:19.7152699Z hint: git branch -m 2026-10-23T22:24:19.7152975Z hint: 2026-10-23T22:24:19.7153322Z hint: Disable this message with "git config set advice.defaultBranchName false" 2026-10-23T22:24:19.7153873Z Initialized empty Git repository in /home/runner/_work/t3code/t3code/.git/ 2026-10-23T22:24:19.7162315Z [command]/usr/local/bin/git remote add origin https://github.com/pingdotgg/t3code 2026-10-23T22:24:19.7229866Z ##[endgroup] 2026-10-23T22:24:19.7230445Z ##[group]Disabling automatic garbage collection 2026-10-23T22:24:19.7238632Z [command]/usr/local/bin/git config --local gc.auto 0 2026-10-23T22:24:19.7280172Z ##[endgroup] 2026-10-23T22:24:19.7280751Z ##[group]Setting up auth 2026-10-23T22:24:19.7282200Z Removing SSH command configuration 2026-10-23T22:24:19.7291982Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-23T22:24:19.7346631Z [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-23T22:24:19.7572713Z Removing HTTP extra header 2026-10-23T22:24:19.7579442Z [command]/usr/local/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader 2026-10-23T22:24:19.7624093Z [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-23T22:24:19.7787541Z Removing includeIf entries pointing to credentials config files 2026-10-23T22:24:19.7793527Z [command]/usr/local/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: 2026-10-23T22:24:19.7832724Z [command]/usr/local/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url 2026-10-23T22:24:19.7993683Z [command]/usr/local/bin/git config --file /home/runner/_work/_temp/git-credentials-e164568e-8034-41b8-828d-f0514ff6d92a.config http.https://github.com/.extraheader AUTHORIZATION: basic *** 2026-10-23T22:24:19.8035123Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git.path /home/runner/_work/_temp/git-credentials-e164568e-8034-41b8-828d-f0514ff6d92a.config 2026-10-23T22:24:19.8071784Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git/worktrees/*.path /home/runner/_work/_temp/git-credentials-e164568e-8034-41b8-828d-f0514ff6d92a.config 2026-10-23T22:24:19.8103444Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-e164568e-8034-41b8-828d-f0514ff6d92a.config 2026-10-23T22:24:19.8148908Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-e164568e-8034-41b8-828d-f0514ff6d92a.config 2026-10-23T22:24:19.8187590Z ##[endgroup] 2026-10-23T22:24:19.8187997Z ##[group]Fetching the repository 2026-10-23T22:24:19.8193727Z [command]/usr/local/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --filter=blob:none --depth=1 origin +895878664b33ae557bdb26dccfaf436c6a899a5a:refs/remotes/pull/24235/merge 2026-10-23T22:24:20.3748983Z From https://github.com/pingdotgg/t3code 2026-10-23T22:24:20.3750279Z * [new ref] 895878664b33ae557bdb26dccfaf436c6a899a5a -> pull/24235/merge 2026-10-23T22:24:20.3775309Z ##[endgroup] 2026-10-23T22:24:20.3776294Z ##[group]Determining the checkout info 2026-10-23T22:24:20.3777309Z ##[endgroup] 2026-10-23T22:24:20.3778235Z ##[group]Setting up sparse checkout 2026-10-23T22:24:20.3780075Z [command]/usr/local/bin/git config core.sparseCheckout true 2026-10-23T22:24:20.3809727Z [command]/usr/local/bin/git rev-parse --git-path info/sparse-checkout 2026-10-23T22:24:20.3833299Z .git/info/sparse-checkout 2026-10-23T22:24:20.3838408Z ##[endgroup] 2026-10-23T22:24:20.3839339Z ##[group]Checking out the ref 2026-10-23T22:24:20.3841466Z [command]/usr/local/bin/git checkout --progress --force refs/remotes/pull/24235/merge 2026-10-23T22:24:31.2784959Z Updating files: 0% (1/6309) 2026-10-23T22:24:31.2816825Z Updating files: 1% (64/6309) 2026-10-23T22:24:31.2837704Z Updating files: 2% (127/6309) 2026-10-23T22:24:31.2863156Z Updating files: 3% (190/6309) 2026-10-23T22:24:31.2886147Z Updating files: 4% (253/6309) 2026-10-23T22:24:31.2921484Z Updating files: 5% (316/6309) 2026-10-23T22:24:31.2946579Z Updating files: 6% (379/6309) 2026-10-23T22:24:31.3012730Z Updating files: 7% (442/6309) 2026-10-23T22:24:31.3048490Z Updating files: 8% (505/6309) 2026-10-23T22:24:31.3074014Z Updating files: 9% (568/6309) 2026-10-23T22:24:31.3390416Z Updating files: 10% (631/6309) 2026-10-23T22:24:31.3405461Z Updating files: 11% (694/6309) 2026-10-23T22:24:31.3417370Z Updating files: 12% (758/6309) 2026-10-23T22:24:31.3433881Z Updating files: 13% (821/6309) 2026-10-23T22:24:31.3450912Z Updating files: 14% (884/6309) 2026-10-23T22:24:31.3472923Z Updating files: 15% (947/6309) 2026-10-23T22:24:31.3493451Z Updating files: 16% (1010/6309) 2026-10-23T22:24:31.3508937Z Updating files: 17% (1073/6309) 2026-10-23T22:24:31.3528749Z Updating files: 18% (1136/6309) 2026-10-23T22:24:31.3545025Z Updating files: 19% (1199/6309) 2026-10-23T22:24:31.3569800Z Updating files: 20% (1262/6309) 2026-10-23T22:24:31.3590300Z Updating files: 21% (1325/6309) 2026-10-23T22:24:31.3610929Z Updating files: 22% (1388/6309) 2026-10-23T22:24:31.3626125Z Updating files: 23% (1452/6309) 2026-10-23T22:24:31.3640109Z Updating files: 24% (1515/6309) 2026-10-23T22:24:31.3677590Z Updating files: 25% (1578/6309) 2026-10-23T22:24:31.3694011Z Updating files: 26% (1641/6309) 2026-10-23T22:24:31.3709392Z Updating files: 27% (1704/6309) 2026-10-23T22:24:31.3732665Z Updating files: 28% (1767/6309) 2026-10-23T22:24:31.3769884Z Updating files: 29% (1830/6309) 2026-10-23T22:24:31.3795755Z Updating files: 30% (1893/6309) 2026-10-23T22:24:31.3821530Z Updating files: 31% (1956/6309) 2026-10-23T22:24:31.3855393Z Updating files: 32% (2019/6309) 2026-10-23T22:24:31.3890286Z Updating files: 33% (2082/6309) 2026-10-23T22:24:31.3966736Z Updating files: 34% (2146/6309) 2026-10-23T22:24:31.4034024Z Updating files: 35% (2209/6309) 2026-10-23T22:24:31.4072862Z Updating files: 36% (2272/6309) 2026-10-23T22:24:31.4107355Z Updating files: 37% (2335/6309) 2026-10-23T22:24:31.4129384Z Updating files: 38% (2398/6309) 2026-10-23T22:24:31.4159709Z Updating files: 38% (2418/6309) 2026-10-23T22:24:31.4189505Z Updating files: 39% (2461/6309) 2026-10-23T22:24:31.4229630Z Updating files: 40% (2524/6309) 2026-10-23T22:24:31.4266397Z Updating files: 41% (2587/6309) 2026-10-23T22:24:31.4286714Z Updating files: 42% (2650/6309) 2026-10-23T22:24:31.4297420Z Updating files: 43% (2713/6309) 2026-10-23T22:24:31.4321727Z Updating files: 44% (2776/6309) 2026-10-23T22:24:31.4353743Z Updating files: 45% (2840/6309) 2026-10-23T22:24:31.4381933Z Updating files: 46% (2903/6309) 2026-10-23T22:24:31.4411823Z Updating files: 47% (2966/6309) 2026-10-23T22:24:31.4442173Z Updating files: 48% (3029/6309) 2026-10-23T22:24:31.4475359Z Updating files: 49% (3092/6309) 2026-10-23T22:24:31.4516716Z Updating files: 50% (3155/6309) 2026-10-23T22:24:31.4533971Z Updating files: 51% (3218/6309) 2026-10-23T22:24:31.4574270Z Updating files: 52% (3281/6309) 2026-10-23T22:24:31.4600014Z Updating files: 53% (3344/6309) 2026-10-23T22:24:31.4621612Z Updating files: 54% (3407/6309) 2026-10-23T22:24:31.4648401Z Updating files: 55% (3470/6309) 2026-10-23T22:24:31.4667499Z Updating files: 56% (3534/6309) 2026-10-23T22:24:31.4686683Z Updating files: 57% (3597/6309) 2026-10-23T22:24:31.4706928Z Updating files: 58% (3660/6309) 2026-10-23T22:24:31.5102702Z Updating files: 59% (3723/6309) 2026-10-23T22:24:31.5119138Z Updating files: 60% (3786/6309) 2026-10-23T22:24:31.5137266Z Updating files: 61% (3849/6309) 2026-10-23T22:24:31.5158359Z Updating files: 62% (3912/6309) 2026-10-23T22:24:31.5183853Z Updating files: 63% (3975/6309) 2026-10-23T22:24:31.5218912Z Updating files: 64% (4038/6309) 2026-10-23T22:24:31.5244288Z Updating files: 65% (4101/6309) 2026-10-23T22:24:31.5263368Z Updating files: 66% (4164/6309) 2026-10-23T22:24:31.5291706Z Updating files: 67% (4228/6309) 2026-10-23T22:24:31.5307056Z Updating files: 68% (4291/6309) 2026-10-23T22:24:31.5329724Z Updating files: 69% (4354/6309) 2026-10-23T22:24:31.5343629Z Updating files: 70% (4417/6309) 2026-10-23T22:24:31.5361572Z Updating files: 71% (4480/6309) 2026-10-23T22:24:31.5381361Z Updating files: 72% (4543/6309) 2026-10-23T22:24:31.5412055Z Updating files: 73% (4606/6309) 2026-10-23T22:24:31.5697651Z Updating files: 74% (4669/6309) 2026-10-23T22:24:31.5896185Z Updating files: 75% (4732/6309) 2026-10-23T22:24:31.5919838Z Updating files: 76% (4795/6309) 2026-10-23T22:24:31.5942200Z Updating files: 77% (4858/6309) 2026-10-23T22:24:31.5970381Z Updating files: 78% (4922/6309) 2026-10-23T22:24:31.5990616Z Updating files: 79% (4985/6309) 2026-10-23T22:24:31.6008992Z Updating files: 80% (5048/6309) 2026-10-23T22:24:31.6029940Z Updating files: 81% (5111/6309) 2026-10-23T22:24:31.6052706Z Updating files: 82% (5174/6309) 2026-10-23T22:24:31.6071823Z Updating files: 83% (5237/6309) 2026-10-23T22:24:31.6094964Z Updating files: 84% (5300/6309) 2026-10-23T22:24:31.6116346Z Updating files: 85% (5363/6309) 2026-10-23T22:24:31.6140000Z Updating files: 86% (5426/6309) 2026-10-23T22:24:31.6217887Z Updating files: 87% (5489/6309) 2026-10-23T22:24:31.6252256Z Updating files: 88% (5552/6309) 2026-10-23T22:24:31.6270938Z Updating files: 89% (5616/6309) 2026-10-23T22:24:31.6299198Z Updating files: 90% (5679/6309) 2026-10-23T22:24:31.6338462Z Updating files: 91% (5742/6309) 2026-10-23T22:24:31.6355181Z Updating files: 92% (5805/6309) 2026-10-23T22:24:31.6373007Z Updating files: 93% (5868/6309) 2026-10-23T22:24:31.6397321Z Updating files: 94% (5931/6309) 2026-10-23T22:24:31.6423623Z Updating files: 95% (5994/6309) 2026-10-23T22:24:31.6483312Z Updating files: 96% (6057/6309) 2026-10-23T22:24:31.6511135Z Updating files: 97% (6120/6309) 2026-10-23T22:24:31.6562340Z Updating files: 98% (6183/6309) 2026-10-23T22:24:31.6583162Z Updating files: 99% (6246/6309) 2026-10-23T22:24:31.6583634Z Updating files: 100% (6309/6309) 2026-10-23T22:24:31.6583797Z Updating files: 100% (6309/6309), done. 2026-10-23T22:24:31.6768124Z Note: switching to 'refs/remotes/pull/24235/merge'. 2026-10-23T22:24:31.6768436Z 2026-10-23T22:24:31.6768662Z You are in 'detached HEAD' state. You can look around, make experimental 2026-10-23T22:24:31.6769056Z changes and commit them, and you can discard any commits you make in this 2026-10-23T22:24:31.6769451Z state without impacting any branches by switching back to a branch. 2026-10-23T22:24:31.6769680Z 2026-10-23T22:24:31.6769847Z If you want to create a new branch to retain commits you create, you may 2026-10-23T22:24:31.6770229Z do so (now or later) by using -c with the switch command. Example: 2026-10-23T22:24:31.6770447Z 2026-10-23T22:24:31.6770548Z git switch -c 2026-10-23T22:24:31.6770687Z 2026-10-23T22:24:31.6770783Z Or undo this operation with: 2026-10-23T22:24:31.6770925Z 2026-10-23T22:24:31.6771123Z git switch - 2026-10-23T22:24:31.6771246Z 2026-10-23T22:24:31.6771427Z Turn off this advice by setting config variable advice.detachedHead to false 2026-10-23T22:24:31.6771658Z 2026-10-23T22:24:31.6772054Z HEAD is now at 8958786 Merge 84d3cb55223275e0aab06f5a218087bdfe796461 into 9a391eb3f55b738113b61768cf2d8263b4f3ac2e 2026-10-23T22:24:31.6785451Z ##[endgroup] 2026-10-23T22:24:31.6835956Z [command]/usr/local/bin/git log -1 --format=%H 2026-10-23T22:24:31.6863770Z 895878664b33ae557bdb26dccfaf436c6a899a5a 2026-10-23T22:24:31.6986405Z ##[group]Run files="$(git ls-files .github/pr-assets)" 2026-10-23T22:24:31.6986710Z files="$(git ls-files .github/pr-assets)" 2026-10-23T22:24:31.6986910Z if test -n "$files"; then 2026-10-23T22:24:31.6987149Z  printf 'PR evidence must be uploaded to GitHub, not committed:\n%s\n' "$files" >&2 2026-10-23T22:24:31.6987367Z  exit 1 2026-10-23T22:24:31.6987486Z fi 2026-10-23T22:24:31.7001584Z shell: /usr/bin/bash -e {0} 2026-10-23T22:24:31.7001757Z env: 2026-10-23T22:24:31.7001926Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 193 2026-10-23T22:24:31.7002082Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 447 2026-10-23T22:24:31.7002241Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T22:24:31.7002384Z ##[endgroup] 2026-10-23T22:24:31.7240128Z Prepare all required actions 2026-10-23T22:24:31.7240811Z Getting action download info 2026-10-23T22:24:31.8376037Z Download action repository 'voidzero-dev/setup-vp@v1' (SHA:250f29ce396baf5e8f24498e17c0dfdebabc26eb) 2026-10-23T22:24:31.9557981Z ##[group]Run ./.github/actions/setup-ci-deps 2026-10-23T22:24:31.9558172Z env: 2026-10-23T22:24:31.9558306Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 193 2026-10-23T22:24:31.9558470Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 447 2026-10-23T22:24:31.9558637Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T22:24:31.9558785Z ##[endgroup] 2026-10-23T22:24:31.9661195Z ##[start-action display=Resolve Vite+ version;id=__self.vp] 2026-10-23T22:24:31.9680126Z ##[group]Run echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-23T22:24:31.9680696Z echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-23T22:24:31.9681029Z echo "node=$(jq -r '.engines.node' package.json)" >> "$GITHUB_OUTPUT" 2026-10-23T22:24:31.9681300Z echo "pnpm=$(jq -r '.packageManager' package.json)" >> "$GITHUB_OUTPUT" 2026-10-23T22:24:31.9693863Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T22:24:31.9694051Z env: 2026-10-23T22:24:31.9694184Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 193 2026-10-23T22:24:31.9694347Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 447 2026-10-23T22:24:31.9694508Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T22:24:31.9694663Z ##[endgroup] 2026-10-23T22:24:31.9789856Z ##[end-action id=__self.vp;outcome=success;conclusion=success;duration_ms=12] 2026-10-23T22:24:31.9792423Z ##[start-action display=Cache Vite+;id=__self.vp_cache] 2026-10-23T22:24:31.9848640Z ##[group]Run actions/cache@v6 2026-10-23T22:24:31.9848805Z with: 2026-10-23T22:24:31.9848929Z path: ~/.vite-plus 2026-10-23T22:24:31.9849114Z key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-23T22:24:31.9849337Z enableCrossOsArchive: false 2026-10-23T22:24:31.9849486Z fail-on-cache-miss: false 2026-10-23T22:24:31.9849625Z lookup-only: false 2026-10-23T22:24:31.9849751Z save-always: false 2026-10-23T22:24:31.9849883Z env: 2026-10-23T22:24:31.9850010Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 193 2026-10-23T22:24:31.9850187Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 447 2026-10-23T22:24:31.9850353Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T22:24:31.9850513Z ##[endgroup] 2026-10-23T22:24:32.2033644Z Cache hit for: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-23T22:24:32.6892917Z Received 170349591 of 170349591 (100.0%), 357.1 MBs/sec 2026-10-23T22:24:32.6893421Z Cache Size: ~162 MB (170349591 B) 2026-10-23T22:24:32.6927581Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/97a37973-b8f0-4227-bde3-fe4eec782da1/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-23T22:24:33.5483750Z Cache restored successfully 2026-10-23T22:24:33.6280694Z Cache restored from key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-23T22:24:33.6439262Z ##[end-action id=__self.vp_cache;outcome=success;conclusion=success;duration_ms=1664] 2026-10-23T22:24:33.6443034Z ##[start-action display=Use cached Vite+;id=__self.__run] 2026-10-23T22:24:33.6480597Z ##[group]Run echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-23T22:24:33.6480981Z echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-23T22:24:33.6481269Z "$HOME/.vite-plus/bin/vp" env use "26.12.1" 2026-10-23T22:24:33.6499204Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T22:24:33.6499472Z env: 2026-10-23T22:24:33.6499667Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 193 2026-10-23T22:24:33.6499896Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 447 2026-10-23T22:24:33.6500159Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T22:24:33.6500368Z ##[endgroup] 2026-10-23T22:24:33.6564551Z Using Node.js v26.12.1 (resolved from 26.12.1) 2026-10-23T22:24:33.6579853Z ##[end-action id=__self.__run;outcome=success;conclusion=success;duration_ms=13] 2026-10-23T22:24:33.6582784Z ##[start-action display=Setup Vite+;id=__self.__voidzero-dev_setup-vp] 2026-10-23T22:24:33.6591008Z ##[end-action id=__self.__voidzero-dev_setup-vp;outcome=skipped;conclusion=skipped;duration_ms=0] 2026-10-23T22:24:33.6593310Z ##[start-action display=Resolve pnpm store path;id=__self.pnpm_store] 2026-10-23T22:24:33.6640071Z ##[group]Run store_path="$(vp pm cache dir)" 2026-10-23T22:24:33.6640407Z store_path="$(vp pm cache dir)" 2026-10-23T22:24:33.6640697Z echo "path=$store_path" >> "$GITHUB_OUTPUT" 2026-10-23T22:24:33.6664237Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T22:24:33.6664539Z env: 2026-10-23T22:24:33.6664746Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 193 2026-10-23T22:24:33.6665281Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 447 2026-10-23T22:24:33.6665536Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T22:24:33.6665773Z ##[endgroup] 2026-10-23T22:24:33.6877077Z ##[end-action id=__self.pnpm_store;outcome=success;conclusion=success;duration_ms=28] 2026-10-23T22:24:33.6880416Z ##[start-action display=Cache full pnpm store;id=__self.__actions_cache] 2026-10-23T22:24:33.7676684Z ##[group]Run actions/cache@v6 2026-10-23T22:24:33.7676929Z with: 2026-10-23T22:24:33.7677154Z path: /home/runner/.local/share/pnpm/store/v11 2026-10-23T22:24:33.7677623Z key: pnpm-full-v1-Linux-X64-3cb0b4d7cff93dc8fe33f2ea73cac71ca25a36270fcb648b9b4a9320151012ef 2026-10-23T22:24:33.7678071Z restore-keys: pnpm-full-v1-Linux-X64- 2026-10-23T22:24:33.7678340Z enableCrossOsArchive: false 2026-10-23T22:24:33.7678571Z fail-on-cache-miss: false 2026-10-23T22:24:33.7678788Z lookup-only: false 2026-10-23T22:24:33.7678977Z save-always: false 2026-10-23T22:24:33.7679187Z env: 2026-10-23T22:24:33.7679373Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 193 2026-10-23T22:24:33.7679630Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 447 2026-10-23T22:24:33.7679870Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T22:24:33.7680078Z ##[endgroup] 2026-10-23T22:24:33.9847058Z Cache hit for: pnpm-full-v1-Linux-X64-3cb0b4d7cff93dc8fe33f2ea73cac71ca25a36270fcb648b9b4a9320151012ef 2026-10-23T22:24:35.0181635Z Received 478150656 of 994310451 (48.1%), 454.2 MBs/sec 2026-10-23T22:24:36.1200721Z Received 939524096 of 994310451 (94.5%), 425.5 MBs/sec 2026-10-23T22:24:36.2357296Z Received 994310451 of 994310451 (100.0%), 426.8 MBs/sec 2026-10-23T22:24:36.2359442Z Cache Size: ~948 MB (994310451 B) 2026-10-23T22:24:36.2432551Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/ca21d3d8-cbda-40df-ba81-3c816d89cde6/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-23T22:24:43.1377923Z Cache restored successfully 2026-10-23T22:24:43.1937944Z Cache restored from key: pnpm-full-v1-Linux-X64-3cb0b4d7cff93dc8fe33f2ea73cac71ca25a36270fcb648b9b4a9320151012ef 2026-10-23T22:24:43.2035999Z ##[end-action id=__self.__actions_cache;outcome=success;conclusion=success;duration_ms=9515] 2026-10-23T22:24:43.2038733Z ##[start-action display=Install dependencies;id=__self.__run_2] 2026-10-23T22:24:43.2053553Z ##[group]Run vp install 2026-10-23T22:24:43.2053743Z vp install 2026-10-23T22:24:43.2069296Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T22:24:43.2069500Z env: 2026-10-23T22:24:43.2069645Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 193 2026-10-23T22:24:43.2069822Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 447 2026-10-23T22:24:43.2069984Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T22:24:43.2070261Z ##[endgroup] 2026-10-23T22:24:43.2540014Z Scope: all 33 workspace projects 2026-10-23T22:24:43.4075155Z ? Verifying lockfile against supply-chain policies (2088 entries)... 2026-10-23T22:24:43.7968636Z Packages are hard linked from the content-addressable store to the virtual store. 2026-10-23T22:24:43.7969244Z Content-addressable store is at: /home/runner/.local/share/pnpm/store/v11 2026-10-23T22:24:43.7969622Z Virtual store is at: node_modules/.pnpm 2026-10-23T22:24:46.5762277Z ✓ Lockfile passes supply-chain policies (2088 entries in 3.2s) 2026-10-23T22:24:46.5762617Z Lockfile is up to date, resolution step is skipped 2026-10-23T22:24:46.6082634Z Packages: +1721 2026-10-23T22:24:46.6083137Z ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2026-10-23T22:24:46.7603888Z Progress: resolved 1721, reused 1718, downloaded 0, added 1721, done 2026-10-23T22:24:48.0327238Z . prepare$ vp config --no-agent 2026-10-23T22:24:48.2009988Z . prepare: Done 2026-10-23T22:24:48.2024526Z 2026-10-23T22:24:48.2024732Z devDependencies: 2026-10-23T22:24:48.2024980Z + @coderabbitai/config 1.1.0 2026-10-23T22:24:48.2025215Z + @shadcn/lint 0.1.5 2026-10-23T22:24:48.2025429Z + @types/node 24.12.4 2026-10-23T22:24:48.2025612Z + knip 6.34.0 2026-10-23T22:24:48.2025843Z + typescript <- @tsc-rs/typescript 0.8.0 2026-10-23T22:24:48.2026087Z + vite-plus 1.3.0 2026-10-23T22:24:48.2026203Z 2026-10-23T22:24:48.2042457Z Done in 5s using pnpm v12.14.0 2026-10-23T22:24:48.2288289Z ##[end-action id=__self.__run_2;outcome=success;conclusion=success;duration_ms=5024] 2026-10-23T22:24:48.2981077Z ##[group]Run actions/cache@v6 2026-10-23T22:24:48.2981410Z with: 2026-10-23T22:24:48.2981608Z path: ~/.cache/electron 2026-10-23T22:24:48.2981994Z key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-23T22:24:48.2982454Z enableCrossOsArchive: false 2026-10-23T22:24:48.2982697Z fail-on-cache-miss: false 2026-10-23T22:24:48.2982921Z lookup-only: false 2026-10-23T22:24:48.2983180Z save-always: false 2026-10-23T22:24:48.2983377Z env: 2026-10-23T22:24:48.2983559Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 193 2026-10-23T22:24:48.2983837Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 447 2026-10-23T22:24:48.2984090Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T22:24:48.2984337Z ##[endgroup] 2026-10-23T22:24:48.5456435Z Cache hit for: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-23T22:24:48.7839150Z Received 122906203 of 122906203 (100.0%), 532.8 MBs/sec 2026-10-23T22:24:48.7839772Z Cache Size: ~117 MB (122906203 B) 2026-10-23T22:24:48.7891265Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/fe7660b8-7039-48f8-92dd-1240e233b87d/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-23T22:24:48.8912865Z Cache restored successfully 2026-10-23T22:24:48.9125086Z Cache restored from key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-23T22:24:48.9279488Z ##[group]Run vp run --filter @t3tools/desktop ensure:electron 2026-10-23T22:24:48.9280060Z vp run --filter @t3tools/desktop ensure:electron 2026-10-23T22:24:48.9304948Z shell: /usr/bin/bash -e {0} 2026-10-23T22:24:48.9305204Z env: 2026-10-23T22:24:48.9305412Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 193 2026-10-23T22:24:48.9305702Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 447 2026-10-23T22:24:48.9305968Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T22:24:48.9306224Z ##[endgroup] 2026-10-23T22:24:49.1745795Z ~/apps/desktop$ node scripts/ensure-electron-runtime.mjs ⊘ cache disabled 2026-10-23T22:24:49.8542109Z /home/runner/_work/t3code/t3code/node_modules/.pnpm/electron@44.9.3_supports-color@8.1.1/node_modules/electron/dist/electron 2026-10-23T22:24:49.8564862Z 2026-10-23T22:24:49.8716913Z ##[group]Run vp run knip:check 2026-10-23T22:24:49.8717214Z vp run knip:check 2026-10-23T22:24:49.8734245Z shell: /usr/bin/bash -e {0} 2026-10-23T22:24:49.8734410Z env: 2026-10-23T22:24:49.8734555Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 193 2026-10-23T22:24:49.8734745Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 447 2026-10-23T22:24:49.8734916Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T22:24:49.8735074Z ##[endgroup] 2026-10-23T22:24:50.1040293Z $ knip --include files,dependencies --no-config-hints ⊘ cache disabled 2026-10-23T22:24:55.6188673Z 2026-10-23T22:24:55.6193424Z $ 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-23T22:25:08.6555391Z 2026-10-23T22:25:08.6556677Z --- 2026-10-23T22:25:08.6557118Z vp run: 2/2 successful. (Run `vp run --last-details` for full details) 2026-10-23T22:25:08.6657764Z ##[group]Run vp run --filter @t3tools/source-control-github generate --check 2026-10-23T22:25:08.6658119Z vp run --filter @t3tools/source-control-github generate --check 2026-10-23T22:25:08.6672431Z shell: /usr/bin/bash -e {0} 2026-10-23T22:25:08.6672607Z env: 2026-10-23T22:25:08.6672732Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 193 2026-10-23T22:25:08.6672885Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 447 2026-10-23T22:25:08.6673046Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T22:25:08.6673190Z ##[endgroup] 2026-10-23T22:25:08.9049622Z ~/packages/source-control-github$ graphqlgen --check ⊘ cache disabled 2026-10-23T22:25:09.1622197Z 2026-10-23T22:25:09.1722771Z ##[group]Run vp run --filter t3 generate --check 2026-10-23T22:25:09.1723162Z vp run --filter t3 generate --check 2026-10-23T22:25:09.1739423Z shell: /usr/bin/bash -e {0} 2026-10-23T22:25:09.1739602Z env: 2026-10-23T22:25:09.1739762Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 193 2026-10-23T22:25:09.1739944Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 447 2026-10-23T22:25:09.1740148Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T22:25:09.1740328Z ##[endgroup] 2026-10-23T22:25:09.3795938Z ~/apps/server$ graphqlgen --check ⊘ cache disabled 2026-10-23T22:25:09.6001226Z 2026-10-23T22:25:09.6097699Z ##[group]Run vp check 2026-10-23T22:25:09.6097886Z vp check 2026-10-23T22:25:09.6113613Z shell: /usr/bin/bash -e {0} 2026-10-23T22:25:09.6113799Z env: 2026-10-23T22:25:09.6113957Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 193 2026-10-23T22:25:09.6114146Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 447 2026-10-23T22:25:09.6114314Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T22:25:09.6114474Z ##[endgroup] 2026-10-23T22:25:10.4893773Z pass: All 5666 files are correctly formatted (623ms, 8 threads) 2026-10-23T22:25:17.8605516Z warn: Lint warnings found 2026-10-23T22:25:17.8606716Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T22:25:17.8607208Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:400:5] 2026-10-23T22:25:17.8607447Z 398 │ 2026-10-23T22:25:17.8607606Z 399 │ useEffect(() => { 2026-10-23T22:25:17.8607818Z ·  ────┬──── 2026-10-23T22:25:17.8608080Z · ╰── This is the containing effect 2026-10-23T22:25:17.8608346Z 400 │ setInspectorSelection((current) => { 2026-10-23T22:25:17.8608579Z ·  ──────────┬────────── 2026-10-23T22:25:17.8608890Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.8609236Z 401 │ if (props.renderInspector === undefined) { 2026-10-23T22:25:17.8609443Z ╰──── 2026-10-23T22:25:17.8610165Z  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-23T22:25:17.8611173Z  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-23T22:25:17.8611576Z 2026-10-23T22:25:17.8611843Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-23T22:25:17.8612242Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:528:24] 2026-10-23T22:25:17.8612610Z 527 │ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top; 2026-10-23T22:25:17.8612981Z 528 │ ╭─▶ const GitInspector = () => ( 2026-10-23T22:25:17.8613271Z 529 │ │ 2026-10-23T22:25:17.8614642Z 534 │ ╰─▶ ); 2026-10-23T22:25:17.8614906Z 535 │ const FilesInspector = () => 2026-10-23T22:25:17.8615077Z ╰──── 2026-10-23T22:25:17.8615387Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-23T22:25:17.8615633Z 2026-10-23T22:25:17.8615869Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-23T22:25:17.8616260Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:535:26] 2026-10-23T22:25:17.8616497Z 534 │ ); 2026-10-23T22:25:17.8616756Z 535 │ ╭─▶ const FilesInspector = () => 2026-10-23T22:25:17.8617648Z 536 │ │ selectedThread !== null && selectedThreadCwd !== null ? ( 2026-10-23T22:25:17.8617934Z 537 │ │ 2026-10-23T22:25:17.8620310Z 545 │ ╰─▶ ) : null; 2026-10-23T22:25:17.8620628Z 546 │ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset); 2026-10-23T22:25:17.8620856Z ╰──── 2026-10-23T22:25:17.8621158Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-23T22:25:17.8621428Z 2026-10-23T22:25:17.8621616Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T22:25:17.8621955Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:372:47] 2026-10-23T22:25:17.8622258Z 371 │ const { open, onOpenChange, onSnooze, timestampFormat } = props; 2026-10-23T22:25:17.8622576Z 372 │ const presets = open ? resolveSnoozePresets(new Date(), timestampFormat) : []; 2026-10-23T22:25:17.8622877Z ·  ─────┬──── 2026-10-23T22:25:17.8623186Z · ╰── Cannot call impure function 2026-10-23T22:25:17.8623414Z 373 │ return ( 2026-10-23T22:25:17.8623549Z ╰──── 2026-10-23T22:25:17.8623918Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T22:25:17.8624531Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T22:25:17.8624835Z 2026-10-23T22:25:17.8625013Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T22:25:17.8625353Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:853:39] 2026-10-23T22:25:17.8625619Z 852 │ if (snoozeGateClock.thread !== thread) { 2026-10-23T22:25:17.8625886Z 853 │ setSnoozeGateClock({ thread, now: new Date().toISOString() }); 2026-10-23T22:25:17.8626167Z ·  ─────┬──── 2026-10-23T22:25:17.8626477Z · ╰── Cannot call impure function 2026-10-23T22:25:17.8626702Z 854 │ } 2026-10-23T22:25:17.8626828Z ╰──── 2026-10-23T22:25:17.8627184Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T22:25:17.8627778Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T22:25:17.8628076Z 2026-10-23T22:25:17.8628354Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T22:25:17.8628772Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:68:5] 2026-10-23T22:25:17.8629040Z 66 │ const { id: attachmentId, fileUri } = attachment; 2026-10-23T22:25:17.8629325Z 67 │ useEffect(() => { 2026-10-23T22:25:17.8629541Z ·  ────┬──── 2026-10-23T22:25:17.8629769Z · ╰── This is the containing effect 2026-10-23T22:25:17.8629986Z 68 │ setUri(null); 2026-10-23T22:25:17.8630276Z ·  ───┬── 2026-10-23T22:25:17.8630556Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.8630799Z 69 │ setError(null); 2026-10-23T22:25:17.8630947Z ╰──── 2026-10-23T22:25:17.8631677Z  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-23T22:25:17.8632597Z  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-23T22:25:17.8632928Z 2026-10-23T22:25:17.8633143Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T22:25:17.8633506Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:91:7] 2026-10-23T22:25:17.8633724Z 90 │ }; 2026-10-23T22:25:17.8633886Z 91 │ }, [attachmentId, fileUri]); 2026-10-23T22:25:17.8634122Z ·  ──────┬───── ───┬─── 2026-10-23T22:25:17.8634458Z · │ ╰── Unnecessary dependency `fileUri` 2026-10-23T22:25:17.8634795Z · ╰── Unnecessary dependency `attachmentId` 2026-10-23T22:25:17.8635115Z 92 │ const mimeType = videoMimeType(attachment) ?? attachment.mimeType; 2026-10-23T22:25:17.8635330Z ╰──── 2026-10-23T22:25:17.8635701Z  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-23T22:25:17.8636331Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.8636651Z 2026-10-23T22:25:17.8636881Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T22:25:17.8637253Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:213:34] 2026-10-23T22:25:17.8637494Z 212 │ useEffect(() => { 2026-10-23T22:25:17.8637706Z 213 │ if (!isFocused && hasSource) props.onRequestClose(); 2026-10-23T22:25:17.8637960Z ·  ──┬── 2026-10-23T22:25:17.8638246Z · ╰── Missing dependency `props` 2026-10-23T22:25:17.8638523Z 214 │ }, [isFocused, hasSource, props.onRequestClose]); 2026-10-23T22:25:17.8638775Z ·  ──────────┬───────── 2026-10-23T22:25:17.8639153Z · ╰── Overly precise dependency `props.onRequestClose`, use `props` instead 2026-10-23T22:25:17.8639464Z 215 │ const { source } = props; 2026-10-23T22:25:17.8639623Z ╰──── 2026-10-23T22:25:17.8640151Z  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-23T22:25:17.8641067Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.8641506Z 2026-10-23T22:25:17.8641738Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-23T22:25:17.8642077Z ╭─[apps/mobile/src/Stack.tsx:1052:21] 2026-10-23T22:25:17.8642275Z 1051 │ } 2026-10-23T22:25:17.8642819Z ·  ───────────────────────────────────────────── 2026-10-23T22:25:17.8643047Z 1053 │ screenListeners={{ 2026-10-23T22:25:17.8643202Z ╰──── 2026-10-23T22:25:17.8643665Z  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-23T22:25:17.8644028Z 2026-10-23T22:25:17.8644257Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T22:25:17.8644668Z ╭─[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:370:7] 2026-10-23T22:25:17.8644946Z 369 │ mountedRef.current = false; 2026-10-23T22:25:17.8645141Z 370 │ flow.setBranchQuery(""); 2026-10-23T22:25:17.8645331Z ·  ──┬─ 2026-10-23T22:25:17.8645557Z · ╰── Missing dependency `flow` 2026-10-23T22:25:17.8645763Z 371 │ }; 2026-10-23T22:25:17.8645916Z 372 │ }, [flow.setBranchQuery]); 2026-10-23T22:25:17.8646118Z ·  ─────────┬───────── 2026-10-23T22:25:17.8646449Z · ╰── Overly precise dependency `flow.setBranchQuery`, use `flow` instead 2026-10-23T22:25:17.8646719Z 373 │ 2026-10-23T22:25:17.8646843Z ╰──── 2026-10-23T22:25:17.8647350Z  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-23T22:25:17.8648088Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.8648403Z 2026-10-23T22:25:17.8648682Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T22:25:17.8649096Z ╭─[packages/provider-opencode/src/server/adapter.ts:3755:7] 2026-10-23T22:25:17.8649323Z 3754 │ 2026-10-23T22:25:17.8649621Z 3755 │ const layer: Layer.Layer = 2026-10-23T22:25:17.8649920Z ·  ──┬── 2026-10-23T22:25:17.8650150Z · ╰── 'layer' is declared here 2026-10-23T22:25:17.8650473Z 3756 │ Layer.effect( 2026-10-23T22:25:17.8650627Z ╰──── 2026-10-23T22:25:17.8650816Z  help: Consider removing this declaration. 2026-10-23T22:25:17.8650947Z 2026-10-23T22:25:17.8651223Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T22:25:17.8651705Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-23T22:25:17.8652042Z 259 │ .join("|"); 2026-10-23T22:25:17.8652250Z 260 │ useEffect(() => { 2026-10-23T22:25:17.8652420Z ·  ────┬──── 2026-10-23T22:25:17.8652655Z · ╰── This is the containing effect 2026-10-23T22:25:17.8652866Z 261 │ stop(); 2026-10-23T22:25:17.8653026Z ·  ──┬─ 2026-10-23T22:25:17.8653308Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.8653559Z 262 │ }, [orderVersion]); 2026-10-23T22:25:17.8653709Z ╰──── 2026-10-23T22:25:17.8654415Z  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-23T22:25:17.8655329Z  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-23T22:25:17.8655655Z 2026-10-23T22:25:17.8655887Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T22:25:17.8656281Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-23T22:25:17.8656535Z 260 │ useEffect(() => { 2026-10-23T22:25:17.8656691Z 261 │ stop(); 2026-10-23T22:25:17.8656845Z ·  ──┬─ 2026-10-23T22:25:17.8657070Z · ╰── Missing dependency `stop` 2026-10-23T22:25:17.8657285Z 262 │ }, [orderVersion]); 2026-10-23T22:25:17.8657464Z ·  ──────┬───── 2026-10-23T22:25:17.8657732Z · ╰── Unnecessary dependency `orderVersion` 2026-10-23T22:25:17.8657965Z 263 │ useEffect( 2026-10-23T22:25:17.8658101Z ╰──── 2026-10-23T22:25:17.8658616Z  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-23T22:25:17.8659348Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.8659664Z 2026-10-23T22:25:17.8659823Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.8660236Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9] 2026-10-23T22:25:17.8660663Z 95 │ const latest = useRef(props); 2026-10-23T22:25:17.8660906Z 96 │ latest.current = props; 2026-10-23T22:25:17.8661127Z ·  ───┬──────┬─── 2026-10-23T22:25:17.8662088Z · │ ╰── Cannot update ref value during render 2026-10-23T22:25:17.8662405Z · ╰── This value is a ref 2026-10-23T22:25:17.8662616Z 97 │ const gesture = useMemo( 2026-10-23T22:25:17.8662776Z ╰──── 2026-10-23T22:25:17.8663348Z  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-23T22:25:17.8664203Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.8664538Z 2026-10-23T22:25:17.8664707Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.8665050Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18] 2026-10-23T22:25:17.8665300Z 103 │ .runOnJS(true) 2026-10-23T22:25:17.8665517Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-23T22:25:17.8665772Z ·  ───────────────┬────────────── 2026-10-23T22:25:17.8666128Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T22:25:17.8666480Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-23T22:25:17.8666700Z ╰──── 2026-10-23T22:25:17.8667262Z  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-23T22:25:17.8668038Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.8668337Z 2026-10-23T22:25:17.8668500Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.8668835Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19] 2026-10-23T22:25:17.8669125Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-23T22:25:17.8669395Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-23T22:25:17.8669711Z ·  ──────────────────────────┬───────────────────────── 2026-10-23T22:25:17.8670089Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T22:25:17.8670782Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-23T22:25:17.8670992Z ╰──── 2026-10-23T22:25:17.8691266Z  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-23T22:25:17.8692135Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.8692443Z 2026-10-23T22:25:17.8692758Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.8693165Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16] 2026-10-23T22:25:17.8693509Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-23T22:25:17.8693811Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-23T22:25:17.8694128Z ·  ──────────────────────────┬───────────────────────── 2026-10-23T22:25:17.8694505Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T22:25:17.8694861Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-23T22:25:17.8695071Z ╰──── 2026-10-23T22:25:17.8695655Z  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-23T22:25:17.8696431Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.8696730Z 2026-10-23T22:25:17.8696891Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.8697227Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21] 2026-10-23T22:25:17.8697545Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-23T22:25:17.8697825Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-23T22:25:17.8698133Z ·  ───────────────────────┬────────────────────── 2026-10-23T22:25:17.8698508Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T22:25:17.8698804Z 108 │ [props.disabled], 2026-10-23T22:25:17.8698961Z ╰──── 2026-10-23T22:25:17.8699528Z  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-23T22:25:17.8700289Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.8700590Z 2026-10-23T22:25:17.8700752Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.8701094Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:249:9] 2026-10-23T22:25:17.8701442Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-23T22:25:17.8701700Z 249 │ latest.current = { rows, planners, moveThread }; 2026-10-23T22:25:17.8701951Z ·  ───┬──────┬─── 2026-10-23T22:25:17.8702272Z · │ ╰── Cannot update ref value during render 2026-10-23T22:25:17.8702584Z · ╰── This value is a ref 2026-10-23T22:25:17.8702776Z 250 │ 2026-10-23T22:25:17.8702901Z ╰──── 2026-10-23T22:25:17.8703466Z  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-23T22:25:17.8704350Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.8704689Z 2026-10-23T22:25:17.8704851Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.8705192Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:247:22] 2026-10-23T22:25:17.8705503Z 246 │ const [preview, setPreview] = useState(null); 2026-10-23T22:25:17.8705775Z 247 │ const translateY = useRef(new Animated.Value(0)).current; 2026-10-23T22:25:17.8706054Z ·  ──────────────────┬────────────────── 2026-10-23T22:25:17.8706378Z · ╰── Cannot access ref value during render 2026-10-23T22:25:17.8706679Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-23T22:25:17.8706876Z ╰──── 2026-10-23T22:25:17.8707445Z  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-23T22:25:17.8708209Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.8708503Z 2026-10-23T22:25:17.8708689Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T22:25:17.8709044Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:324:16] 2026-10-23T22:25:17.8709296Z 323 │ update(0); 2026-10-23T22:25:17.8709482Z 324 │ let last = performance.now(); 2026-10-23T22:25:17.8709704Z ·  ────────┬──────── 2026-10-23T22:25:17.8709971Z · ╰── Cannot call impure function 2026-10-23T22:25:17.8710286Z 325 │ const tick = () => { 2026-10-23T22:25:17.8710434Z ╰──── 2026-10-23T22:25:17.8710817Z  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-23T22:25:17.8711479Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T22:25:17.8711893Z 2026-10-23T22:25:17.8712099Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-23T22:25:17.8712570Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15] 2026-10-23T22:25:17.8712911Z  98 │ () => 2026-10-23T22:25:17.8713109Z  99 │ Gesture.Pan() 2026-10-23T22:25:17.8713292Z ·  ─┬─ 2026-10-23T22:25:17.8713544Z · ╰── `Pan` may be a component 2026-10-23T22:25:17.8713785Z 100 │ .enabled(!props.disabled) 2026-10-23T22:25:17.8713948Z ╰──── 2026-10-23T22:25:17.8714304Z  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-23T22:25:17.8715060Z  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-23T22:25:17.8715486Z 2026-10-23T22:25:17.8715795Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-23T22:25:17.8716220Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5] 2026-10-23T22:25:17.8716474Z 103 │ .runOnJS(true) 2026-10-23T22:25:17.8716680Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-23T22:25:17.8716905Z ·  ───┬── 2026-10-23T22:25:17.8717485Z · ╰── 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-23T22:25:17.8718045Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-23T22:25:17.8718352Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-23T22:25:17.8718642Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-23T22:25:17.8718865Z 108 │ [props.disabled], 2026-10-23T22:25:17.8719056Z ·  ────────┬─────── 2026-10-23T22:25:17.8719364Z · ╰── This dependency list is missing values used by the callback 2026-10-23T22:25:17.8719629Z 109 │ ); 2026-10-23T22:25:17.8719757Z ╰──── 2026-10-23T22:25:17.8720045Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-23T22:25:17.8720603Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.8720926Z 2026-10-23T22:25:17.8721120Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T22:25:17.8721826Z ╭─[packages/provider-opencode/src/server/OpenCodeRuntime.environment.test.ts:53:14] 2026-10-23T22:25:17.8722240Z 52 │ 2026-10-23T22:25:17.8722391Z 53 │ for (const {} of [ 2026-10-23T22:25:17.8722586Z ·  ── 2026-10-23T22:25:17.8722767Z 54 │ { healthy: true }, 2026-10-23T22:25:17.8722925Z ╰──── 2026-10-23T22:25:17.8723247Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T22:25:17.8723496Z 2026-10-23T22:25:17.8723927Z ⚠ 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-23T22:25:17.8724464Z ╭─[apps/server/src/auth/RpcAuthorization.ts:236:17] 2026-10-23T22:25:17.8724782Z 235 │ const requiredScopesForSettingsUpdate = (payload: unknown) => { 2026-10-23T22:25:17.8725094Z 236 │ const input = Schema.decodeUnknownSync(SettingsUpdate)(payload); 2026-10-23T22:25:17.8725375Z ·  ──────────────────────── 2026-10-23T22:25:17.8725662Z 237 │ const scopes = requiredScopesForServerSettingsPatch(input.patch); 2026-10-23T22:25:17.8725882Z ╰──── 2026-10-23T22:25:17.8725950Z 2026-10-23T22:25:17.8726353Z ⚠ 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-23T22:25:17.8726852Z ╭─[apps/server/src/auth/RpcAuthorization.ts:255:26] 2026-10-23T22:25:17.8727117Z 254 │ if (method === WS_METHODS.assetsCreateUrl) { 2026-10-23T22:25:17.8727573Z 255 │ const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload); 2026-10-23T22:25:17.8727934Z ·  ──────────────────────── 2026-10-23T22:25:17.8728136Z 256 │ return [ 2026-10-23T22:25:17.8728283Z ╰──── 2026-10-23T22:25:17.8728350Z 2026-10-23T22:25:17.8728714Z ⚠ 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-23T22:25:17.8729206Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:50:18] 2026-10-23T22:25:17.8729545Z 49 │ for (const tool of ["sendMessage", "followupTask", "interruptAgent", "listAgents"]) { 2026-10-23T22:25:17.8729916Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-23T22:25:17.8730203Z ·  ───────── 2026-10-23T22:25:17.8730521Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-23T22:25:17.8730781Z ╰──── 2026-10-23T22:25:17.8730852Z 2026-10-23T22:25:17.8731216Z ⚠ 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-23T22:25:17.8731740Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:51:18] 2026-10-23T22:25:17.8732084Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-23T22:25:17.8732460Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-23T22:25:17.8732749Z ·  ───────── 2026-10-23T22:25:17.8732916Z 52 │ } 2026-10-23T22:25:17.8733041Z ╰──── 2026-10-23T22:25:17.8733102Z 2026-10-23T22:25:17.8733468Z ⚠ 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-23T22:25:17.8733953Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:55:5] 2026-10-23T22:25:17.8734186Z 54 │ assert.equal( 2026-10-23T22:25:17.8734460Z 55 │ Schema.is(CodexSchema.ServerNotification__CollabAgentToolCallStatus)("interrupted"), 2026-10-23T22:25:17.8734728Z ·  ───────── 2026-10-23T22:25:17.8734893Z 56 │ true, 2026-10-23T22:25:17.8735032Z ╰──── 2026-10-23T22:25:17.8735095Z 2026-10-23T22:25:17.8735448Z ⚠ 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-23T22:25:17.8736012Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:59:5] 2026-10-23T22:25:17.8736282Z 58 │ assert.equal( 2026-10-23T22:25:17.8736567Z 59 │ Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentToolCallStatus)("interrupted"), 2026-10-23T22:25:17.8736842Z ·  ───────── 2026-10-23T22:25:17.8737005Z 60 │ true, 2026-10-23T22:25:17.8737136Z ╰──── 2026-10-23T22:25:17.8737198Z 2026-10-23T22:25:17.8737552Z ⚠ 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-23T22:25:17.8738035Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:103:16] 2026-10-23T22:25:17.8738267Z 102 │ 2026-10-23T22:25:17.8738508Z 103 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse)(resumeResponse), true); 2026-10-23T22:25:17.8738799Z ·  ───────── 2026-10-23T22:25:17.8738968Z 104 │ }); 2026-10-23T22:25:17.8739092Z ╰──── 2026-10-23T22:25:17.8739157Z 2026-10-23T22:25:17.8739329Z ⚠ react(immutability): This value cannot be modified 2026-10-23T22:25:17.8739654Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:174:5] 2026-10-23T22:25:17.8739981Z 170 │ const expandedAngle = props.collapsedDirection === "right" ? 90 : 180; 2026-10-23T22:25:17.8740293Z 171 │ const rotation = useSharedValue(props.expanded ? expandedAngle : 0); 2026-10-23T22:25:17.8740544Z ·  ────┬─── 2026-10-23T22:25:17.8740793Z · ╰── `rotation` originates here 2026-10-23T22:25:17.8741008Z 172 │ 2026-10-23T22:25:17.8741154Z 173 │ useLayoutEffect(() => { 2026-10-23T22:25:17.8741445Z 174 │ rotation.value = withTiming(props.expanded ? expandedAngle : 0, { 2026-10-23T22:25:17.8741692Z ·  ────┬─── 2026-10-23T22:25:17.8741934Z · ╰── `rotation` cannot be modified 2026-10-23T22:25:17.8742190Z 175 │ duration: THREAD_DISCLOSURE_TRANSITION_MS, 2026-10-23T22:25:17.8742374Z ╰──── 2026-10-23T22:25:17.8742727Z  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-23T22:25:17.8743336Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T22:25:17.8743654Z 2026-10-23T22:25:17.8743868Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T22:25:17.8744248Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:1246:23] 2026-10-23T22:25:17.8744491Z 1245 │ Promise.resolve()); 2026-10-23T22:25:17.8754251Z 225 │ │ const pending = backgroundRuntime.pending.shift(); 2026-10-23T22:25:17.8754521Z 226 │ │ if (!pending) { 2026-10-23T22:25:17.8754748Z 227 │ │ idlePasses++; 2026-10-23T22:25:17.8754987Z 228 │ │ if (idlePasses >= 3) { 2026-10-23T22:25:17.8755218Z 229 │ │ return; 2026-10-23T22:25:17.8755421Z 230 │ │ } 2026-10-23T22:25:17.8755625Z 231 │ │ continue; 2026-10-23T22:25:17.8755820Z 232 │ │ } 2026-10-23T22:25:17.8756029Z 233 │ │ idlePasses = 0; 2026-10-23T22:25:17.8756280Z 234 │ │ const exit = yield* Effect.exit( 2026-10-23T22:25:17.8756662Z 235 │ │ pending.operation as Effect.Effect, 2026-10-23T22:25:17.8756972Z 236 │ │ ); 2026-10-23T22:25:17.8757196Z 237 │ │ yield* Effect.sync(() => { 2026-10-23T22:25:17.8757445Z 238 │ │ pending.resolve(exit); 2026-10-23T22:25:17.8757656Z 239 │ │ }); 2026-10-23T22:25:17.8757906Z 240 │ ╰─▶ } 2026-10-23T22:25:17.8758121Z 241 │ }, 2026-10-23T22:25:17.8758256Z ╰──── 2026-10-23T22:25:17.8758371Z 2026-10-23T22:25:17.8758658Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T22:25:17.8759247Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:285:5] 2026-10-23T22:25:17.8759614Z 283 │ const [snoozeWakeTick, bumpSnoozeWakeTick] = useState(0); 2026-10-23T22:25:17.8759840Z 284 │ useEffect(() => { 2026-10-23T22:25:17.8760016Z ·  ────┬──── 2026-10-23T22:25:17.8760264Z · ╰── This is the containing effect 2026-10-23T22:25:17.8760509Z 285 │ setNow(new Date().toISOString()); 2026-10-23T22:25:17.8760704Z ·  ───┬── 2026-10-23T22:25:17.8760982Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.8761314Z 286 │ const id = setInterval(() => setNow(new Date().toISOString()), 60_000); 2026-10-23T22:25:17.8761586Z ╰──── 2026-10-23T22:25:17.8762310Z  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-23T22:25:17.8763240Z  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-23T22:25:17.8763566Z 2026-10-23T22:25:17.8763790Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T22:25:17.8764184Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:365:25] 2026-10-23T22:25:17.8764517Z 364 │ // range) the boundary string is identical and the chain would die. 2026-10-23T22:25:17.8764779Z 365 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-23T22:25:17.8765019Z ·  ───────┬────── 2026-10-23T22:25:17.8765330Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-23T22:25:17.8765629Z 366 │ const listItems = ((): readonly SidebarListItem[] => { 2026-10-23T22:25:17.8765825Z ╰──── 2026-10-23T22:25:17.8766198Z  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-23T22:25:17.8766819Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.8767132Z 2026-10-23T22:25:17.8767317Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T22:25:17.8767681Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:356:53] 2026-10-23T22:25:17.8768004Z 355 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-23T22:25:17.8768320Z 356 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-23T22:25:17.8768622Z ·  ─────┬──── 2026-10-23T22:25:17.8768936Z · ╰── Cannot call impure function 2026-10-23T22:25:17.8769197Z 357 │ const id = setTimeout(() => { 2026-10-23T22:25:17.8769359Z ╰──── 2026-10-23T22:25:17.8769722Z  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-23T22:25:17.8770431Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T22:25:17.8770773Z 2026-10-23T22:25:17.8771051Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T22:25:17.8771525Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:215:7] 2026-10-23T22:25:17.8771773Z 211 │ }; 2026-10-23T22:25:17.8771914Z 212 │ useEffect(() => { 2026-10-23T22:25:17.8772089Z ·  ────┬──── 2026-10-23T22:25:17.8772329Z · ╰── This is the containing effect 2026-10-23T22:25:17.8772660Z 213 │ const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null; 2026-10-23T22:25:17.8772923Z 214 │ if (inserted) { 2026-10-23T22:25:17.8773094Z 215 │ setSelection((current) => 2026-10-23T22:25:17.8773293Z ·  ──────┬───── 2026-10-23T22:25:17.8773581Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.8773950Z 216 │ current.start === inserted.start && current.end === inserted.end ? current : inserted, 2026-10-23T22:25:17.8774190Z ╰──── 2026-10-23T22:25:17.8774889Z  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-23T22:25:17.8775804Z  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-23T22:25:17.8776135Z 2026-10-23T22:25:17.8776411Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T22:25:17.8776846Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:296:7] 2026-10-23T22:25:17.8777113Z 284 │ }, [hasWorkspaceSnapshot]); 2026-10-23T22:25:17.8777294Z 285 │ useEffect(() => { 2026-10-23T22:25:17.8777462Z ·  ────┬──── 2026-10-23T22:25:17.8777692Z · ╰── This is the containing effect 2026-10-23T22:25:17.8777994Z 286 │ if (!environmentId || !projectCwd || !selectedProviderInstanceId) return; 2026-10-23T22:25:17.8778314Z 287 │ const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`; 2026-10-23T22:25:17.8778559Z 288 │ const now = Date.now(); 2026-10-23T22:25:17.8778783Z 289 │ const lastRequest = workspaceRefreshKeyRef.current; 2026-10-23T22:25:17.8778985Z 290 │ if ( 2026-10-23T22:25:17.8779149Z 291 │ lastRequest?.key === key && 2026-10-23T22:25:17.8779405Z 292 │ now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS 2026-10-23T22:25:17.8779630Z 293 │ ) 2026-10-23T22:25:17.8779767Z 294 │ return; 2026-10-23T22:25:17.8780037Z 295 │ if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) { 2026-10-23T22:25:17.8780324Z 296 │ setWorkspaceRefreshRetry(null); 2026-10-23T22:25:17.8780542Z ·  ────────────┬─────────── 2026-10-23T22:25:17.8780845Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.8781094Z 297 │ return; 2026-10-23T22:25:17.8781230Z ╰──── 2026-10-23T22:25:17.8782035Z  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-23T22:25:17.8782989Z  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-23T22:25:17.8783312Z 2026-10-23T22:25:17.8783529Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T22:25:17.8783912Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:326:5] 2026-10-23T22:25:17.8784153Z 325 │ }, [ 2026-10-23T22:25:17.8784294Z 326 │ draftMessage, 2026-10-23T22:25:17.8784472Z ·  ──────┬───── 2026-10-23T22:25:17.8784729Z · ╰── Unnecessary dependency `draftMessage` 2026-10-23T22:25:17.8784957Z 327 │ environmentId, 2026-10-23T22:25:17.8785103Z ╰──── 2026-10-23T22:25:17.8785474Z  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-23T22:25:17.8786092Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.8786406Z 2026-10-23T22:25:17.8786564Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.8786894Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:122:38] 2026-10-23T22:25:17.8787249Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-23T22:25:17.8787565Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-23T22:25:17.8787844Z ·  ───────────┬────────── 2026-10-23T22:25:17.8788181Z · ╰── Cannot access ref value during render 2026-10-23T22:25:17.8788482Z 123 │ const sessionRef = useRef(null); 2026-10-23T22:25:17.8788680Z ╰──── 2026-10-23T22:25:17.8789236Z  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-23T22:25:17.8790062Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.8790518Z 2026-10-23T22:25:17.8790676Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.8791025Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8] 2026-10-23T22:25:17.8791283Z 125 │ 2026-10-23T22:25:17.8791503Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T22:25:17.8791730Z ·  ─────────┬──────── 2026-10-23T22:25:17.8792001Z · ╰── Cannot access ref value during render 2026-10-23T22:25:17.8792272Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-23T22:25:17.8792456Z ╰──── 2026-10-23T22:25:17.8793014Z  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-23T22:25:17.8793782Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.8794077Z 2026-10-23T22:25:17.8794232Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.8794562Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7] 2026-10-23T22:25:17.8794793Z 125 │ 2026-10-23T22:25:17.8794976Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T22:25:17.8795199Z ·  ─────────┬───────── 2026-10-23T22:25:17.8795473Z · ╰── Cannot access ref value during render 2026-10-23T22:25:17.8795743Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-23T22:25:17.8795919Z ╰──── 2026-10-23T22:25:17.8796474Z  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-23T22:25:17.8797224Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.8797520Z 2026-10-23T22:25:17.8797677Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.8798007Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31] 2026-10-23T22:25:17.8798240Z 125 │ 2026-10-23T22:25:17.8798424Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T22:25:17.8798687Z ·  ─────────┬───────── 2026-10-23T22:25:17.8798995Z · ╰── Cannot access ref value during render 2026-10-23T22:25:17.8799284Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-23T22:25:17.8799467Z ╰──── 2026-10-23T22:25:17.8800026Z  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-23T22:25:17.8800781Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.8801077Z 2026-10-23T22:25:17.8801317Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.8801738Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30] 2026-10-23T22:25:17.8801974Z 125 │ 2026-10-23T22:25:17.8802152Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T22:25:17.8802410Z ·  ──────────┬───────── 2026-10-23T22:25:17.8802716Z · ╰── Cannot access ref value during render 2026-10-23T22:25:17.8803002Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-23T22:25:17.8803182Z ╰──── 2026-10-23T22:25:17.8803746Z  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-23T22:25:17.8804508Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.8804805Z 2026-10-23T22:25:17.8804962Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.8805291Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46] 2026-10-23T22:25:17.8805594Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T22:25:17.8805939Z 127 │ ╭─▶ const recorder = createLazyVoiceRecorder({ 2026-10-23T22:25:17.8806334Z 128 │ │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-23T22:25:17.8806666Z 129 │ │ onStatus: (status: RecordingStatus) => { 2026-10-23T22:25:17.8806995Z 130 │ │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-23T22:25:17.8807296Z 131 │ │ isFinished: status.isFinished, 2026-10-23T22:25:17.8807631Z 132 │ │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-23T22:25:17.8807930Z 133 │ │ error: status.error, 2026-10-23T22:25:17.8808167Z 134 │ │ url: status.url, 2026-10-23T22:25:17.8808378Z 135 │ │ }); 2026-10-23T22:25:17.8808575Z 136 │ │ }, 2026-10-23T22:25:17.8808890Z 137 │ │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-23T22:25:17.8809225Z 138 │ │ selectInput: (inputs) => { 2026-10-23T22:25:17.8809528Z 139 │ │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-23T22:25:17.8809858Z 140 │ │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-23T22:25:17.8810197Z 141 │ │ const known = microphoneOrder(preferences.value.microphones); 2026-10-23T22:25:17.8810529Z 142 │ │ const order = rememberMicrophones(known, inputs); 2026-10-23T22:25:17.8810798Z 143 │ │ if (order !== known) { 2026-10-23T22:25:17.8811073Z 144 │ │ registry.set(updateMobilePreferencesAtom, { 2026-10-23T22:25:17.8811383Z 145 │ │ transform: (current) => ({ 2026-10-23T22:25:17.8811819Z 146 │ │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-23T22:25:17.8812174Z 147 │ │ }), 2026-10-23T22:25:17.8812376Z 148 │ │ }); 2026-10-23T22:25:17.8812573Z 149 │ │ } 2026-10-23T22:25:17.8812833Z 150 │ │ return preferredMicrophoneInput(inputs, order); 2026-10-23T22:25:17.8813081Z 151 │ │ }, 2026-10-23T22:25:17.8813331Z 152 │ ├─▶ }); 2026-10-23T22:25:17.8813747Z · ╰──── Passing a ref to a function may read its value during render 2026-10-23T22:25:17.8814081Z 153 │ recorderRef.current = recorder; 2026-10-23T22:25:17.8814255Z ╰──── 2026-10-23T22:25:17.8814825Z  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-23T22:25:17.8815594Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.8815894Z 2026-10-23T22:25:17.8816049Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.8816384Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16] 2026-10-23T22:25:17.8816624Z 152 │ }); 2026-10-23T22:25:17.8816790Z 153 │ recorderRef.current = recorder; 2026-10-23T22:25:17.8817027Z ·  ─────┬─────────┬─── 2026-10-23T22:25:17.8817365Z · │ ╰── Cannot update ref value during render 2026-10-23T22:25:17.8817683Z · ╰── This value is a ref 2026-10-23T22:25:17.8817936Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-23T22:25:17.8818123Z ╰──── 2026-10-23T22:25:17.8818680Z  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-23T22:25:17.8819441Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.8819736Z 2026-10-23T22:25:17.8819901Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.8820234Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48] 2026-10-23T22:25:17.8820511Z 153 │ recorderRef.current = recorder; 2026-10-23T22:25:17.8820835Z 154 │ ╭─▶ sessionRef.current = new VoiceInputSession({ 2026-10-23T22:25:17.8821133Z 155 │ │ recorder, 2026-10-23T22:25:17.8821396Z 156 │ │ getTranscriber: getLocalVoiceTranscriber, 2026-10-23T22:25:17.8822078Z 157 │ │ requestPermission: async () => { 2026-10-23T22:25:17.8822429Z 158 │ │ const permission = await requestRecordingPermissionsAsync(); 2026-10-23T22:25:17.8822829Z 159 │ │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-23T22:25:17.8823307Z 160 │ │ }, 2026-10-23T22:25:17.8823644Z 161 │ │ configureRecording: configureVoiceRecordingAudio, 2026-10-23T22:25:17.8823971Z 162 │ │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-23T22:25:17.8824280Z 163 │ │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-23T22:25:17.8824557Z 164 │ │ onStateChange: (nextState) => 2026-10-23T22:25:17.8824794Z 165 │ │ setState({ 2026-10-23T22:25:17.8825022Z 166 │ │ state: nextState, 2026-10-23T22:25:17.8825298Z 167 │ │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-23T22:25:17.8825593Z 168 │ │ label: sessionRef.current?.label ?? null, 2026-10-23T22:25:17.8825837Z 169 │ │ }), 2026-10-23T22:25:17.8826108Z 170 │ ├─▶ }); 2026-10-23T22:25:17.8826485Z · ╰──── Cannot access ref value during render 2026-10-23T22:25:17.8826760Z 171 │ } 2026-10-23T22:25:17.8826898Z ╰──── 2026-10-23T22:25:17.8827474Z  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-23T22:25:17.8828267Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.8828574Z 2026-10-23T22:25:17.8828752Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.8829102Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15] 2026-10-23T22:25:17.8829374Z 153 │ recorderRef.current = recorder; 2026-10-23T22:25:17.8829606Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-23T22:25:17.8829871Z ·  ─────┬────────┬─── 2026-10-23T22:25:17.8830314Z · │ ╰── Cannot update ref value during render 2026-10-23T22:25:17.8830637Z · ╰── This value is a ref 2026-10-23T22:25:17.8830848Z 155 │ recorder, 2026-10-23T22:25:17.8830996Z ╰──── 2026-10-23T22:25:17.8831626Z  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-23T22:25:17.8832398Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.8832696Z 2026-10-23T22:25:17.8832859Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.8833198Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7] 2026-10-23T22:25:17.8833468Z 184 │ return () => subscription.remove(); 2026-10-23T22:25:17.8833659Z 185 │ }, [controller]); 2026-10-23T22:25:17.8833837Z ·  ─────┬──── 2026-10-23T22:25:17.8834098Z · ╰── Cannot access ref value during render 2026-10-23T22:25:17.8834420Z 186 │ 2026-10-23T22:25:17.8834597Z ╰──── 2026-10-23T22:25:17.8835158Z  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-23T22:25:17.8835914Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.8836210Z 2026-10-23T22:25:17.8836367Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.8836695Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6] 2026-10-23T22:25:17.8836967Z 184 │ return () => subscription.remove(); 2026-10-23T22:25:17.8837156Z 185 │ }, [controller]); 2026-10-23T22:25:17.8837338Z ·  ──────┬───── 2026-10-23T22:25:17.8837595Z · ╰── Cannot access ref value during render 2026-10-23T22:25:17.8837812Z 186 │ 2026-10-23T22:25:17.8837935Z ╰──── 2026-10-23T22:25:17.8838495Z  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-23T22:25:17.8839258Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.8839555Z 2026-10-23T22:25:17.8839710Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.8840042Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6] 2026-10-23T22:25:17.8840282Z 191 │ }, 2026-10-23T22:25:17.8840429Z 192 │ [controller, recorder], 2026-10-23T22:25:17.8840610Z ·  ─────┬──── 2026-10-23T22:25:17.8840862Z · ╰── Cannot access ref value during render 2026-10-23T22:25:17.8841098Z 193 │ ); 2026-10-23T22:25:17.8841227Z ╰──── 2026-10-23T22:25:17.8841849Z  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-23T22:25:17.8842618Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.8842918Z 2026-10-23T22:25:17.8843077Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.8843404Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20] 2026-10-23T22:25:17.8843683Z 174 │ const controller = session.controller; 2026-10-23T22:25:17.8843895Z 175 │ const recorder = recorderRef.current; 2026-10-23T22:25:17.8844131Z ·  ─────────┬───────── 2026-10-23T22:25:17.8844434Z · ╰── Cannot access ref value during render 2026-10-23T22:25:17.8844664Z 176 │ 2026-10-23T22:25:17.8844797Z ╰──── 2026-10-23T22:25:17.8845427Z  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-23T22:25:17.8846232Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.8846530Z 2026-10-23T22:25:17.8846687Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.8847018Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5] 2026-10-23T22:25:17.8847256Z 191 │ }, 2026-10-23T22:25:17.8847409Z 192 │ [controller, recorder], 2026-10-23T22:25:17.8847605Z ·  ───────────┬────────── 2026-10-23T22:25:17.8847879Z · ╰── Cannot access ref value during render 2026-10-23T22:25:17.8848098Z 193 │ ); 2026-10-23T22:25:17.8848226Z ╰──── 2026-10-23T22:25:17.8848792Z  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-23T22:25:17.8849555Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.8849853Z 2026-10-23T22:25:17.8850004Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.8850342Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20] 2026-10-23T22:25:17.8850625Z 245 │ return () => clearInterval(intervalId); 2026-10-23T22:25:17.8850876Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-23T22:25:17.8851112Z ·  ─────┬──── 2026-10-23T22:25:17.8851416Z · ╰── Cannot access ref value during render 2026-10-23T22:25:17.8851681Z 247 │ 2026-10-23T22:25:17.8851809Z ╰──── 2026-10-23T22:25:17.8852367Z  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-23T22:25:17.8853127Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.8853428Z 2026-10-23T22:25:17.8853578Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.8853966Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6] 2026-10-23T22:25:17.8854273Z 245 │ return () => clearInterval(intervalId); 2026-10-23T22:25:17.8854517Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-23T22:25:17.8854797Z ·  ────────────────────────┬─────────────────────── 2026-10-23T22:25:17.8855117Z · ╰── Cannot access ref value during render 2026-10-23T22:25:17.8855345Z 247 │ 2026-10-23T22:25:17.8855478Z ╰──── 2026-10-23T22:25:17.8856033Z  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-23T22:25:17.8856800Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.8857092Z 2026-10-23T22:25:17.8857250Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.8857584Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5] 2026-10-23T22:25:17.8857838Z 260 │ setOwnerFocused, 2026-10-23T22:25:17.8858011Z 261 │ session, 2026-10-23T22:25:17.8858174Z ·  ───┬─── 2026-10-23T22:25:17.8858418Z · ╰── Cannot access ref value during render 2026-10-23T22:25:17.8858643Z 262 │ stop, 2026-10-23T22:25:17.8858778Z ╰──── 2026-10-23T22:25:17.8859348Z  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-23T22:25:17.8860106Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.8860401Z 2026-10-23T22:25:17.8860560Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.8860887Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10] 2026-10-23T22:25:17.8861129Z 250 │ 2026-10-23T22:25:17.8861403Z 251 │ ╭─▶ return { 2026-10-23T22:25:17.8861794Z 252 │ │ isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null, 2026-10-23T22:25:17.8862103Z 253 │ │ state, 2026-10-23T22:25:17.8862324Z 254 │ │ audioLevels, 2026-10-23T22:25:17.8862543Z 255 │ │ elapsedSeconds, 2026-10-23T22:25:17.8862806Z 256 │ │ isBusy: voiceInputBlocksSubmission(state), 2026-10-23T22:25:17.8863049Z 257 │ │ ownerKey, 2026-10-23T22:25:17.8863255Z 258 │ │ label, 2026-10-23T22:25:17.8863463Z 259 │ │ focusedOwners, 2026-10-23T22:25:17.8863689Z 260 │ │ setOwnerFocused, 2026-10-23T22:25:17.8863898Z 261 │ │ session, 2026-10-23T22:25:17.8864089Z 262 │ │ stop, 2026-10-23T22:25:17.8864298Z 263 │ │ cancel, 2026-10-23T22:25:17.8864545Z 264 │ ├─▶ }; 2026-10-23T22:25:17.8864993Z · ╰──── Cannot access ref value during render 2026-10-23T22:25:17.8865297Z 265 │ } 2026-10-23T22:25:17.8865435Z ╰──── 2026-10-23T22:25:17.8866001Z  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-23T22:25:17.8866763Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.8867062Z 2026-10-23T22:25:17.8867230Z ⚠ react(immutability): This value cannot be modified 2026-10-23T22:25:17.8867580Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-23T22:25:17.8867935Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-23T22:25:17.8868260Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-23T22:25:17.8868507Z ·  ─────┬───── 2026-10-23T22:25:17.8868772Z · ╰── `audioLevels` originates here 2026-10-23T22:25:17.8869052Z 123 │ const sessionRef = useRef(null); 2026-10-23T22:25:17.8869355Z 124 │ const recorderRef = useRef | null>(null); 2026-10-23T22:25:17.8869585Z 125 │ 2026-10-23T22:25:17.8869778Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T22:25:17.8870019Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-23T22:25:17.8870416Z 128 │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-23T22:25:17.8870687Z 129 │ onStatus: (status: RecordingStatus) => { 2026-10-23T22:25:17.8870944Z 130 │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-23T22:25:17.8871189Z 131 │ isFinished: status.isFinished, 2026-10-23T22:25:17.8871475Z 132 │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-23T22:25:17.8871731Z 133 │ error: status.error, 2026-10-23T22:25:17.8871911Z 134 │ url: status.url, 2026-10-23T22:25:17.8872081Z 135 │ }); 2026-10-23T22:25:17.8872222Z 136 │ }, 2026-10-23T22:25:17.8872478Z 137 │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-23T22:25:17.8872744Z 138 │ selectInput: (inputs) => { 2026-10-23T22:25:17.8872990Z 139 │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-23T22:25:17.8873269Z 140 │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-23T22:25:17.8873557Z 141 │ const known = microphoneOrder(preferences.value.microphones); 2026-10-23T22:25:17.8873826Z 142 │ const order = rememberMicrophones(known, inputs); 2026-10-23T22:25:17.8874038Z 143 │ if (order !== known) { 2026-10-23T22:25:17.8874258Z 144 │ registry.set(updateMobilePreferencesAtom, { 2026-10-23T22:25:17.8874480Z 145 │ transform: (current) => ({ 2026-10-23T22:25:17.8874784Z 146 │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-23T22:25:17.8875041Z 147 │ }), 2026-10-23T22:25:17.8875199Z 148 │ }); 2026-10-23T22:25:17.8875344Z 149 │ } 2026-10-23T22:25:17.8875542Z 150 │ return preferredMicrophoneInput(inputs, order); 2026-10-23T22:25:17.8875736Z 151 │ }, 2026-10-23T22:25:17.8875874Z 152 │ }); 2026-10-23T22:25:17.8876117Z 153 │ recorderRef.current = recorder; 2026-10-23T22:25:17.8876388Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-23T22:25:17.8876589Z 155 │ recorder, 2026-10-23T22:25:17.8876778Z 156 │ getTranscriber: getLocalVoiceTranscriber, 2026-10-23T22:25:17.8877002Z 157 │ requestPermission: async () => { 2026-10-23T22:25:17.8877255Z 158 │ const permission = await requestRecordingPermissionsAsync(); 2026-10-23T22:25:17.8877577Z 159 │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-23T22:25:17.8877817Z 160 │ }, 2026-10-23T22:25:17.8878020Z 161 │ configureRecording: configureVoiceRecordingAudio, 2026-10-23T22:25:17.8878273Z 162 │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-23T22:25:17.8878517Z 163 │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-23T22:25:17.8878744Z 164 │ onStateChange: (nextState) => 2026-10-23T22:25:17.8878924Z 165 │ setState({ 2026-10-23T22:25:17.8879094Z 166 │ state: nextState, 2026-10-23T22:25:17.8879303Z 167 │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-23T22:25:17.8879546Z 168 │ label: sessionRef.current?.label ?? null, 2026-10-23T22:25:17.8879731Z 169 │ }), 2026-10-23T22:25:17.8879871Z 170 │ }); 2026-10-23T22:25:17.8880001Z 171 │ } 2026-10-23T22:25:17.8880130Z 172 │ 2026-10-23T22:25:17.8880287Z 173 │ const session = sessionRef.current; 2026-10-23T22:25:17.8880492Z 174 │ const controller = session.controller; 2026-10-23T22:25:17.8880707Z 175 │ const recorder = recorderRef.current; 2026-10-23T22:25:17.8880879Z 176 │ 2026-10-23T22:25:17.8881022Z 177 │ useEffect(() => { 2026-10-23T22:25:17.8881282Z 178 │ const subscription = AppState.addEventListener("change", (nextState) => { 2026-10-23T22:25:17.8881670Z 179 │ // iOS reports `inactive` while its permission dialog is open. Only the 2026-10-23T22:25:17.8881985Z 180 │ // real background state cancels preparation; recorder status handles 2026-10-23T22:25:17.8882271Z 181 │ // calls and route interruptions during capture. 2026-10-23T22:25:17.8882553Z 182 │ if (nextState === "background") controller.appMovedToBackground(); 2026-10-23T22:25:17.8882779Z 183 │ }); 2026-10-23T22:25:17.8882943Z 184 │ return () => subscription.remove(); 2026-10-23T22:25:17.8883127Z 185 │ }, [controller]); 2026-10-23T22:25:17.8883278Z 186 │ 2026-10-23T22:25:17.8883408Z 187 │ useEffect( 2026-10-23T22:25:17.8891164Z 188 │ () => () => { 2026-10-23T22:25:17.8891414Z 189 │ controller.dispose(); 2026-10-23T22:25:17.8891593Z 190 │ recorder.release(); 2026-10-23T22:25:17.8891754Z 191 │ }, 2026-10-23T22:25:17.8891901Z 192 │ [controller, recorder], 2026-10-23T22:25:17.8892053Z 193 │ ); 2026-10-23T22:25:17.8892178Z 194 │ 2026-10-23T22:25:17.8892317Z 195 │ useEffect(() => { 2026-10-23T22:25:17.8892512Z 196 │ if (state.phase !== "recording") return; 2026-10-23T22:25:17.8892692Z 197 │ 2026-10-23T22:25:17.8892921Z 198 │ const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`; 2026-10-23T22:25:17.8893206Z 199 │ const activation = activateKeepAwakeAsync(tag); 2026-10-23T22:25:17.8893421Z 200 │ void activation.catch(() => {}); 2026-10-23T22:25:17.8893599Z 201 │ return () => { 2026-10-23T22:25:17.8893850Z 202 │ // Release after activation settles, even if the recording ends immediately. 2026-10-23T22:25:17.8894168Z 203 │ void activation.then(() => deactivateKeepAwake(tag)).catch(() => {}); 2026-10-23T22:25:17.8894485Z 204 │ }; 2026-10-23T22:25:17.8894683Z 205 │ }, [keepAwakeId, state.phase]); 2026-10-23T22:25:17.8894847Z 206 │ 2026-10-23T22:25:17.8894986Z 207 │ useEffect(() => { 2026-10-23T22:25:17.8895224Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-23T22:25:17.8895433Z 209 │ 2026-10-23T22:25:17.8895627Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-23T22:25:17.8895942Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-23T22:25:17.8896234Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-23T22:25:17.8896457Z ·  ─────┬───── 2026-10-23T22:25:17.8896718Z · ╰── `audioLevels` cannot be modified 2026-10-23T22:25:17.8896938Z 213 │ } 2026-10-23T22:25:17.8897067Z ╰──── 2026-10-23T22:25:17.8897431Z  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-23T22:25:17.8898053Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T22:25:17.8898375Z 2026-10-23T22:25:17.8898599Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T22:25:17.8898992Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-23T22:25:17.8899241Z 206 │ 2026-10-23T22:25:17.8899378Z 207 │ useEffect(() => { 2026-10-23T22:25:17.8899557Z ·  ───┬─── 2026-10-23T22:25:17.8899910Z · ╰── This function may (indirectly) reassign or modify `audioLevels` after render 2026-10-23T22:25:17.8900290Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-23T22:25:17.8900505Z 209 │ 2026-10-23T22:25:17.8900704Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-23T22:25:17.8901021Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-23T22:25:17.8901314Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-23T22:25:17.8901589Z ·  ─────┬───── 2026-10-23T22:25:17.8901846Z · ╰── This modifies `audioLevels` 2026-10-23T22:25:17.8902068Z 213 │ } 2026-10-23T22:25:17.8902205Z ╰──── 2026-10-23T22:25:17.8902658Z  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-23T22:25:17.8903341Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T22:25:17.8903664Z 2026-10-23T22:25:17.8903919Z ⚠ eslint(no-unused-vars): Function 'assertUserMessagesExclude' is declared but never used. 2026-10-23T22:25:17.8904347Z ╭─[apps/server/src/orchestration-v2/testkit/fixtures/shared.ts:1398:10] 2026-10-23T22:25:17.8904601Z 1397 │ 2026-10-23T22:25:17.8904768Z 1398 │ function assertUserMessagesExclude( 2026-10-23T22:25:17.8905013Z ·  ────────────┬──────────── 2026-10-23T22:25:17.8905326Z · ╰── 'assertUserMessagesExclude' is declared here 2026-10-23T22:25:17.8905714Z 1399 │ projection: OrchestrationV2ThreadProjection, 2026-10-23T22:25:17.8905950Z ╰──── 2026-10-23T22:25:17.8906140Z  help: Consider removing this declaration. 2026-10-23T22:25:17.8906270Z 2026-10-23T22:25:17.8906435Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.8906786Z ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14] 2026-10-23T22:25:17.8907068Z 26 │ const latestInput = useRef(input); 2026-10-23T22:25:17.8907268Z 27 │ latestInput.current = input; 2026-10-23T22:25:17.8907508Z ·  ─────┬─────────┬─── 2026-10-23T22:25:17.8907836Z · │ ╰── Cannot update ref value during render 2026-10-23T22:25:17.8908161Z · ╰── This value is a ref 2026-10-23T22:25:17.8908389Z 28 │ const mounted = useRef(true); 2026-10-23T22:25:17.8908567Z ╰──── 2026-10-23T22:25:17.8909140Z  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-23T22:25:17.8909912Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.8910302Z 2026-10-23T22:25:17.8910476Z ⚠ react(immutability): This value cannot be modified 2026-10-23T22:25:17.8910844Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5] 2026-10-23T22:25:17.8911100Z 90 │ }) { 2026-10-23T22:25:17.8911305Z 91 │ const rotation = useSharedValue(props.hidden ? 1 : 0); 2026-10-23T22:25:17.8911557Z ·  ────┬─── 2026-10-23T22:25:17.8911825Z · ╰── `rotation` originates here 2026-10-23T22:25:17.8912052Z 92 │ useLayoutEffect(() => { 2026-10-23T22:25:17.8912319Z 93 │ rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING); 2026-10-23T22:25:17.8912568Z ·  ────┬─── 2026-10-23T22:25:17.8912816Z · ╰── `rotation` cannot be modified 2026-10-23T22:25:17.8913055Z 94 │ }, [props.hidden, rotation]); 2026-10-23T22:25:17.8913224Z ╰──── 2026-10-23T22:25:17.8913588Z  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-23T22:25:17.8914215Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T22:25:17.8914540Z 2026-10-23T22:25:17.8914717Z ⚠ react(immutability): This value cannot be modified 2026-10-23T22:25:17.8915085Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:269:5] 2026-10-23T22:25:17.8915385Z 266 │ const variant = props.variant ?? "plain"; 2026-10-23T22:25:17.8915655Z 267 │ const loadingVisibility = useSharedValue(props.loading ? 1 : 0); 2026-10-23T22:25:17.8915920Z ·  ────────┬──────── 2026-10-23T22:25:17.8916195Z · ╰── `loadingVisibility` originates here 2026-10-23T22:25:17.8916438Z 268 │ useLayoutEffect(() => { 2026-10-23T22:25:17.8916715Z 269 │ loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING); 2026-10-23T22:25:17.8917099Z ·  ────────┬──────── 2026-10-23T22:25:17.8917430Z · ╰── `loadingVisibility` cannot be modified 2026-10-23T22:25:17.8917705Z 270 │ }, [loadingVisibility, props.loading]); 2026-10-23T22:25:17.8917884Z ╰──── 2026-10-23T22:25:17.8918251Z  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-23T22:25:17.8918851Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T22:25:17.8919164Z 2026-10-23T22:25:17.8919340Z ⚠ react(immutability): This value cannot be modified 2026-10-23T22:25:17.8919695Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:328:5] 2026-10-23T22:25:17.8919959Z 325 │ }) { 2026-10-23T22:25:17.8920220Z 326 │ const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0); 2026-10-23T22:25:17.8920505Z ·  ─────────┬───────── 2026-10-23T22:25:17.8920784Z · ╰── `recordingVisibility` originates here 2026-10-23T22:25:17.8921041Z 327 │ useLayoutEffect(() => { 2026-10-23T22:25:17.8921342Z 328 │ recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING); 2026-10-23T22:25:17.8921707Z ·  ─────────┬───────── 2026-10-23T22:25:17.8921982Z · ╰── `recordingVisibility` cannot be modified 2026-10-23T22:25:17.8922249Z 329 │ }, [props.phase, recordingVisibility]); 2026-10-23T22:25:17.8922436Z ╰──── 2026-10-23T22:25:17.8922795Z  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-23T22:25:17.8923414Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T22:25:17.8923729Z 2026-10-23T22:25:17.8924238Z ⚠ 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-23T22:25:17.8924843Z ╭─[apps/server/src/project/ProjectService.test.ts:94:3] 2026-10-23T22:25:17.8925075Z 93 │ ) { 2026-10-23T22:25:17.8925376Z 94 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T22:25:17.8925838Z 95 │ │ const project = Option.getOrThrow(yield* service.getById(projectId)); 2026-10-23T22:25:17.8926200Z 96 │ │ if (predicate(project)) return project; 2026-10-23T22:25:17.8926463Z 97 │ │ yield* Effect.yieldNow; 2026-10-23T22:25:17.8926738Z 98 │ ╰─▶ } 2026-10-23T22:25:17.8927049Z 99 │ return yield* Effect.die(`Project ${projectId} was not enriched in time.`); 2026-10-23T22:25:17.8927286Z ╰──── 2026-10-23T22:25:17.8927356Z 2026-10-23T22:25:17.8927528Z ⚠ react(immutability): This value cannot be modified 2026-10-23T22:25:17.8927899Z ╭─[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5] 2026-10-23T22:25:17.8928201Z 65 │ const [expanded, setExpanded] = useState(false); 2026-10-23T22:25:17.8928438Z 66 │ const progress = useSharedValue(0); 2026-10-23T22:25:17.8928644Z ·  ────┬─── 2026-10-23T22:25:17.8928892Z · ╰── `progress` originates here 2026-10-23T22:25:17.8929122Z 67 │ useEffect(() => { 2026-10-23T22:25:17.8929452Z 68 │ progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING); 2026-10-23T22:25:17.8929676Z ·  ────┬─── 2026-10-23T22:25:17.8929915Z · ╰── `progress` cannot be modified 2026-10-23T22:25:17.8930145Z 69 │ }, [expanded, progress]); 2026-10-23T22:25:17.8930300Z ╰──── 2026-10-23T22:25:17.8930656Z  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-23T22:25:17.8931262Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T22:25:17.8931602Z 2026-10-23T22:25:17.8932108Z ⚠ 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-23T22:25:17.8932735Z ╭─[apps/server/src/project/ProjectEnrichmentService.test.ts:28:3] 2026-10-23T22:25:17.8932981Z 27 │ ) { 2026-10-23T22:25:17.8933287Z 28 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T22:25:17.8933655Z 29 │ │ const available = yield* service.peek(workspaceRoot); 2026-10-23T22:25:17.8933964Z 30 │ │ if (predicate(available)) return available; 2026-10-23T22:25:17.8934232Z 31 │ │ yield* Effect.yieldNow; 2026-10-23T22:25:17.8934494Z 32 │ ╰─▶ } 2026-10-23T22:25:17.8934837Z 33 │ return yield* Effect.die(`Project metadata for ${workspaceRoot} was not resolved in time.`); 2026-10-23T22:25:17.8935099Z ╰──── 2026-10-23T22:25:17.8935164Z 2026-10-23T22:25:17.8935427Z ⚠ eslint(no-unused-vars): Function 'resolveThreadWorkspaceCwd' is declared but never used. 2026-10-23T22:25:17.8935799Z ╭─[apps/server/src/checkpointing/Utils.ts:12:10] 2026-10-23T22:25:17.8936008Z 11 │ 2026-10-23T22:25:17.8936188Z 12 │ function resolveThreadWorkspaceCwd(input: { 2026-10-23T22:25:17.8936443Z ·  ────────────┬──────────── 2026-10-23T22:25:17.8936828Z · ╰── 'resolveThreadWorkspaceCwd' is declared here 2026-10-23T22:25:17.8937138Z 13 │ readonly thread: { 2026-10-23T22:25:17.8937303Z ╰──── 2026-10-23T22:25:17.8937486Z  help: Consider removing this declaration. 2026-10-23T22:25:17.8937625Z 2026-10-23T22:25:17.8937803Z ⚠ react(immutability): This value cannot be modified 2026-10-23T22:25:17.8938160Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:111:5] 2026-10-23T22:25:17.8938419Z 107 │ ); 2026-10-23T22:25:17.8938663Z 108 │ const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0); 2026-10-23T22:25:17.8938947Z ·  ─────────┬──────── 2026-10-23T22:25:17.8939222Z · ╰── `separationProgress` originates here 2026-10-23T22:25:17.8939449Z 109 │ 2026-10-23T22:25:17.8939604Z 110 │ useEffect(() => { 2026-10-23T22:25:17.8939896Z 111 │ separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING); 2026-10-23T22:25:17.8940181Z ·  ─────────┬──────── 2026-10-23T22:25:17.8940462Z · ╰── `separationProgress` cannot be modified 2026-10-23T22:25:17.8940745Z 112 │ }, [props.showScrollToEnd, separationProgress]); 2026-10-23T22:25:17.8940947Z ╰──── 2026-10-23T22:25:17.8941314Z  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-23T22:25:17.8941968Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T22:25:17.8942278Z 2026-10-23T22:25:17.8942460Z ⚠ react(immutability): This value cannot be modified 2026-10-23T22:25:17.8942819Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-23T22:25:17.8943136Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-23T22:25:17.8943404Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-23T22:25:17.8943648Z ·  ──────┬───── 2026-10-23T22:25:17.8943909Z · ╰── `capsuleWidth` originates here 2026-10-23T22:25:17.8944202Z 130 │ const measuredWidthRef = useRef(null); 2026-10-23T22:25:17.8944467Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-23T22:25:17.8944739Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-23T22:25:17.8944983Z 133 │ if (width === measuredWidthRef.current) { 2026-10-23T22:25:17.8945197Z 134 │ return; 2026-10-23T22:25:17.8945349Z 135 │ } 2026-10-23T22:25:17.8945555Z 136 │ const first = measuredWidthRef.current === null; 2026-10-23T22:25:17.8945789Z 137 │ measuredWidthRef.current = width; 2026-10-23T22:25:17.8946072Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-23T22:25:17.8946329Z ·  ──────┬───── 2026-10-23T22:25:17.8946588Z · ╰── `capsuleWidth` cannot be modified 2026-10-23T22:25:17.8946829Z 139 │ }; 2026-10-23T22:25:17.8946963Z ╰──── 2026-10-23T22:25:17.8947327Z  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-23T22:25:17.8948030Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T22:25:17.8948394Z 2026-10-23T22:25:17.8948570Z ⚠ react(immutability): This value cannot be modified 2026-10-23T22:25:17.8948922Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-23T22:25:17.8949233Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-23T22:25:17.8949499Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-23T22:25:17.8949741Z ·  ──────┬───── 2026-10-23T22:25:17.8949996Z · ╰── `capsuleWidth` originates here 2026-10-23T22:25:17.8950342Z 130 │ const measuredWidthRef = useRef(null); 2026-10-23T22:25:17.8950607Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-23T22:25:17.8950884Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-23T22:25:17.8951132Z 133 │ if (width === measuredWidthRef.current) { 2026-10-23T22:25:17.8951338Z 134 │ return; 2026-10-23T22:25:17.8951517Z 135 │ } 2026-10-23T22:25:17.8951717Z 136 │ const first = measuredWidthRef.current === null; 2026-10-23T22:25:17.8951955Z 137 │ measuredWidthRef.current = width; 2026-10-23T22:25:17.8952230Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-23T22:25:17.8952468Z 139 │ }; 2026-10-23T22:25:17.8952647Z 140 │ const hasStatus = props.status !== null; 2026-10-23T22:25:17.8952922Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-23T22:25:17.8953156Z 142 │ useEffect(() => { 2026-10-23T22:25:17.8953324Z 143 │ if (!hasStatus) { 2026-10-23T22:25:17.8953516Z 144 │ measuredWidthRef.current = null; 2026-10-23T22:25:17.8953723Z 145 │ capsuleWidth.value = null; 2026-10-23T22:25:17.8953920Z ·  ──────┬───── 2026-10-23T22:25:17.8954172Z · ╰── `capsuleWidth` cannot be modified 2026-10-23T22:25:17.8954392Z 146 │ } 2026-10-23T22:25:17.8954523Z ╰──── 2026-10-23T22:25:17.8954877Z  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-23T22:25:17.8955479Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T22:25:17.8955793Z 2026-10-23T22:25:17.8956011Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T22:25:17.8956404Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-23T22:25:17.8956739Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-23T22:25:17.8956972Z 142 │ useEffect(() => { 2026-10-23T22:25:17.8957153Z ·  ───┬─── 2026-10-23T22:25:17.8957496Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-23T22:25:17.8957808Z 143 │ if (!hasStatus) { 2026-10-23T22:25:17.8958000Z 144 │ measuredWidthRef.current = null; 2026-10-23T22:25:17.8958201Z 145 │ capsuleWidth.value = null; 2026-10-23T22:25:17.8958393Z ·  ──────┬───── 2026-10-23T22:25:17.8958642Z · ╰── This modifies `capsuleWidth` 2026-10-23T22:25:17.8958851Z 146 │ } 2026-10-23T22:25:17.8958979Z ╰──── 2026-10-23T22:25:17.8959499Z  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-23T22:25:17.8960209Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T22:25:17.8960522Z 2026-10-23T22:25:17.8960747Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T22:25:17.8961140Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-23T22:25:17.8961643Z 130 │ const measuredWidthRef = useRef(null); 2026-10-23T22:25:17.8961906Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-23T22:25:17.8962198Z ·  ───────────────┬─────────────── 2026-10-23T22:25:17.8962601Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-23T22:25:17.8962962Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-23T22:25:17.8963198Z 133 │ if (width === measuredWidthRef.current) { 2026-10-23T22:25:17.8963392Z 134 │ return; 2026-10-23T22:25:17.8963534Z 135 │ } 2026-10-23T22:25:17.8963727Z 136 │ const first = measuredWidthRef.current === null; 2026-10-23T22:25:17.8963953Z 137 │ measuredWidthRef.current = width; 2026-10-23T22:25:17.8964225Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-23T22:25:17.8964476Z ·  ──────┬───── 2026-10-23T22:25:17.8964728Z · ╰── This modifies `capsuleWidth` 2026-10-23T22:25:17.8964941Z 139 │ }; 2026-10-23T22:25:17.8965076Z ╰──── 2026-10-23T22:25:17.8965506Z  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-23T22:25:17.8966177Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T22:25:17.8966489Z 2026-10-23T22:25:17.8966707Z ⚠ eslint(no-unsafe-optional-chaining): Unsafe usage of optional chaining 2026-10-23T22:25:17.8967106Z ╭─[apps/server/src/orchestration-v2/ThreadLaunchService.test.ts:1783:8] 2026-10-23T22:25:17.8967361Z 1782 │ assert.equal( 2026-10-23T22:25:17.8967611Z 1783 │ (stored.context?.records[0] as { attachmentId: string }).attachmentId, 2026-10-23T22:25:17.8967733Z ·  ────────────────────────── 2026-10-23T22:25:17.8967826Z 1784 │ stored.attachments[0]?.id, 2026-10-23T22:25:17.8967888Z ╰──── 2026-10-23T22:25:17.8968074Z  help: If this short-circuits with 'undefined' the evaluation will throw TypeError 2026-10-23T22:25:17.8968083Z 2026-10-23T22:25:17.8968303Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T22:25:17.8968449Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:542:25] 2026-10-23T22:25:17.8968595Z 541 │ // range) the boundary string is identical and the chain would die. 2026-10-23T22:25:17.8968696Z 542 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-23T22:25:17.8968808Z ·  ───────┬────── 2026-10-23T22:25:17.8969056Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-23T22:25:17.8969237Z 543 │ const v2SearchQuery = props.searchQuery.trim().toLocaleLowerCase(); 2026-10-23T22:25:17.8969299Z ╰──── 2026-10-23T22:25:17.8969614Z  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-23T22:25:17.8969956Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.8969959Z 2026-10-23T22:25:17.8970144Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T22:25:17.8970287Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:533:53] 2026-10-23T22:25:17.8970378Z 532 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-23T22:25:17.8970559Z 533 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-23T22:25:17.8970701Z ·  ─────┬──── 2026-10-23T22:25:17.8970884Z · ╰── Cannot call impure function 2026-10-23T22:25:17.8970971Z 534 │ const id = setTimeout(() => { 2026-10-23T22:25:17.8971027Z ╰──── 2026-10-23T22:25:17.8971338Z  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-23T22:25:17.8971683Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T22:25:17.8971686Z 2026-10-23T22:25:17.8972019Z ⚠ eslint(no-unused-vars): Variable 'layerFromProviderAdapter' is declared but never used. Unused variables should start with a '_'. 2026-10-23T22:25:17.8972199Z ╭─[apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts:346:7] 2026-10-23T22:25:17.8972259Z 345 │ 2026-10-23T22:25:17.8972373Z 346 │ const layerFromProviderAdapter: Layer.Layer< 2026-10-23T22:25:17.8972478Z ·  ────────────┬─────────── 2026-10-23T22:25:17.8972656Z · ╰── 'layerFromProviderAdapter' is declared here 2026-10-23T22:25:17.8972748Z 347 │ ProviderAdapterRegistryV2, 2026-10-23T22:25:17.8972811Z ╰──── 2026-10-23T22:25:17.8972931Z  help: Consider removing this declaration. 2026-10-23T22:25:17.8972934Z 2026-10-23T22:25:17.8973229Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-23T22:25:17.8973395Z ╭─[packages/shared/src/serverSettings.ts:346:9] 2026-10-23T22:25:17.8973510Z 345 │ const entry: ProjectSettingsOverrides = { 2026-10-23T22:25:17.8973652Z 346 │ ...(entries.get(projectId) ?? currentEntries[projectId] ?? {}), 2026-10-23T22:25:17.8973821Z ·  ────────────────────────────────────────────────────────────── 2026-10-23T22:25:17.8973887Z 347 │ }; 2026-10-23T22:25:17.8973948Z ╰──── 2026-10-23T22:25:17.8974235Z  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-23T22:25:17.8974239Z 2026-10-23T22:25:17.8974475Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in Array.prototype.reduce() 2026-10-23T22:25:17.8974612Z ╭─[packages/shared/src/serverSettings.ts:448:24] 2026-10-23T22:25:17.8974694Z 447 │ const favorites = 2026-10-23T22:25:17.8974815Z 448 │ setModelFavorites?.reduce((current, change) => { 2026-10-23T22:25:17.8974913Z ·  ───┬── 2026-10-23T22:25:17.8975047Z · ╰── For this reduce 2026-10-23T22:25:17.8975137Z 449 │ const exists = current.some( 2026-10-23T22:25:17.8975325Z 450 │ (favorite) => favorite.provider === change.provider && favorite.model === change.model, 2026-10-23T22:25:17.8975393Z 451 │ ); 2026-10-23T22:25:17.8975470Z 452 │ return change.favorite 2026-10-23T22:25:17.8975541Z 453 │ ? exists 2026-10-23T22:25:17.8975613Z 454 │ ? current 2026-10-23T22:25:17.8975760Z 455 │ : [...current, { provider: change.provider, model: change.model }] 2026-10-23T22:25:17.8975857Z ·  ─────┬──── 2026-10-23T22:25:17.8975992Z · ╰── From this spread 2026-10-23T22:25:17.8976073Z 456 │ : current.filter( 2026-10-23T22:25:17.8976131Z ╰──── 2026-10-23T22:25:17.8976351Z  help: Consider using `Object.assign()` or `Array.prototype.push()` to mutate the accumulator instead. 2026-10-23T22:25:17.8976531Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-23T22:25:17.8976534Z 2026-10-23T22:25:17.8976743Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-23T22:25:17.8976876Z ╭─[packages/shared/src/serverSettings.ts:466:3] 2026-10-23T22:25:17.8976939Z 464 │ null; 2026-10-23T22:25:17.8977078Z 465 │ let nextModelPreferences = initialModelPreferences; 2026-10-23T22:25:17.8977180Z ·  ──────────┬───────── 2026-10-23T22:25:17.8977321Z · ╰── From this accumulator 2026-10-23T22:25:17.8977428Z 466 │ for (const change of setModelsHidden ?? []) { 2026-10-23T22:25:17.8977506Z ·  ─┬─ 2026-10-23T22:25:17.8977624Z · ╰── For this loop 2026-10-23T22:25:17.8977773Z 467 │ const preferences = nextModelPreferences?.[change.provider] ?? { 2026-10-23T22:25:17.8977848Z 468 │ hiddenModels: [], 2026-10-23T22:25:17.8977925Z 469 │ modelOrder: [], 2026-10-23T22:25:17.8977989Z 470 │ }; 2026-10-23T22:25:17.8978181Z 471 │ const hiddenModels = preferences.hiddenModels.filter((model) => model !== change.model); 2026-10-23T22:25:17.8978298Z 472 │ if (change.hidden) hiddenModels.push(change.model); 2026-10-23T22:25:17.8978436Z 473 │ nextModelPreferences = { 2026-10-23T22:25:17.8978557Z 474 │ ...nextModelPreferences, 2026-10-23T22:25:17.8978661Z ·  ───────────┬─────────── 2026-10-23T22:25:17.8978795Z · ╰── From this spread 2026-10-23T22:25:17.8978915Z 475 │ [change.provider]: { ...preferences, hiddenModels }, 2026-10-23T22:25:17.8978973Z ╰──── 2026-10-23T22:25:17.8979139Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-23T22:25:17.8979303Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-23T22:25:17.8979305Z 2026-10-23T22:25:17.8979462Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.8979629Z ╭─[apps/mobile/src/features/home/thread-swipe-actions.tsx:494:27] 2026-10-23T22:25:17.8979703Z 493 │ > 2026-10-23T22:25:17.8979788Z 494 │ {props.children(close)} 2026-10-23T22:25:17.8979886Z ·  ──┬── 2026-10-23T22:25:17.8980063Z · ╰── Cannot access ref value during render 2026-10-23T22:25:17.8980147Z 495 │ 2026-10-23T22:25:17.8980202Z ╰──── 2026-10-23T22:25:17.8980854Z  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-23T22:25:17.8981169Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.8981179Z 2026-10-23T22:25:17.8981439Z ⚠ eslint(no-unneeded-ternary): Unnecessary use of boolean literals in conditional expression 2026-10-23T22:25:17.8981624Z ╭─[packages/shared/src/serverSettings.test.ts:35:7] 2026-10-23T22:25:17.8981818Z 34 │ const fallback = fallbackTextGenerationModelSelection(providerInstances, (instanceId) => 2026-10-23T22:25:17.8981924Z 35 │ instanceId === configured ? true : false, 2026-10-23T22:25:17.8982049Z ·  ──────────────────────────────────────── 2026-10-23T22:25:17.8982111Z 36 │ ); 2026-10-23T22:25:17.8982166Z ╰──── 2026-10-23T22:25:17.8982272Z  help: Remove this ternary operator 2026-10-23T22:25:17.8982276Z 2026-10-23T22:25:17.8982483Z ⚠ eslint(no-unused-vars): Identifier 'Image' is imported but never used. 2026-10-23T22:25:17.8982642Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:17:10] 2026-10-23T22:25:17.8982789Z 16 │ import type { NativeSyntheticEvent, ViewProps } from "react-native"; 2026-10-23T22:25:17.8982912Z 17 │ import { Image, Platform, StyleSheet } from "react-native"; 2026-10-23T22:25:17.8982990Z ·  ──┬── 2026-10-23T22:25:17.8983127Z · ╰── 'Image' is imported here 2026-10-23T22:25:17.8983184Z 18 │ 2026-10-23T22:25:17.8983243Z ╰──── 2026-10-23T22:25:17.8983352Z  help: Consider removing this import. 2026-10-23T22:25:17.8983355Z 2026-10-23T22:25:17.8983575Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-23T22:25:17.8983725Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:227:6] 2026-10-23T22:25:17.8983970Z 223 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-23T22:25:17.8984108Z 224 │ nativeEventSnapshotsRef.current, 2026-10-23T22:25:17.8984213Z ·  ───────────┬─────────── 2026-10-23T22:25:17.8984703Z · ╰── 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-23T22:25:17.8984786Z 225 │ mostRecentEventCount, 2026-10-23T22:25:17.8984850Z 226 │ ); 2026-10-23T22:25:17.8984984Z 227 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-23T22:25:17.8985129Z ·  ──────────────────────────┬────────────────────────── 2026-10-23T22:25:17.8985353Z · ╰── This dependency list is missing values used by the callback 2026-10-23T22:25:17.8985451Z 228 │ const assumedValue = props.value; 2026-10-23T22:25:17.8985507Z ╰──── 2026-10-23T22:25:17.8985692Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-23T22:25:17.8986031Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.8986034Z 2026-10-23T22:25:17.8986266Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T22:25:17.8986422Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:235:7] 2026-10-23T22:25:17.8986582Z 234 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-23T22:25:17.8986686Z 235 │ nativeEventSnapshotsRef.current, 2026-10-23T22:25:17.8986789Z ·  ───────────┬─────────── 2026-10-23T22:25:17.8987278Z · ╰── 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-23T22:25:17.8987359Z 236 │ controlledEventCount, 2026-10-23T22:25:17.8987429Z 237 │ assumedValue, 2026-10-23T22:25:17.8987492Z 238 │ ); 2026-10-23T22:25:17.8987664Z 239 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-23T22:25:17.8987812Z ·  ───────────┬────────── 2026-10-23T22:25:17.8988041Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-23T22:25:17.8988144Z 240 │ const acceptNativeEvent = useCallback( 2026-10-23T22:25:17.8988204Z ╰──── 2026-10-23T22:25:17.8988654Z  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-23T22:25:17.8988989Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.8988992Z 2026-10-23T22:25:17.8989144Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.8989304Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:160:29] 2026-10-23T22:25:17.8989499Z 159 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T22:25:17.8989662Z 160 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T22:25:17.8989789Z ·  ─────────────┬──────────── 2026-10-23T22:25:17.8989975Z · ╰── Cannot access ref value during render 2026-10-23T22:25:17.8990046Z 161 │ }); 2026-10-23T22:25:17.8990161Z ╰──── 2026-10-23T22:25:17.8990658Z  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-23T22:25:17.8990971Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.8990980Z 2026-10-23T22:25:17.8991141Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.8991299Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:160:29] 2026-10-23T22:25:17.8991449Z 159 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T22:25:17.8991569Z 160 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T22:25:17.8991703Z ·  ─────────────┬──────────── 2026-10-23T22:25:17.8991929Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T22:25:17.8991995Z 161 │ }); 2026-10-23T22:25:17.8992052Z ╰──── 2026-10-23T22:25:17.8992555Z  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-23T22:25:17.8992869Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.8992872Z 2026-10-23T22:25:17.8993028Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.8993183Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:23] 2026-10-23T22:25:17.8993243Z 161 │ }); 2026-10-23T22:25:17.8993344Z 162 │ confirmedTokensRef.current = tokens; 2026-10-23T22:25:17.8993483Z ·  ─────────┬────────────┬─── 2026-10-23T22:25:17.8993766Z · │ ╰── Cannot update ref value during render 2026-10-23T22:25:17.8993929Z · ╰── This value is a ref 2026-10-23T22:25:17.8994013Z 163 │ return JSON.stringify( 2026-10-23T22:25:17.8994072Z ╰──── 2026-10-23T22:25:17.8994566Z  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-23T22:25:17.8994876Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.8994878Z 2026-10-23T22:25:17.8995030Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.8995188Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:204:5] 2026-10-23T22:25:17.8995270Z 203 │ mostRecentEventCount, 2026-10-23T22:25:17.8995367Z 204 │ nativeEventSnapshotsRef.current, 2026-10-23T22:25:17.8995482Z ·  ───────────────┬─────────────── 2026-10-23T22:25:17.8995688Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T22:25:17.8995748Z 205 │ ); 2026-10-23T22:25:17.8995805Z ╰──── 2026-10-23T22:25:17.8996297Z  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-23T22:25:17.8996615Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.8996621Z 2026-10-23T22:25:17.8996779Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.8996932Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:210:5] 2026-10-23T22:25:17.8997011Z 209 │ mostRecentEventCount, 2026-10-23T22:25:17.8997104Z 210 │ nativeEventSnapshotsRef.current, 2026-10-23T22:25:17.8997216Z ·  ───────────────┬─────────────── 2026-10-23T22:25:17.8997418Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T22:25:17.8997478Z 211 │ ); 2026-10-23T22:25:17.8997533Z ╰──── 2026-10-23T22:25:17.8998032Z  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-23T22:25:17.8998345Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.8998347Z 2026-10-23T22:25:17.8998548Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-23T22:25:17.8998698Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:195:6] 2026-10-23T22:25:17.8998831Z 159 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T22:25:17.8998955Z 160 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T22:25:17.8999075Z ·  ─────────┬──────── 2026-10-23T22:25:17.8999627Z · ╰── 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-23T22:25:17.8999720Z 161 │ }); 2026-10-23T22:25:17.8999821Z 162 │ confirmedTokensRef.current = tokens; 2026-10-23T22:25:17.8999901Z 163 │ return JSON.stringify( 2026-10-23T22:25:17.9000081Z 164 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-23T22:25:17.9000157Z 165 │ const record = 2026-10-23T22:25:17.9000246Z 166 │ token.type === "context" 2026-10-23T22:25:17.9000425Z 167 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-23T22:25:17.9000500Z 168 │ : undefined; 2026-10-23T22:25:17.9000617Z 169 │ const presentation = contextChipPresentation( 2026-10-23T22:25:17.9000744Z 170 │ token.type === "context" ? token.kind : token.type, 2026-10-23T22:25:17.9000816Z 171 │ record, 2026-10-23T22:25:17.9000882Z 172 │ ); 2026-10-23T22:25:17.9000973Z 173 │ const icon = contextChipIcon( 2026-10-23T22:25:17.9001049Z 174 │ presentation, 2026-10-23T22:25:17.9001204Z 175 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-23T22:25:17.9001268Z 176 │ ); 2026-10-23T22:25:17.9001337Z 177 │ return { 2026-10-23T22:25:17.9001454Z 178 │ type: token.type, 2026-10-23T22:25:17.9001543Z 179 │ source: token.source, 2026-10-23T22:25:17.9001621Z 180 │ start: token.start, 2026-10-23T22:25:17.9001697Z 181 │ end: token.end, 2026-10-23T22:25:17.9001793Z 182 │ accent: presentation.accent, 2026-10-23T22:25:17.9001861Z 183 │ label: 2026-10-23T22:25:17.9001952Z 184 │ token.type === "skill" 2026-10-23T22:25:17.9002075Z 185 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-23T22:25:17.9002169Z 186 │ : token.type === "context" 2026-10-23T22:25:17.9002424Z 187 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-23T22:25:17.9002513Z 188 │ : basename(token.value), 2026-10-23T22:25:17.9002672Z 189 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-23T22:25:17.9002776Z 190 │ iconUri: contextChipIconUri(icon), 2026-10-23T22:25:17.9002873Z 191 │ tintsIcon: icon.kind === "chip", 2026-10-23T22:25:17.9002933Z 192 │ }; 2026-10-23T22:25:17.9002998Z 193 │ }), 2026-10-23T22:25:17.9003060Z 194 │ ); 2026-10-23T22:25:17.9003181Z 195 │ }, [props.value, props.context, skillLabels]); 2026-10-23T22:25:17.9003312Z ·  ────────────────────┬──────────────────── 2026-10-23T22:25:17.9003530Z · ╰── This dependency list is missing values used by the callback 2026-10-23T22:25:17.9003682Z 196 │ // Every render resolves against the snapshot history, so a render whose 2026-10-23T22:25:17.9003741Z ╰──── 2026-10-23T22:25:17.9003961Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-23T22:25:17.9004300Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9004303Z 2026-10-23T22:25:17.9004566Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-23T22:25:17.9004772Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:257:5] 2026-10-23T22:25:17.9004914Z 249 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-23T22:25:17.9005023Z 250 │ nativeEventSnapshotsRef.current.push({ 2026-10-23T22:25:17.9005125Z ·  ───────────┬─────────── 2026-10-23T22:25:17.9005617Z · ╰── 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-23T22:25:17.9005718Z 251 │ eventCount: acknowledgedEventCount, 2026-10-23T22:25:17.9005785Z 252 │ value, 2026-10-23T22:25:17.9005872Z 253 │ selection: nextSelection, 2026-10-23T22:25:17.9005944Z 254 │ }); 2026-10-23T22:25:17.9006041Z 255 │ return acknowledgedEventCount; 2026-10-23T22:25:17.9006099Z 256 │ }, 2026-10-23T22:25:17.9006162Z 257 │ [], 2026-10-23T22:25:17.9006240Z ·  ─┬ 2026-10-23T22:25:17.9006437Z · ╰── This dependency list is missing values used by the callback 2026-10-23T22:25:17.9006495Z 258 │ ); 2026-10-23T22:25:17.9006554Z ╰──── 2026-10-23T22:25:17.9006777Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-23T22:25:17.9007112Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9007114Z 2026-10-23T22:25:17.9007344Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-23T22:25:17.9007501Z ╭─[packages/shared/src/composerContextLegacySend.ts:19:45] 2026-10-23T22:25:17.9007639Z 18 │ const occurrences = collectComposerContextReferences(text); 2026-10-23T22:25:17.9007759Z 19 │ for (const occurrence of [...occurrences].reverse()) { 2026-10-23T22:25:17.9007877Z ·  ─────── 2026-10-23T22:25:17.9008000Z 20 │ const record = recordsById.get(occurrence.contextId); 2026-10-23T22:25:17.9008059Z ╰──── 2026-10-23T22:25:17.9008340Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-23T22:25:17.9008343Z 2026-10-23T22:25:17.9008616Z ⚠ eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used. 2026-10-23T22:25:17.9008819Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:960:10] 2026-10-23T22:25:17.9008884Z 959 │ 2026-10-23T22:25:17.9009006Z 960 │ function layerClaudeAgentSdkReplayQueryRunner( 2026-10-23T22:25:17.9009128Z ·  ──────────────────┬───────────────── 2026-10-23T22:25:17.9009340Z · ╰── 'layerClaudeAgentSdkReplayQueryRunner' is declared here 2026-10-23T22:25:17.9009455Z 961 │ transcript: ClaudeAgentSdkReplayTranscript, 2026-10-23T22:25:17.9009515Z ╰──── 2026-10-23T22:25:17.9009630Z  help: Consider removing this declaration. 2026-10-23T22:25:17.9009633Z 2026-10-23T22:25:17.9009852Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-23T22:25:17.9010057Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:229:6] 2026-10-23T22:25:17.9010262Z 225 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-23T22:25:17.9010361Z 226 │ nativeEventSnapshotsRef.current, 2026-10-23T22:25:17.9010459Z ·  ───────────┬─────────── 2026-10-23T22:25:17.9010951Z · ╰── 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-23T22:25:17.9011037Z 227 │ mostRecentEventCount, 2026-10-23T22:25:17.9011101Z 228 │ ); 2026-10-23T22:25:17.9011228Z 229 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-23T22:25:17.9011392Z ·  ──────────────────────────┬────────────────────────── 2026-10-23T22:25:17.9011639Z · ╰── This dependency list is missing values used by the callback 2026-10-23T22:25:17.9011737Z 230 │ const assumedValue = props.value; 2026-10-23T22:25:17.9011792Z ╰──── 2026-10-23T22:25:17.9011980Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-23T22:25:17.9012314Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9012316Z 2026-10-23T22:25:17.9012546Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T22:25:17.9012693Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:237:7] 2026-10-23T22:25:17.9012851Z 236 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-23T22:25:17.9012954Z 237 │ nativeEventSnapshotsRef.current, 2026-10-23T22:25:17.9013055Z ·  ───────────┬─────────── 2026-10-23T22:25:17.9013545Z · ╰── 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-23T22:25:17.9013624Z 238 │ controlledEventCount, 2026-10-23T22:25:17.9013699Z 239 │ assumedValue, 2026-10-23T22:25:17.9013760Z 240 │ ); 2026-10-23T22:25:17.9013933Z 241 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-23T22:25:17.9014078Z ·  ───────────┬────────── 2026-10-23T22:25:17.9014356Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-23T22:25:17.9014486Z 242 │ const acceptNativeEvent = useCallback( 2026-10-23T22:25:17.9014544Z ╰──── 2026-10-23T22:25:17.9014994Z  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-23T22:25:17.9015332Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9015335Z 2026-10-23T22:25:17.9015492Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.9015646Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:162:29] 2026-10-23T22:25:17.9015783Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T22:25:17.9015901Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T22:25:17.9016029Z ·  ─────────────┬──────────── 2026-10-23T22:25:17.9016210Z · ╰── Cannot access ref value during render 2026-10-23T22:25:17.9016279Z 163 │ }); 2026-10-23T22:25:17.9016334Z ╰──── 2026-10-23T22:25:17.9016834Z  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-23T22:25:17.9017152Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.9017158Z 2026-10-23T22:25:17.9017317Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.9017465Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:162:29] 2026-10-23T22:25:17.9017595Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T22:25:17.9017717Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T22:25:17.9017843Z ·  ─────────────┬──────────── 2026-10-23T22:25:17.9018065Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T22:25:17.9018124Z 163 │ }); 2026-10-23T22:25:17.9018189Z ╰──── 2026-10-23T22:25:17.9018698Z  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-23T22:25:17.9019014Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.9019017Z 2026-10-23T22:25:17.9019173Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.9019317Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:23] 2026-10-23T22:25:17.9019382Z 163 │ }); 2026-10-23T22:25:17.9019485Z 164 │ confirmedTokensRef.current = tokens; 2026-10-23T22:25:17.9019620Z ·  ─────────┬────────────┬─── 2026-10-23T22:25:17.9019888Z · │ ╰── Cannot update ref value during render 2026-10-23T22:25:17.9020049Z · ╰── This value is a ref 2026-10-23T22:25:17.9020132Z 165 │ return JSON.stringify( 2026-10-23T22:25:17.9020189Z ╰──── 2026-10-23T22:25:17.9020683Z  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-23T22:25:17.9020994Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.9020997Z 2026-10-23T22:25:17.9021152Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.9021306Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:206:5] 2026-10-23T22:25:17.9021406Z 205 │ mostRecentEventCount, 2026-10-23T22:25:17.9021526Z 206 │ nativeEventSnapshotsRef.current, 2026-10-23T22:25:17.9021643Z ·  ───────────────┬─────────────── 2026-10-23T22:25:17.9021850Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T22:25:17.9021912Z 207 │ ); 2026-10-23T22:25:17.9021967Z ╰──── 2026-10-23T22:25:17.9022471Z  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-23T22:25:17.9022785Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.9022791Z 2026-10-23T22:25:17.9022946Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.9023092Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:212:5] 2026-10-23T22:25:17.9023170Z 211 │ mostRecentEventCount, 2026-10-23T22:25:17.9023265Z 212 │ nativeEventSnapshotsRef.current, 2026-10-23T22:25:17.9023381Z ·  ───────────────┬─────────────── 2026-10-23T22:25:17.9023578Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T22:25:17.9023640Z 213 │ ); 2026-10-23T22:25:17.9023698Z ╰──── 2026-10-23T22:25:17.9024198Z  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-23T22:25:17.9024510Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.9024512Z 2026-10-23T22:25:17.9024710Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-23T22:25:17.9024859Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:197:6] 2026-10-23T22:25:17.9024989Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T22:25:17.9025111Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T22:25:17.9025227Z ·  ─────────┬──────── 2026-10-23T22:25:17.9025776Z · ╰── 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-23T22:25:17.9025876Z 163 │ }); 2026-10-23T22:25:17.9025975Z 164 │ confirmedTokensRef.current = tokens; 2026-10-23T22:25:17.9026053Z 165 │ return JSON.stringify( 2026-10-23T22:25:17.9026228Z 166 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-23T22:25:17.9026307Z 167 │ const record = 2026-10-23T22:25:17.9026397Z 168 │ token.type === "context" 2026-10-23T22:25:17.9026574Z 169 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-23T22:25:17.9026646Z 170 │ : undefined; 2026-10-23T22:25:17.9026769Z 171 │ const presentation = contextChipPresentation( 2026-10-23T22:25:17.9026891Z 172 │ token.type === "context" ? token.kind : token.type, 2026-10-23T22:25:17.9026958Z 173 │ record, 2026-10-23T22:25:17.9027024Z 174 │ ); 2026-10-23T22:25:17.9027117Z 175 │ const icon = contextChipIcon( 2026-10-23T22:25:17.9027192Z 176 │ presentation, 2026-10-23T22:25:17.9027343Z 177 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-23T22:25:17.9027409Z 178 │ ); 2026-10-23T22:25:17.9027480Z 179 │ return { 2026-10-23T22:25:17.9027560Z 180 │ type: token.type, 2026-10-23T22:25:17.9027638Z 181 │ source: token.source, 2026-10-23T22:25:17.9027720Z 182 │ start: token.start, 2026-10-23T22:25:17.9027794Z 183 │ end: token.end, 2026-10-23T22:25:17.9027893Z 184 │ accent: presentation.accent, 2026-10-23T22:25:17.9027962Z 185 │ label: 2026-10-23T22:25:17.9028050Z 186 │ token.type === "skill" 2026-10-23T22:25:17.9028167Z 187 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-23T22:25:17.9028261Z 188 │ : token.type === "context" 2026-10-23T22:25:17.9028510Z 189 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-23T22:25:17.9028601Z 190 │ : basename(token.value), 2026-10-23T22:25:17.9028756Z 191 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-23T22:25:17.9028857Z 192 │ iconUri: contextChipIconUri(icon), 2026-10-23T22:25:17.9028953Z 193 │ tintsIcon: icon.kind === "chip", 2026-10-23T22:25:17.9029018Z 194 │ }; 2026-10-23T22:25:17.9029084Z 195 │ }), 2026-10-23T22:25:17.9029152Z 196 │ ); 2026-10-23T22:25:17.9029262Z 197 │ }, [props.value, props.context, skillLabels]); 2026-10-23T22:25:17.9029400Z ·  ────────────────────┬──────────────────── 2026-10-23T22:25:17.9029615Z · ╰── This dependency list is missing values used by the callback 2026-10-23T22:25:17.9029766Z 198 │ // Every render resolves against the snapshot history, so a render whose 2026-10-23T22:25:17.9029822Z ╰──── 2026-10-23T22:25:17.9030048Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-23T22:25:17.9030456Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9030459Z 2026-10-23T22:25:17.9030729Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-23T22:25:17.9030914Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:259:5] 2026-10-23T22:25:17.9031055Z 251 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-23T22:25:17.9031166Z 252 │ nativeEventSnapshotsRef.current.push({ 2026-10-23T22:25:17.9031267Z ·  ───────────┬─────────── 2026-10-23T22:25:17.9031791Z · ╰── 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-23T22:25:17.9031892Z 253 │ eventCount: acknowledgedEventCount, 2026-10-23T22:25:17.9031966Z 254 │ value, 2026-10-23T22:25:17.9032061Z 255 │ selection: nextSelection, 2026-10-23T22:25:17.9032128Z 256 │ }); 2026-10-23T22:25:17.9032218Z 257 │ return acknowledgedEventCount; 2026-10-23T22:25:17.9032282Z 258 │ }, 2026-10-23T22:25:17.9032347Z 259 │ [], 2026-10-23T22:25:17.9032424Z ·  ─┬ 2026-10-23T22:25:17.9032620Z · ╰── This dependency list is missing values used by the callback 2026-10-23T22:25:17.9032682Z 260 │ ); 2026-10-23T22:25:17.9032739Z ╰──── 2026-10-23T22:25:17.9032955Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-23T22:25:17.9033292Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9033295Z 2026-10-23T22:25:17.9033580Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T22:25:17.9033768Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10578:7] 2026-10-23T22:25:17.9033831Z 10577 │ 2026-10-23T22:25:17.9033911Z 10578 │ const layer: Layer.Layer< 2026-10-23T22:25:17.9033992Z ·  ──┬── 2026-10-23T22:25:17.9034134Z · ╰── 'layer' is declared here 2026-10-23T22:25:17.9034240Z 10579 │ ProviderAdapter.ProviderAdapterV2, 2026-10-23T22:25:17.9034298Z ╰──── 2026-10-23T22:25:17.9034416Z  help: Consider removing this declaration. 2026-10-23T22:25:17.9034419Z 2026-10-23T22:25:17.9034603Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T22:25:17.9034770Z ╭─[apps/server/src/provider/Drivers/CodexDriver.test.ts:466:14] 2026-10-23T22:25:17.9034829Z 465 │ 2026-10-23T22:25:17.9034945Z 466 │ for (const {} of ["direct", "wrapper"] as const) { 2026-10-23T22:25:17.9035027Z ·  ── 2026-10-23T22:25:17.9035087Z 467 │ } 2026-10-23T22:25:17.9035142Z ╰──── 2026-10-23T22:25:17.9035391Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T22:25:17.9035393Z 2026-10-23T22:25:17.9035672Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T22:25:17.9035815Z ╭─[apps/mobile/src/state/use-vcs-action-state.ts:86:5] 2026-10-23T22:25:17.9035933Z 83 │ const [nowMs, setNowMs] = useState(() => Date.now()); 2026-10-23T22:25:17.9036065Z 84 │ useEffect(() => { 2026-10-23T22:25:17.9036184Z ·  ────┬──── 2026-10-23T22:25:17.9036330Z · ╰── This is the containing effect 2026-10-23T22:25:17.9036424Z 85 │ if (!actionState.isRunning) return; 2026-10-23T22:25:17.9036499Z 86 │ setNowMs(Date.now()); 2026-10-23T22:25:17.9036577Z ·  ────┬─── 2026-10-23T22:25:17.9036760Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.9036893Z 87 │ const interval = setInterval(() => setNowMs(Date.now()), 1000); 2026-10-23T22:25:17.9036950Z ╰──── 2026-10-23T22:25:17.9037600Z  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-23T22:25:17.9037950Z  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-23T22:25:17.9037953Z 2026-10-23T22:25:17.9038311Z ⚠ eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'. 2026-10-23T22:25:17.9038487Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1444:7] 2026-10-23T22:25:17.9038546Z 1443 │ 2026-10-23T22:25:17.9038675Z 1444 │ const layerCodexAppServerClientFactoryCommand = ( 2026-10-23T22:25:17.9038803Z ·  ───────────────────┬─────────────────── 2026-10-23T22:25:17.9039028Z · ╰── 'layerCodexAppServerClientFactoryCommand' is declared here 2026-10-23T22:25:17.9039166Z 1445 │ options: CodexClient.CodexAppServerClientOptions & { 2026-10-23T22:25:17.9039226Z ╰──── 2026-10-23T22:25:17.9039342Z  help: Consider removing this declaration. 2026-10-23T22:25:17.9039345Z 2026-10-23T22:25:17.9039718Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T22:25:17.9039945Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1680:7] 2026-10-23T22:25:17.9040005Z 1679 │ 2026-10-23T22:25:17.9040095Z 1680 │ const layer: Layer.Layer< 2026-10-23T22:25:17.9040214Z ·  ──┬── 2026-10-23T22:25:17.9040394Z · ╰── 'layer' is declared here 2026-10-23T22:25:17.9040560Z 1681 │ ProviderAdapter.ProviderAdapterV2, 2026-10-23T22:25:17.9040660Z ╰──── 2026-10-23T22:25:17.9040837Z  help: Consider removing this declaration. 2026-10-23T22:25:17.9040841Z 2026-10-23T22:25:17.9041026Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.9041304Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39] 2026-10-23T22:25:17.9041432Z 276 │ 2026-10-23T22:25:17.9041745Z 277 │ ╭─▶ return createElement(RawNativeView, { 2026-10-23T22:25:17.9041888Z 278 │ │ ...nativeProps, 2026-10-23T22:25:17.9042064Z 279 │ │ refreshEnabled: props.onPullToRefresh !== undefined, 2026-10-23T22:25:17.9042219Z 280 │ │ ref: nativeRef, 2026-10-23T22:25:17.9042449Z 281 │ ├─▶ }); 2026-10-23T22:25:17.9042858Z · ╰──── Passing a ref to a function may read its value during render 2026-10-23T22:25:17.9042955Z 282 │ } 2026-10-23T22:25:17.9043049Z ╰──── 2026-10-23T22:25:17.9043851Z  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-23T22:25:17.9044163Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.9044167Z 2026-10-23T22:25:17.9044574Z ⚠ 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-23T22:25:17.9044705Z ╭─[packages/contracts/src/auth.test.ts:17:12] 2026-10-23T22:25:17.9044878Z 16 │ it("decodes legacy review credentials without offering them in new grants", () => { 2026-10-23T22:25:17.9045062Z 17 │ expect(Schema.decodeUnknownSync(AuthEnvironmentScopes)(["review:write"])).toEqual([ 2026-10-23T22:25:17.9045175Z ·  ──────────────────────── 2026-10-23T22:25:17.9045254Z 18 │ "review:write", 2026-10-23T22:25:17.9045315Z ╰──── 2026-10-23T22:25:17.9045318Z 2026-10-23T22:25:17.9045709Z ⚠ 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-23T22:25:17.9045835Z ╭─[packages/contracts/src/auth.test.ts:20:18] 2026-10-23T22:25:17.9045904Z 19 │ ]); 2026-10-23T22:25:17.9046162Z 20 │ expect(() => Schema.decodeUnknownSync(AuthGrantScopes)(["review:write"])).toThrow(); 2026-10-23T22:25:17.9046340Z ·  ──────────────────────── 2026-10-23T22:25:17.9046563Z 21 │ expect(AuthStandardClientScopes).not.toContain("review:write"); 2026-10-23T22:25:17.9046651Z ╰──── 2026-10-23T22:25:17.9046654Z 2026-10-23T22:25:17.9047289Z ⚠ 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-23T22:25:17.9047477Z ╭─[packages/contracts/src/auth.test.ts:58:21] 2026-10-23T22:25:17.9047763Z 57 │ it("ignores unknown response permissions without falling back to broader scopes", () => { 2026-10-23T22:25:17.9048071Z 58 │ const session = Schema.decodeUnknownSync(AuthSessionState)({ 2026-10-23T22:25:17.9048302Z ·  ──────────────────────── 2026-10-23T22:25:17.9048418Z 59 │ authenticated: true, 2026-10-23T22:25:17.9048505Z ╰──── 2026-10-23T22:25:17.9048515Z 2026-10-23T22:25:17.9048905Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-23T22:25:17.9049214Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:1998:15] 2026-10-23T22:25:17.9049340Z 1997 │ assert.equal( 2026-10-23T22:25:17.9049604Z 1998 │ items.filter((item) => item.type === "assistant_message").at(-1)?.text, 2026-10-23T22:25:17.9049733Z ·  ────── 2026-10-23T22:25:17.9049847Z 1999 │ "authoritative answer", 2026-10-23T22:25:17.9049910Z ╰──── 2026-10-23T22:25:17.9050106Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-23T22:25:17.9050112Z 2026-10-23T22:25:17.9050614Z ⚠ 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-23T22:25:17.9050798Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:3951:7] 2026-10-23T22:25:17.9050991Z 3950 │ const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped); 2026-10-23T22:25:17.9051254Z 3951 │ ╭─▶ while (!responseLifecycle.includes("failed")) { 2026-10-23T22:25:17.9051442Z 3952 │ │ yield* Effect.yieldNow; 2026-10-23T22:25:17.9051626Z 3953 │ ╰─▶ } 2026-10-23T22:25:17.9051761Z 3954 │ const responseExit = yield* Fiber.join(responseFiber); 2026-10-23T22:25:17.9051817Z ╰──── 2026-10-23T22:25:17.9051820Z 2026-10-23T22:25:17.9052312Z ⚠ 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-23T22:25:17.9052491Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6062:9] 2026-10-23T22:25:17.9052589Z 6061 │ .pipe(Effect.forkScoped); 2026-10-23T22:25:17.9052792Z 6062 │ ╭─▶ while (promptGates.length < 1) { 2026-10-23T22:25:17.9052918Z 6063 │ │ yield* Effect.yieldNow; 2026-10-23T22:25:17.9053065Z 6064 │ ╰─▶ } 2026-10-23T22:25:17.9053247Z 6065 │ assert.isDefined(sessionUpdateHandler, "session update handler must be wired"); 2026-10-23T22:25:17.9053309Z ╰──── 2026-10-23T22:25:17.9053311Z 2026-10-23T22:25:17.9053798Z ⚠ 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-23T22:25:17.9053975Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6197:9] 2026-10-23T22:25:17.9054068Z 6196 │ .pipe(Effect.forkScoped); 2026-10-23T22:25:17.9054328Z 6197 │ ╭─▶ while (promptGates.length < 2) { 2026-10-23T22:25:17.9054480Z 6198 │ │ yield* Effect.yieldNow; 2026-10-23T22:25:17.9054625Z 6199 │ ╰─▶ } 2026-10-23T22:25:17.9054800Z 6200 │ if (sessionUpdateHandler === undefined || capturedMutation.current === null) { 2026-10-23T22:25:17.9054857Z ╰──── 2026-10-23T22:25:17.9054860Z 2026-10-23T22:25:17.9055105Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-23T22:25:17.9055261Z ╭─[packages/client-runtime/src/operations/projects.ts:228:51] 2026-10-23T22:25:17.9055329Z 227 │ ): string { 2026-10-23T22:25:17.9055498Z 228 │ const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? ""; 2026-10-23T22:25:17.9055630Z ·  ────── 2026-10-23T22:25:17.9055782Z 229 │ return target.owner ? `${target.owner}/${folderName}` : folderName; 2026-10-23T22:25:17.9055838Z ╰──── 2026-10-23T22:25:17.9056023Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-23T22:25:17.9056026Z 2026-10-23T22:25:17.9056229Z ⚠ eslint(no-unused-vars): Type 'Scope' is imported but never used. 2026-10-23T22:25:17.9056381Z ╭─[apps/server/src/provider/ProviderAuthService.ts:15:18] 2026-10-23T22:25:17.9056478Z 14 │ import * as Layer from "effect/Layer"; 2026-10-23T22:25:17.9056577Z 15 │ import type * as Scope from "effect/Scope"; 2026-10-23T22:25:17.9056665Z ·  ──┬── 2026-10-23T22:25:17.9056814Z · ╰── 'Scope' is imported here 2026-10-23T22:25:17.9056919Z 16 │ import * as Stream from "effect/Stream"; 2026-10-23T22:25:17.9056977Z ╰──── 2026-10-23T22:25:17.9057083Z  help: Consider removing this import. 2026-10-23T22:25:17.9057086Z 2026-10-23T22:25:17.9057284Z ⚠ react(static-components): Cannot create components during render 2026-10-23T22:25:17.9057457Z ╭─[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10] 2026-10-23T22:25:17.9057549Z 196 │ const { onInput, onResize } = props; 2026-10-23T22:25:17.9057712Z 197 │ const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView(); 2026-10-23T22:25:17.9057853Z ·  ────────────────┬─────────────── 2026-10-23T22:25:17.9058057Z · ╰── The component is created during render here 2026-10-23T22:25:17.9058201Z 198 │ const hasNativeSurface = Boolean(NativeTerminalSurfaceView); 2026-10-23T22:25:17.9058264Z 199 │ 2026-10-23T22:25:17.9058341Z 200 │ useEffect(() => { 2026-10-23T22:25:17.9058438Z 201 │ terminalDebugLog("native:surface", { 2026-10-23T22:25:17.9058529Z 202 │ terminalKey: props.terminalKey, 2026-10-23T22:25:17.9058614Z 203 │ native: hasNativeSurface, 2026-10-23T22:25:17.9058759Z 204 │ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(), 2026-10-23T22:25:17.9058853Z 205 │ bufferLen: props.buffer.length, 2026-10-23T22:25:17.9058936Z 206 │ isRunning: props.isRunning, 2026-10-23T22:25:17.9058998Z 207 │ }); 2026-10-23T22:25:17.9059171Z 208 │ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]); 2026-10-23T22:25:17.9059270Z 209 │ const handleNativeInput = useCallback( 2026-10-23T22:25:17.9059456Z 210 │ (event: NativeSyntheticEvent) => { 2026-10-23T22:25:17.9059604Z 211 │ if (!props.isRunning || props.readOnly) { 2026-10-23T22:25:17.9059674Z 212 │ return; 2026-10-23T22:25:17.9059734Z 213 │ } 2026-10-23T22:25:17.9059830Z 214 │ terminalDebugLog("native:onInput", { 2026-10-23T22:25:17.9059991Z 215 │ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)), 2026-10-23T22:25:17.9060054Z 216 │ }); 2026-10-23T22:25:17.9060148Z 217 │ onInput(event.nativeEvent.data); 2026-10-23T22:25:17.9060207Z 218 │ }, 2026-10-23T22:25:17.9060315Z 219 │ [onInput, props.isRunning, props.readOnly], 2026-10-23T22:25:17.9060374Z 220 │ ); 2026-10-23T22:25:17.9060469Z 221 │ const handleNativeResize = useCallback( 2026-10-23T22:25:17.9060593Z 222 │ (event: NativeSyntheticEvent) => { 2026-10-23T22:25:17.9060671Z 223 │ onResize({ 2026-10-23T22:25:17.9060768Z 224 │ cols: event.nativeEvent.cols, 2026-10-23T22:25:17.9060857Z 225 │ rows: event.nativeEvent.rows, 2026-10-23T22:25:17.9060924Z 226 │ }); 2026-10-23T22:25:17.9060986Z 227 │ }, 2026-10-23T22:25:17.9061058Z 228 │ [onResize], 2026-10-23T22:25:17.9061113Z 229 │ ); 2026-10-23T22:25:17.9061174Z 230 │ 2026-10-23T22:25:17.9061266Z 231 │ if (NativeTerminalSurfaceView) { 2026-10-23T22:25:17.9061334Z 232 │ return ( 2026-10-23T22:25:17.9061442Z 233 │ 2026-10-23T22:25:17.9061531Z 234 │ ({ key: input.targetKey, location: candidate })); 2026-10-23T22:25:17.9063307Z 113 │ useEffect(() => { 2026-10-23T22:25:17.9063386Z ·  ────┬──── 2026-10-23T22:25:17.9063526Z · ╰── This is the containing effect 2026-10-23T22:25:17.9063705Z 114 │ if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) { 2026-10-23T22:25:17.9063772Z 115 │ return; 2026-10-23T22:25:17.9063828Z 116 │ } 2026-10-23T22:25:17.9063955Z 117 │ setEntry({ key: input.targetKey, location: candidate }); 2026-10-23T22:25:17.9064034Z ·  ────┬─── 2026-10-23T22:25:17.9064214Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.9064342Z 118 │ }, [candidate, entry.key, entry.location, input.targetKey]); 2026-10-23T22:25:17.9064399Z ╰──── 2026-10-23T22:25:17.9065108Z  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-23T22:25:17.9065487Z  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-23T22:25:17.9065490Z 2026-10-23T22:25:17.9065700Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T22:25:17.9065868Z ╭─[apps/mobile/src/features/terminal/TerminalContextSheet.tsx:72:15] 2026-10-23T22:25:17.9065941Z 71 │ rest), 2026-10-23T22:25:17.9068290Z ·  ┬ 2026-10-23T22:25:17.9068469Z · ╰── '_' is declared here 2026-10-23T22:25:17.9068533Z 556 │ [ 2026-10-23T22:25:17.9068589Z ╰──── 2026-10-23T22:25:17.9068761Z  help: Consider removing this parameter. 2026-10-23T22:25:17.9068802Z 2026-10-23T22:25:17.9068997Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T22:25:17.9069184Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:1155:70] 2026-10-23T22:25:17.9069272Z 1154 │ assert.deepStrictEqual( 2026-10-23T22:25:17.9069453Z 1155 │ (yield* Ref.get(fixture.linkCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-23T22:25:17.9069583Z ·  ┬ 2026-10-23T22:25:17.9069760Z · ╰── '_' is declared here 2026-10-23T22:25:17.9069829Z 1156 │ [ 2026-10-23T22:25:17.9069893Z ╰──── 2026-10-23T22:25:17.9070012Z  help: Consider removing this parameter. 2026-10-23T22:25:17.9070017Z 2026-10-23T22:25:17.9070595Z ⚠ 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-23T22:25:17.9070780Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7] 2026-10-23T22:25:17.9113337Z 565 │ let afterSequence = created[0]!.sequence; 2026-10-23T22:25:17.9113739Z 566 │ ╭─▶ for (let index = 1; index <= 32; index += 1) { 2026-10-23T22:25:17.9113861Z 567 │ │ const nextEvent = { 2026-10-23T22:25:17.9114060Z 568 │ │ id: EventId.make(`event:foundation-stream-race:${index}`), 2026-10-23T22:25:17.9114221Z 569 │ │ type: "thread.metadata-updated" as const, 2026-10-23T22:25:17.9114324Z 570 │ │ threadId, 2026-10-23T22:25:17.9114441Z 571 │ │ providerInstanceId, 2026-10-23T22:25:17.9114548Z 572 │ │ occurredAt: now, 2026-10-23T22:25:17.9114712Z 573 │ │ payload: { ...thread, title: `Race update ${index}` }, 2026-10-23T22:25:17.9114880Z 574 │ │ } satisfies OrchestrationV2DomainEvent; 2026-10-23T22:25:17.9115027Z 575 │ │ const reader = yield* eventSink 2026-10-23T22:25:17.9115161Z 576 │ │ .stream({ threadId, afterSequence }) 2026-10-23T22:25:17.9115314Z 577 │ │ .pipe(Stream.runHead, Effect.forkChild); 2026-10-23T22:25:17.9115433Z 578 │ │ yield* Effect.yieldNow; 2026-10-23T22:25:17.9115613Z 579 │ │ const written = yield* eventSink.write({ events: [nextEvent] }); 2026-10-23T22:25:17.9115753Z 580 │ │ const received = yield* Fiber.join(reader); 2026-10-23T22:25:17.9115881Z 581 │ │ if (Option.isNone(received)) { 2026-10-23T22:25:17.9116098Z 582 │ │ return yield* Effect.die("The event stream ended before delivering the live event."); 2026-10-23T22:25:17.9116187Z 583 │ │ } 2026-10-23T22:25:17.9116364Z 584 │ │ assert.equal(received.value.sequence, written[0]?.sequence); 2026-10-23T22:25:17.9116522Z 585 │ │ assert.equal(received.value.event.id, nextEvent.id); 2026-10-23T22:25:17.9116876Z 586 │ │ afterSequence = received.value.sequence; 2026-10-23T22:25:17.9117077Z 587 │ ╰─▶ } 2026-10-23T22:25:17.9117147Z 588 │ }), 2026-10-23T22:25:17.9117205Z ╰──── 2026-10-23T22:25:17.9117211Z 2026-10-23T22:25:17.9117735Z ⚠ 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-23T22:25:17.9117931Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:2327:9] 2026-10-23T22:25:17.9118022Z 2326 │ let settled = false; 2026-10-23T22:25:17.9118196Z 2327 │ ╭─▶ while (!settled) { 2026-10-23T22:25:17.9118376Z 2328 │ │ settled = (yield* outbox.listByCommandId(commandId)).every( 2026-10-23T22:25:17.9118521Z 2329 │ │ (effect) => effect.status === "succeeded", 2026-10-23T22:25:17.9118612Z 2330 │ │ ); 2026-10-23T22:25:17.9118748Z 2331 │ │ if (!settled) yield* Effect.yieldNow; 2026-10-23T22:25:17.9118894Z 2332 │ ╰─▶ } 2026-10-23T22:25:17.9119021Z 2333 │ }).pipe(Effect.provide(layerWorker), Effect.scoped); 2026-10-23T22:25:17.9119079Z ╰──── 2026-10-23T22:25:17.9119082Z 2026-10-23T22:25:17.9119367Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T22:25:17.9119558Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:643:5] 2026-10-23T22:25:17.9119620Z 638 │ 2026-10-23T22:25:17.9119697Z 639 │ useEffect(() => { 2026-10-23T22:25:17.9119787Z ·  ────┬──── 2026-10-23T22:25:17.9119930Z · ╰── This is the containing effect 2026-10-23T22:25:17.9120049Z 640 │ if (pendingLaunchEntry.key === launchTargetKey) { 2026-10-23T22:25:17.9120119Z 641 │ return; 2026-10-23T22:25:17.9120178Z 642 │ } 2026-10-23T22:25:17.9120258Z 643 │ setPendingLaunchEntry({ 2026-10-23T22:25:17.9120354Z ·  ──────────┬────────── 2026-10-23T22:25:17.9120540Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.9120617Z 644 │ key: launchTargetKey, 2026-10-23T22:25:17.9120674Z ╰──── 2026-10-23T22:25:17.9121360Z  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-23T22:25:17.9121760Z  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-23T22:25:17.9121763Z 2026-10-23T22:25:17.9122043Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T22:25:17.9122225Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5] 2026-10-23T22:25:17.9122281Z 648 │ 2026-10-23T22:25:17.9122409Z 649 │ useEffect(() => { 2026-10-23T22:25:17.9122515Z ·  ────┬──── 2026-10-23T22:25:17.9122654Z · ╰── This is the containing effect 2026-10-23T22:25:17.9122777Z 650 │ if (initialAttachGridEntry.key === launchTargetKey) { 2026-10-23T22:25:17.9122845Z 651 │ return; 2026-10-23T22:25:17.9122903Z 652 │ } 2026-10-23T22:25:17.9122989Z 653 │ setInitialAttachGridEntry({ 2026-10-23T22:25:17.9123092Z ·  ────────────┬──────────── 2026-10-23T22:25:17.9123277Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.9123356Z 654 │ key: launchTargetKey, 2026-10-23T22:25:17.9123409Z ╰──── 2026-10-23T22:25:17.9124062Z  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-23T22:25:17.9124415Z  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-23T22:25:17.9124418Z 2026-10-23T22:25:17.9124693Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T22:25:17.9124872Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7] 2026-10-23T22:25:17.9124929Z 743 │ 2026-10-23T22:25:17.9125001Z 744 │ useEffect(() => { 2026-10-23T22:25:17.9125078Z ·  ────┬──── 2026-10-23T22:25:17.9125222Z · ╰── This is the containing effect 2026-10-23T22:25:17.9125333Z 745 │ if (!routeEnvironmentId || !routeThreadId) { 2026-10-23T22:25:17.9125407Z 746 │ setLastGridSize({ 2026-10-23T22:25:17.9125497Z ·  ───────┬─────── 2026-10-23T22:25:17.9125680Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.9125767Z 747 │ cols: DEFAULT_TERMINAL_COLS, 2026-10-23T22:25:17.9125823Z ╰──── 2026-10-23T22:25:17.9126466Z  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-23T22:25:17.9126818Z  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-23T22:25:17.9126824Z 2026-10-23T22:25:17.9127043Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T22:25:17.9127222Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24] 2026-10-23T22:25:17.9127284Z 537 │ }); 2026-10-23T22:25:17.9127424Z 538 │ }, [terminal.buffer, terminal.buffer.length, terminalKey]); 2026-10-23T22:25:17.9127546Z ·  ───────────┬────────── 2026-10-23T22:25:17.9127810Z · ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead 2026-10-23T22:25:17.9128038Z 539 │ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null; 2026-10-23T22:25:17.9128126Z ╰──── 2026-10-23T22:25:17.9128446Z  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-23T22:25:17.9128782Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9128785Z 2026-10-23T22:25:17.9128998Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T22:25:17.9129177Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7] 2026-10-23T22:25:17.9129283Z 708 │ sentInitialInputKeyRef.current = null; 2026-10-23T22:25:17.9129358Z 709 │ }, [terminalKey]); 2026-10-23T22:25:17.9129444Z ·  ─────┬───── 2026-10-23T22:25:17.9129602Z · ╰── Unnecessary dependency `terminalKey` 2026-10-23T22:25:17.9129661Z 710 │ 2026-10-23T22:25:17.9129715Z ╰──── 2026-10-23T22:25:17.9130027Z  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-23T22:25:17.9130360Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9130363Z 2026-10-23T22:25:17.9130577Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T22:25:17.9130757Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52] 2026-10-23T22:25:17.9130817Z 799 │ }; 2026-10-23T22:25:17.9131023Z 800 │ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]); 2026-10-23T22:25:17.9131223Z ·  ────────────┬──────────── ─────┬───── 2026-10-23T22:25:17.9131516Z · │ ╰── Unnecessary dependency `terminalKey` 2026-10-23T22:25:17.9131744Z · ╰── Unnecessary dependency `terminal.lifecycleVersion` 2026-10-23T22:25:17.9131801Z 801 │ 2026-10-23T22:25:17.9131855Z ╰──── 2026-10-23T22:25:17.9132168Z  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-23T22:25:17.9132508Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9132514Z 2026-10-23T22:25:17.9132668Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.9132850Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24] 2026-10-23T22:25:17.9132909Z 792 │ } 2026-10-23T22:25:17.9133024Z 793 │ const pasteSession = pasteSessionRef.current; 2026-10-23T22:25:17.9133145Z ·  ───────────┬─────────── 2026-10-23T22:25:17.9133320Z · ╰── Cannot access ref value during render 2026-10-23T22:25:17.9133377Z 794 │ 2026-10-23T22:25:17.9133432Z ╰──── 2026-10-23T22:25:17.9133992Z  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-23T22:25:17.9134340Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.9134342Z 2026-10-23T22:25:17.9134513Z ⚠ react(immutability): This value cannot be modified 2026-10-23T22:25:17.9134682Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-23T22:25:17.9134739Z  86 │ 2026-10-23T22:25:17.9134839Z  87 │ const cardCoverage = props.cardCoverage; 2026-10-23T22:25:17.9134929Z ·  ──────┬───── 2026-10-23T22:25:17.9135084Z · ╰── `cardCoverage` originates here 2026-10-23T22:25:17.9135176Z  88 │ const barHeightRef = useRef(0); 2026-10-23T22:25:17.9135262Z  89 │ const cardHeightRef = useRef(0); 2026-10-23T22:25:17.9135357Z  90 │ const cardHeight = useSharedValue(0); 2026-10-23T22:25:17.9135459Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-23T22:25:17.9135533Z  92 │ if (!cardCoverage) { 2026-10-23T22:25:17.9135598Z  93 │ return; 2026-10-23T22:25:17.9135656Z  94 │ } 2026-10-23T22:25:17.9135823Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-23T22:25:17.9135918Z  96 │ if (coverage === cardCoverage.value) { 2026-10-23T22:25:17.9135980Z  97 │ return; 2026-10-23T22:25:17.9136037Z  98 │ } 2026-10-23T22:25:17.9136126Z  99 │ if (cardCoverage.value === 0) { 2026-10-23T22:25:17.9136223Z 100 │ cardCoverage.value = coverage; 2026-10-23T22:25:17.9136310Z ·  ──────┬───── 2026-10-23T22:25:17.9136462Z · ╰── `cardCoverage` cannot be modified 2026-10-23T22:25:17.9136528Z 101 │ return; 2026-10-23T22:25:17.9136585Z ╰──── 2026-10-23T22:25:17.9136901Z  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-23T22:25:17.9137228Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T22:25:17.9137231Z 2026-10-23T22:25:17.9137401Z ⚠ react(immutability): This value cannot be modified 2026-10-23T22:25:17.9137623Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7] 2026-10-23T22:25:17.9137744Z  89 │ const cardHeightRef = useRef(0); 2026-10-23T22:25:17.9137837Z  90 │ const cardHeight = useSharedValue(0); 2026-10-23T22:25:17.9137923Z ·  ─────┬──── 2026-10-23T22:25:17.9138067Z · ╰── `cardHeight` originates here 2026-10-23T22:25:17.9138168Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-23T22:25:17.9138243Z  92 │ if (!cardCoverage) { 2026-10-23T22:25:17.9138307Z  93 │ return; 2026-10-23T22:25:17.9138365Z  94 │ } 2026-10-23T22:25:17.9138523Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-23T22:25:17.9138619Z  96 │ if (coverage === cardCoverage.value) { 2026-10-23T22:25:17.9138680Z  97 │ return; 2026-10-23T22:25:17.9138736Z  98 │ } 2026-10-23T22:25:17.9138828Z  99 │ if (cardCoverage.value === 0) { 2026-10-23T22:25:17.9138918Z 100 │ cardCoverage.value = coverage; 2026-10-23T22:25:17.9138982Z 101 │ return; 2026-10-23T22:25:17.9139039Z 102 │ } 2026-10-23T22:25:17.9139146Z 103 │ cardCoverage.value = withTiming(coverage, { 2026-10-23T22:25:17.9139252Z 104 │ duration: USER_INPUT_TOGGLE_DURATION_MS, 2026-10-23T22:25:17.9139343Z 105 │ easing: Easing.out(Easing.cubic), 2026-10-23T22:25:17.9139400Z 106 │ }); 2026-10-23T22:25:17.9139474Z 107 │ }, [cardCoverage]); 2026-10-23T22:25:17.9139566Z 108 │ const handleBarLayout = useCallback( 2026-10-23T22:25:17.9139653Z 109 │ (event: LayoutChangeEvent) => { 2026-10-23T22:25:17.9139786Z 110 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-23T22:25:17.9139860Z 111 │ notifyCoverage(); 2026-10-23T22:25:17.9139925Z 112 │ }, 2026-10-23T22:25:17.9140002Z 113 │ [notifyCoverage], 2026-10-23T22:25:17.9140062Z 114 │ ); 2026-10-23T22:25:17.9140155Z 115 │ const handleCardLayout = useCallback( 2026-10-23T22:25:17.9140241Z 116 │ (event: LayoutChangeEvent) => { 2026-10-23T22:25:17.9140375Z 117 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-23T22:25:17.9140496Z 118 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-23T22:25:17.9140581Z ·  ─────┬──── 2026-10-23T22:25:17.9140733Z · ╰── `cardHeight` cannot be modified 2026-10-23T22:25:17.9140807Z 119 │ notifyCoverage(); 2026-10-23T22:25:17.9140861Z ╰──── 2026-10-23T22:25:17.9141152Z  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-23T22:25:17.9141521Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T22:25:17.9141528Z 2026-10-23T22:25:17.9141745Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T22:25:17.9141911Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-23T22:25:17.9142004Z  90 │ const cardHeight = useSharedValue(0); 2026-10-23T22:25:17.9142107Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-23T22:25:17.9142218Z ·  ───┬─── 2026-10-23T22:25:17.9142473Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-23T22:25:17.9142604Z  92 │ if (!cardCoverage) { 2026-10-23T22:25:17.9142733Z  93 │ return; 2026-10-23T22:25:17.9142791Z  94 │ } 2026-10-23T22:25:17.9142950Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-23T22:25:17.9143046Z  96 │ if (coverage === cardCoverage.value) { 2026-10-23T22:25:17.9143110Z  97 │ return; 2026-10-23T22:25:17.9143171Z  98 │ } 2026-10-23T22:25:17.9143256Z  99 │ if (cardCoverage.value === 0) { 2026-10-23T22:25:17.9143346Z 100 │ cardCoverage.value = coverage; 2026-10-23T22:25:17.9143434Z ·  ──────┬───── 2026-10-23T22:25:17.9143580Z · ╰── This modifies `cardCoverage` 2026-10-23T22:25:17.9143643Z 101 │ return; 2026-10-23T22:25:17.9143700Z ╰──── 2026-10-23T22:25:17.9144073Z  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-23T22:25:17.9144405Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T22:25:17.9144408Z 2026-10-23T22:25:17.9144621Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T22:25:17.9144786Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-23T22:25:17.9144876Z  99 │ if (cardCoverage.value === 0) { 2026-10-23T22:25:17.9144964Z 100 │ cardCoverage.value = coverage; 2026-10-23T22:25:17.9145048Z ·  ──────┬───── 2026-10-23T22:25:17.9145188Z · ╰── This modifies `cardCoverage` 2026-10-23T22:25:17.9145259Z 101 │ return; 2026-10-23T22:25:17.9145321Z 102 │ } 2026-10-23T22:25:17.9145435Z 103 │ cardCoverage.value = withTiming(coverage, { 2026-10-23T22:25:17.9145538Z 104 │ duration: USER_INPUT_TOGGLE_DURATION_MS, 2026-10-23T22:25:17.9145630Z 105 │ easing: Easing.out(Easing.cubic), 2026-10-23T22:25:17.9145690Z 106 │ }); 2026-10-23T22:25:17.9145762Z 107 │ }, [cardCoverage]); 2026-10-23T22:25:17.9145853Z 108 │ const handleBarLayout = useCallback( 2026-10-23T22:25:17.9145941Z 109 │ (event: LayoutChangeEvent) => { 2026-10-23T22:25:17.9146056Z ·  ───────────────┬─────────────── 2026-10-23T22:25:17.9146295Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-23T22:25:17.9146429Z 110 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-23T22:25:17.9146491Z ╰──── 2026-10-23T22:25:17.9146858Z  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-23T22:25:17.9147190Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T22:25:17.9147193Z 2026-10-23T22:25:17.9147405Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T22:25:17.9147572Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7] 2026-10-23T22:25:17.9147667Z 115 │ const handleCardLayout = useCallback( 2026-10-23T22:25:17.9147755Z 116 │ (event: LayoutChangeEvent) => { 2026-10-23T22:25:17.9147921Z ·  ───────────────┬─────────────── 2026-10-23T22:25:17.9148197Z · ╰── This function may (indirectly) reassign or modify `cardHeight` after render 2026-10-23T22:25:17.9148332Z 117 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-23T22:25:17.9148453Z 118 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-23T22:25:17.9148533Z ·  ─────┬──── 2026-10-23T22:25:17.9148673Z · ╰── This modifies `cardHeight` 2026-10-23T22:25:17.9148747Z 119 │ notifyCoverage(); 2026-10-23T22:25:17.9148803Z ╰──── 2026-10-23T22:25:17.9149164Z  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-23T22:25:17.9149496Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T22:25:17.9149502Z 2026-10-23T22:25:17.9149719Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T22:25:17.9149843Z ╭─[apps/mobile/src/state/thread-order.ts:29:7] 2026-10-23T22:25:17.9149926Z 28 │ getPendingThreadOrder(); 2026-10-23T22:25:17.9150011Z 29 │ }, [nowMinute, snoozeWakeTick]); 2026-10-23T22:25:17.9150216Z ·  ────┬──── ───────┬────── 2026-10-23T22:25:17.9150423Z · │ ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-23T22:25:17.9150573Z · ╰── Unnecessary dependency `nowMinute` 2026-10-23T22:25:17.9150650Z 30 │ return pending; 2026-10-23T22:25:17.9150711Z ╰──── 2026-10-23T22:25:17.9151025Z  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-23T22:25:17.9151392Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9151395Z 2026-10-23T22:25:17.9151690Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-23T22:25:17.9151814Z ╭─[apps/server/src/usage/UsageService.ts:169:7] 2026-10-23T22:25:17.9151873Z 168 │ 2026-10-23T22:25:17.9151958Z 169 │ const layerTest = Layer.succeed( 2026-10-23T22:25:17.9152038Z ·  ────┬──── 2026-10-23T22:25:17.9152185Z · ╰── 'layerTest' is declared here 2026-10-23T22:25:17.9152259Z 170 │ UsageService, 2026-10-23T22:25:17.9152312Z ╰──── 2026-10-23T22:25:17.9152426Z  help: Consider removing this declaration. 2026-10-23T22:25:17.9152431Z 2026-10-23T22:25:17.9152730Z ⚠ eslint(no-unused-vars): Variable 'layerUnavailable' is declared but never used. Unused variables should start with a '_'. 2026-10-23T22:25:17.9152886Z ╭─[apps/server/src/orchestration-v2/Orchestrator.ts:12340:7] 2026-10-23T22:25:17.9152945Z 12339 │ 2026-10-23T22:25:17.9153101Z 12340 │ const layerUnavailable: Layer.Layer = Layer.succeed( 2026-10-23T22:25:17.9153195Z ·  ────────┬─────── 2026-10-23T22:25:17.9153433Z · ╰── 'layerUnavailable' is declared here 2026-10-23T22:25:17.9153548Z 12341 │ OrchestratorV2, 2026-10-23T22:25:17.9153605Z ╰──── 2026-10-23T22:25:17.9153717Z  help: Consider removing this declaration. 2026-10-23T22:25:17.9153719Z 2026-10-23T22:25:17.9153928Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T22:25:17.9154092Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:223:31] 2026-10-23T22:25:17.9154208Z 222 │ ? snippetTokens.map((line, lineIndex) => ( 2026-10-23T22:25:17.9154309Z 223 │ 2026-10-23T22:25:17.9154426Z ·  ─────────────── 2026-10-23T22:25:17.9154529Z 224 │ {lineIndex > 0 ? "\n" : ""} 2026-10-23T22:25:17.9154586Z ╰──── 2026-10-23T22:25:17.9154749Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-23T22:25:17.9154755Z 2026-10-23T22:25:17.9154961Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T22:25:17.9155121Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25] 2026-10-23T22:25:17.9155204Z 226 │ void> = []; 2026-10-23T22:25:17.9157019Z 2385 │ │ const dispatcher: Scheduler.SchedulerDispatcher = { 2026-10-23T22:25:17.9157159Z 2386 │ │ scheduleTask: (task) => tasks.push(task), 2026-10-23T22:25:17.9157274Z 2387 │ │ flush: () => { 2026-10-23T22:25:17.9157408Z 2388 │ │ let task: (() => void) | undefined; 2026-10-23T22:25:17.9157567Z 2389 │ │ while ((task = tasks.shift()) !== undefined) task(); 2026-10-23T22:25:17.9157659Z 2390 │ │ }, 2026-10-23T22:25:17.9157749Z 2391 │ │ }; 2026-10-23T22:25:17.9157824Z 2392 │ │ 2026-10-23T22:25:17.9157998Z 2393 │ │ let requestFiber: Fiber.Fiber | undefined; 2026-10-23T22:25:17.9158112Z 2394 │ │ let requestChecks = 0; 2026-10-23T22:25:17.9158252Z 2395 │ │ const scheduler: Scheduler.Scheduler = { 2026-10-23T22:25:17.9158369Z 2396 │ │ executionMode: "async", 2026-10-23T22:25:17.9158554Z 2397 │ │ makeDispatcher: () => dispatcher, 2026-10-23T22:25:17.9158706Z 2398 │ │ shouldYield: (fiber) => { 2026-10-23T22:25:17.9158849Z 2399 │ │ if (fiber !== requestFiber) return false; 2026-10-23T22:25:17.9158961Z 2400 │ │ requestChecks += 1; 2026-10-23T22:25:17.9159116Z 2401 │ │ if (requestChecks !== interruptAt) return false; 2026-10-23T22:25:17.9159241Z 2402 │ │ fiber.interruptUnsafe(); 2026-10-23T22:25:17.9159348Z 2403 │ │ return true; 2026-10-23T22:25:17.9159436Z 2404 │ │ }, 2026-10-23T22:25:17.9159525Z 2405 │ │ }; 2026-10-23T22:25:17.9159602Z 2406 │ │ 2026-10-23T22:25:17.9159741Z 2407 │ │ const input: UsageSummaryInput = { 2026-10-23T22:25:17.9159844Z 2408 │ │ ...WINDOW, 2026-10-23T22:25:17.9159984Z 2409 │ │ sinceDay: UsageDay.make("2026-09-01"), 2026-10-23T22:25:17.9160204Z 2410 │ │ untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`), 2026-10-23T22:25:17.9160291Z 2411 │ │ }; 2026-10-23T22:25:17.9160411Z 2412 │ │ const first = yield* service 2026-10-23T22:25:17.9160527Z 2413 │ │ .readSummary(input) 2026-10-23T22:25:17.9160626Z 2414 │ │ .pipe( 2026-10-23T22:25:17.9160733Z 2415 │ │ Effect.exit, 2026-10-23T22:25:17.9160910Z 2416 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-23T22:25:17.9161032Z 2417 │ │ Effect.forkChild, 2026-10-23T22:25:17.9161124Z 2418 │ │ ); 2026-10-23T22:25:17.9161234Z 2419 │ │ requestFiber = first; 2026-10-23T22:25:17.9161358Z 2420 │ │ yield* Effect.yieldNow; 2026-10-23T22:25:17.9161504Z 2421 │ │ dispatcher.flush(); 2026-10-23T22:25:17.9161586Z 2422 │ │ 2026-10-23T22:25:17.9161753Z 2423 │ │ const second = yield* service.readSummary(input).pipe( 2026-10-23T22:25:17.9161858Z 2424 │ │ Effect.match({ 2026-10-23T22:25:17.9161994Z 2425 │ │ onFailure: (error) => error.reason, 2026-10-23T22:25:17.9162183Z 2426 │ │ onSuccess: () => "success" as const, 2026-10-23T22:25:17.9162302Z 2427 │ │ }), 2026-10-23T22:25:17.9162470Z 2428 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-23T22:25:17.9162579Z 2429 │ │ Effect.forkChild, 2026-10-23T22:25:17.9162666Z 2430 │ │ ); 2026-10-23T22:25:17.9162780Z 2431 │ │ yield* Effect.yieldNow; 2026-10-23T22:25:17.9162891Z 2432 │ │ dispatcher.flush(); 2026-10-23T22:25:17.9163025Z 2433 │ │ const secondExit = second.pollUnsafe(); 2026-10-23T22:25:17.9163152Z 2434 │ │ if (secondExit === undefined) { 2026-10-23T22:25:17.9163275Z 2435 │ │ second.interruptUnsafe(); 2026-10-23T22:25:17.9163401Z 2436 │ │ orphanedAt = interruptAt; 2026-10-23T22:25:17.9163498Z 2437 │ │ break; 2026-10-23T22:25:17.9163584Z 2438 │ │ } 2026-10-23T22:25:17.9163715Z 2439 │ │ if (Exit.isFailure(secondExit)) { 2026-10-23T22:25:17.9163887Z 2440 │ │ assert.fail("the matching request fiber was interrupted"); 2026-10-23T22:25:17.9163970Z 2441 │ │ } 2026-10-23T22:25:17.9164135Z 2442 │ │ assert.strictEqual(secondExit.value, "invalidWindow"); 2026-10-23T22:25:17.9164281Z 2443 │ ╰─▶ } 2026-10-23T22:25:17.9164344Z 2444 │ 2026-10-23T22:25:17.9164399Z ╰──── 2026-10-23T22:25:17.9164402Z 2026-10-23T22:25:17.9164697Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T22:25:17.9164883Z ╭─[apps/mobile/src/features/review/ReviewCommentComposerSheet.tsx:103:7] 2026-10-23T22:25:17.9164942Z 100 │ 2026-10-23T22:25:17.9165016Z 101 │ useEffect(() => { 2026-10-23T22:25:17.9165100Z ·  ────┬──── 2026-10-23T22:25:17.9165245Z · ╰── This is the containing effect 2026-10-23T22:25:17.9165358Z 102 │ if (!target || selectedLines.length === 0) { 2026-10-23T22:25:17.9165447Z 103 │ setHighlightedLinesById({}); 2026-10-23T22:25:17.9165549Z ·  ───────────┬─────────── 2026-10-23T22:25:17.9165739Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.9165808Z 104 │ return; 2026-10-23T22:25:17.9165870Z ╰──── 2026-10-23T22:25:17.9166528Z  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-23T22:25:17.9166882Z  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-23T22:25:17.9166885Z 2026-10-23T22:25:17.9167106Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-23T22:25:17.9167223Z ╭─[packages/contracts/src/rpc.ts:295:8] 2026-10-23T22:25:17.9167295Z 294 │ } from "./device.ts"; 2026-10-23T22:25:17.9167446Z 295 │ import {} from "./previewAutomation.ts"; 2026-10-23T22:25:17.9167551Z ·  ── 2026-10-23T22:25:17.9167617Z 296 │ import { 2026-10-23T22:25:17.9167670Z ╰──── 2026-10-23T22:25:17.9167765Z  help: Remove empty braces 2026-10-23T22:25:17.9167768Z 2026-10-23T22:25:17.9168273Z ⚠ 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-23T22:25:17.9168436Z ╭─[apps/server/src/background/HostPowerMonitor.test.ts:133:11] 2026-10-23T22:25:17.9168579Z 132 │ const monitor = yield* HostPowerMonitor.HostPowerMonitor; 2026-10-23T22:25:17.9168737Z 133 │ ╭─▶ for ( 2026-10-23T22:25:17.9168853Z 134 │ │ let attempt = 0; 2026-10-23T22:25:17.9169038Z 135 │ │ attempt < 100 && (yield* monitor.snapshot).onBattery !== "true"; 2026-10-23T22:25:17.9169144Z 136 │ │ attempt += 1 2026-10-23T22:25:17.9169235Z 137 │ │ ) { 2026-10-23T22:25:17.9169356Z 138 │ │ yield* Effect.yieldNow; 2026-10-23T22:25:17.9169503Z 139 │ ╰─▶ } 2026-10-23T22:25:17.9169639Z 140 │ expect((yield* monitor.snapshot).onBattery).toBe("true"); 2026-10-23T22:25:17.9169696Z ╰──── 2026-10-23T22:25:17.9169698Z 2026-10-23T22:25:17.9169980Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T22:25:17.9170189Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:107:5] 2026-10-23T22:25:17.9170250Z 104 │ 2026-10-23T22:25:17.9170321Z 105 │ useEffect(() => { 2026-10-23T22:25:17.9170402Z ·  ────┬──── 2026-10-23T22:25:17.9170544Z · ╰── This is the containing effect 2026-10-23T22:25:17.9170630Z 106 │ clearReviewCommentTarget(); 2026-10-23T22:25:17.9170736Z 107 │ setPendingNativeCommentSelection(null); 2026-10-23T22:25:17.9170855Z ·  ────────────────┬─────────────── 2026-10-23T22:25:17.9171048Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.9171127Z 108 │ }, [selectedSection?.id]); 2026-10-23T22:25:17.9171186Z ╰──── 2026-10-23T22:25:17.9171876Z  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-23T22:25:17.9172228Z  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-23T22:25:17.9172231Z 2026-10-23T22:25:17.9172510Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T22:25:17.9172712Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7] 2026-10-23T22:25:17.9172768Z 109 │ 2026-10-23T22:25:17.9172839Z 110 │ useEffect(() => { 2026-10-23T22:25:17.9172974Z ·  ────┬──── 2026-10-23T22:25:17.9173137Z · ╰── This is the containing effect 2026-10-23T22:25:17.9173235Z 111 │ if (activeCommentTarget === null) { 2026-10-23T22:25:17.9173344Z 112 │ setPendingNativeCommentSelection(null); 2026-10-23T22:25:17.9173460Z ·  ────────────────┬─────────────── 2026-10-23T22:25:17.9173650Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.9173710Z 113 │ } 2026-10-23T22:25:17.9173768Z ╰──── 2026-10-23T22:25:17.9174418Z  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-23T22:25:17.9174768Z  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-23T22:25:17.9174770Z 2026-10-23T22:25:17.9174983Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T22:25:17.9175185Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7] 2026-10-23T22:25:17.9175293Z 107 │ setPendingNativeCommentSelection(null); 2026-10-23T22:25:17.9175374Z 108 │ }, [selectedSection?.id]); 2026-10-23T22:25:17.9175468Z ·  ─────────┬───────── 2026-10-23T22:25:17.9175644Z · ╰── Unnecessary dependency `selectedSection?.id` 2026-10-23T22:25:17.9175703Z 109 │ 2026-10-23T22:25:17.9175765Z ╰──── 2026-10-23T22:25:17.9176086Z  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-23T22:25:17.9176423Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9176425Z 2026-10-23T22:25:17.9176929Z ⚠ 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-23T22:25:17.9177079Z ╭─[packages/contracts/src/composerContext.test.ts:181:18] 2026-10-23T22:25:17.9177233Z 180 │ it("sends a message without the records the wire cannot carry", () => { 2026-10-23T22:25:17.9177428Z 181 │ const wire = Schema.encodeUnknownSync(Schema.toCodecJson(OrchestrationMessageContext))({ 2026-10-23T22:25:17.9177545Z ·  ──────────────────────── 2026-10-23T22:25:17.9177618Z 182 │ version: 1, 2026-10-23T22:25:17.9177677Z ╰──── 2026-10-23T22:25:17.9177679Z 2026-10-23T22:25:17.9177959Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T22:25:17.9178096Z ╭─[apps/server/src/serverRuntimeStartup.ts:728:7] 2026-10-23T22:25:17.9178153Z 727 │ 2026-10-23T22:25:17.9178244Z 728 │ const layer = layerWithOptions(); 2026-10-23T22:25:17.9178318Z ·  ──┬── 2026-10-23T22:25:17.9178452Z · ╰── 'layer' is declared here 2026-10-23T22:25:17.9178510Z ╰──── 2026-10-23T22:25:17.9178683Z  help: Consider removing this declaration. 2026-10-23T22:25:17.9178716Z 2026-10-23T22:25:17.9179196Z ⚠ 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-23T22:25:17.9179330Z ╭─[apps/server/src/serverSettings.test.ts:1741:32] 2026-10-23T22:25:17.9179518Z 1740 │ const model = createModelSelection(ProviderInstanceId.make("codex"), "gpt-5.5"); 2026-10-23T22:25:17.9179721Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-23T22:25:17.9179846Z ·  ─────────────────── 2026-10-23T22:25:17.9179963Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-23T22:25:17.9180031Z ╰──── 2026-10-23T22:25:17.9180037Z 2026-10-23T22:25:17.9180515Z ⚠ 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-23T22:25:17.9180649Z ╭─[apps/server/src/serverSettings.test.ts:1742:34] 2026-10-23T22:25:17.9180847Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-23T22:25:17.9180963Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-23T22:25:17.9181089Z ·  ─────────────────── 2026-10-23T22:25:17.9181219Z 1743 │ Schema.fromJsonString(Schema.Array(ProjectScript)), 2026-10-23T22:25:17.9181277Z ╰──── 2026-10-23T22:25:17.9181280Z 2026-10-23T22:25:17.9181801Z ⚠ 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-23T22:25:17.9181940Z ╭─[packages/contracts/src/baseSchemas.test.ts:39:9] 2026-10-23T22:25:17.9182015Z 38 │ JSON.stringify( 2026-10-23T22:25:17.9182146Z 39 │ Schema.encodeUnknownSync(Schema.toCodecJson(Named))([ 2026-10-23T22:25:17.9182250Z ·  ──────────────────────── 2026-10-23T22:25:17.9182327Z 40 │ { name: "a" }, 2026-10-23T22:25:17.9182385Z ╰──── 2026-10-23T22:25:17.9182387Z 2026-10-23T22:25:17.9182606Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T22:25:17.9182764Z ╭─[apps/mobile/src/state/use-thread-outbox-drain.ts:1315:5] 2026-10-23T22:25:17.9182858Z 1314 │ queuedMessagesByThreadKey, 2026-10-23T22:25:17.9182931Z 1315 │ retryTick, 2026-10-23T22:25:17.9183012Z ·  ────┬──── 2026-10-23T22:25:17.9183165Z · ╰── Unnecessary dependency `retryTick` 2026-10-23T22:25:17.9183245Z 1316 │ restoreQueuedMessage, 2026-10-23T22:25:17.9183305Z ╰──── 2026-10-23T22:25:17.9183629Z  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-23T22:25:17.9183964Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9183969Z 2026-10-23T22:25:17.9184529Z ⚠ 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-23T22:25:17.9184692Z ╭─[packages/effect-acp/src/errors.test.ts:129:28] 2026-10-23T22:25:17.9184797Z 128 │ const secret = "acp-summary-secret"; 2026-10-23T22:25:17.9184919Z 129 │ const cause = yield* Schema.decodeUnknownEffect( 2026-10-23T22:25:17.9185045Z ·  ────────────────────────── 2026-10-23T22:25:17.9185122Z 130 │ Schema.Struct({ 2026-10-23T22:25:17.9185180Z ╰──── 2026-10-23T22:25:17.9185182Z 2026-10-23T22:25:17.9185591Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownEffect(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const. 2026-10-23T22:25:17.9185717Z ╭─[packages/effect-acp/src/client.ts:1269:11] 2026-10-23T22:25:17.9185881Z 1268 │ extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) => 2026-10-23T22:25:17.9186068Z 1269 │ Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe( 2026-10-23T22:25:17.9186185Z ·  ────────────────────────── 2026-10-23T22:25:17.9186342Z 1270 │ Effect.mapError(() => AcpError.AcpRequestError.invalidParams()), 2026-10-23T22:25:17.9186400Z ╰──── 2026-10-23T22:25:17.9186403Z 2026-10-23T22:25:17.9186898Z ⚠ 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-23T22:25:17.9187040Z ╭─[packages/effect-acp/src/protocol.test.ts:500:31] 2026-10-23T22:25:17.9187103Z 499 │ 2026-10-23T22:25:17.9187227Z 500 │ const response = yield* Schema.decodeUnknownEffect( 2026-10-23T22:25:17.9187357Z ·  ────────────────────────── 2026-10-23T22:25:17.9187477Z 501 │ Schema.fromJsonString(JsonRpcErrorResponse), 2026-10-23T22:25:17.9187536Z ╰──── 2026-10-23T22:25:17.9187539Z 2026-10-23T22:25:17.9187825Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-23T22:25:17.9187970Z ╭─[apps/server/src/telemetry/AnalyticsService.ts:340:7] 2026-10-23T22:25:17.9188028Z 339 │ 2026-10-23T22:25:17.9188144Z 340 │ const layerTest = AnalyticsService.layerTest; 2026-10-23T22:25:17.9188223Z ·  ────┬──── 2026-10-23T22:25:17.9188421Z · ╰── 'layerTest' is declared here 2026-10-23T22:25:17.9188514Z ╰──── 2026-10-23T22:25:17.9188630Z  help: Consider removing this declaration. 2026-10-23T22:25:17.9188633Z 2026-10-23T22:25:17.9188988Z ⚠ 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-23T22:25:17.9189119Z ╭─[packages/effect-acp/src/schema.test.ts:18:12] 2026-10-23T22:25:17.9189295Z 17 │ const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } }; 2026-10-23T22:25:17.9189429Z 18 │ expect(Schema.is(V1.AvailableCommand)(command)).toBe(true); 2026-10-23T22:25:17.9189513Z ·  ───────── 2026-10-23T22:25:17.9189580Z 19 │ expect( 2026-10-23T22:25:17.9189638Z ╰──── 2026-10-23T22:25:17.9189647Z 2026-10-23T22:25:17.9190003Z ⚠ 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-23T22:25:17.9190196Z ╭─[packages/effect-acp/src/schema.test.ts:20:7] 2026-10-23T22:25:17.9190258Z 19 │ expect( 2026-10-23T22:25:17.9190442Z 20 │ Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }), 2026-10-23T22:25:17.9190524Z ·  ───────── 2026-10-23T22:25:17.9190598Z 21 │ ).toBe(true); 2026-10-23T22:25:17.9190652Z ╰──── 2026-10-23T22:25:17.9190655Z 2026-10-23T22:25:17.9190873Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T22:25:17.9191029Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:454:7] 2026-10-23T22:25:17.9191128Z 453 │ showAuxiliaryPane("inspector"); 2026-10-23T22:25:17.9191243Z 454 │ }, [environmentId, showAuxiliaryPane, threadId]); 2026-10-23T22:25:17.9191423Z ·  ──────┬────── ────┬─── 2026-10-23T22:25:17.9191704Z · │ ╰── Unnecessary dependency `threadId` 2026-10-23T22:25:17.9191867Z · ╰── Unnecessary dependency `environmentId` 2026-10-23T22:25:17.9191931Z 455 │ const { 2026-10-23T22:25:17.9191989Z ╰──── 2026-10-23T22:25:17.9192309Z  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-23T22:25:17.9192654Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9192660Z 2026-10-23T22:25:17.9192859Z ⚠ react(static-components): Cannot create components during render 2026-10-23T22:25:17.9193007Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:725:20] 2026-10-23T22:25:17.9193079Z 492 │ // same check. 2026-10-23T22:25:17.9193217Z 493 │ const NativeReviewDiffView = resolveNativeReviewDiffView(); 2026-10-23T22:25:17.9193348Z ·  ─────────────┬───────────── 2026-10-23T22:25:17.9193539Z · ╰── The component is created during render here 2026-10-23T22:25:17.9193703Z 494 │ const nativeReviewDiffViewRef = useRef(null); 2026-10-23T22:25:17.9193907Z 495 │ const showcasedReviewDrawRef = useRef(null); 2026-10-23T22:25:17.9194092Z 496 │ const [isPullRefreshing, setIsPullRefreshing] = useState(false); 2026-10-23T22:25:17.9194192Z 497 │ const handlePullToRefresh = async () => { 2026-10-23T22:25:17.9194278Z 498 │ setIsPullRefreshing(true); 2026-10-23T22:25:17.9194372Z 499 │ await refreshSelectedSection(); 2026-10-23T22:25:17.9194457Z 500 │ setIsPullRefreshing(false); 2026-10-23T22:25:17.9194515Z 501 │ }; 2026-10-23T22:25:17.9194670Z 502 │ const reviewFileNavigatorRef = useRef(null); 2026-10-23T22:25:17.9194824Z 503 │ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : []; 2026-10-23T22:25:17.9194942Z 504 │ const fileVisibility = useReviewFileVisibility({ 2026-10-23T22:25:17.9195034Z 505 │ threadKey: reviewCache.threadKey, 2026-10-23T22:25:17.9195141Z 506 │ sectionId: selectedSection?.id ?? null, 2026-10-23T22:25:17.9195219Z 507 │ files: reviewFiles, 2026-10-23T22:25:17.9195331Z 508 │ cachedExpandedFileIds: selectedSection?.id 2026-10-23T22:25:17.9195470Z 509 │ ? reviewCache.expandedFileIdsBySection[selectedSection.id] 2026-10-23T22:25:17.9195543Z 510 │ : undefined, 2026-10-23T22:25:17.9195649Z 511 │ cachedViewedFileIds: selectedSection?.id 2026-10-23T22:25:17.9195780Z 512 │ ? reviewCache.viewedFileIdsBySection[selectedSection.id] 2026-10-23T22:25:17.9195852Z 513 │ : undefined, 2026-10-23T22:25:17.9195911Z 514 │ }); 2026-10-23T22:25:17.9196118Z 515 │ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility; 2026-10-23T22:25:17.9196258Z 516 │ const commentSelection = useReviewCommentSelectionController({ 2026-10-23T22:25:17.9196329Z 517 │ environmentId, 2026-10-23T22:25:17.9196404Z 518 │ threadId, 2026-10-23T22:25:17.9196483Z 519 │ selectedSection, 2026-10-23T22:25:17.9196559Z 520 │ nativeReviewDiffData, 2026-10-23T22:25:17.9196622Z 521 │ }); 2026-10-23T22:25:17.9196739Z 522 │ const nativeBridge = useNativeReviewDiffBridge({ 2026-10-23T22:25:17.9196833Z 523 │ threadKey: reviewCache.threadKey, 2026-10-23T22:25:17.9196961Z 524 │ sectionId: selectedSection?.id ?? null, 2026-10-23T22:25:17.9197117Z 525 │ diff: selectedSection?.diff, 2026-10-23T22:25:17.9197237Z 526 │ data: nativeReviewDiffData, 2026-10-23T22:25:17.9197316Z 527 │ collapsedFileIds, 2026-10-23T22:25:17.9197389Z 528 │ viewedFileIds, 2026-10-23T22:25:17.9197517Z 529 │ selectedRowIds: commentSelection.selectedRowIds, 2026-10-23T22:25:17.9197628Z 530 │ canHighlight: parsedDiff.kind === "files", 2026-10-23T22:25:17.9197690Z 531 │ }); 2026-10-23T22:25:17.9197780Z 532 │ const showcaseReviewKey = 2026-10-23T22:25:17.9197936Z 533 │ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection 2026-10-23T22:25:17.9198167Z 534 │ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}` 2026-10-23T22:25:17.9198236Z 535 │ : null; 2026-10-23T22:25:17.9198416Z 536 │ const handleNativeDebug = (event: NativeSyntheticEvent>) => { 2026-10-23T22:25:17.9198506Z 537 │ nativeBridge.onDebug(event); 2026-10-23T22:25:17.9198569Z 538 │ if ( 2026-10-23T22:25:17.9198658Z 539 │ showcaseReviewKey === null || 2026-10-23T22:25:17.9198794Z 540 │ showcasedReviewDrawRef.current === showcaseReviewKey || 2026-10-23T22:25:17.9198916Z 541 │ !isNativeReviewDiffDrawEvent(event.nativeEvent) 2026-10-23T22:25:17.9198978Z 542 │ ) { 2026-10-23T22:25:17.9199128Z 543 │ return; 2026-10-23T22:25:17.9199221Z 544 │ } 2026-10-23T22:25:17.9199345Z 545 │ showcasedReviewDrawRef.current = showcaseReviewKey; 2026-10-23T22:25:17.9199522Z 546 │ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId }); 2026-10-23T22:25:17.9199581Z 547 │ }; 2026-10-23T22:25:17.9199641Z 548 │ 2026-10-23T22:25:17.9199772Z 549 │ const handleSelectFile = async (fileId: string | null) => { 2026-10-23T22:25:17.9199862Z 550 │ loadVisibleFile(fileId, true); 2026-10-23T22:25:17.9199960Z 551 │ commentSelection.clearSelection(); 2026-10-23T22:25:17.9200091Z 552 │ if (fileId !== null && collapsedFileIds.includes(fileId)) { 2026-10-23T22:25:17.9200181Z 553 │ toggleExpandedFile(fileId); 2026-10-23T22:25:17.9200243Z 554 │ } 2026-10-23T22:25:17.9200363Z 555 │ const nativeView = nativeReviewDiffViewRef.current; 2026-10-23T22:25:17.9200451Z 556 │ if (!nativeView) return; 2026-10-23T22:25:17.9200558Z 557 │ const result = await settlePromise(() => 2026-10-23T22:25:17.9200746Z 558 │ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true), 2026-10-23T22:25:17.9200805Z 559 │ ); 2026-10-23T22:25:17.9200903Z 560 │ if (AsyncResult.isFailure(result)) { 2026-10-23T22:25:17.9201102Z 561 │ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result)); 2026-10-23T22:25:17.9201164Z 562 │ } 2026-10-23T22:25:17.9201221Z 563 │ }; 2026-10-23T22:25:17.9201316Z 564 │ const handleVisibleFileChange = ( 2026-10-23T22:25:17.9201529Z 565 │ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>, 2026-10-23T22:25:17.9201595Z 566 │ ) => { 2026-10-23T22:25:17.9201713Z 567 │ loadVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-23T22:25:17.9201906Z 568 │ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-23T22:25:17.9201969Z 569 │ }; 2026-10-23T22:25:17.9202058Z 570 │ const renderInspector = () => ( 2026-10-23T22:25:17.9202135Z 571 │ void handleSelectFile(fileId)} 2026-10-23T22:25:17.9202708Z 577 │ /> 2026-10-23T22:25:17.9202765Z 578 │ ); 2026-10-23T22:25:17.9202825Z 579 │ 2026-10-23T22:25:17.9203025Z 580 │ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => { 2026-10-23T22:25:17.9203133Z 581 │ const { fileId } = event.nativeEvent; 2026-10-23T22:25:17.9203206Z 582 │ if (fileId) { 2026-10-23T22:25:17.9203299Z 583 │ loadVisibleFile(fileId, true); 2026-10-23T22:25:17.9203387Z 584 │ toggleExpandedFile(fileId); 2026-10-23T22:25:17.9203447Z 585 │ } 2026-10-23T22:25:17.9203506Z 586 │ }; 2026-10-23T22:25:17.9203567Z 587 │ 2026-10-23T22:25:17.9203671Z 588 │ const handleNativeToggleViewedFile = ( 2026-10-23T22:25:17.9203799Z 589 │ event: NativeSyntheticEvent<{ readonly fileId?: string }>, 2026-10-23T22:25:17.9203860Z 590 │ ) => { 2026-10-23T22:25:17.9203954Z 591 │ const { fileId } = event.nativeEvent; 2026-10-23T22:25:17.9204026Z 592 │ if (fileId) { 2026-10-23T22:25:17.9204111Z 593 │ toggleViewedFile(fileId); 2026-10-23T22:25:17.9204167Z 594 │ } 2026-10-23T22:25:17.9204227Z 595 │ }; 2026-10-23T22:25:17.9204352Z 596 │ 2026-10-23T22:25:17.9204461Z 597 │ const parsedDiffNotice = 2026-10-23T22:25:17.9204637Z 598 │ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null; 2026-10-23T22:25:17.9204770Z 599 │ const hasCachedSelectedDiff = selectedSection?.diff != null; 2026-10-23T22:25:17.9204945Z 600 │ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null); 2026-10-23T22:25:17.9205074Z 601 │ const sectionMenu = buildReviewSectionMenu(reviewSections); 2026-10-23T22:25:17.9205248Z 602 │ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({ 2026-10-23T22:25:17.9205372Z 603 │ hasEnvironmentPresentation: environment.isReady, 2026-10-23T22:25:17.9205484Z 604 │ isEnvironmentConnected: isEnvironmentReady, 2026-10-23T22:25:17.9205561Z 605 │ hasCachedSelectedDiff, 2026-10-23T22:25:17.9205636Z 606 │ hasAnyCachedDiff, 2026-10-23T22:25:17.9205703Z 607 │ }); 2026-10-23T22:25:17.9205804Z 608 │ const handleRetryEnvironment = () => { 2026-10-23T22:25:17.9205898Z 609 │ void retryEnvironment(environmentId); 2026-10-23T22:25:17.9205959Z 610 │ }; 2026-10-23T22:25:17.9206058Z 611 │ const handleReturnToThread = () => { 2026-10-23T22:25:17.9206146Z 612 │ if (navigation.canGoBack()) { 2026-10-23T22:25:17.9206222Z 613 │ navigation.goBack(); 2026-10-23T22:25:17.9206293Z 614 │ return; 2026-10-23T22:25:17.9206352Z 615 │ } 2026-10-23T22:25:17.9206445Z 616 │ navigation.navigate("Thread", { 2026-10-23T22:25:17.9206541Z 617 │ environmentId: String(environmentId), 2026-10-23T22:25:17.9206629Z 618 │ threadId: String(threadId), 2026-10-23T22:25:17.9206692Z 619 │ }); 2026-10-23T22:25:17.9206753Z 620 │ }; 2026-10-23T22:25:17.9206845Z 621 │ const androidHeaderSubtitle = [ 2026-10-23T22:25:17.9206931Z 622 │ selectedSection?.title, 2026-10-23T22:25:17.9207021Z 623 │ headerDiffSummary.additions, 2026-10-23T22:25:17.9207107Z 624 │ headerDiffSummary.deletions, 2026-10-23T22:25:17.9207170Z 625 │ ] 2026-10-23T22:25:17.9207287Z 626 │ .filter((part): part is string => Boolean(part)) 2026-10-23T22:25:17.9207365Z 627 │ .join(" · "); 2026-10-23T22:25:17.9207422Z 628 │ 2026-10-23T22:25:17.9207509Z 629 │ const showChangedFilesPane = 2026-10-23T22:25:17.9207602Z 630 │ !showConnectionNotice && 2026-10-23T22:25:17.9207701Z 631 │ selectedSection !== null && 2026-10-23T22:25:17.9207838Z 632 │ parsedDiff.kind === "files" && 2026-10-23T22:25:17.9207981Z 633 │ NativeReviewDiffView !== null; 2026-10-23T22:25:17.9208213Z 634 │ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined); 2026-10-23T22:25:17.9208409Z 635 │ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane; 2026-10-23T22:25:17.9208470Z 636 │ 2026-10-23T22:25:17.9208552Z 637 │ const listHeader = (() => { 2026-10-23T22:25:17.9208647Z 638 │ const children: ReactElement[] = []; 2026-10-23T22:25:17.9208708Z 639 │ 2026-10-23T22:25:17.9208776Z 640 │ if (error) { 2026-10-23T22:25:17.9208854Z 641 │ children.push( 2026-10-23T22:25:17.9208925Z 642 │ 2026-10-23T22:25:17.9209728Z 649 │ Review unavailable 2026-10-23T22:25:17.9209941Z 650 │ {error} 2026-10-23T22:25:17.9210007Z 651 │ , 2026-10-23T22:25:17.9210072Z 652 │ ); 2026-10-23T22:25:17.9210132Z 653 │ } 2026-10-23T22:25:17.9210190Z 654 │ 2026-10-23T22:25:17.9210269Z 655 │ if (parsedDiffNotice) { 2026-10-23T22:25:17.9210448Z 656 │ children.push(); 2026-10-23T22:25:17.9210510Z 657 │ } 2026-10-23T22:25:17.9210568Z 658 │ 2026-10-23T22:25:17.9210653Z 659 │ if (children.length === 0) { 2026-10-23T22:25:17.9210728Z 660 │ return null; 2026-10-23T22:25:17.9210788Z 661 │ } 2026-10-23T22:25:17.9210846Z 662 │ 2026-10-23T22:25:17.9210930Z 663 │ return <>{children}; 2026-10-23T22:25:17.9210995Z 664 │ })(); 2026-10-23T22:25:17.9211073Z 665 │ const headerSubtitle = [ 2026-10-23T22:25:17.9211169Z 666 │ headerDiffSummary.additions, 2026-10-23T22:25:17.9211287Z 667 │ headerDiffSummary.deletions, 2026-10-23T22:25:17.9211411Z 668 │ pendingReviewCommentCount > 0 2026-10-23T22:25:17.9211605Z 669 │ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}` 2026-10-23T22:25:17.9211670Z 670 │ : null, 2026-10-23T22:25:17.9211733Z 671 │ ] 2026-10-23T22:25:17.9211810Z 672 │ .filter(Boolean) 2026-10-23T22:25:17.9211882Z 673 │ .join(" · "); 2026-10-23T22:25:17.9212029Z 674 │ const headerTitleText = selectedSection?.title ?? "Review changes"; 2026-10-23T22:25:17.9212089Z 675 │ 2026-10-23T22:25:17.9212158Z 676 │ return ( 2026-10-23T22:25:17.9212220Z 677 │ <> 2026-10-23T22:25:17.9212299Z 678 │ 2026-10-23T22:25:17.9213778Z 694 │ 2026-10-23T22:25:17.9213853Z 695 │ 2026-10-23T22:25:17.9213985Z 696 │ 2026-10-23T22:25:17.9214072Z 697 │ {showConnectionNotice ? ( 2026-10-23T22:25:17.9214226Z 698 │ 2026-10-23T22:25:17.9214327Z 699 │ 2026-10-23T22:25:17.9215544Z 711 │ 2026-10-23T22:25:17.9215717Z 712 │ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? ( 2026-10-23T22:25:17.9215783Z 713 │ 2026-10-23T22:25:17.9216284Z 719 │ 2026-10-23T22:25:17.9216677Z 723 │ {listHeader} 2026-10-23T22:25:17.9216806Z 724 │ 2026-10-23T22:25:17.9216897Z 725 │ { 2026-10-23T22:25:17.9218776Z ·  ────┬──── 2026-10-23T22:25:17.9218920Z · ╰── This is the containing effect 2026-10-23T22:25:17.9219010Z 119 │ void refreshNotifications(); 2026-10-23T22:25:17.9219110Z ·  ──────────┬───────── 2026-10-23T22:25:17.9219302Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.9219457Z 120 │ const subscription = AppState.addEventListener("change", (state) => { 2026-10-23T22:25:17.9219515Z ╰──── 2026-10-23T22:25:17.9220233Z  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-23T22:25:17.9220618Z  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-23T22:25:17.9220621Z 2026-10-23T22:25:17.9220903Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T22:25:17.9221104Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7] 2026-10-23T22:25:17.9221164Z 125 │ 2026-10-23T22:25:17.9221239Z 126 │ useEffect(() => { 2026-10-23T22:25:17.9221321Z ·  ────┬──── 2026-10-23T22:25:17.9221497Z · ╰── This is the containing effect 2026-10-23T22:25:17.9221578Z 127 │ if (!isLoaded) { 2026-10-23T22:25:17.9221682Z 128 │ setLiveActivityStatus("checking"); 2026-10-23T22:25:17.9221783Z ·  ──────────┬────────── 2026-10-23T22:25:17.9221972Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.9222042Z 129 │ return; 2026-10-23T22:25:17.9222102Z ╰──── 2026-10-23T22:25:17.9222755Z  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-23T22:25:17.9223104Z  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-23T22:25:17.9223113Z 2026-10-23T22:25:17.9223574Z ⚠ 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-23T22:25:17.9223741Z ╭─[apps/server/src/provider/acp/AntigravityProtocol.ts:263:20] 2026-10-23T22:25:17.9223834Z 262 │ ...(update._meta !== undefined 2026-10-23T22:25:17.9224014Z 263 │ ? { _meta: Schema.is(Schema.Record(Schema.String, Schema.Json))(meta) ? meta : null } 2026-10-23T22:25:17.9224110Z ·  ───────── 2026-10-23T22:25:17.9224183Z 264 │ : {}), 2026-10-23T22:25:17.9224240Z ╰──── 2026-10-23T22:25:17.9224243Z 2026-10-23T22:25:17.9224582Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T22:25:17.9224801Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:60:5] 2026-10-23T22:25:17.9224862Z 55 │ 2026-10-23T22:25:17.9224938Z 56 │ useEffect(() => { 2026-10-23T22:25:17.9225018Z ·  ────┬──── 2026-10-23T22:25:17.9225157Z · ╰── This is the containing effect 2026-10-23T22:25:17.9225233Z 57 │ scheduler.reset(); 2026-10-23T22:25:17.9225345Z 58 │ highlightedRowIdsRef.current = new Set(); 2026-10-23T22:25:17.9225441Z 59 │ visibleChunkIndexRef.current = 0; 2026-10-23T22:25:17.9225567Z 60 │ setVisibleRange({ firstRowIndex: 0, lastRowIndex: 80 }); 2026-10-23T22:25:17.9225659Z ·  ───────┬─────── 2026-10-23T22:25:17.9225851Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.9225980Z 61 │ setTokensPatchJson(createEmptyTokenPatch(resetKey)); 2026-10-23T22:25:17.9226036Z ╰──── 2026-10-23T22:25:17.9226686Z  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-23T22:25:17.9227033Z  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-23T22:25:17.9227036Z 2026-10-23T22:25:17.9227257Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T22:25:17.9227449Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:63:7] 2026-10-23T22:25:17.9227539Z 62 │ return () => scheduler.cancel(); 2026-10-23T22:25:17.9227653Z 63 │ }, [enabled, resetKey, rows.length, scheduler]); 2026-10-23T22:25:17.9227792Z ·  ───┬─── ─────┬───── 2026-10-23T22:25:17.9228002Z · │ ╰── Unnecessary dependency `rows.length` 2026-10-23T22:25:17.9228149Z · ╰── Unnecessary dependency `enabled` 2026-10-23T22:25:17.9228209Z 64 │ 2026-10-23T22:25:17.9228268Z ╰──── 2026-10-23T22:25:17.9228590Z  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-23T22:25:17.9228931Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9228940Z 2026-10-23T22:25:17.9229169Z ⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used. 2026-10-23T22:25:17.9229376Z ╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10] 2026-10-23T22:25:17.9229438Z 21 │ 2026-10-23T22:25:17.9229612Z 22 │ function summarizePayload(payload: unknown): Readonly> { 2026-10-23T22:25:17.9229707Z ·  ────────┬─────── 2026-10-23T22:25:17.9229873Z · ╰── 'summarizePayload' is declared here 2026-10-23T22:25:17.9229992Z 23 │ if (payload === null) return { valueType: "null" }; 2026-10-23T22:25:17.9230051Z ╰──── 2026-10-23T22:25:17.9230531Z  help: Consider removing this declaration. 2026-10-23T22:25:17.9230581Z 2026-10-23T22:25:17.9230887Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-23T22:25:17.9231030Z ╭─[apps/server/src/provider/AntigravityAuth.ts:285:20] 2026-10-23T22:25:17.9231096Z 284 │ }, 2026-10-23T22:25:17.9231186Z 285 │ (effect, flow, stopSessions) => 2026-10-23T22:25:17.9231291Z ·  ──────┬───── 2026-10-23T22:25:17.9231492Z · ╰── 'stopSessions' is declared here 2026-10-23T22:25:17.9231567Z 286 │ effect.pipe( 2026-10-23T22:25:17.9231623Z ╰──── 2026-10-23T22:25:17.9231739Z  help: Consider removing this parameter. 2026-10-23T22:25:17.9231741Z 2026-10-23T22:25:17.9231920Z ⚠ react(immutability): This value cannot be modified 2026-10-23T22:25:17.9232100Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:42:5] 2026-10-23T22:25:17.9232157Z 35 │ 2026-10-23T22:25:17.9232306Z 36 │ const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0); 2026-10-23T22:25:17.9232405Z ·  ────────┬──────── 2026-10-23T22:25:17.9232569Z · ╰── `inspectorProgress` originates here 2026-10-23T22:25:17.9232670Z 37 │ const { renderedInspectorWidth } = props; 2026-10-23T22:25:17.9232818Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-23T22:25:17.9232878Z 39 │ 2026-10-23T22:25:17.9232968Z 40 │ const onClosed = props.onClosed; 2026-10-23T22:25:17.9233037Z 41 │ useEffect(() => { 2026-10-23T22:25:17.9233143Z 42 │ inspectorProgress.value = withTiming( 2026-10-23T22:25:17.9233239Z ·  ────────┬──────── 2026-10-23T22:25:17.9233403Z · ╰── `inspectorProgress` cannot be modified 2026-10-23T22:25:17.9233487Z 43 │ inspectorVisible ? 1 : 0, 2026-10-23T22:25:17.9233546Z ╰──── 2026-10-23T22:25:17.9233838Z  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-23T22:25:17.9234174Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T22:25:17.9234176Z 2026-10-23T22:25:17.9234344Z ⚠ react(immutability): This value cannot be modified 2026-10-23T22:25:17.9234522Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:67:7] 2026-10-23T22:25:17.9234627Z 37 │ const { renderedInspectorWidth } = props; 2026-10-23T22:25:17.9234778Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-23T22:25:17.9234881Z ·  ──────────┬───────── 2026-10-23T22:25:17.9235049Z · ╰── `renderedContentWidth` originates here 2026-10-23T22:25:17.9235109Z 39 │ 2026-10-23T22:25:17.9235202Z 40 │ const onClosed = props.onClosed; 2026-10-23T22:25:17.9235273Z 41 │ useEffect(() => { 2026-10-23T22:25:17.9235373Z 42 │ inspectorProgress.value = withTiming( 2026-10-23T22:25:17.9235462Z 43 │ inspectorVisible ? 1 : 0, 2026-10-23T22:25:17.9235550Z 44 │ WORKSPACE_PANE_TIMING, 2026-10-23T22:25:17.9235625Z 45 │ (finished) => { 2026-10-23T22:25:17.9235851Z 46 │ if (finished === true && !inspectorVisible && onClosed !== undefined) { 2026-10-23T22:25:17.9235973Z 47 │ runOnJS(onClosed)(); 2026-10-23T22:25:17.9236041Z 48 │ } 2026-10-23T22:25:17.9236104Z 49 │ }, 2026-10-23T22:25:17.9236170Z 50 │ ); 2026-10-23T22:25:17.9236322Z 51 │ const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0; 2026-10-23T22:25:17.9236415Z 52 │ renderedInspectorWidth.set( 2026-10-23T22:25:17.9236572Z 53 │ resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING), 2026-10-23T22:25:17.9236641Z 54 │ ); 2026-10-23T22:25:17.9236704Z 55 │ }, [ 2026-10-23T22:25:17.9236791Z 56 │ inspectorProgress, 2026-10-23T22:25:17.9236866Z 57 │ inspectorVisible, 2026-10-23T22:25:17.9236945Z 58 │ inspectorWidth, 2026-10-23T22:25:17.9237022Z 59 │ onClosed, 2026-10-23T22:25:17.9237100Z 60 │ renderedInspectorWidth, 2026-10-23T22:25:17.9237178Z 61 │ resizing, 2026-10-23T22:25:17.9237251Z 62 │ ]); 2026-10-23T22:25:17.9237317Z 63 │ 2026-10-23T22:25:17.9237389Z 64 │ useEffect(() => { 2026-10-23T22:25:17.9237500Z 65 │ const targetWidth = inspectorWidth ?? 0; 2026-10-23T22:25:17.9237600Z 66 │ if (!inspectorVisible || resizing) { 2026-10-23T22:25:17.9237713Z 67 │ renderedContentWidth.value = targetWidth; 2026-10-23T22:25:17.9237812Z ·  ──────────┬───────── 2026-10-23T22:25:17.9237996Z · ╰── `renderedContentWidth` cannot be modified 2026-10-23T22:25:17.9238065Z 68 │ return; 2026-10-23T22:25:17.9238131Z ╰──── 2026-10-23T22:25:17.9238418Z  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-23T22:25:17.9238763Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T22:25:17.9238768Z 2026-10-23T22:25:17.9238977Z ⚠ eslint(require-yield): This generator function does not have `yield` 2026-10-23T22:25:17.9239141Z ╭─[packages/provider-acp/src/server/mcpOverAcpBridge.ts:81:78] 2026-10-23T22:25:17.9239205Z  80 │ 2026-10-23T22:25:17.9239501Z  81 │ ╭─▶ export const makeAcpMcpOverAcpBridge = Effect.fn("AcpMcpOverAcpBridge.make")(function* ( 2026-10-23T22:25:17.9239638Z  82 │ │ options: AcpMcpOverAcpBridgeOptions, 2026-10-23T22:25:17.9239797Z  83 │ │ ): Effect.fn.Return { 2026-10-23T22:25:17.9240076Z  84 │ │ const fetchImplementation = options.fetchImplementation ?? fetch; 2026-10-23T22:25:17.9240231Z  85 │ │ const connections = new Map(); 2026-10-23T22:25:17.9240312Z  86 │ │ 2026-10-23T22:25:17.9240547Z  87 │ │ const connectionFor = (connectionId: string): Effect.Effect => 2026-10-23T22:25:17.9240661Z  88 │ │ Effect.suspend(() => { 2026-10-23T22:25:17.9240810Z  89 │ │ const connection = connections.get(connectionId); 2026-10-23T22:25:17.9240935Z  90 │ │ return connection === undefined 2026-10-23T22:25:17.9241173Z  91 │ │ ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`)) 2026-10-23T22:25:17.9241297Z  92 │ │ : Effect.succeed(connection); 2026-10-23T22:25:17.9241480Z  93 │ │ }); 2026-10-23T22:25:17.9241627Z  94 │ │ 2026-10-23T22:25:17.9241729Z  95 │ │ const send = ( 2026-10-23T22:25:17.9241842Z  96 │ │ connection: Connection, 2026-10-23T22:25:17.9241945Z  97 │ │ message: unknown, 2026-10-23T22:25:17.9242120Z  98 │ │ ): Effect.Effect, AcpMcpOverAcpError> => 2026-10-23T22:25:17.9242405Z  99 │ │ connection.mutex.withPermits(1)( 2026-10-23T22:25:17.9242573Z 100 │ │ Effect.gen(function* () { 2026-10-23T22:25:17.9242722Z 101 │ │ const body = JSON.stringify(message); 2026-10-23T22:25:17.9242910Z 102 │ │ if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) { 2026-10-23T22:25:17.9243176Z 103 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB.")); 2026-10-23T22:25:17.9243326Z 104 │ │ } 2026-10-23T22:25:17.9243488Z 105 │ │ const response = yield* Effect.tryPromise({ 2026-10-23T22:25:17.9243639Z 106 │ │ try: (signal) => 2026-10-23T22:25:17.9243823Z 107 │ │ fetchImplementation(options.endpoint, { 2026-10-23T22:25:17.9243973Z 108 │ │ method: "POST", 2026-10-23T22:25:17.9244097Z 109 │ │ signal, 2026-10-23T22:25:17.9244242Z 110 │ │ headers: { 2026-10-23T22:25:17.9244417Z 111 │ │ "content-type": "application/json", 2026-10-23T22:25:17.9244609Z 112 │ │ accept: "application/json, text/event-stream", 2026-10-23T22:25:17.9244814Z 113 │ │ authorization: options.authorization, 2026-10-23T22:25:17.9244965Z 114 │ │ ...(connection.sessionId === null 2026-10-23T22:25:17.9245104Z 115 │ │ ? {} 2026-10-23T22:25:17.9245297Z 116 │ │ : { "mcp-session-id": connection.sessionId }), 2026-10-23T22:25:17.9245478Z 117 │ │ ...(connection.protocolVersion === null 2026-10-23T22:25:17.9245603Z 118 │ │ ? {} 2026-10-23T22:25:17.9245823Z 119 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-23T22:25:17.9246085Z 120 │ │ }, 2026-10-23T22:25:17.9246215Z 121 │ │ body, 2026-10-23T22:25:17.9246338Z 122 │ │ }), 2026-10-23T22:25:17.9246496Z 123 │ │ catch: bridgeError, 2026-10-23T22:25:17.9246618Z 124 │ │ }); 2026-10-23T22:25:17.9246884Z 125 │ │ connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId; 2026-10-23T22:25:17.9247003Z 126 │ │ if (!response.ok) { 2026-10-23T22:25:17.9247172Z 127 │ │ yield* Effect.promise( 2026-10-23T22:25:17.9247403Z 128 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-23T22:25:17.9247530Z 129 │ │ ); 2026-10-23T22:25:17.9247730Z 130 │ │ return yield* Effect.fail( 2026-10-23T22:25:17.9248035Z 131 │ │ new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`), 2026-10-23T22:25:17.9248175Z 132 │ │ ); 2026-10-23T22:25:17.9248295Z 133 │ │ } 2026-10-23T22:25:17.9248557Z 134 │ │ const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))]; 2026-10-23T22:25:17.9248696Z 135 │ │ for (const payload of payloads) { 2026-10-23T22:25:17.9249103Z 136 │ │ connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion; 2026-10-23T22:25:17.9249226Z 137 │ │ } 2026-10-23T22:25:17.9249369Z 138 │ │ return payloads; 2026-10-23T22:25:17.9249523Z 139 │ │ }).pipe(Effect.mapError(bridgeError)), 2026-10-23T22:25:17.9249647Z 140 │ │ ); 2026-10-23T22:25:17.9249771Z 141 │ │ 2026-10-23T22:25:17.9249993Z 142 │ │ const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* ( 2026-10-23T22:25:17.9250144Z 143 │ │ request: AcpSchema.DisconnectMcpRequest, 2026-10-23T22:25:17.9250371Z 144 │ │ ): Effect.fn.Return { 2026-10-23T22:25:17.9250609Z 145 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-23T22:25:17.9250784Z 146 │ │ connections.delete(request.connectionId); 2026-10-23T22:25:17.9250952Z 147 │ │ const sessionId = connection.sessionId; 2026-10-23T22:25:17.9251087Z 148 │ │ if (sessionId !== null) { 2026-10-23T22:25:17.9251296Z 149 │ │ const response = yield* Effect.tryPromise({ 2026-10-23T22:25:17.9251521Z 150 │ │ try: (signal) => 2026-10-23T22:25:17.9251697Z 151 │ │ fetchImplementation(options.endpoint, { 2026-10-23T22:25:17.9251822Z 152 │ │ method: "DELETE", 2026-10-23T22:25:17.9251951Z 153 │ │ signal, 2026-10-23T22:25:17.9252233Z 154 │ │ headers: { 2026-10-23T22:25:17.9252410Z 155 │ │ authorization: options.authorization, 2026-10-23T22:25:17.9252554Z 156 │ │ "mcp-session-id": sessionId, 2026-10-23T22:25:17.9252796Z 157 │ │ ...(connection.protocolVersion === null 2026-10-23T22:25:17.9252972Z 158 │ │ ? {} 2026-10-23T22:25:17.9253191Z 159 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-23T22:25:17.9253298Z 160 │ │ }, 2026-10-23T22:25:17.9253429Z 161 │ │ }), 2026-10-23T22:25:17.9253566Z 162 │ │ catch: bridgeError, 2026-10-23T22:25:17.9253703Z 163 │ │ }); 2026-10-23T22:25:17.9253863Z 164 │ │ if (!response.ok && response.status !== 404) { 2026-10-23T22:25:17.9254024Z 165 │ │ return yield* Effect.fail( 2026-10-23T22:25:17.9254179Z 166 │ │ new AcpMcpOverAcpError( 2026-10-23T22:25:17.9254419Z 167 │ │ `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`, 2026-10-23T22:25:17.9254554Z 168 │ │ ), 2026-10-23T22:25:17.9254658Z 169 │ │ ); 2026-10-23T22:25:17.9254780Z 170 │ │ } 2026-10-23T22:25:17.9255048Z 171 │ │ yield* Effect.promise( 2026-10-23T22:25:17.9255297Z 172 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-23T22:25:17.9255398Z 173 │ │ ); 2026-10-23T22:25:17.9255520Z 174 │ │ } 2026-10-23T22:25:17.9255645Z 175 │ │ return {}; 2026-10-23T22:25:17.9255762Z 176 │ │ }); 2026-10-23T22:25:17.9255866Z 177 │ │ 2026-10-23T22:25:17.9256001Z 178 │ │ return { 2026-10-23T22:25:17.9256229Z 179 │ │ connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) { 2026-10-23T22:25:17.9256388Z 180 │ │ if (request.serverId !== "t3-code") { 2026-10-23T22:25:17.9256538Z 181 │ │ return yield* Effect.fail( 2026-10-23T22:25:17.9256785Z 182 │ │ new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`), 2026-10-23T22:25:17.9256905Z 183 │ │ ); 2026-10-23T22:25:17.9257022Z 184 │ │ } 2026-10-23T22:25:17.9257181Z 185 │ │ if (connections.size >= MAX_CONNECTIONS) { 2026-10-23T22:25:17.9257470Z 186 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections.")); 2026-10-23T22:25:17.9257603Z 187 │ │ } 2026-10-23T22:25:17.9257819Z 188 │ │ const connectionId = yield* options.allocateConnectionId; 2026-10-23T22:25:17.9258083Z 189 │ │ connections.set(connectionId, { 2026-10-23T22:25:17.9258250Z 190 │ │ mutex: yield* Semaphore.make(1), 2026-10-23T22:25:17.9258406Z 191 │ │ sessionId: null, 2026-10-23T22:25:17.9258558Z 192 │ │ protocolVersion: null, 2026-10-23T22:25:17.9258690Z 193 │ │ nextRequestId: 0, 2026-10-23T22:25:17.9258804Z 194 │ │ }); 2026-10-23T22:25:17.9258985Z 195 │ │ return { connectionId }; 2026-10-23T22:25:17.9259101Z 196 │ │ }), 2026-10-23T22:25:17.9259390Z 197 │ │ message: Effect.fn("mcpOverAcpBridge.message")(function* (request) { 2026-10-23T22:25:17.9259620Z 198 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-23T22:25:17.9259793Z 199 │ │ const id = ++connection.nextRequestId; 2026-10-23T22:25:17.9259978Z 200 │ │ const payloads = yield* send(connection, { 2026-10-23T22:25:17.9260122Z 201 │ │ jsonrpc: "2.0", 2026-10-23T22:25:17.9260225Z 202 │ │ id, 2026-10-23T22:25:17.9260369Z 203 │ │ method: request.method, 2026-10-23T22:25:17.9260594Z 204 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-23T22:25:17.9260819Z 205 │ │ }); 2026-10-23T22:25:17.9261040Z 206 │ │ const response = payloads.find((payload) => asEnvelope(payload)?.id === id); 2026-10-23T22:25:17.9261213Z 207 │ │ const envelope = asEnvelope(response); 2026-10-23T22:25:17.9261409Z 208 │ │ if (envelope === null) { 2026-10-23T22:25:17.9261576Z 209 │ │ return yield* Effect.fail( 2026-10-23T22:25:17.9261794Z 210 │ │ new AcpMcpOverAcpError("MCP server did not return a matching response."), 2026-10-23T22:25:17.9261921Z 211 │ │ ); 2026-10-23T22:25:17.9262031Z 212 │ │ } 2026-10-23T22:25:17.9262209Z 213 │ │ if (envelope.error !== undefined) { 2026-10-23T22:25:17.9262454Z 214 │ │ return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error))); 2026-10-23T22:25:17.9262562Z 215 │ │ } 2026-10-23T22:25:17.9262785Z 216 │ │ return (envelope.result ?? null) as AcpSchema.MessageMcpResponse; 2026-10-23T22:25:17.9262926Z 217 │ │ }), 2026-10-23T22:25:17.9263182Z 218 │ │ notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) { 2026-10-23T22:25:17.9263370Z 219 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-23T22:25:17.9263524Z 220 │ │ yield* send(connection, { 2026-10-23T22:25:17.9263659Z 221 │ │ jsonrpc: "2.0", 2026-10-23T22:25:17.9263828Z 222 │ │ method: request.method, 2026-10-23T22:25:17.9264015Z 223 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-23T22:25:17.9264250Z 224 │ │ }); 2026-10-23T22:25:17.9264370Z 225 │ │ }), 2026-10-23T22:25:17.9264503Z 226 │ │ disconnect, 2026-10-23T22:25:17.9264649Z 227 │ │ dispose: Effect.suspend(() => 2026-10-23T22:25:17.9264796Z 228 │ │ Effect.forEach( 2026-10-23T22:25:17.9264948Z 229 │ │ [...connections.keys()], 2026-10-23T22:25:17.9265159Z 230 │ │ (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore), 2026-10-23T22:25:17.9265296Z 231 │ │ { discard: true }, 2026-10-23T22:25:17.9265432Z 232 │ │ ), 2026-10-23T22:25:17.9265551Z 233 │ │ ), 2026-10-23T22:25:17.9265665Z 234 │ │ }; 2026-10-23T22:25:17.9265879Z 235 │ ╰─▶ }); 2026-10-23T22:25:17.9266043Z ╰──── 2026-10-23T22:25:17.9266356Z  help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed. 2026-10-23T22:25:17.9266360Z 2026-10-23T22:25:17.9266614Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T22:25:17.9266821Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:215:7] 2026-10-23T22:25:17.9266916Z 214 │ } 2026-10-23T22:25:17.9267151Z 215 │ }, [wrappedRender]); 2026-10-23T22:25:17.9267278Z ·  ──────┬────── 2026-10-23T22:25:17.9267476Z · ╰── Unnecessary dependency `wrappedRender` 2026-10-23T22:25:17.9267545Z 216 │ 2026-10-23T22:25:17.9267658Z ╰──── 2026-10-23T22:25:17.9268019Z  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-23T22:25:17.9268402Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9268405Z 2026-10-23T22:25:17.9268689Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-23T22:25:17.9268905Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:817:35] 2026-10-23T22:25:17.9269011Z 816 │ > 2026-10-23T22:25:17.9269169Z 817 │ 2026-10-23T22:25:17.9269339Z ·  ──────────────────── 2026-10-23T22:25:17.9269457Z 818 │ 2026-10-23T22:25:17.9270971Z 832 │ 2026-10-23T22:25:17.9271133Z ·  ──────────────────── 2026-10-23T22:25:17.9271274Z 833 │ 2026-10-23T22:25:17.9271408Z ╰──── 2026-10-23T22:25:17.9271691Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-23T22:25:17.9271862Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-23T22:25:17.9271885Z 2026-10-23T22:25:17.9272111Z ⚠ eslint(no-unused-vars): Identifier 'Fiber' is imported but never used. 2026-10-23T22:25:17.9272259Z ╭─[apps/server/src/ws.ts:10:13] 2026-10-23T22:25:17.9272401Z  9 │ import * as Effect from "effect/Effect"; 2026-10-23T22:25:17.9272534Z 10 │ import * as Fiber from "effect/Fiber"; 2026-10-23T22:25:17.9272632Z ·  ──┬── 2026-10-23T22:25:17.9272886Z · ╰── 'Fiber' is imported here 2026-10-23T22:25:17.9273108Z 11 │ import * as FileSystem from "effect/FileSystem"; 2026-10-23T22:25:17.9273198Z ╰──── 2026-10-23T22:25:17.9273322Z  help: Consider removing this import. 2026-10-23T22:25:17.9273325Z 2026-10-23T22:25:17.9273665Z ⚠ eslint(no-unused-vars): Identifier 'Schedule' is imported but never used. 2026-10-23T22:25:17.9273805Z ╭─[apps/server/src/ws.ts:17:13] 2026-10-23T22:25:17.9273941Z 16 │ import * as Ref from "effect/Ref"; 2026-10-23T22:25:17.9274056Z 17 │ import * as Schedule from "effect/Schedule"; 2026-10-23T22:25:17.9274177Z ·  ────┬─── 2026-10-23T22:25:17.9274347Z · ╰── 'Schedule' is imported here 2026-10-23T22:25:17.9274511Z 18 │ import * as Schema from "effect/Schema"; 2026-10-23T22:25:17.9274588Z ╰──── 2026-10-23T22:25:17.9274729Z  help: Consider removing this import. 2026-10-23T22:25:17.9274731Z 2026-10-23T22:25:17.9275092Z ⚠ eslint(no-unused-vars): Variable 'projectSetupScriptRunner' is declared but never used. Unused variables should start with a '_'. 2026-10-23T22:25:17.9275244Z ╭─[apps/server/src/ws.ts:1285:13] 2026-10-23T22:25:17.9275461Z 1284 │ const usageLimitSources = yield* UsageLimitSources.UsageLimitSources; 2026-10-23T22:25:17.9275689Z 1285 │ const projectSetupScriptRunner = yield* ProjectSetupScriptRunner.ProjectSetupScriptRunner; 2026-10-23T22:25:17.9275844Z ·  ────────────┬─────────── 2026-10-23T22:25:17.9276054Z · ╰── 'projectSetupScriptRunner' is declared here 2026-10-23T22:25:17.9276297Z 1286 │ const worktreeSetupTracker = yield* WorktreeSetupTracker.WorktreeSetupTracker; 2026-10-23T22:25:17.9276373Z ╰──── 2026-10-23T22:25:17.9276523Z  help: Consider removing this declaration. 2026-10-23T22:25:17.9276526Z 2026-10-23T22:25:17.9276937Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T22:25:17.9277185Z ╭─[apps/server/src/orchestration-v2/ThreadPullRequestService.ts:413:7] 2026-10-23T22:25:17.9277266Z 412 │ 2026-10-23T22:25:17.9277456Z 413 │ const layer = Layer.effect(ThreadPullRequestServiceV2, make); 2026-10-23T22:25:17.9277568Z ·  ──┬── 2026-10-23T22:25:17.9277761Z · ╰── 'layer' is declared here 2026-10-23T22:25:17.9278097Z ╰──── 2026-10-23T22:25:17.9278398Z  help: Consider removing this declaration. 2026-10-23T22:25:17.9278555Z 2026-10-23T22:25:17.9278795Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T22:25:17.9279255Z ╭─[apps/server/src/process/externalLauncher.test.ts:186:12] 2026-10-23T22:25:17.9279539Z 185 │ 2026-10-23T22:25:17.9279918Z 186 │ for (const {} of ["darwin", "linux"] as const) { 2026-10-23T22:25:17.9280181Z ·  ── 2026-10-23T22:25:17.9280430Z 187 │ } 2026-10-23T22:25:17.9280607Z ╰──── 2026-10-23T22:25:17.9281011Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T22:25:17.9281277Z 2026-10-23T22:25:17.9289627Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T22:25:17.9290182Z ╭─[apps/server/src/process/externalLauncher.test.ts:189:12] 2026-10-23T22:25:17.9290453Z 188 │ 2026-10-23T22:25:17.9290604Z 189 │ for (const {} of [ 2026-10-23T22:25:17.9290779Z ·  ── 2026-10-23T22:25:17.9290983Z 190 │ { kind: "browser", folderVerb: "none" }, 2026-10-23T22:25:17.9291195Z ╰──── 2026-10-23T22:25:17.9291792Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T22:25:17.9292045Z 2026-10-23T22:25:17.9292804Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T22:25:17.9293236Z ╭─[apps/server/src/process/externalLauncher.test.ts:311:12] 2026-10-23T22:25:17.9293463Z 310 │ 2026-10-23T22:25:17.9293767Z 311 │ for (const {} of ["rejected", "spawn-error", "stalled"] as const) { 2026-10-23T22:25:17.9294018Z ·  ── 2026-10-23T22:25:17.9294186Z 312 │ } 2026-10-23T22:25:17.9294312Z ╰──── 2026-10-23T22:25:17.9294620Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T22:25:17.9294868Z 2026-10-23T22:25:17.9295053Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T22:25:17.9295384Z ╭─[apps/server/src/process/externalLauncher.test.ts:314:12] 2026-10-23T22:25:17.9295607Z 313 │ 2026-10-23T22:25:17.9295744Z 314 │ for (const {} of [ 2026-10-23T22:25:17.9295916Z ·  ── 2026-10-23T22:25:17.9296070Z 315 │ { 2026-10-23T22:25:17.9296195Z ╰──── 2026-10-23T22:25:17.9296504Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T22:25:17.9296753Z 2026-10-23T22:25:17.9297048Z ⚠ eslint(no-unused-vars): Variable 'layerDaemon' is declared but never used. Unused variables should start with a '_'. 2026-10-23T22:25:17.9297484Z ╭─[apps/server/src/orchestration-v2/EffectWorker.ts:914:7] 2026-10-23T22:25:17.9297700Z 913 │ 2026-10-23T22:25:17.9297973Z 914 │ const layerDaemon: Layer.Layer = Layer.effectDiscard( 2026-10-23T22:25:17.9298267Z ·  ─────┬───── 2026-10-23T22:25:17.9298525Z · ╰── 'layerDaemon' is declared here 2026-10-23T22:25:17.9298775Z 915 │ runDaemon.pipe(Effect.forkScoped), 2026-10-23T22:25:17.9298954Z ╰──── 2026-10-23T22:25:17.9299130Z  help: Consider removing this declaration. 2026-10-23T22:25:17.9299265Z 2026-10-23T22:25:17.9299516Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-23T22:25:17.9299916Z ╭─[apps/mobile/src/state/use-composer-drafts.ts:1022:15] 2026-10-23T22:25:17.9300156Z 1021 │ instanceId, 2026-10-23T22:25:17.9300408Z 1022 │ { ...(persisted.modelOptionMemory[instanceId] ?? {}), ...models }, 2026-10-23T22:25:17.9300724Z ·  ────────────────────────────────────────────────── 2026-10-23T22:25:17.9300943Z 1023 │ ]), 2026-10-23T22:25:17.9301086Z ╰──── 2026-10-23T22:25:17.9301487Z  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-23T22:25:17.9301768Z 2026-10-23T22:25:17.9302126Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T22:25:17.9302580Z ╭─[packages/provider-grok/src/server/adapter.ts:408:7] 2026-10-23T22:25:17.9302789Z 407 │ 2026-10-23T22:25:17.9302936Z 408 │ const layer: Layer.Layer< 2026-10-23T22:25:17.9303112Z ·  ──┬── 2026-10-23T22:25:17.9303345Z · ╰── 'layer' is declared here 2026-10-23T22:25:17.9303594Z 409 │ ProviderAdapter.ProviderAdapterV2, 2026-10-23T22:25:17.9303783Z ╰──── 2026-10-23T22:25:17.9303956Z  help: Consider removing this declaration. 2026-10-23T22:25:17.9304093Z 2026-10-23T22:25:17.9304295Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T22:25:17.9304674Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:100:85] 2026-10-23T22:25:17.9305065Z  99 │ const startEditor = startScheduledTaskEditor; 2026-10-23T22:25:17.9305400Z 100 │ const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]); 2026-10-23T22:25:17.9305762Z ·  ─────┬───── 2026-10-23T22:25:17.9306196Z · ╰── Unnecessary dependency `startEditor` 2026-10-23T22:25:17.9306487Z 101 │ const readEditor = useCallback( 2026-10-23T22:25:17.9306656Z ╰──── 2026-10-23T22:25:17.9307059Z  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-23T22:25:17.9307814Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9308144Z 2026-10-23T22:25:17.9308345Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T22:25:17.9308716Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:121:7] 2026-10-23T22:25:17.9308972Z 120 │ setEditor, 2026-10-23T22:25:17.9309131Z 121 │ startEditor, 2026-10-23T22:25:17.9309307Z ·  ─────┬───── 2026-10-23T22:25:17.9309572Z · ╰── Unnecessary dependency `startEditor` 2026-10-23T22:25:17.9309800Z 122 │ hasChanges, 2026-10-23T22:25:17.9309950Z ╰──── 2026-10-23T22:25:17.9310588Z  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-23T22:25:17.9311298Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9311664Z 2026-10-23T22:25:17.9311944Z ⚠ eslint(no-unused-vars): Function 'promptResponseHasMissingXAiStopReason' is declared but never used. 2026-10-23T22:25:17.9312381Z ╭─[packages/provider-grok/src/server/xaiAcpExtension.ts:1620:10] 2026-10-23T22:25:17.9312612Z 1619 │ 2026-10-23T22:25:17.9312917Z 1620 │ function promptResponseHasMissingXAiStopReason(response: EffectAcpSchema.PromptResponse): boolean { 2026-10-23T22:25:17.9313278Z ·  ──────────────────┬────────────────── 2026-10-23T22:25:17.9313637Z · ╰── 'promptResponseHasMissingXAiStopReason' is declared here 2026-10-23T22:25:17.9313938Z 1621 │ const meta = response._meta; 2026-10-23T22:25:17.9314109Z ╰──── 2026-10-23T22:25:17.9314290Z  help: Consider removing this declaration. 2026-10-23T22:25:17.9314421Z 2026-10-23T22:25:17.9314646Z ⚠ eslint(no-unused-vars): Identifier 'HostProcess' is imported but never used. 2026-10-23T22:25:17.9315039Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:25:13] 2026-10-23T22:25:17.9315319Z 24 │ import * as Schema from "effect/Schema"; 2026-10-23T22:25:17.9315566Z 25 │ import * as HostProcess from "@t3tools/shared/HostProcess"; 2026-10-23T22:25:17.9315805Z ·  ─────┬───── 2026-10-23T22:25:17.9316147Z · ╰── 'HostProcess' is imported here 2026-10-23T22:25:17.9316359Z 26 │ 2026-10-23T22:25:17.9316487Z ╰──── 2026-10-23T22:25:17.9316662Z  help: Consider removing this import. 2026-10-23T22:25:17.9316795Z 2026-10-23T22:25:17.9317094Z ⚠ eslint(no-unused-vars): Variable 'serverConfig' is declared but never used. Unused variables should start with a '_'. 2026-10-23T22:25:17.9317592Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:124:11] 2026-10-23T22:25:17.9317869Z 123 │ const path = yield* Path.Path; 2026-10-23T22:25:17.9318117Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-23T22:25:17.9318351Z ·  ──────┬───── 2026-10-23T22:25:17.9318676Z · ╰── 'serverConfig' is declared here 2026-10-23T22:25:17.9318986Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-23T22:25:17.9319210Z ╰──── 2026-10-23T22:25:17.9319395Z  help: Consider removing this declaration. 2026-10-23T22:25:17.9319526Z 2026-10-23T22:25:17.9319845Z ⚠ eslint(no-unused-vars): Variable 'serverSettings' is declared but never used. Unused variables should start with a '_'. 2026-10-23T22:25:17.9320306Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:125:11] 2026-10-23T22:25:17.9320619Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-23T22:25:17.9320914Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-23T22:25:17.9321176Z ·  ───────┬────── 2026-10-23T22:25:17.9321479Z · ╰── 'serverSettings' is declared here 2026-10-23T22:25:17.9321791Z 126 │ const gitWorkflow = yield* GitWorkflowService.GitWorkflowService; 2026-10-23T22:25:17.9322009Z ╰──── 2026-10-23T22:25:17.9322264Z  help: Consider removing this declaration. 2026-10-23T22:25:17.9322438Z 2026-10-23T22:25:17.9322617Z ⚠ eslint(no-control-regex): Unexpected control character 2026-10-23T22:25:17.9323013Z ╭─[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46] 2026-10-23T22:25:17.9323378Z 219 │ 2026-10-23T22:25:17.9323700Z 220 │ {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")} 2026-10-23T22:25:17.9323976Z ·  ──┬─ 2026-10-23T22:25:17.9324285Z · ╰── 'U+001B' is a control character. 2026-10-23T22:25:17.9324526Z 221 │ 2026-10-23T22:25:17.9324688Z ╰──── 2026-10-23T22:25:17.9325006Z  help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression. 2026-10-23T22:25:17.9325258Z 2026-10-23T22:25:17.9325500Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-23T22:25:17.9325870Z ╭─[scripts/lib/cli-external-packages.test.ts:114:11] 2026-10-23T22:25:17.9326101Z 113 │ const declared = { 2026-10-23T22:25:17.9326299Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-23T22:25:17.9326544Z ·  ──────────────────────────────── 2026-10-23T22:25:17.9326789Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-23T22:25:17.9326980Z ╰──── 2026-10-23T22:25:17.9327334Z  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-23T22:25:17.9327618Z 2026-10-23T22:25:17.9327856Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-23T22:25:17.9328229Z ╭─[scripts/lib/cli-external-packages.test.ts:115:11] 2026-10-23T22:25:17.9328481Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-23T22:25:17.9328712Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-23T22:25:17.9328981Z ·  ──────────────────────────────────────── 2026-10-23T22:25:17.9329225Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-23T22:25:17.9329408Z ╰──── 2026-10-23T22:25:17.9329754Z  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-23T22:25:17.9330035Z 2026-10-23T22:25:17.9330274Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-23T22:25:17.9330647Z ╭─[scripts/lib/cli-external-packages.test.ts:116:11] 2026-10-23T22:25:17.9330906Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-23T22:25:17.9331160Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-23T22:25:17.9331501Z ·  ──────────────────────────────────── 2026-10-23T22:25:17.9331705Z 117 │ }; 2026-10-23T22:25:17.9331844Z ╰──── 2026-10-23T22:25:17.9332188Z  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-23T22:25:17.9332465Z 2026-10-23T22:25:17.9332759Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T22:25:17.9333169Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7] 2026-10-23T22:25:17.9333448Z 256 │ return () => cancelAnimationFrame(frame); 2026-10-23T22:25:17.9333662Z 257 │ }, [props.path, targetIndex]); 2026-10-23T22:25:17.9333861Z ·  ─────┬──── 2026-10-23T22:25:17.9334122Z · ╰── Unnecessary dependency `props.path` 2026-10-23T22:25:17.9334341Z 258 │ 2026-10-23T22:25:17.9334462Z ╰──── 2026-10-23T22:25:17.9334843Z  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-23T22:25:17.9335490Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9335825Z 2026-10-23T22:25:17.9336040Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T22:25:17.9336407Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23] 2026-10-23T22:25:17.9336659Z 292 │ 2026-10-23T22:25:17.9339117Z ·  ─────────── 2026-10-23T22:25:17.9339311Z 310 │ {body} 2026-10-23T22:25:17.9339459Z ╰──── 2026-10-23T22:25:17.9339678Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-23T22:25:17.9339849Z 2026-10-23T22:25:17.9340133Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T22:25:17.9340547Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:60:5] 2026-10-23T22:25:17.9340761Z 57 │ 2026-10-23T22:25:17.9340905Z 58 │ useEffect(() => { 2026-10-23T22:25:17.9341085Z ·  ────┬──── 2026-10-23T22:25:17.9341322Z · ╰── This is the containing effect 2026-10-23T22:25:17.9341625Z 59 │ const controller = new AbortController(); 2026-10-23T22:25:17.9341830Z 60 │ setLoadState("pending"); 2026-10-23T22:25:17.9342019Z ·  ──────┬───── 2026-10-23T22:25:17.9342301Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.9342662Z 61 │ // A renewed signature is used on Retry, not as a reason to reset the native player. 2026-10-23T22:25:17.9342898Z ╰──── 2026-10-23T22:25:17.9343705Z  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-23T22:25:17.9344702Z  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-23T22:25:17.9345035Z 2026-10-23T22:25:17.9345256Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T22:25:17.9345618Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:71:7] 2026-10-23T22:25:17.9345870Z 70 │ return () => controller.abort(); 2026-10-23T22:25:17.9346089Z 71 │ }, [player, props.playRequested, attempt]); 2026-10-23T22:25:17.9346399Z ·  ───┬── ─────────┬───────── ───┬─── 2026-10-23T22:25:17.9346823Z · │ │ ╰── Unnecessary dependency `attempt` 2026-10-23T22:25:17.9347265Z · │ ╰── Unnecessary dependency `props.playRequested` 2026-10-23T22:25:17.9347621Z · ╰── Unnecessary dependency `player_0` 2026-10-23T22:25:17.9347838Z 72 │ 2026-10-23T22:25:17.9347958Z ╰──── 2026-10-23T22:25:17.9348338Z  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-23T22:25:17.9348978Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9349305Z 2026-10-23T22:25:17.9349592Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T22:25:17.9350049Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:123:7] 2026-10-23T22:25:17.9350365Z 118 │ 2026-10-23T22:25:17.9350520Z 119 │ useEffect(() => { 2026-10-23T22:25:17.9350696Z ·  ────┬──── 2026-10-23T22:25:17.9350931Z · ╰── This is the containing effect 2026-10-23T22:25:17.9351171Z 120 │ if (orientationSettled) return; 2026-10-23T22:25:17.9351443Z 121 │ const orientation = getNativeShowcaseOrientation(); 2026-10-23T22:25:17.9351672Z 122 │ if (orientation === null) { 2026-10-23T22:25:17.9351874Z 123 │ setOrientationSettled(true); 2026-10-23T22:25:17.9352088Z ·  ──────────┬────────── 2026-10-23T22:25:17.9352472Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.9352768Z 124 │ return; 2026-10-23T22:25:17.9352910Z ╰──── 2026-10-23T22:25:17.9353625Z  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-23T22:25:17.9354561Z  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-23T22:25:17.9354896Z 2026-10-23T22:25:17.9355173Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T22:25:17.9355630Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:304:7] 2026-10-23T22:25:17.9355880Z 292 │ 2026-10-23T22:25:17.9356022Z 293 │ useEffect(() => { 2026-10-23T22:25:17.9356194Z ·  ────┬──── 2026-10-23T22:25:17.9356429Z · ╰── This is the containing effect 2026-10-23T22:25:17.9356639Z 294 │ if ( 2026-10-23T22:25:17.9356791Z 295 │ scene === null || 2026-10-23T22:25:17.9356969Z 296 │ requestedScene === null || 2026-10-23T22:25:17.9357158Z 297 │ scene !== requestedScene || 2026-10-23T22:25:17.9357344Z 298 │ !hasFixture || 2026-10-23T22:25:17.9357517Z 299 │ !orientationSettled || 2026-10-23T22:25:17.9357707Z 300 │ !themeApplied || 2026-10-23T22:25:17.9357930Z 301 │ (scene === "agent-activity" && !agentActivityStaged) || 2026-10-23T22:25:17.9358228Z 302 │ !isShowcaseNativeContentReady({ scene, themeId, renderSignal }) 2026-10-23T22:25:17.9358452Z 303 │ ) { 2026-10-23T22:25:17.9358604Z 304 │ setReadyScene(null); 2026-10-23T22:25:17.9358790Z ·  ──────┬────── 2026-10-23T22:25:17.9359083Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.9359332Z 305 │ return; 2026-10-23T22:25:17.9359475Z ╰──── 2026-10-23T22:25:17.9360188Z  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-23T22:25:17.9361127Z  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-23T22:25:17.9361500Z 2026-10-23T22:25:17.9361802Z ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'. 2026-10-23T22:25:17.9362267Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:128:9] 2026-10-23T22:25:17.9362535Z 127 │ let cancelled = false; 2026-10-23T22:25:17.9362737Z 128 │ let lastOutcome: string | null = null; 2026-10-23T22:25:17.9362946Z ·  ─────┬───── 2026-10-23T22:25:17.9363201Z · ╰── 'lastOutcome' is declared here 2026-10-23T22:25:17.9363546Z 129 │ void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), { 2026-10-23T22:25:17.9363797Z ╰──── 2026-10-23T22:25:17.9364054Z  help: Consider removing this declaration. 2026-10-23T22:25:17.9364359Z 2026-10-23T22:25:17.9364527Z ⚠ react(immutability): This value cannot be modified 2026-10-23T22:25:17.9364876Z ╭─[apps/mobile/src/features/connection/ConnectionStatusDot.tsx:58:7] 2026-10-23T22:25:17.9365163Z 53 │ function usePulseAnimation(pulse: boolean) { 2026-10-23T22:25:17.9365400Z 54 │ const pulseProgress = useSharedValue(0); 2026-10-23T22:25:17.9365608Z ·  ──────┬────── 2026-10-23T22:25:17.9365872Z · ╰── `pulseProgress` originates here 2026-10-23T22:25:17.9366084Z 55 │ 2026-10-23T22:25:17.9366228Z 56 │ useEffect(() => { 2026-10-23T22:25:17.9366398Z 57 │ if (pulse) { 2026-10-23T22:25:17.9366588Z 58 │ pulseProgress.value = withRepeat( 2026-10-23T22:25:17.9366801Z ·  ──────┬────── 2026-10-23T22:25:17.9367059Z · ╰── `pulseProgress` cannot be modified 2026-10-23T22:25:17.9367299Z 59 │ withTiming(1, { 2026-10-23T22:25:17.9367458Z ╰──── 2026-10-23T22:25:17.9367822Z  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-23T22:25:17.9368435Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T22:25:17.9368758Z 2026-10-23T22:25:17.9368973Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T22:25:17.9369347Z ╭─[apps/mobile/src/components/ComposerContextSheet.tsx:267:25] 2026-10-23T22:25:17.9369649Z 266 │ {record.elements?.map((element, index) => ( 2026-10-23T22:25:17.9369977Z 267 │ 2026-10-23T22:25:17.9370335Z ·  ─────────────────────────────────────────────────────── 2026-10-23T22:25:17.9370578Z 268 │ { 2026-10-23T22:25:17.9372566Z ·  ────┬──── 2026-10-23T22:25:17.9372801Z · ╰── This is the containing effect 2026-10-23T22:25:17.9373089Z 78 │ const { host, code } = parsePairingUrl(connectionPairingUrl); 2026-10-23T22:25:17.9373318Z 79 │ setHostInput(host); 2026-10-23T22:25:17.9373500Z ·  ──────┬───── 2026-10-23T22:25:17.9373781Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.9374033Z 80 │ setCodeInput(code); 2026-10-23T22:25:17.9374187Z ╰──── 2026-10-23T22:25:17.9374965Z  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-23T22:25:17.9376043Z  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-23T22:25:17.9376382Z 2026-10-23T22:25:17.9376663Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T22:25:17.9377111Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:89:5] 2026-10-23T22:25:17.9377356Z 82 │ 2026-10-23T22:25:17.9377496Z 83 │ useEffect(() => { 2026-10-23T22:25:17.9377660Z ·  ────┬──── 2026-10-23T22:25:17.9377897Z · ╰── This is the containing effect 2026-10-23T22:25:17.9378151Z 84 │ if (routePairingUrl.length === 0) { 2026-10-23T22:25:17.9378339Z 85 │ return; 2026-10-23T22:25:17.9378481Z 86 │ } 2026-10-23T22:25:17.9378610Z 87 │ 2026-10-23T22:25:17.9378800Z 88 │ const { host, code } = parsePairingUrl(routePairingUrl); 2026-10-23T22:25:17.9379019Z 89 │ setHostInput(host); 2026-10-23T22:25:17.9379202Z ·  ──────┬───── 2026-10-23T22:25:17.9379482Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.9379741Z 90 │ setCodeInput(code); 2026-10-23T22:25:17.9379890Z ╰──── 2026-10-23T22:25:17.9380616Z  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-23T22:25:17.9381586Z  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-23T22:25:17.9381924Z 2026-10-23T22:25:17.9382204Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T22:25:17.9382655Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:95:7] 2026-10-23T22:25:17.9382900Z 92 │ 2026-10-23T22:25:17.9383036Z 93 │ useEffect(() => { 2026-10-23T22:25:17.9383210Z ·  ────┬──── 2026-10-23T22:25:17.9383442Z · ╰── This is the containing effect 2026-10-23T22:25:17.9383682Z 94 │ if (pairingConnectionError) { 2026-10-23T22:25:17.9383880Z 95 │ setIsSubmitting(false); 2026-10-23T22:25:17.9384078Z ·  ───────┬─────── 2026-10-23T22:25:17.9384367Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.9384612Z 96 │ } 2026-10-23T22:25:17.9384739Z ╰──── 2026-10-23T22:25:17.9385449Z  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-23T22:25:17.9386377Z  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-23T22:25:17.9386712Z 2026-10-23T22:25:17.9387051Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T22:25:17.9387497Z ╭─[apps/mobile/src/components/ProjectFavicon.tsx:158:5] 2026-10-23T22:25:17.9387868Z 153 │ const [activeFaviconRequest, setActiveFaviconRequest] = useState(null); 2026-10-23T22:25:17.9388156Z 154 │ useLayoutEffect(() => { 2026-10-23T22:25:17.9388348Z ·  ───────┬─────── 2026-10-23T22:25:17.9388596Z · ╰── This is the containing effect 2026-10-23T22:25:17.9388847Z 155 │ if (faviconRequest === null) return; 2026-10-23T22:25:17.9389022Z 156 │ 2026-10-23T22:25:17.9389233Z 157 │ const endRequest = beginProjectFaviconRequest(faviconRequest); 2026-10-23T22:25:17.9389500Z 158 │ setActiveFaviconRequest(faviconRequest); 2026-10-23T22:25:17.9389734Z ·  ───────────┬─────────── 2026-10-23T22:25:17.9390041Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.9390362Z 159 │ return endRequest; 2026-10-23T22:25:17.9390520Z ╰──── 2026-10-23T22:25:17.9391235Z  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-23T22:25:17.9392205Z  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-23T22:25:17.9392538Z 2026-10-23T22:25:17.9392824Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T22:25:17.9393251Z ╭─[apps/mobile/src/components/VideoPreviewModal.ios.tsx:63:55] 2026-10-23T22:25:17.9393485Z 61 │ }, []); 2026-10-23T22:25:17.9393635Z 62 │ useEffect(() => { 2026-10-23T22:25:17.9393801Z ·  ────┬──── 2026-10-23T22:25:17.9394037Z · ╰── This is the containing effect 2026-10-23T22:25:17.9394344Z 63 │ if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl); 2026-10-23T22:25:17.9394656Z ·  ───────┬────── 2026-10-23T22:25:17.9395015Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.9395395Z 64 │ }, [playbackUrl, resolvedUrl]); 2026-10-23T22:25:17.9395616Z ╰──── 2026-10-23T22:25:17.9396337Z  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-23T22:25:17.9397266Z  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-23T22:25:17.9397600Z 2026-10-23T22:25:17.9397822Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T22:25:17.9398180Z ╭─[apps/mobile/src/components/ComposerEditor.tsx:82:6] 2026-10-23T22:25:17.9398404Z 81 │ }, 2026-10-23T22:25:17.9398552Z 82 │ [draftKey], 2026-10-23T22:25:17.9398721Z ·  ────┬─── 2026-10-23T22:25:17.9398963Z · ╰── Unnecessary dependency `draftKey` 2026-10-23T22:25:17.9399184Z 83 │ ); 2026-10-23T22:25:17.9399310Z ╰──── 2026-10-23T22:25:17.9399692Z  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-23T22:25:17.9400336Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9400664Z 2026-10-23T22:25:17.9400948Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T22:25:17.9401403Z ╭─[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5] 2026-10-23T22:25:17.9401634Z 150 │ 2026-10-23T22:25:17.9401776Z 151 │ useEffect(() => { 2026-10-23T22:25:17.9401951Z ·  ────┬──── 2026-10-23T22:25:17.9402184Z · ╰── This is the containing effect 2026-10-23T22:25:17.9402425Z 152 │ if (!controlledSelectedPath) { 2026-10-23T22:25:17.9402610Z 153 │ return; 2026-10-23T22:25:17.9402759Z 154 │ } 2026-10-23T22:25:17.9402925Z 155 │ setExpandedPaths((current) => { 2026-10-23T22:25:17.9403126Z ·  ────────┬─────── 2026-10-23T22:25:17.9403415Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.9403733Z 156 │ const ancestors = ancestorPaths(controlledSelectedPath); 2026-10-23T22:25:17.9403955Z ╰──── 2026-10-23T22:25:17.9404667Z  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-23T22:25:17.9405606Z  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-23T22:25:17.9405937Z 2026-10-23T22:25:17.9406214Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T22:25:17.9406677Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:335:7] 2026-10-23T22:25:17.9406925Z 330 │ }; 2026-10-23T22:25:17.9407145Z 331 │ useEffect(() => { 2026-10-23T22:25:17.9407361Z ·  ────┬──── 2026-10-23T22:25:17.9407598Z · ╰── This is the containing effect 2026-10-23T22:25:17.9407855Z 332 │ if (!guidesEnabled && section === "guide") { 2026-10-23T22:25:17.9408097Z 333 │ requestedSection.current = "overview"; 2026-10-23T22:25:17.9408405Z 334 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-23T22:25:17.9408677Z 335 │ setSection("overview"); 2026-10-23T22:25:17.9408871Z ·  ─────┬──── 2026-10-23T22:25:17.9409156Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.9409403Z 336 │ } 2026-10-23T22:25:17.9409531Z ╰──── 2026-10-23T22:25:17.9410250Z  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-23T22:25:17.9411191Z  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-23T22:25:17.9411613Z 2026-10-23T22:25:17.9411841Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-23T22:25:17.9412251Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:337:6] 2026-10-23T22:25:17.9412550Z 332 │ if (!guidesEnabled && section === "guide") { 2026-10-23T22:25:17.9412781Z 333 │ requestedSection.current = "overview"; 2026-10-23T22:25:17.9413002Z ·  ────────┬─────── 2026-10-23T22:25:17.9413595Z · ╰── 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-23T22:25:17.9414211Z 334 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-23T22:25:17.9414565Z ·  ─────────┬───────── ──────┬────── 2026-10-23T22:25:17.9415264Z · │ ╰── 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-23T22:25:17.9416222Z · ╰── 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-23T22:25:17.9416740Z 335 │ setSection("overview"); 2026-10-23T22:25:17.9416910Z 336 │ } 2026-10-23T22:25:17.9417089Z 337 │ }, [guidesEnabled, section, insets.top]); 2026-10-23T22:25:17.9417341Z ·  ──────────────────┬───────────────── 2026-10-23T22:25:17.9417678Z · ╰── This dependency list is missing values used by the callback 2026-10-23T22:25:17.9417976Z 338 │ const tabContent = activityContent; 2026-10-23T22:25:17.9418149Z ╰──── 2026-10-23T22:25:17.9418395Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-23T22:25:17.9418993Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9419363Z 2026-10-23T22:25:17.9419586Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-23T22:25:17.9419996Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:873:6] 2026-10-23T22:25:17.9420247Z 856 │ if ( 2026-10-23T22:25:17.9420454Z 857 │ lastSelection.current.path === route.params.path && 2026-10-23T22:25:17.9420685Z ·  ──────┬────── 2026-10-23T22:25:17.9421276Z · ╰── 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-23T22:25:17.9421882Z 858 │ lastSelection.current.id === route.params.fileSelectionId 2026-10-23T22:25:17.9422099Z 859 │ ) 2026-10-23T22:25:17.9422237Z 860 │ return; 2026-10-23T22:25:17.9422516Z 861 │ lastSelection.current = { path: route.params.path, id: route.params.fileSelectionId }; 2026-10-23T22:25:17.9422863Z 862 │ if (route.params.focus) navigation.setParams({ focus: undefined }); 2026-10-23T22:25:17.9423127Z 863 │ setJumpPath(route.params.path); 2026-10-23T22:25:17.9423322Z 864 │ setSelectedRowId(null); 2026-10-23T22:25:17.9423514Z 865 │ jumpStarted.current = false; 2026-10-23T22:25:17.9423790Z 866 │ const file = data.files.find((entry) => entry.path === route.params.path); 2026-10-23T22:25:17.9424071Z 867 │ if (!file || !nativeView.current) return; 2026-10-23T22:25:17.9424295Z ·  ─────┬──── 2026-10-23T22:25:17.9424884Z · ╰── 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-23T22:25:17.9425439Z 868 │ setCollapsedIds((ids) => ids.filter((id) => id !== file.id)); 2026-10-23T22:25:17.9425680Z 869 │ jumpStarted.current = true; 2026-10-23T22:25:17.9425939Z 870 │ void nativeView.current.scrollToFile(file.id, false).catch(() => { 2026-10-23T22:25:17.9426195Z 871 │ jumpStarted.current = false; 2026-10-23T22:25:17.9426372Z 872 │ }); 2026-10-23T22:25:17.9426658Z 873 │ }, [route.params.path, route.params.fileSelectionId, route.params.focus, data.files, navigation]); 2026-10-23T22:25:17.9427101Z ·  ──────────────────────────────────────────────┬────────────────────────────────────────────── 2026-10-23T22:25:17.9427535Z · ╰── This dependency list is missing values used by the callback 2026-10-23T22:25:17.9427882Z 874 │ const appliedFilter = useRef(filter.hideTestFiles); 2026-10-23T22:25:17.9428083Z ╰──── 2026-10-23T22:25:17.9428334Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-23T22:25:17.9428861Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9429186Z 2026-10-23T22:25:17.9429392Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T22:25:17.9429855Z ╭─[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:116:34] 2026-10-23T22:25:17.9430631Z 115 │ return [...commands]; 2026-10-23T22:25:17.9430877Z 116 │ }, [activeThreadRef, pathname, registrationVersion, navigation]); 2026-10-23T22:25:17.9431166Z ·  ─────────┬───────── 2026-10-23T22:25:17.9431538Z · ╰── Unnecessary dependency `registrationVersion` 2026-10-23T22:25:17.9431789Z 117 │ 2026-10-23T22:25:17.9431913Z ╰──── 2026-10-23T22:25:17.9432321Z  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-23T22:25:17.9433096Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9433430Z 2026-10-23T22:25:17.9433646Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T22:25:17.9434013Z ╭─[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9] 2026-10-23T22:25:17.9434281Z 35 │ Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()), 2026-10-23T22:25:17.9437061Z ·  ────────────────────────── 2026-10-23T22:25:17.9437325Z 147 │ `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`, 2026-10-23T22:25:17.9437527Z ╰──── 2026-10-23T22:25:17.9437593Z 2026-10-23T22:25:17.9437881Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T22:25:17.9438299Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2121:5] 2026-10-23T22:25:17.9438633Z 2119 │ ); 2026-10-23T22:25:17.9438842Z 2120 │ useEffect(() => { 2026-10-23T22:25:17.9439141Z ·  ────┬──── 2026-10-23T22:25:17.9439451Z · ╰── This is the containing effect 2026-10-23T22:25:17.9439691Z 2121 │ setExpandedVideo(null); 2026-10-23T22:25:17.9439891Z ·  ────────┬─────── 2026-10-23T22:25:17.9440188Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.9440458Z 2122 │ setExpandedFile(null); 2026-10-23T22:25:17.9440619Z ╰──── 2026-10-23T22:25:17.9441372Z  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-23T22:25:17.9442338Z  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-23T22:25:17.9442672Z 2026-10-23T22:25:17.9442929Z ⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used. 2026-10-23T22:25:17.9443322Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:62:10] 2026-10-23T22:25:17.9443783Z 61 │ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets"; 2026-10-23T22:25:17.9444264Z 62 │ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks"; 2026-10-23T22:25:17.9444699Z ·  ───────────┬─────────── 2026-10-23T22:25:17.9445169Z · ╰── 'isMarkdownFileLinkLabel' is imported here 2026-10-23T22:25:17.9445761Z 63 │ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments"; 2026-10-23T22:25:17.9446152Z ╰──── 2026-10-23T22:25:17.9446421Z  help: Consider removing this import. 2026-10-23T22:25:17.9446625Z 2026-10-23T22:25:17.9446995Z ⚠ eslint(no-unused-vars): Identifier 'createContext' is imported but never used. 2026-10-23T22:25:17.9447567Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:88:3] 2026-10-23T22:25:17.9447909Z 87 │ import { 2026-10-23T22:25:17.9448137Z 88 │ createContext, 2026-10-23T22:25:17.9448397Z ·  ──────┬────── 2026-10-23T22:25:17.9448790Z · ╰── 'createContext' is imported here 2026-10-23T22:25:17.9449129Z 89 │ memo, 2026-10-23T22:25:17.9449339Z ╰──── 2026-10-23T22:25:17.9449598Z  help: Consider removing this import. 2026-10-23T22:25:17.9449792Z 2026-10-23T22:25:17.9450166Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-23T22:25:17.9450792Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:104:3] 2026-10-23T22:25:17.9451157Z 103 │ import { 2026-10-23T22:25:17.9452143Z 104 │ ActivityIndicator, 2026-10-23T22:25:17.9452911Z ·  ────────┬──────── 2026-10-23T22:25:17.9453243Z · ╰── 'ActivityIndicator' is imported here 2026-10-23T22:25:17.9453311Z 105 │ Image, 2026-10-23T22:25:17.9453365Z ╰──── 2026-10-23T22:25:17.9453479Z  help: Consider removing this import. 2026-10-23T22:25:17.9453494Z 2026-10-23T22:25:17.9453722Z ⚠ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used. 2026-10-23T22:25:17.9454387Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:111:3] 2026-10-23T22:25:17.9454570Z 110 │ Pressable, 2026-10-23T22:25:17.9454640Z 111 │ ScrollView, 2026-10-23T22:25:17.9454722Z ·  ─────┬──── 2026-10-23T22:25:17.9454867Z · ╰── 'ScrollView' is imported here 2026-10-23T22:25:17.9454930Z 112 │ StyleSheet, 2026-10-23T22:25:17.9454988Z ╰──── 2026-10-23T22:25:17.9455093Z  help: Consider removing this import. 2026-10-23T22:25:17.9455096Z 2026-10-23T22:25:17.9455307Z ⚠ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used. 2026-10-23T22:25:17.9455449Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:113:11] 2026-10-23T22:25:17.9455513Z 112 │ StyleSheet, 2026-10-23T22:25:17.9455589Z 113 │ Text as NativeText, 2026-10-23T22:25:17.9455684Z ·  ─────┬──── 2026-10-23T22:25:17.9455832Z · ╰── 'NativeText' is imported here 2026-10-23T22:25:17.9455906Z 114 │ type ColorValue, 2026-10-23T22:25:17.9455965Z ╰──── 2026-10-23T22:25:17.9456072Z  help: Consider removing this import. 2026-10-23T22:25:17.9456075Z 2026-10-23T22:25:17.9456297Z ⚠ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used. 2026-10-23T22:25:17.9456440Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:136:10] 2026-10-23T22:25:17.9456585Z 135 │ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic"; 2026-10-23T22:25:17.9456720Z 136 │ import { tryOpenExternalUrl } from "../../lib/openExternalUrl"; 2026-10-23T22:25:17.9456813Z ·  ─────────┬──────── 2026-10-23T22:25:17.9456988Z · ╰── 'tryOpenExternalUrl' is imported here 2026-10-23T22:25:17.9457146Z 137 │ import { downloadAndShareAttachment } from "../../lib/attachmentDownload"; 2026-10-23T22:25:17.9457202Z ╰──── 2026-10-23T22:25:17.9457301Z  help: Consider removing this import. 2026-10-23T22:25:17.9457304Z 2026-10-23T22:25:17.9457534Z ⚠ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used. 2026-10-23T22:25:17.9457674Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:139:10] 2026-10-23T22:25:17.9457820Z 138 │ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks"; 2026-10-23T22:25:17.9457953Z 139 │ import { faviconUrlForOrigin } from "@t3tools/shared/favicon"; 2026-10-23T22:25:17.9458052Z ·  ─────────┬───────── 2026-10-23T22:25:17.9458221Z · ╰── 'faviconUrlForOrigin' is imported here 2026-10-23T22:25:17.9458287Z 140 │ import { 2026-10-23T22:25:17.9458339Z ╰──── 2026-10-23T22:25:17.9458444Z  help: Consider removing this import. 2026-10-23T22:25:17.9458446Z 2026-10-23T22:25:17.9458667Z ⚠ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used. 2026-10-23T22:25:17.9458805Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:153:10] 2026-10-23T22:25:17.9458955Z 152 │ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile"; 2026-10-23T22:25:17.9459095Z 153 │ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer"; 2026-10-23T22:25:17.9459188Z ·  ────────┬─────── 2026-10-23T22:25:17.9459347Z · ╰── 'MediaVideoPlayer' is imported here 2026-10-23T22:25:17.9459623Z 154 │ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia"; 2026-10-23T22:25:17.9459727Z ╰──── 2026-10-23T22:25:17.9459828Z  help: Consider removing this import. 2026-10-23T22:25:17.9459831Z 2026-10-23T22:25:17.9460059Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used. 2026-10-23T22:25:17.9460199Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:157:3] 2026-10-23T22:25:17.9460283Z 156 │ attachmentVideoPreviewSource, 2026-10-23T22:25:17.9460362Z 157 │ mediaVideoPreviewUri, 2026-10-23T22:25:17.9460454Z ·  ──────────┬───────── 2026-10-23T22:25:17.9460615Z · ╰── 'mediaVideoPreviewUri' is imported here 2026-10-23T22:25:17.9460690Z 158 │ mediaVideoThumbnailKey, 2026-10-23T22:25:17.9460744Z ╰──── 2026-10-23T22:25:17.9460850Z  help: Consider removing this import. 2026-10-23T22:25:17.9460855Z 2026-10-23T22:25:17.9461087Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used. 2026-10-23T22:25:17.9461220Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:158:3] 2026-10-23T22:25:17.9461294Z 157 │ mediaVideoPreviewUri, 2026-10-23T22:25:17.9461416Z 158 │ mediaVideoThumbnailKey, 2026-10-23T22:25:17.9461513Z ·  ───────────┬────────── 2026-10-23T22:25:17.9461672Z · ╰── 'mediaVideoThumbnailKey' is imported here 2026-10-23T22:25:17.9461763Z 159 │ type MediaVideoPreviewSource, 2026-10-23T22:25:17.9461821Z ╰──── 2026-10-23T22:25:17.9461921Z  help: Consider removing this import. 2026-10-23T22:25:17.9461924Z 2026-10-23T22:25:17.9462144Z ⚠ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used. 2026-10-23T22:25:17.9462285Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:159:8] 2026-10-23T22:25:17.9462361Z 158 │ mediaVideoThumbnailKey, 2026-10-23T22:25:17.9462444Z 159 │ type MediaVideoPreviewSource, 2026-10-23T22:25:17.9462542Z ·  ───────────┬─────────── 2026-10-23T22:25:17.9462710Z · ╰── 'MediaVideoPreviewSource' is imported here 2026-10-23T22:25:17.9462801Z 160 │ } from "../../lib/videoPreviewSource"; 2026-10-23T22:25:17.9462856Z ╰──── 2026-10-23T22:25:17.9462954Z  help: Consider removing this import. 2026-10-23T22:25:17.9462957Z 2026-10-23T22:25:17.9463167Z ⚠ eslint(no-unused-vars): Type 'ReviewDiffTheme' is imported but never used. 2026-10-23T22:25:17.9463308Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:167:15] 2026-10-23T22:25:17.9463496Z 166 │ import { parseReviewCommentMessageSegments } from "../review/reviewCommentSelection"; 2026-10-23T22:25:17.9463637Z 167 │ import type { ReviewDiffTheme } from "../review/shikiReviewHighlighter"; 2026-10-23T22:25:17.9463733Z ·  ───────┬─────── 2026-10-23T22:25:17.9463888Z · ╰── 'ReviewDiffTheme' is imported here 2026-10-23T22:25:17.9463951Z 168 │ import { 2026-10-23T22:25:17.9464003Z ╰──── 2026-10-23T22:25:17.9464107Z  help: Consider removing this import. 2026-10-23T22:25:17.9464109Z 2026-10-23T22:25:17.9464346Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used. 2026-10-23T22:25:17.9464594Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:182:3] 2026-10-23T22:25:17.9464707Z 181 │ import { 2026-10-23T22:25:17.9464788Z 182 │ resolveMarkdownFontSizes, 2026-10-23T22:25:17.9464882Z ·  ────────────┬─────────── 2026-10-23T22:25:17.9465048Z · ╰── 'resolveMarkdownFontSizes' is imported here 2026-10-23T22:25:17.9465139Z 183 │ resolveNativeMarkdownTypography, 2026-10-23T22:25:17.9465201Z ╰──── 2026-10-23T22:25:17.9465301Z  help: Consider removing this import. 2026-10-23T22:25:17.9465303Z 2026-10-23T22:25:17.9465533Z ⚠ eslint(no-unused-vars): Identifier 'markdownLinkIconSource' is imported but never used. 2026-10-23T22:25:17.9465670Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:187:10] 2026-10-23T22:25:17.9465812Z 186 │ import { PierreEntryIcon } from "../../components/PierreEntryIcon"; 2026-10-23T22:25:17.9465958Z 187 │ import { markdownLinkIconSource } from "../../lib/markdownLinkIcons"; 2026-10-23T22:25:17.9466059Z ·  ───────────┬────────── 2026-10-23T22:25:17.9466229Z · ╰── 'markdownLinkIconSource' is imported here 2026-10-23T22:25:17.9466287Z 188 │ import { 2026-10-23T22:25:17.9466341Z ╰──── 2026-10-23T22:25:17.9466441Z  help: Consider removing this import. 2026-10-23T22:25:17.9466444Z 2026-10-23T22:25:17.9466713Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used. 2026-10-23T22:25:17.9466852Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:190:3] 2026-10-23T22:25:17.9466938Z 189 │ normalizeNativeMarkdownUrl, 2026-10-23T22:25:17.9467044Z 190 │ resolveMarkdownInlineCodePresentation, 2026-10-23T22:25:17.9467165Z ·  ──────────────────┬────────────────── 2026-10-23T22:25:17.9467364Z · ╰── 'resolveMarkdownInlineCodePresentation' is imported here 2026-10-23T22:25:17.9467444Z 191 │ resolveMarkdownLinkIcon, 2026-10-23T22:25:17.9467500Z ╰──── 2026-10-23T22:25:17.9467607Z  help: Consider removing this import. 2026-10-23T22:25:17.9467609Z 2026-10-23T22:25:17.9467838Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownLinkIcon' is imported but never used. 2026-10-23T22:25:17.9467978Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:191:3] 2026-10-23T22:25:17.9468081Z 190 │ resolveMarkdownInlineCodePresentation, 2026-10-23T22:25:17.9468163Z 191 │ resolveMarkdownLinkIcon, 2026-10-23T22:25:17.9468365Z ·  ───────────┬─────────── 2026-10-23T22:25:17.9468579Z · ╰── 'resolveMarkdownLinkIcon' is imported here 2026-10-23T22:25:17.9468672Z 192 │ resolveMarkdownLinkPresentation, 2026-10-23T22:25:17.9468728Z ╰──── 2026-10-23T22:25:17.9468827Z  help: Consider removing this import. 2026-10-23T22:25:17.9468830Z 2026-10-23T22:25:17.9469066Z ⚠ eslint(no-unused-vars): Identifier 'useMarkdownCodeHighlight' is imported but never used. 2026-10-23T22:25:17.9469206Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:230:10] 2026-10-23T22:25:17.9469318Z 229 │ import { ThreadMcpApp } from "./McpAppWebView"; 2026-10-23T22:25:17.9469467Z 230 │ import { useMarkdownCodeHighlight } from "./markdownCodeHighlightState"; 2026-10-23T22:25:17.9469571Z ·  ────────────┬─────────── 2026-10-23T22:25:17.9469754Z · ╰── 'useMarkdownCodeHighlight' is imported here 2026-10-23T22:25:17.9469822Z 231 │ import { 2026-10-23T22:25:17.9469874Z ╰──── 2026-10-23T22:25:17.9469981Z  help: Consider removing this import. 2026-10-23T22:25:17.9469984Z 2026-10-23T22:25:17.9470385Z ⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used. 2026-10-23T22:25:17.9470525Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:234:3] 2026-10-23T22:25:17.9470596Z 233 │ useAssetUrl, 2026-10-23T22:25:17.9470674Z 234 │ useAssetUrlState, 2026-10-23T22:25:17.9470762Z ·  ────────┬─────── 2026-10-23T22:25:17.9470912Z · ╰── 'useAssetUrlState' is imported here 2026-10-23T22:25:17.9470990Z 235 │ useRefreshAssetUrl, 2026-10-23T22:25:17.9471051Z ╰──── 2026-10-23T22:25:17.9471153Z  help: Consider removing this import. 2026-10-23T22:25:17.9471155Z 2026-10-23T22:25:17.9471394Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T22:25:17.9471546Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2123:7] 2026-10-23T22:25:17.9471623Z 2122 │ setExpandedFile(null); 2026-10-23T22:25:17.9471791Z 2123 │ }, [props.environmentId, props.threadId, props.contentPresentation.kind]); 2026-10-23T22:25:17.9472020Z ·  ─────────┬───────── ───────┬────── ───────────────┬────────────── 2026-10-23T22:25:17.9472326Z · │ │ ╰── Unnecessary dependency `props.contentPresentation.kind` 2026-10-23T22:25:17.9472532Z · │ ╰── Unnecessary dependency `props.threadId` 2026-10-23T22:25:17.9472704Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-23T22:25:17.9472857Z 2124 │ const horizontalPadding = props.layoutVariant === "split" ? 20 : 16; 2026-10-23T22:25:17.9472914Z ╰──── 2026-10-23T22:25:17.9473218Z  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-23T22:25:17.9473570Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9473573Z 2026-10-23T22:25:17.9474046Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T22:25:17.9474263Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2590:7] 2026-10-23T22:25:17.9474368Z 2589 │ reportHeaderMaterialVisibility(false); 2026-10-23T22:25:17.9474491Z 2590 │ }, [feedThreadKey, reportHeaderMaterialVisibility]); 2026-10-23T22:25:17.9474580Z ·  ──────┬────── 2026-10-23T22:25:17.9474739Z · ╰── Unnecessary dependency `feedThreadKey` 2026-10-23T22:25:17.9474798Z 2591 │ 2026-10-23T22:25:17.9474853Z ╰──── 2026-10-23T22:25:17.9475156Z  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-23T22:25:17.9475484Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9475489Z 2026-10-23T22:25:17.9475701Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T22:25:17.9475836Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2606:7] 2026-10-23T22:25:17.9475898Z 2605 │ } 2026-10-23T22:25:17.9476040Z 2606 │ }, [listMountKey, props.contentInsetEndAdjustment, listRef]); 2026-10-23T22:25:17.9476127Z ·  ──────┬───── 2026-10-23T22:25:17.9476278Z · ╰── Unnecessary dependency `listMountKey` 2026-10-23T22:25:17.9476336Z 2607 │ 2026-10-23T22:25:17.9476395Z ╰──── 2026-10-23T22:25:17.9482977Z  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-23T22:25:17.9483457Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9483468Z 2026-10-23T22:25:17.9483691Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T22:25:17.9483837Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2763:7] 2026-10-23T22:25:17.9483901Z 2762 │ } 2026-10-23T22:25:17.9484093Z 2763 │ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]); 2026-10-23T22:25:17.9484304Z ·  ───────┬─────── ─────────┬──────── ────────┬─────── 2026-10-23T22:25:17.9484574Z · │ │ ╰── Unnecessary dependency `expandedWorkRows` 2026-10-23T22:25:17.9484794Z · │ ╰── Unnecessary dependency `expandedWorkGroups` 2026-10-23T22:25:17.9484953Z · ╰── Unnecessary dependency `expandedTurnIds` 2026-10-23T22:25:17.9485009Z 2764 │ 2026-10-23T22:25:17.9485066Z ╰──── 2026-10-23T22:25:17.9485369Z  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-23T22:25:17.9485693Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9485695Z 2026-10-23T22:25:17.9486139Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T22:25:17.9486413Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:605:9] 2026-10-23T22:25:17.9486494Z 604 │ }; 2026-10-23T22:25:17.9486620Z 605 │ }, [props.environmentId, attachment.id, httpBaseUrl]), 2026-10-23T22:25:17.9486823Z ·  ─────────┬───────── ──────┬────── ─────┬───── 2026-10-23T22:25:17.9487066Z · │ │ ╰── Unnecessary dependency `httpBaseUrl` 2026-10-23T22:25:17.9487272Z · │ ╰── Unnecessary dependency `attachment.id` 2026-10-23T22:25:17.9487454Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-23T22:25:17.9487519Z 606 │ ); 2026-10-23T22:25:17.9487571Z ╰──── 2026-10-23T22:25:17.9487899Z  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-23T22:25:17.9488219Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9488223Z 2026-10-23T22:25:17.9488461Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-23T22:25:17.9488596Z ╭─[apps/server/src/terminal/Manager.test.ts:731:31] 2026-10-23T22:25:17.9488654Z 730 │ ); 2026-10-23T22:25:17.9488838Z 731 │ const snapshot = events.filter((event) => event.type === "snapshot").at(-1)?.snapshot; 2026-10-23T22:25:17.9488945Z ·  ────── 2026-10-23T22:25:17.9489072Z 732 │ expect(snapshot?.history).toBe("aa😀\rEND"); 2026-10-23T22:25:17.9489127Z ╰──── 2026-10-23T22:25:17.9489307Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-23T22:25:17.9489310Z 2026-10-23T22:25:17.9489586Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T22:25:17.9489750Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:512:5] 2026-10-23T22:25:17.9489811Z 510 │ }, []); 2026-10-23T22:25:17.9489885Z 511 │ useEffect(() => { 2026-10-23T22:25:17.9489964Z ·  ────┬──── 2026-10-23T22:25:17.9490108Z · ╰── This is the containing effect 2026-10-23T22:25:17.9490203Z 512 │ setKeyboardStateSuspect(false); 2026-10-23T22:25:17.9490303Z ·  ───────────┬─────────── 2026-10-23T22:25:17.9490481Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.9490590Z 513 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-23T22:25:17.9490642Z ╰──── 2026-10-23T22:25:17.9491261Z  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-23T22:25:17.9491780Z  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-23T22:25:17.9491825Z 2026-10-23T22:25:17.9492091Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T22:25:17.9492249Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:872:7] 2026-10-23T22:25:17.9492407Z 869 │ const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0); 2026-10-23T22:25:17.9492508Z 870 │ useEffect(() => { 2026-10-23T22:25:17.9492598Z ·  ────┬──── 2026-10-23T22:25:17.9492731Z · ╰── This is the containing effect 2026-10-23T22:25:17.9492894Z 871 │ if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) { 2026-10-23T22:25:17.9493023Z 872 │ setLastKnownKeyboardHeight(liveKeyboardHeight); 2026-10-23T22:25:17.9493132Z ·  ─────────────┬──────────── 2026-10-23T22:25:17.9493314Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.9493371Z 873 │ } 2026-10-23T22:25:17.9493425Z ╰──── 2026-10-23T22:25:17.9494036Z  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-23T22:25:17.9494364Z  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-23T22:25:17.9494366Z 2026-10-23T22:25:17.9494632Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T22:25:17.9494793Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1119:5] 2026-10-23T22:25:17.9494853Z 1117 │ 2026-10-23T22:25:17.9494925Z 1118 │ useEffect(() => { 2026-10-23T22:25:17.9495008Z ·  ────┬──── 2026-10-23T22:25:17.9495142Z · ╰── This is the containing effect 2026-10-23T22:25:17.9495226Z 1119 │ setAnchorMessageId(null); 2026-10-23T22:25:17.9495316Z ·  ─────────┬──────── 2026-10-23T22:25:17.9495496Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.9495579Z 1120 │ setSubmittedMessageId(null); 2026-10-23T22:25:17.9495636Z ╰──── 2026-10-23T22:25:17.9496363Z  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-23T22:25:17.9496737Z  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-23T22:25:17.9496739Z 2026-10-23T22:25:17.9496949Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T22:25:17.9497103Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:513:7] 2026-10-23T22:25:17.9497196Z 512 │ setKeyboardStateSuspect(false); 2026-10-23T22:25:17.9497305Z 513 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-23T22:25:17.9497456Z ·  ────────┬──────── ─────────┬──────── 2026-10-23T22:25:17.9497666Z · │ ╰── Unnecessary dependency `liveKeyboardHeight` 2026-10-23T22:25:17.9497830Z · ╰── Unnecessary dependency `isKeyboardVisible` 2026-10-23T22:25:17.9497964Z 514 │ const handleOwnedInputFocusChange = (focused: boolean) => { 2026-10-23T22:25:17.9498021Z ╰──── 2026-10-23T22:25:17.9498321Z  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-23T22:25:17.9498639Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9498645Z 2026-10-23T22:25:17.9498848Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T22:25:17.9499006Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1067:7] 2026-10-23T22:25:17.9499099Z 1066 │ userInputInsetProgress.set(1); 2026-10-23T22:25:17.9499262Z 1067 │ }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]); 2026-10-23T22:25:17.9499363Z ·  ────────────┬─────────── 2026-10-23T22:25:17.9499548Z · ╰── Unnecessary dependency `activeUserInputRequestId` 2026-10-23T22:25:17.9499660Z 1068 │ const showContent = props.showContent ?? true; 2026-10-23T22:25:17.9499712Z ╰──── 2026-10-23T22:25:17.9500018Z  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-23T22:25:17.9500334Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9500337Z 2026-10-23T22:25:17.9500539Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T22:25:17.9500700Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1125:15] 2026-10-23T22:25:17.9500770Z 1124 │ freeze.set(false); 2026-10-23T22:25:17.9500857Z 1125 │ }, [freeze, selectedThreadKey]); 2026-10-23T22:25:17.9500957Z ·  ────────┬──────── 2026-10-23T22:25:17.9501407Z · ╰── Unnecessary dependency `selectedThreadKey` 2026-10-23T22:25:17.9501534Z 1126 │ 2026-10-23T22:25:17.9501589Z ╰──── 2026-10-23T22:25:17.9501888Z  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-23T22:25:17.9502204Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9502206Z 2026-10-23T22:25:17.9502364Z ⚠ react(immutability): This value cannot be modified 2026-10-23T22:25:17.9502521Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:955:5] 2026-10-23T22:25:17.9502638Z 950 │ const composerPopoverHeight = useSharedValue(0); 2026-10-23T22:25:17.9502749Z 951 │ const floatingControlCoverage = useSharedValue( 2026-10-23T22:25:17.9502853Z ·  ───────────┬─────────── 2026-10-23T22:25:17.9503029Z · ╰── `floatingControlCoverage` originates here 2026-10-23T22:25:17.9503226Z 952 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-23T22:25:17.9503312Z 953 │ ); 2026-10-23T22:25:17.9503417Z 954 │ useEffect(() => { 2026-10-23T22:25:17.9503537Z 955 │ floatingControlCoverage.value = withTiming( 2026-10-23T22:25:17.9503634Z ·  ───────────┬─────────── 2026-10-23T22:25:17.9503802Z · ╰── `floatingControlCoverage` cannot be modified 2026-10-23T22:25:17.9503935Z 956 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-23T22:25:17.9503987Z ╰──── 2026-10-23T22:25:17.9504268Z  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-23T22:25:17.9504587Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T22:25:17.9504590Z 2026-10-23T22:25:17.9504751Z ⚠ react(immutability): This value cannot be modified 2026-10-23T22:25:17.9504904Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:973:7] 2026-10-23T22:25:17.9505098Z 963 │ const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null; 2026-10-23T22:25:17.9505230Z 964 │ const combinedContentInsetEndAdjustment = useSharedValue( 2026-10-23T22:25:17.9505385Z ·  ────────────────┬──────────────── 2026-10-23T22:25:17.9505674Z · ╰── `combinedContentInsetEndAdjustment` originates here 2026-10-23T22:25:17.9505820Z 965 │ Math.max(0, estimatedOverlayHeight - nativeInsetOvercount), 2026-10-23T22:25:17.9505882Z 966 │ ); 2026-10-23T22:25:17.9505968Z 967 │ useAnimatedReaction( 2026-10-23T22:25:17.9506032Z 968 │ () => 2026-10-23T22:25:17.9506135Z 969 │ contentInsetEndAdjustment.value + 2026-10-23T22:25:17.9506227Z 970 │ floatingControlCoverage.value + 2026-10-23T22:25:17.9506430Z 971 │ (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0), 2026-10-23T22:25:17.9506494Z 972 │ (value) => { 2026-10-23T22:25:17.9506615Z 973 │ combinedContentInsetEndAdjustment.value = value; 2026-10-23T22:25:17.9506732Z ·  ────────────────┬──────────────── 2026-10-23T22:25:17.9507087Z · ╰── `combinedContentInsetEndAdjustment` cannot be modified 2026-10-23T22:25:17.9507186Z 974 │ }, 2026-10-23T22:25:17.9507245Z ╰──── 2026-10-23T22:25:17.9507517Z  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-23T22:25:17.9507834Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T22:25:17.9507837Z 2026-10-23T22:25:17.9508100Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T22:25:17.9508277Z ╭─[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:60:5] 2026-10-23T22:25:17.9508336Z 58 │ 2026-10-23T22:25:17.9508413Z 59 │ useEffect(() => { 2026-10-23T22:25:17.9508498Z ·  ────┬──── 2026-10-23T22:25:17.9508635Z · ╰── This is the containing effect 2026-10-23T22:25:17.9508722Z 60 │ setMountedModes((current) => { 2026-10-23T22:25:17.9508808Z ·  ───────┬─────── 2026-10-23T22:25:17.9508983Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.9509069Z 61 │ if (current.has(props.mode)) { 2026-10-23T22:25:17.9509128Z ╰──── 2026-10-23T22:25:17.9509742Z  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-23T22:25:17.9510082Z  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-23T22:25:17.9510087Z 2026-10-23T22:25:17.9510545Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-23T22:25:17.9510788Z ╭─[apps/mobile/src/features/threads/ThreadQueueControl.tsx:602:27] 2026-10-23T22:25:17.9510971Z 601 │ const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success)); 2026-10-23T22:25:17.9511057Z 602 │ const gesture = Gesture.Pan() 2026-10-23T22:25:17.9511155Z ·  ─┬─ 2026-10-23T22:25:17.9511302Z · ╰── `Pan` may be a component 2026-10-23T22:25:17.9511464Z 603 │ .enabled(!props.disabled) 2026-10-23T22:25:17.9511524Z ╰──── 2026-10-23T22:25:17.9511823Z  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-23T22:25:17.9512281Z  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-23T22:25:17.9512285Z 2026-10-23T22:25:17.9512555Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T22:25:17.9512714Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:361:7] 2026-10-23T22:25:17.9512859Z 355 │ }, [cancelledIncomingShareId, navigation, props.incomingShareId]); 2026-10-23T22:25:17.9512932Z 356 │ useEffect(() => { 2026-10-23T22:25:17.9513245Z ·  ────┬──── 2026-10-23T22:25:17.9513461Z · ╰── This is the containing effect 2026-10-23T22:25:17.9513560Z 357 │ if (!isReturningToProjectPicker) { 2026-10-23T22:25:17.9513624Z 358 │ return; 2026-10-23T22:25:17.9513683Z 359 │ } 2026-10-23T22:25:17.9513790Z 360 │ if (requestedInitialProjectAvailable) { 2026-10-23T22:25:17.9513892Z 361 │ setIsReturningToProjectPicker(false); 2026-10-23T22:25:17.9513999Z ·  ──────────────┬────────────── 2026-10-23T22:25:17.9514181Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.9514250Z 362 │ return; 2026-10-23T22:25:17.9514308Z ╰──── 2026-10-23T22:25:17.9514926Z  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-23T22:25:17.9515265Z  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-23T22:25:17.9515268Z 2026-10-23T22:25:17.9515532Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T22:25:17.9515689Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:504:9] 2026-10-23T22:25:17.9515747Z 447 │ 2026-10-23T22:25:17.9515818Z 448 │ useEffect(() => { 2026-10-23T22:25:17.9515896Z ·  ────┬──── 2026-10-23T22:25:17.9516035Z · ╰── This is the containing effect 2026-10-23T22:25:17.9516146Z 449 │ if (props.pendingTaskId || props.draftId) { 2026-10-23T22:25:17.9516209Z 450 │ return; 2026-10-23T22:25:17.9516268Z 451 │ } 2026-10-23T22:25:17.9516418Z 452 │ if (lastInitialProjectRefRef.current !== props.initialProjectRef) { 2026-10-23T22:25:17.9516563Z 453 │ lastInitialProjectRefRef.current = props.initialProjectRef; 2026-10-23T22:25:17.9516673Z 454 │ appliedInitialProjectKeyRef.current = null; 2026-10-23T22:25:17.9516732Z 455 │ } 2026-10-23T22:25:17.9516884Z 456 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-23T22:25:17.9517019Z 457 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-23T22:25:17.9517127Z 458 │ if (initialEnvironmentId && initialProjectId) { 2026-10-23T22:25:17.9517286Z 459 │ const directProject = 2026-10-23T22:25:17.9517399Z 460 │ projects.find( 2026-10-23T22:25:17.9517473Z 461 │ (project) => 2026-10-23T22:25:17.9517651Z 462 │ project.environmentId === initialEnvironmentId && project.id === initialProjectId, 2026-10-23T22:25:17.9517722Z 463 │ ) ?? null; 2026-10-23T22:25:17.9517782Z 464 │ 2026-10-23T22:25:17.9517859Z 465 │ if (directProject) { 2026-10-23T22:25:17.9518001Z 466 │ // Apply the route's project once. Re-applying on every change would 2026-10-23T22:25:17.9518145Z 467 │ // instantly revert environment/project switches made in the picker. 2026-10-23T22:25:17.9518314Z 468 │ const directProjectKey = `${directProject.environmentId}:${directProject.id}`; 2026-10-23T22:25:17.9518460Z 469 │ if (appliedInitialProjectKeyRef.current === directProjectKey) { 2026-10-23T22:25:17.9518529Z 470 │ return; 2026-10-23T22:25:17.9518595Z 471 │ } 2026-10-23T22:25:17.9518700Z 472 │ if (props.initialProjectRef?.branch) { 2026-10-23T22:25:17.9518767Z 473 │ if ( 2026-10-23T22:25:17.9518913Z 474 │ selectedProject?.environmentId !== directProject.environmentId || 2026-10-23T22:25:17.9519023Z 475 │ selectedProject.id !== directProject.id 2026-10-23T22:25:17.9519086Z 476 │ ) { 2026-10-23T22:25:17.9519175Z 477 │ setProject(directProject); 2026-10-23T22:25:17.9519241Z 478 │ return; 2026-10-23T22:25:17.9519306Z 479 │ } 2026-10-23T22:25:17.9519395Z 480 │ if (!flow.draftKey) return; 2026-10-23T22:25:17.9519541Z 481 │ // The route completes checkout before mounting this composer. Local 2026-10-23T22:25:17.9519698Z 482 │ // mode reuses an existing worktree; worktree mode would create another. 2026-10-23T22:25:17.9519822Z 483 │ updateComposerDraftSettings(flow.draftKey, { 2026-10-23T22:25:17.9519908Z 484 │ workspaceSelection: { 2026-10-23T22:25:17.9519980Z 485 │ mode: "local", 2026-10-23T22:25:17.9520093Z 486 │ branch: props.initialProjectRef.branch, 2026-10-23T22:25:17.9520236Z 487 │ worktreePath: props.initialProjectRef.worktreePath ?? null, 2026-10-23T22:25:17.9520322Z 488 │ startFromOrigin: false, 2026-10-23T22:25:17.9520385Z 489 │ }, 2026-10-23T22:25:17.9520450Z 490 │ }); 2026-10-23T22:25:17.9520511Z 491 │ } 2026-10-23T22:25:17.9520645Z 492 │ appliedInitialProjectKeyRef.current = directProjectKey; 2026-10-23T22:25:17.9520706Z 493 │ if ( 2026-10-23T22:25:17.9520854Z 494 │ selectedProject?.environmentId === directProject.environmentId && 2026-10-23T22:25:17.9520965Z 495 │ selectedProject.id === directProject.id 2026-10-23T22:25:17.9521036Z 496 │ ) { 2026-10-23T22:25:17.9521101Z 497 │ return; 2026-10-23T22:25:17.9521164Z 498 │ } 2026-10-23T22:25:17.9521253Z 499 │ setProject(directProject); 2026-10-23T22:25:17.9521319Z 500 │ return; 2026-10-23T22:25:17.9521411Z 501 │ } 2026-10-23T22:25:17.9521475Z 502 │ 2026-10-23T22:25:17.9521567Z 503 │ if (projects.length > 0) { 2026-10-23T22:25:17.9521670Z 504 │ setIsReturningToProjectPicker(true); 2026-10-23T22:25:17.9521783Z ·  ──────────────┬────────────── 2026-10-23T22:25:17.9521976Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.9522035Z 505 │ } 2026-10-23T22:25:17.9522094Z ╰──── 2026-10-23T22:25:17.9522787Z  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-23T22:25:17.9523170Z  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-23T22:25:17.9523173Z 2026-10-23T22:25:17.9523439Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T22:25:17.9523599Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:604:5] 2026-10-23T22:25:17.9523659Z 545 │ 2026-10-23T22:25:17.9523730Z 546 │ useEffect(() => { 2026-10-23T22:25:17.9523811Z ·  ────┬──── 2026-10-23T22:25:17.9523946Z · ╰── This is the containing effect 2026-10-23T22:25:17.9524042Z 547 │ const shareId = props.incomingShareId; 2026-10-23T22:25:17.9524133Z 548 │ const draftKey = flow.draftKey; 2026-10-23T22:25:17.9524245Z 549 │ const destinationProject = selectedProject; 2026-10-23T22:25:17.9524395Z 550 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-23T22:25:17.9524531Z 551 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-23T22:25:17.9524630Z 552 │ const selectedProjectMatchesRoute = 2026-10-23T22:25:17.9524713Z 553 │ !initialEnvironmentId || 2026-10-23T22:25:17.9524788Z 554 │ !initialProjectId || 2026-10-23T22:25:17.9524922Z 555 │ (destinationProject?.environmentId === initialEnvironmentId && 2026-10-23T22:25:17.9525041Z 556 │ destinationProject.id === initialProjectId); 2026-10-23T22:25:17.9525106Z 557 │ if ( 2026-10-23T22:25:17.9525174Z 558 │ !shareId || 2026-10-23T22:25:17.9525241Z 559 │ !draftKey || 2026-10-23T22:25:17.9525324Z 560 │ !destinationProject || 2026-10-23T22:25:17.9525420Z 561 │ !selectedProjectMatchesRoute || 2026-10-23T22:25:17.9525518Z 562 │ cancelledIncomingShareId === shareId 2026-10-23T22:25:17.9525575Z 563 │ ) { 2026-10-23T22:25:17.9525640Z 564 │ return; 2026-10-23T22:25:17.9525701Z 565 │ } 2026-10-23T22:25:17.9525804Z 566 │ const importKey = `${shareId}:${draftKey}`; 2026-10-23T22:25:17.9525862Z 567 │ if ( 2026-10-23T22:25:17.9525981Z 568 │ startedShareImportKeyRef.current === importKey || 2026-10-23T22:25:17.9526150Z 569 │ cancellingShareImportKeyRef.current === importKey 2026-10-23T22:25:17.9526271Z 570 │ ) { 2026-10-23T22:25:17.9526367Z 571 │ return; 2026-10-23T22:25:17.9526457Z 572 │ } 2026-10-23T22:25:17.9526515Z 573 │ 2026-10-23T22:25:17.9526587Z 574 │ if (!incomingShare) { 2026-10-23T22:25:17.9526802Z 575 │ if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) { 2026-10-23T22:25:17.9526942Z 576 │ alertedUnavailableIncomingShareIdRef.current = shareId; 2026-10-23T22:25:17.9527014Z 577 │ Dialog.alert( 2026-10-23T22:25:17.9527103Z 578 │ "Shared content unavailable", 2026-10-23T22:25:17.9527287Z 579 │ "The shared content is no longer in the inbox. You can continue editing this task draft.", 2026-10-23T22:25:17.9527351Z 580 │ ); 2026-10-23T22:25:17.9527428Z 581 │ } 2026-10-23T22:25:17.9527490Z 582 │ return; 2026-10-23T22:25:17.9527654Z 583 │ } 2026-10-23T22:25:17.9527777Z 584 │ 2026-10-23T22:25:17.9527844Z 585 │ if ( 2026-10-23T22:25:17.9528015Z 586 │ incomingShare.attachments.some((attachment) => attachment.type === "file") && 2026-10-23T22:25:17.9528124Z 587 │ selectedEnvironmentServerConfig === null 2026-10-23T22:25:17.9528183Z 588 │ ) { 2026-10-23T22:25:17.9528248Z 589 │ return; 2026-10-23T22:25:17.9528303Z 590 │ } 2026-10-23T22:25:17.9528360Z 591 │ 2026-10-23T22:25:17.9528504Z 592 │ if (alertedUnavailableIncomingShareIdRef.current === shareId) { 2026-10-23T22:25:17.9528633Z 593 │ alertedUnavailableIncomingShareIdRef.current = null; 2026-10-23T22:25:17.9528688Z 594 │ } 2026-10-23T22:25:17.9528802Z 595 │ startedShareImportKeyRef.current = importKey; 2026-10-23T22:25:17.9528880Z 596 │ const draftBackup = 2026-10-23T22:25:17.9529077Z 597 │ shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey); 2026-10-23T22:25:17.9529225Z 598 │ shareImportDraftBackupRef.current.set(importKey, draftBackup); 2026-10-23T22:25:17.9529322Z 599 │ const importToken = Symbol(importKey); 2026-10-23T22:25:17.9529409Z 600 │ let didReserveShare = false; 2026-10-23T22:25:17.9529490Z 601 │ let didConsumeShare = false; 2026-10-23T22:25:17.9529580Z 602 │ let needsDraftRestore = false; 2026-10-23T22:25:17.9529698Z 603 │ activeShareImportTokenRef.current = importToken; 2026-10-23T22:25:17.9529787Z 604 │ setImportingShareKey(importKey); 2026-10-23T22:25:17.9529886Z ·  ──────────┬───────── 2026-10-23T22:25:17.9530072Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.9530148Z 605 │ void (async () => { 2026-10-23T22:25:17.9530206Z ╰──── 2026-10-23T22:25:17.9530827Z  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-23T22:25:17.9531161Z  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-23T22:25:17.9531165Z 2026-10-23T22:25:17.9531426Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T22:25:17.9531604Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:524:5] 2026-10-23T22:25:17.9531688Z 523 │ props.initialProjectRef, 2026-10-23T22:25:17.9531767Z 524 │ props.incomingShareId, 2026-10-23T22:25:17.9531867Z ·  ──────────┬────────── 2026-10-23T22:25:17.9532046Z · ╰── Unnecessary dependency `props.incomingShareId` 2026-10-23T22:25:17.9532121Z 525 │ props.pendingTaskId, 2026-10-23T22:25:17.9532173Z ╰──── 2026-10-23T22:25:17.9532478Z  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-23T22:25:17.9532800Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9532802Z 2026-10-23T22:25:17.9533030Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T22:25:17.9533276Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:543:5] 2026-10-23T22:25:17.9533453Z 542 │ loadedBranchesProjectKeyRef.current = projectKey; 2026-10-23T22:25:17.9533525Z 543 │ flow.loadBranches(); 2026-10-23T22:25:17.9533602Z ·  ──┬─ 2026-10-23T22:25:17.9533735Z · ╰── Missing dependency `flow` 2026-10-23T22:25:17.9533831Z 544 │ }, [flow.loadBranches, selectedProject]); 2026-10-23T22:25:17.9533924Z ·  ────────┬──────── 2026-10-23T22:25:17.9534130Z · ╰── Overly precise dependency `flow.loadBranches`, use `flow` instead 2026-10-23T22:25:17.9534188Z 545 │ 2026-10-23T22:25:17.9534242Z ╰──── 2026-10-23T22:25:17.9534683Z  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-23T22:25:17.9535007Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9535009Z 2026-10-23T22:25:17.9535216Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T22:25:17.9535377Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:766:5] 2026-10-23T22:25:17.9535444Z 765 │ flow.draftKey, 2026-10-23T22:25:17.9535529Z 766 │ hasImportedIncomingShare, 2026-10-23T22:25:17.9535627Z ·  ────────────┬─────────── 2026-10-23T22:25:17.9535807Z · ╰── Unnecessary dependency `hasImportedIncomingShare` 2026-10-23T22:25:17.9535880Z 767 │ incomingShare, 2026-10-23T22:25:17.9535974Z 768 │ isIncomingShareInboxLoading, 2026-10-23T22:25:17.9536078Z ·  ─────────────┬───────────── 2026-10-23T22:25:17.9536267Z · ╰── Unnecessary dependency `isIncomingShareInboxLoading` 2026-10-23T22:25:17.9536350Z 769 │ isIncomingShareUnavailable, 2026-10-23T22:25:17.9536429Z 770 │ props.incomingShareId, 2026-10-23T22:25:17.9536529Z 771 │ props.initialProjectRef?.environmentId, 2026-10-23T22:25:17.9536621Z 772 │ props.initialProjectRef?.projectId, 2026-10-23T22:25:17.9536707Z 773 │ releaseShareReservation, 2026-10-23T22:25:17.9536778Z 774 │ reserveShare, 2026-10-23T22:25:17.9536869Z 775 │ selectedEnvironmentServerConfig, 2026-10-23T22:25:17.9536938Z 776 │ selectedProject, 2026-10-23T22:25:17.9537022Z 777 │ shareImportAttempt, 2026-10-23T22:25:17.9537115Z ·  ─────────┬──────── 2026-10-23T22:25:17.9537284Z · ╰── Unnecessary dependency `shareImportAttempt` 2026-10-23T22:25:17.9537339Z 778 │ ]); 2026-10-23T22:25:17.9537397Z ╰──── 2026-10-23T22:25:17.9537696Z  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-23T22:25:17.9538014Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9538017Z 2026-10-23T22:25:17.9538237Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T22:25:17.9538461Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:772:7] 2026-10-23T22:25:17.9538613Z 771 │ if (settingsSheetPresentation.isActive) { 2026-10-23T22:25:17.9538751Z 772 │ settingsRoutePresentation.present(settingsRouteSession); 2026-10-23T22:25:17.9538852Z ·  ────────────┬──────────── 2026-10-23T22:25:17.9539028Z · ╰── Missing dependency `settingsRoutePresentation` 2026-10-23T22:25:17.9539087Z 773 │ } 2026-10-23T22:25:17.9539297Z 774 │ }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]); 2026-10-23T22:25:17.9539413Z ·  ────────────────┬──────────────── 2026-10-23T22:25:17.9539698Z · ╰── Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead 2026-10-23T22:25:17.9539761Z 775 │ 2026-10-23T22:25:17.9539822Z ╰──── 2026-10-23T22:25:17.9540252Z  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-23T22:25:17.9540567Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9540573Z 2026-10-23T22:25:17.9540733Z ⚠ react(immutability): This value cannot be modified 2026-10-23T22:25:17.9540883Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:390:5] 2026-10-23T22:25:17.9541048Z 386 │ typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0; 2026-10-23T22:25:17.9541196Z 387 │ const animatedBorderRadius = useSharedValue(targetBorderRadius); 2026-10-23T22:25:17.9541291Z ·  ──────────┬───────── 2026-10-23T22:25:17.9541526Z · ╰── `animatedBorderRadius` originates here 2026-10-23T22:25:17.9541691Z 388 │ const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android"; 2026-10-23T22:25:17.9541766Z 389 │ useLayoutEffect(() => { 2026-10-23T22:25:17.9541873Z 390 │ animatedBorderRadius.value = shouldAnimate 2026-10-23T22:25:17.9541966Z ·  ──────────┬───────── 2026-10-23T22:25:17.9542130Z · ╰── `animatedBorderRadius` cannot be modified 2026-10-23T22:25:17.9542226Z 391 │ ? withTiming(targetBorderRadius, { 2026-10-23T22:25:17.9542277Z ╰──── 2026-10-23T22:25:17.9542636Z  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-23T22:25:17.9542995Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T22:25:17.9542998Z 2026-10-23T22:25:17.9543266Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T22:25:17.9543434Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:444:5] 2026-10-23T22:25:17.9543497Z 434 │ : null; 2026-10-23T22:25:17.9543572Z 435 │ useEffect(() => { 2026-10-23T22:25:17.9543649Z ·  ────┬──── 2026-10-23T22:25:17.9543781Z · ╰── This is the containing effect 2026-10-23T22:25:17.9543844Z 436 │ if ( 2026-10-23T22:25:17.9543933Z 437 │ props.active === false || 2026-10-23T22:25:17.9544019Z 438 │ activeDraftKey !== null || 2026-10-23T22:25:17.9544104Z 439 │ editingPendingTask !== null || 2026-10-23T22:25:17.9544189Z 440 │ selectedProject === null 2026-10-23T22:25:17.9544250Z 441 │ ) { 2026-10-23T22:25:17.9544319Z 442 │ return; 2026-10-23T22:25:17.9544374Z 443 │ } 2026-10-23T22:25:17.9544449Z 444 │ setActiveDraftKey( 2026-10-23T22:25:17.9544537Z ·  ────────┬──────── 2026-10-23T22:25:17.9544712Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.9544786Z 445 │ createNewTaskDraft({ 2026-10-23T22:25:17.9544842Z ╰──── 2026-10-23T22:25:17.9545465Z  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-23T22:25:17.9545801Z  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-23T22:25:17.9545803Z 2026-10-23T22:25:17.9546059Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-23T22:25:17.9546228Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1244:36] 2026-10-23T22:25:17.9546343Z 1243 │ 2026-10-23T22:25:17.9546557Z 1244 │ {props.children} 2026-10-23T22:25:17.9546681Z ·  ───────────── 2026-10-23T22:25:17.9546760Z 1245 │ 2026-10-23T22:25:17.9546817Z ╰──── 2026-10-23T22:25:17.9547052Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-23T22:25:17.9547201Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-23T22:25:17.9547203Z 2026-10-23T22:25:17.9547395Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-23T22:25:17.9547519Z ╭─[apps/mobile/src/lib/useHoverGesture.ts:8:15] 2026-10-23T22:25:17.9547581Z 7 │ () => 2026-10-23T22:25:17.9547652Z 8 │ Gesture.Hover() 2026-10-23T22:25:17.9547731Z ·  ──┬── 2026-10-23T22:25:17.9547944Z · ╰── `Hover` may be a component 2026-10-23T22:25:17.9548065Z 9 │ .manualActivation(true) 2026-10-23T22:25:17.9548120Z ╰──── 2026-10-23T22:25:17.9548410Z  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-23T22:25:17.9548879Z  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-23T22:25:17.9548882Z 2026-10-23T22:25:17.9549036Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.9549163Z ╭─[apps/mobile/src/components/ui/Menu.tsx:54:36] 2026-10-23T22:25:17.9549356Z 53 │ const child = children as ReactElement>; 2026-10-23T22:25:17.9549538Z 54 │ ╭─▶ children = cloneElement(child, { 2026-10-23T22:25:17.9549651Z 55 │ │ onTouchStart: (event) => { 2026-10-23T22:25:17.9549823Z 56 │ │ // Reset for a new touch, not onPressIn, which also fires when a 2026-10-23T22:25:17.9549993Z 57 │ │ // finger moves out of the row and back during the same gesture. 2026-10-23T22:25:17.9550384Z 58 │ │ menuPress.current.isPreparing = false; 2026-10-23T22:25:17.9550647Z 59 │ │ menuPress.current.suppressPress = menuPress.current.isOpen; 2026-10-23T22:25:17.9550775Z 60 │ │ pendingPress.current = null; 2026-10-23T22:25:17.9550916Z 61 │ │ child.props.onTouchStart?.(event); 2026-10-23T22:25:17.9550999Z 62 │ │ }, 2026-10-23T22:25:17.9551107Z 63 │ │ onPress: (event) => { 2026-10-23T22:25:17.9551290Z 64 │ │ // Accessibility clicks have no touch identifier and must not inherit 2026-10-23T22:25:17.9551479Z 65 │ │ // cancellation from a previous physical gesture. 2026-10-23T22:25:17.9551662Z 66 │ │ const isTouch = typeof event.nativeEvent.identifier === "number"; 2026-10-23T22:25:17.9551856Z 67 │ │ if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) { 2026-10-23T22:25:17.9551948Z 68 │ │ return; 2026-10-23T22:25:17.9552033Z 69 │ │ } 2026-10-23T22:25:17.9552187Z 70 │ │ if (isTouch && menuPress.current.isPreparing) { 2026-10-23T22:25:17.9552368Z 71 │ │ // A release can arrive between native menu preparation and display. 2026-10-23T22:25:17.9552540Z 72 │ │ // Let UIKit's display/cancel callback decide this press's outcome. 2026-10-23T22:25:17.9552646Z 73 │ │ event.persist(); 2026-10-23T22:25:17.9552810Z 74 │ │ pendingPress.current = () => child.props.onPress?.(event); 2026-10-23T22:25:17.9552897Z 75 │ │ return; 2026-10-23T22:25:17.9552980Z 76 │ │ } 2026-10-23T22:25:17.9553106Z 77 │ │ child.props.onPress?.(event); 2026-10-23T22:25:17.9553188Z 78 │ │ }, 2026-10-23T22:25:17.9553545Z 79 │ ├─▶ }); 2026-10-23T22:25:17.9553863Z · ╰──── Passing a ref to a function may read its value during render 2026-10-23T22:25:17.9553974Z 80 │ menuProps.onMenuInteractionStart = () => { 2026-10-23T22:25:17.9554032Z ╰──── 2026-10-23T22:25:17.9554518Z  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-23T22:25:17.9554823Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.9554828Z 2026-10-23T22:25:17.9555044Z ⚠ eslint(no-unused-vars): Identifier 'Duration' is imported but never used. 2026-10-23T22:25:17.9555193Z ╭─[packages/provider-pi/src/server/adapter.test.ts:24:13] 2026-10-23T22:25:17.9555294Z 23 │ import * as Deferred from "effect/Deferred"; 2026-10-23T22:25:17.9555389Z 24 │ import * as Duration from "effect/Duration"; 2026-10-23T22:25:17.9555473Z ·  ────┬─── 2026-10-23T22:25:17.9555615Z · ╰── 'Duration' is imported here 2026-10-23T22:25:17.9555709Z 25 │ import * as Effect from "effect/Effect"; 2026-10-23T22:25:17.9555761Z ╰──── 2026-10-23T22:25:17.9555868Z  help: Consider removing this import. 2026-10-23T22:25:17.9555870Z 2026-10-23T22:25:17.9556122Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-23T22:25:17.9556296Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:290:50] 2026-10-23T22:25:17.9556363Z 289 │ return ( 2026-10-23T22:25:17.9556506Z 290 │ 2026-10-23T22:25:17.9556641Z ·  ───────────── 2026-10-23T22:25:17.9556716Z 291 │ {props.children} 2026-10-23T22:25:17.9556768Z ╰──── 2026-10-23T22:25:17.9557003Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-23T22:25:17.9557151Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-23T22:25:17.9557155Z 2026-10-23T22:25:17.9557400Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-23T22:25:17.9557570Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:654:44] 2026-10-23T22:25:17.9557634Z 653 │ return ( 2026-10-23T22:25:17.9557759Z 654 │ 2026-10-23T22:25:17.9557880Z ·  ───────────── 2026-10-23T22:25:17.9557955Z 655 │ {props.children} 2026-10-23T22:25:17.9558007Z ╰──── 2026-10-23T22:25:17.9558237Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-23T22:25:17.9558381Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-23T22:25:17.9558383Z 2026-10-23T22:25:17.9558629Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-23T22:25:17.9558883Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1462:55] 2026-10-23T22:25:17.9558996Z 1461 │ return ( 2026-10-23T22:25:17.9559165Z 1462 │ 2026-10-23T22:25:17.9559303Z ·  ──────────────────── 2026-10-23T22:25:17.9559406Z 1463 │ 2026-10-23T22:25:17.9562601Z ·  ┬ 2026-10-23T22:25:17.9562744Z · ╰── '_' is declared here 2026-10-23T22:25:17.9562855Z 122 │ (options.dispatchGate ?? Effect.void).pipe( 2026-10-23T22:25:17.9562910Z ╰──── 2026-10-23T22:25:17.9563017Z  help: Consider removing this parameter. 2026-10-23T22:25:17.9563020Z 2026-10-23T22:25:17.9563213Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T22:25:17.9563355Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:134:39] 2026-10-23T22:25:17.9563414Z 133 │ ); 2026-10-23T22:25:17.9563525Z 134 │ const listLocalBranchNames = vi.fn((_: string) => 2026-10-23T22:25:17.9563628Z ·  ┬ 2026-10-23T22:25:17.9563857Z · ╰── '_' is declared here 2026-10-23T22:25:17.9563977Z 135 │ Effect.succeed( 2026-10-23T22:25:17.9564030Z ╰──── 2026-10-23T22:25:17.9564138Z  help: Consider removing this parameter. 2026-10-23T22:25:17.9564140Z 2026-10-23T22:25:17.9564327Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T22:25:17.9564467Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:178:31] 2026-10-23T22:25:17.9564523Z 177 │ }); 2026-10-23T22:25:17.9564628Z 178 │ const sendToThread = vi.fn((_: unknown) => { 2026-10-23T22:25:17.9564723Z ·  ┬ 2026-10-23T22:25:17.9564865Z · ╰── '_' is declared here 2026-10-23T22:25:17.9564975Z 179 │ switch (options.continuation ?? "queued") { 2026-10-23T22:25:17.9565035Z ╰──── 2026-10-23T22:25:17.9565142Z  help: Consider removing this parameter. 2026-10-23T22:25:17.9565144Z 2026-10-23T22:25:17.9565334Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T22:25:17.9565473Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:203:33] 2026-10-23T22:25:17.9565531Z 202 │ ); 2026-10-23T22:25:17.9565639Z 203 │ const removeWorktree = vi.fn((_: unknown) => 2026-10-23T22:25:17.9565737Z ·  ┬ 2026-10-23T22:25:17.9565877Z · ╰── '_' is declared here 2026-10-23T22:25:17.9565965Z 204 │ options.removeWorktreeFails 2026-10-23T22:25:17.9566022Z ╰──── 2026-10-23T22:25:17.9566194Z  help: Consider removing this parameter. 2026-10-23T22:25:17.9566210Z 2026-10-23T22:25:17.9566456Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T22:25:17.9566603Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:208:36] 2026-10-23T22:25:17.9566663Z 207 │ ); 2026-10-23T22:25:17.9566772Z 208 │ const deleteLocalBranch = vi.fn((_: unknown) => 2026-10-23T22:25:17.9566873Z ·  ┬ 2026-10-23T22:25:17.9567022Z · ╰── '_' is declared here 2026-10-23T22:25:17.9567114Z 209 │ options.deleteLocalBranchFails 2026-10-23T22:25:17.9567173Z ╰──── 2026-10-23T22:25:17.9567276Z  help: Consider removing this parameter. 2026-10-23T22:25:17.9567279Z 2026-10-23T22:25:17.9567473Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T22:25:17.9567616Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:213:42] 2026-10-23T22:25:17.9567678Z 212 │ ); 2026-10-23T22:25:17.9567793Z 213 │ const fetchWorktreeBaseCommit = vi.fn((_: unknown) => 2026-10-23T22:25:17.9567901Z ·  ┬ 2026-10-23T22:25:17.9568049Z · ╰── '_' is declared here 2026-10-23T22:25:17.9568141Z 214 │ options.fetchWorktreeBaseFails 2026-10-23T22:25:17.9568193Z ╰──── 2026-10-23T22:25:17.9568301Z  help: Consider removing this parameter. 2026-10-23T22:25:17.9568303Z 2026-10-23T22:25:17.9568492Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T22:25:17.9568731Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:254:30] 2026-10-23T22:25:17.9568858Z 253 │ ); 2026-10-23T22:25:17.9568951Z 254 │ const localStatus = vi.fn((_: unknown) => 2026-10-23T22:25:17.9569049Z ·  ┬ 2026-10-23T22:25:17.9569191Z · ╰── '_' is declared here 2026-10-23T22:25:17.9569269Z 255 │ Effect.succeed({ 2026-10-23T22:25:17.9569323Z ╰──── 2026-10-23T22:25:17.9569429Z  help: Consider removing this parameter. 2026-10-23T22:25:17.9569432Z 2026-10-23T22:25:17.9569624Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T22:25:17.9569764Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:264:32] 2026-10-23T22:25:17.9569822Z 263 │ ); 2026-10-23T22:25:17.9569986Z 264 │ const refreshStatus = vi.fn((_: string) => Effect.die("refreshStatus stub")); 2026-10-23T22:25:17.9570086Z ·  ┬ 2026-10-23T22:25:17.9570231Z · ╰── '_' is declared here 2026-10-23T22:25:17.9570381Z 265 │ const runForThread = vi.fn((input: { readonly worktreePath: string }) => { 2026-10-23T22:25:17.9570437Z ╰──── 2026-10-23T22:25:17.9570544Z  help: Consider removing this parameter. 2026-10-23T22:25:17.9570546Z 2026-10-23T22:25:17.9570820Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T22:25:17.9570956Z ╭─[packages/provider-pi/src/server/adapter.ts:3405:7] 2026-10-23T22:25:17.9571016Z 3404 │ 2026-10-23T22:25:17.9571218Z 3405 │ const layer: Layer.Layer = 2026-10-23T22:25:17.9571300Z ·  ──┬── 2026-10-23T22:25:17.9571472Z · ╰── 'layer' is declared here 2026-10-23T22:25:17.9571549Z 3406 │ Layer.effect( 2026-10-23T22:25:17.9571607Z ╰──── 2026-10-23T22:25:17.9571719Z  help: Consider removing this declaration. 2026-10-23T22:25:17.9571721Z 2026-10-23T22:25:17.9571893Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T22:25:17.9572060Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:697:76] 2026-10-23T22:25:17.9572247Z 696 │ const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() })); 2026-10-23T22:25:17.9572423Z 697 │ if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() }); 2026-10-23T22:25:17.9572567Z ·  ─────┬──── 2026-10-23T22:25:17.9572759Z · ╰── Cannot call impure function 2026-10-23T22:25:17.9572901Z 698 │ const snoozeGateNow = new Date(snoozeGateClock.now).toISOString(); 2026-10-23T22:25:17.9572956Z ╰──── 2026-10-23T22:25:17.9573252Z  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-23T22:25:17.9573562Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T22:25:17.9573565Z 2026-10-23T22:25:17.9573738Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T22:25:17.9574000Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:718:71] 2026-10-23T22:25:17.9574129Z 717 │ const snoozePresets = useMemo( 2026-10-23T22:25:17.9574312Z 718 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-23T22:25:17.9574450Z ·  ─────┬──── 2026-10-23T22:25:17.9574638Z · ╰── Cannot call impure function 2026-10-23T22:25:17.9574763Z 719 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-23T22:25:17.9574816Z ╰──── 2026-10-23T22:25:17.9575106Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T22:25:17.9575416Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T22:25:17.9575421Z 2026-10-23T22:25:17.9575610Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T22:25:17.9575775Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:719:6] 2026-10-23T22:25:17.9575954Z 718 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-23T22:25:17.9576074Z 719 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-23T22:25:17.9576174Z ·  ────────────┬─────────── 2026-10-23T22:25:17.9576357Z · ╰── Unnecessary dependency `props.snoozePresetMinute` 2026-10-23T22:25:17.9576412Z 720 │ ); 2026-10-23T22:25:17.9576477Z ╰──── 2026-10-23T22:25:17.9576808Z  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-23T22:25:17.9577130Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9577132Z 2026-10-23T22:25:17.9577326Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T22:25:17.9577485Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:765:7] 2026-10-23T22:25:17.9577562Z 764 │ thread.pinnedAt, 2026-10-23T22:25:17.9577631Z 765 │ variant, 2026-10-23T22:25:17.9577710Z ·  ───┬─── 2026-10-23T22:25:17.9577924Z · ╰── Unnecessary dependency `variant` 2026-10-23T22:25:17.9578028Z 766 │ ], 2026-10-23T22:25:17.9578084Z ╰──── 2026-10-23T22:25:17.9578408Z  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-23T22:25:17.9578726Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9578728Z 2026-10-23T22:25:17.9578931Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T22:25:17.9579099Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1215:21] 2026-10-23T22:25:17.9579242Z 1214 │ {providerDrivers.slice(0, -1).map((driver, index) => ( 2026-10-23T22:25:17.9579386Z 1215 │ 2026-10-23T22:25:17.9579511Z ·  ────────────────────────── 2026-10-23T22:25:17.9579628Z 1216 │ 2026-10-23T22:25:17.9579684Z ╰──── 2026-10-23T22:25:17.9579835Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-23T22:25:17.9579841Z 2026-10-23T22:25:17.9579993Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.9580151Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:152:27] 2026-10-23T22:25:17.9580342Z 151 │ 2026-10-23T22:25:17.9580428Z 152 │ {props.children(open)} 2026-10-23T22:25:17.9580527Z ·  ──┬─ 2026-10-23T22:25:17.9580697Z · ╰── Cannot access ref value during render 2026-10-23T22:25:17.9580766Z 153 │ 2026-10-23T22:25:17.9580823Z ╰──── 2026-10-23T22:25:17.9581307Z  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-23T22:25:17.9581660Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.9581663Z 2026-10-23T22:25:17.9581867Z ⚠ react(memo-dependencies): Found missing/extra memoization dependencies 2026-10-23T22:25:17.9582028Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:140:9] 2026-10-23T22:25:17.9582116Z 139 │ if (action.id !== undefined) { 2026-10-23T22:25:17.9582202Z 140 │ props.onPressAction?.({ 2026-10-23T22:25:17.9582283Z ·  ──┬── 2026-10-23T22:25:17.9582421Z · ╰── Missing dependency `props` 2026-10-23T22:25:17.9582518Z 141 │ nativeEvent: { event: action.id }, 2026-10-23T22:25:17.9582671Z 142 │ } as Parameters>[0]); 2026-10-23T22:25:17.9582738Z 143 │ } 2026-10-23T22:25:17.9582799Z 144 │ }, 2026-10-23T22:25:17.9582882Z 145 │ [close, props.onPressAction], 2026-10-23T22:25:17.9582985Z ·  ─────────┬───────── 2026-10-23T22:25:17.9583439Z · ╰── Overly precise dependency `props.onPressAction`, use `props` instead 2026-10-23T22:25:17.9583578Z 146 │ ); 2026-10-23T22:25:17.9583633Z ╰──── 2026-10-23T22:25:17.9584130Z  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-23T22:25:17.9584458Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9584460Z 2026-10-23T22:25:17.9584612Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.9584739Z ╭─[apps/mobile/src/native/StackHeader.tsx:185:9] 2026-10-23T22:25:17.9584812Z 184 │ "options", 2026-10-23T22:25:17.9584918Z 185 │ latestOptionFunctionsRef.current, 2026-10-23T22:25:17.9585034Z ·  ────────────────┬─────────────── 2026-10-23T22:25:17.9585238Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T22:25:17.9585338Z 186 │ optionFunctionWrappersRef.current, 2026-10-23T22:25:17.9585395Z ╰──── 2026-10-23T22:25:17.9585878Z  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-23T22:25:17.9586187Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.9586192Z 2026-10-23T22:25:17.9586343Z ⚠ react(refs): Cannot access refs during render 2026-10-23T22:25:17.9586464Z ╭─[apps/mobile/src/native/StackHeader.tsx:186:9] 2026-10-23T22:25:17.9586564Z 185 │ latestOptionFunctionsRef.current, 2026-10-23T22:25:17.9586665Z 186 │ optionFunctionWrappersRef.current, 2026-10-23T22:25:17.9586782Z ·  ────────────────┬──────────────── 2026-10-23T22:25:17.9586979Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T22:25:17.9587079Z 187 │ ) as NativeStackNavigationOptions) 2026-10-23T22:25:17.9587135Z ╰──── 2026-10-23T22:25:17.9587628Z  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-23T22:25:17.9587929Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T22:25:17.9587936Z 2026-10-23T22:25:17.9588238Z ⚠ eslint(no-unused-vars): Variable 'revokeActiveMcpThread' is declared but never used. Unused variables should start with a '_'. 2026-10-23T22:25:17.9588372Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:218:7] 2026-10-23T22:25:17.9588429Z 217 │ 2026-10-23T22:25:17.9588586Z 218 │ const revokeActiveMcpThread = (threadId: ThreadId): Effect.Effect => 2026-10-23T22:25:17.9588678Z ·  ──────────┬────────── 2026-10-23T22:25:17.9588917Z · ╰── 'revokeActiveMcpThread' is declared here 2026-10-23T22:25:17.9589164Z 219 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeThread(threadId) : Effect.void; 2026-10-23T22:25:17.9589224Z ╰──── 2026-10-23T22:25:17.9589332Z  help: Consider removing this declaration. 2026-10-23T22:25:17.9589335Z 2026-10-23T22:25:17.9589657Z ⚠ eslint(no-unused-vars): Variable 'revokeAllActiveMcpCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-23T22:25:17.9589790Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:221:7] 2026-10-23T22:25:17.9589848Z 220 │ 2026-10-23T22:25:17.9589984Z 221 │ const revokeAllActiveMcpCredentials = (): Effect.Effect => 2026-10-23T22:25:17.9590101Z ·  ──────────────┬────────────── 2026-10-23T22:25:17.9590620Z · ╰── 'revokeAllActiveMcpCredentials' is declared here 2026-10-23T22:25:17.9590806Z 222 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void; 2026-10-23T22:25:17.9590860Z ╰──── 2026-10-23T22:25:17.9590975Z  help: Consider removing this declaration. 2026-10-23T22:25:17.9590979Z 2026-10-23T22:25:17.9591151Z ⚠ eslint(no-new): Do not use 'new' for side effects. 2026-10-23T22:25:17.9591287Z ╭─[apps/server/src/mcp/McpToolAccess.test.ts:168:3] 2026-10-23T22:25:17.9591448Z 167 │ // @ts-expect-error a declaration constructed directly 2026-10-23T22:25:17.9591555Z 168 │ new McpToolAccess.Declaration(unchecked); 2026-10-23T22:25:17.9591662Z ·  ───────────────────────────── 2026-10-23T22:25:17.9591802Z 169 │ // @ts-expect-error a handlers layer built outside McpToolAccess 2026-10-23T22:25:17.9591858Z ╰──── 2026-10-23T22:25:17.9592034Z  help: Assign the result of 'new' to a variable or compare it to a reference. 2026-10-23T22:25:17.9592040Z 2026-10-23T22:25:17.9592358Z ⚠ eslint(no-unused-vars): Variable 'claudeCaps' is declared but never used. Unused variables should start with a '_'. 2026-10-23T22:25:17.9592549Z ╭─[packages/shared/src/model.test.ts:36:7] 2026-10-23T22:25:17.9592633Z 35 │ 2026-10-23T22:25:17.9592835Z 36 │ const claudeCaps: ModelCapabilities = createModelCapabilities({ 2026-10-23T22:25:17.9592955Z ·  ─────┬──── 2026-10-23T22:25:17.9593160Z · ╰── 'claudeCaps' is declared here 2026-10-23T22:25:17.9593239Z 37 │ optionDescriptors: [ 2026-10-23T22:25:17.9593293Z ╰──── 2026-10-23T22:25:17.9593409Z  help: Consider removing this declaration. 2026-10-23T22:25:17.9593426Z 2026-10-23T22:25:17.9593686Z ⚠ unicorn(prefer-string-starts-ends-with): Prefer String#startsWith over a regex with a caret. 2026-10-23T22:25:17.9593823Z ╭─[apps/server/src/vcs/GitVcsDriverCore.ts:509:11] 2026-10-23T22:25:17.9593928Z 508 │ GIT_DIAGNOSTIC_LINE_PATTERN.test(line) || 2026-10-23T22:25:17.9594078Z 509 │ (!/^remote:/.test(line) && SSH_TRANSPORT_REFUSAL_PATTERN.test(line)), 2026-10-23T22:25:17.9594175Z ·  ─────────────── 2026-10-23T22:25:17.9594236Z 510 │ ) 2026-10-23T22:25:17.9594290Z ╰──── 2026-10-23T22:25:17.9594456Z  help: Replace `/^remote:/.test(line)` with `line.startsWith('remote:')`. 2026-10-23T22:25:17.9594458Z 2026-10-23T22:25:17.9595142Z ⚠ 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-23T22:25:17.9595339Z ╭─[packages/shared/src/atomicWrite.test.ts:139:5] 2026-10-23T22:25:17.9595420Z 138 │ Effect.gen(function* () { 2026-10-23T22:25:17.9595630Z 139 │ ╭─▶ while (fiber.pollUnsafe() === undefined) { 2026-10-23T22:25:17.9595766Z 140 │ │ yield* TestClock.adjust("100 millis"); 2026-10-23T22:25:17.9596109Z 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-23T22:25:17.9596311Z 142 │ │ yield* Effect.promise(() => new Promise((resolve) => setImmediate(resolve))); 2026-10-23T22:25:17.9596459Z 143 │ ╰─▶ } 2026-10-23T22:25:17.9596557Z 144 │ return yield* Fiber.join(fiber); 2026-10-23T22:25:17.9596616Z ╰──── 2026-10-23T22:25:17.9596619Z 2026-10-23T22:25:17.9596997Z ⚠ 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-23T22:25:17.9597141Z ╭─[apps/server/src/vcs/GitVcsDriverCore.test.ts:1786:34] 2026-10-23T22:25:17.9597286Z 1785 │ const stat = branch.files!.find((file) => file.path === path)!; 2026-10-23T22:25:17.9597443Z 1786 │ const request = yield* Schema.decodeEffect(ReviewDiffPreviewInput)({ 2026-10-23T22:25:17.9597567Z ·  ─────────────────── 2026-10-23T22:25:17.9597635Z 1787 │ cwd, 2026-10-23T22:25:17.9597701Z ╰──── 2026-10-23T22:25:17.9597706Z 2026-10-23T22:25:17.9597905Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T22:25:17.9598020Z ╭─[packages/shared/src/qrCode.ts:458:44] 2026-10-23T22:25:17.9598090Z 457 │ ): Array { 2026-10-23T22:25:17.9598207Z 458 │ let result: Array = divisor.map((_) => 0); 2026-10-23T22:25:17.9598317Z ·  ┬ 2026-10-23T22:25:17.9598472Z · ╰── '_' is declared here 2026-10-23T22:25:17.9598547Z 459 │ for (const b of data) { 2026-10-23T22:25:17.9598604Z ╰──── 2026-10-23T22:25:17.9598715Z  help: Consider removing this parameter. 2026-10-23T22:25:17.9598718Z 2026-10-23T22:25:17.9599014Z ⚠ eslint(no-unused-vars): Function 'describeSchedule' is declared but never used. 2026-10-23T22:25:17.9599194Z ╭─[apps/server/src/scheduledTasks/Schedule.ts:79:10] 2026-10-23T22:25:17.9599251Z 78 │ 2026-10-23T22:25:17.9599396Z 79 │ function describeSchedule(schedule: ScheduledTaskSchedule): string { 2026-10-23T22:25:17.9599492Z ·  ────────┬─────── 2026-10-23T22:25:17.9599647Z · ╰── 'describeSchedule' is declared here 2026-10-23T22:25:17.9599763Z 80 │ if (schedule.type === "webhook") return "On webhook"; 2026-10-23T22:25:17.9599820Z ╰──── 2026-10-23T22:25:17.9599933Z  help: Consider removing this declaration. 2026-10-23T22:25:17.9599936Z 2026-10-23T22:25:17.9600238Z ⚠ eslint(no-unused-vars): Variable 'legacyCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-23T22:25:17.9600406Z ╭─[packages/provider-cursor/src/server/credentialStore.test.ts:15:7] 2026-10-23T22:25:17.9600465Z 14 │ 2026-10-23T22:25:17.9600546Z 15 │ const legacyCredentials = { 2026-10-23T22:25:17.9600638Z ·  ────────┬──────── 2026-10-23T22:25:17.9600791Z · ╰── 'legacyCredentials' is declared here 2026-10-23T22:25:17.9600866Z 16 │ version: 1 as const, 2026-10-23T22:25:17.9600926Z ╰──── 2026-10-23T22:25:17.9601038Z  help: Consider removing this declaration. 2026-10-23T22:25:17.9601040Z 2026-10-23T22:25:17.9601263Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-23T22:25:17.9601461Z ╭─[apps/web/src/lib/composerContextReferences.ts:90:40] 2026-10-23T22:25:17.9601549Z 89 │ let cursor = prompt.length; 2026-10-23T22:25:17.9601667Z 90 │ for (const occurrence of occurrences.reverse()) { 2026-10-23T22:25:17.9601775Z ·  ─────── 2026-10-23T22:25:17.9601863Z 91 │ let { start, end } = occurrence; 2026-10-23T22:25:17.9601921Z ╰──── 2026-10-23T22:25:17.9602202Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-23T22:25:17.9602204Z 2026-10-23T22:25:17.9602401Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-23T22:25:17.9602538Z ╭─[packages/client-runtime/src/state/shell.ts:189:5] 2026-10-23T22:25:17.9602658Z 186 │ let waiting = yield* Ref.get(awaitingCompletion); 2026-10-23T22:25:17.9602735Z 187 │ let next = initial; 2026-10-23T22:25:17.9602817Z ·  ──┬─ 2026-10-23T22:25:17.9602952Z · ╰── From this accumulator 2026-10-23T22:25:17.9603040Z 188 │ let receivedSnapshot = false; 2026-10-23T22:25:17.9603125Z 189 │ for (const item of items) { 2026-10-23T22:25:17.9603197Z ·  ─┬─ 2026-10-23T22:25:17.9603312Z · ╰── For this loop 2026-10-23T22:25:17.9603409Z 190 │ if (item.kind === "synchronized") { 2026-10-23T22:25:17.9603485Z 191 │ waiting = false; 2026-10-23T22:25:17.9603582Z 192 │ if (Option.isSome(next.snapshot)) { 2026-10-23T22:25:17.9603714Z 193 │ next = { ...next, status: "live", error: Option.none() }; 2026-10-23T22:25:17.9603813Z ·  ───┬─── 2026-10-23T22:25:17.9604033Z · ╰── From this spread 2026-10-23T22:25:17.9604156Z 194 │ } 2026-10-23T22:25:17.9604213Z ╰──── 2026-10-23T22:25:17.9604381Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-23T22:25:17.9604551Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-23T22:25:17.9604554Z 2026-10-23T22:25:17.9605049Z ⚠ 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-23T22:25:17.9605244Z ╭─[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:521:13] 2026-10-23T22:25:17.9605325Z 520 │ })).delivery; 2026-10-23T22:25:17.9605537Z 521 │ ╭─▶ while (delivery.outcome === "accepted") { 2026-10-23T22:25:17.9605663Z 522 │ │ yield* Effect.yieldNow; 2026-10-23T22:25:17.9605816Z 523 │ │ delivery = (yield* service.getWebhookDelivery({ 2026-10-23T22:25:17.9605926Z 524 │ │ id: task.id, 2026-10-23T22:25:17.9606060Z 525 │ │ deliveryId: deliveryId!, 2026-10-23T22:25:17.9606228Z 526 │ │ })).delivery; 2026-10-23T22:25:17.9606378Z 527 │ ╰─▶ } 2026-10-23T22:25:17.9606504Z 528 │ assert.equal(delivery.outcome, "dispatch_failed"); 2026-10-23T22:25:17.9606566Z ╰──── 2026-10-23T22:25:17.9606568Z 2026-10-23T22:25:17.9606793Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-23T22:25:17.9606933Z ╭─[packages/client-runtime/src/state/filesystem.ts:3:8] 2026-10-23T22:25:17.9607016Z 2 │ AuthFilesystemReadScope, 2026-10-23T22:25:17.9607093Z 3 │ type AuthSessionState, 2026-10-23T22:25:17.9607186Z ·  ────────┬─────── 2026-10-23T22:25:17.9607340Z · ╰── 'AuthSessionState' is imported here 2026-10-23T22:25:17.9607422Z 4 │ type FilesystemBrowseEntry, 2026-10-23T22:25:17.9607479Z ╰──── 2026-10-23T22:25:17.9607587Z  help: Consider removing this import. 2026-10-23T22:25:17.9607589Z 2026-10-23T22:25:17.9607881Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-23T22:25:17.9608027Z ╭─[packages/provider-cursor/src/server/auth.ts:249:20] 2026-10-23T22:25:17.9608096Z 248 │ }, 2026-10-23T22:25:17.9608187Z 249 │ (effect, flow, stopSessions) => 2026-10-23T22:25:17.9608284Z ·  ──────┬───── 2026-10-23T22:25:17.9608445Z · ╰── 'stopSessions' is declared here 2026-10-23T22:25:17.9608518Z 250 │ effect.pipe( 2026-10-23T22:25:17.9608574Z ╰──── 2026-10-23T22:25:17.9608683Z  help: Consider removing this parameter. 2026-10-23T22:25:17.9608686Z 2026-10-23T22:25:17.9608907Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-23T22:25:17.9609086Z ╭─[apps/server/src/sourceControl/SourceControlProviderRegistry.ts:15:13] 2026-10-23T22:25:17.9609167Z 14 │ } from "@t3tools/contracts"; 2026-10-23T22:25:17.9609347Z 15 │ import type {} from "@t3tools/contracts"; 2026-10-23T22:25:17.9609480Z ·  ── 2026-10-23T22:25:17.9609672Z 16 │ import { detectSourceControlProviderFromRemoteUrl } from "@t3tools/shared/sourceControl"; 2026-10-23T22:25:17.9609730Z ╰──── 2026-10-23T22:25:17.9609817Z  help: Remove empty braces 2026-10-23T22:25:17.9609820Z 2026-10-23T22:25:17.9610014Z ⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`. 2026-10-23T22:25:17.9610150Z ╭─[apps/web/src/terminal/ghostty/core.ts:194:19] 2026-10-23T22:25:17.9610286Z 193 │ const count = Math.min(CHUNK_SIZE, graphemeLength - start); 2026-10-23T22:25:17.9610382Z 194 │ const codes = new Array(count); 2026-10-23T22:25:17.9610505Z ·  ──────────────────────── 2026-10-23T22:25:17.9610626Z 195 │ for (let index = 0; index < count; index += 1) { 2026-10-23T22:25:17.9610687Z ╰──── 2026-10-23T22:25:17.9611130Z  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-23T22:25:17.9611135Z 2026-10-23T22:25:17.9611394Z ⚠ eslint(no-unused-vars): Function 'nonEmptyString' is declared but never used. 2026-10-23T22:25:17.9611568Z ╭─[packages/client-runtime/src/work-log/presentation.ts:234:10] 2026-10-23T22:25:17.9611626Z 233 │ 2026-10-23T22:25:17.9611752Z 234 │ function nonEmptyString(value: unknown): string | null { 2026-10-23T22:25:17.9611842Z ·  ───────┬────── 2026-10-23T22:25:17.9612005Z · ╰── 'nonEmptyString' is declared here 2026-10-23T22:25:17.9612161Z 235 │ return typeof value === "string" && value.trim().length > 0 ? value : null; 2026-10-23T22:25:17.9612218Z ╰──── 2026-10-23T22:25:17.9612328Z  help: Consider removing this declaration. 2026-10-23T22:25:17.9612330Z 2026-10-23T22:25:17.9612571Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-23T22:25:17.9612709Z ╭─[apps/mobile/src/lib/markdownDocument.ts:138:28] 2026-10-23T22:25:17.9612802Z 137 │ visit(parser.parse(markdown)); 2026-10-23T22:25:17.9612894Z 138 │ for (const edit of edits.reverse()) 2026-10-23T22:25:17.9613005Z ·  ─────── 2026-10-23T22:25:17.9613185Z 139 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-23T22:25:17.9613246Z ╰──── 2026-10-23T22:25:17.9613527Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-23T22:25:17.9613532Z 2026-10-23T22:25:17.9613759Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-23T22:25:17.9613893Z ╭─[apps/mobile/src/lib/markdownDocument.ts:169:28] 2026-10-23T22:25:17.9613984Z 168 │ visit(parser.parse(markdown)); 2026-10-23T22:25:17.9614074Z 169 │ for (const edit of edits.reverse()) 2026-10-23T22:25:17.9614178Z ·  ─────── 2026-10-23T22:25:17.9614352Z 170 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-23T22:25:17.9614411Z ╰──── 2026-10-23T22:25:17.9614757Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-23T22:25:17.9614803Z 2026-10-23T22:25:17.9615022Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-23T22:25:17.9615155Z ╭─[apps/mobile/src/lib/markdownDocument.ts:223:38] 2026-10-23T22:25:17.9615246Z 222 │ visit(parser.parse(markdown)); 2026-10-23T22:25:17.9615360Z 223 │ for (const lineStart of lineStarts.reverse()) { 2026-10-23T22:25:17.9615469Z ·  ─────── 2026-10-23T22:25:17.9615647Z 224 │ // The header row may be a lazy line without its container markers (`>` or list indent), 2026-10-23T22:25:17.9615707Z ╰──── 2026-10-23T22:25:17.9615980Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-23T22:25:17.9615988Z 2026-10-23T22:25:17.9616202Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-23T22:25:17.9616347Z ╭─[packages/client-runtime/src/state/usageAccess.ts:3:8] 2026-10-23T22:25:17.9616436Z 2 │ AuthDiagnosticsReadScope, 2026-10-23T22:25:17.9616520Z 3 │ type AuthSessionState, 2026-10-23T22:25:17.9616611Z ·  ────────┬─────── 2026-10-23T22:25:17.9616772Z · ╰── 'AuthSessionState' is imported here 2026-10-23T22:25:17.9616855Z 4 │ sessionGrantsScope, 2026-10-23T22:25:17.9616917Z ╰──── 2026-10-23T22:25:17.9617024Z  help: Consider removing this import. 2026-10-23T22:25:17.9617026Z 2026-10-23T22:25:17.9617209Z ⚠ eslint(no-empty-pattern): Empty array binding pattern 2026-10-23T22:25:17.9617388Z ╭─[apps/server/src/pullRequest/PullRequestService.test.ts:1429:12] 2026-10-23T22:25:17.9617452Z 1428 │ 2026-10-23T22:25:17.9617525Z 1429 │ for (const [] of [ 2026-10-23T22:25:17.9617612Z ·  ── 2026-10-23T22:25:17.9617692Z 1430 │ ["github", "github.com"], 2026-10-23T22:25:17.9617754Z ╰──── 2026-10-23T22:25:17.9618049Z  help: Passing non-iterable values (null, undefined, numbers, booleans, etc.) will result in a runtime error because these values are not iterable. 2026-10-23T22:25:17.9618052Z 2026-10-23T22:25:17.9618235Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T22:25:17.9618367Z ╭─[apps/web/src/hooks/useThreadActions.ts:821:56] 2026-10-23T22:25:17.9618483Z 820 │ const resolved = resolveThreadTarget(target); 2026-10-23T22:25:17.9618655Z 821 │ if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) { 2026-10-23T22:25:17.9618792Z ·  ─────┬──── 2026-10-23T22:25:17.9618981Z · ╰── Cannot call impure function 2026-10-23T22:25:17.9619074Z 822 │ return AsyncResult.failure( 2026-10-23T22:25:17.9619129Z ╰──── 2026-10-23T22:25:17.9619428Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T22:25:17.9619750Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T22:25:17.9619752Z 2026-10-23T22:25:17.9620017Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T22:25:17.9620191Z ╭─[apps/web/src/hooks/useThreadActions.ts:709:46] 2026-10-23T22:25:17.9620266Z 708 │ const wokeAt = resolved 2026-10-23T22:25:17.9620419Z 709 │ ? threadWokeAt(resolved.thread, { now: new Date().toISOString() }) 2026-10-23T22:25:17.9620542Z ·  ─────┬──── 2026-10-23T22:25:17.9620718Z · ╰── Cannot call impure function 2026-10-23T22:25:17.9620784Z 710 │ : null; 2026-10-23T22:25:17.9620841Z ╰──── 2026-10-23T22:25:17.9621143Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T22:25:17.9621501Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T22:25:17.9621507Z 2026-10-23T22:25:17.9622001Z ⚠ 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-23T22:25:17.9622167Z ╭─[packages/client-runtime/src/connection/supervisor.test.ts:135:3] 2026-10-23T22:25:17.9622293Z 134 │ let lastState = yield* SubscriptionRef.get(state); 2026-10-23T22:25:17.9622521Z 135 │ ╭─▶ for (let iteration = 0; iteration < 100; iteration += 1) { 2026-10-23T22:25:17.9622677Z 136 │ │ lastState = yield* SubscriptionRef.get(state); 2026-10-23T22:25:17.9622799Z 137 │ │ if (predicate(lastState)) { 2026-10-23T22:25:17.9622910Z 138 │ │ return lastState; 2026-10-23T22:25:17.9622994Z 139 │ │ } 2026-10-23T22:25:17.9623107Z 140 │ │ yield* Effect.yieldNow; 2026-10-23T22:25:17.9623242Z 141 │ ╰─▶ } 2026-10-23T22:25:17.9623328Z 142 │ return yield* Effect.die( 2026-10-23T22:25:17.9623388Z ╰──── 2026-10-23T22:25:17.9623390Z 2026-10-23T22:25:17.9623617Z ⚠ typescript(no-extraneous-class): Unexpected class with only a constructor. 2026-10-23T22:25:17.9623748Z ╭─[apps/desktop/src/preview/Manager.test.ts:158:18] 2026-10-23T22:25:17.9623864Z 157 │ BrowserWindow: browserWindowConstructor, 2026-10-23T22:25:17.9624043Z 158 │ ╭─▶ ClipboardItem: class { 2026-10-23T22:25:17.9624184Z 159 │ │ constructor(data: Record) { 2026-10-23T22:25:17.9624311Z 160 │ │ clipboardItemConstructor(data); 2026-10-23T22:25:17.9624391Z 161 │ │ } 2026-10-23T22:25:17.9624532Z 162 │ ╰─▶ }, 2026-10-23T22:25:17.9624610Z 163 │ clipboard: { 2026-10-23T22:25:17.9624666Z ╰──── 2026-10-23T22:25:17.9624854Z  help: Try replacing this class with a standalone function or deleting it entirely 2026-10-23T22:25:17.9624857Z 2026-10-23T22:25:17.9625446Z ⚠ 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-23T22:25:17.9625644Z ╭─[packages/client-runtime/src/rpc/session.test.ts:226:3] 2026-10-23T22:25:17.9625710Z 225 │ ) { 2026-10-23T22:25:17.9625921Z 226 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T22:25:17.9626051Z 227 │ │ const socket = sockets[index]; 2026-10-23T22:25:17.9626150Z 228 │ │ if (socket) { 2026-10-23T22:25:17.9626256Z 229 │ │ return socket; 2026-10-23T22:25:17.9626334Z 230 │ │ } 2026-10-23T22:25:17.9626444Z 231 │ │ yield* Effect.yieldNow; 2026-10-23T22:25:17.9626584Z 232 │ ╰─▶ } 2026-10-23T22:25:17.9626780Z 233 │ return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket.")); 2026-10-23T22:25:17.9626842Z ╰──── 2026-10-23T22:25:17.9626844Z 2026-10-23T22:25:17.9627338Z ⚠ 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-23T22:25:17.9627487Z ╭─[packages/client-runtime/src/rpc/session.test.ts:240:3] 2026-10-23T22:25:17.9627550Z 239 │ ) { 2026-10-23T22:25:17.9627827Z 240 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T22:25:17.9628159Z 241 │ │ const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index]; 2026-10-23T22:25:17.9628312Z 242 │ │ if (request) { 2026-10-23T22:25:17.9628469Z 243 │ │ return request; 2026-10-23T22:25:17.9628587Z 244 │ │ } 2026-10-23T22:25:17.9628745Z 245 │ │ yield* Effect.yieldNow; 2026-10-23T22:25:17.9628959Z 246 │ ╰─▶ } 2026-10-23T22:25:17.9629248Z 247 │ return yield* Effect.die(new Error("Expected the RPC protocol to send a request.")); 2026-10-23T22:25:17.9629340Z ╰──── 2026-10-23T22:25:17.9629343Z 2026-10-23T22:25:17.9630042Z ⚠ 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-23T22:25:17.9630628Z ╭─[packages/client-runtime/src/rpc/client.test.ts:131:9] 2026-10-23T22:25:17.9630782Z 130 │ ) { 2026-10-23T22:25:17.9631014Z 131 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T22:25:17.9631154Z 132 │ │ if (subscriptions.length >= count) { 2026-10-23T22:25:17.9631253Z 133 │ │ return; 2026-10-23T22:25:17.9631380Z 134 │ │ } 2026-10-23T22:25:17.9631504Z 135 │ │ yield* Effect.yieldNow; 2026-10-23T22:25:17.9631658Z 136 │ ╰─▶ } 2026-10-23T22:25:17.9631835Z 137 │ return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`)); 2026-10-23T22:25:17.9631901Z ╰──── 2026-10-23T22:25:17.9631904Z 2026-10-23T22:25:17.9632401Z ⚠ 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-23T22:25:17.9632552Z ╭─[packages/client-runtime/src/rpc/client.test.ts:252:7] 2026-10-23T22:25:17.9632723Z 251 │ yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient))); 2026-10-23T22:25:17.9632995Z 252 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) { 2026-10-23T22:25:17.9633112Z 253 │ │ yield* Effect.yieldNow; 2026-10-23T22:25:17.9633256Z 254 │ ╰─▶ } 2026-10-23T22:25:17.9633393Z 255 │ yield* SubscriptionRef.set(activeSession, Option.none()); 2026-10-23T22:25:17.9633458Z ╰──── 2026-10-23T22:25:17.9633460Z 2026-10-23T22:25:17.9633949Z ⚠ 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-23T22:25:17.9634095Z ╭─[packages/client-runtime/src/rpc/client.test.ts:258:7] 2026-10-23T22:25:17.9634160Z 257 │ 2026-10-23T22:25:17.9634422Z 258 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-23T22:25:17.9634540Z 259 │ │ yield* Effect.yieldNow; 2026-10-23T22:25:17.9634685Z 260 │ ╰─▶ } 2026-10-23T22:25:17.9634815Z 261 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-23T22:25:17.9634872Z ╰──── 2026-10-23T22:25:17.9634874Z 2026-10-23T22:25:17.9635362Z ⚠ 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-23T22:25:17.9635505Z ╭─[packages/client-runtime/src/rpc/client.test.ts:322:7] 2026-10-23T22:25:17.9635574Z 321 │ ); 2026-10-23T22:25:17.9635847Z 322 │ ╭─▶ for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) { 2026-10-23T22:25:17.9635955Z 323 │ │ yield* Effect.yieldNow; 2026-10-23T22:25:17.9636178Z 324 │ ╰─▶ } 2026-10-23T22:25:17.9636279Z 325 │ 2026-10-23T22:25:17.9636338Z ╰──── 2026-10-23T22:25:17.9636341Z 2026-10-23T22:25:17.9636821Z ⚠ 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-23T22:25:17.9636963Z ╭─[packages/client-runtime/src/rpc/client.test.ts:330:7] 2026-10-23T22:25:17.9637142Z 329 │ yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient))); 2026-10-23T22:25:17.9637409Z 330 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-23T22:25:17.9637525Z 331 │ │ yield* Effect.yieldNow; 2026-10-23T22:25:17.9637665Z 332 │ ╰─▶ } 2026-10-23T22:25:17.9637788Z 333 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-23T22:25:17.9637847Z ╰──── 2026-10-23T22:25:17.9637850Z 2026-10-23T22:25:17.9638141Z ⚠ unicorn(prefer-add-event-listener): Prefer `addEventListener()` over their `on`-function counterparts. 2026-10-23T22:25:17.9638296Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:12:14] 2026-10-23T22:25:17.9638472Z 11 │ addEventListener(_type: string, listener: (event: { data: string }) => void) { 2026-10-23T22:25:17.9638563Z 12 │ this.onmessage = listener; 2026-10-23T22:25:17.9638664Z ·  ───────── 2026-10-23T22:25:17.9638724Z 13 │ } 2026-10-23T22:25:17.9638785Z ╰──── 2026-10-23T22:25:17.9639140Z  help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on` replaces any previously registered handler. 2026-10-23T22:25:17.9639146Z 2026-10-23T22:25:17.9639373Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-23T22:25:17.9639524Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:16:9] 2026-10-23T22:25:17.9639604Z 15 │ constructor() { 2026-10-23T22:25:17.9639683Z 16 │ source = this; 2026-10-23T22:25:17.9639767Z ·  ────── 2026-10-23T22:25:17.9639826Z 17 │ } 2026-10-23T22:25:17.9639887Z ╰──── 2026-10-23T22:25:17.9640185Z  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-23T22:25:17.9640188Z 2026-10-23T22:25:17.9640413Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-23T22:25:17.9640549Z ╭─[apps/web/src/contextMenuFallback.test.ts:38:9] 2026-10-23T22:25:17.9640624Z 37 │ get isConnected() { 2026-10-23T22:25:17.9640731Z 38 │ let current: FakeElement | null = this; 2026-10-23T22:25:17.9640817Z ·  ─────── 2026-10-23T22:25:17.9640895Z 39 │ while (current?.parent) { 2026-10-23T22:25:17.9640954Z ╰──── 2026-10-23T22:25:17.9641248Z  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-23T22:25:17.9641251Z 2026-10-23T22:25:17.9641495Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-23T22:25:17.9641753Z ╭─[apps/web/src/components/settings/ProviderSettingsPanel.logic.ts:4:8] 2026-10-23T22:25:17.9641871Z 3 │ AuthProvidersManageScope, 2026-10-23T22:25:17.9641952Z 4 │ type AuthSessionState, 2026-10-23T22:25:17.9642046Z ·  ────────┬─────── 2026-10-23T22:25:17.9642200Z · ╰── 'AuthSessionState' is imported here 2026-10-23T22:25:17.9642277Z 5 │ type EnvironmentId, 2026-10-23T22:25:17.9642341Z ╰──── 2026-10-23T22:25:17.9642450Z  help: Consider removing this import. 2026-10-23T22:25:17.9642453Z 2026-10-23T22:25:17.9642664Z ⚠ eslint(no-unused-vars): Type 'EnvironmentId' is imported but never used. 2026-10-23T22:25:17.9642812Z ╭─[packages/client-runtime/src/state/sharedSettings.ts:2:3] 2026-10-23T22:25:17.9642885Z 1 │ import type { 2026-10-23T22:25:17.9642959Z 2 │ EnvironmentId, 2026-10-23T22:25:17.9643045Z ·  ──────┬────── 2026-10-23T22:25:17.9643198Z · ╰── 'EnvironmentId' is imported here 2026-10-23T22:25:17.9643298Z 3 │ ExecutionEnvironmentCapabilities, 2026-10-23T22:25:17.9643360Z ╰──── 2026-10-23T22:25:17.9643465Z  help: Consider removing this import. 2026-10-23T22:25:17.9643471Z 2026-10-23T22:25:17.9643768Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-23T22:25:17.9643935Z ╭─[apps/web/src/components/settings/SettingInheritance.tsx:163:24] 2026-10-23T22:25:17.9643998Z 162 │ keys, 2026-10-23T22:25:17.9644081Z 163 │ overridingProjects = [], 2026-10-23T22:25:17.9644171Z ·  ── 2026-10-23T22:25:17.9644258Z 164 │ onClearOverrides, 2026-10-23T22:25:17.9644321Z ╰──── 2026-10-23T22:25:17.9644658Z  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-23T22:25:17.9644663Z 2026-10-23T22:25:17.9645158Z ⚠ 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-23T22:25:17.9645326Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:169:7] 2026-10-23T22:25:17.9645402Z 168 │ }); 2026-10-23T22:25:17.9645618Z 169 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-23T22:25:17.9645824Z 170 │ │ if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break; 2026-10-23T22:25:17.9645942Z 171 │ │ yield* Effect.yieldNow; 2026-10-23T22:25:17.9646098Z 172 │ ╰─▶ } 2026-10-23T22:25:17.9646192Z 173 │ 2026-10-23T22:25:17.9646290Z ╰──── 2026-10-23T22:25:17.9646295Z 2026-10-23T22:25:17.9646824Z ⚠ 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-23T22:25:17.9646992Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:178:7] 2026-10-23T22:25:17.9647116Z 177 │ yield* Deferred.succeed(releaseSave, undefined); 2026-10-23T22:25:17.9647423Z 178 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-23T22:25:17.9647610Z 179 │ │ if ((yield* Ref.get(saved)).length > 0) break; 2026-10-23T22:25:17.9647727Z 180 │ │ yield* Effect.yieldNow; 2026-10-23T22:25:17.9647872Z 181 │ ╰─▶ } 2026-10-23T22:25:17.9647937Z 182 │ 2026-10-23T22:25:17.9647991Z ╰──── 2026-10-23T22:25:17.9647993Z 2026-10-23T22:25:17.9648484Z ⚠ 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-23T22:25:17.9648643Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7] 2026-10-23T22:25:17.9648792Z 306 │ yield* Deferred.succeed(releaseUnenrichedSave, undefined); 2026-10-23T22:25:17.9649003Z 307 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-23T22:25:17.9649133Z 308 │ │ const values = yield* Ref.get(saved); 2026-10-23T22:25:17.9649351Z 309 │ │ if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) { 2026-10-23T22:25:17.9649450Z 310 │ │ break; 2026-10-23T22:25:17.9649542Z 311 │ │ } 2026-10-23T22:25:17.9649653Z 312 │ │ yield* Effect.yieldNow; 2026-10-23T22:25:17.9649795Z 313 │ ╰─▶ } 2026-10-23T22:25:17.9649859Z 314 │ 2026-10-23T22:25:17.9649924Z ╰──── 2026-10-23T22:25:17.9649930Z 2026-10-23T22:25:17.9650413Z ⚠ 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-23T22:25:17.9650584Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1228:7] 2026-10-23T22:25:17.9650692Z 1227 │ yield* harness.replaceSession; 2026-10-23T22:25:17.9650919Z 1228 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T22:25:17.9651080Z 1229 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) { 2026-10-23T22:25:17.9651179Z 1230 │ │ break; 2026-10-23T22:25:17.9651283Z 1231 │ │ } 2026-10-23T22:25:17.9651461Z 1232 │ │ yield* Effect.yieldNow; 2026-10-23T22:25:17.9651607Z 1233 │ ╰─▶ } 2026-10-23T22:25:17.9651698Z 1234 │ yield* Queue.offer( 2026-10-23T22:25:17.9651758Z ╰──── 2026-10-23T22:25:17.9651761Z 2026-10-23T22:25:17.9652248Z ⚠ 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-23T22:25:17.9652414Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1337:7] 2026-10-23T22:25:17.9652510Z 1336 │ yield* harness.replaceSession; 2026-10-23T22:25:17.9652849Z 1337 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T22:25:17.9653064Z 1338 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break; 2026-10-23T22:25:17.9653179Z 1339 │ │ yield* Effect.yieldNow; 2026-10-23T22:25:17.9653319Z 1340 │ ╰─▶ } 2026-10-23T22:25:17.9653465Z 1341 │ expect(yield* Ref.get(harness.subscriptionCount)).toBe(2); 2026-10-23T22:25:17.9653523Z ╰──── 2026-10-23T22:25:17.9653526Z 2026-10-23T22:25:17.9653734Z ⚠ eslint(no-unused-vars): Identifier 'Arr' is imported but never used. 2026-10-23T22:25:17.9653873Z ╭─[packages/client-runtime/src/state/threadSort.ts:4:13] 2026-10-23T22:25:17.9654002Z 3 │ import type { EnvironmentThreadShell } from "./models.ts"; 2026-10-23T22:25:17.9654097Z 4 │ import * as Arr from "effect/Array"; 2026-10-23T22:25:17.9654188Z ·  ─┬─ 2026-10-23T22:25:17.9654320Z · ╰── 'Arr' is imported here 2026-10-23T22:25:17.9654412Z 5 │ import * as Order from "effect/Order"; 2026-10-23T22:25:17.9654470Z ╰──── 2026-10-23T22:25:17.9654585Z  help: Consider removing this import. 2026-10-23T22:25:17.9654588Z 2026-10-23T22:25:17.9654795Z ⚠ eslint(no-unused-vars): Identifier 'Order' is imported but never used. 2026-10-23T22:25:17.9654942Z ╭─[packages/client-runtime/src/state/threadSort.ts:5:13] 2026-10-23T22:25:17.9655035Z 4 │ import * as Arr from "effect/Array"; 2026-10-23T22:25:17.9655126Z 5 │ import * as Order from "effect/Order"; 2026-10-23T22:25:17.9655204Z ·  ──┬── 2026-10-23T22:25:17.9655355Z · ╰── 'Order' is imported here 2026-10-23T22:25:17.9655416Z 6 │ 2026-10-23T22:25:17.9655478Z ╰──── 2026-10-23T22:25:17.9655584Z  help: Consider removing this import. 2026-10-23T22:25:17.9655587Z 2026-10-23T22:25:17.9655840Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-23T22:25:17.9655991Z ╭─[apps/web/src/components/chat/useComposerSend.ts:985:13] 2026-10-23T22:25:17.9656126Z 984 │ const changedBeforeDecline = draftChangedSinceSend(); 2026-10-23T22:25:17.9656384Z 985 │ ╭─▶ const pendingIdsBeforeDecline = pendingApprovalsRef.current.map( 2026-10-23T22:25:17.9656513Z 986 │ │ (approval) => approval.requestId, 2026-10-23T22:25:17.9656666Z 987 │ ╰─▶ ); 2026-10-23T22:25:17.9656818Z 988 │ const approvalResponding = approvalsToDecline.some((approval) => 2026-10-23T22:25:17.9656877Z ╰──── 2026-10-23T22:25:17.9656960Z  help: Switch to `Set` 2026-10-23T22:25:17.9656962Z 2026-10-23T22:25:17.9657148Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T22:25:17.9657311Z ╭─[apps/web/src/components/chat/useThreadLifecycle.tsx:178:58] 2026-10-23T22:25:17.9657435Z 177 │ if (snoozeClockState.shell !== activeThreadShell) { 2026-10-23T22:25:17.9657604Z 178 │ setSnoozeClockState({ shell: activeThreadShell, now: new Date().toISOString() }); 2026-10-23T22:25:17.9657745Z ·  ─────┬──── 2026-10-23T22:25:17.9658005Z · ╰── Cannot call impure function 2026-10-23T22:25:17.9658111Z 179 │ } 2026-10-23T22:25:17.9658165Z ╰──── 2026-10-23T22:25:17.9658468Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T22:25:17.9658789Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T22:25:17.9658792Z 2026-10-23T22:25:17.9659042Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-23T22:25:17.9663032Z ╭─[apps/web/src/components/pullRequest/pullRequestList.logic.ts:187:9] 2026-10-23T22:25:17.9663152Z 186 │ ): boolean { 2026-10-23T22:25:17.9663335Z 187 │ const labels = entry.labels.map((label) => label.name.trim().toLowerCase()); 2026-10-23T22:25:17.9663521Z ·  ───────────────────────────────────────────────────────────────────── 2026-10-23T22:25:17.9663680Z 188 │ const holds = (label: string) => labels.includes(label.trim().toLowerCase()); 2026-10-23T22:25:17.9663735Z ╰──── 2026-10-23T22:25:17.9663823Z  help: Switch to `Set` 2026-10-23T22:25:17.9663826Z 2026-10-23T22:25:17.9664013Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T22:25:17.9664164Z ╭─[apps/web/src/components/CustomSnoozeDialog.tsx:140:58] 2026-10-23T22:25:17.9664305Z 139 │ {...(weekStartsOn === undefined ? {} : { weekStartsOn })} 2026-10-23T22:25:17.9664465Z 140 │ disabled={{ before: new Date(new Date().setHours(0, 0, 0, 0)) }} 2026-10-23T22:25:17.9664604Z ·  ─────┬──── 2026-10-23T22:25:17.9664794Z · ╰── Cannot call impure function 2026-10-23T22:25:17.9664899Z 141 │ onSelect={(selected) => { 2026-10-23T22:25:17.9664957Z ╰──── 2026-10-23T22:25:17.9665259Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T22:25:17.9665583Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T22:25:17.9665587Z 2026-10-23T22:25:17.9665921Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T22:25:17.9666294Z ╭─[apps/web/src/components/pullRequest/PullRequestChecksPopover.tsx:88:15] 2026-10-23T22:25:17.9666367Z 87 │
  • { 2026-10-23T22:25:17.9677200Z ·  ────┬──── 2026-10-23T22:25:17.9677340Z · ╰── This is the containing effect 2026-10-23T22:25:17.9677470Z 30 │ if (snapshot && snapshot !== live) setHeld({ key, snapshot }); 2026-10-23T22:25:17.9677663Z ·  ───┬─── 2026-10-23T22:25:17.9677903Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.9677986Z 31 │ }, [key, live, snapshot]); 2026-10-23T22:25:17.9678039Z ╰──── 2026-10-23T22:25:17.9678672Z  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-23T22:25:17.9679016Z  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-23T22:25:17.9679018Z 2026-10-23T22:25:17.9679290Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T22:25:17.9679461Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:40:5] 2026-10-23T22:25:17.9679581Z 37 │ const [initialized, setInitialized] = useState(false); 2026-10-23T22:25:17.9679654Z 38 │ useLayoutEffect(() => { 2026-10-23T22:25:17.9679741Z ·  ───────┬─────── 2026-10-23T22:25:17.9679880Z · ╰── This is the containing effect 2026-10-23T22:25:17.9679946Z 39 │ reset(); 2026-10-23T22:25:17.9680019Z 40 │ setInitialized(true); 2026-10-23T22:25:17.9680106Z ·  ───────┬────── 2026-10-23T22:25:17.9680282Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.9680356Z 41 │ }, [reset]); 2026-10-23T22:25:17.9680421Z ╰──── 2026-10-23T22:25:17.9681043Z  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-23T22:25:17.9681407Z  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-23T22:25:17.9681410Z 2026-10-23T22:25:17.9681681Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T22:25:17.9681845Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:93:5] 2026-10-23T22:25:17.9681906Z 88 │ 2026-10-23T22:25:17.9681980Z 89 │ useEffect(() => { 2026-10-23T22:25:17.9682058Z ·  ────┬──── 2026-10-23T22:25:17.9682191Z · ╰── This is the containing effect 2026-10-23T22:25:17.9682360Z 90 │ if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return; 2026-10-23T22:25:17.9682473Z 91 │ const branchName = initialProjectRef.branch; 2026-10-23T22:25:17.9682547Z 92 │ let active = true; 2026-10-23T22:25:17.9682649Z 93 │ setPendingCheckouts((count) => count + 1); 2026-10-23T22:25:17.9682739Z ·  ─────────┬───────── 2026-10-23T22:25:17.9682915Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.9683076Z 94 │ // Serialize replacements: ignoring a stale result cannot undo its Git mutation. 2026-10-23T22:25:17.9683196Z ╰──── 2026-10-23T22:25:17.9683849Z  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-23T22:25:17.9684182Z  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-23T22:25:17.9684184Z 2026-10-23T22:25:17.9684451Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T22:25:17.9684612Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:57:5] 2026-10-23T22:25:17.9684666Z 55 │ 2026-10-23T22:25:17.9684743Z 56 │ useEffect(() => { 2026-10-23T22:25:17.9684822Z ·  ────┬──── 2026-10-23T22:25:17.9684958Z · ╰── This is the containing effect 2026-10-23T22:25:17.9685028Z 57 │ setDecodedSize(null); 2026-10-23T22:25:17.9685114Z ·  ───────┬────── 2026-10-23T22:25:17.9685291Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.9685366Z 58 │ }, [props.sourceKey]); 2026-10-23T22:25:17.9685417Z ╰──── 2026-10-23T22:25:17.9686040Z  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-23T22:25:17.9686375Z  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-23T22:25:17.9686378Z 2026-10-23T22:25:17.9686642Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T22:25:17.9686800Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5] 2026-10-23T22:25:17.9686854Z 59 │ 2026-10-23T22:25:17.9686930Z 60 │ useEffect(() => { 2026-10-23T22:25:17.9687009Z ·  ────┬──── 2026-10-23T22:25:17.9687143Z · ╰── This is the containing effect 2026-10-23T22:25:17.9687215Z 61 │ setFailedUri(null); 2026-10-23T22:25:17.9687296Z ·  ──────┬───── 2026-10-23T22:25:17.9687546Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T22:25:17.9687656Z 62 │ }, [props.uri]); 2026-10-23T22:25:17.9687708Z ╰──── 2026-10-23T22:25:17.9688325Z  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-23T22:25:17.9688657Z  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-23T22:25:17.9688659Z 2026-10-23T22:25:17.9688892Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-23T22:25:17.9689057Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10] 2026-10-23T22:25:17.9689185Z 6 │ import { parse, SvgAst, type JsxAST } from "react-native-svg"; 2026-10-23T22:25:17.9689373Z 7 │ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native"; 2026-10-23T22:25:17.9689471Z ·  ────────┬──────── 2026-10-23T22:25:17.9689635Z · ╰── 'ActivityIndicator' is imported here 2026-10-23T22:25:17.9689689Z 8 │ 2026-10-23T22:25:17.9689749Z ╰──── 2026-10-23T22:25:17.9689858Z  help: Consider removing this import. 2026-10-23T22:25:17.9689861Z 2026-10-23T22:25:17.9690074Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T22:25:17.9690236Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7] 2026-10-23T22:25:17.9690318Z 57 │ setDecodedSize(null); 2026-10-23T22:25:17.9690398Z 58 │ }, [props.sourceKey]); 2026-10-23T22:25:17.9690491Z ·  ───────┬─────── 2026-10-23T22:25:17.9690649Z · ╰── Unnecessary dependency `props.sourceKey` 2026-10-23T22:25:17.9690713Z 59 │ 2026-10-23T22:25:17.9690771Z ╰──── 2026-10-23T22:25:17.9691084Z  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-23T22:25:17.9691463Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9691471Z 2026-10-23T22:25:17.9691693Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T22:25:17.9691858Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7] 2026-10-23T22:25:17.9691937Z 61 │ setFailedUri(null); 2026-10-23T22:25:17.9692011Z 62 │ }, [props.uri]); 2026-10-23T22:25:17.9692092Z ·  ────┬──── 2026-10-23T22:25:17.9692243Z · ╰── Unnecessary dependency `props.uri` 2026-10-23T22:25:17.9692301Z 63 │ 2026-10-23T22:25:17.9692358Z ╰──── 2026-10-23T22:25:17.9692666Z  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-23T22:25:17.9693080Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T22:25:17.9693130Z 2026-10-23T22:25:17.9693227Z Found 0 errors and 362 warnings in 5400 files (7.3s, 8 threads) 2026-10-23T22:25:18.0289242Z Post job cleanup. 2026-10-23T22:25:18.1022304Z Cache hit occurred on the primary key electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309, not saving cache. 2026-10-23T22:25:18.1128927Z Post job cleanup. 2026-10-23T22:25:18.1146227Z ##[start-action display=Cache full pnpm store;id=__ea13b644-27d8-4b8b-ac24-d2c4c3d9c038.__actions_cache] 2026-10-23T22:25:18.1522894Z Post job cleanup. 2026-10-23T22:25:18.2225627Z Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-3cb0b4d7cff93dc8fe33f2ea73cac71ca25a36270fcb648b9b4a9320151012ef, not saving cache. 2026-10-23T22:25:18.2265314Z ##[end-action id=__ea13b644-27d8-4b8b-ac24-d2c4c3d9c038.__actions_cache;outcome=success;conclusion=success;duration_ms=111] 2026-10-23T22:25:18.2267096Z ##[start-action display=Cache Vite+;id=__ea13b644-27d8-4b8b-ac24-d2c4c3d9c038.vp_cache] 2026-10-23T22:25:18.2288929Z Post job cleanup. 2026-10-23T22:25:18.2967783Z 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-23T22:25:18.3009969Z ##[end-action id=__ea13b644-27d8-4b8b-ac24-d2c4c3d9c038.vp_cache;outcome=success;conclusion=success;duration_ms=74] 2026-10-23T22:25:18.3061753Z Post job cleanup. 2026-10-23T22:25:18.3616846Z [command]/usr/local/bin/git version 2026-10-23T22:25:18.3658309Z git version 2.55.0 2026-10-23T22:25:18.3690098Z Temporarily overriding HOME='/home/runner/_work/_temp/f4361a75-7622-4eba-b727-4703105f8d63' before making global git config changes 2026-10-23T22:25:18.3690537Z Adding repository directory to the temporary git global config as a safe directory 2026-10-23T22:25:18.3695833Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-23T22:25:18.3733216Z Removing SSH command configuration 2026-10-23T22:25:18.3738391Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-23T22:25:18.3774905Z [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-23T22:25:18.3911583Z fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules 2026-10-23T22:25:18.3940567Z ##[warning]The process '/usr/local/bin/git' failed with exit code 128 2026-10-23T22:25:18.3991027Z A job completed hook has been configured by the self-hosted runner administrator 2026-10-23T22:25:18.4016545Z ##[group]Run '/job_completed.sh' 2026-10-23T22:25:18.4028797Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T22:25:18.4029104Z env: 2026-10-23T22:25:18.4029305Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 193 2026-10-23T22:25:18.4029574Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 447 2026-10-23T22:25:18.4029839Z BLACKSMITH_CHECK_RUN_ID: 120686836548 2026-10-23T22:25:18.4030094Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-23T22:25:18.4030477Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-23T22:25:18.4030730Z ##[endgroup] 2026-10-23T22:25:18.4132219Z Docker container cache not activated, skipping hash computation. 2026-10-23T22:25:18.4416533Z No active SSH sessions detected. Proceeding with shutdown immediately. 2026-10-23T22:25:18.4471579Z Cleaning up orphan processes