2026-10-22T09:31:16.1569937Z Current runner version: '2.337.0' 2026-10-22T09:31:16.1575222Z Runner name: 'blacksmith-8vcpu-ubuntu-2404-pwfpw5vjx7warbqk' 2026-10-22T09:31:16.1576335Z Runner group name: 'blacksmith scale sets - blacksmith-8vcpu-ubuntu-2404' 2026-10-22T09:31:16.1577559Z Machine name: 'ip-172-31-73-130' 2026-10-22T09:31:16.1579494Z ##[group]GITHUB_TOKEN Permissions 2026-10-22T09:31:16.1581530Z Contents: read 2026-10-22T09:31:16.1582026Z Metadata: read 2026-10-22T09:31:16.1582674Z ##[endgroup] 2026-10-22T09:31:16.1585041Z Secret source: Actions 2026-10-22T09:31:16.1585822Z Cache mode: write 2026-10-22T09:31:16.1586461Z Prepare workflow directory 2026-10-22T09:31:16.1863512Z Prepare all required actions 2026-10-22T09:31:16.1908718Z Getting action download info 2026-10-22T09:31:16.3421851Z Download action repository 'actions/checkout@v6' (SHA:d23441a48e516b6c34aea4fa41551a30e30af803) 2026-10-22T09:31:16.4216551Z Download action repository 'actions/cache@v6' (SHA:55cc8345863c7cc4c66a329aec7e433d2d1c52a9) 2026-10-22T09:31:16.5827809Z Setting BLACKSMITH_ACTIONS_RESULTS_URL to https://results-receiver.actions.githubusercontent.com/ 2026-10-22T09:31:16.5893371Z Complete job name: Lint 2026-10-22T09:31:16.6403280Z A job started hook has been configured by the self-hosted runner administrator 2026-10-22T09:31:16.6527869Z ##[group]Run '/setup.sh' 2026-10-22T09:31:16.6548970Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-22T09:31:16.6549774Z env: 2026-10-22T09:31:16.6550177Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 200 2026-10-22T09:31:16.6550719Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 456 2026-10-22T09:31:16.6551251Z BLACKSMITH_CHECK_RUN_ID: 119748187318 2026-10-22T09:31:16.6551749Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-22T09:31:16.6552241Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-22T09:31:16.6552829Z ##[endgroup] 2026-10-22T09:31:16.6962845Z Logging daemon started (blacksmithd for logs) 2026-10-22T09:31:16.7107694Z Results daemon started (blacksmithd for results) 2026-10-22T09:31:16.7450624Z Background adoption and SSH setup started (PID: 3151) 2026-10-22T09:31:16.7451456Z 2026-10-22T09:31:16.7451640Z ---------------------------------------- 2026-10-22T09:31:16.7452667Z View this job: https://app.blacksmith.sh/pingdotgg/runs/39756046540/jobs/119748187318 2026-10-22T09:31:16.7453370Z SSH Access (using your GitHub SSH key): 2026-10-22T09:31:16.7453928Z ssh -p 64003 runner@blacksmith-8vcpu-ubuntu-2404-pwfpw5vjx7warbqk.vm.blacksmith.sh 2026-10-22T09:31:16.7454264Z 2026-10-22T09:31:16.7454391Z No GitHub SSH key? Add one at: 2026-10-22T09:31:16.7454929Z https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account 2026-10-22T09:31:16.7455375Z 2026-10-22T09:31:16.7455491Z ---------------------------------------- 2026-10-22T09:31:16.7455684Z 2026-10-22T09:31:16.7455835Z VM ID: blacksmith-8vcpu-ubuntu-2404-pwfpw5vjx7warbqk 2026-10-22T09:31:16.7456193Z Host: production-152.236.40.87-x8664 2026-10-22T09:31:16.7456483Z Host Agent PID: 1932733 2026-10-22T09:31:16.7456759Z Host Agent Git SHA: 266f03d96 2026-10-22T09:31:16.7457051Z Host CPU Manufacturer: AuthenticAMD 2026-10-22T09:31:16.7457372Z Blacksmith Host Generation: gen 2 2026-10-22T09:31:16.7457694Z Petname: production-adequate-halibut-f9c31d29 2026-10-22T09:31:16.7458036Z Region: us-east 2026-10-22T09:31:16.7458298Z Rootfs Version: ubuntu24-full-x64-081926 2026-10-22T09:31:16.7473819Z OS Version: Ubuntu 24.04.4 LTS 2026-10-22T09:31:16.7474256Z 2026-10-22T09:31:16.7474465Z Enabling Blacksmith transparent cache 2026-10-22T09:31:16.8005161Z ##[group]Run actions/checkout@v6 2026-10-22T09:31:16.8005577Z with: 2026-10-22T09:31:16.8006202Z sparse-checkout: /* !/.repos/ !/apps/mobile/modules/t3-terminal/Vendor/**/*.a 2026-10-22T09:31:16.8006898Z sparse-checkout-cone-mode: false 2026-10-22T09:31:16.8007307Z repository: pingdotgg/t3code 2026-10-22T09:31:16.8009433Z token: *** 2026-10-22T09:31:16.8009681Z ssh-strict: true 2026-10-22T09:31:16.8009939Z ssh-user: git 2026-10-22T09:31:16.8010206Z persist-credentials: true 2026-10-22T09:31:16.8010933Z clean: true 2026-10-22T09:31:16.8011186Z fetch-depth: 1 2026-10-22T09:31:16.8011446Z fetch-tags: false 2026-10-22T09:31:16.8011710Z show-progress: true 2026-10-22T09:31:16.8011974Z lfs: false 2026-10-22T09:31:16.8012223Z submodules: false 2026-10-22T09:31:16.8012562Z set-safe-directory: true 2026-10-22T09:31:16.8012870Z allow-unsafe-pr-checkout: false 2026-10-22T09:31:16.8013177Z env: 2026-10-22T09:31:16.8013512Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 200 2026-10-22T09:31:16.8013855Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 456 2026-10-22T09:31:16.8014196Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T09:31:16.8014505Z ##[endgroup] 2026-10-22T09:31:17.0540681Z Syncing repository: pingdotgg/t3code 2026-10-22T09:31:17.0543096Z ##[group]Getting Git version info 2026-10-22T09:31:17.0543626Z Working directory is '/home/runner/_work/t3code/t3code' 2026-10-22T09:31:17.0545065Z [command]/usr/local/bin/git version 2026-10-22T09:31:17.0712830Z git version 2.55.0 2026-10-22T09:31:17.0735371Z ##[endgroup] 2026-10-22T09:31:17.0750597Z Temporarily overriding HOME='/home/runner/_work/_temp/96beb34e-9546-44e5-af05-5f18b4ef1e18' before making global git config changes 2026-10-22T09:31:17.0752333Z Adding repository directory to the temporary git global config as a safe directory 2026-10-22T09:31:17.0755264Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-22T09:31:17.0821385Z Deleting the contents of '/home/runner/_work/t3code/t3code' 2026-10-22T09:31:17.0825033Z ##[group]Determining repository object format 2026-10-22T09:31:17.0826074Z ##[endgroup] 2026-10-22T09:31:17.0826769Z ##[group]Initializing the repository 2026-10-22T09:31:17.0829730Z [command]/usr/local/bin/git init /home/runner/_work/t3code/t3code 2026-10-22T09:31:17.0900015Z hint: Using 'master' as the name for the initial branch. This default branch name 2026-10-22T09:31:17.0901374Z hint: will change to "main" in Git 3.0. To configure the initial branch name 2026-10-22T09:31:17.0902497Z hint: to use in all of your new repositories, which will suppress this warning, 2026-10-22T09:31:17.0903194Z hint: call: 2026-10-22T09:31:17.0903561Z hint: 2026-10-22T09:31:17.0904054Z hint: git config --global init.defaultBranch 2026-10-22T09:31:17.0904800Z hint: 2026-10-22T09:31:17.0905351Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and 2026-10-22T09:31:17.0906194Z hint: 'development'. The just-created branch can be renamed via this command: 2026-10-22T09:31:17.0906796Z hint: 2026-10-22T09:31:17.0907062Z hint: git branch -m 2026-10-22T09:31:17.0907354Z hint: 2026-10-22T09:31:17.0907731Z hint: Disable this message with "git config set advice.defaultBranchName false" 2026-10-22T09:31:17.0908647Z Initialized empty Git repository in /home/runner/_work/t3code/t3code/.git/ 2026-10-22T09:31:17.0910437Z [command]/usr/local/bin/git remote add origin https://github.com/pingdotgg/t3code 2026-10-22T09:31:17.0953697Z ##[endgroup] 2026-10-22T09:31:17.0954683Z ##[group]Disabling automatic garbage collection 2026-10-22T09:31:17.0957598Z [command]/usr/local/bin/git config --local gc.auto 0 2026-10-22T09:31:17.1054955Z ##[endgroup] 2026-10-22T09:31:17.1055705Z ##[group]Setting up auth 2026-10-22T09:31:17.1056282Z Removing SSH command configuration 2026-10-22T09:31:17.1062553Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-22T09:31:17.1105914Z [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-22T09:31:17.1303766Z Removing HTTP extra header 2026-10-22T09:31:17.1310753Z [command]/usr/local/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader 2026-10-22T09:31:17.1345547Z [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-22T09:31:17.1483118Z Removing includeIf entries pointing to credentials config files 2026-10-22T09:31:17.1490015Z [command]/usr/local/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: 2026-10-22T09:31:17.1530620Z [command]/usr/local/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url 2026-10-22T09:31:17.1698053Z [command]/usr/local/bin/git config --file /home/runner/_work/_temp/git-credentials-b0d101f4-9c21-4236-a34a-5c361a5e0616.config http.https://github.com/.extraheader AUTHORIZATION: basic *** 2026-10-22T09:31:17.1763640Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git.path /home/runner/_work/_temp/git-credentials-b0d101f4-9c21-4236-a34a-5c361a5e0616.config 2026-10-22T09:31:17.1801106Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git/worktrees/*.path /home/runner/_work/_temp/git-credentials-b0d101f4-9c21-4236-a34a-5c361a5e0616.config 2026-10-22T09:31:17.1842339Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-b0d101f4-9c21-4236-a34a-5c361a5e0616.config 2026-10-22T09:31:17.1884970Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-b0d101f4-9c21-4236-a34a-5c361a5e0616.config 2026-10-22T09:31:17.1917458Z ##[endgroup] 2026-10-22T09:31:17.1917975Z ##[group]Fetching the repository 2026-10-22T09:31:17.1923483Z [command]/usr/local/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --filter=blob:none --depth=1 origin +d0aa0d52e1d0a50cec81f46f5b7d7d32cd815024:refs/remotes/pull/23510/merge 2026-10-22T09:31:17.4723780Z From https://github.com/pingdotgg/t3code 2026-10-22T09:31:17.4724964Z * [new ref] d0aa0d52e1d0a50cec81f46f5b7d7d32cd815024 -> pull/23510/merge 2026-10-22T09:31:17.4768363Z ##[endgroup] 2026-10-22T09:31:17.4768994Z ##[group]Determining the checkout info 2026-10-22T09:31:17.4769573Z ##[endgroup] 2026-10-22T09:31:17.4770002Z ##[group]Setting up sparse checkout 2026-10-22T09:31:17.4773598Z [command]/usr/local/bin/git config core.sparseCheckout true 2026-10-22T09:31:17.4817133Z [command]/usr/local/bin/git rev-parse --git-path info/sparse-checkout 2026-10-22T09:31:17.4855601Z .git/info/sparse-checkout 2026-10-22T09:31:17.4863620Z ##[endgroup] 2026-10-22T09:31:17.4864179Z ##[group]Checking out the ref 2026-10-22T09:31:17.4870199Z [command]/usr/local/bin/git checkout --progress --force refs/remotes/pull/23510/merge 2026-10-22T09:31:25.0987161Z Updating files: 0% (1/6286) 2026-10-22T09:31:25.1023997Z Updating files: 1% (63/6286) 2026-10-22T09:31:25.1042418Z Updating files: 2% (126/6286) 2026-10-22T09:31:25.1067243Z Updating files: 3% (189/6286) 2026-10-22T09:31:25.1090282Z Updating files: 4% (252/6286) 2026-10-22T09:31:25.1126178Z Updating files: 5% (315/6286) 2026-10-22T09:31:25.1150250Z Updating files: 6% (378/6286) 2026-10-22T09:31:25.1218272Z Updating files: 7% (441/6286) 2026-10-22T09:31:25.1261365Z Updating files: 8% (503/6286) 2026-10-22T09:31:25.1292358Z Updating files: 9% (566/6286) 2026-10-22T09:31:25.1638293Z Updating files: 10% (629/6286) 2026-10-22T09:31:25.1655825Z Updating files: 11% (692/6286) 2026-10-22T09:31:25.1668080Z Updating files: 12% (755/6286) 2026-10-22T09:31:25.1686172Z Updating files: 13% (818/6286) 2026-10-22T09:31:25.1703966Z Updating files: 14% (881/6286) 2026-10-22T09:31:25.1724997Z Updating files: 15% (943/6286) 2026-10-22T09:31:25.1745369Z Updating files: 16% (1006/6286) 2026-10-22T09:31:25.1761137Z Updating files: 17% (1069/6286) 2026-10-22T09:31:25.1781828Z Updating files: 18% (1132/6286) 2026-10-22T09:31:25.1798352Z Updating files: 19% (1195/6286) 2026-10-22T09:31:25.1830899Z Updating files: 20% (1258/6286) 2026-10-22T09:31:25.1848442Z Updating files: 21% (1321/6286) 2026-10-22T09:31:25.1870246Z Updating files: 22% (1383/6286) 2026-10-22T09:31:25.1887906Z Updating files: 23% (1446/6286) 2026-10-22T09:31:25.1906388Z Updating files: 24% (1509/6286) 2026-10-22T09:31:25.1923695Z Updating files: 25% (1572/6286) 2026-10-22T09:31:25.1940042Z Updating files: 26% (1635/6286) 2026-10-22T09:31:25.1958789Z Updating files: 27% (1698/6286) 2026-10-22T09:31:25.1990132Z Updating files: 28% (1761/6286) 2026-10-22T09:31:25.2018665Z Updating files: 29% (1823/6286) 2026-10-22T09:31:25.2041940Z Updating files: 30% (1886/6286) 2026-10-22T09:31:25.2070480Z Updating files: 31% (1949/6286) 2026-10-22T09:31:25.2105284Z Updating files: 32% (2012/6286) 2026-10-22T09:31:25.2137036Z Updating files: 33% (2075/6286) 2026-10-22T09:31:25.2224600Z Updating files: 34% (2138/6286) 2026-10-22T09:31:25.2285830Z Updating files: 35% (2201/6286) 2026-10-22T09:31:25.2325225Z Updating files: 36% (2263/6286) 2026-10-22T09:31:25.2366617Z Updating files: 37% (2326/6286) 2026-10-22T09:31:25.2414537Z Updating files: 38% (2389/6286) 2026-10-22T09:31:25.2449637Z Updating files: 39% (2452/6286) 2026-10-22T09:31:25.2492009Z Updating files: 40% (2515/6286) 2026-10-22T09:31:25.2532615Z Updating files: 41% (2578/6286) 2026-10-22T09:31:25.2550826Z Updating files: 42% (2641/6286) 2026-10-22T09:31:25.2562474Z Updating files: 43% (2703/6286) 2026-10-22T09:31:25.2591278Z Updating files: 44% (2766/6286) 2026-10-22T09:31:25.2624095Z Updating files: 45% (2829/6286) 2026-10-22T09:31:25.2654771Z Updating files: 46% (2892/6286) 2026-10-22T09:31:25.2683885Z Updating files: 47% (2955/6286) 2026-10-22T09:31:25.2725644Z Updating files: 48% (3018/6286) 2026-10-22T09:31:25.2758519Z Updating files: 49% (3081/6286) 2026-10-22T09:31:25.2802605Z Updating files: 50% (3143/6286) 2026-10-22T09:31:25.2819069Z Updating files: 51% (3206/6286) 2026-10-22T09:31:25.2863767Z Updating files: 52% (3269/6286) 2026-10-22T09:31:25.2892002Z Updating files: 53% (3332/6286) 2026-10-22T09:31:25.2914813Z Updating files: 54% (3395/6286) 2026-10-22T09:31:25.2943546Z Updating files: 55% (3458/6286) 2026-10-22T09:31:25.2965090Z Updating files: 56% (3521/6286) 2026-10-22T09:31:25.2982575Z Updating files: 57% (3584/6286) 2026-10-22T09:31:25.3004097Z Updating files: 58% (3646/6286) 2026-10-22T09:31:25.3426139Z Updating files: 59% (3709/6286) 2026-10-22T09:31:25.3440385Z Updating files: 60% (3772/6286) 2026-10-22T09:31:25.3458330Z Updating files: 61% (3835/6286) 2026-10-22T09:31:25.3483025Z Updating files: 62% (3898/6286) 2026-10-22T09:31:25.3507537Z Updating files: 63% (3961/6286) 2026-10-22T09:31:25.3538446Z Updating files: 64% (4024/6286) 2026-10-22T09:31:25.3564189Z Updating files: 65% (4086/6286) 2026-10-22T09:31:25.3583825Z Updating files: 66% (4149/6286) 2026-10-22T09:31:25.3611047Z Updating files: 67% (4212/6286) 2026-10-22T09:31:25.3626262Z Updating files: 68% (4275/6286) 2026-10-22T09:31:25.3647536Z Updating files: 69% (4338/6286) 2026-10-22T09:31:25.3660965Z Updating files: 70% (4401/6286) 2026-10-22T09:31:25.3680022Z Updating files: 71% (4464/6286) 2026-10-22T09:31:25.3697803Z Updating files: 72% (4526/6286) 2026-10-22T09:31:25.3730574Z Updating files: 73% (4589/6286) 2026-10-22T09:31:25.4022364Z Updating files: 74% (4652/6286) 2026-10-22T09:31:25.4237155Z Updating files: 75% (4715/6286) 2026-10-22T09:31:25.4261665Z Updating files: 76% (4778/6286) 2026-10-22T09:31:25.4285687Z Updating files: 77% (4841/6286) 2026-10-22T09:31:25.4315749Z Updating files: 78% (4904/6286) 2026-10-22T09:31:25.4339327Z Updating files: 79% (4966/6286) 2026-10-22T09:31:25.4361313Z Updating files: 80% (5029/6286) 2026-10-22T09:31:25.4379995Z Updating files: 81% (5092/6286) 2026-10-22T09:31:25.4402362Z Updating files: 82% (5155/6286) 2026-10-22T09:31:25.4423503Z Updating files: 83% (5218/6286) 2026-10-22T09:31:25.4449642Z Updating files: 84% (5281/6286) 2026-10-22T09:31:25.4472749Z Updating files: 85% (5344/6286) 2026-10-22T09:31:25.4498582Z Updating files: 86% (5406/6286) 2026-10-22T09:31:25.4585900Z Updating files: 87% (5469/6286) 2026-10-22T09:31:25.4624150Z Updating files: 88% (5532/6286) 2026-10-22T09:31:25.4645319Z Updating files: 89% (5595/6286) 2026-10-22T09:31:25.4672933Z Updating files: 90% (5658/6286) 2026-10-22T09:31:25.4715581Z Updating files: 91% (5721/6286) 2026-10-22T09:31:25.4730882Z Updating files: 92% (5784/6286) 2026-10-22T09:31:25.4750016Z Updating files: 93% (5846/6286) 2026-10-22T09:31:25.4773995Z Updating files: 94% (5909/6286) 2026-10-22T09:31:25.4798820Z Updating files: 95% (5972/6286) 2026-10-22T09:31:25.4867505Z Updating files: 96% (6035/6286) 2026-10-22T09:31:25.4898014Z Updating files: 97% (6098/6286) 2026-10-22T09:31:25.4951838Z Updating files: 98% (6161/6286) 2026-10-22T09:31:25.4973166Z Updating files: 99% (6224/6286) 2026-10-22T09:31:25.4973822Z Updating files: 100% (6286/6286) 2026-10-22T09:31:25.4974108Z Updating files: 100% (6286/6286), done. 2026-10-22T09:31:25.5169985Z Note: switching to 'refs/remotes/pull/23510/merge'. 2026-10-22T09:31:25.5170651Z 2026-10-22T09:31:25.5170903Z You are in 'detached HEAD' state. You can look around, make experimental 2026-10-22T09:31:25.5171351Z changes and commit them, and you can discard any commits you make in this 2026-10-22T09:31:25.5171771Z state without impacting any branches by switching back to a branch. 2026-10-22T09:31:25.5172010Z 2026-10-22T09:31:25.5172176Z If you want to create a new branch to retain commits you create, you may 2026-10-22T09:31:25.5172593Z do so (now or later) by using -c with the switch command. Example: 2026-10-22T09:31:25.5172834Z 2026-10-22T09:31:25.5172946Z git switch -c 2026-10-22T09:31:25.5173104Z 2026-10-22T09:31:25.5173208Z Or undo this operation with: 2026-10-22T09:31:25.5173361Z 2026-10-22T09:31:25.5173441Z git switch - 2026-10-22T09:31:25.5173658Z 2026-10-22T09:31:25.5173949Z Turn off this advice by setting config variable advice.detachedHead to false 2026-10-22T09:31:25.5174236Z 2026-10-22T09:31:25.5174557Z HEAD is now at d0aa0d5 Merge bf4c90b14702fa8dc5370645aa02eed37c76f76e into ff525478e236ec0df4c4920eb03ac3961ea714a2 2026-10-22T09:31:25.5185924Z ##[endgroup] 2026-10-22T09:31:25.5244868Z [command]/usr/local/bin/git log -1 --format=%H 2026-10-22T09:31:25.5277289Z d0aa0d52e1d0a50cec81f46f5b7d7d32cd815024 2026-10-22T09:31:25.5401878Z ##[group]Run files="$(git ls-files .github/pr-assets)" 2026-10-22T09:31:25.5402177Z files="$(git ls-files .github/pr-assets)" 2026-10-22T09:31:25.5402388Z if test -n "$files"; then 2026-10-22T09:31:25.5402641Z  printf 'PR evidence must be uploaded to GitHub, not committed:\n%s\n' "$files" >&2 2026-10-22T09:31:25.5402949Z  exit 1 2026-10-22T09:31:25.5403186Z fi 2026-10-22T09:31:25.5420017Z shell: /usr/bin/bash -e {0} 2026-10-22T09:31:25.5420248Z env: 2026-10-22T09:31:25.5420451Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 200 2026-10-22T09:31:25.5420707Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 456 2026-10-22T09:31:25.5420962Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T09:31:25.5421202Z ##[endgroup] 2026-10-22T09:31:25.5621440Z Prepare all required actions 2026-10-22T09:31:25.5621877Z Getting action download info 2026-10-22T09:31:25.6454765Z Download action repository 'voidzero-dev/setup-vp@v1' (SHA:250f29ce396baf5e8f24498e17c0dfdebabc26eb) 2026-10-22T09:31:25.7645481Z ##[group]Run ./.github/actions/setup-ci-deps 2026-10-22T09:31:25.7645734Z env: 2026-10-22T09:31:25.7645879Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 200 2026-10-22T09:31:25.7646044Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 456 2026-10-22T09:31:25.7646206Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T09:31:25.7646360Z ##[endgroup] 2026-10-22T09:31:25.7771184Z ##[start-action display=Resolve Vite+ version;id=__self.vp] 2026-10-22T09:31:25.7797843Z ##[group]Run echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-22T09:31:25.7798379Z echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-22T09:31:25.7810523Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-22T09:31:25.7810721Z env: 2026-10-22T09:31:25.7810852Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 200 2026-10-22T09:31:25.7811018Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 456 2026-10-22T09:31:25.7811173Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T09:31:25.7811326Z ##[endgroup] 2026-10-22T09:31:25.7871243Z ##[end-action id=__self.vp;outcome=success;conclusion=success;duration_ms=9] 2026-10-22T09:31:25.7873694Z ##[start-action display=Cache Vite+;id=__self.__actions_cache] 2026-10-22T09:31:25.7935983Z ##[group]Run actions/cache@v6 2026-10-22T09:31:25.7936211Z with: 2026-10-22T09:31:25.7936359Z path: ~/.vite-plus 2026-10-22T09:31:25.7936503Z key: vite-plus-home-v1-Linux-X64-1.3.0 2026-10-22T09:31:25.7936677Z enableCrossOsArchive: false 2026-10-22T09:31:25.7936847Z fail-on-cache-miss: false 2026-10-22T09:31:25.7936988Z lookup-only: false 2026-10-22T09:31:25.7937115Z save-always: false 2026-10-22T09:31:25.7937239Z env: 2026-10-22T09:31:25.7937380Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 200 2026-10-22T09:31:25.7937543Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 456 2026-10-22T09:31:25.7937703Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T09:31:25.7937856Z ##[endgroup] 2026-10-22T09:31:26.0244753Z Cache hit for: vite-plus-home-v1-Linux-X64-1.3.0 2026-10-22T09:31:26.3814053Z Received 101854644 of 101854644 (100.0%), 299.8 MBs/sec 2026-10-22T09:31:26.3814449Z Cache Size: ~97 MB (101854644 B) 2026-10-22T09:31:26.3838660Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/bc183122-fd22-4e17-978d-adf47d17d3f7/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-22T09:31:26.9114858Z Cache restored successfully 2026-10-22T09:31:26.9247881Z Cache restored from key: vite-plus-home-v1-Linux-X64-1.3.0 2026-10-22T09:31:26.9331598Z ##[end-action id=__self.__actions_cache;outcome=success;conclusion=success;duration_ms=1145] 2026-10-22T09:31:26.9334381Z ##[start-action display=Setup Vite+;id=__self.__voidzero-dev_setup-vp] 2026-10-22T09:31:26.9381033Z ##[group]Run voidzero-dev/setup-vp@v1 2026-10-22T09:31:26.9381190Z with: 2026-10-22T09:31:26.9381307Z node-version-file: package.json 2026-10-22T09:31:26.9381448Z cache: false 2026-10-22T09:31:26.9381555Z run-install: false 2026-10-22T09:31:26.9381670Z sfw: false 2026-10-22T09:31:26.9381775Z env: 2026-10-22T09:31:26.9381893Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 200 2026-10-22T09:31:26.9382046Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 456 2026-10-22T09:31:26.9382195Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T09:31:26.9382334Z ##[endgroup] 2026-10-22T09:31:27.0201907Z Resolved Node.js version '26.12.1' from package.json 2026-10-22T09:31:27.0318803Z Resolved Vite+ version '1.3.0' from package.json 2026-10-22T09:31:27.0319163Z Installing Vite+@1.3.0... 2026-10-22T09:31:27.0346463Z [command]/usr/bin/bash -c set -o pipefail; curl -fsSL --connect-timeout 5 --max-time 15 https://viteplus.dev/install.sh | bash 2026-10-22T09:31:28.4275258Z info: installing vite-plus@1.3.0... 2026-10-22T09:31:28.4278822Z info: Preparing Node.js and pnpm... 2026-10-22T09:31:29.1934921Z info: Installing dependencies... 2026-10-22T09:31:36.9892722Z ✓ Dependencies installed. 2026-10-22T09:31:36.9902527Z Setup: 2026-10-22T09:31:36.9902687Z Preparing vite-plus environment. 2026-10-22T09:31:36.9902812Z 2026-10-22T09:31:36.9913236Z Created Shims: 2026-10-22T09:31:36.9913388Z /home/runner/.vite-plus/bin/node 2026-10-22T09:31:36.9913610Z /home/runner/.vite-plus/bin/npm 2026-10-22T09:31:36.9913760Z /home/runner/.vite-plus/bin/npx 2026-10-22T09:31:36.9913909Z /home/runner/.vite-plus/bin/pnpm 2026-10-22T09:31:36.9914093Z /home/runner/.vite-plus/bin/pnpx 2026-10-22T09:31:36.9914241Z /home/runner/.vite-plus/bin/pn 2026-10-22T09:31:36.9914390Z /home/runner/.vite-plus/bin/pnx 2026-10-22T09:31:36.9914584Z /home/runner/.vite-plus/bin/yarn 2026-10-22T09:31:36.9915121Z /home/runner/.vite-plus/bin/yarnpkg 2026-10-22T09:31:36.9915563Z /home/runner/.vite-plus/bin/bun 2026-10-22T09:31:36.9916089Z /home/runner/.vite-plus/bin/bunx 2026-10-22T09:31:36.9916407Z /home/runner/.vite-plus/bin/vpx 2026-10-22T09:31:36.9916782Z /home/runner/.vite-plus/bin/vpr 2026-10-22T09:31:36.9917000Z 2026-10-22T09:31:36.9917113Z Next Steps: 2026-10-22T09:31:36.9917404Z For Bash, run: 2026-10-22T09:31:36.9917650Z . "/home/runner/.vite-plus/env" 2026-10-22T09:31:36.9917830Z 2026-10-22T09:31:36.9918030Z If your ~/.bashrc does not already load Vite+, add this command for interactive non-login Bash sessions. 2026-10-22T09:31:36.9918562Z Login Bash shells must also load the command through their login profile. 2026-10-22T09:31:36.9918837Z 2026-10-22T09:31:36.9919006Z Restart an already-running IDE to load its environment. Run `vp env doctor` to verify. 2026-10-22T09:31:36.9919446Z ✓ Vite+ setup complete. 2026-10-22T09:31:36.9963934Z Setting up Node.js 26.12.1 via vp env use... 2026-10-22T09:31:36.9971457Z [command]/home/runner/.vite-plus/bin/vp env use 26.12.1 2026-10-22T09:31:36.9999412Z Installing Node.js v26.12.1... 2026-10-22T09:31:37.6710639Z Using Node.js v26.12.1 (resolved from 26.12.1) 2026-10-22T09:31:37.6779509Z vp v1.3.0 2026-10-22T09:31:37.6779626Z 2026-10-22T09:31:37.6779770Z Local vite-plus: 2026-10-22T09:31:37.6779938Z vite-plus Not found 2026-10-22T09:31:37.6780028Z 2026-10-22T09:31:37.6780077Z Tools: 2026-10-22T09:31:37.6780197Z vite Not found 2026-10-22T09:31:37.6780340Z rolldown Not found 2026-10-22T09:31:37.6780472Z vitest Not found 2026-10-22T09:31:37.6780606Z oxfmt Not found 2026-10-22T09:31:37.6780735Z oxlint Not found 2026-10-22T09:31:37.6780874Z oxlint-tsgolint Not found 2026-10-22T09:31:37.6781008Z tsdown Not found 2026-10-22T09:31:37.6781090Z 2026-10-22T09:31:37.6781142Z Environment: 2026-10-22T09:31:37.6781272Z Package manager pnpm v12.14.0 2026-10-22T09:31:37.6781444Z Node.js v26.12.1 (.session-node-version) 2026-10-22T09:31:37.6835267Z ##[end-action id=__self.__voidzero-dev_setup-vp;outcome=success;conclusion=success;duration_ms=10750] 2026-10-22T09:31:37.6838402Z ##[start-action display=Resolve pnpm store path;id=__self.pnpm_store] 2026-10-22T09:31:37.6855145Z ##[group]Run store_path="$(vp pm cache dir)" 2026-10-22T09:31:37.6855468Z store_path="$(vp pm cache dir)" 2026-10-22T09:31:37.6855750Z echo "path=$store_path" >> "$GITHUB_OUTPUT" 2026-10-22T09:31:37.6875640Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-22T09:31:37.6875950Z env: 2026-10-22T09:31:37.6876155Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 200 2026-10-22T09:31:37.6876422Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 456 2026-10-22T09:31:37.6876678Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T09:31:37.6876926Z ##[endgroup] 2026-10-22T09:31:50.9109038Z ##[end-action id=__self.pnpm_store;outcome=success;conclusion=success;duration_ms=13226] 2026-10-22T09:31:50.9112676Z ##[start-action display=Cache full pnpm store;id=__self.__actions_cache_2] 2026-10-22T09:31:50.9738691Z ##[group]Run actions/cache@v6 2026-10-22T09:31:50.9738844Z with: 2026-10-22T09:31:50.9738980Z path: /home/runner/.local/share/pnpm/store/v11 2026-10-22T09:31:50.9739257Z key: pnpm-full-v1-Linux-X64-d651407d7d0c7ecacd035718e6d120760bb0bb1ea0b966bcda4a8197c80ebc8f 2026-10-22T09:31:50.9739526Z restore-keys: pnpm-full-v1-Linux-X64- 2026-10-22T09:31:50.9739682Z enableCrossOsArchive: false 2026-10-22T09:31:50.9739821Z fail-on-cache-miss: false 2026-10-22T09:31:50.9739948Z lookup-only: false 2026-10-22T09:31:50.9740067Z save-always: false 2026-10-22T09:31:50.9740183Z env: 2026-10-22T09:31:50.9740300Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 200 2026-10-22T09:31:50.9740453Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 456 2026-10-22T09:31:50.9740600Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T09:31:50.9740739Z ##[endgroup] 2026-10-22T09:31:51.1769652Z Cache hit for: pnpm-full-v1-Linux-X64-d651407d7d0c7ecacd035718e6d120760bb0bb1ea0b966bcda4a8197c80ebc8f 2026-10-22T09:31:52.2028824Z Received 402653184 of 994453879 (40.5%), 381.0 MBs/sec 2026-10-22T09:31:53.2043079Z Received 939524096 of 994453879 (94.5%), 446.0 MBs/sec 2026-10-22T09:31:53.2855256Z Received 994453879 of 994453879 (100.0%), 453.6 MBs/sec 2026-10-22T09:31:53.2858586Z Cache Size: ~948 MB (994453879 B) 2026-10-22T09:31:53.2882613Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/306d03c7-fc44-4c73-96d1-328a6d536ee7/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-22T09:31:59.2109996Z Cache restored successfully 2026-10-22T09:31:59.2708976Z Cache restored from key: pnpm-full-v1-Linux-X64-d651407d7d0c7ecacd035718e6d120760bb0bb1ea0b966bcda4a8197c80ebc8f 2026-10-22T09:31:59.2870461Z ##[end-action id=__self.__actions_cache_2;outcome=success;conclusion=success;duration_ms=8375] 2026-10-22T09:31:59.2874329Z ##[start-action display=Install dependencies;id=__self.__run] 2026-10-22T09:31:59.2893881Z ##[group]Run vp install 2026-10-22T09:31:59.2894136Z vp install 2026-10-22T09:31:59.2911744Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-22T09:31:59.2912039Z env: 2026-10-22T09:31:59.2912211Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 200 2026-10-22T09:31:59.2912469Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 456 2026-10-22T09:31:59.2912738Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T09:31:59.2912964Z ##[endgroup] 2026-10-22T09:31:59.3549932Z Scope: all 33 workspace projects 2026-10-22T09:31:59.4866856Z ? Verifying lockfile against supply-chain policies (2088 entries)... 2026-10-22T09:31:59.8974153Z Packages are hard linked from the content-addressable store to the virtual store. 2026-10-22T09:31:59.8975035Z Content-addressable store is at: /home/runner/.local/share/pnpm/store/v11 2026-10-22T09:31:59.8975854Z Virtual store is at: node_modules/.pnpm 2026-10-22T09:32:02.2077155Z ✓ Lockfile passes supply-chain policies (2088 entries in 2.7s) 2026-10-22T09:32:02.2077615Z Lockfile is up to date, resolution step is skipped 2026-10-22T09:32:02.2338195Z Packages: +1721 2026-10-22T09:32:02.2338597Z ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2026-10-22T09:32:02.2915357Z Progress: resolved 1721, reused 1718, downloaded 0, added 1721, done 2026-10-22T09:32:03.4763072Z . prepare$ vp config --no-agent 2026-10-22T09:32:03.6111281Z . prepare: Done 2026-10-22T09:32:03.6129707Z 2026-10-22T09:32:03.6130033Z devDependencies: 2026-10-22T09:32:03.6130207Z + @coderabbitai/config 1.1.0 2026-10-22T09:32:03.6130386Z + @shadcn/lint 0.1.5 2026-10-22T09:32:03.6130559Z + @types/node 24.12.4 2026-10-22T09:32:03.6130704Z + knip 6.34.0 2026-10-22T09:32:03.6130912Z + typescript <- @tsc-rs/typescript 0.8.0 2026-10-22T09:32:03.6131086Z + vite-plus 1.3.0 2026-10-22T09:32:03.6131159Z 2026-10-22T09:32:03.6148886Z Done in 4.3s using pnpm v12.14.0 2026-10-22T09:32:03.6332219Z ##[end-action id=__self.__run;outcome=success;conclusion=success;duration_ms=4345] 2026-10-22T09:32:03.7311635Z ##[group]Run actions/cache@v6 2026-10-22T09:32:03.7312043Z with: 2026-10-22T09:32:03.7312269Z path: ~/.cache/electron 2026-10-22T09:32:03.7312707Z key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-22T09:32:03.7313163Z enableCrossOsArchive: false 2026-10-22T09:32:03.7313421Z fail-on-cache-miss: false 2026-10-22T09:32:03.7313660Z lookup-only: false 2026-10-22T09:32:03.7313871Z save-always: false 2026-10-22T09:32:03.7314084Z env: 2026-10-22T09:32:03.7314291Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 200 2026-10-22T09:32:03.7314580Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 456 2026-10-22T09:32:03.7314884Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T09:32:03.7315151Z ##[endgroup] 2026-10-22T09:32:03.9660935Z Cache hit for: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-22T09:32:04.2462559Z Received 122906203 of 122906203 (100.0%), 467.0 MBs/sec 2026-10-22T09:32:04.2464178Z Cache Size: ~117 MB (122906203 B) 2026-10-22T09:32:04.2531205Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/8f1cb199-d130-479d-865b-b1f6ca11663e/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-22T09:32:04.3546290Z Cache restored successfully 2026-10-22T09:32:04.3765653Z Cache restored from key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-22T09:32:04.3983886Z ##[group]Run vp run --filter @t3tools/desktop ensure:electron 2026-10-22T09:32:04.3984246Z vp run --filter @t3tools/desktop ensure:electron 2026-10-22T09:32:04.4002375Z shell: /usr/bin/bash -e {0} 2026-10-22T09:32:04.4002558Z env: 2026-10-22T09:32:04.4002764Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 200 2026-10-22T09:32:04.4002957Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 456 2026-10-22T09:32:04.4003131Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T09:32:04.4003302Z ##[endgroup] 2026-10-22T09:32:04.6804026Z ~/apps/desktop$ node scripts/ensure-electron-runtime.mjs ⊘ cache disabled 2026-10-22T09:32:05.3634507Z /home/runner/_work/t3code/t3code/node_modules/.pnpm/electron@44.9.3_supports-color@8.1.1/node_modules/electron/dist/electron 2026-10-22T09:32:05.3681699Z 2026-10-22T09:32:05.3969339Z ##[group]Run vp run knip:check 2026-10-22T09:32:05.3969579Z vp run knip:check 2026-10-22T09:32:05.3989528Z shell: /usr/bin/bash -e {0} 2026-10-22T09:32:05.3989699Z env: 2026-10-22T09:32:05.3989839Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 200 2026-10-22T09:32:05.3990079Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 456 2026-10-22T09:32:05.3990271Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T09:32:05.3990433Z ##[endgroup] 2026-10-22T09:32:05.6137612Z $ knip --include files,dependencies --no-config-hints ⊘ cache disabled 2026-10-22T09:32:11.3024104Z 2026-10-22T09:32:11.3029421Z $ 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-22T09:32:52.6974222Z 2026-10-22T09:32:52.6976174Z --- 2026-10-22T09:32:52.6976641Z vp run: 2/2 successful. (Run `vp run --last-details` for full details) 2026-10-22T09:32:52.7131914Z ##[group]Run vp run --filter @t3tools/source-control-github generate --check 2026-10-22T09:32:52.7132456Z vp run --filter @t3tools/source-control-github generate --check 2026-10-22T09:32:52.7145073Z shell: /usr/bin/bash -e {0} 2026-10-22T09:32:52.7145269Z env: 2026-10-22T09:32:52.7145404Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 200 2026-10-22T09:32:52.7145565Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 456 2026-10-22T09:32:52.7145716Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T09:32:52.7145865Z ##[endgroup] 2026-10-22T09:32:52.9308878Z ~/packages/source-control-github$ graphqlgen --check ⊘ cache disabled 2026-10-22T09:32:53.2351486Z 2026-10-22T09:32:53.2497558Z ##[group]Run vp run --filter t3 generate --check 2026-10-22T09:32:53.2497913Z vp run --filter t3 generate --check 2026-10-22T09:32:53.2516206Z shell: /usr/bin/bash -e {0} 2026-10-22T09:32:53.2516481Z env: 2026-10-22T09:32:53.2516768Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 200 2026-10-22T09:32:53.2517110Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 456 2026-10-22T09:32:53.2517432Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T09:32:53.2517676Z ##[endgroup] 2026-10-22T09:32:53.4529222Z ~/apps/server$ graphqlgen --check ⊘ cache disabled 2026-10-22T09:32:53.6451490Z 2026-10-22T09:32:53.6545578Z ##[group]Run vp check 2026-10-22T09:32:53.6545769Z vp check 2026-10-22T09:32:53.6558010Z shell: /usr/bin/bash -e {0} 2026-10-22T09:32:53.6558160Z env: 2026-10-22T09:32:53.6558287Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 200 2026-10-22T09:32:53.6558454Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 456 2026-10-22T09:32:53.6558614Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T09:32:53.6558760Z ##[endgroup] 2026-10-22T09:32:54.4788615Z pass: All 5649 files are correctly formatted (600ms, 8 threads) 2026-10-22T09:33:04.2134678Z warn: Lint warnings found 2026-10-22T09:33:04.2136202Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-22T09:33:04.2136844Z ╭─[scripts/lib/cli-external-packages.test.ts:114:11] 2026-10-22T09:33:04.2137185Z 113 │ const declared = { 2026-10-22T09:33:04.2137500Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-22T09:33:04.2137911Z ·  ──────────────────────────────── 2026-10-22T09:33:04.2138347Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-22T09:33:04.2138648Z ╰──── 2026-10-22T09:33:04.2139197Z  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-22T09:33:04.2139642Z 2026-10-22T09:33:04.2140037Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-22T09:33:04.2140654Z ╭─[scripts/lib/cli-external-packages.test.ts:115:11] 2026-10-22T09:33:04.2141030Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-22T09:33:04.2141366Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-22T09:33:04.2141938Z ·  ──────────────────────────────────────── 2026-10-22T09:33:04.2142304Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-22T09:33:04.2142586Z ╰──── 2026-10-22T09:33:04.2143129Z  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-22T09:33:04.2143551Z 2026-10-22T09:33:04.2143917Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-22T09:33:04.2145226Z ╭─[scripts/lib/cli-external-packages.test.ts:116:11] 2026-10-22T09:33:04.2145638Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-22T09:33:04.2145982Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-22T09:33:04.2146362Z ·  ──────────────────────────────────── 2026-10-22T09:33:04.2146655Z 117 │ }; 2026-10-22T09:33:04.2146862Z ╰──── 2026-10-22T09:33:04.2147392Z  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-22T09:33:04.2147815Z 2026-10-22T09:33:04.2148210Z ⚠ unicorn(prefer-string-starts-ends-with): Prefer String#startsWith over a regex with a caret. 2026-10-22T09:33:04.2148807Z ╭─[apps/server/src/vcs/GitVcsDriverCore.ts:509:11] 2026-10-22T09:33:04.2149231Z 508 │ GIT_DIAGNOSTIC_LINE_PATTERN.test(line) || 2026-10-22T09:33:04.2149660Z 509 │ (!/^remote:/.test(line) && SSH_TRANSPORT_REFUSAL_PATTERN.test(line)), 2026-10-22T09:33:04.2150040Z ·  ─────────────── 2026-10-22T09:33:04.2150295Z 510 │ ) 2026-10-22T09:33:04.2150486Z ╰──── 2026-10-22T09:33:04.2150828Z  help: Replace `/^remote:/.test(line)` with `line.startsWith('remote:')`. 2026-10-22T09:33:04.2151096Z 2026-10-22T09:33:04.2151328Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.2151780Z ╭─[apps/mobile/src/components/ui/Menu.tsx:54:36] 2026-10-22T09:33:04.2152291Z 53 │ const child = children as ReactElement>; 2026-10-22T09:33:04.2152876Z 54 │ ╭─▶ children = cloneElement(child, { 2026-10-22T09:33:04.2153715Z 55 │ │ onTouchStart: (event) => { 2026-10-22T09:33:04.2154338Z 56 │ │ // Reset for a new touch, not onPressIn, which also fires when a 2026-10-22T09:33:04.2154859Z 57 │ │ // finger moves out of the row and back during the same gesture. 2026-10-22T09:33:04.2155382Z 58 │ │ menuPress.current.isPreparing = false; 2026-10-22T09:33:04.2155874Z 59 │ │ menuPress.current.suppressPress = menuPress.current.isOpen; 2026-10-22T09:33:04.2156360Z 60 │ │ pendingPress.current = null; 2026-10-22T09:33:04.2156754Z 61 │ │ child.props.onTouchStart?.(event); 2026-10-22T09:33:04.2157126Z 62 │ │ }, 2026-10-22T09:33:04.2157442Z 63 │ │ onPress: (event) => { 2026-10-22T09:33:04.2157947Z 64 │ │ // Accessibility clicks have no touch identifier and must not inherit 2026-10-22T09:33:04.2158510Z 65 │ │ // cancellation from a previous physical gesture. 2026-10-22T09:33:04.2159034Z 66 │ │ const isTouch = typeof event.nativeEvent.identifier === "number"; 2026-10-22T09:33:04.2159673Z 67 │ │ if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) { 2026-10-22T09:33:04.2160151Z 68 │ │ return; 2026-10-22T09:33:04.2160466Z 69 │ │ } 2026-10-22T09:33:04.2160869Z 70 │ │ if (isTouch && menuPress.current.isPreparing) { 2026-10-22T09:33:04.2161416Z 71 │ │ // A release can arrive between native menu preparation and display. 2026-10-22T09:33:04.2162044Z 72 │ │ // Let UIKit's display/cancel callback decide this press's outcome. 2026-10-22T09:33:04.2162507Z 73 │ │ event.persist(); 2026-10-22T09:33:04.2162997Z 74 │ │ pendingPress.current = () => child.props.onPress?.(event); 2026-10-22T09:33:04.2163436Z 75 │ │ return; 2026-10-22T09:33:04.2163752Z 76 │ │ } 2026-10-22T09:33:04.2164165Z 77 │ │ child.props.onPress?.(event); 2026-10-22T09:33:04.2164531Z 78 │ │ }, 2026-10-22T09:33:04.2164942Z 79 │ ├─▶ }); 2026-10-22T09:33:04.2165593Z · ╰──── Passing a ref to a function may read its value during render 2026-10-22T09:33:04.2166152Z 80 │ menuProps.onMenuInteractionStart = () => { 2026-10-22T09:33:04.2166457Z ╰──── 2026-10-22T09:33:04.2167648Z  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-22T09:33:04.2169133Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.2169633Z 2026-10-22T09:33:04.2169983Z ⚠ eslint(no-unused-vars): Identifier 'Arr' is imported but never used. 2026-10-22T09:33:04.2170561Z ╭─[packages/client-runtime/src/state/threadSort.ts:4:13] 2026-10-22T09:33:04.2171520Z 3 │ import type { EnvironmentThreadShell } from "./models.ts"; 2026-10-22T09:33:04.2172066Z 4 │ import * as Arr from "effect/Array"; 2026-10-22T09:33:04.2172380Z ·  ─┬─ 2026-10-22T09:33:04.2172765Z · ╰── 'Arr' is imported here 2026-10-22T09:33:04.2173144Z 5 │ import * as Order from "effect/Order"; 2026-10-22T09:33:04.2173424Z ╰──── 2026-10-22T09:33:04.2173703Z  help: Consider removing this import. 2026-10-22T09:33:04.2173904Z 2026-10-22T09:33:04.2174314Z ⚠ eslint(no-unused-vars): Identifier 'Order' is imported but never used. 2026-10-22T09:33:04.2174908Z ╭─[packages/client-runtime/src/state/threadSort.ts:5:13] 2026-10-22T09:33:04.2175309Z 4 │ import * as Arr from "effect/Array"; 2026-10-22T09:33:04.2175641Z 5 │ import * as Order from "effect/Order"; 2026-10-22T09:33:04.2175961Z ·  ──┬── 2026-10-22T09:33:04.2176376Z · ╰── 'Order' is imported here 2026-10-22T09:33:04.2176707Z 6 │ 2026-10-22T09:33:04.2176907Z ╰──── 2026-10-22T09:33:04.2177183Z  help: Consider removing this import. 2026-10-22T09:33:04.2177394Z 2026-10-22T09:33:04.2178046Z ⚠ 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-22T09:33:04.2178885Z ╭─[apps/server/src/vcs/GitVcsDriverCore.test.ts:1713:34] 2026-10-22T09:33:04.2179402Z 1712 │ const stat = branch.files!.find((file) => file.path === path)!; 2026-10-22T09:33:04.2179940Z 1713 │ const request = yield* Schema.decodeEffect(ReviewDiffPreviewInput)({ 2026-10-22T09:33:04.2180448Z ·  ─────────────────── 2026-10-22T09:33:04.2180767Z 1714 │ cwd, 2026-10-22T09:33:04.2181001Z ╰──── 2026-10-22T09:33:04.2181101Z 2026-10-22T09:33:04.2181490Z ⚠ eslint(no-unused-vars): Function 'describeSchedule' is declared but never used. 2026-10-22T09:33:04.2182083Z ╭─[apps/server/src/scheduledTasks/Schedule.ts:79:10] 2026-10-22T09:33:04.2182425Z 78 │ 2026-10-22T09:33:04.2182757Z 79 │ function describeSchedule(schedule: ScheduledTaskSchedule): string { 2026-10-22T09:33:04.2183170Z ·  ────────┬─────── 2026-10-22T09:33:04.2183610Z · ╰── 'describeSchedule' is declared here 2026-10-22T09:33:04.2184133Z 80 │ if (schedule.type === "webhook") return "On webhook"; 2026-10-22T09:33:04.2184906Z ╰──── 2026-10-22T09:33:04.2185221Z  help: Consider removing this declaration. 2026-10-22T09:33:04.2185448Z 2026-10-22T09:33:04.2186342Z ⚠ 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-22T09:33:04.2187392Z ╭─[packages/client-runtime/src/rpc/client.test.ts:131:9] 2026-10-22T09:33:04.2187771Z 130 │ ) { 2026-10-22T09:33:04.2188290Z 131 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-22T09:33:04.2188869Z 132 │ │ if (subscriptions.length >= count) { 2026-10-22T09:33:04.2189286Z 133 │ │ return; 2026-10-22T09:33:04.2189624Z 134 │ │ } 2026-10-22T09:33:04.2190356Z 135 │ │ yield* Effect.yieldNow; 2026-10-22T09:33:04.2190936Z 136 │ ╰─▶ } 2026-10-22T09:33:04.2191495Z 137 │ return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`)); 2026-10-22T09:33:04.2191907Z ╰──── 2026-10-22T09:33:04.2192015Z 2026-10-22T09:33:04.2192899Z ⚠ 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-22T09:33:04.2193941Z ╭─[packages/client-runtime/src/rpc/client.test.ts:252:7] 2026-10-22T09:33:04.2194575Z 251 │ yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient))); 2026-10-22T09:33:04.2195370Z 252 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) { 2026-10-22T09:33:04.2196003Z 253 │ │ yield* Effect.yieldNow; 2026-10-22T09:33:04.2196475Z 254 │ ╰─▶ } 2026-10-22T09:33:04.2196970Z 255 │ yield* SubscriptionRef.set(activeSession, Option.none()); 2026-10-22T09:33:04.2197318Z ╰──── 2026-10-22T09:33:04.2197426Z 2026-10-22T09:33:04.2198296Z ⚠ 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-22T09:33:04.2226319Z ╭─[packages/client-runtime/src/rpc/client.test.ts:258:7] 2026-10-22T09:33:04.2226682Z 257 │ 2026-10-22T09:33:04.2227253Z 258 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-22T09:33:04.2227804Z 259 │ │ yield* Effect.yieldNow; 2026-10-22T09:33:04.2228218Z 260 │ ╰─▶ } 2026-10-22T09:33:04.2228605Z 261 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-22T09:33:04.2228893Z ╰──── 2026-10-22T09:33:04.2228986Z 2026-10-22T09:33:04.2229752Z ⚠ 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-22T09:33:04.2230649Z ╭─[packages/client-runtime/src/rpc/client.test.ts:322:7] 2026-10-22T09:33:04.2230992Z 321 │ ); 2026-10-22T09:33:04.2231533Z 322 │ ╭─▶ for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) { 2026-10-22T09:33:04.2232070Z 323 │ │ yield* Effect.yieldNow; 2026-10-22T09:33:04.2232479Z 324 │ ╰─▶ } 2026-10-22T09:33:04.2232782Z 325 │ 2026-10-22T09:33:04.2232973Z ╰──── 2026-10-22T09:33:04.2233066Z 2026-10-22T09:33:04.2233811Z ⚠ 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-22T09:33:04.2234732Z ╭─[packages/client-runtime/src/rpc/client.test.ts:330:7] 2026-10-22T09:33:04.2235757Z 329 │ yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient))); 2026-10-22T09:33:04.2236547Z 330 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-22T09:33:04.2237072Z 331 │ │ yield* Effect.yieldNow; 2026-10-22T09:33:04.2237471Z 332 │ ╰─▶ } 2026-10-22T09:33:04.2237855Z 333 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-22T09:33:04.2238130Z ╰──── 2026-10-22T09:33:04.2238218Z 2026-10-22T09:33:04.2238457Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.2238902Z ╭─[apps/mobile/src/native/StackHeader.tsx:184:9] 2026-10-22T09:33:04.2239214Z 183 │ "options", 2026-10-22T09:33:04.2239512Z 184 │ latestOptionFunctionsRef.current, 2026-10-22T09:33:04.2239904Z ·  ────────────────┬─────────────── 2026-10-22T09:33:04.2240439Z · ╰── Passing a ref to a function may read its value during render 2026-10-22T09:33:04.2240939Z 185 │ optionFunctionWrappersRef.current, 2026-10-22T09:33:04.2241232Z ╰──── 2026-10-22T09:33:04.2242186Z  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-22T09:33:04.2243443Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.2243785Z 2026-10-22T09:33:04.2243954Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.2244346Z ╭─[apps/mobile/src/native/StackHeader.tsx:185:9] 2026-10-22T09:33:04.2244590Z 184 │ latestOptionFunctionsRef.current, 2026-10-22T09:33:04.2244805Z 185 │ optionFunctionWrappersRef.current, 2026-10-22T09:33:04.2245053Z ·  ────────────────┬──────────────── 2026-10-22T09:33:04.2245376Z · ╰── Passing a ref to a function may read its value during render 2026-10-22T09:33:04.2245677Z 186 │ ) as NativeStackNavigationOptions) 2026-10-22T09:33:04.2245855Z ╰──── 2026-10-22T09:33:04.2246628Z  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-22T09:33:04.2247431Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.2247725Z 2026-10-22T09:33:04.2248210Z ⚠ 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-22T09:33:04.2248792Z ╭─[packages/client-runtime/src/rpc/session.test.ts:226:3] 2026-10-22T09:33:04.2249007Z 225 │ ) { 2026-10-22T09:33:04.2249292Z 226 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-22T09:33:04.2249616Z 227 │ │ const socket = sockets[index]; 2026-10-22T09:33:04.2249841Z 228 │ │ if (socket) { 2026-10-22T09:33:04.2250063Z 229 │ │ return socket; 2026-10-22T09:33:04.2250258Z 230 │ │ } 2026-10-22T09:33:04.2250473Z 231 │ │ yield* Effect.yieldNow; 2026-10-22T09:33:04.2250731Z 232 │ ╰─▶ } 2026-10-22T09:33:04.2251059Z 233 │ return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket.")); 2026-10-22T09:33:04.2251303Z ╰──── 2026-10-22T09:33:04.2251366Z 2026-10-22T09:33:04.2251853Z ⚠ 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-22T09:33:04.2252430Z ╭─[packages/client-runtime/src/rpc/session.test.ts:240:3] 2026-10-22T09:33:04.2252645Z 239 │ ) { 2026-10-22T09:33:04.2252922Z 240 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-22T09:33:04.2253346Z 241 │ │ const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index]; 2026-10-22T09:33:04.2253656Z 242 │ │ if (request) { 2026-10-22T09:33:04.2253874Z 243 │ │ return request; 2026-10-22T09:33:04.2254127Z 244 │ │ } 2026-10-22T09:33:04.2254342Z 245 │ │ yield* Effect.yieldNow; 2026-10-22T09:33:04.2254592Z 246 │ ╰─▶ } 2026-10-22T09:33:04.2254914Z 247 │ return yield* Effect.die(new Error("Expected the RPC protocol to send a request.")); 2026-10-22T09:33:04.2255149Z ╰──── 2026-10-22T09:33:04.2255212Z 2026-10-22T09:33:04.2255693Z ⚠ 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-22T09:33:04.2256311Z ╭─[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:521:13] 2026-10-22T09:33:04.2256582Z 520 │ })).delivery; 2026-10-22T09:33:04.2256878Z 521 │ ╭─▶ while (delivery.outcome === "accepted") { 2026-10-22T09:33:04.2257195Z 522 │ │ yield* Effect.yieldNow; 2026-10-22T09:33:04.2257702Z 523 │ │ delivery = (yield* service.getWebhookDelivery({ 2026-10-22T09:33:04.2258021Z 524 │ │ id: task.id, 2026-10-22T09:33:04.2258273Z 525 │ │ deliveryId: deliveryId!, 2026-10-22T09:33:04.2258512Z 526 │ │ })).delivery; 2026-10-22T09:33:04.2258778Z 527 │ ╰─▶ } 2026-10-22T09:33:04.2259055Z 528 │ assert.equal(delivery.outcome, "dispatch_failed"); 2026-10-22T09:33:04.2259250Z ╰──── 2026-10-22T09:33:04.2259318Z 2026-10-22T09:33:04.2259543Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-22T09:33:04.2259908Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:229:6] 2026-10-22T09:33:04.2260240Z 225 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-22T09:33:04.2260518Z 226 │ nativeEventSnapshotsRef.current, 2026-10-22T09:33:04.2260739Z ·  ───────────┬─────────── 2026-10-22T09:33:04.2261330Z · ╰── 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-22T09:33:04.2261835Z 227 │ mostRecentEventCount, 2026-10-22T09:33:04.2262001Z 228 │ ); 2026-10-22T09:33:04.2262209Z 229 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-22T09:33:04.2262494Z ·  ──────────────────────────┬────────────────────────── 2026-10-22T09:33:04.2262848Z · ╰── This dependency list is missing values used by the callback 2026-10-22T09:33:04.2263141Z 230 │ const assumedValue = props.value; 2026-10-22T09:33:04.2263310Z ╰──── 2026-10-22T09:33:04.2263550Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-22T09:33:04.2264120Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.2264429Z 2026-10-22T09:33:04.2264834Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-22T09:33:04.2265202Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:237:7] 2026-10-22T09:33:04.2265507Z 236 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-22T09:33:04.2265778Z 237 │ nativeEventSnapshotsRef.current, 2026-10-22T09:33:04.2265989Z ·  ───────────┬─────────── 2026-10-22T09:33:04.2266577Z · ╰── 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-22T09:33:04.2267076Z 238 │ controlledEventCount, 2026-10-22T09:33:04.2267256Z 239 │ assumedValue, 2026-10-22T09:33:04.2267411Z 240 │ ); 2026-10-22T09:33:04.2267651Z 241 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-22T09:33:04.2267973Z ·  ───────────┬────────── 2026-10-22T09:33:04.2268572Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-22T09:33:04.2268944Z 242 │ const acceptNativeEvent = useCallback( 2026-10-22T09:33:04.2269114Z ╰──── 2026-10-22T09:33:04.2269615Z  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-22T09:33:04.2270346Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.2270662Z 2026-10-22T09:33:04.2270827Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.2271124Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:162:29] 2026-10-22T09:33:04.2271410Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-22T09:33:04.2271676Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-22T09:33:04.2271929Z ·  ─────────────┬──────────── 2026-10-22T09:33:04.2272230Z · ╰── Cannot access ref value during render 2026-10-22T09:33:04.2272458Z 163 │ }); 2026-10-22T09:33:04.2272587Z ╰──── 2026-10-22T09:33:04.2273130Z  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-22T09:33:04.2273880Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.2274213Z 2026-10-22T09:33:04.2274363Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.2274666Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:162:29] 2026-10-22T09:33:04.2274942Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-22T09:33:04.2275210Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-22T09:33:04.2275464Z ·  ─────────────┬──────────── 2026-10-22T09:33:04.2275810Z · ╰── Passing a ref to a function may read its value during render 2026-10-22T09:33:04.2276070Z 163 │ }); 2026-10-22T09:33:04.2276199Z ╰──── 2026-10-22T09:33:04.2276748Z  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-22T09:33:04.2277889Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.2278186Z 2026-10-22T09:33:04.2278349Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.2278662Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:23] 2026-10-22T09:33:04.2278883Z 163 │ }); 2026-10-22T09:33:04.2279083Z 164 │ confirmedTokensRef.current = tokens; 2026-10-22T09:33:04.2279340Z ·  ─────────┬────────────┬─── 2026-10-22T09:33:04.2279784Z · │ ╰── Cannot update ref value during render 2026-10-22T09:33:04.2280163Z · ╰── This value is a ref 2026-10-22T09:33:04.2280376Z 165 │ return JSON.stringify( 2026-10-22T09:33:04.2280530Z ╰──── 2026-10-22T09:33:04.2281077Z  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-22T09:33:04.2281822Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.2282116Z 2026-10-22T09:33:04.2282275Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.2282579Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:206:5] 2026-10-22T09:33:04.2282817Z 205 │ mostRecentEventCount, 2026-10-22T09:33:04.2283011Z 206 │ nativeEventSnapshotsRef.current, 2026-10-22T09:33:04.2283239Z ·  ───────────────┬─────────────── 2026-10-22T09:33:04.2283556Z · ╰── Passing a ref to a function may read its value during render 2026-10-22T09:33:04.2283810Z 207 │ ); 2026-10-22T09:33:04.2283945Z ╰──── 2026-10-22T09:33:04.2284555Z  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-22T09:33:04.2285304Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.2285598Z 2026-10-22T09:33:04.2285754Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.2286054Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:212:5] 2026-10-22T09:33:04.2286287Z 211 │ mostRecentEventCount, 2026-10-22T09:33:04.2286476Z 212 │ nativeEventSnapshotsRef.current, 2026-10-22T09:33:04.2286699Z ·  ───────────────┬─────────────── 2026-10-22T09:33:04.2287009Z · ╰── Passing a ref to a function may read its value during render 2026-10-22T09:33:04.2287258Z 213 │ ); 2026-10-22T09:33:04.2287377Z ╰──── 2026-10-22T09:33:04.2287922Z  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-22T09:33:04.2288673Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.2288962Z 2026-10-22T09:33:04.2289167Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-22T09:33:04.2289500Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:197:6] 2026-10-22T09:33:04.2289795Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-22T09:33:04.2290061Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-22T09:33:04.2290322Z ·  ─────────┬──────── 2026-10-22T09:33:04.2291051Z · ╰── 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-22T09:33:04.2291603Z 163 │ }); 2026-10-22T09:33:04.2291777Z 164 │ confirmedTokensRef.current = tokens; 2026-10-22T09:33:04.2291985Z 165 │ return JSON.stringify( 2026-10-22T09:33:04.2292260Z 166 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-22T09:33:04.2292517Z 167 │ const record = 2026-10-22T09:33:04.2292701Z 168 │ token.type === "context" 2026-10-22T09:33:04.2292983Z 169 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-22T09:33:04.2293234Z 170 │ : undefined; 2026-10-22T09:33:04.2293436Z 171 │ const presentation = contextChipPresentation( 2026-10-22T09:33:04.2293693Z 172 │ token.type === "context" ? token.kind : token.type, 2026-10-22T09:33:04.2293899Z 173 │ record, 2026-10-22T09:33:04.2294097Z 174 │ ); 2026-10-22T09:33:04.2294264Z 175 │ const icon = contextChipIcon( 2026-10-22T09:33:04.2294448Z 176 │ presentation, 2026-10-22T09:33:04.2294694Z 177 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-22T09:33:04.2294914Z 178 │ ); 2026-10-22T09:33:04.2295059Z 179 │ return { 2026-10-22T09:33:04.2295219Z 180 │ type: token.type, 2026-10-22T09:33:04.2295396Z 181 │ source: token.source, 2026-10-22T09:33:04.2295573Z 182 │ start: token.start, 2026-10-22T09:33:04.2295746Z 183 │ end: token.end, 2026-10-22T09:33:04.2295927Z 184 │ accent: presentation.accent, 2026-10-22T09:33:04.2296111Z 185 │ label: 2026-10-22T09:33:04.2296279Z 186 │ token.type === "skill" 2026-10-22T09:33:04.2296496Z 187 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-22T09:33:04.2296718Z 188 │ : token.type === "context" 2026-10-22T09:33:04.2297073Z 189 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-22T09:33:04.2297403Z 190 │ : basename(token.value), 2026-10-22T09:33:04.2297658Z 191 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-22T09:33:04.2297923Z 192 │ iconUri: contextChipIconUri(icon), 2026-10-22T09:33:04.2298143Z 193 │ tintsIcon: icon.kind === "chip", 2026-10-22T09:33:04.2298321Z 194 │ }; 2026-10-22T09:33:04.2298456Z 195 │ }), 2026-10-22T09:33:04.2298594Z 196 │ ); 2026-10-22T09:33:04.2298863Z 197 │ }, [props.value, props.context, skillLabels]); 2026-10-22T09:33:04.2299161Z ·  ────────────────────┬──────────────────── 2026-10-22T09:33:04.2299498Z · ╰── This dependency list is missing values used by the callback 2026-10-22T09:33:04.2299834Z 198 │ // Every render resolves against the snapshot history, so a render whose 2026-10-22T09:33:04.2300055Z ╰──── 2026-10-22T09:33:04.2300337Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-22T09:33:04.2300889Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.2301203Z 2026-10-22T09:33:04.2301404Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-22T09:33:04.2301746Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:259:5] 2026-10-22T09:33:04.2302032Z 251 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-22T09:33:04.2302297Z 252 │ nativeEventSnapshotsRef.current.push({ 2026-10-22T09:33:04.2302517Z ·  ───────────┬─────────── 2026-10-22T09:33:04.2303110Z · ╰── 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-22T09:33:04.2303638Z 253 │ eventCount: acknowledgedEventCount, 2026-10-22T09:33:04.2303832Z 254 │ value, 2026-10-22T09:33:04.2304018Z 255 │ selection: nextSelection, 2026-10-22T09:33:04.2304204Z 256 │ }); 2026-10-22T09:33:04.2304377Z 257 │ return acknowledgedEventCount; 2026-10-22T09:33:04.2305168Z 258 │ }, 2026-10-22T09:33:04.2305302Z 259 │ [], 2026-10-22T09:33:04.2305451Z ·  ─┬ 2026-10-22T09:33:04.2305737Z · ╰── This dependency list is missing values used by the callback 2026-10-22T09:33:04.2305976Z 260 │ ); 2026-10-22T09:33:04.2306098Z ╰──── 2026-10-22T09:33:04.2306372Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-22T09:33:04.2306918Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.2307232Z 2026-10-22T09:33:04.2307721Z ⚠ 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-22T09:33:04.2308317Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:169:7] 2026-10-22T09:33:04.2308542Z 168 │ }); 2026-10-22T09:33:04.2308836Z 169 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-22T09:33:04.2309226Z 170 │ │ if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break; 2026-10-22T09:33:04.2309546Z 171 │ │ yield* Effect.yieldNow; 2026-10-22T09:33:04.2309810Z 172 │ ╰─▶ } 2026-10-22T09:33:04.2310015Z 173 │ 2026-10-22T09:33:04.2310139Z ╰──── 2026-10-22T09:33:04.2310389Z 2026-10-22T09:33:04.2310936Z ⚠ 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-22T09:33:04.2311526Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:178:7] 2026-10-22T09:33:04.2311808Z 177 │ yield* Deferred.succeed(releaseSave, undefined); 2026-10-22T09:33:04.2312137Z 178 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-22T09:33:04.2312472Z 179 │ │ if ((yield* Ref.get(saved)).length > 0) break; 2026-10-22T09:33:04.2312727Z 180 │ │ yield* Effect.yieldNow; 2026-10-22T09:33:04.2312998Z 181 │ ╰─▶ } 2026-10-22T09:33:04.2313202Z 182 │ 2026-10-22T09:33:04.2313331Z ╰──── 2026-10-22T09:33:04.2313390Z 2026-10-22T09:33:04.2313869Z ⚠ 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-22T09:33:04.2314481Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7] 2026-10-22T09:33:04.2314770Z 306 │ yield* Deferred.succeed(releaseUnenrichedSave, undefined); 2026-10-22T09:33:04.2315116Z 307 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-22T09:33:04.2315431Z 308 │ │ const values = yield* Ref.get(saved); 2026-10-22T09:33:04.2315789Z 309 │ │ if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) { 2026-10-22T09:33:04.2316080Z 310 │ │ break; 2026-10-22T09:33:04.2316278Z 311 │ │ } 2026-10-22T09:33:04.2316490Z 312 │ │ yield* Effect.yieldNow; 2026-10-22T09:33:04.2316756Z 313 │ ╰─▶ } 2026-10-22T09:33:04.2316962Z 314 │ 2026-10-22T09:33:04.2317087Z ╰──── 2026-10-22T09:33:04.2317146Z 2026-10-22T09:33:04.2317360Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-22T09:33:04.2317711Z ╭─[packages/client-runtime/src/state/usageAccess.ts:3:8] 2026-10-22T09:33:04.2317937Z 2 │ AuthDiagnosticsReadScope, 2026-10-22T09:33:04.2318118Z 3 │ type AuthSessionState, 2026-10-22T09:33:04.2318317Z ·  ────────┬─────── 2026-10-22T09:33:04.2318577Z · ╰── 'AuthSessionState' is imported here 2026-10-22T09:33:04.2318809Z 4 │ sessionGrantsScope, 2026-10-22T09:33:04.2318959Z ╰──── 2026-10-22T09:33:04.2319131Z  help: Consider removing this import. 2026-10-22T09:33:04.2319257Z 2026-10-22T09:33:04.2319461Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-22T09:33:04.2319808Z ╭─[packages/client-runtime/src/state/shell.ts:189:5] 2026-10-22T09:33:04.2320068Z 186 │ let waiting = yield* Ref.get(awaitingCompletion); 2026-10-22T09:33:04.2320275Z 187 │ let next = initial; 2026-10-22T09:33:04.2320444Z ·  ──┬─ 2026-10-22T09:33:04.2320773Z · ╰── From this accumulator 2026-10-22T09:33:04.2321057Z 188 │ let receivedSnapshot = false; 2026-10-22T09:33:04.2321241Z 189 │ for (const item of items) { 2026-10-22T09:33:04.2321422Z ·  ─┬─ 2026-10-22T09:33:04.2321621Z · ╰── For this loop 2026-10-22T09:33:04.2321841Z 190 │ if (item.kind === "synchronized") { 2026-10-22T09:33:04.2322027Z 191 │ waiting = false; 2026-10-22T09:33:04.2322221Z 192 │ if (Option.isSome(next.snapshot)) { 2026-10-22T09:33:04.2322461Z 193 │ next = { ...next, status: "live", error: Option.none() }; 2026-10-22T09:33:04.2322692Z ·  ───┬─── 2026-10-22T09:33:04.2322934Z · ╰── From this spread 2026-10-22T09:33:04.2323134Z 194 │ } 2026-10-22T09:33:04.2323269Z ╰──── 2026-10-22T09:33:04.2323501Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-22T09:33:04.2323857Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-22T09:33:04.2324060Z 2026-10-22T09:33:04.2324297Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-22T09:33:04.2324685Z ╭─[packages/client-runtime/src/operations/projects.ts:228:51] 2026-10-22T09:33:04.2324908Z 227 │ ): string { 2026-10-22T09:33:04.2325151Z 228 │ const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? ""; 2026-10-22T09:33:04.2325459Z ·  ────── 2026-10-22T09:33:04.2325730Z 229 │ return target.owner ? `${target.owner}/${folderName}` : folderName; 2026-10-22T09:33:04.2325943Z ╰──── 2026-10-22T09:33:04.2326184Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-22T09:33:04.2326369Z 2026-10-22T09:33:04.2326597Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-22T09:33:04.2326960Z ╭─[apps/web/src/lib/composerContextReferences.ts:90:40] 2026-10-22T09:33:04.2327192Z 89 │ let cursor = prompt.length; 2026-10-22T09:33:04.2327407Z 90 │ for (const occurrence of occurrences.reverse()) { 2026-10-22T09:33:04.2327646Z ·  ─────── 2026-10-22T09:33:04.2327854Z 91 │ let { start, end } = occurrence; 2026-10-22T09:33:04.2328014Z ╰──── 2026-10-22T09:33:04.2328360Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-22T09:33:04.2328631Z 2026-10-22T09:33:04.2328849Z ⚠ eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used. 2026-10-22T09:33:04.2329167Z ╭─[infra/relay/src/http/Api.ts:69:13] 2026-10-22T09:33:04.2329438Z 68 │ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts"; 2026-10-22T09:33:04.2329722Z 69 │ import * as HookForwarder from "../hooks/HookForwarder.ts"; 2026-10-22T09:33:04.2329947Z ·  ──────┬────── 2026-10-22T09:33:04.2330202Z · ╰── 'HookForwarder' is imported here 2026-10-22T09:33:04.2330454Z 70 │ import * as HeldHooks from "../hooks/HeldHooks.ts"; 2026-10-22T09:33:04.2330641Z ╰──── 2026-10-22T09:33:04.2330805Z  help: Consider removing this import. 2026-10-22T09:33:04.2330929Z 2026-10-22T09:33:04.2331292Z ⚠ eslint(no-unused-vars): Function 'normalizeTerminalContextSelection' is declared but never used. 2026-10-22T09:33:04.2331709Z ╭─[apps/web/src/lib/terminalContext.ts:56:10] 2026-10-22T09:33:04.2331901Z 55 │ 2026-10-22T09:33:04.2332071Z 56 │ function normalizeTerminalContextSelection( 2026-10-22T09:33:04.2332315Z ·  ────────────────┬──────────────── 2026-10-22T09:33:04.2332628Z · ╰── 'normalizeTerminalContextSelection' is declared here 2026-10-22T09:33:04.2332915Z 57 │ selection: TerminalContextSelection, 2026-10-22T09:33:04.2333083Z ╰──── 2026-10-22T09:33:04.2333256Z  help: Consider removing this declaration. 2026-10-22T09:33:04.2333385Z 2026-10-22T09:33:04.2333883Z ⚠ 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-22T09:33:04.2334523Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1228:7] 2026-10-22T09:33:04.2334788Z 1227 │ yield* harness.replaceSession; 2026-10-22T09:33:04.2335125Z 1228 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-22T09:33:04.2335493Z 1229 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) { 2026-10-22T09:33:04.2335743Z 1230 │ │ break; 2026-10-22T09:33:04.2335940Z 1231 │ │ } 2026-10-22T09:33:04.2336155Z 1232 │ │ yield* Effect.yieldNow; 2026-10-22T09:33:04.2336493Z 1233 │ ╰─▶ } 2026-10-22T09:33:04.2336718Z 1234 │ yield* Queue.offer( 2026-10-22T09:33:04.2336880Z ╰──── 2026-10-22T09:33:04.2336944Z 2026-10-22T09:33:04.2337431Z ⚠ 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-22T09:33:04.2338030Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1337:7] 2026-10-22T09:33:04.2338293Z 1336 │ yield* harness.replaceSession; 2026-10-22T09:33:04.2338627Z 1337 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-22T09:33:04.2339012Z 1338 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break; 2026-10-22T09:33:04.2339303Z 1339 │ │ yield* Effect.yieldNow; 2026-10-22T09:33:04.2339568Z 1340 │ ╰─▶ } 2026-10-22T09:33:04.2339852Z 1341 │ expect(yield* Ref.get(harness.subscriptionCount)).toBe(2); 2026-10-22T09:33:04.2340057Z ╰──── 2026-10-22T09:33:04.2340120Z 2026-10-22T09:33:04.2340361Z ⚠ eslint(no-unused-vars): Function 'assertUserMessagesExclude' is declared but never used. 2026-10-22T09:33:04.2340768Z ╭─[apps/server/src/orchestration-v2/testkit/fixtures/shared.ts:1398:10] 2026-10-22T09:33:04.2341002Z 1397 │ 2026-10-22T09:33:04.2341162Z 1398 │ function assertUserMessagesExclude( 2026-10-22T09:33:04.2341387Z ·  ────────────┬──────────── 2026-10-22T09:33:04.2341777Z · ╰── 'assertUserMessagesExclude' is declared here 2026-10-22T09:33:04.2342141Z 1399 │ projection: OrchestrationV2ThreadProjection, 2026-10-22T09:33:04.2342328Z ╰──── 2026-10-22T09:33:04.2342500Z  help: Consider removing this declaration. 2026-10-22T09:33:04.2342630Z 2026-10-22T09:33:04.2342942Z ⚠ eslint(no-unused-vars): Variable 'revokeActiveMcpThread' is declared but never used. Unused variables should start with a '_'. 2026-10-22T09:33:04.2343370Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:218:7] 2026-10-22T09:33:04.2343581Z 217 │ 2026-10-22T09:33:04.2343804Z 218 │ const revokeActiveMcpThread = (threadId: ThreadId): Effect.Effect => 2026-10-22T09:33:04.2344125Z ·  ──────────┬────────── 2026-10-22T09:33:04.2344404Z · ╰── 'revokeActiveMcpThread' is declared here 2026-10-22T09:33:04.2347068Z 219 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeThread(threadId) : Effect.void; 2026-10-22T09:33:04.2347617Z ╰──── 2026-10-22T09:33:04.2347943Z  help: Consider removing this declaration. 2026-10-22T09:33:04.2348184Z 2026-10-22T09:33:04.2348899Z ⚠ eslint(no-unused-vars): Variable 'revokeAllActiveMcpCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-22T09:33:04.2349762Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:221:7] 2026-10-22T09:33:04.2350141Z 220 │ 2026-10-22T09:33:04.2350519Z 221 │ const revokeAllActiveMcpCredentials = (): Effect.Effect => 2026-10-22T09:33:04.2351036Z ·  ──────────────┬────────────── 2026-10-22T09:33:04.2351654Z · ╰── 'revokeAllActiveMcpCredentials' is declared here 2026-10-22T09:33:04.2352317Z 222 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void; 2026-10-22T09:33:04.2352757Z ╰──── 2026-10-22T09:33:04.2353060Z  help: Consider removing this declaration. 2026-10-22T09:33:04.2353299Z 2026-10-22T09:33:04.2353828Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-22T09:33:04.2354634Z ╭─[packages/provider-pi/src/server/adapter.ts:3389:7] 2026-10-22T09:33:04.2354990Z 3388 │ 2026-10-22T09:33:04.2355503Z 3389 │ const layer: Layer.Layer = 2026-10-22T09:33:04.2356006Z ·  ──┬── 2026-10-22T09:33:04.2356388Z · ╰── 'layer' is declared here 2026-10-22T09:33:04.2357329Z 3390 │ Layer.effect( 2026-10-22T09:33:04.2357789Z ╰──── 2026-10-22T09:33:04.2358088Z  help: Consider removing this declaration. 2026-10-22T09:33:04.2358318Z 2026-10-22T09:33:04.2358613Z ⚠ eslint(no-new): Do not use 'new' for side effects. 2026-10-22T09:33:04.2359144Z ╭─[apps/server/src/mcp/McpToolAccess.test.ts:168:3] 2026-10-22T09:33:04.2359623Z 167 │ // @ts-expect-error a declaration constructed directly 2026-10-22T09:33:04.2360048Z 168 │ new McpToolAccess.Declaration(unchecked); 2026-10-22T09:33:04.2360443Z ·  ───────────────────────────── 2026-10-22T09:33:04.2360875Z 169 │ // @ts-expect-error a handlers layer built outside McpToolAccess 2026-10-22T09:33:04.2361239Z ╰──── 2026-10-22T09:33:04.2361670Z  help: Assign the result of 'new' to a variable or compare it to a reference. 2026-10-22T09:33:04.2362001Z 2026-10-22T09:33:04.2362353Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-22T09:33:04.2362970Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:121:27] 2026-10-22T09:33:04.2363556Z 120 │ const scope = makeScope(options.capabilities ?? new Set(["preview", "worktree"])); 2026-10-22T09:33:04.2364126Z 121 │ const dispatch = vi.fn((_: unknown) => 2026-10-22T09:33:04.2364477Z ·  ┬ 2026-10-22T09:33:04.2364928Z · ╰── '_' is declared here 2026-10-22T09:33:04.2365373Z 122 │ (options.dispatchGate ?? Effect.void).pipe( 2026-10-22T09:33:04.2365699Z ╰──── 2026-10-22T09:33:04.2365970Z  help: Consider removing this parameter. 2026-10-22T09:33:04.2366182Z 2026-10-22T09:33:04.2366526Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-22T09:33:04.2367096Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:134:39] 2026-10-22T09:33:04.2367447Z 133 │ ); 2026-10-22T09:33:04.2367759Z 134 │ const listLocalBranchNames = vi.fn((_: string) => 2026-10-22T09:33:04.2368156Z ·  ┬ 2026-10-22T09:33:04.2368609Z · ╰── '_' is declared here 2026-10-22T09:33:04.2368998Z 135 │ Effect.succeed( 2026-10-22T09:33:04.2369255Z ╰──── 2026-10-22T09:33:04.2369543Z  help: Consider removing this parameter. 2026-10-22T09:33:04.2369772Z 2026-10-22T09:33:04.2370126Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-22T09:33:04.2370700Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:178:31] 2026-10-22T09:33:04.2371064Z 177 │ }); 2026-10-22T09:33:04.2371353Z 178 │ const sendToThread = vi.fn((_: unknown) => { 2026-10-22T09:33:04.2371709Z ·  ┬ 2026-10-22T09:33:04.2372120Z · ╰── '_' is declared here 2026-10-22T09:33:04.2372576Z 179 │ switch (options.continuation ?? "queued") { 2026-10-22T09:33:04.2372885Z ╰──── 2026-10-22T09:33:04.2373178Z  help: Consider removing this parameter. 2026-10-22T09:33:04.2373398Z 2026-10-22T09:33:04.2373766Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-22T09:33:04.2374439Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:203:33] 2026-10-22T09:33:04.2374788Z 202 │ ); 2026-10-22T09:33:04.2375359Z 203 │ const removeWorktree = vi.fn((_: unknown) => 2026-10-22T09:33:04.2375824Z ·  ┬ 2026-10-22T09:33:04.2376246Z · ╰── '_' is declared here 2026-10-22T09:33:04.2376635Z 204 │ options.removeWorktreeFails 2026-10-22T09:33:04.2376906Z ╰──── 2026-10-22T09:33:04.2377183Z  help: Consider removing this parameter. 2026-10-22T09:33:04.2377394Z 2026-10-22T09:33:04.2377725Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-22T09:33:04.2378296Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:208:36] 2026-10-22T09:33:04.2378649Z 207 │ ); 2026-10-22T09:33:04.2378936Z 208 │ const deleteLocalBranch = vi.fn((_: unknown) => 2026-10-22T09:33:04.2379308Z ·  ┬ 2026-10-22T09:33:04.2379747Z · ╰── '_' is declared here 2026-10-22T09:33:04.2380144Z 209 │ options.deleteLocalBranchFails 2026-10-22T09:33:04.2380424Z ╰──── 2026-10-22T09:33:04.2380693Z  help: Consider removing this parameter. 2026-10-22T09:33:04.2380909Z 2026-10-22T09:33:04.2381233Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-22T09:33:04.2381814Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:213:42] 2026-10-22T09:33:04.2382153Z 212 │ ); 2026-10-22T09:33:04.2382470Z 213 │ const fetchWorktreeBaseCommit = vi.fn((_: unknown) => 2026-10-22T09:33:04.2382868Z ·  ┬ 2026-10-22T09:33:04.2383351Z · ╰── '_' is declared here 2026-10-22T09:33:04.2383750Z 214 │ options.fetchWorktreeBaseFails 2026-10-22T09:33:04.2384073Z ╰──── 2026-10-22T09:33:04.2384391Z  help: Consider removing this parameter. 2026-10-22T09:33:04.2384749Z 2026-10-22T09:33:04.2385081Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-22T09:33:04.2385635Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:254:30] 2026-10-22T09:33:04.2385995Z 253 │ ); 2026-10-22T09:33:04.2386271Z 254 │ const localStatus = vi.fn((_: unknown) => 2026-10-22T09:33:04.2386594Z ·  ┬ 2026-10-22T09:33:04.2386987Z · ╰── '_' is declared here 2026-10-22T09:33:04.2387313Z 255 │ Effect.succeed({ 2026-10-22T09:33:04.2387545Z ╰──── 2026-10-22T09:33:04.2387813Z  help: Consider removing this parameter. 2026-10-22T09:33:04.2388024Z 2026-10-22T09:33:04.2388339Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-22T09:33:04.2388900Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:264:32] 2026-10-22T09:33:04.2389306Z 263 │ ); 2026-10-22T09:33:04.2389731Z 264 │ const refreshStatus = vi.fn((_: string) => Effect.die("refreshStatus stub")); 2026-10-22T09:33:04.2390244Z ·  ┬ 2026-10-22T09:33:04.2390727Z · ╰── '_' is declared here 2026-10-22T09:33:04.2391299Z 265 │ const runForThread = vi.fn((input: { readonly worktreePath: string }) => { 2026-10-22T09:33:04.2391675Z ╰──── 2026-10-22T09:33:04.2392311Z  help: Consider removing this parameter. 2026-10-22T09:33:04.2392635Z 2026-10-22T09:33:04.2392992Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-22T09:33:04.2393663Z ╭─[apps/web/src/components/pullRequest/PullRequestChecksPopover.tsx:88:15] 2026-10-22T09:33:04.2394144Z 87 │
  • { 2026-10-22T09:33:04.2405357Z 17 │ expect(Schema.decodeUnknownSync(AuthEnvironmentScopes)(["review:write"])).toEqual([ 2026-10-22T09:33:04.2405865Z ·  ──────────────────────── 2026-10-22T09:33:04.2406182Z 18 │ "review:write", 2026-10-22T09:33:04.2406425Z ╰──── 2026-10-22T09:33:04.2406523Z 2026-10-22T09:33:04.2407189Z ⚠ 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-22T09:33:04.2408001Z ╭─[packages/contracts/src/auth.test.ts:20:18] 2026-10-22T09:33:04.2408320Z 19 │ ]); 2026-10-22T09:33:04.2408742Z 20 │ expect(() => Schema.decodeUnknownSync(AuthGrantScopes)(["review:write"])).toThrow(); 2026-10-22T09:33:04.2409266Z ·  ──────────────────────── 2026-10-22T09:33:04.2409689Z 21 │ expect(AuthStandardClientScopes).not.toContain("review:write"); 2026-10-22T09:33:04.2410038Z ╰──── 2026-10-22T09:33:04.2410133Z 2026-10-22T09:33:04.2410992Z ⚠ 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-22T09:33:04.2411888Z ╭─[packages/contracts/src/auth.test.ts:58:21] 2026-10-22T09:33:04.2412400Z 57 │ it("ignores unknown response permissions without falling back to broader scopes", () => { 2026-10-22T09:33:04.2412936Z 58 │ const session = Schema.decodeUnknownSync(AuthSessionState)({ 2026-10-22T09:33:04.2413359Z ·  ──────────────────────── 2026-10-22T09:33:04.2413674Z 59 │ authenticated: true, 2026-10-22T09:33:04.2413917Z ╰──── 2026-10-22T09:33:04.2414058Z 2026-10-22T09:33:04.2414804Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-22T09:33:04.2415417Z ╭─[apps/web/src/components/pullRequest/pullRequestList.logic.ts:187:9] 2026-10-22T09:33:04.2415694Z 186 │ ): boolean { 2026-10-22T09:33:04.2415956Z 187 │ const labels = entry.labels.map((label) => label.name.trim().toLowerCase()); 2026-10-22T09:33:04.2416318Z ·  ───────────────────────────────────────────────────────────────────── 2026-10-22T09:33:04.2416640Z 188 │ const holds = (label: string) => labels.includes(label.trim().toLowerCase()); 2026-10-22T09:33:04.2416876Z ╰──── 2026-10-22T09:33:04.2417031Z  help: Switch to `Set` 2026-10-22T09:33:04.2417146Z 2026-10-22T09:33:04.2417403Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-22T09:33:04.2417843Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:1998:15] 2026-10-22T09:33:04.2418112Z 1997 │ assert.equal( 2026-10-22T09:33:04.2418396Z 1998 │ items.filter((item) => item.type === "assistant_message").at(-1)?.text, 2026-10-22T09:33:04.2418666Z ·  ────── 2026-10-22T09:33:04.2418868Z 1999 │ "authoritative answer", 2026-10-22T09:33:04.2419041Z ╰──── 2026-10-22T09:33:04.2419305Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-22T09:33:04.2419499Z 2026-10-22T09:33:04.2420017Z ⚠ 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-22T09:33:04.2420683Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:3951:7] 2026-10-22T09:33:04.2421333Z 3950 │ const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped); 2026-10-22T09:33:04.2421839Z 3951 │ ╭─▶ while (!responseLifecycle.includes("failed")) { 2026-10-22T09:33:04.2422174Z 3952 │ │ yield* Effect.yieldNow; 2026-10-22T09:33:04.2422469Z 3953 │ ╰─▶ } 2026-10-22T09:33:04.2422751Z 3954 │ const responseExit = yield* Fiber.join(responseFiber); 2026-10-22T09:33:04.2422964Z ╰──── 2026-10-22T09:33:04.2423026Z 2026-10-22T09:33:04.2423542Z ⚠ 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-22T09:33:04.2424255Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6062:9] 2026-10-22T09:33:04.2426563Z 6061 │ .pipe(Effect.forkScoped); 2026-10-22T09:33:04.2426902Z 6062 │ ╭─▶ while (promptGates.length < 1) { 2026-10-22T09:33:04.2427222Z 6063 │ │ yield* Effect.yieldNow; 2026-10-22T09:33:04.2427516Z 6064 │ ╰─▶ } 2026-10-22T09:33:04.2427854Z 6065 │ assert.isDefined(sessionUpdateHandler, "session update handler must be wired"); 2026-10-22T09:33:04.2428114Z ╰──── 2026-10-22T09:33:04.2428181Z 2026-10-22T09:33:04.2428707Z ⚠ 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-22T09:33:04.2429367Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6197:9] 2026-10-22T09:33:04.2429651Z 6196 │ .pipe(Effect.forkScoped); 2026-10-22T09:33:04.2429970Z 6197 │ ╭─▶ while (promptGates.length < 2) { 2026-10-22T09:33:04.2430284Z 6198 │ │ yield* Effect.yieldNow; 2026-10-22T09:33:04.2430576Z 6199 │ ╰─▶ } 2026-10-22T09:33:04.2430906Z 6200 │ if (sessionUpdateHandler === undefined || capturedMutation.current === null) { 2026-10-22T09:33:04.2431153Z ╰──── 2026-10-22T09:33:04.2431214Z 2026-10-22T09:33:04.2431503Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-22T09:33:04.2431962Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10555:7] 2026-10-22T09:33:04.2432214Z 10554 │ 2026-10-22T09:33:04.2432383Z 10555 │ const layer: Layer.Layer< 2026-10-22T09:33:04.2432570Z ·  ──┬── 2026-10-22T09:33:04.2432813Z · ╰── 'layer' is declared here 2026-10-22T09:33:04.2433071Z 10556 │ ProviderAdapter.ProviderAdapterV2, 2026-10-22T09:33:04.2433261Z ╰──── 2026-10-22T09:33:04.2433455Z  help: Consider removing this declaration. 2026-10-22T09:33:04.2433592Z 2026-10-22T09:33:04.2433876Z ⚠ eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used. 2026-10-22T09:33:04.2434424Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:960:10] 2026-10-22T09:33:04.2435015Z 959 │ 2026-10-22T09:33:04.2435304Z 960 │ function layerClaudeAgentSdkReplayQueryRunner( 2026-10-22T09:33:04.2435571Z ·  ──────────────────┬───────────────── 2026-10-22T09:33:04.2435928Z · ╰── 'layerClaudeAgentSdkReplayQueryRunner' is declared here 2026-10-22T09:33:04.2436269Z 961 │ transcript: ClaudeAgentSdkReplayTranscript, 2026-10-22T09:33:04.2436481Z ╰──── 2026-10-22T09:33:04.2436668Z  help: Consider removing this declaration. 2026-10-22T09:33:04.2436805Z 2026-10-22T09:33:04.2437175Z ⚠ eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'. 2026-10-22T09:33:04.2437685Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1432:7] 2026-10-22T09:33:04.2437936Z 1431 │ 2026-10-22T09:33:04.2438147Z 1432 │ const layerCodexAppServerClientFactoryCommand = ( 2026-10-22T09:33:04.2438422Z ·  ───────────────────┬─────────────────── 2026-10-22T09:33:04.2438775Z · ╰── 'layerCodexAppServerClientFactoryCommand' is declared here 2026-10-22T09:33:04.2439133Z 1433 │ options: CodexClient.CodexAppServerClientOptions & { 2026-10-22T09:33:04.2439344Z ╰──── 2026-10-22T09:33:04.2439523Z  help: Consider removing this declaration. 2026-10-22T09:33:04.2439656Z 2026-10-22T09:33:04.2439945Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-22T09:33:04.2440379Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1668:7] 2026-10-22T09:33:04.2440626Z 1667 │ 2026-10-22T09:33:04.2440778Z 1668 │ const layer: Layer.Layer< 2026-10-22T09:33:04.2440968Z ·  ──┬── 2026-10-22T09:33:04.2441201Z · ╰── 'layer' is declared here 2026-10-22T09:33:04.2441458Z 1669 │ ProviderAdapter.ProviderAdapterV2, 2026-10-22T09:33:04.2441639Z ╰──── 2026-10-22T09:33:04.2441822Z  help: Consider removing this declaration. 2026-10-22T09:33:04.2441950Z 2026-10-22T09:33:04.2442174Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-22T09:33:04.2442531Z ╭─[packages/client-runtime/src/state/filesystem.ts:3:8] 2026-10-22T09:33:04.2442766Z 2 │ AuthFilesystemReadScope, 2026-10-22T09:33:04.2442945Z 3 │ type AuthSessionState, 2026-10-22T09:33:04.2443145Z ·  ────────┬─────── 2026-10-22T09:33:04.2443414Z · ╰── 'AuthSessionState' is imported here 2026-10-22T09:33:04.2443656Z 4 │ type FilesystemBrowseEntry, 2026-10-22T09:33:04.2443812Z ╰──── 2026-10-22T09:33:04.2444035Z  help: Consider removing this import. 2026-10-22T09:33:04.2444210Z 2026-10-22T09:33:04.2444521Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-22T09:33:04.2444900Z ╭─[packages/contracts/src/rpc.ts:295:8] 2026-10-22T09:33:04.2459223Z 294 │ } from "./device.ts"; 2026-10-22T09:33:04.2459443Z 295 │ import {} from "./previewAutomation.ts"; 2026-10-22T09:33:04.2459646Z ·  ── 2026-10-22T09:33:04.2459807Z 296 │ import { 2026-10-22T09:33:04.2459950Z ╰──── 2026-10-22T09:33:04.2460107Z  help: Remove empty braces 2026-10-22T09:33:04.2460447Z 2026-10-22T09:33:04.2460717Z ⚠ react(purity): Cannot call impure function during render 2026-10-22T09:33:04.2461084Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:704:76] 2026-10-22T09:33:04.2461468Z 703 │ const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() })); 2026-10-22T09:33:04.2461863Z 704 │ if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() }); 2026-10-22T09:33:04.2462205Z ·  ─────┬──── 2026-10-22T09:33:04.2462554Z · ╰── Cannot call impure function 2026-10-22T09:33:04.2462896Z 705 │ const snoozeGateNow = new Date(snoozeGateClock.now).toISOString(); 2026-10-22T09:33:04.2463124Z ╰──── 2026-10-22T09:33:04.2463519Z  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-22T09:33:04.2464214Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-22T09:33:04.2464711Z 2026-10-22T09:33:04.2464943Z ⚠ react(purity): Cannot call impure function during render 2026-10-22T09:33:04.2465304Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:725:71] 2026-10-22T09:33:04.2465577Z 724 │ const snoozePresets = useMemo( 2026-10-22T09:33:04.2466509Z 725 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-22T09:33:04.2466881Z ·  ─────┬──── 2026-10-22T09:33:04.2467241Z · ╰── Cannot call impure function 2026-10-22T09:33:04.2467565Z 726 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-22T09:33:04.2467780Z ╰──── 2026-10-22T09:33:04.2468182Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-22T09:33:04.2468818Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-22T09:33:04.2469129Z 2026-10-22T09:33:04.2469337Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-22T09:33:04.2469715Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:726:6] 2026-10-22T09:33:04.2470098Z 725 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-22T09:33:04.2470418Z 726 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-22T09:33:04.2470682Z ·  ────────────┬─────────── 2026-10-22T09:33:04.2470996Z · ╰── Unnecessary dependency `props.snoozePresetMinute` 2026-10-22T09:33:04.2471263Z 727 │ ); 2026-10-22T09:33:04.2471395Z ╰──── 2026-10-22T09:33:04.2471820Z  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-22T09:33:04.2472763Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.2473205Z 2026-10-22T09:33:04.2473412Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-22T09:33:04.2473783Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:772:7] 2026-10-22T09:33:04.2474091Z 771 │ thread.pinnedAt, 2026-10-22T09:33:04.2474274Z 772 │ variant, 2026-10-22T09:33:04.2474450Z ·  ───┬─── 2026-10-22T09:33:04.2474698Z · ╰── Unnecessary dependency `variant` 2026-10-22T09:33:04.2474917Z 773 │ ], 2026-10-22T09:33:04.2475062Z ╰──── 2026-10-22T09:33:04.2475467Z  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-22T09:33:04.2476156Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.2476488Z 2026-10-22T09:33:04.2476699Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-22T09:33:04.2477102Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1222:21] 2026-10-22T09:33:04.2477446Z 1221 │ {providerDrivers.slice(0, -1).map((driver, index) => ( 2026-10-22T09:33:04.2477745Z 1222 │ 2026-10-22T09:33:04.2478027Z ·  ────────────────────────── 2026-10-22T09:33:04.2478286Z 1223 │ 2026-10-22T09:33:04.2478479Z ╰──── 2026-10-22T09:33:04.2478717Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-22T09:33:04.2478901Z 2026-10-22T09:33:04.2479406Z ⚠ 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-22T09:33:04.2480017Z ╭─[packages/contracts/src/baseSchemas.test.ts:39:9] 2026-10-22T09:33:04.2480241Z 38 │ JSON.stringify( 2026-10-22T09:33:04.2480476Z 39 │ Schema.encodeUnknownSync(Schema.toCodecJson(Named))([ 2026-10-22T09:33:04.2480734Z ·  ──────────────────────── 2026-10-22T09:33:04.2480938Z 40 │ { name: "a" }, 2026-10-22T09:33:04.2481092Z ╰──── 2026-10-22T09:33:04.2481156Z 2026-10-22T09:33:04.2481373Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-22T09:33:04.2481769Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:555:70] 2026-10-22T09:33:04.2482054Z 554 │ assert.deepStrictEqual( 2026-10-22T09:33:04.2482362Z 555 │ (yield* Ref.get(fixture.syncCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-22T09:33:04.2482688Z ·  ┬ 2026-10-22T09:33:04.2483019Z · ╰── '_' is declared here 2026-10-22T09:33:04.2483264Z 556 │ [ 2026-10-22T09:33:04.2483408Z ╰──── 2026-10-22T09:33:04.2483587Z  help: Consider removing this parameter. 2026-10-22T09:33:04.2483725Z 2026-10-22T09:33:04.2484076Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-22T09:33:04.2484533Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:1155:70] 2026-10-22T09:33:04.2484820Z 1154 │ assert.deepStrictEqual( 2026-10-22T09:33:04.2485109Z 1155 │ (yield* Ref.get(fixture.linkCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-22T09:33:04.2485426Z ·  ┬ 2026-10-22T09:33:04.2485740Z · ╰── '_' is declared here 2026-10-22T09:33:04.2485982Z 1156 │ [ 2026-10-22T09:33:04.2486124Z ╰──── 2026-10-22T09:33:04.2486304Z  help: Consider removing this parameter. 2026-10-22T09:33:04.2486429Z 2026-10-22T09:33:04.2486630Z ⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`. 2026-10-22T09:33:04.2486964Z ╭─[apps/web/src/terminal/ghostty/core.ts:194:19] 2026-10-22T09:33:04.2487246Z 193 │ const count = Math.min(CHUNK_SIZE, graphemeLength - start); 2026-10-22T09:33:04.2487498Z 194 │ const codes = new Array(count); 2026-10-22T09:33:04.2487741Z ·  ──────────────────────── 2026-10-22T09:33:04.2487982Z 195 │ for (let index = 0; index < count; index += 1) { 2026-10-22T09:33:04.2488168Z ╰──── 2026-10-22T09:33:04.2488692Z  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-22T09:33:04.2489106Z 2026-10-22T09:33:04.2489330Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-22T09:33:04.2489701Z ╭─[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9] 2026-10-22T09:33:04.2489957Z 35 │ void) { 2026-10-22T09:33:04.2492542Z 12 │ this.onmessage = listener; 2026-10-22T09:33:04.2492743Z ·  ───────── 2026-10-22T09:33:04.2492907Z 13 │ } 2026-10-22T09:33:04.2493045Z ╰──── 2026-10-22T09:33:04.2493458Z  help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on` replaces any previously registered handler. 2026-10-22T09:33:04.2493778Z 2026-10-22T09:33:04.2494050Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-22T09:33:04.2494429Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:16:9] 2026-10-22T09:33:04.2494671Z 15 │ constructor() { 2026-10-22T09:33:04.2494837Z 16 │ source = this; 2026-10-22T09:33:04.2495019Z ·  ────── 2026-10-22T09:33:04.2495190Z 17 │ } 2026-10-22T09:33:04.2495324Z ╰──── 2026-10-22T09:33:04.2495691Z  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-22T09:33:04.2495979Z 2026-10-22T09:33:04.2496160Z ⚠ react(purity): Cannot call impure function during render 2026-10-22T09:33:04.2496500Z ╭─[apps/web/src/components/CustomSnoozeDialog.tsx:140:58] 2026-10-22T09:33:04.2496809Z 139 │ {...(weekStartsOn === undefined ? {} : { weekStartsOn })} 2026-10-22T09:33:04.2497123Z 140 │ disabled={{ before: new Date(new Date().setHours(0, 0, 0, 0)) }} 2026-10-22T09:33:04.2497420Z ·  ─────┬──── 2026-10-22T09:33:04.2497753Z · ╰── Cannot call impure function 2026-10-22T09:33:04.2498037Z 141 │ onSelect={(selected) => { 2026-10-22T09:33:04.2498221Z ╰──── 2026-10-22T09:33:04.2498589Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-22T09:33:04.2499205Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-22T09:33:04.2499510Z 2026-10-22T09:33:04.2499667Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.2500008Z ╭─[apps/mobile/src/features/home/thread-swipe-actions.tsx:494:27] 2026-10-22T09:33:04.2500259Z 493 │ > 2026-10-22T09:33:04.2500448Z 494 │ {props.children(close)} 2026-10-22T09:33:04.2500667Z ·  ──┬── 2026-10-22T09:33:04.2500957Z · ╰── Cannot access ref value during render 2026-10-22T09:33:04.2501213Z 495 │ 2026-10-22T09:33:04.2501383Z ╰──── 2026-10-22T09:33:04.2501958Z  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-22T09:33:04.2502743Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.2503042Z 2026-10-22T09:33:04.2503476Z ⚠ eslint(no-unused-vars): Variable 'layerFromProviderAdapter' is declared but never used. Unused variables should start with a '_'. 2026-10-22T09:33:04.2504060Z ╭─[apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts:346:7] 2026-10-22T09:33:04.2504308Z 345 │ 2026-10-22T09:33:04.2504594Z 346 │ const layerFromProviderAdapter: Layer.Layer< 2026-10-22T09:33:04.2504826Z ·  ────────────┬─────────── 2026-10-22T09:33:04.2505119Z · ╰── 'layerFromProviderAdapter' is declared here 2026-10-22T09:33:04.2505374Z 347 │ ProviderAdapterRegistryV2, 2026-10-22T09:33:04.2505543Z ╰──── 2026-10-22T09:33:04.2505726Z  help: Consider removing this declaration. 2026-10-22T09:33:04.2505875Z 2026-10-22T09:33:04.2506379Z ⚠ 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-22T09:33:04.2506976Z ╭─[packages/contracts/src/composerContext.test.ts:181:18] 2026-10-22T09:33:04.2507289Z 180 │ it("sends a message without the records the wire cannot carry", () => { 2026-10-22T09:33:04.2507646Z 181 │ const wire = Schema.encodeUnknownSync(Schema.toCodecJson(OrchestrationMessageContext))({ 2026-10-22T09:33:04.2507968Z ·  ──────────────────────── 2026-10-22T09:33:04.2508166Z 182 │ version: 1, 2026-10-22T09:33:04.2508326Z ╰──── 2026-10-22T09:33:04.2508391Z 2026-10-22T09:33:04.2508608Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T09:33:04.2508973Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:538:25] 2026-10-22T09:33:04.2509268Z 537 │ // range) the boundary string is identical and the chain would die. 2026-10-22T09:33:04.2509528Z 538 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-22T09:33:04.2509758Z ·  ───────┬────── 2026-10-22T09:33:04.2510064Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-22T09:33:04.2510390Z 539 │ const v2SearchQuery = props.searchQuery.trim().toLocaleLowerCase(); 2026-10-22T09:33:04.2510612Z ╰──── 2026-10-22T09:33:04.2511000Z  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-22T09:33:04.2511655Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.2511984Z 2026-10-22T09:33:04.2512165Z ⚠ react(purity): Cannot call impure function during render 2026-10-22T09:33:04.2512486Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:529:53] 2026-10-22T09:33:04.2512737Z 528 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-22T09:33:04.2513029Z 529 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-22T09:33:04.2513337Z ·  ─────┬──── 2026-10-22T09:33:04.2513658Z · ╰── Cannot call impure function 2026-10-22T09:33:04.2513913Z 530 │ const id = setTimeout(() => { 2026-10-22T09:33:04.2514610Z ╰──── 2026-10-22T09:33:04.2515416Z  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-22T09:33:04.2516224Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-22T09:33:04.2516619Z 2026-10-22T09:33:04.2516895Z ⚠ eslint(require-yield): This generator function does not have `yield` 2026-10-22T09:33:04.2517296Z ╭─[packages/provider-acp/src/server/mcpOverAcpBridge.ts:81:78] 2026-10-22T09:33:04.2517543Z  80 │ 2026-10-22T09:33:04.2517935Z  81 │ ╭─▶ export const makeAcpMcpOverAcpBridge = Effect.fn("AcpMcpOverAcpBridge.make")(function* ( 2026-10-22T09:33:04.2518341Z  82 │ │ options: AcpMcpOverAcpBridgeOptions, 2026-10-22T09:33:04.2518636Z  83 │ │ ): Effect.fn.Return { 2026-10-22T09:33:04.2518974Z  84 │ │ const fetchImplementation = options.fetchImplementation ?? fetch; 2026-10-22T09:33:04.2519315Z  85 │ │ const connections = new Map(); 2026-10-22T09:33:04.2519554Z  86 │ │ 2026-10-22T09:33:04.2519886Z  87 │ │ const connectionFor = (connectionId: string): Effect.Effect => 2026-10-22T09:33:04.2520231Z  88 │ │ Effect.suspend(() => { 2026-10-22T09:33:04.2520508Z  89 │ │ const connection = connections.get(connectionId); 2026-10-22T09:33:04.2520791Z  90 │ │ return connection === undefined 2026-10-22T09:33:04.2521162Z  91 │ │ ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`)) 2026-10-22T09:33:04.2521513Z  92 │ │ : Effect.succeed(connection); 2026-10-22T09:33:04.2521736Z  93 │ │ }); 2026-10-22T09:33:04.2521925Z  94 │ │ 2026-10-22T09:33:04.2522116Z  95 │ │ const send = ( 2026-10-22T09:33:04.2522344Z  96 │ │ connection: Connection, 2026-10-22T09:33:04.2522570Z  97 │ │ message: unknown, 2026-10-22T09:33:04.2522865Z  98 │ │ ): Effect.Effect, AcpMcpOverAcpError> => 2026-10-22T09:33:04.2523172Z  99 │ │ connection.mutex.withPermits(1)( 2026-10-22T09:33:04.2523430Z 100 │ │ Effect.gen(function* () { 2026-10-22T09:33:04.2523704Z 101 │ │ const body = JSON.stringify(message); 2026-10-22T09:33:04.2524048Z 102 │ │ if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) { 2026-10-22T09:33:04.2524450Z 103 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB.")); 2026-10-22T09:33:04.2524758Z 104 │ │ } 2026-10-22T09:33:04.2525016Z 105 │ │ const response = yield* Effect.tryPromise({ 2026-10-22T09:33:04.2525278Z 106 │ │ try: (signal) => 2026-10-22T09:33:04.2525548Z 107 │ │ fetchImplementation(options.endpoint, { 2026-10-22T09:33:04.2525813Z 108 │ │ method: "POST", 2026-10-22T09:33:04.2526049Z 109 │ │ signal, 2026-10-22T09:33:04.2526385Z 110 │ │ headers: { 2026-10-22T09:33:04.2526761Z 111 │ │ "content-type": "application/json", 2026-10-22T09:33:04.2527062Z 112 │ │ accept: "application/json, text/event-stream", 2026-10-22T09:33:04.2527447Z 113 │ │ authorization: options.authorization, 2026-10-22T09:33:04.2527737Z 114 │ │ ...(connection.sessionId === null 2026-10-22T09:33:04.2527998Z 115 │ │ ? {} 2026-10-22T09:33:04.2528279Z 116 │ │ : { "mcp-session-id": connection.sessionId }), 2026-10-22T09:33:04.2528589Z 117 │ │ ...(connection.protocolVersion === null 2026-10-22T09:33:04.2528847Z 118 │ │ ? {} 2026-10-22T09:33:04.2529162Z 119 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-22T09:33:04.2529446Z 120 │ │ }, 2026-10-22T09:33:04.2529664Z 121 │ │ body, 2026-10-22T09:33:04.2529876Z 122 │ │ }), 2026-10-22T09:33:04.2530100Z 123 │ │ catch: bridgeError, 2026-10-22T09:33:04.2530324Z 124 │ │ }); 2026-10-22T09:33:04.2530666Z 125 │ │ connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId; 2026-10-22T09:33:04.2531007Z 126 │ │ if (!response.ok) { 2026-10-22T09:33:04.2531246Z 127 │ │ yield* Effect.promise( 2026-10-22T09:33:04.2531590Z 128 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-22T09:33:04.2531877Z 129 │ │ ); 2026-10-22T09:33:04.2532113Z 130 │ │ return yield* Effect.fail( 2026-10-22T09:33:04.2532481Z 131 │ │ new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`), 2026-10-22T09:33:04.2532791Z 132 │ │ ); 2026-10-22T09:33:04.2532984Z 133 │ │ } 2026-10-22T09:33:04.2533323Z 134 │ │ const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))]; 2026-10-22T09:33:04.2533675Z 135 │ │ for (const payload of payloads) { 2026-10-22T09:33:04.2534166Z 136 │ │ connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion; 2026-10-22T09:33:04.2534490Z 137 │ │ } 2026-10-22T09:33:04.2534718Z 138 │ │ return payloads; 2026-10-22T09:33:04.2534976Z 139 │ │ }).pipe(Effect.mapError(bridgeError)), 2026-10-22T09:33:04.2535208Z 140 │ │ ); 2026-10-22T09:33:04.2535395Z 141 │ │ 2026-10-22T09:33:04.2535679Z 142 │ │ const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* ( 2026-10-22T09:33:04.2536014Z 143 │ │ request: AcpSchema.DisconnectMcpRequest, 2026-10-22T09:33:04.2536366Z 144 │ │ ): Effect.fn.Return { 2026-10-22T09:33:04.2536750Z 145 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-22T09:33:04.2537149Z 146 │ │ connections.delete(request.connectionId); 2026-10-22T09:33:04.2537541Z 147 │ │ const sessionId = connection.sessionId; 2026-10-22T09:33:04.2537802Z 148 │ │ if (sessionId !== null) { 2026-10-22T09:33:04.2538147Z 149 │ │ const response = yield* Effect.tryPromise({ 2026-10-22T09:33:04.2538409Z 150 │ │ try: (signal) => 2026-10-22T09:33:04.2538675Z 151 │ │ fetchImplementation(options.endpoint, { 2026-10-22T09:33:04.2538940Z 152 │ │ method: "DELETE", 2026-10-22T09:33:04.2539168Z 153 │ │ signal, 2026-10-22T09:33:04.2539390Z 154 │ │ headers: { 2026-10-22T09:33:04.2539655Z 155 │ │ authorization: options.authorization, 2026-10-22T09:33:04.2539946Z 156 │ │ "mcp-session-id": sessionId, 2026-10-22T09:33:04.2540235Z 157 │ │ ...(connection.protocolVersion === null 2026-10-22T09:33:04.2540488Z 158 │ │ ? {} 2026-10-22T09:33:04.2540785Z 159 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-22T09:33:04.2541062Z 160 │ │ }, 2026-10-22T09:33:04.2541262Z 161 │ │ }), 2026-10-22T09:33:04.2541481Z 162 │ │ catch: bridgeError, 2026-10-22T09:33:04.2541693Z 163 │ │ }); 2026-10-22T09:33:04.2541947Z 164 │ │ if (!response.ok && response.status !== 404) { 2026-10-22T09:33:04.2542234Z 165 │ │ return yield* Effect.fail( 2026-10-22T09:33:04.2542498Z 166 │ │ new AcpMcpOverAcpError( 2026-10-22T09:33:04.2543073Z 167 │ │ `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`, 2026-10-22T09:33:04.2543523Z 168 │ │ ), 2026-10-22T09:33:04.2543826Z 169 │ │ ); 2026-10-22T09:33:04.2544189Z 170 │ │ } 2026-10-22T09:33:04.2545085Z 171 │ │ yield* Effect.promise( 2026-10-22T09:33:04.2545586Z 172 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-22T09:33:04.2546014Z 173 │ │ ); 2026-10-22T09:33:04.2546296Z 174 │ │ } 2026-10-22T09:33:04.2546605Z 175 │ │ return {}; 2026-10-22T09:33:04.2546915Z 176 │ │ }); 2026-10-22T09:33:04.2547198Z 177 │ │ 2026-10-22T09:33:04.2547472Z 178 │ │ return { 2026-10-22T09:33:04.2547936Z 179 │ │ connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) { 2026-10-22T09:33:04.2548430Z 180 │ │ if (request.serverId !== "t3-code") { 2026-10-22T09:33:04.2548842Z 181 │ │ return yield* Effect.fail( 2026-10-22T09:33:04.2549366Z 182 │ │ new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`), 2026-10-22T09:33:04.2549822Z 183 │ │ ); 2026-10-22T09:33:04.2550110Z 184 │ │ } 2026-10-22T09:33:04.2550489Z 185 │ │ if (connections.size >= MAX_CONNECTIONS) { 2026-10-22T09:33:04.2551053Z 186 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections.")); 2026-10-22T09:33:04.2551452Z 187 │ │ } 2026-10-22T09:33:04.2551723Z 188 │ │ const connectionId = yield* options.allocateConnectionId; 2026-10-22T09:33:04.2552018Z 189 │ │ connections.set(connectionId, { 2026-10-22T09:33:04.2552290Z 190 │ │ mutex: yield* Semaphore.make(1), 2026-10-22T09:33:04.2552535Z 191 │ │ sessionId: null, 2026-10-22T09:33:04.2552779Z 192 │ │ protocolVersion: null, 2026-10-22T09:33:04.2553025Z 193 │ │ nextRequestId: 0, 2026-10-22T09:33:04.2553241Z 194 │ │ }); 2026-10-22T09:33:04.2553470Z 195 │ │ return { connectionId }; 2026-10-22T09:33:04.2553690Z 196 │ │ }), 2026-10-22T09:33:04.2554047Z 197 │ │ message: Effect.fn("mcpOverAcpBridge.message")(function* (request) { 2026-10-22T09:33:04.2554423Z 198 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-22T09:33:04.2554741Z 199 │ │ const id = ++connection.nextRequestId; 2026-10-22T09:33:04.2555030Z 200 │ │ const payloads = yield* send(connection, { 2026-10-22T09:33:04.2555291Z 201 │ │ jsonrpc: "2.0", 2026-10-22T09:33:04.2555506Z 202 │ │ id, 2026-10-22T09:33:04.2555728Z 203 │ │ method: request.method, 2026-10-22T09:33:04.2556045Z 204 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-22T09:33:04.2556311Z 205 │ │ }); 2026-10-22T09:33:04.2556616Z 206 │ │ const response = payloads.find((payload) => asEnvelope(payload)?.id === id); 2026-10-22T09:33:04.2557026Z 207 │ │ const envelope = asEnvelope(response); 2026-10-22T09:33:04.2557285Z 208 │ │ if (envelope === null) { 2026-10-22T09:33:04.2557543Z 209 │ │ return yield* Effect.fail( 2026-10-22T09:33:04.2557879Z 210 │ │ new AcpMcpOverAcpError("MCP server did not return a matching response."), 2026-10-22T09:33:04.2558170Z 211 │ │ ); 2026-10-22T09:33:04.2558358Z 212 │ │ } 2026-10-22T09:33:04.2558595Z 213 │ │ if (envelope.error !== undefined) { 2026-10-22T09:33:04.2558952Z 214 │ │ return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error))); 2026-10-22T09:33:04.2559258Z 215 │ │ } 2026-10-22T09:33:04.2559548Z 216 │ │ return (envelope.result ?? null) as AcpSchema.MessageMcpResponse; 2026-10-22T09:33:04.2559828Z 217 │ │ }), 2026-10-22T09:33:04.2560139Z 218 │ │ notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) { 2026-10-22T09:33:04.2560531Z 219 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-22T09:33:04.2560830Z 220 │ │ yield* send(connection, { 2026-10-22T09:33:04.2561074Z 221 │ │ jsonrpc: "2.0", 2026-10-22T09:33:04.2561310Z 222 │ │ method: request.method, 2026-10-22T09:33:04.2561701Z 223 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-22T09:33:04.2562026Z 224 │ │ }); 2026-10-22T09:33:04.2562213Z 225 │ │ }), 2026-10-22T09:33:04.2562420Z 226 │ │ disconnect, 2026-10-22T09:33:04.2562649Z 227 │ │ dispose: Effect.suspend(() => 2026-10-22T09:33:04.2562905Z 228 │ │ Effect.forEach( 2026-10-22T09:33:04.2563142Z 229 │ │ [...connections.keys()], 2026-10-22T09:33:04.2563464Z 230 │ │ (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore), 2026-10-22T09:33:04.2563579Z 231 │ │ { discard: true }, 2026-10-22T09:33:04.2563664Z 232 │ │ ), 2026-10-22T09:33:04.2563760Z 233 │ │ ), 2026-10-22T09:33:04.2563854Z 234 │ │ }; 2026-10-22T09:33:04.2564060Z 235 │ ╰─▶ }); 2026-10-22T09:33:04.2564129Z ╰──── 2026-10-22T09:33:04.2564426Z  help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed. 2026-10-22T09:33:04.2564430Z 2026-10-22T09:33:04.2564610Z ⚠ react(immutability): This value cannot be modified 2026-10-22T09:33:04.2564803Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:42:5] 2026-10-22T09:33:04.2564865Z 35 │ 2026-10-22T09:33:04.2565020Z 36 │ const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0); 2026-10-22T09:33:04.2565130Z ·  ────────┬──────── 2026-10-22T09:33:04.2565307Z · ╰── `inspectorProgress` originates here 2026-10-22T09:33:04.2565423Z 37 │ const { renderedInspectorWidth } = props; 2026-10-22T09:33:04.2565571Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-22T09:33:04.2565634Z 39 │ 2026-10-22T09:33:04.2565724Z 40 │ const onClosed = props.onClosed; 2026-10-22T09:33:04.2565797Z 41 │ useEffect(() => { 2026-10-22T09:33:04.2565899Z 42 │ inspectorProgress.value = withTiming( 2026-10-22T09:33:04.2565992Z ·  ────────┬──────── 2026-10-22T09:33:04.2566159Z · ╰── `inspectorProgress` cannot be modified 2026-10-22T09:33:04.2566247Z 43 │ inspectorVisible ? 1 : 0, 2026-10-22T09:33:04.2566308Z ╰──── 2026-10-22T09:33:04.2566683Z  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-22T09:33:04.2567084Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T09:33:04.2567087Z 2026-10-22T09:33:04.2567262Z ⚠ react(immutability): This value cannot be modified 2026-10-22T09:33:04.2567438Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:67:7] 2026-10-22T09:33:04.2567543Z 37 │ const { renderedInspectorWidth } = props; 2026-10-22T09:33:04.2567687Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-22T09:33:04.2567786Z ·  ──────────┬───────── 2026-10-22T09:33:04.2567959Z · ╰── `renderedContentWidth` originates here 2026-10-22T09:33:04.2568030Z 39 │ 2026-10-22T09:33:04.2568123Z 40 │ const onClosed = props.onClosed; 2026-10-22T09:33:04.2568197Z 41 │ useEffect(() => { 2026-10-22T09:33:04.2568305Z 42 │ inspectorProgress.value = withTiming( 2026-10-22T09:33:04.2568394Z 43 │ inspectorVisible ? 1 : 0, 2026-10-22T09:33:04.2568476Z 44 │ WORKSPACE_PANE_TIMING, 2026-10-22T09:33:04.2568547Z 45 │ (finished) => { 2026-10-22T09:33:04.2568703Z 46 │ if (finished === true && !inspectorVisible && onClosed !== undefined) { 2026-10-22T09:33:04.2568790Z 47 │ runOnJS(onClosed)(); 2026-10-22T09:33:04.2568859Z 48 │ } 2026-10-22T09:33:04.2568918Z 49 │ }, 2026-10-22T09:33:04.2568984Z 50 │ ); 2026-10-22T09:33:04.2569128Z 51 │ const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0; 2026-10-22T09:33:04.2569217Z 52 │ renderedInspectorWidth.set( 2026-10-22T09:33:04.2569379Z 53 │ resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING), 2026-10-22T09:33:04.2569446Z 54 │ ); 2026-10-22T09:33:04.2569512Z 55 │ }, [ 2026-10-22T09:33:04.2569585Z 56 │ inspectorProgress, 2026-10-22T09:33:04.2569661Z 57 │ inspectorVisible, 2026-10-22T09:33:04.2569733Z 58 │ inspectorWidth, 2026-10-22T09:33:04.2569807Z 59 │ onClosed, 2026-10-22T09:33:04.2569884Z 60 │ renderedInspectorWidth, 2026-10-22T09:33:04.2569955Z 61 │ resizing, 2026-10-22T09:33:04.2570023Z 62 │ ]); 2026-10-22T09:33:04.2570083Z 63 │ 2026-10-22T09:33:04.2570153Z 64 │ useEffect(() => { 2026-10-22T09:33:04.2570259Z 65 │ const targetWidth = inspectorWidth ?? 0; 2026-10-22T09:33:04.2570360Z 66 │ if (!inspectorVisible || resizing) { 2026-10-22T09:33:04.2570471Z 67 │ renderedContentWidth.value = targetWidth; 2026-10-22T09:33:04.2570575Z ·  ──────────┬───────── 2026-10-22T09:33:04.2570758Z · ╰── `renderedContentWidth` cannot be modified 2026-10-22T09:33:04.2570828Z 68 │ return; 2026-10-22T09:33:04.2570897Z ╰──── 2026-10-22T09:33:04.2571186Z  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-22T09:33:04.2571527Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T09:33:04.2571530Z 2026-10-22T09:33:04.2571818Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T09:33:04.2572111Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:119:10] 2026-10-22T09:33:04.2572226Z 117 │ 2026-10-22T09:33:04.2572304Z 118 │ useEffect(() => { 2026-10-22T09:33:04.2572389Z ·  ────┬──── 2026-10-22T09:33:04.2572541Z · ╰── This is the containing effect 2026-10-22T09:33:04.2572627Z 119 │ void refreshNotifications(); 2026-10-22T09:33:04.2572733Z ·  ──────────┬───────── 2026-10-22T09:33:04.2572925Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.2573084Z 120 │ const subscription = AppState.addEventListener("change", (state) => { 2026-10-22T09:33:04.2573141Z ╰──── 2026-10-22T09:33:04.2573813Z  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-22T09:33:04.2574215Z  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-22T09:33:04.2574218Z 2026-10-22T09:33:04.2574502Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T09:33:04.2574710Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7] 2026-10-22T09:33:04.2574768Z 125 │ 2026-10-22T09:33:04.2574847Z 126 │ useEffect(() => { 2026-10-22T09:33:04.2574935Z ·  ────┬──── 2026-10-22T09:33:04.2575087Z · ╰── This is the containing effect 2026-10-22T09:33:04.2575162Z 127 │ if (!isLoaded) { 2026-10-22T09:33:04.2575265Z 128 │ setLiveActivityStatus("checking"); 2026-10-22T09:33:04.2575368Z ·  ──────────┬────────── 2026-10-22T09:33:04.2575555Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.2575624Z 129 │ return; 2026-10-22T09:33:04.2575685Z ╰──── 2026-10-22T09:33:04.2576333Z  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-22T09:33:04.2576687Z  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-22T09:33:04.2576695Z 2026-10-22T09:33:04.2576912Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T09:33:04.2577083Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:203:7] 2026-10-22T09:33:04.2577149Z 202 │ } 2026-10-22T09:33:04.2577231Z 203 │ }, [wrappedRender]); 2026-10-22T09:33:04.2577323Z ·  ──────┬────── 2026-10-22T09:33:04.2577484Z · ╰── Unnecessary dependency `wrappedRender` 2026-10-22T09:33:04.2577546Z 204 │ 2026-10-22T09:33:04.2577608Z ╰──── 2026-10-22T09:33:04.2577930Z  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-22T09:33:04.2578338Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.2578416Z 2026-10-22T09:33:04.2578682Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-22T09:33:04.2578860Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:753:35] 2026-10-22T09:33:04.2578927Z 752 │ > 2026-10-22T09:33:04.2579056Z 753 │ 2026-10-22T09:33:04.2579183Z ·  ──────────────────── 2026-10-22T09:33:04.2579293Z 754 │ 2026-10-22T09:33:04.2580398Z 768 │ 2026-10-22T09:33:04.2580536Z ·  ──────────────────── 2026-10-22T09:33:04.2580656Z 769 │ 2026-10-22T09:33:04.2580715Z ╰──── 2026-10-22T09:33:04.2580957Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-22T09:33:04.2581116Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-22T09:33:04.2581118Z 2026-10-22T09:33:04.2581302Z ⚠ react(purity): Cannot call impure function during render 2026-10-22T09:33:04.2581442Z ╭─[apps/web/src/hooks/useThreadActions.ts:821:56] 2026-10-22T09:33:04.2581561Z 820 │ const resolved = resolveThreadTarget(target); 2026-10-22T09:33:04.2581737Z 821 │ if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) { 2026-10-22T09:33:04.2581871Z ·  ─────┬──── 2026-10-22T09:33:04.2582061Z · ╰── Cannot call impure function 2026-10-22T09:33:04.2582157Z 822 │ return AsyncResult.failure( 2026-10-22T09:33:04.2582214Z ╰──── 2026-10-22T09:33:04.2582522Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-22T09:33:04.2582854Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-22T09:33:04.2582856Z 2026-10-22T09:33:04.2583042Z ⚠ react(purity): Cannot call impure function during render 2026-10-22T09:33:04.2583172Z ╭─[apps/web/src/hooks/useThreadActions.ts:709:46] 2026-10-22T09:33:04.2583260Z 708 │ const wokeAt = resolved 2026-10-22T09:33:04.2583412Z 709 │ ? threadWokeAt(resolved.thread, { now: new Date().toISOString() }) 2026-10-22T09:33:04.2583627Z ·  ─────┬──── 2026-10-22T09:33:04.2583937Z · ╰── Cannot call impure function 2026-10-22T09:33:04.2584090Z 710 │ : null; 2026-10-22T09:33:04.2584157Z ╰──── 2026-10-22T09:33:04.2584589Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-22T09:33:04.2584968Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-22T09:33:04.2584977Z 2026-10-22T09:33:04.2585196Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T09:33:04.2585358Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:454:7] 2026-10-22T09:33:04.2585461Z 453 │ showAuxiliaryPane("inspector"); 2026-10-22T09:33:04.2585585Z 454 │ }, [environmentId, showAuxiliaryPane, threadId]); 2026-10-22T09:33:04.2585736Z ·  ──────┬────── ────┬─── 2026-10-22T09:33:04.2585959Z · │ ╰── Unnecessary dependency `threadId` 2026-10-22T09:33:04.2586120Z · ╰── Unnecessary dependency `environmentId` 2026-10-22T09:33:04.2586189Z 455 │ const { 2026-10-22T09:33:04.2586242Z ╰──── 2026-10-22T09:33:04.2586562Z  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-22T09:33:04.2586909Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.2586917Z 2026-10-22T09:33:04.2587117Z ⚠ react(static-components): Cannot create components during render 2026-10-22T09:33:04.2587264Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:725:20] 2026-10-22T09:33:04.2587333Z 492 │ // same check. 2026-10-22T09:33:04.2587477Z 493 │ const NativeReviewDiffView = resolveNativeReviewDiffView(); 2026-10-22T09:33:04.2587608Z ·  ─────────────┬───────────── 2026-10-22T09:33:04.2587807Z · ╰── The component is created during render here 2026-10-22T09:33:04.2588080Z 494 │ const nativeReviewDiffViewRef = useRef(null); 2026-10-22T09:33:04.2588322Z 495 │ const showcasedReviewDrawRef = useRef(null); 2026-10-22T09:33:04.2588470Z 496 │ const [isPullRefreshing, setIsPullRefreshing] = useState(false); 2026-10-22T09:33:04.2588576Z 497 │ const handlePullToRefresh = async () => { 2026-10-22T09:33:04.2588663Z 498 │ setIsPullRefreshing(true); 2026-10-22T09:33:04.2588757Z 499 │ await refreshSelectedSection(); 2026-10-22T09:33:04.2588851Z 500 │ setIsPullRefreshing(false); 2026-10-22T09:33:04.2588914Z 501 │ }; 2026-10-22T09:33:04.2589151Z 502 │ const reviewFileNavigatorRef = useRef(null); 2026-10-22T09:33:04.2589310Z 503 │ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : []; 2026-10-22T09:33:04.2589429Z 504 │ const fileVisibility = useReviewFileVisibility({ 2026-10-22T09:33:04.2589527Z 505 │ threadKey: reviewCache.threadKey, 2026-10-22T09:33:04.2589634Z 506 │ sectionId: selectedSection?.id ?? null, 2026-10-22T09:33:04.2589717Z 507 │ files: reviewFiles, 2026-10-22T09:33:04.2589830Z 508 │ cachedExpandedFileIds: selectedSection?.id 2026-10-22T09:33:04.2589977Z 509 │ ? reviewCache.expandedFileIdsBySection[selectedSection.id] 2026-10-22T09:33:04.2590049Z 510 │ : undefined, 2026-10-22T09:33:04.2590157Z 511 │ cachedViewedFileIds: selectedSection?.id 2026-10-22T09:33:04.2590294Z 512 │ ? reviewCache.viewedFileIdsBySection[selectedSection.id] 2026-10-22T09:33:04.2590362Z 513 │ : undefined, 2026-10-22T09:33:04.2590426Z 514 │ }); 2026-10-22T09:33:04.2590640Z 515 │ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility; 2026-10-22T09:33:04.2590787Z 516 │ const commentSelection = useReviewCommentSelectionController({ 2026-10-22T09:33:04.2590862Z 517 │ environmentId, 2026-10-22T09:33:04.2590940Z 518 │ threadId, 2026-10-22T09:33:04.2591018Z 519 │ selectedSection, 2026-10-22T09:33:04.2591099Z 520 │ nativeReviewDiffData, 2026-10-22T09:33:04.2591157Z 521 │ }); 2026-10-22T09:33:04.2591278Z 522 │ const nativeBridge = useNativeReviewDiffBridge({ 2026-10-22T09:33:04.2591377Z 523 │ threadKey: reviewCache.threadKey, 2026-10-22T09:33:04.2591477Z 524 │ sectionId: selectedSection?.id ?? null, 2026-10-22T09:33:04.2591560Z 525 │ diff: selectedSection?.diff, 2026-10-22T09:33:04.2591651Z 526 │ data: nativeReviewDiffData, 2026-10-22T09:33:04.2591728Z 527 │ collapsedFileIds, 2026-10-22T09:33:04.2591801Z 528 │ viewedFileIds, 2026-10-22T09:33:04.2591920Z 529 │ selectedRowIds: commentSelection.selectedRowIds, 2026-10-22T09:33:04.2592030Z 530 │ canHighlight: parsedDiff.kind === "files", 2026-10-22T09:33:04.2592099Z 531 │ }); 2026-10-22T09:33:04.2592189Z 532 │ const showcaseReviewKey = 2026-10-22T09:33:04.2592334Z 533 │ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection 2026-10-22T09:33:04.2592564Z 534 │ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}` 2026-10-22T09:33:04.2592634Z 535 │ : null; 2026-10-22T09:33:04.2592816Z 536 │ const handleNativeDebug = (event: NativeSyntheticEvent>) => { 2026-10-22T09:33:04.2592906Z 537 │ nativeBridge.onDebug(event); 2026-10-22T09:33:04.2592971Z 538 │ if ( 2026-10-22T09:33:04.2593063Z 539 │ showcaseReviewKey === null || 2026-10-22T09:33:04.2593199Z 540 │ showcasedReviewDrawRef.current === showcaseReviewKey || 2026-10-22T09:33:04.2593318Z 541 │ !isNativeReviewDiffDrawEvent(event.nativeEvent) 2026-10-22T09:33:04.2593382Z 542 │ ) { 2026-10-22T09:33:04.2593515Z 543 │ return; 2026-10-22T09:33:04.2593661Z 544 │ } 2026-10-22T09:33:04.2593790Z 545 │ showcasedReviewDrawRef.current = showcaseReviewKey; 2026-10-22T09:33:04.2594008Z 546 │ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId }); 2026-10-22T09:33:04.2594071Z 547 │ }; 2026-10-22T09:33:04.2594134Z 548 │ 2026-10-22T09:33:04.2594269Z 549 │ const handleSelectFile = async (fileId: string | null) => { 2026-10-22T09:33:04.2594414Z 550 │ loadVisibleFile(fileId, true); 2026-10-22T09:33:04.2594543Z 551 │ commentSelection.clearSelection(); 2026-10-22T09:33:04.2594673Z 552 │ if (fileId !== null && collapsedFileIds.includes(fileId)) { 2026-10-22T09:33:04.2594763Z 553 │ toggleExpandedFile(fileId); 2026-10-22T09:33:04.2594824Z 554 │ } 2026-10-22T09:33:04.2594954Z 555 │ const nativeView = nativeReviewDiffViewRef.current; 2026-10-22T09:33:04.2595035Z 556 │ if (!nativeView) return; 2026-10-22T09:33:04.2595141Z 557 │ const result = await settlePromise(() => 2026-10-22T09:33:04.2595331Z 558 │ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true), 2026-10-22T09:33:04.2595406Z 559 │ ); 2026-10-22T09:33:04.2595501Z 560 │ if (AsyncResult.isFailure(result)) { 2026-10-22T09:33:04.2595701Z 561 │ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result)); 2026-10-22T09:33:04.2595761Z 562 │ } 2026-10-22T09:33:04.2595821Z 563 │ }; 2026-10-22T09:33:04.2595910Z 564 │ const handleVisibleFileChange = ( 2026-10-22T09:33:04.2596057Z 565 │ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>, 2026-10-22T09:33:04.2596121Z 566 │ ) => { 2026-10-22T09:33:04.2596250Z 567 │ loadVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-22T09:33:04.2596435Z 568 │ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-22T09:33:04.2596497Z 569 │ }; 2026-10-22T09:33:04.2596587Z 570 │ const renderInspector = () => ( 2026-10-22T09:33:04.2596664Z 571 │ void handleSelectFile(fileId)} 2026-10-22T09:33:04.2597233Z 577 │ /> 2026-10-22T09:33:04.2597297Z 578 │ ); 2026-10-22T09:33:04.2597354Z 579 │ 2026-10-22T09:33:04.2597564Z 580 │ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => { 2026-10-22T09:33:04.2597665Z 581 │ const { fileId } = event.nativeEvent; 2026-10-22T09:33:04.2597739Z 582 │ if (fileId) { 2026-10-22T09:33:04.2597827Z 583 │ loadVisibleFile(fileId, true); 2026-10-22T09:33:04.2597917Z 584 │ toggleExpandedFile(fileId); 2026-10-22T09:33:04.2597979Z 585 │ } 2026-10-22T09:33:04.2598040Z 586 │ }; 2026-10-22T09:33:04.2598096Z 587 │ 2026-10-22T09:33:04.2598198Z 588 │ const handleNativeToggleViewedFile = ( 2026-10-22T09:33:04.2598330Z 589 │ event: NativeSyntheticEvent<{ readonly fileId?: string }>, 2026-10-22T09:33:04.2598397Z 590 │ ) => { 2026-10-22T09:33:04.2598489Z 591 │ const { fileId } = event.nativeEvent; 2026-10-22T09:33:04.2598562Z 592 │ if (fileId) { 2026-10-22T09:33:04.2598648Z 593 │ toggleViewedFile(fileId); 2026-10-22T09:33:04.2598712Z 594 │ } 2026-10-22T09:33:04.2598879Z 595 │ }; 2026-10-22T09:33:04.2599026Z 596 │ 2026-10-22T09:33:04.2599113Z 597 │ const parsedDiffNotice = 2026-10-22T09:33:04.2599291Z 598 │ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null; 2026-10-22T09:33:04.2599430Z 599 │ const hasCachedSelectedDiff = selectedSection?.diff != null; 2026-10-22T09:33:04.2599605Z 600 │ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null); 2026-10-22T09:33:04.2599758Z 601 │ const sectionMenu = buildReviewSectionMenu(reviewSections); 2026-10-22T09:33:04.2599992Z 602 │ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({ 2026-10-22T09:33:04.2600115Z 603 │ hasEnvironmentPresentation: environment.isReady, 2026-10-22T09:33:04.2600233Z 604 │ isEnvironmentConnected: isEnvironmentReady, 2026-10-22T09:33:04.2600321Z 605 │ hasCachedSelectedDiff, 2026-10-22T09:33:04.2600401Z 606 │ hasAnyCachedDiff, 2026-10-22T09:33:04.2600468Z 607 │ }); 2026-10-22T09:33:04.2600568Z 608 │ const handleRetryEnvironment = () => { 2026-10-22T09:33:04.2600667Z 609 │ void retryEnvironment(environmentId); 2026-10-22T09:33:04.2600725Z 610 │ }; 2026-10-22T09:33:04.2600820Z 611 │ const handleReturnToThread = () => { 2026-10-22T09:33:04.2600907Z 612 │ if (navigation.canGoBack()) { 2026-10-22T09:33:04.2600985Z 613 │ navigation.goBack(); 2026-10-22T09:33:04.2601051Z 614 │ return; 2026-10-22T09:33:04.2601115Z 615 │ } 2026-10-22T09:33:04.2601209Z 616 │ navigation.navigate("Thread", { 2026-10-22T09:33:04.2601311Z 617 │ environmentId: String(environmentId), 2026-10-22T09:33:04.2601393Z 618 │ threadId: String(threadId), 2026-10-22T09:33:04.2601460Z 619 │ }); 2026-10-22T09:33:04.2601521Z 620 │ }; 2026-10-22T09:33:04.2601614Z 621 │ const androidHeaderSubtitle = [ 2026-10-22T09:33:04.2601695Z 622 │ selectedSection?.title, 2026-10-22T09:33:04.2601786Z 623 │ headerDiffSummary.additions, 2026-10-22T09:33:04.2601875Z 624 │ headerDiffSummary.deletions, 2026-10-22T09:33:04.2601932Z 625 │ ] 2026-10-22T09:33:04.2602048Z 626 │ .filter((part): part is string => Boolean(part)) 2026-10-22T09:33:04.2602152Z 627 │ .join(" · "); 2026-10-22T09:33:04.2602245Z 628 │ 2026-10-22T09:33:04.2602329Z 629 │ const showChangedFilesPane = 2026-10-22T09:33:04.2602415Z 630 │ !showConnectionNotice && 2026-10-22T09:33:04.2602498Z 631 │ selectedSection !== null && 2026-10-22T09:33:04.2602587Z 632 │ parsedDiff.kind === "files" && 2026-10-22T09:33:04.2602672Z 633 │ NativeReviewDiffView !== null; 2026-10-22T09:33:04.2602867Z 634 │ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined); 2026-10-22T09:33:04.2603056Z 635 │ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane; 2026-10-22T09:33:04.2603115Z 636 │ 2026-10-22T09:33:04.2603194Z 637 │ const listHeader = (() => { 2026-10-22T09:33:04.2603293Z 638 │ const children: ReactElement[] = []; 2026-10-22T09:33:04.2603354Z 639 │ 2026-10-22T09:33:04.2603428Z 640 │ if (error) { 2026-10-22T09:33:04.2603501Z 641 │ children.push( 2026-10-22T09:33:04.2603570Z 642 │ 2026-10-22T09:33:04.2604541Z 649 │ Review unavailable 2026-10-22T09:33:04.2604714Z 650 │ {error} 2026-10-22T09:33:04.2604783Z 651 │ , 2026-10-22T09:33:04.2604843Z 652 │ ); 2026-10-22T09:33:04.2604908Z 653 │ } 2026-10-22T09:33:04.2604969Z 654 │ 2026-10-22T09:33:04.2605068Z 655 │ if (parsedDiffNotice) { 2026-10-22T09:33:04.2605299Z 656 │ children.push(); 2026-10-22T09:33:04.2605365Z 657 │ } 2026-10-22T09:33:04.2605427Z 658 │ 2026-10-22T09:33:04.2605514Z 659 │ if (children.length === 0) { 2026-10-22T09:33:04.2605582Z 660 │ return null; 2026-10-22T09:33:04.2605646Z 661 │ } 2026-10-22T09:33:04.2605714Z 662 │ 2026-10-22T09:33:04.2605801Z 663 │ return <>{children}; 2026-10-22T09:33:04.2605861Z 664 │ })(); 2026-10-22T09:33:04.2605940Z 665 │ const headerSubtitle = [ 2026-10-22T09:33:04.2606028Z 666 │ headerDiffSummary.additions, 2026-10-22T09:33:04.2606111Z 667 │ headerDiffSummary.deletions, 2026-10-22T09:33:04.2606203Z 668 │ pendingReviewCommentCount > 0 2026-10-22T09:33:04.2606393Z 669 │ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}` 2026-10-22T09:33:04.2606461Z 670 │ : null, 2026-10-22T09:33:04.2606519Z 671 │ ] 2026-10-22T09:33:04.2606592Z 672 │ .filter(Boolean) 2026-10-22T09:33:04.2606663Z 673 │ .join(" · "); 2026-10-22T09:33:04.2606815Z 674 │ const headerTitleText = selectedSection?.title ?? "Review changes"; 2026-10-22T09:33:04.2606873Z 675 │ 2026-10-22T09:33:04.2606944Z 676 │ return ( 2026-10-22T09:33:04.2607014Z 677 │ <> 2026-10-22T09:33:04.2607093Z 678 │ 2026-10-22T09:33:04.2608577Z 694 │ 2026-10-22T09:33:04.2608653Z 695 │ 2026-10-22T09:33:04.2608790Z 696 │ 2026-10-22T09:33:04.2608880Z 697 │ {showConnectionNotice ? ( 2026-10-22T09:33:04.2609031Z 698 │ 2026-10-22T09:33:04.2609133Z 699 │ 2026-10-22T09:33:04.2610503Z 711 │ 2026-10-22T09:33:04.2610680Z 712 │ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? ( 2026-10-22T09:33:04.2610754Z 713 │ 2026-10-22T09:33:04.2611281Z 719 │ 2026-10-22T09:33:04.2611680Z 723 │ {listHeader} 2026-10-22T09:33:04.2611817Z 724 │ 2026-10-22T09:33:04.2611906Z 725 │ { 2026-10-22T09:33:04.2613743Z ·  ────┬──── 2026-10-22T09:33:04.2613893Z · ╰── This is the containing effect 2026-10-22T09:33:04.2614034Z 106 │ clearReviewCommentTarget(); 2026-10-22T09:33:04.2614151Z 107 │ setPendingNativeCommentSelection(null); 2026-10-22T09:33:04.2614272Z ·  ────────────────┬─────────────── 2026-10-22T09:33:04.2614468Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.2614548Z 108 │ }, [selectedSection?.id]); 2026-10-22T09:33:04.2614612Z ╰──── 2026-10-22T09:33:04.2615353Z  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-22T09:33:04.2615798Z  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-22T09:33:04.2615801Z 2026-10-22T09:33:04.2616087Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T09:33:04.2616363Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7] 2026-10-22T09:33:04.2616430Z 109 │ 2026-10-22T09:33:04.2616504Z 110 │ useEffect(() => { 2026-10-22T09:33:04.2616585Z ·  ────┬──── 2026-10-22T09:33:04.2616735Z · ╰── This is the containing effect 2026-10-22T09:33:04.2616844Z 111 │ if (activeCommentTarget === null) { 2026-10-22T09:33:04.2616956Z 112 │ setPendingNativeCommentSelection(null); 2026-10-22T09:33:04.2617080Z ·  ────────────────┬─────────────── 2026-10-22T09:33:04.2617272Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.2617337Z 113 │ } 2026-10-22T09:33:04.2617396Z ╰──── 2026-10-22T09:33:04.2618040Z  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-22T09:33:04.2618395Z  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-22T09:33:04.2618408Z 2026-10-22T09:33:04.2618623Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T09:33:04.2618825Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7] 2026-10-22T09:33:04.2618937Z 107 │ setPendingNativeCommentSelection(null); 2026-10-22T09:33:04.2619027Z 108 │ }, [selectedSection?.id]); 2026-10-22T09:33:04.2619120Z ·  ─────────┬───────── 2026-10-22T09:33:04.2619301Z · ╰── Unnecessary dependency `selectedSection?.id` 2026-10-22T09:33:04.2619362Z 109 │ 2026-10-22T09:33:04.2619422Z ╰──── 2026-10-22T09:33:04.2619745Z  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-22T09:33:04.2620093Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.2620095Z 2026-10-22T09:33:04.2620311Z ⚠ eslint(no-unsafe-optional-chaining): Unsafe usage of optional chaining 2026-10-22T09:33:04.2620495Z ╭─[apps/server/src/orchestration-v2/ThreadLaunchService.test.ts:1783:8] 2026-10-22T09:33:04.2620569Z 1782 │ assert.equal( 2026-10-22T09:33:04.2620731Z 1783 │ (stored.context?.records[0] as { attachmentId: string }).attachmentId, 2026-10-22T09:33:04.2620844Z ·  ────────────────────────── 2026-10-22T09:33:04.2621014Z 1784 │ stored.attachments[0]?.id, 2026-10-22T09:33:04.2621147Z ╰──── 2026-10-22T09:33:04.2621339Z  help: If this short-circuits with 'undefined' the evaluation will throw TypeError 2026-10-22T09:33:04.2621343Z 2026-10-22T09:33:04.2621627Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T09:33:04.2621838Z ╭─[apps/mobile/src/features/review/ReviewCommentComposerSheet.tsx:103:7] 2026-10-22T09:33:04.2621932Z 100 │ 2026-10-22T09:33:04.2622011Z 101 │ useEffect(() => { 2026-10-22T09:33:04.2622096Z ·  ────┬──── 2026-10-22T09:33:04.2622247Z · ╰── This is the containing effect 2026-10-22T09:33:04.2622364Z 102 │ if (!target || selectedLines.length === 0) { 2026-10-22T09:33:04.2622455Z 103 │ setHighlightedLinesById({}); 2026-10-22T09:33:04.2622562Z ·  ───────────┬─────────── 2026-10-22T09:33:04.2622760Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.2622829Z 104 │ return; 2026-10-22T09:33:04.2622885Z ╰──── 2026-10-22T09:33:04.2623537Z  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-22T09:33:04.2623893Z  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-22T09:33:04.2623896Z 2026-10-22T09:33:04.2624131Z ⚠ react(immutability): This value cannot be modified 2026-10-22T09:33:04.2624315Z ╭─[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5] 2026-10-22T09:33:04.2624435Z 65 │ const [expanded, setExpanded] = useState(false); 2026-10-22T09:33:04.2624701Z 66 │ const progress = useSharedValue(0); 2026-10-22T09:33:04.2624792Z ·  ────┬─── 2026-10-22T09:33:04.2624936Z · ╰── `progress` originates here 2026-10-22T09:33:04.2625013Z 67 │ useEffect(() => { 2026-10-22T09:33:04.2625156Z 68 │ progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING); 2026-10-22T09:33:04.2625241Z ·  ────┬─── 2026-10-22T09:33:04.2625387Z · ╰── `progress` cannot be modified 2026-10-22T09:33:04.2625472Z 69 │ }, [expanded, progress]); 2026-10-22T09:33:04.2625637Z ╰──── 2026-10-22T09:33:04.2626070Z  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-22T09:33:04.2626427Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T09:33:04.2626431Z 2026-10-22T09:33:04.2626676Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.2626866Z ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14] 2026-10-22T09:33:04.2626960Z 26 │ const latestInput = useRef(input); 2026-10-22T09:33:04.2627051Z 27 │ latestInput.current = input; 2026-10-22T09:33:04.2627172Z ·  ─────┬─────────┬─── 2026-10-22T09:33:04.2627377Z · │ ╰── Cannot update ref value during render 2026-10-22T09:33:04.2627508Z · ╰── This value is a ref 2026-10-22T09:33:04.2627598Z 28 │ const mounted = useRef(true); 2026-10-22T09:33:04.2627655Z ╰──── 2026-10-22T09:33:04.2628173Z  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-22T09:33:04.2628492Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.2628495Z 2026-10-22T09:33:04.2628782Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T09:33:04.2628975Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:60:5] 2026-10-22T09:33:04.2629032Z 55 │ 2026-10-22T09:33:04.2629106Z 56 │ useEffect(() => { 2026-10-22T09:33:04.2629188Z ·  ────┬──── 2026-10-22T09:33:04.2629329Z · ╰── This is the containing effect 2026-10-22T09:33:04.2629403Z 57 │ scheduler.reset(); 2026-10-22T09:33:04.2629518Z 58 │ highlightedRowIdsRef.current = new Set(); 2026-10-22T09:33:04.2629616Z 59 │ visibleChunkIndexRef.current = 0; 2026-10-22T09:33:04.2629746Z 60 │ setVisibleRange({ firstRowIndex: 0, lastRowIndex: 80 }); 2026-10-22T09:33:04.2629835Z ·  ───────┬─────── 2026-10-22T09:33:04.2630028Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.2630159Z 61 │ setTokensPatchJson(createEmptyTokenPatch(resetKey)); 2026-10-22T09:33:04.2630223Z ╰──── 2026-10-22T09:33:04.2630870Z  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-22T09:33:04.2631223Z  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-22T09:33:04.2631226Z 2026-10-22T09:33:04.2631443Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T09:33:04.2631706Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:63:7] 2026-10-22T09:33:04.2631918Z 62 │ return () => scheduler.cancel(); 2026-10-22T09:33:04.2632029Z 63 │ }, [enabled, resetKey, rows.length, scheduler]); 2026-10-22T09:33:04.2632170Z ·  ───┬─── ─────┬───── 2026-10-22T09:33:04.2632380Z · │ ╰── Unnecessary dependency `rows.length` 2026-10-22T09:33:04.2632575Z · ╰── Unnecessary dependency `enabled` 2026-10-22T09:33:04.2632661Z 64 │ 2026-10-22T09:33:04.2632729Z ╰──── 2026-10-22T09:33:04.2633052Z  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-22T09:33:04.2633397Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.2633403Z 2026-10-22T09:33:04.2633559Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.2633736Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:122:38] 2026-10-22T09:33:04.2633914Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-22T09:33:04.2634086Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-22T09:33:04.2634221Z ·  ───────────┬────────── 2026-10-22T09:33:04.2634414Z · ╰── Cannot access ref value during render 2026-10-22T09:33:04.2634555Z 123 │ const sessionRef = useRef(null); 2026-10-22T09:33:04.2634630Z ╰──── 2026-10-22T09:33:04.2635136Z  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-22T09:33:04.2635455Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.2635457Z 2026-10-22T09:33:04.2635620Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.2692727Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8] 2026-10-22T09:33:04.2693151Z 125 │ 2026-10-22T09:33:04.2693336Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-22T09:33:04.2693503Z ·  ─────────┬──────── 2026-10-22T09:33:04.2693729Z · ╰── Cannot access ref value during render 2026-10-22T09:33:04.2693858Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-22T09:33:04.2693920Z ╰──── 2026-10-22T09:33:04.2694534Z  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-22T09:33:04.2694889Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.2694908Z 2026-10-22T09:33:04.2695082Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.2695805Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7] 2026-10-22T09:33:04.2695991Z 125 │ 2026-10-22T09:33:04.2696178Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-22T09:33:04.2696318Z ·  ─────────┬───────── 2026-10-22T09:33:04.2696488Z · ╰── Cannot access ref value during render 2026-10-22T09:33:04.2696601Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-22T09:33:04.2696662Z ╰──── 2026-10-22T09:33:04.2697257Z  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-22T09:33:04.2697592Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.2697605Z 2026-10-22T09:33:04.2697768Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.2697942Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31] 2026-10-22T09:33:04.2698005Z 125 │ 2026-10-22T09:33:04.2698122Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-22T09:33:04.2698255Z ·  ─────────┬───────── 2026-10-22T09:33:04.2698445Z · ╰── Cannot access ref value during render 2026-10-22T09:33:04.2698557Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-22T09:33:04.2698612Z ╰──── 2026-10-22T09:33:04.2699120Z  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-22T09:33:04.2699438Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.2699441Z 2026-10-22T09:33:04.2699599Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.2699768Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30] 2026-10-22T09:33:04.2699828Z 125 │ 2026-10-22T09:33:04.2699942Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-22T09:33:04.2700071Z ·  ──────────┬───────── 2026-10-22T09:33:04.2700253Z · ╰── Cannot access ref value during render 2026-10-22T09:33:04.2700368Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-22T09:33:04.2700429Z ╰──── 2026-10-22T09:33:04.2700934Z  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-22T09:33:04.2701249Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.2701252Z 2026-10-22T09:33:04.2701406Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.2701693Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46] 2026-10-22T09:33:04.2701903Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-22T09:33:04.2702119Z 127 │ ╭─▶ const recorder = createLazyVoiceRecorder({ 2026-10-22T09:33:04.2702309Z 128 │ │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-22T09:33:04.2702452Z 129 │ │ onStatus: (status: RecordingStatus) => { 2026-10-22T09:33:04.2702698Z 130 │ │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-22T09:33:04.2702834Z 131 │ │ isFinished: status.isFinished, 2026-10-22T09:33:04.2703033Z 132 │ │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-22T09:33:04.2703158Z 133 │ │ error: status.error, 2026-10-22T09:33:04.2703273Z 134 │ │ url: status.url, 2026-10-22T09:33:04.2703366Z 135 │ │ }); 2026-10-22T09:33:04.2703453Z 136 │ │ }, 2026-10-22T09:33:04.2703661Z 137 │ │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-22T09:33:04.2703786Z 138 │ │ selectInput: (inputs) => { 2026-10-22T09:33:04.2703995Z 139 │ │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-22T09:33:04.2704169Z 140 │ │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-22T09:33:04.2704349Z 141 │ │ const known = microphoneOrder(preferences.value.microphones); 2026-10-22T09:33:04.2704669Z 142 │ │ const order = rememberMicrophones(known, inputs); 2026-10-22T09:33:04.2704858Z 143 │ │ if (order !== known) { 2026-10-22T09:33:04.2705019Z 144 │ │ registry.set(updateMobilePreferencesAtom, { 2026-10-22T09:33:04.2705143Z 145 │ │ transform: (current) => ({ 2026-10-22T09:33:04.2705369Z 146 │ │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-22T09:33:04.2705468Z 147 │ │ }), 2026-10-22T09:33:04.2705559Z 148 │ │ }); 2026-10-22T09:33:04.2705645Z 149 │ │ } 2026-10-22T09:33:04.2705800Z 150 │ │ return preferredMicrophoneInput(inputs, order); 2026-10-22T09:33:04.2705887Z 151 │ │ }, 2026-10-22T09:33:04.2706039Z 152 │ ├─▶ }); 2026-10-22T09:33:04.2706299Z · ╰──── Passing a ref to a function may read its value during render 2026-10-22T09:33:04.2706396Z 153 │ recorderRef.current = recorder; 2026-10-22T09:33:04.2706457Z ╰──── 2026-10-22T09:33:04.2706971Z  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-22T09:33:04.2707291Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.2707293Z 2026-10-22T09:33:04.2707598Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.2707866Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16] 2026-10-22T09:33:04.2707941Z 152 │ }); 2026-10-22T09:33:04.2708038Z 153 │ recorderRef.current = recorder; 2026-10-22T09:33:04.2708162Z ·  ─────┬─────────┬─── 2026-10-22T09:33:04.2708366Z · │ ╰── Cannot update ref value during render 2026-10-22T09:33:04.2708519Z · ╰── This value is a ref 2026-10-22T09:33:04.2708689Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-22T09:33:04.2708745Z ╰──── 2026-10-22T09:33:04.2709263Z  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-22T09:33:04.2709582Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.2709584Z 2026-10-22T09:33:04.2709743Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.2709917Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48] 2026-10-22T09:33:04.2710012Z 153 │ recorderRef.current = recorder; 2026-10-22T09:33:04.2710221Z 154 │ ╭─▶ sessionRef.current = new VoiceInputSession({ 2026-10-22T09:33:04.2710318Z 155 │ │ recorder, 2026-10-22T09:33:04.2710470Z 156 │ │ getTranscriber: getLocalVoiceTranscriber, 2026-10-22T09:33:04.2710599Z 157 │ │ requestPermission: async () => { 2026-10-22T09:33:04.2710779Z 158 │ │ const permission = await requestRecordingPermissionsAsync(); 2026-10-22T09:33:04.2710995Z 159 │ │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-22T09:33:04.2711086Z 160 │ │ }, 2026-10-22T09:33:04.2711241Z 161 │ │ configureRecording: configureVoiceRecordingAudio, 2026-10-22T09:33:04.2711396Z 162 │ │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-22T09:33:04.2711548Z 163 │ │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-22T09:33:04.2711673Z 164 │ │ onStateChange: (nextState) => 2026-10-22T09:33:04.2711784Z 165 │ │ setState({ 2026-10-22T09:33:04.2711896Z 166 │ │ state: nextState, 2026-10-22T09:33:04.2712050Z 167 │ │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-22T09:33:04.2712192Z 168 │ │ label: sessionRef.current?.label ?? null, 2026-10-22T09:33:04.2712288Z 169 │ │ }), 2026-10-22T09:33:04.2712425Z 170 │ ├─▶ }); 2026-10-22T09:33:04.2712644Z · ╰──── Cannot access ref value during render 2026-10-22T09:33:04.2712708Z 171 │ } 2026-10-22T09:33:04.2712767Z ╰──── 2026-10-22T09:33:04.2713341Z  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-22T09:33:04.2713744Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.2713747Z 2026-10-22T09:33:04.2713907Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.2714125Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15] 2026-10-22T09:33:04.2714247Z 153 │ recorderRef.current = recorder; 2026-10-22T09:33:04.2714403Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-22T09:33:04.2714530Z ·  ─────┬────────┬─── 2026-10-22T09:33:04.2714742Z · │ ╰── Cannot update ref value during render 2026-10-22T09:33:04.2714876Z · ╰── This value is a ref 2026-10-22T09:33:04.2714949Z 155 │ recorder, 2026-10-22T09:33:04.2715009Z ╰──── 2026-10-22T09:33:04.2715514Z  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-22T09:33:04.2715829Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.2715832Z 2026-10-22T09:33:04.2715987Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.2716167Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7] 2026-10-22T09:33:04.2716275Z 184 │ return () => subscription.remove(); 2026-10-22T09:33:04.2716353Z 185 │ }, [controller]); 2026-10-22T09:33:04.2716439Z ·  ─────┬──── 2026-10-22T09:33:04.2716599Z · ╰── Cannot access ref value during render 2026-10-22T09:33:04.2716663Z 186 │ 2026-10-22T09:33:04.2716723Z ╰──── 2026-10-22T09:33:04.2717216Z  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-22T09:33:04.2717601Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.2717641Z 2026-10-22T09:33:04.2717836Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.2718014Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6] 2026-10-22T09:33:04.2718112Z 184 │ return () => subscription.remove(); 2026-10-22T09:33:04.2718182Z 185 │ }, [controller]); 2026-10-22T09:33:04.2718270Z ·  ──────┬───── 2026-10-22T09:33:04.2718449Z · ╰── Cannot access ref value during render 2026-10-22T09:33:04.2718547Z 186 │ 2026-10-22T09:33:04.2718623Z ╰──── 2026-10-22T09:33:04.2719140Z  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-22T09:33:04.2719458Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.2719461Z 2026-10-22T09:33:04.2719619Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.2719790Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6] 2026-10-22T09:33:04.2719852Z 191 │ }, 2026-10-22T09:33:04.2719934Z 192 │ [controller, recorder], 2026-10-22T09:33:04.2720023Z ·  ─────┬──── 2026-10-22T09:33:04.2720173Z · ╰── Cannot access ref value during render 2026-10-22T09:33:04.2720243Z 193 │ ); 2026-10-22T09:33:04.2720302Z ╰──── 2026-10-22T09:33:04.2720804Z  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-22T09:33:04.2721116Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.2721119Z 2026-10-22T09:33:04.2721272Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.2721449Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20] 2026-10-22T09:33:04.2721555Z 174 │ const controller = session.controller; 2026-10-22T09:33:04.2721655Z 175 │ const recorder = recorderRef.current; 2026-10-22T09:33:04.2721765Z ·  ─────────┬───────── 2026-10-22T09:33:04.2721949Z · ╰── Cannot access ref value during render 2026-10-22T09:33:04.2722014Z 176 │ 2026-10-22T09:33:04.2722076Z ╰──── 2026-10-22T09:33:04.2722569Z  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-22T09:33:04.2722883Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.2722885Z 2026-10-22T09:33:04.2723044Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.2723213Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5] 2026-10-22T09:33:04.2723350Z 191 │ }, 2026-10-22T09:33:04.2723510Z 192 │ [controller, recorder], 2026-10-22T09:33:04.2723610Z ·  ───────────┬────────── 2026-10-22T09:33:04.2723773Z · ╰── Cannot access ref value during render 2026-10-22T09:33:04.2723835Z 193 │ ); 2026-10-22T09:33:04.2723891Z ╰──── 2026-10-22T09:33:04.2724536Z  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-22T09:33:04.2724850Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.2724853Z 2026-10-22T09:33:04.2725018Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.2725193Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20] 2026-10-22T09:33:04.2725292Z 245 │ return () => clearInterval(intervalId); 2026-10-22T09:33:04.2725417Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-22T09:33:04.2725517Z ·  ─────┬──── 2026-10-22T09:33:04.2725688Z · ╰── Cannot access ref value during render 2026-10-22T09:33:04.2725745Z 247 │ 2026-10-22T09:33:04.2725805Z ╰──── 2026-10-22T09:33:04.2726307Z  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-22T09:33:04.2726624Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.2726630Z 2026-10-22T09:33:04.2726781Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.2726954Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6] 2026-10-22T09:33:04.2727056Z 245 │ return () => clearInterval(intervalId); 2026-10-22T09:33:04.2727179Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-22T09:33:04.2727316Z ·  ────────────────────────┬─────────────────────── 2026-10-22T09:33:04.2727487Z · ╰── Cannot access ref value during render 2026-10-22T09:33:04.2727548Z 247 │ 2026-10-22T09:33:04.2727605Z ╰──── 2026-10-22T09:33:04.2728107Z  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-22T09:33:04.2728424Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.2728428Z 2026-10-22T09:33:04.2728584Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.2728761Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5] 2026-10-22T09:33:04.2728844Z 260 │ setOwnerFocused, 2026-10-22T09:33:04.2728911Z 261 │ session, 2026-10-22T09:33:04.2728996Z ·  ───┬─── 2026-10-22T09:33:04.2729218Z · ╰── Cannot access ref value during render 2026-10-22T09:33:04.2729375Z 262 │ stop, 2026-10-22T09:33:04.2729435Z ╰──── 2026-10-22T09:33:04.2729934Z  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-22T09:33:04.2730328Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.2730331Z 2026-10-22T09:33:04.2730488Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.2730661Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10] 2026-10-22T09:33:04.2730728Z 250 │ 2026-10-22T09:33:04.2730889Z 251 │ ╭─▶ return { 2026-10-22T09:33:04.2731123Z 252 │ │ isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null, 2026-10-22T09:33:04.2731214Z 253 │ │ state, 2026-10-22T09:33:04.2731309Z 254 │ │ audioLevels, 2026-10-22T09:33:04.2731417Z 255 │ │ elapsedSeconds, 2026-10-22T09:33:04.2731562Z 256 │ │ isBusy: voiceInputBlocksSubmission(state), 2026-10-22T09:33:04.2731655Z 257 │ │ ownerKey, 2026-10-22T09:33:04.2731739Z 258 │ │ label, 2026-10-22T09:33:04.2731846Z 259 │ │ focusedOwners, 2026-10-22T09:33:04.2731965Z 260 │ │ setOwnerFocused, 2026-10-22T09:33:04.2732059Z 261 │ │ session, 2026-10-22T09:33:04.2732142Z 262 │ │ stop, 2026-10-22T09:33:04.2732233Z 263 │ │ cancel, 2026-10-22T09:33:04.2732376Z 264 │ ├─▶ }; 2026-10-22T09:33:04.2732595Z · ╰──── Cannot access ref value during render 2026-10-22T09:33:04.2732654Z 265 │ } 2026-10-22T09:33:04.2732715Z ╰──── 2026-10-22T09:33:04.2733216Z  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-22T09:33:04.2733534Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.2733539Z 2026-10-22T09:33:04.2733708Z ⚠ react(immutability): This value cannot be modified 2026-10-22T09:33:04.2733889Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-22T09:33:04.2734124Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-22T09:33:04.2734265Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-22T09:33:04.2734361Z ·  ─────┬───── 2026-10-22T09:33:04.2734508Z · ╰── `audioLevels` originates here 2026-10-22T09:33:04.2734642Z 123 │ const sessionRef = useRef(null); 2026-10-22T09:33:04.2734883Z 124 │ const recorderRef = useRef | null>(null); 2026-10-22T09:33:04.2735037Z 125 │ 2026-10-22T09:33:04.2735160Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-22T09:33:04.2735277Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-22T09:33:04.2735433Z 128 │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-22T09:33:04.2735540Z 129 │ onStatus: (status: RecordingStatus) => { 2026-10-22T09:33:04.2735690Z 130 │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-22T09:33:04.2735841Z 131 │ isFinished: status.isFinished, 2026-10-22T09:33:04.2736006Z 132 │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-22T09:33:04.2736094Z 133 │ error: status.error, 2026-10-22T09:33:04.2736168Z 134 │ url: status.url, 2026-10-22T09:33:04.2736248Z 135 │ }); 2026-10-22T09:33:04.2736323Z 136 │ }, 2026-10-22T09:33:04.2736505Z 137 │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-22T09:33:04.2736597Z 138 │ selectInput: (inputs) => { 2026-10-22T09:33:04.2736742Z 139 │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-22T09:33:04.2736865Z 140 │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-22T09:33:04.2737007Z 141 │ const known = microphoneOrder(preferences.value.microphones); 2026-10-22T09:33:04.2737125Z 142 │ const order = rememberMicrophones(known, inputs); 2026-10-22T09:33:04.2737212Z 143 │ if (order !== known) { 2026-10-22T09:33:04.2737332Z 144 │ registry.set(updateMobilePreferencesAtom, { 2026-10-22T09:33:04.2737422Z 145 │ transform: (current) => ({ 2026-10-22T09:33:04.2737620Z 146 │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-22T09:33:04.2737693Z 147 │ }), 2026-10-22T09:33:04.2737766Z 148 │ }); 2026-10-22T09:33:04.2737832Z 149 │ } 2026-10-22T09:33:04.2737955Z 150 │ return preferredMicrophoneInput(inputs, order); 2026-10-22T09:33:04.2738022Z 151 │ }, 2026-10-22T09:33:04.2738087Z 152 │ }); 2026-10-22T09:33:04.2738174Z 153 │ recorderRef.current = recorder; 2026-10-22T09:33:04.2738291Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-22T09:33:04.2738360Z 155 │ recorder, 2026-10-22T09:33:04.2738469Z 156 │ getTranscriber: getLocalVoiceTranscriber, 2026-10-22T09:33:04.2738561Z 157 │ requestPermission: async () => { 2026-10-22T09:33:04.2738708Z 158 │ const permission = await requestRecordingPermissionsAsync(); 2026-10-22T09:33:04.2738887Z 159 │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-22T09:33:04.2738958Z 160 │ }, 2026-10-22T09:33:04.2739076Z 161 │ configureRecording: configureVoiceRecordingAudio, 2026-10-22T09:33:04.2739195Z 162 │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-22T09:33:04.2739312Z 163 │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-22T09:33:04.2739402Z 164 │ onStateChange: (nextState) => 2026-10-22T09:33:04.2739474Z 165 │ setState({ 2026-10-22T09:33:04.2739553Z 166 │ state: nextState, 2026-10-22T09:33:04.2739670Z 167 │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-22T09:33:04.2739781Z 168 │ label: sessionRef.current?.label ?? null, 2026-10-22T09:33:04.2739844Z 169 │ }), 2026-10-22T09:33:04.2739910Z 170 │ }); 2026-10-22T09:33:04.2739973Z 171 │ } 2026-10-22T09:33:04.2740105Z 172 │ 2026-10-22T09:33:04.2740282Z 173 │ const session = sessionRef.current; 2026-10-22T09:33:04.2740384Z 174 │ const controller = session.controller; 2026-10-22T09:33:04.2740480Z 175 │ const recorder = recorderRef.current; 2026-10-22T09:33:04.2740540Z 176 │ 2026-10-22T09:33:04.2740619Z 177 │ useEffect(() => { 2026-10-22T09:33:04.2740785Z 178 │ const subscription = AppState.addEventListener("change", (nextState) => { 2026-10-22T09:33:04.2740991Z 179 │ // iOS reports `inactive` while its permission dialog is open. Only the 2026-10-22T09:33:04.2741163Z 180 │ // real background state cancels preparation; recorder status handles 2026-10-22T09:33:04.2741292Z 181 │ // calls and route interruptions during capture. 2026-10-22T09:33:04.2741444Z 182 │ if (nextState === "background") controller.appMovedToBackground(); 2026-10-22T09:33:04.2741507Z 183 │ }); 2026-10-22T09:33:04.2741624Z 184 │ return () => subscription.remove(); 2026-10-22T09:33:04.2741703Z 185 │ }, [controller]); 2026-10-22T09:33:04.2741762Z 186 │ 2026-10-22T09:33:04.2741830Z 187 │ useEffect( 2026-10-22T09:33:04.2741898Z 188 │ () => () => { 2026-10-22T09:33:04.2741982Z 189 │ controller.dispose(); 2026-10-22T09:33:04.2742058Z 190 │ recorder.release(); 2026-10-22T09:33:04.2742122Z 191 │ }, 2026-10-22T09:33:04.2742196Z 192 │ [controller, recorder], 2026-10-22T09:33:04.2742260Z 193 │ ); 2026-10-22T09:33:04.2742326Z 194 │ 2026-10-22T09:33:04.2742393Z 195 │ useEffect(() => { 2026-10-22T09:33:04.2742498Z 196 │ if (state.phase !== "recording") return; 2026-10-22T09:33:04.2742558Z 197 │ 2026-10-22T09:33:04.2742721Z 198 │ const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`; 2026-10-22T09:33:04.2742841Z 199 │ const activation = activateKeepAwakeAsync(tag); 2026-10-22T09:33:04.2742937Z 200 │ void activation.catch(() => {}); 2026-10-22T09:33:04.2743010Z 201 │ return () => { 2026-10-22T09:33:04.2743178Z 202 │ // Release after activation settles, even if the recording ends immediately. 2026-10-22T09:33:04.2743327Z 203 │ void activation.then(() => deactivateKeepAwake(tag)).catch(() => {}); 2026-10-22T09:33:04.2743390Z 204 │ }; 2026-10-22T09:33:04.2743493Z 205 │ }, [keepAwakeId, state.phase]); 2026-10-22T09:33:04.2743555Z 206 │ 2026-10-22T09:33:04.2743622Z 207 │ useEffect(() => { 2026-10-22T09:33:04.2743769Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-22T09:33:04.2743830Z 209 │ 2026-10-22T09:33:04.2743999Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-22T09:33:04.2744188Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-22T09:33:04.2744322Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-22T09:33:04.2744411Z ·  ─────┬───── 2026-10-22T09:33:04.2744690Z · ╰── `audioLevels` cannot be modified 2026-10-22T09:33:04.2744750Z 213 │ } 2026-10-22T09:33:04.2744818Z ╰──── 2026-10-22T09:33:04.2745108Z  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-22T09:33:04.2745458Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T09:33:04.2745461Z 2026-10-22T09:33:04.2745681Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-22T09:33:04.2745994Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-22T09:33:04.2746166Z 206 │ 2026-10-22T09:33:04.2746253Z 207 │ useEffect(() => { 2026-10-22T09:33:04.2746340Z ·  ───┬─── 2026-10-22T09:33:04.2746600Z · ╰── This function may (indirectly) reassign or modify `audioLevels` after render 2026-10-22T09:33:04.2746759Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-22T09:33:04.2746819Z 209 │ 2026-10-22T09:33:04.2747031Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-22T09:33:04.2747232Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-22T09:33:04.2747350Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-22T09:33:04.2747449Z ·  ─────┬───── 2026-10-22T09:33:04.2747596Z · ╰── This modifies `audioLevels` 2026-10-22T09:33:04.2747659Z 213 │ } 2026-10-22T09:33:04.2747720Z ╰──── 2026-10-22T09:33:04.2748098Z  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-22T09:33:04.2748432Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T09:33:04.2748435Z 2026-10-22T09:33:04.2748943Z ⚠ 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-22T09:33:04.2749135Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7] 2026-10-22T09:33:04.2749249Z 565 │ let afterSequence = created[0]!.sequence; 2026-10-22T09:33:04.2749465Z 566 │ ╭─▶ for (let index = 1; index <= 32; index += 1) { 2026-10-22T09:33:04.2749582Z 567 │ │ const nextEvent = { 2026-10-22T09:33:04.2749751Z 568 │ │ id: EventId.make(`event:foundation-stream-race:${index}`), 2026-10-22T09:33:04.2749897Z 569 │ │ type: "thread.metadata-updated" as const, 2026-10-22T09:33:04.2750000Z 570 │ │ threadId, 2026-10-22T09:33:04.2750115Z 571 │ │ providerInstanceId, 2026-10-22T09:33:04.2750286Z 572 │ │ occurredAt: now, 2026-10-22T09:33:04.2750554Z 573 │ │ payload: { ...thread, title: `Race update ${index}` }, 2026-10-22T09:33:04.2750761Z 574 │ │ } satisfies OrchestrationV2DomainEvent; 2026-10-22T09:33:04.2750954Z 575 │ │ const reader = yield* eventSink 2026-10-22T09:33:04.2751157Z 576 │ │ .stream({ threadId, afterSequence }) 2026-10-22T09:33:04.2751377Z 577 │ │ .pipe(Stream.runHead, Effect.forkChild); 2026-10-22T09:33:04.2751560Z 578 │ │ yield* Effect.yieldNow; 2026-10-22T09:33:04.2751835Z 579 │ │ const written = yield* eventSink.write({ events: [nextEvent] }); 2026-10-22T09:33:04.2752049Z 580 │ │ const received = yield* Fiber.join(reader); 2026-10-22T09:33:04.2752259Z 581 │ │ if (Option.isNone(received)) { 2026-10-22T09:33:04.2752609Z 582 │ │ return yield* Effect.die("The event stream ended before delivering the live event."); 2026-10-22T09:33:04.2752745Z 583 │ │ } 2026-10-22T09:33:04.2753015Z 584 │ │ assert.equal(received.value.sequence, written[0]?.sequence); 2026-10-22T09:33:04.2753264Z 585 │ │ assert.equal(received.value.event.id, nextEvent.id); 2026-10-22T09:33:04.2753488Z 586 │ │ afterSequence = received.value.sequence; 2026-10-22T09:33:04.2753710Z 587 │ ╰─▶ } 2026-10-22T09:33:04.2753807Z 588 │ }), 2026-10-22T09:33:04.2753903Z ╰──── 2026-10-22T09:33:04.2753907Z 2026-10-22T09:33:04.2754802Z ⚠ 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-22T09:33:04.2755099Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:2327:9] 2026-10-22T09:33:04.2755232Z 2326 │ let settled = false; 2026-10-22T09:33:04.2755502Z 2327 │ ╭─▶ while (!settled) { 2026-10-22T09:33:04.2755778Z 2328 │ │ settled = (yield* outbox.listByCommandId(commandId)).every( 2026-10-22T09:33:04.2756012Z 2329 │ │ (effect) => effect.status === "succeeded", 2026-10-22T09:33:04.2756151Z 2330 │ │ ); 2026-10-22T09:33:04.2756366Z 2331 │ │ if (!settled) yield* Effect.yieldNow; 2026-10-22T09:33:04.2756603Z 2332 │ ╰─▶ } 2026-10-22T09:33:04.2756805Z 2333 │ }).pipe(Effect.provide(layerWorker), Effect.scoped); 2026-10-22T09:33:04.2756895Z ╰──── 2026-10-22T09:33:04.2756899Z 2026-10-22T09:33:04.2757162Z ⚠ react(immutability): This value cannot be modified 2026-10-22T09:33:04.2757456Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:105:5] 2026-10-22T09:33:04.2757558Z 102 │ }) { 2026-10-22T09:33:04.2757752Z 103 │ const rotation = useSharedValue(props.hidden ? 1 : 0); 2026-10-22T09:33:04.2757880Z ·  ────┬─── 2026-10-22T09:33:04.2758106Z · ╰── `rotation` originates here 2026-10-22T09:33:04.2758354Z 104 │ useLayoutEffect(() => { 2026-10-22T09:33:04.2758620Z 105 │ rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING); 2026-10-22T09:33:04.2758700Z ·  ────┬─── 2026-10-22T09:33:04.2758847Z · ╰── `rotation` cannot be modified 2026-10-22T09:33:04.2758937Z 106 │ }, [props.hidden, rotation]); 2026-10-22T09:33:04.2758995Z ╰──── 2026-10-22T09:33:04.2759287Z  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-22T09:33:04.2759631Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T09:33:04.2759634Z 2026-10-22T09:33:04.2759803Z ⚠ react(immutability): This value cannot be modified 2026-10-22T09:33:04.2759996Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:281:5] 2026-10-22T09:33:04.2760109Z 278 │ const variant = props.variant ?? "plain"; 2026-10-22T09:33:04.2760253Z 279 │ const loadingVisibility = useSharedValue(props.loading ? 1 : 0); 2026-10-22T09:33:04.2760351Z ·  ────────┬──────── 2026-10-22T09:33:04.2760516Z · ╰── `loadingVisibility` originates here 2026-10-22T09:33:04.2760595Z 280 │ useLayoutEffect(() => { 2026-10-22T09:33:04.2760767Z 281 │ loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING); 2026-10-22T09:33:04.2760858Z ·  ────────┬──────── 2026-10-22T09:33:04.2761019Z · ╰── `loadingVisibility` cannot be modified 2026-10-22T09:33:04.2761130Z 282 │ }, [loadingVisibility, props.loading]); 2026-10-22T09:33:04.2761191Z ╰──── 2026-10-22T09:33:04.2761476Z  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-22T09:33:04.2761811Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T09:33:04.2761813Z 2026-10-22T09:33:04.2761982Z ⚠ react(immutability): This value cannot be modified 2026-10-22T09:33:04.2762160Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:336:5] 2026-10-22T09:33:04.2762224Z 333 │ }) { 2026-10-22T09:33:04.2762399Z 334 │ const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0); 2026-10-22T09:33:04.2762506Z ·  ─────────┬───────── 2026-10-22T09:33:04.2762671Z · ╰── `recordingVisibility` originates here 2026-10-22T09:33:04.2762752Z 335 │ useLayoutEffect(() => { 2026-10-22T09:33:04.2762955Z 336 │ recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING); 2026-10-22T09:33:04.2763050Z ·  ─────────┬───────── 2026-10-22T09:33:04.2763218Z · ╰── `recordingVisibility` cannot be modified 2026-10-22T09:33:04.2763323Z 337 │ }, [props.phase, recordingVisibility]); 2026-10-22T09:33:04.2763384Z ╰──── 2026-10-22T09:33:04.2763667Z  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-22T09:33:04.2764156Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T09:33:04.2764201Z 2026-10-22T09:33:04.2764420Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-22T09:33:04.2764588Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:223:31] 2026-10-22T09:33:04.2764714Z 222 │ ? snippetTokens.map((line, lineIndex) => ( 2026-10-22T09:33:04.2764822Z 223 │ 2026-10-22T09:33:04.2764938Z ·  ─────────────── 2026-10-22T09:33:04.2765044Z 224 │ {lineIndex > 0 ? "\n" : ""} 2026-10-22T09:33:04.2765102Z ╰──── 2026-10-22T09:33:04.2765264Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-22T09:33:04.2765267Z 2026-10-22T09:33:04.2765482Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-22T09:33:04.2765648Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25] 2026-10-22T09:33:04.2765734Z 226 │ { 2026-10-22T09:33:04.2766914Z ·  ────┬──── 2026-10-22T09:33:04.2767060Z · ╰── This is the containing effect 2026-10-22T09:33:04.2767140Z 57 │ setDecodedSize(null); 2026-10-22T09:33:04.2767229Z ·  ───────┬────── 2026-10-22T09:33:04.2767411Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.2767491Z 58 │ }, [props.sourceKey]); 2026-10-22T09:33:04.2767551Z ╰──── 2026-10-22T09:33:04.2768219Z  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-22T09:33:04.2768584Z  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-22T09:33:04.2768589Z 2026-10-22T09:33:04.2768869Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T09:33:04.2769038Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5] 2026-10-22T09:33:04.2769100Z 59 │ 2026-10-22T09:33:04.2769172Z 60 │ useEffect(() => { 2026-10-22T09:33:04.2769247Z ·  ────┬──── 2026-10-22T09:33:04.2769389Z · ╰── This is the containing effect 2026-10-22T09:33:04.2769472Z 61 │ setFailedUri(null); 2026-10-22T09:33:04.2769628Z ·  ──────┬───── 2026-10-22T09:33:04.2769844Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.2769923Z 62 │ }, [props.uri]); 2026-10-22T09:33:04.2769986Z ╰──── 2026-10-22T09:33:04.2770630Z  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-22T09:33:04.2770978Z  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-22T09:33:04.2770981Z 2026-10-22T09:33:04.2771220Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-22T09:33:04.2771389Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10] 2026-10-22T09:33:04.2771531Z 6 │ import { parse, SvgAst, type JsxAST } from "react-native-svg"; 2026-10-22T09:33:04.2771722Z 7 │ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native"; 2026-10-22T09:33:04.2771819Z ·  ────────┬──────── 2026-10-22T09:33:04.2771984Z · ╰── 'ActivityIndicator' is imported here 2026-10-22T09:33:04.2772043Z 8 │ 2026-10-22T09:33:04.2772101Z ╰──── 2026-10-22T09:33:04.2772210Z  help: Consider removing this import. 2026-10-22T09:33:04.2772214Z 2026-10-22T09:33:04.2772441Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T09:33:04.2772609Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7] 2026-10-22T09:33:04.2772690Z 57 │ setDecodedSize(null); 2026-10-22T09:33:04.2772768Z 58 │ }, [props.sourceKey]); 2026-10-22T09:33:04.2772863Z ·  ───────┬─────── 2026-10-22T09:33:04.2773037Z · ╰── Unnecessary dependency `props.sourceKey` 2026-10-22T09:33:04.2773096Z 59 │ 2026-10-22T09:33:04.2773156Z ╰──── 2026-10-22T09:33:04.2773475Z  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-22T09:33:04.2773815Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.2773817Z 2026-10-22T09:33:04.2774096Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T09:33:04.2774263Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7] 2026-10-22T09:33:04.2774341Z 61 │ setFailedUri(null); 2026-10-22T09:33:04.2774425Z 62 │ }, [props.uri]); 2026-10-22T09:33:04.2774513Z ·  ────┬──── 2026-10-22T09:33:04.2774673Z · ╰── Unnecessary dependency `props.uri` 2026-10-22T09:33:04.2774731Z 63 │ 2026-10-22T09:33:04.2774796Z ╰──── 2026-10-22T09:33:04.2775117Z  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-22T09:33:04.2775528Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.2775579Z 2026-10-22T09:33:04.2775857Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T09:33:04.2776038Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:431:5] 2026-10-22T09:33:04.2776118Z 426 │ : null; 2026-10-22T09:33:04.2776197Z 427 │ useEffect(() => { 2026-10-22T09:33:04.2776278Z ·  ────┬──── 2026-10-22T09:33:04.2776426Z · ╰── This is the containing effect 2026-10-22T09:33:04.2776616Z 428 │ if (activeDraftKey !== null || editingPendingTask !== null || selectedProject === null) { 2026-10-22T09:33:04.2776685Z 429 │ return; 2026-10-22T09:33:04.2776744Z 430 │ } 2026-10-22T09:33:04.2776832Z 431 │ setActiveDraftKey( 2026-10-22T09:33:04.2776937Z ·  ────────┬──────── 2026-10-22T09:33:04.2777130Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.2777208Z 432 │ createNewTaskDraft({ 2026-10-22T09:33:04.2777276Z ╰──── 2026-10-22T09:33:04.2777925Z  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-22T09:33:04.2778290Z  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-22T09:33:04.2778293Z 2026-10-22T09:33:04.2778579Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-22T09:33:04.2778760Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1212:39] 2026-10-22T09:33:04.2778845Z 1211 │ 2026-10-22T09:33:04.2779073Z 1212 │ return {props.children}; 2026-10-22T09:33:04.2779205Z ·  ───────────── 2026-10-22T09:33:04.2779264Z 1213 │ } 2026-10-22T09:33:04.2779326Z ╰──── 2026-10-22T09:33:04.2779576Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-22T09:33:04.2779732Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-22T09:33:04.2779789Z 2026-10-22T09:33:04.2780107Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T09:33:04.2780266Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:68:5] 2026-10-22T09:33:04.2780388Z 66 │ const { id: attachmentId, fileUri } = attachment; 2026-10-22T09:33:04.2780464Z 67 │ useEffect(() => { 2026-10-22T09:33:04.2780545Z ·  ────┬──── 2026-10-22T09:33:04.2780685Z · ╰── This is the containing effect 2026-10-22T09:33:04.2780759Z 68 │ setUri(null); 2026-10-22T09:33:04.2780839Z ·  ───┬── 2026-10-22T09:33:04.2781014Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.2781088Z 69 │ setError(null); 2026-10-22T09:33:04.2781148Z ╰──── 2026-10-22T09:33:04.2781799Z  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-22T09:33:04.2782150Z  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-22T09:33:04.2782152Z 2026-10-22T09:33:04.2782369Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T09:33:04.2782520Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:91:7] 2026-10-22T09:33:04.2782585Z 90 │ }; 2026-10-22T09:33:04.2782676Z 91 │ }, [attachmentId, fileUri]); 2026-10-22T09:33:04.2782804Z ·  ──────┬───── ───┬─── 2026-10-22T09:33:04.2783002Z · │ ╰── Unnecessary dependency `fileUri` 2026-10-22T09:33:04.2783161Z · ╰── Unnecessary dependency `attachmentId` 2026-10-22T09:33:04.2783314Z 92 │ const mimeType = videoMimeType(attachment) ?? attachment.mimeType; 2026-10-22T09:33:04.2783370Z ╰──── 2026-10-22T09:33:04.2783691Z  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-22T09:33:04.2784083Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.2784086Z 2026-10-22T09:33:04.2784329Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-22T09:33:04.2784717Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:213:34] 2026-10-22T09:33:04.2784855Z 212 │ useEffect(() => { 2026-10-22T09:33:04.2785011Z 213 │ if (!isFocused && hasSource) props.onRequestClose(); 2026-10-22T09:33:04.2785129Z ·  ──┬── 2026-10-22T09:33:04.2785302Z · ╰── Missing dependency `props` 2026-10-22T09:33:04.2785420Z 214 │ }, [isFocused, hasSource, props.onRequestClose]); 2026-10-22T09:33:04.2785547Z ·  ──────────┬───────── 2026-10-22T09:33:04.2785956Z · ╰── Overly precise dependency `props.onRequestClose`, use `props` instead 2026-10-22T09:33:04.2786097Z 215 │ const { source } = props; 2026-10-22T09:33:04.2786155Z ╰──── 2026-10-22T09:33:04.2786624Z  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-22T09:33:04.2786987Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.2786991Z 2026-10-22T09:33:04.2787284Z ⚠ eslint(no-unused-vars): Function 'promptResponseHasMissingXAiStopReason' is declared but never used. 2026-10-22T09:33:04.2787454Z ╭─[packages/provider-grok/src/server/xaiAcpExtension.ts:1620:10] 2026-10-22T09:33:04.2787520Z 1619 │ 2026-10-22T09:33:04.2787753Z 1620 │ function promptResponseHasMissingXAiStopReason(response: EffectAcpSchema.PromptResponse): boolean { 2026-10-22T09:33:04.2787883Z ·  ──────────────────┬────────────────── 2026-10-22T09:33:04.2788106Z · ╰── 'promptResponseHasMissingXAiStopReason' is declared here 2026-10-22T09:33:04.2788193Z 1621 │ const meta = response._meta; 2026-10-22T09:33:04.2788254Z ╰──── 2026-10-22T09:33:04.2788373Z  help: Consider removing this declaration. 2026-10-22T09:33:04.2788376Z 2026-10-22T09:33:04.2788607Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-22T09:33:04.2788718Z ╭─[apps/mobile/src/Stack.tsx:1066:21] 2026-10-22T09:33:04.2788794Z 1065 │ } 2026-10-22T09:33:04.2789105Z ·  ───────────────────────────────────────────── 2026-10-22T09:33:04.2789179Z 1067 │ screenListeners={{ 2026-10-22T09:33:04.2789243Z ╰──── 2026-10-22T09:33:04.2789642Z  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-22T09:33:04.2789645Z 2026-10-22T09:33:04.2789930Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T09:33:04.2790085Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:60:5] 2026-10-22T09:33:04.2790141Z 57 │ 2026-10-22T09:33:04.2790222Z 58 │ useEffect(() => { 2026-10-22T09:33:04.2790306Z ·  ────┬──── 2026-10-22T09:33:04.2790450Z · ╰── This is the containing effect 2026-10-22T09:33:04.2790558Z 59 │ const controller = new AbortController(); 2026-10-22T09:33:04.2790645Z 60 │ setLoadState("pending"); 2026-10-22T09:33:04.2790754Z ·  ──────┬───── 2026-10-22T09:33:04.2790942Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.2791117Z 61 │ // A renewed signature is used on Retry, not as a reason to reset the native player. 2026-10-22T09:33:04.2791182Z ╰──── 2026-10-22T09:33:04.2791931Z  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-22T09:33:04.2792598Z  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-22T09:33:04.2792603Z 2026-10-22T09:33:04.2792925Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T09:33:04.2793073Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:71:7] 2026-10-22T09:33:04.2793174Z 70 │ return () => controller.abort(); 2026-10-22T09:33:04.2793284Z 71 │ }, [player, props.playRequested, attempt]); 2026-10-22T09:33:04.2793479Z ·  ───┬── ─────────┬───────── ───┬─── 2026-10-22T09:33:04.2793730Z · │ │ ╰── Unnecessary dependency `attempt` 2026-10-22T09:33:04.2793988Z · │ ╰── Unnecessary dependency `props.playRequested` 2026-10-22T09:33:04.2794163Z · ╰── Unnecessary dependency `player_0` 2026-10-22T09:33:04.2794228Z 72 │ 2026-10-22T09:33:04.2794283Z ╰──── 2026-10-22T09:33:04.2794606Z  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-22T09:33:04.2794953Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.2794958Z 2026-10-22T09:33:04.2795193Z ⚠ eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used. 2026-10-22T09:33:04.2795308Z ╭─[apps/web/src/types.ts:22:3] 2026-10-22T09:33:04.2795385Z 21 │ EnvironmentThreadShell, 2026-10-22T09:33:04.2795459Z 22 │ ThreadRunSummary, 2026-10-22T09:33:04.2795556Z ·  ────────┬─────── 2026-10-22T09:33:04.2795709Z · ╰── 'ThreadRunSummary' is imported here 2026-10-22T09:33:04.2795787Z 23 │ ThreadRuntimeSummary, 2026-10-22T09:33:04.2795847Z ╰──── 2026-10-22T09:33:04.2795960Z  help: Consider removing this import. 2026-10-22T09:33:04.2795963Z 2026-10-22T09:33:04.2796239Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T09:33:04.2796419Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-22T09:33:04.2796499Z 259 │ .join("|"); 2026-10-22T09:33:04.2796575Z 260 │ useEffect(() => { 2026-10-22T09:33:04.2796655Z ·  ────┬──── 2026-10-22T09:33:04.2796796Z · ╰── This is the containing effect 2026-10-22T09:33:04.2796869Z 261 │ stop(); 2026-10-22T09:33:04.2796948Z ·  ──┬─ 2026-10-22T09:33:04.2797127Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.2797200Z 262 │ }, [orderVersion]); 2026-10-22T09:33:04.2797260Z ╰──── 2026-10-22T09:33:04.2797980Z  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-22T09:33:04.2798381Z  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-22T09:33:04.2798384Z 2026-10-22T09:33:04.2798616Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-22T09:33:04.2798787Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-22T09:33:04.2798872Z 260 │ useEffect(() => { 2026-10-22T09:33:04.2798942Z 261 │ stop(); 2026-10-22T09:33:04.2799028Z ·  ──┬─ 2026-10-22T09:33:04.2799161Z · ╰── Missing dependency `stop` 2026-10-22T09:33:04.2799236Z 262 │ }, [orderVersion]); 2026-10-22T09:33:04.2799338Z ·  ──────┬───── 2026-10-22T09:33:04.2799500Z · ╰── Unnecessary dependency `orderVersion` 2026-10-22T09:33:04.2799573Z 263 │ useEffect( 2026-10-22T09:33:04.2799633Z ╰──── 2026-10-22T09:33:04.2800092Z  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-22T09:33:04.2800430Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.2800432Z 2026-10-22T09:33:04.2800590Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.2800771Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9] 2026-10-22T09:33:04.2800869Z 95 │ const latest = useRef(props); 2026-10-22T09:33:04.2800955Z 96 │ latest.current = props; 2026-10-22T09:33:04.2801070Z ·  ───┬──────┬─── 2026-10-22T09:33:04.2801268Z · │ ╰── Cannot update ref value during render 2026-10-22T09:33:04.2801394Z · ╰── This value is a ref 2026-10-22T09:33:04.2801472Z 97 │ const gesture = useMemo( 2026-10-22T09:33:04.2801528Z ╰──── 2026-10-22T09:33:04.2802037Z  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-22T09:33:04.2802359Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.2802365Z 2026-10-22T09:33:04.2802523Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.2802699Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18] 2026-10-22T09:33:04.2802774Z 103 │ .runOnJS(true) 2026-10-22T09:33:04.2802889Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-22T09:33:04.2803019Z ·  ───────────────┬────────────── 2026-10-22T09:33:04.2803238Z · ╰── Passing a ref to a function may read its value during render 2026-10-22T09:33:04.2803382Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-22T09:33:04.2803440Z ╰──── 2026-10-22T09:33:04.2804050Z  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-22T09:33:04.2804590Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.2804598Z 2026-10-22T09:33:04.2804765Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.2804935Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19] 2026-10-22T09:33:04.2805048Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-22T09:33:04.2805196Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-22T09:33:04.2805354Z ·  ──────────────────────────┬───────────────────────── 2026-10-22T09:33:04.2805579Z · ╰── Passing a ref to a function may read its value during render 2026-10-22T09:33:04.2805720Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-22T09:33:04.2805781Z ╰──── 2026-10-22T09:33:04.2806283Z  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-22T09:33:04.2806597Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.2806601Z 2026-10-22T09:33:04.2806759Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.2806943Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16] 2026-10-22T09:33:04.2807088Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-22T09:33:04.2807229Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-22T09:33:04.2807377Z ·  ──────────────────────────┬───────────────────────── 2026-10-22T09:33:04.2807604Z · ╰── Passing a ref to a function may read its value during render 2026-10-22T09:33:04.2807743Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-22T09:33:04.2807805Z ╰──── 2026-10-22T09:33:04.2808404Z  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-22T09:33:04.2808767Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.2808769Z 2026-10-22T09:33:04.2808928Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.2809100Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21] 2026-10-22T09:33:04.2809234Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-22T09:33:04.2809368Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-22T09:33:04.2809521Z ·  ───────────────────────┬────────────────────── 2026-10-22T09:33:04.2809756Z · ╰── Passing a ref to a function may read its value during render 2026-10-22T09:33:04.2809844Z 108 │ [props.disabled], 2026-10-22T09:33:04.2809903Z ╰──── 2026-10-22T09:33:04.2810405Z  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-22T09:33:04.2810718Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.2810721Z 2026-10-22T09:33:04.2810877Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.2811057Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:249:9] 2026-10-22T09:33:04.2811184Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-22T09:33:04.2811302Z 249 │ latest.current = { rows, planners, moveThread }; 2026-10-22T09:33:04.2811421Z ·  ───┬──────┬─── 2026-10-22T09:33:04.2811614Z · │ ╰── Cannot update ref value during render 2026-10-22T09:33:04.2811738Z · ╰── This value is a ref 2026-10-22T09:33:04.2811802Z 250 │ 2026-10-22T09:33:04.2811866Z ╰──── 2026-10-22T09:33:04.2812384Z  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-22T09:33:04.2812701Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.2812703Z 2026-10-22T09:33:04.2812857Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.2813029Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:247:22] 2026-10-22T09:33:04.2813163Z 246 │ const [preview, setPreview] = useState(null); 2026-10-22T09:33:04.2813298Z 247 │ const translateY = useRef(new Animated.Value(0)).current; 2026-10-22T09:33:04.2813502Z ·  ──────────────────┬────────────────── 2026-10-22T09:33:04.2813857Z · ╰── Cannot access ref value during render 2026-10-22T09:33:04.2814169Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-22T09:33:04.2814269Z ╰──── 2026-10-22T09:33:04.2814877Z  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-22T09:33:04.2815235Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.2815239Z 2026-10-22T09:33:04.2815435Z ⚠ react(purity): Cannot call impure function during render 2026-10-22T09:33:04.2815613Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:324:16] 2026-10-22T09:33:04.2815696Z 323 │ update(0); 2026-10-22T09:33:04.2815790Z 324 │ let last = performance.now(); 2026-10-22T09:33:04.2815903Z ·  ────────┬──────── 2026-10-22T09:33:04.2816059Z · ╰── Cannot call impure function 2026-10-22T09:33:04.2816136Z 325 │ const tick = () => { 2026-10-22T09:33:04.2816192Z ╰──── 2026-10-22T09:33:04.2816518Z  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-22T09:33:04.2816844Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-22T09:33:04.2816852Z 2026-10-22T09:33:04.2817061Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-22T09:33:04.2817242Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15] 2026-10-22T09:33:04.2817313Z  98 │ () => 2026-10-22T09:33:04.2817390Z  99 │ Gesture.Pan() 2026-10-22T09:33:04.2817475Z ·  ─┬─ 2026-10-22T09:33:04.2817617Z · ╰── `Pan` may be a component 2026-10-22T09:33:04.2817713Z 100 │ .enabled(!props.disabled) 2026-10-22T09:33:04.2817773Z ╰──── 2026-10-22T09:33:04.2818072Z  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-22T09:33:04.2818573Z  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-22T09:33:04.2818578Z 2026-10-22T09:33:04.2818778Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-22T09:33:04.2818955Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5] 2026-10-22T09:33:04.2819035Z 103 │ .runOnJS(true) 2026-10-22T09:33:04.2819150Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-22T09:33:04.2819245Z ·  ───┬── 2026-10-22T09:33:04.2819717Z · ╰── 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-22T09:33:04.2819864Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-22T09:33:04.2820113Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-22T09:33:04.2820354Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-22T09:33:04.2820431Z 108 │ [props.disabled], 2026-10-22T09:33:04.2820529Z ·  ────────┬─────── 2026-10-22T09:33:04.2820732Z · ╰── This dependency list is missing values used by the callback 2026-10-22T09:33:04.2820794Z 109 │ ); 2026-10-22T09:33:04.2820848Z ╰──── 2026-10-22T09:33:04.2821151Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-22T09:33:04.2821494Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.2821497Z 2026-10-22T09:33:04.2821790Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-22T09:33:04.2821933Z ╭─[packages/provider-grok/src/server/adapter.ts:408:7] 2026-10-22T09:33:04.2821997Z 407 │ 2026-10-22T09:33:04.2822087Z 408 │ const layer: Layer.Layer< 2026-10-22T09:33:04.2822167Z ·  ──┬── 2026-10-22T09:33:04.2822298Z · ╰── 'layer' is declared here 2026-10-22T09:33:04.2822416Z 409 │ ProviderAdapter.ProviderAdapterV2, 2026-10-22T09:33:04.2822484Z ╰──── 2026-10-22T09:33:04.2822602Z  help: Consider removing this declaration. 2026-10-22T09:33:04.2822605Z 2026-10-22T09:33:04.2822880Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T09:33:04.2823044Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2040:5] 2026-10-22T09:33:04.2823111Z 2038 │ ); 2026-10-22T09:33:04.2823191Z 2039 │ useEffect(() => { 2026-10-22T09:33:04.2823268Z ·  ────┬──── 2026-10-22T09:33:04.2823420Z · ╰── This is the containing effect 2026-10-22T09:33:04.2823511Z 2040 │ setExpandedVideo(null); 2026-10-22T09:33:04.2823607Z ·  ────────┬─────── 2026-10-22T09:33:04.2823790Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.2823880Z 2041 │ setExpandedFile(null); 2026-10-22T09:33:04.2823943Z ╰──── 2026-10-22T09:33:04.2824801Z  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-22T09:33:04.2825159Z  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-22T09:33:04.2825162Z 2026-10-22T09:33:04.2825409Z ⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used. 2026-10-22T09:33:04.2825568Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:62:10] 2026-10-22T09:33:04.2825723Z 61 │ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets"; 2026-10-22T09:33:04.2825876Z 62 │ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks"; 2026-10-22T09:33:04.2826134Z ·  ───────────┬─────────── 2026-10-22T09:33:04.2826448Z · ╰── 'isMarkdownFileLinkLabel' is imported here 2026-10-22T09:33:04.2826621Z 63 │ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments"; 2026-10-22T09:33:04.2826681Z ╰──── 2026-10-22T09:33:04.2826793Z  help: Consider removing this import. 2026-10-22T09:33:04.2826796Z 2026-10-22T09:33:04.2827063Z ⚠ eslint(no-unused-vars): Identifier 'createContext' is imported but never used. 2026-10-22T09:33:04.2827288Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:88:3] 2026-10-22T09:33:04.2827355Z 87 │ import { 2026-10-22T09:33:04.2827426Z 88 │ createContext, 2026-10-22T09:33:04.2827513Z ·  ──────┬────── 2026-10-22T09:33:04.2827673Z · ╰── 'createContext' is imported here 2026-10-22T09:33:04.2827743Z 89 │ memo, 2026-10-22T09:33:04.2827800Z ╰──── 2026-10-22T09:33:04.2827917Z  help: Consider removing this import. 2026-10-22T09:33:04.2827922Z 2026-10-22T09:33:04.2828153Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-22T09:33:04.2828303Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:103:3] 2026-10-22T09:33:04.2828367Z 102 │ import { 2026-10-22T09:33:04.2828449Z 103 │ ActivityIndicator, 2026-10-22T09:33:04.2828543Z ·  ────────┬──────── 2026-10-22T09:33:04.2828701Z · ╰── 'ActivityIndicator' is imported here 2026-10-22T09:33:04.2828764Z 104 │ Image, 2026-10-22T09:33:04.2828829Z ╰──── 2026-10-22T09:33:04.2828944Z  help: Consider removing this import. 2026-10-22T09:33:04.2828951Z 2026-10-22T09:33:04.2829166Z ⚠ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used. 2026-10-22T09:33:04.2829307Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:110:3] 2026-10-22T09:33:04.2829381Z 109 │ Pressable, 2026-10-22T09:33:04.2829454Z 110 │ ScrollView, 2026-10-22T09:33:04.2829538Z ·  ─────┬──── 2026-10-22T09:33:04.2829680Z · ╰── 'ScrollView' is imported here 2026-10-22T09:33:04.2829754Z 111 │ StyleSheet, 2026-10-22T09:33:04.2829813Z ╰──── 2026-10-22T09:33:04.2829921Z  help: Consider removing this import. 2026-10-22T09:33:04.2829924Z 2026-10-22T09:33:04.2830138Z ⚠ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used. 2026-10-22T09:33:04.2830361Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:112:11] 2026-10-22T09:33:04.2830522Z 111 │ StyleSheet, 2026-10-22T09:33:04.2830604Z 112 │ Text as NativeText, 2026-10-22T09:33:04.2830691Z ·  ─────┬──── 2026-10-22T09:33:04.2830845Z · ╰── 'NativeText' is imported here 2026-10-22T09:33:04.2830922Z 113 │ type ColorValue, 2026-10-22T09:33:04.2830981Z ╰──── 2026-10-22T09:33:04.2831082Z  help: Consider removing this import. 2026-10-22T09:33:04.2831084Z 2026-10-22T09:33:04.2831396Z ⚠ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used. 2026-10-22T09:33:04.2831546Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:134:10] 2026-10-22T09:33:04.2831703Z 133 │ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic"; 2026-10-22T09:33:04.2831848Z 134 │ import { tryOpenExternalUrl } from "../../lib/openExternalUrl"; 2026-10-22T09:33:04.2831952Z ·  ─────────┬──────── 2026-10-22T09:33:04.2832126Z · ╰── 'tryOpenExternalUrl' is imported here 2026-10-22T09:33:04.2832292Z 135 │ import { downloadAndShareAttachment } from "../../lib/attachmentDownload"; 2026-10-22T09:33:04.2832348Z ╰──── 2026-10-22T09:33:04.2832456Z  help: Consider removing this import. 2026-10-22T09:33:04.2832460Z 2026-10-22T09:33:04.2832701Z ⚠ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used. 2026-10-22T09:33:04.2832856Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:137:10] 2026-10-22T09:33:04.2833013Z 136 │ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks"; 2026-10-22T09:33:04.2833149Z 137 │ import { faviconUrlForOrigin } from "@t3tools/shared/favicon"; 2026-10-22T09:33:04.2833251Z ·  ─────────┬───────── 2026-10-22T09:33:04.2833420Z · ╰── 'faviconUrlForOrigin' is imported here 2026-10-22T09:33:04.2833488Z 138 │ import { 2026-10-22T09:33:04.2833546Z ╰──── 2026-10-22T09:33:04.2833653Z  help: Consider removing this import. 2026-10-22T09:33:04.2833655Z 2026-10-22T09:33:04.2833883Z ⚠ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used. 2026-10-22T09:33:04.2834072Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:151:10] 2026-10-22T09:33:04.2834233Z 150 │ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile"; 2026-10-22T09:33:04.2834395Z 151 │ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer"; 2026-10-22T09:33:04.2834498Z ·  ────────┬─────── 2026-10-22T09:33:04.2834661Z · ╰── 'MediaVideoPlayer' is imported here 2026-10-22T09:33:04.2834810Z 152 │ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia"; 2026-10-22T09:33:04.2834870Z ╰──── 2026-10-22T09:33:04.2834975Z  help: Consider removing this import. 2026-10-22T09:33:04.2834978Z 2026-10-22T09:33:04.2835222Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used. 2026-10-22T09:33:04.2835362Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:155:3] 2026-10-22T09:33:04.2835460Z 154 │ attachmentVideoPreviewSource, 2026-10-22T09:33:04.2835543Z 155 │ mediaVideoPreviewUri, 2026-10-22T09:33:04.2835707Z ·  ──────────┬───────── 2026-10-22T09:33:04.2835967Z · ╰── 'mediaVideoPreviewUri' is imported here 2026-10-22T09:33:04.2836049Z 156 │ mediaVideoThumbnailKey, 2026-10-22T09:33:04.2836116Z ╰──── 2026-10-22T09:33:04.2836224Z  help: Consider removing this import. 2026-10-22T09:33:04.2836226Z 2026-10-22T09:33:04.2836464Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used. 2026-10-22T09:33:04.2836687Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:156:3] 2026-10-22T09:33:04.2836775Z 155 │ mediaVideoPreviewUri, 2026-10-22T09:33:04.2836858Z 156 │ mediaVideoThumbnailKey, 2026-10-22T09:33:04.2836957Z ·  ───────────┬────────── 2026-10-22T09:33:04.2837152Z · ╰── 'mediaVideoThumbnailKey' is imported here 2026-10-22T09:33:04.2837264Z 157 │ type MediaVideoPreviewSource, 2026-10-22T09:33:04.2837335Z ╰──── 2026-10-22T09:33:04.2837439Z  help: Consider removing this import. 2026-10-22T09:33:04.2837443Z 2026-10-22T09:33:04.2837672Z ⚠ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used. 2026-10-22T09:33:04.2837818Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:157:8] 2026-10-22T09:33:04.2837904Z 156 │ mediaVideoThumbnailKey, 2026-10-22T09:33:04.2837989Z 157 │ type MediaVideoPreviewSource, 2026-10-22T09:33:04.2838102Z ·  ───────────┬─────────── 2026-10-22T09:33:04.2838281Z · ╰── 'MediaVideoPreviewSource' is imported here 2026-10-22T09:33:04.2838382Z 158 │ } from "../../lib/videoPreviewSource"; 2026-10-22T09:33:04.2838444Z ╰──── 2026-10-22T09:33:04.2838556Z  help: Consider removing this import. 2026-10-22T09:33:04.2838559Z 2026-10-22T09:33:04.2838779Z ⚠ eslint(no-unused-vars): Type 'ReviewDiffTheme' is imported but never used. 2026-10-22T09:33:04.2838926Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:165:15] 2026-10-22T09:33:04.2839132Z 164 │ import { parseReviewCommentMessageSegments } from "../review/reviewCommentSelection"; 2026-10-22T09:33:04.2839287Z 165 │ import type { ReviewDiffTheme } from "../review/shikiReviewHighlighter"; 2026-10-22T09:33:04.2839394Z ·  ───────┬─────── 2026-10-22T09:33:04.2839557Z · ╰── 'ReviewDiffTheme' is imported here 2026-10-22T09:33:04.2839626Z 166 │ import { 2026-10-22T09:33:04.2839700Z ╰──── 2026-10-22T09:33:04.2839814Z  help: Consider removing this import. 2026-10-22T09:33:04.2839820Z 2026-10-22T09:33:04.2840069Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used. 2026-10-22T09:33:04.2840213Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:180:3] 2026-10-22T09:33:04.2840280Z 179 │ import { 2026-10-22T09:33:04.2840365Z 180 │ resolveMarkdownFontSizes, 2026-10-22T09:33:04.2840465Z ·  ────────────┬─────────── 2026-10-22T09:33:04.2840640Z · ╰── 'resolveMarkdownFontSizes' is imported here 2026-10-22T09:33:04.2840737Z 181 │ resolveNativeMarkdownTypography, 2026-10-22T09:33:04.2840800Z ╰──── 2026-10-22T09:33:04.2840909Z  help: Consider removing this import. 2026-10-22T09:33:04.2840912Z 2026-10-22T09:33:04.2841236Z ⚠ eslint(no-unused-vars): Identifier 'markdownLinkIconSource' is imported but never used. 2026-10-22T09:33:04.2841476Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:185:10] 2026-10-22T09:33:04.2841634Z 184 │ import { PierreEntryIcon } from "../../components/PierreEntryIcon"; 2026-10-22T09:33:04.2841793Z 185 │ import { markdownLinkIconSource } from "../../lib/markdownLinkIcons"; 2026-10-22T09:33:04.2841900Z ·  ───────────┬────────── 2026-10-22T09:33:04.2842083Z · ╰── 'markdownLinkIconSource' is imported here 2026-10-22T09:33:04.2842192Z 186 │ import { 2026-10-22T09:33:04.2842288Z ╰──── 2026-10-22T09:33:04.2842396Z  help: Consider removing this import. 2026-10-22T09:33:04.2842401Z 2026-10-22T09:33:04.2842686Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used. 2026-10-22T09:33:04.2842839Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:188:3] 2026-10-22T09:33:04.2842929Z 187 │ normalizeNativeMarkdownUrl, 2026-10-22T09:33:04.2843041Z 188 │ resolveMarkdownInlineCodePresentation, 2026-10-22T09:33:04.2843165Z ·  ──────────────────┬────────────────── 2026-10-22T09:33:04.2843382Z · ╰── 'resolveMarkdownInlineCodePresentation' is imported here 2026-10-22T09:33:04.2843468Z 189 │ resolveMarkdownLinkIcon, 2026-10-22T09:33:04.2843536Z ╰──── 2026-10-22T09:33:04.2843639Z  help: Consider removing this import. 2026-10-22T09:33:04.2843641Z 2026-10-22T09:33:04.2843885Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownLinkIcon' is imported but never used. 2026-10-22T09:33:04.2844065Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:189:3] 2026-10-22T09:33:04.2844186Z 188 │ resolveMarkdownInlineCodePresentation, 2026-10-22T09:33:04.2844276Z 189 │ resolveMarkdownLinkIcon, 2026-10-22T09:33:04.2844376Z ·  ───────────┬─────────── 2026-10-22T09:33:04.2844548Z · ╰── 'resolveMarkdownLinkIcon' is imported here 2026-10-22T09:33:04.2844644Z 190 │ resolveMarkdownLinkPresentation, 2026-10-22T09:33:04.2844711Z ╰──── 2026-10-22T09:33:04.2844816Z  help: Consider removing this import. 2026-10-22T09:33:04.2844819Z 2026-10-22T09:33:04.2845070Z ⚠ eslint(no-unused-vars): Identifier 'useMarkdownCodeHighlight' is imported but never used. 2026-10-22T09:33:04.2845215Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:229:10] 2026-10-22T09:33:04.2845421Z 228 │ import { ThreadMcpApp } from "./McpAppWebView"; 2026-10-22T09:33:04.2845811Z 229 │ import { useMarkdownCodeHighlight } from "./markdownCodeHighlightState"; 2026-10-22T09:33:04.2845970Z ·  ────────────┬─────────── 2026-10-22T09:33:04.2846198Z · ╰── 'useMarkdownCodeHighlight' is imported here 2026-10-22T09:33:04.2846282Z 230 │ import { 2026-10-22T09:33:04.2846373Z ╰──── 2026-10-22T09:33:04.2846552Z  help: Consider removing this import. 2026-10-22T09:33:04.2846556Z 2026-10-22T09:33:04.2846820Z ⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used. 2026-10-22T09:33:04.2846987Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:233:3] 2026-10-22T09:33:04.2847095Z 232 │ useAssetUrl, 2026-10-22T09:33:04.2847301Z 233 │ useAssetUrlState, 2026-10-22T09:33:04.2847546Z ·  ────────┬─────── 2026-10-22T09:33:04.2847731Z · ╰── 'useAssetUrlState' is imported here 2026-10-22T09:33:04.2847850Z 234 │ useRefreshAssetUrl, 2026-10-22T09:33:04.2847937Z ╰──── 2026-10-22T09:33:04.2848142Z  help: Consider removing this import. 2026-10-22T09:33:04.2848147Z 2026-10-22T09:33:04.2848429Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T09:33:04.2848616Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2042:7] 2026-10-22T09:33:04.2848738Z 2041 │ setExpandedFile(null); 2026-10-22T09:33:04.2848953Z 2042 │ }, [props.environmentId, props.threadId, props.contentPresentation.kind]); 2026-10-22T09:33:04.2849243Z ·  ─────────┬───────── ───────┬────── ───────────────┬────────────── 2026-10-22T09:33:04.2849587Z · │ │ ╰── Unnecessary dependency `props.contentPresentation.kind` 2026-10-22T09:33:04.2849835Z · │ ╰── Unnecessary dependency `props.threadId` 2026-10-22T09:33:04.2850045Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-22T09:33:04.2850273Z 2043 │ const horizontalPadding = props.layoutVariant === "split" ? 20 : 16; 2026-10-22T09:33:04.2850351Z ╰──── 2026-10-22T09:33:04.2850714Z  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-22T09:33:04.2851099Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.2851106Z 2026-10-22T09:33:04.2851369Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T09:33:04.2851560Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2511:7] 2026-10-22T09:33:04.2851681Z 2510 │ reportHeaderMaterialVisibility(false); 2026-10-22T09:33:04.2851838Z 2511 │ }, [feedThreadKey, reportHeaderMaterialVisibility]); 2026-10-22T09:33:04.2851954Z ·  ──────┬────── 2026-10-22T09:33:04.2852169Z · ╰── Unnecessary dependency `feedThreadKey` 2026-10-22T09:33:04.2852241Z 2512 │ 2026-10-22T09:33:04.2852331Z ╰──── 2026-10-22T09:33:04.2852749Z  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-22T09:33:04.2853209Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.2853213Z 2026-10-22T09:33:04.2853464Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T09:33:04.2853646Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2527:7] 2026-10-22T09:33:04.2853785Z 2526 │ } 2026-10-22T09:33:04.2853991Z 2527 │ }, [listMountKey, props.contentInsetEndAdjustment, listRef]); 2026-10-22T09:33:04.2854158Z ·  ──────┬───── 2026-10-22T09:33:04.2854346Z · ╰── Unnecessary dependency `listMountKey` 2026-10-22T09:33:04.2854451Z 2528 │ 2026-10-22T09:33:04.2854551Z ╰──── 2026-10-22T09:33:04.2854911Z  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-22T09:33:04.2855273Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.2855304Z 2026-10-22T09:33:04.2855539Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T09:33:04.2855720Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2684:7] 2026-10-22T09:33:04.2855809Z 2683 │ } 2026-10-22T09:33:04.2856063Z 2684 │ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]); 2026-10-22T09:33:04.2856300Z ·  ───────┬─────── ─────────┬──────── ────────┬─────── 2026-10-22T09:33:04.2856606Z · │ │ ╰── Unnecessary dependency `expandedWorkRows` 2026-10-22T09:33:04.2856852Z · │ ╰── Unnecessary dependency `expandedWorkGroups` 2026-10-22T09:33:04.2857062Z · ╰── Unnecessary dependency `expandedTurnIds` 2026-10-22T09:33:04.2857168Z 2685 │ 2026-10-22T09:33:04.2857237Z ╰──── 2026-10-22T09:33:04.2857591Z  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-22T09:33:04.2857954Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.2857958Z 2026-10-22T09:33:04.2858230Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-22T09:33:04.2858387Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:604:9] 2026-10-22T09:33:04.2858481Z 603 │ }; 2026-10-22T09:33:04.2858640Z 604 │ }, [props.environmentId, attachment.id, httpBaseUrl]), 2026-10-22T09:33:04.2858873Z ·  ─────────┬───────── ──────┬────── ─────┬───── 2026-10-22T09:33:04.2859243Z · │ │ ╰── Unnecessary dependency `httpBaseUrl` 2026-10-22T09:33:04.2859558Z · │ ╰── Unnecessary dependency `attachment.id` 2026-10-22T09:33:04.2859763Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-22T09:33:04.2859854Z 605 │ ); 2026-10-22T09:33:04.2859993Z ╰──── 2026-10-22T09:33:04.2860432Z  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-22T09:33:04.2860800Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.2860803Z 2026-10-22T09:33:04.2861262Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownOption(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const. 2026-10-22T09:33:04.2861445Z ╭─[packages/shared/src/otelEnvironment.ts:143:14] 2026-10-22T09:33:04.2861550Z 142 │ name, 2026-10-22T09:33:04.2861714Z 143 │ (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()), 2026-10-22T09:33:04.2861869Z ·  ────────────────────────── 2026-10-22T09:33:04.2862034Z 144 │ `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`, 2026-10-22T09:33:04.2862138Z ╰──── 2026-10-22T09:33:04.2862141Z 2026-10-22T09:33:04.2862362Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-22T09:33:04.2862726Z ╭─[apps/mobile/src/components/ComposerContextSheet.tsx:267:25] 2026-10-22T09:33:04.2862900Z 266 │ {record.elements?.map((element, index) => ( 2026-10-22T09:33:04.2863125Z 267 │ 2026-10-22T09:33:04.2863333Z ·  ─────────────────────────────────────────────────────── 2026-10-22T09:33:04.2863455Z 268 │ { 2026-10-22T09:33:04.2866958Z ·  ────┬──── 2026-10-22T09:33:04.2867238Z · ╰── This is the containing effect 2026-10-22T09:33:04.2867461Z 213 │ const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null; 2026-10-22T09:33:04.2867574Z 214 │ if (inserted) { 2026-10-22T09:33:04.2867716Z 215 │ setSelection((current) => 2026-10-22T09:33:04.2867904Z ·  ──────┬───── 2026-10-22T09:33:04.2868138Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.2868362Z 216 │ current.start === inserted.start && current.end === inserted.end ? current : inserted, 2026-10-22T09:33:04.2868457Z ╰──── 2026-10-22T09:33:04.2869125Z  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-22T09:33:04.2869544Z  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-22T09:33:04.2869547Z 2026-10-22T09:33:04.2869867Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T09:33:04.2870081Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:296:7] 2026-10-22T09:33:04.2870195Z 284 │ }, [hasWorkspaceSnapshot]); 2026-10-22T09:33:04.2870295Z 285 │ useEffect(() => { 2026-10-22T09:33:04.2870542Z ·  ────┬──── 2026-10-22T09:33:04.2870720Z · ╰── This is the containing effect 2026-10-22T09:33:04.2870929Z 286 │ if (!environmentId || !projectCwd || !selectedProviderInstanceId) return; 2026-10-22T09:33:04.2871099Z 287 │ const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`; 2026-10-22T09:33:04.2871233Z 288 │ const now = Date.now(); 2026-10-22T09:33:04.2871395Z 289 │ const lastRequest = workspaceRefreshKeyRef.current; 2026-10-22T09:33:04.2871501Z 290 │ if ( 2026-10-22T09:33:04.2871606Z 291 │ lastRequest?.key === key && 2026-10-22T09:33:04.2871804Z 292 │ now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS 2026-10-22T09:33:04.2871915Z 293 │ ) 2026-10-22T09:33:04.2872022Z 294 │ return; 2026-10-22T09:33:04.2872239Z 295 │ if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) { 2026-10-22T09:33:04.2872441Z 296 │ setWorkspaceRefreshRetry(null); 2026-10-22T09:33:04.2872708Z ·  ────────────┬─────────── 2026-10-22T09:33:04.2872950Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.2873032Z 297 │ return; 2026-10-22T09:33:04.2873287Z ╰──── 2026-10-22T09:33:04.2874102Z  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-22T09:33:04.2874694Z  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-22T09:33:04.2874701Z 2026-10-22T09:33:04.2875093Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T09:33:04.2875361Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:326:5] 2026-10-22T09:33:04.2875453Z 325 │ }, [ 2026-10-22T09:33:04.2875595Z 326 │ draftMessage, 2026-10-22T09:33:04.2875722Z ·  ──────┬───── 2026-10-22T09:33:04.2875894Z · ╰── Unnecessary dependency `draftMessage` 2026-10-22T09:33:04.2876009Z 327 │ environmentId, 2026-10-22T09:33:04.2876105Z ╰──── 2026-10-22T09:33:04.2876468Z  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-22T09:33:04.2876849Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.2876857Z 2026-10-22T09:33:04.2877085Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T09:33:04.2877255Z ╭─[apps/mobile/src/components/ComposerEditor.tsx:82:6] 2026-10-22T09:33:04.2877379Z 81 │ }, 2026-10-22T09:33:04.2877482Z 82 │ [draftKey], 2026-10-22T09:33:04.2877577Z ·  ────┬─── 2026-10-22T09:33:04.2877885Z · ╰── Unnecessary dependency `draftKey` 2026-10-22T09:33:04.2877985Z 83 │ ); 2026-10-22T09:33:04.2878090Z ╰──── 2026-10-22T09:33:04.2878417Z  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-22T09:33:04.2878794Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.2878802Z 2026-10-22T09:33:04.2879109Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T09:33:04.2879368Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:84:5] 2026-10-22T09:33:04.2879481Z 79 │ 2026-10-22T09:33:04.2879571Z 80 │ useEffect(() => { 2026-10-22T09:33:04.2879689Z ·  ────┬──── 2026-10-22T09:33:04.2879883Z · ╰── This is the containing effect 2026-10-22T09:33:04.2880100Z 81 │ if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return; 2026-10-22T09:33:04.2880339Z 82 │ const branchName = initialProjectRef.branch; 2026-10-22T09:33:04.2880562Z 83 │ let active = true; 2026-10-22T09:33:04.2880698Z 84 │ setPendingCheckouts((count) => count + 1); 2026-10-22T09:33:04.2880854Z ·  ─────────┬───────── 2026-10-22T09:33:04.2881059Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.2881437Z 85 │ // Serialize replacements: ignoring a stale result cannot undo its Git mutation. 2026-10-22T09:33:04.2881535Z ╰──── 2026-10-22T09:33:04.2882218Z  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-22T09:33:04.2882622Z  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-22T09:33:04.2882633Z 2026-10-22T09:33:04.2882925Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T09:33:04.2883122Z ╭─[apps/mobile/src/components/ProjectFavicon.tsx:158:5] 2026-10-22T09:33:04.2883353Z 153 │ const [activeFaviconRequest, setActiveFaviconRequest] = useState(null); 2026-10-22T09:33:04.2883495Z 154 │ useLayoutEffect(() => { 2026-10-22T09:33:04.2883597Z ·  ───────┬─────── 2026-10-22T09:33:04.2883786Z · ╰── This is the containing effect 2026-10-22T09:33:04.2883915Z 155 │ if (faviconRequest === null) return; 2026-10-22T09:33:04.2884084Z 156 │ 2026-10-22T09:33:04.2884273Z 157 │ const endRequest = beginProjectFaviconRequest(faviconRequest); 2026-10-22T09:33:04.2884430Z 158 │ setActiveFaviconRequest(faviconRequest); 2026-10-22T09:33:04.2884566Z ·  ───────────┬─────────── 2026-10-22T09:33:04.2884778Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.2884911Z 159 │ return endRequest; 2026-10-22T09:33:04.2884987Z ╰──── 2026-10-22T09:33:04.2886013Z  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-22T09:33:04.2886408Z  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-22T09:33:04.2886416Z 2026-10-22T09:33:04.2886731Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T09:33:04.2886946Z ╭─[apps/mobile/src/components/VideoPreviewModal.ios.tsx:63:55] 2026-10-22T09:33:04.2887026Z 61 │ }, []); 2026-10-22T09:33:04.2887140Z 62 │ useEffect(() => { 2026-10-22T09:33:04.2887248Z ·  ────┬──── 2026-10-22T09:33:04.2887463Z · ╰── This is the containing effect 2026-10-22T09:33:04.2887691Z 63 │ if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl); 2026-10-22T09:33:04.2887951Z ·  ───────┬────── 2026-10-22T09:33:04.2888411Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.2888688Z 64 │ }, [playbackUrl, resolvedUrl]); 2026-10-22T09:33:04.2888768Z ╰──── 2026-10-22T09:33:04.2889527Z  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-22T09:33:04.2889909Z  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-22T09:33:04.2889912Z 2026-10-22T09:33:04.2890189Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-22T09:33:04.2890579Z ╭─[apps/mobile/src/state/use-model-option-memory.ts:21:7] 2026-10-22T09:33:04.2890668Z 20 │ [instanceId]: { 2026-10-22T09:33:04.2890790Z 21 │ ...(state[instanceId] ?? {}), 2026-10-22T09:33:04.2890941Z ·  ──────────────────────────── 2026-10-22T09:33:04.2891058Z 22 │ [model]: options, 2026-10-22T09:33:04.2891136Z ╰──── 2026-10-22T09:33:04.2891469Z  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-22T09:33:04.2891472Z 2026-10-22T09:33:04.2891786Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T09:33:04.2891968Z ╭─[apps/mobile/src/state/use-vcs-action-state.ts:86:5] 2026-10-22T09:33:04.2892156Z 83 │ const [nowMs, setNowMs] = useState(() => Date.now()); 2026-10-22T09:33:04.2892239Z 84 │ useEffect(() => { 2026-10-22T09:33:04.2892350Z ·  ────┬──── 2026-10-22T09:33:04.2892528Z · ╰── This is the containing effect 2026-10-22T09:33:04.2892662Z 85 │ if (!actionState.isRunning) return; 2026-10-22T09:33:04.2892760Z 86 │ setNowMs(Date.now()); 2026-10-22T09:33:04.2892875Z ·  ────┬─── 2026-10-22T09:33:04.2893091Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.2893256Z 87 │ const interval = setInterval(() => setNowMs(Date.now()), 1000); 2026-10-22T09:33:04.2893457Z ╰──── 2026-10-22T09:33:04.2894245Z  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-22T09:33:04.2894660Z  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-22T09:33:04.2894663Z 2026-10-22T09:33:04.2894862Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.2895071Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:152:27] 2026-10-22T09:33:04.2895295Z 151 │ 2026-10-22T09:33:04.2895423Z 152 │ {props.children(open)} 2026-10-22T09:33:04.2895625Z ·  ──┬─ 2026-10-22T09:33:04.2895921Z · ╰── Cannot access ref value during render 2026-10-22T09:33:04.2896025Z 153 │ 2026-10-22T09:33:04.2896133Z ╰──── 2026-10-22T09:33:04.2896755Z  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-22T09:33:04.2897108Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.2897111Z 2026-10-22T09:33:04.2897366Z ⚠ react(memo-dependencies): Found missing/extra memoization dependencies 2026-10-22T09:33:04.2897573Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:140:9] 2026-10-22T09:33:04.2897705Z 139 │ if (action.id !== undefined) { 2026-10-22T09:33:04.2897966Z 140 │ props.onPressAction?.({ 2026-10-22T09:33:04.2898073Z ·  ──┬── 2026-10-22T09:33:04.2898248Z · ╰── Missing dependency `props` 2026-10-22T09:33:04.2898395Z 141 │ nativeEvent: { event: action.id }, 2026-10-22T09:33:04.2898590Z 142 │ } as Parameters>[0]); 2026-10-22T09:33:04.2898692Z 143 │ } 2026-10-22T09:33:04.2898759Z 144 │ }, 2026-10-22T09:33:04.2898913Z 145 │ [close, props.onPressAction], 2026-10-22T09:33:04.2899050Z ·  ─────────┬───────── 2026-10-22T09:33:04.2899329Z · ╰── Overly precise dependency `props.onPressAction`, use `props` instead 2026-10-22T09:33:04.2899408Z 146 │ ); 2026-10-22T09:33:04.2899577Z ╰──── 2026-10-22T09:33:04.2900170Z  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-22T09:33:04.2900728Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.2900731Z 2026-10-22T09:33:04.2901002Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T09:33:04.2913635Z ╭─[apps/mobile/src/state/thread-order.ts:29:7] 2026-10-22T09:33:04.2914027Z 28 │ getPendingThreadOrder(); 2026-10-22T09:33:04.2914154Z 29 │ }, [nowMinute, snoozeWakeTick]); 2026-10-22T09:33:04.2914313Z ·  ────┬──── ───────┬────── 2026-10-22T09:33:04.2914551Z · │ ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-22T09:33:04.2914710Z · ╰── Unnecessary dependency `nowMinute` 2026-10-22T09:33:04.2914785Z 30 │ return pending; 2026-10-22T09:33:04.2914857Z ╰──── 2026-10-22T09:33:04.2915191Z  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-22T09:33:04.2915857Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.2915940Z 2026-10-22T09:33:04.2916309Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T09:33:04.2916481Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:553:7] 2026-10-22T09:33:04.2916640Z 547 │ }, [cancelledIncomingShareId, navigation, props.incomingShareId]); 2026-10-22T09:33:04.2916726Z 548 │ useEffect(() => { 2026-10-22T09:33:04.2916860Z ·  ────┬──── 2026-10-22T09:33:04.2917035Z · ╰── This is the containing effect 2026-10-22T09:33:04.2917144Z 549 │ if (!isReturningToProjectPicker) { 2026-10-22T09:33:04.2917219Z 550 │ return; 2026-10-22T09:33:04.2917287Z 551 │ } 2026-10-22T09:33:04.2917399Z 552 │ if (requestedInitialProjectAvailable) { 2026-10-22T09:33:04.2917519Z 553 │ setIsReturningToProjectPicker(false); 2026-10-22T09:33:04.2917651Z ·  ──────────────┬────────────── 2026-10-22T09:33:04.2917850Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.2917918Z 554 │ return; 2026-10-22T09:33:04.2917981Z ╰──── 2026-10-22T09:33:04.2918629Z  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-22T09:33:04.2918992Z  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-22T09:33:04.2919003Z 2026-10-22T09:33:04.2919286Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T09:33:04.2919451Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:701:9] 2026-10-22T09:33:04.2919521Z 644 │ 2026-10-22T09:33:04.2919594Z 645 │ useEffect(() => { 2026-10-22T09:33:04.2919682Z ·  ────┬──── 2026-10-22T09:33:04.2919821Z · ╰── This is the containing effect 2026-10-22T09:33:04.2919939Z 646 │ if (props.pendingTaskId || props.draftId) { 2026-10-22T09:33:04.2920012Z 647 │ return; 2026-10-22T09:33:04.2920074Z 648 │ } 2026-10-22T09:33:04.2920237Z 649 │ if (lastInitialProjectRefRef.current !== props.initialProjectRef) { 2026-10-22T09:33:04.2920472Z 650 │ lastInitialProjectRefRef.current = props.initialProjectRef; 2026-10-22T09:33:04.2920692Z 651 │ appliedInitialProjectKeyRef.current = null; 2026-10-22T09:33:04.2920754Z 652 │ } 2026-10-22T09:33:04.2920919Z 653 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-22T09:33:04.2921071Z 654 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-22T09:33:04.2921189Z 655 │ if (initialEnvironmentId && initialProjectId) { 2026-10-22T09:33:04.2921304Z 656 │ const directProject = 2026-10-22T09:33:04.2921422Z 657 │ projects.find( 2026-10-22T09:33:04.2921503Z 658 │ (project) => 2026-10-22T09:33:04.2921696Z 659 │ project.environmentId === initialEnvironmentId && project.id === initialProjectId, 2026-10-22T09:33:04.2921766Z 660 │ ) ?? null; 2026-10-22T09:33:04.2921828Z 661 │ 2026-10-22T09:33:04.2921917Z 662 │ if (directProject) { 2026-10-22T09:33:04.2922081Z 663 │ // Apply the route's project once. Re-applying on every change would 2026-10-22T09:33:04.2922230Z 664 │ // instantly revert environment/project switches made in the picker. 2026-10-22T09:33:04.2922413Z 665 │ const directProjectKey = `${directProject.environmentId}:${directProject.id}`; 2026-10-22T09:33:04.2922565Z 666 │ if (appliedInitialProjectKeyRef.current === directProjectKey) { 2026-10-22T09:33:04.2922638Z 667 │ return; 2026-10-22T09:33:04.2922701Z 668 │ } 2026-10-22T09:33:04.2922818Z 669 │ if (props.initialProjectRef?.branch) { 2026-10-22T09:33:04.2922899Z 670 │ if ( 2026-10-22T09:33:04.2923060Z 671 │ selectedProject?.environmentId !== directProject.environmentId || 2026-10-22T09:33:04.2923174Z 672 │ selectedProject.id !== directProject.id 2026-10-22T09:33:04.2923255Z 673 │ ) { 2026-10-22T09:33:04.2923363Z 674 │ setProject(directProject); 2026-10-22T09:33:04.2923442Z 675 │ return; 2026-10-22T09:33:04.2923507Z 676 │ } 2026-10-22T09:33:04.2923604Z 677 │ if (!flow.draftKey) return; 2026-10-22T09:33:04.2923760Z 678 │ // The route completes checkout before mounting this composer. Local 2026-10-22T09:33:04.2923925Z 679 │ // mode reuses an existing worktree; worktree mode would create another. 2026-10-22T09:33:04.2924124Z 680 │ updateComposerDraftSettings(flow.draftKey, { 2026-10-22T09:33:04.2924218Z 681 │ workspaceSelection: { 2026-10-22T09:33:04.2924298Z 682 │ mode: "local", 2026-10-22T09:33:04.2924423Z 683 │ branch: props.initialProjectRef.branch, 2026-10-22T09:33:04.2924577Z 684 │ worktreePath: props.initialProjectRef.worktreePath ?? null, 2026-10-22T09:33:04.2924682Z 685 │ startFromOrigin: false, 2026-10-22T09:33:04.2924755Z 686 │ }, 2026-10-22T09:33:04.2924822Z 687 │ }); 2026-10-22T09:33:04.2924887Z 688 │ } 2026-10-22T09:33:04.2925030Z 689 │ appliedInitialProjectKeyRef.current = directProjectKey; 2026-10-22T09:33:04.2925100Z 690 │ if ( 2026-10-22T09:33:04.2925256Z 691 │ selectedProject?.environmentId === directProject.environmentId && 2026-10-22T09:33:04.2925368Z 692 │ selectedProject.id === directProject.id 2026-10-22T09:33:04.2925441Z 693 │ ) { 2026-10-22T09:33:04.2925513Z 694 │ return; 2026-10-22T09:33:04.2925576Z 695 │ } 2026-10-22T09:33:04.2925673Z 696 │ setProject(directProject); 2026-10-22T09:33:04.2925753Z 697 │ return; 2026-10-22T09:33:04.2925825Z 698 │ } 2026-10-22T09:33:04.2925961Z 699 │ 2026-10-22T09:33:04.2926347Z 700 │ if (projects.length > 0) { 2026-10-22T09:33:04.2926461Z 701 │ setIsReturningToProjectPicker(true); 2026-10-22T09:33:04.2926580Z ·  ──────────────┬────────────── 2026-10-22T09:33:04.2926807Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.2926912Z 702 │ } 2026-10-22T09:33:04.2926979Z ╰──── 2026-10-22T09:33:04.2927627Z  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-22T09:33:04.2927991Z  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-22T09:33:04.2928000Z 2026-10-22T09:33:04.2928289Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T09:33:04.2928470Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:801:5] 2026-10-22T09:33:04.2928534Z 742 │ 2026-10-22T09:33:04.2928615Z 743 │ useEffect(() => { 2026-10-22T09:33:04.2928697Z ·  ────┬──── 2026-10-22T09:33:04.2928844Z · ╰── This is the containing effect 2026-10-22T09:33:04.2928963Z 744 │ const shareId = props.incomingShareId; 2026-10-22T09:33:04.2929058Z 745 │ const draftKey = flow.draftKey; 2026-10-22T09:33:04.2929168Z 746 │ const destinationProject = selectedProject; 2026-10-22T09:33:04.2929334Z 747 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-22T09:33:04.2929481Z 748 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-22T09:33:04.2929584Z 749 │ const selectedProjectMatchesRoute = 2026-10-22T09:33:04.2929670Z 750 │ !initialEnvironmentId || 2026-10-22T09:33:04.2929753Z 751 │ !initialProjectId || 2026-10-22T09:33:04.2929904Z 752 │ (destinationProject?.environmentId === initialEnvironmentId && 2026-10-22T09:33:04.2930031Z 753 │ destinationProject.id === initialProjectId); 2026-10-22T09:33:04.2930101Z 754 │ if ( 2026-10-22T09:33:04.2930177Z 755 │ !shareId || 2026-10-22T09:33:04.2930256Z 756 │ !draftKey || 2026-10-22T09:33:04.2930346Z 757 │ !destinationProject || 2026-10-22T09:33:04.2930443Z 758 │ !selectedProjectMatchesRoute || 2026-10-22T09:33:04.2930559Z 759 │ cancelledIncomingShareId === shareId 2026-10-22T09:33:04.2930629Z 760 │ ) { 2026-10-22T09:33:04.2930696Z 761 │ return; 2026-10-22T09:33:04.2930763Z 762 │ } 2026-10-22T09:33:04.2930877Z 763 │ const importKey = `${shareId}:${draftKey}`; 2026-10-22T09:33:04.2930950Z 764 │ if ( 2026-10-22T09:33:04.2931079Z 765 │ startedShareImportKeyRef.current === importKey || 2026-10-22T09:33:04.2931217Z 766 │ cancellingShareImportKeyRef.current === importKey 2026-10-22T09:33:04.2931286Z 767 │ ) { 2026-10-22T09:33:04.2931362Z 768 │ return; 2026-10-22T09:33:04.2931422Z 769 │ } 2026-10-22T09:33:04.2931486Z 770 │ 2026-10-22T09:33:04.2931573Z 771 │ if (!incomingShare) { 2026-10-22T09:33:04.2931797Z 772 │ if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) { 2026-10-22T09:33:04.2932052Z 773 │ alertedUnavailableIncomingShareIdRef.current = shareId; 2026-10-22T09:33:04.2932225Z 774 │ Dialog.alert( 2026-10-22T09:33:04.2932329Z 775 │ "Shared content unavailable", 2026-10-22T09:33:04.2932534Z 776 │ "The shared content is no longer in the inbox. You can continue editing this task draft.", 2026-10-22T09:33:04.2932602Z 777 │ ); 2026-10-22T09:33:04.2932669Z 778 │ } 2026-10-22T09:33:04.2932743Z 779 │ return; 2026-10-22T09:33:04.2932836Z 780 │ } 2026-10-22T09:33:04.2932931Z 781 │ 2026-10-22T09:33:04.2933013Z 782 │ if ( 2026-10-22T09:33:04.2933203Z 783 │ incomingShare.attachments.some((attachment) => attachment.type === "file") && 2026-10-22T09:33:04.2933315Z 784 │ selectedEnvironmentServerConfig === null 2026-10-22T09:33:04.2933380Z 785 │ ) { 2026-10-22T09:33:04.2933450Z 786 │ return; 2026-10-22T09:33:04.2933524Z 787 │ } 2026-10-22T09:33:04.2933588Z 788 │ 2026-10-22T09:33:04.2933750Z 789 │ if (alertedUnavailableIncomingShareIdRef.current === shareId) { 2026-10-22T09:33:04.2933891Z 790 │ alertedUnavailableIncomingShareIdRef.current = null; 2026-10-22T09:33:04.2934014Z 791 │ } 2026-10-22T09:33:04.2934144Z 792 │ startedShareImportKeyRef.current = importKey; 2026-10-22T09:33:04.2934226Z 793 │ const draftBackup = 2026-10-22T09:33:04.2934434Z 794 │ shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey); 2026-10-22T09:33:04.2934592Z 795 │ shareImportDraftBackupRef.current.set(importKey, draftBackup); 2026-10-22T09:33:04.2934692Z 796 │ const importToken = Symbol(importKey); 2026-10-22T09:33:04.2934790Z 797 │ let didReserveShare = false; 2026-10-22T09:33:04.2934879Z 798 │ let didConsumeShare = false; 2026-10-22T09:33:04.2934976Z 799 │ let needsDraftRestore = false; 2026-10-22T09:33:04.2935103Z 800 │ activeShareImportTokenRef.current = importToken; 2026-10-22T09:33:04.2935203Z 801 │ setImportingShareKey(importKey); 2026-10-22T09:33:04.2935306Z ·  ──────────┬───────── 2026-10-22T09:33:04.2935501Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.2935574Z 802 │ void (async () => { 2026-10-22T09:33:04.2935639Z ╰──── 2026-10-22T09:33:04.2936290Z  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-22T09:33:04.2936649Z  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-22T09:33:04.2936655Z 2026-10-22T09:33:04.2936876Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T09:33:04.2937045Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:721:5] 2026-10-22T09:33:04.2937139Z 720 │ props.initialProjectRef, 2026-10-22T09:33:04.2937223Z 721 │ props.incomingShareId, 2026-10-22T09:33:04.2937327Z ·  ──────────┬────────── 2026-10-22T09:33:04.2937510Z · ╰── Unnecessary dependency `props.incomingShareId` 2026-10-22T09:33:04.2937605Z 722 │ props.pendingTaskId, 2026-10-22T09:33:04.2937672Z ╰──── 2026-10-22T09:33:04.2938087Z  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-22T09:33:04.2938533Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.2938538Z 2026-10-22T09:33:04.2938781Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-22T09:33:04.2939005Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:740:5] 2026-10-22T09:33:04.2939151Z 739 │ loadedBranchesProjectKeyRef.current = projectKey; 2026-10-22T09:33:04.2939229Z 740 │ flow.loadBranches(); 2026-10-22T09:33:04.2939318Z ·  ──┬─ 2026-10-22T09:33:04.2939461Z · ╰── Missing dependency `flow` 2026-10-22T09:33:04.2939576Z 741 │ }, [flow.loadBranches, selectedProject]); 2026-10-22T09:33:04.2939678Z ·  ────────┬──────── 2026-10-22T09:33:04.2939896Z · ╰── Overly precise dependency `flow.loadBranches`, use `flow` instead 2026-10-22T09:33:04.2939964Z 742 │ 2026-10-22T09:33:04.2940024Z ╰──── 2026-10-22T09:33:04.2940487Z  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-22T09:33:04.2940825Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.2940828Z 2026-10-22T09:33:04.2941054Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T09:33:04.2941226Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:963:5] 2026-10-22T09:33:04.2941306Z 962 │ flow.draftKey, 2026-10-22T09:33:04.2941393Z 963 │ hasImportedIncomingShare, 2026-10-22T09:33:04.2941504Z ·  ────────────┬─────────── 2026-10-22T09:33:04.2941703Z · ╰── Unnecessary dependency `hasImportedIncomingShare` 2026-10-22T09:33:04.2941783Z 964 │ incomingShare, 2026-10-22T09:33:04.2941872Z 965 │ isIncomingShareInboxLoading, 2026-10-22T09:33:04.2941982Z ·  ─────────────┬───────────── 2026-10-22T09:33:04.2942185Z · ╰── Unnecessary dependency `isIncomingShareInboxLoading` 2026-10-22T09:33:04.2942280Z 966 │ isIncomingShareUnavailable, 2026-10-22T09:33:04.2942369Z 967 │ props.incomingShareId, 2026-10-22T09:33:04.2942483Z 968 │ props.initialProjectRef?.environmentId, 2026-10-22T09:33:04.2942591Z 969 │ props.initialProjectRef?.projectId, 2026-10-22T09:33:04.2942681Z 970 │ releaseShareReservation, 2026-10-22T09:33:04.2942752Z 971 │ reserveShare, 2026-10-22T09:33:04.2942854Z 972 │ selectedEnvironmentServerConfig, 2026-10-22T09:33:04.2942938Z 973 │ selectedProject, 2026-10-22T09:33:04.2943021Z 974 │ shareImportAttempt, 2026-10-22T09:33:04.2943121Z ·  ─────────┬──────── 2026-10-22T09:33:04.2943304Z · ╰── Unnecessary dependency `shareImportAttempt` 2026-10-22T09:33:04.2943373Z 975 │ ]); 2026-10-22T09:33:04.2943439Z ╰──── 2026-10-22T09:33:04.2943837Z  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-22T09:33:04.2944326Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.2944330Z 2026-10-22T09:33:04.2944662Z ⚠ react(immutability): This value cannot be modified 2026-10-22T09:33:04.2944949Z ╭─[apps/mobile/src/features/connection/ConnectionStatusDot.tsx:58:7] 2026-10-22T09:33:04.2945060Z 53 │ function usePulseAnimation(pulse: boolean) { 2026-10-22T09:33:04.2945169Z 54 │ const pulseProgress = useSharedValue(0); 2026-10-22T09:33:04.2945270Z ·  ──────┬────── 2026-10-22T09:33:04.2945439Z · ╰── `pulseProgress` originates here 2026-10-22T09:33:04.2945500Z 55 │ 2026-10-22T09:33:04.2945592Z 56 │ useEffect(() => { 2026-10-22T09:33:04.2945673Z 57 │ if (pulse) { 2026-10-22T09:33:04.2945776Z 58 │ pulseProgress.value = withRepeat( 2026-10-22T09:33:04.2945865Z ·  ──────┬────── 2026-10-22T09:33:04.2946031Z · ╰── `pulseProgress` cannot be modified 2026-10-22T09:33:04.2946116Z 59 │ withTiming(1, { 2026-10-22T09:33:04.2946179Z ╰──── 2026-10-22T09:33:04.2946469Z  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-22T09:33:04.2946809Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T09:33:04.2946813Z 2026-10-22T09:33:04.2947059Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-22T09:33:04.2947230Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:707:7] 2026-10-22T09:33:04.2947341Z 706 │ if (settingsSheetPresentation.isActive) { 2026-10-22T09:33:04.2947492Z 707 │ settingsRoutePresentation.present(settingsRouteSession); 2026-10-22T09:33:04.2947599Z ·  ────────────┬──────────── 2026-10-22T09:33:04.2947792Z · ╰── Missing dependency `settingsRoutePresentation` 2026-10-22T09:33:04.2947861Z 708 │ } 2026-10-22T09:33:04.2948079Z 709 │ }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]); 2026-10-22T09:33:04.2948202Z ·  ────────────────┬──────────────── 2026-10-22T09:33:04.2948677Z · ╰── Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead 2026-10-22T09:33:04.2948813Z 710 │ 2026-10-22T09:33:04.2948871Z ╰──── 2026-10-22T09:33:04.2949337Z  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-22T09:33:04.2949685Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.2949691Z 2026-10-22T09:33:04.2949866Z ⚠ react(immutability): This value cannot be modified 2026-10-22T09:33:04.2950023Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:302:5] 2026-10-22T09:33:04.2950210Z 298 │ typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0; 2026-10-22T09:33:04.2950369Z 299 │ const animatedBorderRadius = useSharedValue(targetBorderRadius); 2026-10-22T09:33:04.2950471Z ·  ──────────┬───────── 2026-10-22T09:33:04.2950638Z · ╰── `animatedBorderRadius` originates here 2026-10-22T09:33:04.2950810Z 300 │ const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android"; 2026-10-22T09:33:04.2950900Z 301 │ useLayoutEffect(() => { 2026-10-22T09:33:04.2951016Z 302 │ animatedBorderRadius.value = shouldAnimate 2026-10-22T09:33:04.2951114Z ·  ──────────┬───────── 2026-10-22T09:33:04.2951281Z · ╰── `animatedBorderRadius` cannot be modified 2026-10-22T09:33:04.2951391Z 303 │ ? withTiming(targetBorderRadius, { 2026-10-22T09:33:04.2951455Z ╰──── 2026-10-22T09:33:04.2951747Z  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-22T09:33:04.2952078Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T09:33:04.2952082Z 2026-10-22T09:33:04.2952269Z ⚠ react(purity): Cannot call impure function during render 2026-10-22T09:33:04.2952436Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:372:47] 2026-10-22T09:33:04.2952582Z 371 │ const { open, onOpenChange, onSnooze, timestampFormat } = props; 2026-10-22T09:33:04.2952749Z 372 │ const presets = open ? resolveSnoozePresets(new Date(), timestampFormat) : []; 2026-10-22T09:33:04.2952887Z ·  ─────┬──── 2026-10-22T09:33:04.2953068Z · ╰── Cannot call impure function 2026-10-22T09:33:04.2953143Z 373 │ return ( 2026-10-22T09:33:04.2953202Z ╰──── 2026-10-22T09:33:04.2953513Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-22T09:33:04.2953831Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-22T09:33:04.2953834Z 2026-10-22T09:33:04.2954160Z ⚠ react(purity): Cannot call impure function during render 2026-10-22T09:33:04.2954515Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:853:39] 2026-10-22T09:33:04.2954724Z 852 │ if (snoozeGateClock.thread !== thread) { 2026-10-22T09:33:04.2954947Z 853 │ setSnoozeGateClock({ thread, now: new Date().toISOString() }); 2026-10-22T09:33:04.2955138Z ·  ─────┬──── 2026-10-22T09:33:04.2955410Z · ╰── Cannot call impure function 2026-10-22T09:33:04.2955502Z 854 │ } 2026-10-22T09:33:04.2955595Z ╰──── 2026-10-22T09:33:04.2956079Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-22T09:33:04.2956595Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-22T09:33:04.2956599Z 2026-10-22T09:33:04.2957056Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T09:33:04.2957361Z ╭─[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:60:5] 2026-10-22T09:33:04.2957454Z 58 │ 2026-10-22T09:33:04.2957575Z 59 │ useEffect(() => { 2026-10-22T09:33:04.2957711Z ·  ────┬──── 2026-10-22T09:33:04.2957926Z · ╰── This is the containing effect 2026-10-22T09:33:04.2958071Z 60 │ setMountedModes((current) => { 2026-10-22T09:33:04.2958204Z ·  ───────┬─────── 2026-10-22T09:33:04.2958490Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.2958629Z 61 │ if (current.has(props.mode)) { 2026-10-22T09:33:04.2958725Z ╰──── 2026-10-22T09:33:04.2959772Z  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-22T09:33:04.2960334Z  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-22T09:33:04.2960338Z 2026-10-22T09:33:04.2960806Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T09:33:04.2961107Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:79:5] 2026-10-22T09:33:04.2961205Z 76 │ 2026-10-22T09:33:04.2961327Z 77 │ useEffect(() => { 2026-10-22T09:33:04.2961450Z ·  ────┬──── 2026-10-22T09:33:04.2961670Z · ╰── This is the containing effect 2026-10-22T09:33:04.2961886Z 78 │ const { host, code } = parsePairingUrl(connectionPairingUrl); 2026-10-22T09:33:04.2962005Z 79 │ setHostInput(host); 2026-10-22T09:33:04.2962127Z ·  ──────┬───── 2026-10-22T09:33:04.2962398Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.2962478Z 80 │ setCodeInput(code); 2026-10-22T09:33:04.2962538Z ╰──── 2026-10-22T09:33:04.2963273Z  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-22T09:33:04.2963681Z  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-22T09:33:04.2963684Z 2026-10-22T09:33:04.2964021Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T09:33:04.2964238Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:89:5] 2026-10-22T09:33:04.2964303Z 82 │ 2026-10-22T09:33:04.2964376Z 83 │ useEffect(() => { 2026-10-22T09:33:04.2964462Z ·  ────┬──── 2026-10-22T09:33:04.2964602Z · ╰── This is the containing effect 2026-10-22T09:33:04.2964709Z 84 │ if (routePairingUrl.length === 0) { 2026-10-22T09:33:04.2964782Z 85 │ return; 2026-10-22T09:33:04.2964858Z 86 │ } 2026-10-22T09:33:04.2964925Z 87 │ 2026-10-22T09:33:04.2965057Z 88 │ const { host, code } = parsePairingUrl(routePairingUrl); 2026-10-22T09:33:04.2965129Z 89 │ setHostInput(host); 2026-10-22T09:33:04.2965236Z ·  ──────┬───── 2026-10-22T09:33:04.2965489Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.2965564Z 90 │ setCodeInput(code); 2026-10-22T09:33:04.2965619Z ╰──── 2026-10-22T09:33:04.2966268Z  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-22T09:33:04.2966621Z  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-22T09:33:04.2966624Z 2026-10-22T09:33:04.2966904Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T09:33:04.2967086Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:95:7] 2026-10-22T09:33:04.2967142Z 92 │ 2026-10-22T09:33:04.2967217Z 93 │ useEffect(() => { 2026-10-22T09:33:04.2967296Z ·  ────┬──── 2026-10-22T09:33:04.2967433Z · ╰── This is the containing effect 2026-10-22T09:33:04.2967524Z 94 │ if (pairingConnectionError) { 2026-10-22T09:33:04.2967607Z 95 │ setIsSubmitting(false); 2026-10-22T09:33:04.2967706Z ·  ───────┬─────── 2026-10-22T09:33:04.2967893Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.2967952Z 96 │ } 2026-10-22T09:33:04.2968011Z ╰──── 2026-10-22T09:33:04.2968653Z  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-22T09:33:04.2969001Z  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-22T09:33:04.2969003Z 2026-10-22T09:33:04.2969352Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T09:33:04.2969567Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:388:5] 2026-10-22T09:33:04.2969631Z 386 │ 2026-10-22T09:33:04.2969707Z 387 │ useEffect(() => { 2026-10-22T09:33:04.2969788Z ·  ────┬──── 2026-10-22T09:33:04.2969926Z · ╰── This is the containing effect 2026-10-22T09:33:04.2970030Z 388 │ setInspectorSelection((current) => { 2026-10-22T09:33:04.2970127Z ·  ──────────┬────────── 2026-10-22T09:33:04.2970311Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.2970429Z 389 │ if (props.renderInspector === undefined) { 2026-10-22T09:33:04.2970494Z ╰──── 2026-10-22T09:33:04.2971141Z  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-22T09:33:04.2971497Z  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-22T09:33:04.2971500Z 2026-10-22T09:33:04.2971733Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-22T09:33:04.2971898Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:516:24] 2026-10-22T09:33:04.2972074Z 515 │ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top; 2026-10-22T09:33:04.2972269Z 516 │ ╭─▶ const GitInspector = () => ( 2026-10-22T09:33:04.2972383Z 517 │ │ 2026-10-22T09:33:04.2973005Z 522 │ ╰─▶ ); 2026-10-22T09:33:04.2973096Z 523 │ const FilesInspector = () => 2026-10-22T09:33:04.2973163Z ╰──── 2026-10-22T09:33:04.2973412Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-22T09:33:04.2973418Z 2026-10-22T09:33:04.2973646Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-22T09:33:04.2973814Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:523:26] 2026-10-22T09:33:04.2973884Z 522 │ ); 2026-10-22T09:33:04.2974149Z 523 │ ╭─▶ const FilesInspector = () => 2026-10-22T09:33:04.2974315Z 524 │ │ selectedThread !== null && selectedThreadCwd !== null ? ( 2026-10-22T09:33:04.2974436Z 525 │ │ 2026-10-22T09:33:04.2975652Z 533 │ ╰─▶ ) : null; 2026-10-22T09:33:04.2975823Z 534 │ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset); 2026-10-22T09:33:04.2975882Z ╰──── 2026-10-22T09:33:04.2976120Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-22T09:33:04.2976123Z 2026-10-22T09:33:04.2976433Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-22T09:33:04.2976623Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:387:19] 2026-10-22T09:33:04.2976694Z 386 │ onFilters, 2026-10-22T09:33:04.2976771Z 387 │ authorOptions = [], 2026-10-22T09:33:04.2976854Z ·  ── 2026-10-22T09:33:04.2976932Z 388 │ labelOptions = [], 2026-10-22T09:33:04.2976996Z ╰──── 2026-10-22T09:33:04.2977342Z  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-22T09:33:04.2977345Z 2026-10-22T09:33:04.2977652Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-22T09:33:04.2977835Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:388:18] 2026-10-22T09:33:04.2977914Z 387 │ authorOptions = [], 2026-10-22T09:33:04.2977991Z 388 │ labelOptions = [], 2026-10-22T09:33:04.2978073Z ·  ── 2026-10-22T09:33:04.2978139Z 389 │ host, 2026-10-22T09:33:04.2978199Z ╰──── 2026-10-22T09:33:04.2978538Z  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-22T09:33:04.2978541Z 2026-10-22T09:33:04.2978800Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-22T09:33:04.2978970Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:290:50] 2026-10-22T09:33:04.2979053Z 289 │ return ( 2026-10-22T09:33:04.2979204Z 290 │ 2026-10-22T09:33:04.2979341Z ·  ───────────── 2026-10-22T09:33:04.2979414Z 291 │ {props.children} 2026-10-22T09:33:04.2979474Z ╰──── 2026-10-22T09:33:04.2979720Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-22T09:33:04.2979881Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-22T09:33:04.2979883Z 2026-10-22T09:33:04.2980142Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-22T09:33:04.2980397Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:654:44] 2026-10-22T09:33:04.2980513Z 653 │ return ( 2026-10-22T09:33:04.2980650Z 654 │ 2026-10-22T09:33:04.2980776Z ·  ───────────── 2026-10-22T09:33:04.2980854Z 655 │ {props.children} 2026-10-22T09:33:04.2980916Z ╰──── 2026-10-22T09:33:04.2981159Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-22T09:33:04.2981308Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-22T09:33:04.2981311Z 2026-10-22T09:33:04.2981565Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-22T09:33:04.2981737Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1462:55] 2026-10-22T09:33:04.2981816Z 1461 │ return ( 2026-10-22T09:33:04.2981992Z 1462 │ 2026-10-22T09:33:04.2982136Z ·  ──────────────────── 2026-10-22T09:33:04.2982247Z 1463 │ { 2026-10-22T09:33:04.2983466Z ·  ────┬──── 2026-10-22T09:33:04.2983611Z · ╰── This is the containing effect 2026-10-22T09:33:04.2983708Z 282 │ setNow(new Date().toISOString()); 2026-10-22T09:33:04.2983785Z ·  ───┬── 2026-10-22T09:33:04.2984017Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.2984173Z 283 │ const id = setInterval(() => setNow(new Date().toISOString()), 60_000); 2026-10-22T09:33:04.2984239Z ╰──── 2026-10-22T09:33:04.2985219Z  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-22T09:33:04.2985784Z  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-22T09:33:04.2985789Z 2026-10-22T09:33:04.2986026Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T09:33:04.2986213Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:362:25] 2026-10-22T09:33:04.2986363Z 361 │ // range) the boundary string is identical and the chain would die. 2026-10-22T09:33:04.2986463Z 362 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-22T09:33:04.2986597Z ·  ───────┬────── 2026-10-22T09:33:04.2986790Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-22T09:33:04.2986919Z 363 │ const listItems = ((): readonly SidebarListItem[] => { 2026-10-22T09:33:04.2986976Z ╰──── 2026-10-22T09:33:04.2987310Z  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-22T09:33:04.2987653Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.2987656Z 2026-10-22T09:33:04.2987843Z ⚠ react(purity): Cannot call impure function during render 2026-10-22T09:33:04.2988029Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:353:53] 2026-10-22T09:33:04.2988137Z 352 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-22T09:33:04.2988316Z 353 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-22T09:33:04.2988451Z ·  ─────┬──── 2026-10-22T09:33:04.2988634Z · ╰── Cannot call impure function 2026-10-22T09:33:04.2988722Z 354 │ const id = setTimeout(() => { 2026-10-22T09:33:04.2988786Z ╰──── 2026-10-22T09:33:04.2989101Z  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-22T09:33:04.2989430Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-22T09:33:04.2989436Z 2026-10-22T09:33:04.2989716Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T09:33:04.2989881Z ╭─[apps/mobile/src/features/threads/use-worktree-setup.ts:30:40] 2026-10-22T09:33:04.2990068Z 28 │ const snapshot = resolveWorktreeSetupSnapshot(input.threadId, query.data, live); 2026-10-22T09:33:04.2990147Z 29 │ useEffect(() => { 2026-10-22T09:33:04.2990236Z ·  ────┬──── 2026-10-22T09:33:04.2990374Z · ╰── This is the containing effect 2026-10-22T09:33:04.2990517Z 30 │ if (snapshot && snapshot !== live) setHeld({ key, snapshot }); 2026-10-22T09:33:04.2990631Z ·  ───┬─── 2026-10-22T09:33:04.2990915Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.2991079Z 31 │ }, [key, live, snapshot]); 2026-10-22T09:33:04.2991150Z ╰──── 2026-10-22T09:33:04.2991801Z  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-22T09:33:04.2992154Z  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-22T09:33:04.2992157Z 2026-10-22T09:33:04.2992352Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-22T09:33:04.2992515Z ╭─[apps/server/src/provider/Drivers/CodexDriver.test.ts:418:14] 2026-10-22T09:33:04.2992581Z 417 │ 2026-10-22T09:33:04.2992700Z 418 │ for (const {} of ["direct", "wrapper"] as const) { 2026-10-22T09:33:04.2992783Z ·  ── 2026-10-22T09:33:04.2992843Z 419 │ } 2026-10-22T09:33:04.2992904Z ╰──── 2026-10-22T09:33:04.2993161Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-22T09:33:04.2993164Z 2026-10-22T09:33:04.2993404Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-22T09:33:04.2993555Z ╭─[apps/mobile/src/state/use-composer-drafts.ts:1022:15] 2026-10-22T09:33:04.2993630Z 1021 │ instanceId, 2026-10-22T09:33:04.2993794Z 1022 │ { ...(persisted.modelOptionMemory[instanceId] ?? {}), ...models }, 2026-10-22T09:33:04.2993944Z ·  ────────────────────────────────────────────────── 2026-10-22T09:33:04.2994072Z 1023 │ ]), 2026-10-22T09:33:04.2994140Z ╰──── 2026-10-22T09:33:04.2994437Z  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-22T09:33:04.2994439Z 2026-10-22T09:33:04.2994675Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-22T09:33:04.2994882Z ╭─[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:282:7] 2026-10-22T09:33:04.2995016Z 281 │ mountedRef.current = false; 2026-10-22T09:33:04.2995141Z 282 │ flow.setBranchQuery(""); 2026-10-22T09:33:04.2995269Z ·  ──┬─ 2026-10-22T09:33:04.2995471Z · ╰── Missing dependency `flow` 2026-10-22T09:33:04.2995573Z 283 │ }; 2026-10-22T09:33:04.2995709Z 284 │ }, [flow.setBranchQuery]); 2026-10-22T09:33:04.2995831Z ·  ─────────┬───────── 2026-10-22T09:33:04.2996050Z · ╰── Overly precise dependency `flow.setBranchQuery`, use `flow` instead 2026-10-22T09:33:04.2996115Z 285 │ 2026-10-22T09:33:04.2996179Z ╰──── 2026-10-22T09:33:04.2996641Z  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-22T09:33:04.2997065Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.2997179Z 2026-10-22T09:33:04.2997464Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-22T09:33:04.2997699Z ╭─[packages/shared/src/composerContextLegacySend.ts:19:45] 2026-10-22T09:33:04.2997898Z 18 │ const occurrences = collectComposerContextReferences(text); 2026-10-22T09:33:04.2998023Z 19 │ for (const occurrence of [...occurrences].reverse()) { 2026-10-22T09:33:04.2998142Z ·  ─────── 2026-10-22T09:33:04.2998269Z 20 │ const record = recordsById.get(occurrence.contextId); 2026-10-22T09:33:04.2998330Z ╰──── 2026-10-22T09:33:04.2998624Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-22T09:33:04.2998634Z 2026-10-22T09:33:04.2998912Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T09:33:04.2999083Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:496:5] 2026-10-22T09:33:04.2999153Z 494 │ }, []); 2026-10-22T09:33:04.2999234Z 495 │ useEffect(() => { 2026-10-22T09:33:04.2999320Z ·  ────┬──── 2026-10-22T09:33:04.2999552Z · ╰── This is the containing effect 2026-10-22T09:33:04.2999698Z 496 │ setKeyboardStateSuspect(false); 2026-10-22T09:33:04.2999802Z ·  ───────────┬─────────── 2026-10-22T09:33:04.2999992Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.3000121Z 497 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-22T09:33:04.3000193Z ╰──── 2026-10-22T09:33:04.3000839Z  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-22T09:33:04.3001187Z  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-22T09:33:04.3001189Z 2026-10-22T09:33:04.3001467Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T09:33:04.3001643Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:850:7] 2026-10-22T09:33:04.3001819Z 847 │ const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0); 2026-10-22T09:33:04.3001897Z 848 │ useEffect(() => { 2026-10-22T09:33:04.3001974Z ·  ────┬──── 2026-10-22T09:33:04.3002118Z · ╰── This is the containing effect 2026-10-22T09:33:04.3002292Z 849 │ if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) { 2026-10-22T09:33:04.3002418Z 850 │ setLastKnownKeyboardHeight(liveKeyboardHeight); 2026-10-22T09:33:04.3002525Z ·  ─────────────┬──────────── 2026-10-22T09:33:04.3002718Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.3002786Z 851 │ } 2026-10-22T09:33:04.3002844Z ╰──── 2026-10-22T09:33:04.3003564Z  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-22T09:33:04.3003976Z  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-22T09:33:04.3003979Z 2026-10-22T09:33:04.3004292Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T09:33:04.3004460Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1095:5] 2026-10-22T09:33:04.3004524Z 1093 │ 2026-10-22T09:33:04.3004597Z 1094 │ useEffect(() => { 2026-10-22T09:33:04.3004688Z ·  ────┬──── 2026-10-22T09:33:04.3004838Z · ╰── This is the containing effect 2026-10-22T09:33:04.3004931Z 1095 │ setAnchorMessageId(null); 2026-10-22T09:33:04.3005025Z ·  ─────────┬──────── 2026-10-22T09:33:04.3005216Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.3005311Z 1096 │ setSubmittedMessageId(null); 2026-10-22T09:33:04.3005375Z ╰──── 2026-10-22T09:33:04.3006017Z  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-22T09:33:04.3006370Z  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-22T09:33:04.3006376Z 2026-10-22T09:33:04.3006599Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T09:33:04.3006766Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:497:7] 2026-10-22T09:33:04.3006861Z 496 │ setKeyboardStateSuspect(false); 2026-10-22T09:33:04.3006967Z 497 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-22T09:33:04.3007122Z ·  ────────┬──────── ─────────┬──────── 2026-10-22T09:33:04.3007357Z · │ ╰── Unnecessary dependency `liveKeyboardHeight` 2026-10-22T09:33:04.3007544Z · ╰── Unnecessary dependency `isKeyboardVisible` 2026-10-22T09:33:04.3007687Z 498 │ const handleOwnedInputFocusChange = (focused: boolean) => { 2026-10-22T09:33:04.3007747Z ╰──── 2026-10-22T09:33:04.3008073Z  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-22T09:33:04.3008411Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.3008414Z 2026-10-22T09:33:04.3008635Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T09:33:04.3008799Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1043:7] 2026-10-22T09:33:04.3008983Z 1042 │ userInputInsetProgress.set(1); 2026-10-22T09:33:04.3009217Z 1043 │ }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]); 2026-10-22T09:33:04.3009327Z ·  ────────────┬─────────── 2026-10-22T09:33:04.3009519Z · ╰── Unnecessary dependency `activeUserInputRequestId` 2026-10-22T09:33:04.3009638Z 1044 │ const showContent = props.showContent ?? true; 2026-10-22T09:33:04.3009704Z ╰──── 2026-10-22T09:33:04.3010023Z  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-22T09:33:04.3010357Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.3010366Z 2026-10-22T09:33:04.3010585Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T09:33:04.3010760Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1101:15] 2026-10-22T09:33:04.3010842Z 1100 │ freeze.set(false); 2026-10-22T09:33:04.3010939Z 1101 │ }, [freeze, selectedThreadKey]); 2026-10-22T09:33:04.3011041Z ·  ────────┬──────── 2026-10-22T09:33:04.3011220Z · ╰── Unnecessary dependency `selectedThreadKey` 2026-10-22T09:33:04.3011285Z 1102 │ 2026-10-22T09:33:04.3011344Z ╰──── 2026-10-22T09:33:04.3011663Z  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-22T09:33:04.3012009Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.3012015Z 2026-10-22T09:33:04.3012188Z ⚠ react(immutability): This value cannot be modified 2026-10-22T09:33:04.3012354Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:931:5] 2026-10-22T09:33:04.3012492Z 926 │ const composerPopoverHeight = useSharedValue(0); 2026-10-22T09:33:04.3012612Z 927 │ const floatingControlCoverage = useSharedValue( 2026-10-22T09:33:04.3012723Z ·  ───────────┬─────────── 2026-10-22T09:33:04.3012899Z · ╰── `floatingControlCoverage` originates here 2026-10-22T09:33:04.3013039Z 928 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-22T09:33:04.3013106Z 929 │ ); 2026-10-22T09:33:04.3013254Z 930 │ useEffect(() => { 2026-10-22T09:33:04.3013425Z 931 │ floatingControlCoverage.value = withTiming( 2026-10-22T09:33:04.3013522Z ·  ───────────┬─────────── 2026-10-22T09:33:04.3013704Z · ╰── `floatingControlCoverage` cannot be modified 2026-10-22T09:33:04.3013845Z 932 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-22T09:33:04.3013907Z ╰──── 2026-10-22T09:33:04.3014275Z  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-22T09:33:04.3014606Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T09:33:04.3014609Z 2026-10-22T09:33:04.3014792Z ⚠ react(immutability): This value cannot be modified 2026-10-22T09:33:04.3014960Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:949:7] 2026-10-22T09:33:04.3015167Z 939 │ const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null; 2026-10-22T09:33:04.3015301Z 940 │ const combinedContentInsetEndAdjustment = useSharedValue( 2026-10-22T09:33:04.3015428Z ·  ────────────────┬──────────────── 2026-10-22T09:33:04.3015632Z · ╰── `combinedContentInsetEndAdjustment` originates here 2026-10-22T09:33:04.3015774Z 941 │ Math.max(0, estimatedOverlayHeight - nativeInsetOvercount), 2026-10-22T09:33:04.3015834Z 942 │ ); 2026-10-22T09:33:04.3015914Z 943 │ useAnimatedReaction( 2026-10-22T09:33:04.3015982Z 944 │ () => 2026-10-22T09:33:04.3016088Z 945 │ contentInsetEndAdjustment.value + 2026-10-22T09:33:04.3016189Z 946 │ floatingControlCoverage.value + 2026-10-22T09:33:04.3016408Z 947 │ (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0), 2026-10-22T09:33:04.3016484Z 948 │ (value) => { 2026-10-22T09:33:04.3016611Z 949 │ combinedContentInsetEndAdjustment.value = value; 2026-10-22T09:33:04.3016726Z ·  ────────────────┬──────────────── 2026-10-22T09:33:04.3016936Z · ╰── `combinedContentInsetEndAdjustment` cannot be modified 2026-10-22T09:33:04.3017004Z 950 │ }, 2026-10-22T09:33:04.3017063Z ╰──── 2026-10-22T09:33:04.3017349Z  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-22T09:33:04.3017687Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T09:33:04.3017694Z 2026-10-22T09:33:04.3018209Z ⚠ 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-22T09:33:04.3018348Z ╭─[packages/shared/src/atomicWrite.test.ts:139:5] 2026-10-22T09:33:04.3018438Z 138 │ Effect.gen(function* () { 2026-10-22T09:33:04.3018645Z 139 │ ╭─▶ while (fiber.pollUnsafe() === undefined) { 2026-10-22T09:33:04.3018787Z 140 │ │ yield* TestClock.adjust("100 millis"); 2026-10-22T09:33:04.3019215Z 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-22T09:33:04.3019657Z 142 │ │ yield* Effect.promise(() => new Promise((resolve) => setImmediate(resolve))); 2026-10-22T09:33:04.3019797Z 143 │ ╰─▶ } 2026-10-22T09:33:04.3019896Z 144 │ return yield* Fiber.join(fiber); 2026-10-22T09:33:04.3019966Z ╰──── 2026-10-22T09:33:04.3019969Z 2026-10-22T09:33:04.3020157Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-22T09:33:04.3020293Z ╭─[apps/server/src/processRunner.test.ts:266:14] 2026-10-22T09:33:04.3020351Z 265 │ 2026-10-22T09:33:04.3020469Z 266 │ for (const {} of ["timeout", "success"] as const) { 2026-10-22T09:33:04.3020556Z ·  ── 2026-10-22T09:33:04.3020626Z 267 │ } 2026-10-22T09:33:04.3020697Z ╰──── 2026-10-22T09:33:04.3020953Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-22T09:33:04.3020956Z 2026-10-22T09:33:04.3021463Z ⚠ 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-22T09:33:04.3021661Z ╭─[apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts:223:5] 2026-10-22T09:33:04.3021741Z 222 │ let idlePasses = 0; 2026-10-22T09:33:04.3021908Z 223 │ ╭─▶ for (;;) { 2026-10-22T09:33:04.3022066Z 224 │ │ yield* Effect.promise(() => Promise.resolve()); 2026-10-22T09:33:04.3022227Z 225 │ │ const pending = backgroundRuntime.pending.shift(); 2026-10-22T09:33:04.3022334Z 226 │ │ if (!pending) { 2026-10-22T09:33:04.3022441Z 227 │ │ idlePasses++; 2026-10-22T09:33:04.3022565Z 228 │ │ if (idlePasses >= 3) { 2026-10-22T09:33:04.3022668Z 229 │ │ return; 2026-10-22T09:33:04.3022758Z 230 │ │ } 2026-10-22T09:33:04.3022861Z 231 │ │ continue; 2026-10-22T09:33:04.3022950Z 232 │ │ } 2026-10-22T09:33:04.3023056Z 233 │ │ idlePasses = 0; 2026-10-22T09:33:04.3023191Z 234 │ │ const exit = yield* Effect.exit( 2026-10-22T09:33:04.3023436Z 235 │ │ pending.operation as Effect.Effect, 2026-10-22T09:33:04.3023537Z 236 │ │ ); 2026-10-22T09:33:04.3023660Z 237 │ │ yield* Effect.sync(() => { 2026-10-22T09:33:04.3023774Z 238 │ │ pending.resolve(exit); 2026-10-22T09:33:04.3023868Z 239 │ │ }); 2026-10-22T09:33:04.3024069Z 240 │ ╰─▶ } 2026-10-22T09:33:04.3024145Z 241 │ }, 2026-10-22T09:33:04.3024204Z ╰──── 2026-10-22T09:33:04.3024206Z 2026-10-22T09:33:04.3024424Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-22T09:33:04.3025147Z ╭─[apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx:814:17] 2026-10-22T09:33:04.3025411Z 813 │
    2026-10-22T09:33:04.3028103Z ·  ──────┬───── 2026-10-22T09:33:04.3028282Z · ╰── 'stopSessions' is declared here 2026-10-22T09:33:04.3028367Z 286 │ effect.pipe( 2026-10-22T09:33:04.3028427Z ╰──── 2026-10-22T09:33:04.3028545Z  help: Consider removing this parameter. 2026-10-22T09:33:04.3028548Z 2026-10-22T09:33:04.3028767Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T09:33:04.3028926Z ╭─[apps/mobile/src/state/use-thread-outbox-drain.ts:1315:5] 2026-10-22T09:33:04.3029015Z 1314 │ queuedMessagesByThreadKey, 2026-10-22T09:33:04.3029094Z 1315 │ retryTick, 2026-10-22T09:33:04.3029182Z ·  ────┬──── 2026-10-22T09:33:04.3029342Z · ╰── Unnecessary dependency `retryTick` 2026-10-22T09:33:04.3029431Z 1316 │ restoreQueuedMessage, 2026-10-22T09:33:04.3029498Z ╰──── 2026-10-22T09:33:04.3029820Z  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-22T09:33:04.3030167Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.3030169Z 2026-10-22T09:33:04.3030422Z ⚠ eslint(no-unneeded-ternary): Unnecessary use of boolean literals in conditional expression 2026-10-22T09:33:04.3030563Z ╭─[packages/shared/src/serverSettings.test.ts:35:7] 2026-10-22T09:33:04.3030766Z 34 │ const fallback = fallbackTextGenerationModelSelection(providerInstances, (instanceId) => 2026-10-22T09:33:04.3030876Z 35 │ instanceId === configured ? true : false, 2026-10-22T09:33:04.3031072Z ·  ──────────────────────────────────────── 2026-10-22T09:33:04.3031187Z 36 │ ); 2026-10-22T09:33:04.3031250Z ╰──── 2026-10-22T09:33:04.3031361Z  help: Remove this ternary operator 2026-10-22T09:33:04.3031365Z 2026-10-22T09:33:04.3031851Z ⚠ 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-22T09:33:04.3031994Z ╭─[apps/server/src/assets/AssetAccess.test.ts:1043:32] 2026-10-22T09:33:04.3032151Z 1042 │ expect(error._tag).toBe("AssetGitHubMediaUrlValidationError"); 2026-10-22T09:33:04.3032361Z 1043 │ const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(AssetAccessError))(error); 2026-10-22T09:33:04.3032495Z ·  ─────────────────── 2026-10-22T09:33:04.3032603Z 1044 │ expect(encoded).not.toContain(url); 2026-10-22T09:33:04.3032668Z ╰──── 2026-10-22T09:33:04.3032672Z 2026-10-22T09:33:04.3032922Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-22T09:33:04.3033062Z ╭─[apps/server/src/terminal/Manager.test.ts:731:31] 2026-10-22T09:33:04.3033130Z 730 │ ); 2026-10-22T09:33:04.3033326Z 731 │ const snapshot = events.filter((event) => event.type === "snapshot").at(-1)?.snapshot; 2026-10-22T09:33:04.3033441Z ·  ────── 2026-10-22T09:33:04.3033584Z 732 │ expect(snapshot?.history).toBe("aa😀\rEND"); 2026-10-22T09:33:04.3033644Z ╰──── 2026-10-22T09:33:04.3033851Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-22T09:33:04.3033857Z 2026-10-22T09:33:04.3034194Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T09:33:04.3034392Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:335:7] 2026-10-22T09:33:04.3034455Z 330 │ }; 2026-10-22T09:33:04.3034532Z 331 │ useEffect(() => { 2026-10-22T09:33:04.3034617Z ·  ────┬──── 2026-10-22T09:33:04.3034765Z · ╰── This is the containing effect 2026-10-22T09:33:04.3034876Z 332 │ if (!guidesEnabled && section === "guide") { 2026-10-22T09:33:04.3034992Z 333 │ requestedSection.current = "overview"; 2026-10-22T09:33:04.3035195Z 334 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-22T09:33:04.3035351Z 335 │ setSection("overview"); 2026-10-22T09:33:04.3035479Z ·  ─────┬──── 2026-10-22T09:33:04.3035673Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.3035745Z 336 │ } 2026-10-22T09:33:04.3035807Z ╰──── 2026-10-22T09:33:04.3036456Z  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-22T09:33:04.3036817Z  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-22T09:33:04.3036820Z 2026-10-22T09:33:04.3037056Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-22T09:33:04.3037249Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:337:6] 2026-10-22T09:33:04.3037366Z 332 │ if (!guidesEnabled && section === "guide") { 2026-10-22T09:33:04.3037470Z 333 │ requestedSection.current = "overview"; 2026-10-22T09:33:04.3037570Z ·  ────────┬─────── 2026-10-22T09:33:04.3038058Z · ╰── 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-22T09:33:04.3038243Z 334 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-22T09:33:04.3038414Z ·  ─────────┬───────── ──────┬────── 2026-10-22T09:33:04.3038944Z · │ ╰── 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-22T09:33:04.3039431Z · ╰── 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-22T09:33:04.3039521Z 335 │ setSection("overview"); 2026-10-22T09:33:04.3039590Z 336 │ } 2026-10-22T09:33:04.3039700Z 337 │ }, [guidesEnabled, section, insets.top]); 2026-10-22T09:33:04.3039832Z ·  ──────────────────┬───────────────── 2026-10-22T09:33:04.3040047Z · ╰── This dependency list is missing values used by the callback 2026-10-22T09:33:04.3040151Z 338 │ const tabContent = activityContent; 2026-10-22T09:33:04.3040215Z ╰──── 2026-10-22T09:33:04.3040399Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-22T09:33:04.3040742Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.3040745Z 2026-10-22T09:33:04.3040969Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-22T09:33:04.3041157Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:873:6] 2026-10-22T09:33:04.3041292Z 856 │ if ( 2026-10-22T09:33:04.3041475Z 857 │ lastSelection.current.path === route.params.path && 2026-10-22T09:33:04.3041567Z ·  ──────┬────── 2026-10-22T09:33:04.3042031Z · ╰── 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-22T09:33:04.3042176Z 858 │ lastSelection.current.id === route.params.fileSelectionId 2026-10-22T09:33:04.3042243Z 859 │ ) 2026-10-22T09:33:04.3042318Z 860 │ return; 2026-10-22T09:33:04.3042518Z 861 │ lastSelection.current = { path: route.params.path, id: route.params.fileSelectionId }; 2026-10-22T09:33:04.3042668Z 862 │ if (route.params.focus) navigation.setParams({ focus: undefined }); 2026-10-22T09:33:04.3042774Z 863 │ setJumpPath(route.params.path); 2026-10-22T09:33:04.3042861Z 864 │ setSelectedRowId(null); 2026-10-22T09:33:04.3042952Z 865 │ jumpStarted.current = false; 2026-10-22T09:33:04.3043114Z 866 │ const file = data.files.find((entry) => entry.path === route.params.path); 2026-10-22T09:33:04.3043223Z 867 │ if (!file || !nativeView.current) return; 2026-10-22T09:33:04.3043325Z ·  ─────┬──── 2026-10-22T09:33:04.3043802Z · ╰── 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-22T09:33:04.3043942Z 868 │ setCollapsedIds((ids) => ids.filter((id) => id !== file.id)); 2026-10-22T09:33:04.3044063Z 869 │ jumpStarted.current = true; 2026-10-22T09:33:04.3044234Z 870 │ void nativeView.current.scrollToFile(file.id, false).catch(() => { 2026-10-22T09:33:04.3044334Z 871 │ jumpStarted.current = false; 2026-10-22T09:33:04.3044405Z 872 │ }); 2026-10-22T09:33:04.3044616Z 873 │ }, [route.params.path, route.params.fileSelectionId, route.params.focus, data.files, navigation]); 2026-10-22T09:33:04.3044821Z ·  ──────────────────────────────────────────────┬────────────────────────────────────────────── 2026-10-22T09:33:04.3045065Z · ╰── This dependency list is missing values used by the callback 2026-10-22T09:33:04.3045191Z 874 │ const appliedFilter = useRef(filter.hideTestFiles); 2026-10-22T09:33:04.3045250Z ╰──── 2026-10-22T09:33:04.3045437Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-22T09:33:04.3045822Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.3045832Z 2026-10-22T09:33:04.3046056Z ⚠ react(purity): Cannot call impure function during render 2026-10-22T09:33:04.3046218Z ╭─[apps/web/src/components/chat/useThreadLifecycle.tsx:178:58] 2026-10-22T09:33:04.3046344Z 177 │ if (snoozeClockState.shell !== activeThreadShell) { 2026-10-22T09:33:04.3046533Z 178 │ setSnoozeClockState({ shell: activeThreadShell, now: new Date().toISOString() }); 2026-10-22T09:33:04.3046675Z ·  ─────┬──── 2026-10-22T09:33:04.3046866Z · ╰── Cannot call impure function 2026-10-22T09:33:04.3046930Z 179 │ } 2026-10-22T09:33:04.3047061Z ╰──── 2026-10-22T09:33:04.3047427Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-22T09:33:04.3047753Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-22T09:33:04.3047758Z 2026-10-22T09:33:04.3048000Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-22T09:33:04.3048135Z ╭─[packages/shared/src/serverSettings.ts:343:9] 2026-10-22T09:33:04.3048256Z 342 │ const entry: ProjectSettingsOverrides = { 2026-10-22T09:33:04.3048405Z 343 │ ...(entries.get(projectId) ?? currentEntries[projectId] ?? {}), 2026-10-22T09:33:04.3048567Z ·  ────────────────────────────────────────────────────────────── 2026-10-22T09:33:04.3048646Z 344 │ }; 2026-10-22T09:33:04.3048713Z ╰──── 2026-10-22T09:33:04.3049011Z  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-22T09:33:04.3049014Z 2026-10-22T09:33:04.3049251Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in Array.prototype.reduce() 2026-10-22T09:33:04.3049384Z ╭─[packages/shared/src/serverSettings.ts:429:24] 2026-10-22T09:33:04.3049461Z 428 │ const favorites = 2026-10-22T09:33:04.3049587Z 429 │ setModelFavorites?.reduce((current, change) => { 2026-10-22T09:33:04.3049689Z ·  ───┬── 2026-10-22T09:33:04.3049832Z · ╰── For this reduce 2026-10-22T09:33:04.3049936Z 430 │ const exists = current.some( 2026-10-22T09:33:04.3050127Z 431 │ (favorite) => favorite.provider === change.provider && favorite.model === change.model, 2026-10-22T09:33:04.3050197Z 432 │ ); 2026-10-22T09:33:04.3050278Z 433 │ return change.favorite 2026-10-22T09:33:04.3050357Z 434 │ ? exists 2026-10-22T09:33:04.3050438Z 435 │ ? current 2026-10-22T09:33:04.3050586Z 436 │ : [...current, { provider: change.provider, model: change.model }] 2026-10-22T09:33:04.3050685Z ·  ─────┬──── 2026-10-22T09:33:04.3050822Z · ╰── From this spread 2026-10-22T09:33:04.3050905Z 437 │ : current.filter( 2026-10-22T09:33:04.3050963Z ╰──── 2026-10-22T09:33:04.3051201Z  help: Consider using `Object.assign()` or `Array.prototype.push()` to mutate the accumulator instead. 2026-10-22T09:33:04.3051384Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-22T09:33:04.3051387Z 2026-10-22T09:33:04.3051592Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-22T09:33:04.3051724Z ╭─[packages/shared/src/serverSettings.ts:447:3] 2026-10-22T09:33:04.3051789Z 445 │ null; 2026-10-22T09:33:04.3051922Z 446 │ let nextModelPreferences = initialModelPreferences; 2026-10-22T09:33:04.3052024Z ·  ──────────┬───────── 2026-10-22T09:33:04.3052164Z · ╰── From this accumulator 2026-10-22T09:33:04.3052275Z 447 │ for (const change of setModelsHidden ?? []) { 2026-10-22T09:33:04.3052357Z ·  ─┬─ 2026-10-22T09:33:04.3052543Z · ╰── For this loop 2026-10-22T09:33:04.3052744Z 448 │ const preferences = nextModelPreferences?.[change.provider] ?? { 2026-10-22T09:33:04.3052821Z 449 │ hiddenModels: [], 2026-10-22T09:33:04.3052905Z 450 │ modelOrder: [], 2026-10-22T09:33:04.3052973Z 451 │ }; 2026-10-22T09:33:04.3053168Z 452 │ const hiddenModels = preferences.hiddenModels.filter((model) => model !== change.model); 2026-10-22T09:33:04.3053294Z 453 │ if (change.hidden) hiddenModels.push(change.model); 2026-10-22T09:33:04.3053382Z 454 │ nextModelPreferences = { 2026-10-22T09:33:04.3053475Z 455 │ ...nextModelPreferences, 2026-10-22T09:33:04.3053581Z ·  ───────────┬─────────── 2026-10-22T09:33:04.3053726Z · ╰── From this spread 2026-10-22T09:33:04.3053925Z 456 │ [change.provider]: { ...preferences, hiddenModels }, 2026-10-22T09:33:04.3054081Z ╰──── 2026-10-22T09:33:04.3054346Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-22T09:33:04.3054615Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-22T09:33:04.3054619Z 2026-10-22T09:33:04.3055255Z ⚠ 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-22T09:33:04.3055479Z ╭─[apps/server/src/auth/RpcAuthorization.ts:236:17] 2026-10-22T09:33:04.3055716Z 235 │ const requiredScopesForSettingsUpdate = (payload: unknown) => { 2026-10-22T09:33:04.3055939Z 236 │ const input = Schema.decodeUnknownSync(SettingsUpdate)(payload); 2026-10-22T09:33:04.3056124Z ·  ──────────────────────── 2026-10-22T09:33:04.3056376Z 237 │ const scopes = requiredScopesForServerSettingsPatch(input.patch); 2026-10-22T09:33:04.3056478Z ╰──── 2026-10-22T09:33:04.3056482Z 2026-10-22T09:33:04.3057106Z ⚠ 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-22T09:33:04.3057326Z ╭─[apps/server/src/auth/RpcAuthorization.ts:255:26] 2026-10-22T09:33:04.3057500Z 254 │ if (method === WS_METHODS.assetsCreateUrl) { 2026-10-22T09:33:04.3057725Z 255 │ const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload); 2026-10-22T09:33:04.3057850Z ·  ──────────────────────── 2026-10-22T09:33:04.3057926Z 256 │ return [ 2026-10-22T09:33:04.3057988Z ╰──── 2026-10-22T09:33:04.3057990Z 2026-10-22T09:33:04.3058298Z ⚠ eslint(no-unused-vars): Identifier 'Image' is imported but never used. 2026-10-22T09:33:04.3058536Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:17:10] 2026-10-22T09:33:04.3058686Z 16 │ import type { NativeSyntheticEvent, ViewProps } from "react-native"; 2026-10-22T09:33:04.3058819Z 17 │ import { Image, Platform, StyleSheet } from "react-native"; 2026-10-22T09:33:04.3058906Z ·  ──┬── 2026-10-22T09:33:04.3059050Z · ╰── 'Image' is imported here 2026-10-22T09:33:04.3059110Z 18 │ 2026-10-22T09:33:04.3059173Z ╰──── 2026-10-22T09:33:04.3059291Z  help: Consider removing this import. 2026-10-22T09:33:04.3059293Z 2026-10-22T09:33:04.3059516Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-22T09:33:04.3059679Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:227:6] 2026-10-22T09:33:04.3059861Z 223 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-22T09:33:04.3059966Z 224 │ nativeEventSnapshotsRef.current, 2026-10-22T09:33:04.3060072Z ·  ───────────┬─────────── 2026-10-22T09:33:04.3060577Z · ╰── 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-22T09:33:04.3060662Z 225 │ mostRecentEventCount, 2026-10-22T09:33:04.3060748Z 226 │ ); 2026-10-22T09:33:04.3060889Z 227 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-22T09:33:04.3061036Z ·  ──────────────────────────┬────────────────────────── 2026-10-22T09:33:04.3061263Z · ╰── This dependency list is missing values used by the callback 2026-10-22T09:33:04.3061362Z 228 │ const assumedValue = props.value; 2026-10-22T09:33:04.3061428Z ╰──── 2026-10-22T09:33:04.3061615Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-22T09:33:04.3061964Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.3061967Z 2026-10-22T09:33:04.3062206Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-22T09:33:04.3062367Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:235:7] 2026-10-22T09:33:04.3062535Z 234 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-22T09:33:04.3062638Z 235 │ nativeEventSnapshotsRef.current, 2026-10-22T09:33:04.3062748Z ·  ───────────┬─────────── 2026-10-22T09:33:04.3063240Z · ╰── 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-22T09:33:04.3063326Z 236 │ controlledEventCount, 2026-10-22T09:33:04.3063399Z 237 │ assumedValue, 2026-10-22T09:33:04.3063466Z 238 │ ); 2026-10-22T09:33:04.3063644Z 239 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-22T09:33:04.3063798Z ·  ───────────┬────────── 2026-10-22T09:33:04.3064157Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-22T09:33:04.3064320Z 240 │ const acceptNativeEvent = useCallback( 2026-10-22T09:33:04.3064382Z ╰──── 2026-10-22T09:33:04.3064935Z  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-22T09:33:04.3065278Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.3065280Z 2026-10-22T09:33:04.3065440Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.3065611Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:160:29] 2026-10-22T09:33:04.3065755Z 159 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-22T09:33:04.3065890Z 160 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-22T09:33:04.3066016Z ·  ─────────────┬──────────── 2026-10-22T09:33:04.3066202Z · ╰── Cannot access ref value during render 2026-10-22T09:33:04.3066273Z 161 │ }); 2026-10-22T09:33:04.3066335Z ╰──── 2026-10-22T09:33:04.3066840Z  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-22T09:33:04.3067165Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.3067171Z 2026-10-22T09:33:04.3067335Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.3067499Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:160:29] 2026-10-22T09:33:04.3067635Z 159 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-22T09:33:04.3067758Z 160 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-22T09:33:04.3067894Z ·  ─────────────┬──────────── 2026-10-22T09:33:04.3068123Z · ╰── Passing a ref to a function may read its value during render 2026-10-22T09:33:04.3068191Z 161 │ }); 2026-10-22T09:33:04.3068249Z ╰──── 2026-10-22T09:33:04.3068763Z  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-22T09:33:04.3069086Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.3069089Z 2026-10-22T09:33:04.3069256Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.3069415Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:23] 2026-10-22T09:33:04.3069478Z 161 │ }); 2026-10-22T09:33:04.3069588Z 162 │ confirmedTokensRef.current = tokens; 2026-10-22T09:33:04.3069880Z ·  ─────────┬────────────┬─── 2026-10-22T09:33:04.3070160Z · │ ╰── Cannot update ref value during render 2026-10-22T09:33:04.3070290Z · ╰── This value is a ref 2026-10-22T09:33:04.3070378Z 163 │ return JSON.stringify( 2026-10-22T09:33:04.3070441Z ╰──── 2026-10-22T09:33:04.3070942Z  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-22T09:33:04.3071256Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.3071261Z 2026-10-22T09:33:04.3071422Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.3071580Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:204:5] 2026-10-22T09:33:04.3071667Z 203 │ mostRecentEventCount, 2026-10-22T09:33:04.3071768Z 204 │ nativeEventSnapshotsRef.current, 2026-10-22T09:33:04.3071888Z ·  ───────────────┬─────────────── 2026-10-22T09:33:04.3072097Z · ╰── Passing a ref to a function may read its value during render 2026-10-22T09:33:04.3072165Z 205 │ ); 2026-10-22T09:33:04.3072224Z ╰──── 2026-10-22T09:33:04.3072723Z  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-22T09:33:04.3073047Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.3073054Z 2026-10-22T09:33:04.3073222Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.3073382Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:210:5] 2026-10-22T09:33:04.3073466Z 209 │ mostRecentEventCount, 2026-10-22T09:33:04.3073569Z 210 │ nativeEventSnapshotsRef.current, 2026-10-22T09:33:04.3073694Z ·  ───────────────┬─────────────── 2026-10-22T09:33:04.3073904Z · ╰── Passing a ref to a function may read its value during render 2026-10-22T09:33:04.3074003Z 211 │ ); 2026-10-22T09:33:04.3074070Z ╰──── 2026-10-22T09:33:04.3074660Z  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-22T09:33:04.3075030Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.3075034Z 2026-10-22T09:33:04.3075244Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-22T09:33:04.3075400Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:195:6] 2026-10-22T09:33:04.3075544Z 159 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-22T09:33:04.3075683Z 160 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-22T09:33:04.3075821Z ·  ─────────┬──────── 2026-10-22T09:33:04.3076329Z · ╰── 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-22T09:33:04.3076397Z 161 │ }); 2026-10-22T09:33:04.3076508Z 162 │ confirmedTokensRef.current = tokens; 2026-10-22T09:33:04.3076594Z 163 │ return JSON.stringify( 2026-10-22T09:33:04.3076773Z 164 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-22T09:33:04.3076861Z 165 │ const record = 2026-10-22T09:33:04.3076954Z 166 │ token.type === "context" 2026-10-22T09:33:04.3077140Z 167 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-22T09:33:04.3077221Z 168 │ : undefined; 2026-10-22T09:33:04.3077350Z 169 │ const presentation = contextChipPresentation( 2026-10-22T09:33:04.3077479Z 170 │ token.type === "context" ? token.kind : token.type, 2026-10-22T09:33:04.3077556Z 171 │ record, 2026-10-22T09:33:04.3077621Z 172 │ ); 2026-10-22T09:33:04.3077721Z 173 │ const icon = contextChipIcon( 2026-10-22T09:33:04.3077800Z 174 │ presentation, 2026-10-22T09:33:04.3077960Z 175 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-22T09:33:04.3078027Z 176 │ ); 2026-10-22T09:33:04.3078103Z 177 │ return { 2026-10-22T09:33:04.3078193Z 178 │ type: token.type, 2026-10-22T09:33:04.3078283Z 179 │ source: token.source, 2026-10-22T09:33:04.3078363Z 180 │ start: token.start, 2026-10-22T09:33:04.3078458Z 181 │ end: token.end, 2026-10-22T09:33:04.3078563Z 182 │ accent: presentation.accent, 2026-10-22T09:33:04.3078640Z 183 │ label: 2026-10-22T09:33:04.3078727Z 184 │ token.type === "skill" 2026-10-22T09:33:04.3078853Z 185 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-22T09:33:04.3078955Z 186 │ : token.type === "context" 2026-10-22T09:33:04.3079221Z 187 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-22T09:33:04.3079316Z 188 │ : basename(token.value), 2026-10-22T09:33:04.3079484Z 189 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-22T09:33:04.3079595Z 190 │ iconUri: contextChipIconUri(icon), 2026-10-22T09:33:04.3079697Z 191 │ tintsIcon: icon.kind === "chip", 2026-10-22T09:33:04.3079867Z 192 │ }; 2026-10-22T09:33:04.3080044Z 193 │ }), 2026-10-22T09:33:04.3080183Z 194 │ ); 2026-10-22T09:33:04.3080397Z 195 │ }, [props.value, props.context, skillLabels]); 2026-10-22T09:33:04.3080545Z ·  ────────────────────┬──────────────────── 2026-10-22T09:33:04.3080775Z · ╰── This dependency list is missing values used by the callback 2026-10-22T09:33:04.3081040Z 196 │ // Every render resolves against the snapshot history, so a render whose 2026-10-22T09:33:04.3081107Z ╰──── 2026-10-22T09:33:04.3081340Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-22T09:33:04.3081719Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.3081731Z 2026-10-22T09:33:04.3081955Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-22T09:33:04.3082119Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:257:5] 2026-10-22T09:33:04.3082268Z 249 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-22T09:33:04.3082389Z 250 │ nativeEventSnapshotsRef.current.push({ 2026-10-22T09:33:04.3082500Z ·  ───────────┬─────────── 2026-10-22T09:33:04.3083003Z · ╰── 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-22T09:33:04.3083115Z 251 │ eventCount: acknowledgedEventCount, 2026-10-22T09:33:04.3083194Z 252 │ value, 2026-10-22T09:33:04.3083295Z 253 │ selection: nextSelection, 2026-10-22T09:33:04.3083366Z 254 │ }); 2026-10-22T09:33:04.3083465Z 255 │ return acknowledgedEventCount; 2026-10-22T09:33:04.3083529Z 256 │ }, 2026-10-22T09:33:04.3083595Z 257 │ [], 2026-10-22T09:33:04.3083679Z ·  ─┬ 2026-10-22T09:33:04.3083881Z · ╰── This dependency list is missing values used by the callback 2026-10-22T09:33:04.3083949Z 258 │ ); 2026-10-22T09:33:04.3084079Z ╰──── 2026-10-22T09:33:04.3084324Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-22T09:33:04.3084669Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.3084681Z 2026-10-22T09:33:04.3084901Z ⚠ eslint(no-unused-vars): Identifier 'identity' is imported but never used. 2026-10-22T09:33:04.3085022Z ╭─[apps/server/src/auth/http.ts:28:10] 2026-10-22T09:33:04.3085126Z 27 │ import * as Schema from "effect/Schema"; 2026-10-22T09:33:04.3085238Z 28 │ import { identity } from "effect/Function"; 2026-10-22T09:33:04.3085323Z ·  ────┬─── 2026-10-22T09:33:04.3085477Z · ╰── 'identity' is imported here 2026-10-22T09:33:04.3085576Z 29 │ import * as Layer from "effect/Layer"; 2026-10-22T09:33:04.3085651Z ╰──── 2026-10-22T09:33:04.3085765Z  help: Consider removing this import. 2026-10-22T09:33:04.3085768Z 2026-10-22T09:33:04.3086093Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-22T09:33:04.3086336Z ╭─[apps/web/src/contextMenuFallback.test.ts:38:9] 2026-10-22T09:33:04.3086418Z 37 │ get isConnected() { 2026-10-22T09:33:04.3086521Z 38 │ let current: FakeElement | null = this; 2026-10-22T09:33:04.3086609Z ·  ─────── 2026-10-22T09:33:04.3086694Z 39 │ while (current?.parent) { 2026-10-22T09:33:04.3086759Z ╰──── 2026-10-22T09:33:04.3087140Z  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-22T09:33:04.3087143Z 2026-10-22T09:33:04.3087360Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-22T09:33:04.3087485Z ╭─[packages/shared/src/qrCode.ts:458:44] 2026-10-22T09:33:04.3087573Z 457 │ ): Array { 2026-10-22T09:33:04.3087699Z 458 │ let result: Array = divisor.map((_) => 0); 2026-10-22T09:33:04.3087829Z ·  ┬ 2026-10-22T09:33:04.3087993Z · ╰── '_' is declared here 2026-10-22T09:33:04.3088081Z 459 │ for (const b of data) { 2026-10-22T09:33:04.3088138Z ╰──── 2026-10-22T09:33:04.3088261Z  help: Consider removing this parameter. 2026-10-22T09:33:04.3088264Z 2026-10-22T09:33:04.3088494Z ⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used. 2026-10-22T09:33:04.3088656Z ╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10] 2026-10-22T09:33:04.3088716Z 21 │ 2026-10-22T09:33:04.3088895Z 22 │ function summarizePayload(payload: unknown): Readonly> { 2026-10-22T09:33:04.3089005Z ·  ────────┬─────── 2026-10-22T09:33:04.3089174Z · ╰── 'summarizePayload' is declared here 2026-10-22T09:33:04.3089291Z 23 │ if (payload === null) return { valueType: "null" }; 2026-10-22T09:33:04.3089355Z ╰──── 2026-10-22T09:33:04.3089474Z  help: Consider removing this declaration. 2026-10-22T09:33:04.3089477Z 2026-10-22T09:33:04.3089678Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-22T09:33:04.3089856Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:100:85] 2026-10-22T09:33:04.3089981Z  99 │ const startEditor = startScheduledTaskEditor; 2026-10-22T09:33:04.3090191Z 100 │ const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]); 2026-10-22T09:33:04.3090361Z ·  ─────┬───── 2026-10-22T09:33:04.3090588Z · ╰── Unnecessary dependency `startEditor` 2026-10-22T09:33:04.3090679Z 101 │ const readEditor = useCallback( 2026-10-22T09:33:04.3090746Z ╰──── 2026-10-22T09:33:04.3091095Z  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-22T09:33:04.3091438Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.3091441Z 2026-10-22T09:33:04.3091707Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-22T09:33:04.3091982Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:121:7] 2026-10-22T09:33:04.3092060Z 120 │ setEditor, 2026-10-22T09:33:04.3092140Z 121 │ startEditor, 2026-10-22T09:33:04.3092231Z ·  ─────┬───── 2026-10-22T09:33:04.3092397Z · ╰── Unnecessary dependency `startEditor` 2026-10-22T09:33:04.3092493Z 122 │ hasChanges, 2026-10-22T09:33:04.3092597Z ╰──── 2026-10-22T09:33:04.3092952Z  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-22T09:33:04.3093302Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.3093310Z 2026-10-22T09:33:04.3093782Z ⚠ 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-22T09:33:04.3094015Z ╭─[apps/server/src/provider/acp/AntigravityProtocol.ts:263:20] 2026-10-22T09:33:04.3094114Z 262 │ ...(update._meta !== undefined 2026-10-22T09:33:04.3094303Z 263 │ ? { _meta: Schema.is(Schema.Record(Schema.String, Schema.Json))(meta) ? meta : null } 2026-10-22T09:33:04.3094409Z ·  ───────── 2026-10-22T09:33:04.3094488Z 264 │ : {}), 2026-10-22T09:33:04.3094553Z ╰──── 2026-10-22T09:33:04.3094555Z 2026-10-22T09:33:04.3094728Z ⚠ react(immutability): This value cannot be modified 2026-10-22T09:33:04.3094907Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-22T09:33:04.3094983Z  86 │ 2026-10-22T09:33:04.3095091Z  87 │ const cardCoverage = props.cardCoverage; 2026-10-22T09:33:04.3095184Z ·  ──────┬───── 2026-10-22T09:33:04.3095341Z · ╰── `cardCoverage` originates here 2026-10-22T09:33:04.3095437Z  88 │ const barHeightRef = useRef(0); 2026-10-22T09:33:04.3095530Z  89 │ const cardHeightRef = useRef(0); 2026-10-22T09:33:04.3095623Z  90 │ const cardHeight = useSharedValue(0); 2026-10-22T09:33:04.3095729Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-22T09:33:04.3095811Z  92 │ if (!cardCoverage) { 2026-10-22T09:33:04.3095886Z  93 │ return; 2026-10-22T09:33:04.3095949Z  94 │ } 2026-10-22T09:33:04.3096130Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-22T09:33:04.3096237Z  96 │ if (coverage === cardCoverage.value) { 2026-10-22T09:33:04.3096311Z  97 │ return; 2026-10-22T09:33:04.3096374Z  98 │ } 2026-10-22T09:33:04.3096468Z  99 │ if (cardCoverage.value === 0) { 2026-10-22T09:33:04.3096566Z 100 │ cardCoverage.value = coverage; 2026-10-22T09:33:04.3096658Z ·  ──────┬───── 2026-10-22T09:33:04.3096815Z · ╰── `cardCoverage` cannot be modified 2026-10-22T09:33:04.3096889Z 101 │ return; 2026-10-22T09:33:04.3096954Z ╰──── 2026-10-22T09:33:04.3097286Z  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-22T09:33:04.3097703Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T09:33:04.3097769Z 2026-10-22T09:33:04.3097975Z ⚠ react(immutability): This value cannot be modified 2026-10-22T09:33:04.3098150Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7] 2026-10-22T09:33:04.3098247Z  89 │ const cardHeightRef = useRef(0); 2026-10-22T09:33:04.3098346Z  90 │ const cardHeight = useSharedValue(0); 2026-10-22T09:33:04.3098439Z ·  ─────┬──── 2026-10-22T09:33:04.3098669Z · ╰── `cardHeight` originates here 2026-10-22T09:33:04.3098784Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-22T09:33:04.3098862Z  92 │ if (!cardCoverage) { 2026-10-22T09:33:04.3098937Z  93 │ return; 2026-10-22T09:33:04.3099015Z  94 │ } 2026-10-22T09:33:04.3099197Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-22T09:33:04.3099293Z  96 │ if (coverage === cardCoverage.value) { 2026-10-22T09:33:04.3099366Z  97 │ return; 2026-10-22T09:33:04.3099440Z  98 │ } 2026-10-22T09:33:04.3099534Z  99 │ if (cardCoverage.value === 0) { 2026-10-22T09:33:04.3099628Z 100 │ cardCoverage.value = coverage; 2026-10-22T09:33:04.3099701Z 101 │ return; 2026-10-22T09:33:04.3099769Z 102 │ } 2026-10-22T09:33:04.3099884Z 103 │ cardCoverage.value = withTiming(coverage, { 2026-10-22T09:33:04.3099991Z 104 │ duration: USER_INPUT_TOGGLE_DURATION_MS, 2026-10-22T09:33:04.3100090Z 105 │ easing: Easing.out(Easing.cubic), 2026-10-22T09:33:04.3100161Z 106 │ }); 2026-10-22T09:33:04.3100239Z 107 │ }, [cardCoverage]); 2026-10-22T09:33:04.3100346Z 108 │ const handleBarLayout = useCallback( 2026-10-22T09:33:04.3100446Z 109 │ (event: LayoutChangeEvent) => { 2026-10-22T09:33:04.3100590Z 110 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-22T09:33:04.3100669Z 111 │ notifyCoverage(); 2026-10-22T09:33:04.3100742Z 112 │ }, 2026-10-22T09:33:04.3100824Z 113 │ [notifyCoverage], 2026-10-22T09:33:04.3100892Z 114 │ ); 2026-10-22T09:33:04.3100989Z 115 │ const handleCardLayout = useCallback( 2026-10-22T09:33:04.3101083Z 116 │ (event: LayoutChangeEvent) => { 2026-10-22T09:33:04.3101229Z 117 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-22T09:33:04.3101359Z 118 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-22T09:33:04.3101445Z ·  ─────┬──── 2026-10-22T09:33:04.3101611Z · ╰── `cardHeight` cannot be modified 2026-10-22T09:33:04.3101700Z 119 │ notifyCoverage(); 2026-10-22T09:33:04.3101762Z ╰──── 2026-10-22T09:33:04.3102057Z  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-22T09:33:04.3102390Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T09:33:04.3102393Z 2026-10-22T09:33:04.3102612Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-22T09:33:04.3102784Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-22T09:33:04.3102882Z  90 │ const cardHeight = useSharedValue(0); 2026-10-22T09:33:04.3103089Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-22T09:33:04.3103290Z ·  ───┬─── 2026-10-22T09:33:04.3103558Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-22T09:33:04.3103639Z  92 │ if (!cardCoverage) { 2026-10-22T09:33:04.3103706Z  93 │ return; 2026-10-22T09:33:04.3103772Z  94 │ } 2026-10-22T09:33:04.3104071Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-22T09:33:04.3104184Z  96 │ if (coverage === cardCoverage.value) { 2026-10-22T09:33:04.3104257Z  97 │ return; 2026-10-22T09:33:04.3104321Z  98 │ } 2026-10-22T09:33:04.3104415Z  99 │ if (cardCoverage.value === 0) { 2026-10-22T09:33:04.3104693Z 100 │ cardCoverage.value = coverage; 2026-10-22T09:33:04.3104821Z ·  ──────┬───── 2026-10-22T09:33:04.3104978Z · ╰── This modifies `cardCoverage` 2026-10-22T09:33:04.3105051Z 101 │ return; 2026-10-22T09:33:04.3105113Z ╰──── 2026-10-22T09:33:04.3105496Z  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-22T09:33:04.3105834Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T09:33:04.3105837Z 2026-10-22T09:33:04.3106062Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-22T09:33:04.3110453Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-22T09:33:04.3110617Z  99 │ if (cardCoverage.value === 0) { 2026-10-22T09:33:04.3110719Z 100 │ cardCoverage.value = coverage; 2026-10-22T09:33:04.3110814Z ·  ──────┬───── 2026-10-22T09:33:04.3110974Z · ╰── This modifies `cardCoverage` 2026-10-22T09:33:04.3111043Z 101 │ return; 2026-10-22T09:33:04.3111116Z 102 │ } 2026-10-22T09:33:04.3111233Z 103 │ cardCoverage.value = withTiming(coverage, { 2026-10-22T09:33:04.3111345Z 104 │ duration: USER_INPUT_TOGGLE_DURATION_MS, 2026-10-22T09:33:04.3111442Z 105 │ easing: Easing.out(Easing.cubic), 2026-10-22T09:33:04.3111509Z 106 │ }); 2026-10-22T09:33:04.3111588Z 107 │ }, [cardCoverage]); 2026-10-22T09:33:04.3111682Z 108 │ const handleBarLayout = useCallback( 2026-10-22T09:33:04.3111777Z 109 │ (event: LayoutChangeEvent) => { 2026-10-22T09:33:04.3112252Z ·  ───────────────┬─────────────── 2026-10-22T09:33:04.3112635Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-22T09:33:04.3112772Z 110 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-22T09:33:04.3112836Z ╰──── 2026-10-22T09:33:04.3113301Z  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-22T09:33:04.3113639Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T09:33:04.3113643Z 2026-10-22T09:33:04.3113875Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-22T09:33:04.3114110Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7] 2026-10-22T09:33:04.3114211Z 115 │ const handleCardLayout = useCallback( 2026-10-22T09:33:04.3114314Z 116 │ (event: LayoutChangeEvent) => { 2026-10-22T09:33:04.3114432Z ·  ───────────────┬─────────────── 2026-10-22T09:33:04.3114668Z · ╰── This function may (indirectly) reassign or modify `cardHeight` after render 2026-10-22T09:33:04.3114815Z 117 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-22T09:33:04.3114949Z 118 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-22T09:33:04.3115038Z ·  ─────┬──── 2026-10-22T09:33:04.3115180Z · ╰── This modifies `cardHeight` 2026-10-22T09:33:04.3115271Z 119 │ notifyCoverage(); 2026-10-22T09:33:04.3115338Z ╰──── 2026-10-22T09:33:04.3115706Z  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-22T09:33:04.3116042Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T09:33:04.3116044Z 2026-10-22T09:33:04.3116229Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-22T09:33:04.3116389Z ╭─[apps/server/src/process/externalLauncher.test.ts:186:12] 2026-10-22T09:33:04.3116462Z 185 │ 2026-10-22T09:33:04.3116580Z 186 │ for (const {} of ["darwin", "linux"] as const) { 2026-10-22T09:33:04.3116663Z ·  ── 2026-10-22T09:33:04.3116736Z 187 │ } 2026-10-22T09:33:04.3116802Z ╰──── 2026-10-22T09:33:04.3117056Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-22T09:33:04.3117059Z 2026-10-22T09:33:04.3117240Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-22T09:33:04.3117404Z ╭─[apps/server/src/process/externalLauncher.test.ts:189:12] 2026-10-22T09:33:04.3117475Z 188 │ 2026-10-22T09:33:04.3117554Z 189 │ for (const {} of [ 2026-10-22T09:33:04.3117632Z ·  ── 2026-10-22T09:33:04.3117743Z 190 │ { kind: "browser", folderVerb: "none" }, 2026-10-22T09:33:04.3117810Z ╰──── 2026-10-22T09:33:04.3118065Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-22T09:33:04.3118138Z 2026-10-22T09:33:04.3118541Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-22T09:33:04.3118699Z ╭─[apps/server/src/process/externalLauncher.test.ts:311:12] 2026-10-22T09:33:04.3118762Z 310 │ 2026-10-22T09:33:04.3118950Z 311 │ for (const {} of ["rejected", "spawn-error", "stalled"] as const) { 2026-10-22T09:33:04.3119065Z ·  ── 2026-10-22T09:33:04.3119131Z 312 │ } 2026-10-22T09:33:04.3119198Z ╰──── 2026-10-22T09:33:04.3119463Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-22T09:33:04.3119465Z 2026-10-22T09:33:04.3119646Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-22T09:33:04.3119814Z ╭─[apps/server/src/process/externalLauncher.test.ts:314:12] 2026-10-22T09:33:04.3119891Z 313 │ 2026-10-22T09:33:04.3119973Z 314 │ for (const {} of [ 2026-10-22T09:33:04.3120050Z ·  ── 2026-10-22T09:33:04.3120121Z 315 │ { 2026-10-22T09:33:04.3120186Z ╰──── 2026-10-22T09:33:04.3120437Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-22T09:33:04.3120440Z 2026-10-22T09:33:04.3120652Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-22T09:33:04.3120826Z ╭─[apps/mobile/src/features/threads/ThreadQueueControl.tsx:602:27] 2026-10-22T09:33:04.3121014Z 601 │ const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success)); 2026-10-22T09:33:04.3121107Z 602 │ const gesture = Gesture.Pan() 2026-10-22T09:33:04.3121212Z ·  ─┬─ 2026-10-22T09:33:04.3121383Z · ╰── `Pan` may be a component 2026-10-22T09:33:04.3121475Z 603 │ .enabled(!props.disabled) 2026-10-22T09:33:04.3121541Z ╰──── 2026-10-22T09:33:04.3121848Z  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-22T09:33:04.3122341Z  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-22T09:33:04.3122344Z 2026-10-22T09:33:04.3122552Z ⚠ eslint(no-unused-vars): Type 'Scope' is imported but never used. 2026-10-22T09:33:04.3122714Z ╭─[apps/server/src/provider/ProviderAuthService.ts:15:18] 2026-10-22T09:33:04.3122816Z 14 │ import * as Layer from "effect/Layer"; 2026-10-22T09:33:04.3122918Z 15 │ import type * as Scope from "effect/Scope"; 2026-10-22T09:33:04.3123013Z ·  ──┬── 2026-10-22T09:33:04.3123161Z · ╰── 'Scope' is imported here 2026-10-22T09:33:04.3123265Z 16 │ import * as Stream from "effect/Stream"; 2026-10-22T09:33:04.3123323Z ╰──── 2026-10-22T09:33:04.3123438Z  help: Consider removing this import. 2026-10-22T09:33:04.3123442Z 2026-10-22T09:33:04.3123754Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-22T09:33:04.3123930Z ╭─[apps/web/src/components/settings/SettingInheritance.tsx:163:24] 2026-10-22T09:33:04.3124108Z 162 │ keys, 2026-10-22T09:33:04.3124297Z 163 │ overridingProjects = [], 2026-10-22T09:33:04.3124396Z ·  ── 2026-10-22T09:33:04.3124480Z 164 │ onClearOverrides, 2026-10-22T09:33:04.3124539Z ╰──── 2026-10-22T09:33:04.3124927Z  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-22T09:33:04.3124931Z 2026-10-22T09:33:04.3125260Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-22T09:33:04.3125396Z ╭─[apps/server/src/usage/UsageService.ts:169:7] 2026-10-22T09:33:04.3125458Z 168 │ 2026-10-22T09:33:04.3125553Z 169 │ const layerTest = Layer.succeed( 2026-10-22T09:33:04.3125649Z ·  ────┬──── 2026-10-22T09:33:04.3125802Z · ╰── 'layerTest' is declared here 2026-10-22T09:33:04.3125878Z 170 │ UsageService, 2026-10-22T09:33:04.3125943Z ╰──── 2026-10-22T09:33:04.3126067Z  help: Consider removing this declaration. 2026-10-22T09:33:04.3126070Z 2026-10-22T09:33:04.3126274Z ⚠ react(static-components): Cannot create components during render 2026-10-22T09:33:04.3126446Z ╭─[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10] 2026-10-22T09:33:04.3126549Z 196 │ const { onInput, onResize } = props; 2026-10-22T09:33:04.3126716Z 197 │ const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView(); 2026-10-22T09:33:04.3126867Z ·  ────────────────┬─────────────── 2026-10-22T09:33:04.3127084Z · ╰── The component is created during render here 2026-10-22T09:33:04.3127230Z 198 │ const hasNativeSurface = Boolean(NativeTerminalSurfaceView); 2026-10-22T09:33:04.3127296Z 199 │ 2026-10-22T09:33:04.3127373Z 200 │ useEffect(() => { 2026-10-22T09:33:04.3127476Z 201 │ terminalDebugLog("native:surface", { 2026-10-22T09:33:04.3127571Z 202 │ terminalKey: props.terminalKey, 2026-10-22T09:33:04.3127666Z 203 │ native: hasNativeSurface, 2026-10-22T09:33:04.3127820Z 204 │ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(), 2026-10-22T09:33:04.3127912Z 205 │ bufferLen: props.buffer.length, 2026-10-22T09:33:04.3128004Z 206 │ isRunning: props.isRunning, 2026-10-22T09:33:04.3128071Z 207 │ }); 2026-10-22T09:33:04.3128253Z 208 │ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]); 2026-10-22T09:33:04.3128354Z 209 │ const handleNativeInput = useCallback( 2026-10-22T09:33:04.3128488Z 210 │ (event: NativeSyntheticEvent) => { 2026-10-22T09:33:04.3128603Z 211 │ if (!props.isRunning || props.readOnly) { 2026-10-22T09:33:04.3128682Z 212 │ return; 2026-10-22T09:33:04.3128745Z 213 │ } 2026-10-22T09:33:04.3128849Z 214 │ terminalDebugLog("native:onInput", { 2026-10-22T09:33:04.3129016Z 215 │ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)), 2026-10-22T09:33:04.3129087Z 216 │ }); 2026-10-22T09:33:04.3129184Z 217 │ onInput(event.nativeEvent.data); 2026-10-22T09:33:04.3129251Z 218 │ }, 2026-10-22T09:33:04.3129367Z 219 │ [onInput, props.isRunning, props.readOnly], 2026-10-22T09:33:04.3129442Z 220 │ ); 2026-10-22T09:33:04.3129626Z 221 │ const handleNativeResize = useCallback( 2026-10-22T09:33:04.3129833Z 222 │ (event: NativeSyntheticEvent) => { 2026-10-22T09:33:04.3129915Z 223 │ onResize({ 2026-10-22T09:33:04.3130010Z 224 │ cols: event.nativeEvent.cols, 2026-10-22T09:33:04.3130101Z 225 │ rows: event.nativeEvent.rows, 2026-10-22T09:33:04.3130170Z 226 │ }); 2026-10-22T09:33:04.3130242Z 227 │ }, 2026-10-22T09:33:04.3130321Z 228 │ [onResize], 2026-10-22T09:33:04.3130409Z 229 │ ); 2026-10-22T09:33:04.3130511Z 230 │ 2026-10-22T09:33:04.3130622Z 231 │ if (NativeTerminalSurfaceView) { 2026-10-22T09:33:04.3130694Z 232 │ return ( 2026-10-22T09:33:04.3130792Z 233 │ 2026-10-22T09:33:04.3130885Z 234 │ ({ key: input.targetKey, location: candidate })); 2026-10-22T09:33:04.3132767Z 113 │ useEffect(() => { 2026-10-22T09:33:04.3132849Z ·  ────┬──── 2026-10-22T09:33:04.3132997Z · ╰── This is the containing effect 2026-10-22T09:33:04.3133187Z 114 │ if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) { 2026-10-22T09:33:04.3133264Z 115 │ return; 2026-10-22T09:33:04.3133326Z 116 │ } 2026-10-22T09:33:04.3133465Z 117 │ setEntry({ key: input.targetKey, location: candidate }); 2026-10-22T09:33:04.3133555Z ·  ────┬─── 2026-10-22T09:33:04.3133744Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.3133882Z 118 │ }, [candidate, entry.key, entry.location, input.targetKey]); 2026-10-22T09:33:04.3133992Z ╰──── 2026-10-22T09:33:04.3135119Z  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-22T09:33:04.3135671Z  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-22T09:33:04.3135675Z 2026-10-22T09:33:04.3136353Z ⚠ 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-22T09:33:04.3136604Z ╭─[apps/server/src/usage/UsageService.test.ts:2374:7] 2026-10-22T09:33:04.3136827Z 2373 │ let orphanedAt: number | undefined; 2026-10-22T09:33:04.3137097Z 2374 │ ╭─▶ for (let interruptAt = 1; interruptAt <= 31; interruptAt += 1) { 2026-10-22T09:33:04.3137239Z 2375 │ │ const tasks: Array<() => void> = []; 2026-10-22T09:33:04.3137403Z 2376 │ │ const dispatcher: Scheduler.SchedulerDispatcher = { 2026-10-22T09:33:04.3137617Z 2377 │ │ scheduleTask: (task) => tasks.push(task), 2026-10-22T09:33:04.3137746Z 2378 │ │ flush: () => { 2026-10-22T09:33:04.3137889Z 2379 │ │ let task: (() => void) | undefined; 2026-10-22T09:33:04.3138067Z 2380 │ │ while ((task = tasks.shift()) !== undefined) task(); 2026-10-22T09:33:04.3138170Z 2381 │ │ }, 2026-10-22T09:33:04.3138267Z 2382 │ │ }; 2026-10-22T09:33:04.3138352Z 2383 │ │ 2026-10-22T09:33:04.3138534Z 2384 │ │ let requestFiber: Fiber.Fiber | undefined; 2026-10-22T09:33:04.3138660Z 2385 │ │ let requestChecks = 0; 2026-10-22T09:33:04.3138812Z 2386 │ │ const scheduler: Scheduler.Scheduler = { 2026-10-22T09:33:04.3138943Z 2387 │ │ executionMode: "async", 2026-10-22T09:33:04.3139092Z 2388 │ │ makeDispatcher: () => dispatcher, 2026-10-22T09:33:04.3139222Z 2389 │ │ shouldYield: (fiber) => { 2026-10-22T09:33:04.3139387Z 2390 │ │ if (fiber !== requestFiber) return false; 2026-10-22T09:33:04.3139513Z 2391 │ │ requestChecks += 1; 2026-10-22T09:33:04.3139676Z 2392 │ │ if (requestChecks !== interruptAt) return false; 2026-10-22T09:33:04.3139806Z 2393 │ │ fiber.interruptUnsafe(); 2026-10-22T09:33:04.3139929Z 2394 │ │ return true; 2026-10-22T09:33:04.3140029Z 2395 │ │ }, 2026-10-22T09:33:04.3140127Z 2396 │ │ }; 2026-10-22T09:33:04.3140205Z 2397 │ │ 2026-10-22T09:33:04.3140346Z 2398 │ │ const input: UsageSummaryInput = { 2026-10-22T09:33:04.3140457Z 2399 │ │ ...WINDOW, 2026-10-22T09:33:04.3140617Z 2400 │ │ sinceDay: UsageDay.make("2026-09-01"), 2026-10-22T09:33:04.3140844Z 2401 │ │ untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`), 2026-10-22T09:33:04.3140938Z 2402 │ │ }; 2026-10-22T09:33:04.3141068Z 2403 │ │ const first = yield* service 2026-10-22T09:33:04.3141194Z 2404 │ │ .readSummary(input) 2026-10-22T09:33:04.3141294Z 2405 │ │ .pipe( 2026-10-22T09:33:04.3141409Z 2406 │ │ Effect.exit, 2026-10-22T09:33:04.3141587Z 2407 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-22T09:33:04.3141716Z 2408 │ │ Effect.forkChild, 2026-10-22T09:33:04.3141808Z 2409 │ │ ); 2026-10-22T09:33:04.3142001Z 2410 │ │ requestFiber = first; 2026-10-22T09:33:04.3142219Z 2411 │ │ yield* Effect.yieldNow; 2026-10-22T09:33:04.3142345Z 2412 │ │ dispatcher.flush(); 2026-10-22T09:33:04.3142425Z 2413 │ │ 2026-10-22T09:33:04.3142597Z 2414 │ │ const second = yield* service.readSummary(input).pipe( 2026-10-22T09:33:04.3142712Z 2415 │ │ Effect.match({ 2026-10-22T09:33:04.3142872Z 2416 │ │ onFailure: (error) => error.reason, 2026-10-22T09:33:04.3143069Z 2417 │ │ onSuccess: () => "success" as const, 2026-10-22T09:33:04.3143171Z 2418 │ │ }), 2026-10-22T09:33:04.3143353Z 2419 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-22T09:33:04.3143475Z 2420 │ │ Effect.forkChild, 2026-10-22T09:33:04.3143566Z 2421 │ │ ); 2026-10-22T09:33:04.3143689Z 2422 │ │ yield* Effect.yieldNow; 2026-10-22T09:33:04.3143805Z 2423 │ │ dispatcher.flush(); 2026-10-22T09:33:04.3143948Z 2424 │ │ const secondExit = second.pollUnsafe(); 2026-10-22T09:33:04.3144167Z 2425 │ │ if (secondExit === undefined) { 2026-10-22T09:33:04.3144302Z 2426 │ │ second.interruptUnsafe(); 2026-10-22T09:33:04.3144429Z 2427 │ │ orphanedAt = interruptAt; 2026-10-22T09:33:04.3145307Z 2428 │ │ break; 2026-10-22T09:33:04.3145401Z 2429 │ │ } 2026-10-22T09:33:04.3145558Z 2430 │ │ if (Exit.isFailure(secondExit)) { 2026-10-22T09:33:04.3145743Z 2431 │ │ assert.fail("the matching request fiber was interrupted"); 2026-10-22T09:33:04.3145837Z 2432 │ │ } 2026-10-22T09:33:04.3146001Z 2433 │ │ assert.strictEqual(secondExit.value, "invalidWindow"); 2026-10-22T09:33:04.3146153Z 2434 │ ╰─▶ } 2026-10-22T09:33:04.3146225Z 2435 │ 2026-10-22T09:33:04.3146294Z ╰──── 2026-10-22T09:33:04.3146298Z 2026-10-22T09:33:04.3146865Z ⚠ 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-22T09:33:04.3147253Z ╭─[apps/server/src/background/HostPowerMonitor.test.ts:133:11] 2026-10-22T09:33:04.3147666Z 132 │ const monitor = yield* HostPowerMonitor.HostPowerMonitor; 2026-10-22T09:33:04.3147848Z 133 │ ╭─▶ for ( 2026-10-22T09:33:04.3147975Z 134 │ │ let attempt = 0; 2026-10-22T09:33:04.3148165Z 135 │ │ attempt < 100 && (yield* monitor.snapshot).onBattery !== "true"; 2026-10-22T09:33:04.3148287Z 136 │ │ attempt += 1 2026-10-22T09:33:04.3148386Z 137 │ │ ) { 2026-10-22T09:33:04.3148516Z 138 │ │ yield* Effect.yieldNow; 2026-10-22T09:33:04.3148668Z 139 │ ╰─▶ } 2026-10-22T09:33:04.3148821Z 140 │ expect((yield* monitor.snapshot).onBattery).toBe("true"); 2026-10-22T09:33:04.3148900Z ╰──── 2026-10-22T09:33:04.3148904Z 2026-10-22T09:33:04.3149410Z ⚠ 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-22T09:33:04.3149555Z ╭─[apps/server/src/serverSettings.test.ts:1718:32] 2026-10-22T09:33:04.3149747Z 1717 │ const model = createModelSelection(ProviderInstanceId.make("codex"), "gpt-5.5"); 2026-10-22T09:33:04.3149954Z 1718 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-22T09:33:04.3150090Z ·  ─────────────────── 2026-10-22T09:33:04.3150226Z 1719 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-22T09:33:04.3150291Z ╰──── 2026-10-22T09:33:04.3150294Z 2026-10-22T09:33:04.3150779Z ⚠ 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-22T09:33:04.3150917Z ╭─[apps/server/src/serverSettings.test.ts:1719:34] 2026-10-22T09:33:04.3151119Z 1718 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-22T09:33:04.3151237Z 1719 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-22T09:33:04.3151373Z ·  ─────────────────── 2026-10-22T09:33:04.3151508Z 1720 │ Schema.fromJsonString(Schema.Array(ProjectScript)), 2026-10-22T09:33:04.3151579Z ╰──── 2026-10-22T09:33:04.3151586Z 2026-10-22T09:33:04.3151869Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T09:33:04.3152061Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:643:5] 2026-10-22T09:33:04.3152128Z 638 │ 2026-10-22T09:33:04.3152210Z 639 │ useEffect(() => { 2026-10-22T09:33:04.3152298Z ·  ────┬──── 2026-10-22T09:33:04.3152451Z · ╰── This is the containing effect 2026-10-22T09:33:04.3152579Z 640 │ if (pendingLaunchEntry.key === launchTargetKey) { 2026-10-22T09:33:04.3152655Z 641 │ return; 2026-10-22T09:33:04.3152720Z 642 │ } 2026-10-22T09:33:04.3152808Z 643 │ setPendingLaunchEntry({ 2026-10-22T09:33:04.3152913Z ·  ──────────┬────────── 2026-10-22T09:33:04.3153200Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.3153394Z 644 │ key: launchTargetKey, 2026-10-22T09:33:04.3153460Z ╰──── 2026-10-22T09:33:04.3154233Z  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-22T09:33:04.3154597Z  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-22T09:33:04.3154600Z 2026-10-22T09:33:04.3154889Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T09:33:04.3155076Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5] 2026-10-22T09:33:04.3155142Z 648 │ 2026-10-22T09:33:04.3155221Z 649 │ useEffect(() => { 2026-10-22T09:33:04.3155308Z ·  ────┬──── 2026-10-22T09:33:04.3155452Z · ╰── This is the containing effect 2026-10-22T09:33:04.3155584Z 650 │ if (initialAttachGridEntry.key === launchTargetKey) { 2026-10-22T09:33:04.3155660Z 651 │ return; 2026-10-22T09:33:04.3155730Z 652 │ } 2026-10-22T09:33:04.3155821Z 653 │ setInitialAttachGridEntry({ 2026-10-22T09:33:04.3155930Z ·  ────────────┬──────────── 2026-10-22T09:33:04.3156124Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.3156218Z 654 │ key: launchTargetKey, 2026-10-22T09:33:04.3156284Z ╰──── 2026-10-22T09:33:04.3156947Z  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-22T09:33:04.3157326Z  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-22T09:33:04.3157331Z 2026-10-22T09:33:04.3157611Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T09:33:04.3157807Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7] 2026-10-22T09:33:04.3157871Z 743 │ 2026-10-22T09:33:04.3157951Z 744 │ useEffect(() => { 2026-10-22T09:33:04.3158039Z ·  ────┬──── 2026-10-22T09:33:04.3158185Z · ╰── This is the containing effect 2026-10-22T09:33:04.3158300Z 745 │ if (!routeEnvironmentId || !routeThreadId) { 2026-10-22T09:33:04.3158384Z 746 │ setLastGridSize({ 2026-10-22T09:33:04.3158482Z ·  ───────┬─────── 2026-10-22T09:33:04.3158741Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.3158880Z 747 │ cols: DEFAULT_TERMINAL_COLS, 2026-10-22T09:33:04.3158973Z ╰──── 2026-10-22T09:33:04.3160108Z  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-22T09:33:04.3160729Z  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-22T09:33:04.3160733Z 2026-10-22T09:33:04.3161078Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T09:33:04.3161361Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24] 2026-10-22T09:33:04.3161464Z 537 │ }); 2026-10-22T09:33:04.3161678Z 538 │ }, [terminal.buffer, terminal.buffer.length, terminalKey]); 2026-10-22T09:33:04.3161865Z ·  ───────────┬────────── 2026-10-22T09:33:04.3162290Z · ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead 2026-10-22T09:33:04.3162582Z 539 │ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null; 2026-10-22T09:33:04.3162677Z ╰──── 2026-10-22T09:33:04.3163085Z  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-22T09:33:04.3163420Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.3163427Z 2026-10-22T09:33:04.3163643Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T09:33:04.3163836Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7] 2026-10-22T09:33:04.3163949Z 708 │ sentInitialInputKeyRef.current = null; 2026-10-22T09:33:04.3164081Z 709 │ }, [terminalKey]); 2026-10-22T09:33:04.3164178Z ·  ─────┬───── 2026-10-22T09:33:04.3164342Z · ╰── Unnecessary dependency `terminalKey` 2026-10-22T09:33:04.3164409Z 710 │ 2026-10-22T09:33:04.3164471Z ╰──── 2026-10-22T09:33:04.3164787Z  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-22T09:33:04.3165127Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.3165130Z 2026-10-22T09:33:04.3165359Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T09:33:04.3165551Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52] 2026-10-22T09:33:04.3165614Z 799 │ }; 2026-10-22T09:33:04.3165818Z 800 │ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]); 2026-10-22T09:33:04.3166013Z ·  ────────────┬──────────── ─────┬───── 2026-10-22T09:33:04.3166266Z · │ ╰── Unnecessary dependency `terminalKey` 2026-10-22T09:33:04.3166496Z · ╰── Unnecessary dependency `terminal.lifecycleVersion` 2026-10-22T09:33:04.3166630Z 801 │ 2026-10-22T09:33:04.3166754Z ╰──── 2026-10-22T09:33:04.3167074Z  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-22T09:33:04.3167413Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.3167416Z 2026-10-22T09:33:04.3167573Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.3167760Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24] 2026-10-22T09:33:04.3167826Z 792 │ } 2026-10-22T09:33:04.3167950Z 793 │ const pasteSession = pasteSessionRef.current; 2026-10-22T09:33:04.3168079Z ·  ───────────┬─────────── 2026-10-22T09:33:04.3168264Z · ╰── Cannot access ref value during render 2026-10-22T09:33:04.3168327Z 794 │ 2026-10-22T09:33:04.3168389Z ╰──── 2026-10-22T09:33:04.3169077Z  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-22T09:33:04.3169486Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.3169489Z 2026-10-22T09:33:04.3169779Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-22T09:33:04.3169967Z ╭─[apps/server/src/orchestration-v2/ThreadPullRequestService.ts:408:7] 2026-10-22T09:33:04.3170037Z 407 │ 2026-10-22T09:33:04.3170184Z 408 │ const layer = Layer.effect(ThreadPullRequestServiceV2, make); 2026-10-22T09:33:04.3170272Z ·  ──┬── 2026-10-22T09:33:04.3170413Z · ╰── 'layer' is declared here 2026-10-22T09:33:04.3170477Z ╰──── 2026-10-22T09:33:04.3170645Z  help: Consider removing this declaration. 2026-10-22T09:33:04.3170650Z 2026-10-22T09:33:04.3170924Z ⚠ eslint(no-unused-vars): Identifier 'HostProcess' is imported but never used. 2026-10-22T09:33:04.3171220Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:25:13] 2026-10-22T09:33:04.3171331Z 24 │ import * as Schema from "effect/Schema"; 2026-10-22T09:33:04.3171471Z 25 │ import * as HostProcess from "@t3tools/shared/HostProcess"; 2026-10-22T09:33:04.3171576Z ·  ─────┬───── 2026-10-22T09:33:04.3171732Z · ╰── 'HostProcess' is imported here 2026-10-22T09:33:04.3171799Z 26 │ 2026-10-22T09:33:04.3171857Z ╰──── 2026-10-22T09:33:04.3171975Z  help: Consider removing this import. 2026-10-22T09:33:04.3171978Z 2026-10-22T09:33:04.3172280Z ⚠ eslint(no-unused-vars): Variable 'serverConfig' is declared but never used. Unused variables should start with a '_'. 2026-10-22T09:33:04.3172463Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:124:11] 2026-10-22T09:33:04.3172563Z 123 │ const path = yield* Path.Path; 2026-10-22T09:33:04.3172694Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-22T09:33:04.3172900Z ·  ──────┬───── 2026-10-22T09:33:04.3173157Z · ╰── 'serverConfig' is declared here 2026-10-22T09:33:04.3173376Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-22T09:33:04.3173443Z ╰──── 2026-10-22T09:33:04.3173652Z  help: Consider removing this declaration. 2026-10-22T09:33:04.3173658Z 2026-10-22T09:33:04.3174321Z ⚠ eslint(no-unused-vars): Variable 'serverSettings' is declared but never used. Unused variables should start with a '_'. 2026-10-22T09:33:04.3174665Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:125:11] 2026-10-22T09:33:04.3174839Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-22T09:33:04.3175002Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-22T09:33:04.3175113Z ·  ───────┬────── 2026-10-22T09:33:04.3175289Z · ╰── 'serverSettings' is declared here 2026-10-22T09:33:04.3175451Z 126 │ const gitWorkflow = yield* GitWorkflowService.GitWorkflowService; 2026-10-22T09:33:04.3175519Z ╰──── 2026-10-22T09:33:04.3175639Z  help: Consider removing this declaration. 2026-10-22T09:33:04.3175642Z 2026-10-22T09:33:04.3175818Z ⚠ react(immutability): This value cannot be modified 2026-10-22T09:33:04.3175980Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:174:5] 2026-10-22T09:33:04.3176169Z 170 │ const expandedAngle = props.collapsedDirection === "right" ? 90 : 180; 2026-10-22T09:33:04.3176362Z 171 │ const rotation = useSharedValue(props.expanded ? expandedAngle : 0); 2026-10-22T09:33:04.3176467Z ·  ────┬─── 2026-10-22T09:33:04.3176622Z · ╰── `rotation` originates here 2026-10-22T09:33:04.3176686Z 172 │ 2026-10-22T09:33:04.3176771Z 173 │ useLayoutEffect(() => { 2026-10-22T09:33:04.3176922Z 174 │ rotation.value = withTiming(props.expanded ? expandedAngle : 0, { 2026-10-22T09:33:04.3177003Z ·  ────┬─── 2026-10-22T09:33:04.3177152Z · ╰── `rotation` cannot be modified 2026-10-22T09:33:04.3177267Z 175 │ duration: THREAD_DISCLOSURE_TRANSITION_MS, 2026-10-22T09:33:04.3177328Z ╰──── 2026-10-22T09:33:04.3177617Z  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-22T09:33:04.3178043Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T09:33:04.3178103Z 2026-10-22T09:33:04.3178318Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-22T09:33:04.3178491Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:1252:23] 2026-10-22T09:33:04.3178570Z 1251 │ { 2026-10-22T09:33:04.3180398Z ·  ────┬──── 2026-10-22T09:33:04.3180573Z · ╰── This is the containing effect 2026-10-22T09:33:04.3180701Z 115 │ if (orientationSettled) return; 2026-10-22T09:33:04.3180831Z 116 │ const orientation = getNativeShowcaseOrientation(); 2026-10-22T09:33:04.3180924Z 117 │ if (orientation === null) { 2026-10-22T09:33:04.3181024Z 118 │ setOrientationSettled(true); 2026-10-22T09:33:04.3181129Z ·  ──────────┬────────── 2026-10-22T09:33:04.3181328Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.3181407Z 119 │ return; 2026-10-22T09:33:04.3181470Z ╰──── 2026-10-22T09:33:04.3182120Z  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-22T09:33:04.3182468Z  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-22T09:33:04.3182477Z 2026-10-22T09:33:04.3182920Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T09:33:04.3183188Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:317:7] 2026-10-22T09:33:04.3183255Z 305 │ 2026-10-22T09:33:04.3183331Z 306 │ useEffect(() => { 2026-10-22T09:33:04.3183410Z ·  ────┬──── 2026-10-22T09:33:04.3183552Z · ╰── This is the containing effect 2026-10-22T09:33:04.3183621Z 307 │ if ( 2026-10-22T09:33:04.3183701Z 308 │ scene === null || 2026-10-22T09:33:04.3183788Z 309 │ requestedScene === null || 2026-10-22T09:33:04.3183877Z 310 │ scene !== requestedScene || 2026-10-22T09:33:04.3184030Z 311 │ !hasFixture || 2026-10-22T09:33:04.3184119Z 312 │ !orientationSettled || 2026-10-22T09:33:04.3184202Z 313 │ !themeApplied || 2026-10-22T09:33:04.3184407Z 314 │ (scene === "agent-activity" && !agentActivityStaged) || 2026-10-22T09:33:04.3184929Z 315 │ !isShowcaseNativeContentReady({ scene, themeId, renderSignal }) 2026-10-22T09:33:04.3185070Z 316 │ ) { 2026-10-22T09:33:04.3185156Z 317 │ setReadyScene(null); 2026-10-22T09:33:04.3185248Z ·  ──────┬────── 2026-10-22T09:33:04.3185479Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.3185550Z 318 │ return; 2026-10-22T09:33:04.3185613Z ╰──── 2026-10-22T09:33:04.3186263Z  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-22T09:33:04.3186625Z  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-22T09:33:04.3186634Z 2026-10-22T09:33:04.3186932Z ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'. 2026-10-22T09:33:04.3187118Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:123:9] 2026-10-22T09:33:04.3187204Z 122 │ let cancelled = false; 2026-10-22T09:33:04.3187309Z 123 │ let lastOutcome: string | null = null; 2026-10-22T09:33:04.3187408Z ·  ─────┬───── 2026-10-22T09:33:04.3187556Z · ╰── 'lastOutcome' is declared here 2026-10-22T09:33:04.3187760Z 124 │ void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), { 2026-10-22T09:33:04.3187827Z ╰──── 2026-10-22T09:33:04.3187955Z  help: Consider removing this declaration. 2026-10-22T09:33:04.3187963Z 2026-10-22T09:33:04.3188134Z ⚠ react(immutability): This value cannot be modified 2026-10-22T09:33:04.3188318Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:111:5] 2026-10-22T09:33:04.3188385Z 107 │ ); 2026-10-22T09:33:04.3188558Z 108 │ const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0); 2026-10-22T09:33:04.3188656Z ·  ─────────┬──────── 2026-10-22T09:33:04.3188823Z · ╰── `separationProgress` originates here 2026-10-22T09:33:04.3188887Z 109 │ 2026-10-22T09:33:04.3188965Z 110 │ useEffect(() => { 2026-10-22T09:33:04.3189156Z 111 │ separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING); 2026-10-22T09:33:04.3189263Z ·  ─────────┬──────── 2026-10-22T09:33:04.3189434Z · ╰── `separationProgress` cannot be modified 2026-10-22T09:33:04.3189558Z 112 │ }, [props.showScrollToEnd, separationProgress]); 2026-10-22T09:33:04.3189617Z ╰──── 2026-10-22T09:33:04.3189909Z  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-22T09:33:04.3190366Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T09:33:04.3190370Z 2026-10-22T09:33:04.3190558Z ⚠ react(immutability): This value cannot be modified 2026-10-22T09:33:04.3190887Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-22T09:33:04.3191154Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-22T09:33:04.3191345Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-22T09:33:04.3191503Z ·  ──────┬───── 2026-10-22T09:33:04.3191748Z · ╰── `capsuleWidth` originates here 2026-10-22T09:33:04.3191914Z 130 │ const measuredWidthRef = useRef(null); 2026-10-22T09:33:04.3192050Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-22T09:33:04.3192195Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-22T09:33:04.3192353Z 133 │ if (width === measuredWidthRef.current) { 2026-10-22T09:33:04.3192462Z 134 │ return; 2026-10-22T09:33:04.3192543Z 135 │ } 2026-10-22T09:33:04.3192678Z 136 │ const first = measuredWidthRef.current === null; 2026-10-22T09:33:04.3192786Z 137 │ measuredWidthRef.current = width; 2026-10-22T09:33:04.3192944Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-22T09:33:04.3193035Z ·  ──────┬───── 2026-10-22T09:33:04.3193191Z · ╰── `capsuleWidth` cannot be modified 2026-10-22T09:33:04.3193258Z 139 │ }; 2026-10-22T09:33:04.3193317Z ╰──── 2026-10-22T09:33:04.3193628Z  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-22T09:33:04.3194227Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T09:33:04.3194234Z 2026-10-22T09:33:04.3194443Z ⚠ react(immutability): This value cannot be modified 2026-10-22T09:33:04.3194630Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-22T09:33:04.3194761Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-22T09:33:04.3194954Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-22T09:33:04.3195082Z ·  ──────┬───── 2026-10-22T09:33:04.3195233Z · ╰── `capsuleWidth` originates here 2026-10-22T09:33:04.3195361Z 130 │ const measuredWidthRef = useRef(null); 2026-10-22T09:33:04.3195492Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-22T09:33:04.3195614Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-22T09:33:04.3195772Z 133 │ if (width === measuredWidthRef.current) { 2026-10-22T09:33:04.3195901Z 134 │ return; 2026-10-22T09:33:04.3196023Z 135 │ } 2026-10-22T09:33:04.3196203Z 136 │ const first = measuredWidthRef.current === null; 2026-10-22T09:33:04.3196363Z 137 │ measuredWidthRef.current = width; 2026-10-22T09:33:04.3196635Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-22T09:33:04.3196751Z 139 │ }; 2026-10-22T09:33:04.3196877Z 140 │ const hasStatus = props.status !== null; 2026-10-22T09:33:04.3197086Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-22T09:33:04.3197209Z 142 │ useEffect(() => { 2026-10-22T09:33:04.3197335Z 143 │ if (!hasStatus) { 2026-10-22T09:33:04.3197488Z 144 │ measuredWidthRef.current = null; 2026-10-22T09:33:04.3197624Z 145 │ capsuleWidth.value = null; 2026-10-22T09:33:04.3197760Z ·  ──────┬───── 2026-10-22T09:33:04.3198073Z · ╰── `capsuleWidth` cannot be modified 2026-10-22T09:33:04.3198268Z 146 │ } 2026-10-22T09:33:04.3198344Z ╰──── 2026-10-22T09:33:04.3198634Z  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-22T09:33:04.3199030Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T09:33:04.3199035Z 2026-10-22T09:33:04.3199291Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-22T09:33:04.3199472Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-22T09:33:04.3199630Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-22T09:33:04.3199722Z 142 │ useEffect(() => { 2026-10-22T09:33:04.3199823Z ·  ───┬─── 2026-10-22T09:33:04.3200069Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-22T09:33:04.3200162Z 143 │ if (!hasStatus) { 2026-10-22T09:33:04.3200266Z 144 │ measuredWidthRef.current = null; 2026-10-22T09:33:04.3200360Z 145 │ capsuleWidth.value = null; 2026-10-22T09:33:04.3200443Z ·  ──────┬───── 2026-10-22T09:33:04.3200598Z · ╰── This modifies `capsuleWidth` 2026-10-22T09:33:04.3200670Z 146 │ } 2026-10-22T09:33:04.3200745Z ╰──── 2026-10-22T09:33:04.3201131Z  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-22T09:33:04.3201473Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T09:33:04.3201476Z 2026-10-22T09:33:04.3201699Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-22T09:33:04.3201889Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-22T09:33:04.3202020Z 130 │ const measuredWidthRef = useRef(null); 2026-10-22T09:33:04.3202149Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-22T09:33:04.3202298Z ·  ───────────────┬─────────────── 2026-10-22T09:33:04.3202579Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-22T09:33:04.3202721Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-22T09:33:04.3202831Z 133 │ if (width === measuredWidthRef.current) { 2026-10-22T09:33:04.3202905Z 134 │ return; 2026-10-22T09:33:04.3202971Z 135 │ } 2026-10-22T09:33:04.3203092Z 136 │ const first = measuredWidthRef.current === null; 2026-10-22T09:33:04.3203189Z 137 │ measuredWidthRef.current = width; 2026-10-22T09:33:04.3203358Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-22T09:33:04.3203453Z ·  ──────┬───── 2026-10-22T09:33:04.3203606Z · ╰── This modifies `capsuleWidth` 2026-10-22T09:33:04.3203671Z 139 │ }; 2026-10-22T09:33:04.3203738Z ╰──── 2026-10-22T09:33:04.3204308Z  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-22T09:33:04.3204938Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T09:33:04.3204941Z 2026-10-22T09:33:04.3205220Z ⚠ eslint(no-unused-vars): Identifier 'Fiber' is imported but never used. 2026-10-22T09:33:04.3205342Z ╭─[apps/server/src/ws.ts:9:13] 2026-10-22T09:33:04.3205448Z  8 │ import * as Effect from "effect/Effect"; 2026-10-22T09:33:04.3205543Z  9 │ import * as Fiber from "effect/Fiber"; 2026-10-22T09:33:04.3205634Z ·  ──┬── 2026-10-22T09:33:04.3205776Z · ╰── 'Fiber' is imported here 2026-10-22T09:33:04.3205905Z 10 │ import * as FileSystem from "effect/FileSystem"; 2026-10-22T09:33:04.3205971Z ╰──── 2026-10-22T09:33:04.3206086Z  help: Consider removing this import. 2026-10-22T09:33:04.3206094Z 2026-10-22T09:33:04.3206309Z ⚠ eslint(no-unused-vars): Identifier 'Schedule' is imported but never used. 2026-10-22T09:33:04.3206425Z ╭─[apps/server/src/ws.ts:16:13] 2026-10-22T09:33:04.3206519Z 15 │ import * as Ref from "effect/Ref"; 2026-10-22T09:33:04.3206626Z 16 │ import * as Schedule from "effect/Schedule"; 2026-10-22T09:33:04.3206713Z ·  ────┬─── 2026-10-22T09:33:04.3206872Z · ╰── 'Schedule' is imported here 2026-10-22T09:33:04.3206978Z 17 │ import * as Schema from "effect/Schema"; 2026-10-22T09:33:04.3207046Z ╰──── 2026-10-22T09:33:04.3207164Z  help: Consider removing this import. 2026-10-22T09:33:04.3207173Z 2026-10-22T09:33:04.3207504Z ⚠ eslint(no-unused-vars): Variable 'projectSetupScriptRunner' is declared but never used. Unused variables should start with a '_'. 2026-10-22T09:33:04.3207624Z ╭─[apps/server/src/ws.ts:1251:13] 2026-10-22T09:33:04.3207800Z 1250 │ const usageLimitSources = yield* UsageLimitSources.UsageLimitSources; 2026-10-22T09:33:04.3208017Z 1251 │ const projectSetupScriptRunner = yield* ProjectSetupScriptRunner.ProjectSetupScriptRunner; 2026-10-22T09:33:04.3208144Z ·  ────────────┬─────────── 2026-10-22T09:33:04.3208330Z · ╰── 'projectSetupScriptRunner' is declared here 2026-10-22T09:33:04.3208519Z 1252 │ const worktreeSetupTracker = yield* WorktreeSetupTracker.WorktreeSetupTracker; 2026-10-22T09:33:04.3208654Z ╰──── 2026-10-22T09:33:04.3208854Z  help: Consider removing this declaration. 2026-10-22T09:33:04.3208857Z 2026-10-22T09:33:04.3209144Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-22T09:33:04.3209294Z ╭─[apps/server/src/serverRuntimeStartup.ts:728:7] 2026-10-22T09:33:04.3209357Z 727 │ 2026-10-22T09:33:04.3209533Z 728 │ const layer = layerWithOptions(); 2026-10-22T09:33:04.3209638Z ·  ──┬── 2026-10-22T09:33:04.3209792Z · ╰── 'layer' is declared here 2026-10-22T09:33:04.3209854Z ╰──── 2026-10-22T09:33:04.3209978Z  help: Consider removing this declaration. 2026-10-22T09:33:04.3209981Z 2026-10-22T09:33:04.3210288Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T09:33:04.3210455Z ╭─[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5] 2026-10-22T09:33:04.3210521Z 150 │ 2026-10-22T09:33:04.3210598Z 151 │ useEffect(() => { 2026-10-22T09:33:04.3210685Z ·  ────┬──── 2026-10-22T09:33:04.3210830Z · ╰── This is the containing effect 2026-10-22T09:33:04.3210925Z 152 │ if (!controlledSelectedPath) { 2026-10-22T09:33:04.3211004Z 153 │ return; 2026-10-22T09:33:04.3211077Z 154 │ } 2026-10-22T09:33:04.3211175Z 155 │ setExpandedPaths((current) => { 2026-10-22T09:33:04.3211270Z ·  ────────┬─────── 2026-10-22T09:33:04.3211474Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T09:33:04.3211626Z 156 │ const ancestors = ancestorPaths(controlledSelectedPath); 2026-10-22T09:33:04.3211699Z ╰──── 2026-10-22T09:33:04.3212351Z  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-22T09:33:04.3212712Z  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-22T09:33:04.3212715Z 2026-10-22T09:33:04.3212924Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-22T09:33:04.3213144Z ╭─[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:116:34] 2026-10-22T09:33:04.3213235Z 115 │ return [...commands]; 2026-10-22T09:33:04.3213382Z 116 │ }, [activeThreadRef, pathname, registrationVersion, navigation]); 2026-10-22T09:33:04.3213516Z ·  ─────────┬───────── 2026-10-22T09:33:04.3213726Z · ╰── Unnecessary dependency `registrationVersion` 2026-10-22T09:33:04.3213796Z 117 │ 2026-10-22T09:33:04.3213853Z ╰──── 2026-10-22T09:33:04.3214293Z  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-22T09:33:04.3214640Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.3214709Z 2026-10-22T09:33:04.3215089Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-22T09:33:04.3215240Z ╭─[apps/server/src/telemetry/AnalyticsService.ts:340:7] 2026-10-22T09:33:04.3215302Z 339 │ 2026-10-22T09:33:04.3215418Z 340 │ const layerTest = AnalyticsService.layerTest; 2026-10-22T09:33:04.3215528Z ·  ────┬──── 2026-10-22T09:33:04.3215727Z · ╰── 'layerTest' is declared here 2026-10-22T09:33:04.3215786Z ╰──── 2026-10-22T09:33:04.3215907Z  help: Consider removing this declaration. 2026-10-22T09:33:04.3215910Z 2026-10-22T09:33:04.3216132Z ⚠ typescript(no-extraneous-class): Unexpected class with only a constructor. 2026-10-22T09:33:04.3216283Z ╭─[apps/desktop/src/preview/Manager.test.ts:158:18] 2026-10-22T09:33:04.3216401Z 157 │ BrowserWindow: browserWindowConstructor, 2026-10-22T09:33:04.3216582Z 158 │ ╭─▶ ClipboardItem: class { 2026-10-22T09:33:04.3216733Z 159 │ │ constructor(data: Record) { 2026-10-22T09:33:04.3216868Z 160 │ │ clipboardItemConstructor(data); 2026-10-22T09:33:04.3216957Z 161 │ │ } 2026-10-22T09:33:04.3217107Z 162 │ ╰─▶ }, 2026-10-22T09:33:04.3217189Z 163 │ clipboard: { 2026-10-22T09:33:04.3217258Z ╰──── 2026-10-22T09:33:04.3217443Z  help: Try replacing this class with a standalone function or deleting it entirely 2026-10-22T09:33:04.3217446Z 2026-10-22T09:33:04.3217680Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T09:33:04.3217853Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7] 2026-10-22T09:33:04.3217968Z 256 │ return () => cancelAnimationFrame(frame); 2026-10-22T09:33:04.3218058Z 257 │ }, [props.path, targetIndex]); 2026-10-22T09:33:04.3218152Z ·  ─────┬──── 2026-10-22T09:33:04.3218318Z · ╰── Unnecessary dependency `props.path` 2026-10-22T09:33:04.3218383Z 258 │ 2026-10-22T09:33:04.3218441Z ╰──── 2026-10-22T09:33:04.3218774Z  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-22T09:33:04.3219126Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T09:33:04.3219131Z 2026-10-22T09:33:04.3219347Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-22T09:33:04.3219518Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23] 2026-10-22T09:33:04.3219604Z 292 │ 2026-10-22T09:33:04.3221014Z ·  ─────────── 2026-10-22T09:33:04.3221107Z 310 │ {body} 2026-10-22T09:33:04.3221167Z ╰──── 2026-10-22T09:33:04.3221400Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-22T09:33:04.3221404Z 2026-10-22T09:33:04.3221606Z ⚠ react(purity): Cannot call impure function during render 2026-10-22T09:33:04.3221756Z ╭─[apps/web/src/components/CommandPalette.tsx:1996:20] 2026-10-22T09:33:04.3221894Z 1995 │ title: inferProjectTitleFromPath(destinationPath), 2026-10-22T09:33:04.3222019Z 1996 │ createdAt: new Date().toISOString(), 2026-10-22T09:33:04.3222132Z ·  ─────┬──── 2026-10-22T09:33:04.3222298Z · ╰── Cannot call impure function 2026-10-22T09:33:04.3222417Z 1997 │ remoteUrl: addProjectCloneFlow.remoteUrl, 2026-10-22T09:33:04.3222487Z ╰──── 2026-10-22T09:33:04.3222799Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-22T09:33:04.3223125Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-22T09:33:04.3223128Z 2026-10-22T09:33:04.3223319Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-22T09:33:04.3223530Z ╭─[packages/provider-opencode/src/server/OpenCodeRuntime.environment.test.ts:53:14] 2026-10-22T09:33:04.3223595Z 52 │ 2026-10-22T09:33:04.3223677Z 53 │ for (const {} of [ 2026-10-22T09:33:04.3223765Z ·  ── 2026-10-22T09:33:04.3223840Z 54 │ { healthy: true }, 2026-10-22T09:33:04.3223903Z ╰──── 2026-10-22T09:33:04.3224229Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-22T09:33:04.3224233Z 2026-10-22T09:33:04.3224921Z ⚠ 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-22T09:33:04.3225080Z ╭─[apps/server/src/project/ProjectService.test.ts:94:3] 2026-10-22T09:33:04.3225157Z 93 │ ) { 2026-10-22T09:33:04.3225385Z 94 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-22T09:33:04.3225583Z 95 │ │ const project = Option.getOrThrow(yield* service.getById(projectId)); 2026-10-22T09:33:04.3225714Z 96 │ │ if (predicate(project)) return project; 2026-10-22T09:33:04.3225833Z 97 │ │ yield* Effect.yieldNow; 2026-10-22T09:33:04.3225975Z 98 │ ╰─▶ } 2026-10-22T09:33:04.3226148Z 99 │ return yield* Effect.die(`Project ${projectId} was not enriched in time.`); 2026-10-22T09:33:04.3226213Z ╰──── 2026-10-22T09:33:04.3226216Z 2026-10-22T09:33:04.3226595Z ⚠ eslint(no-control-regex): Unexpected control character 2026-10-22T09:33:04.3226920Z ╭─[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46] 2026-10-22T09:33:04.3227076Z 219 │ 2026-10-22T09:33:04.3227241Z 220 │ {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")} 2026-10-22T09:33:04.3227367Z ·  ──┬─ 2026-10-22T09:33:04.3227632Z · ╰── 'U+001B' is a control character. 2026-10-22T09:33:04.3227714Z 221 │ 2026-10-22T09:33:04.3227787Z ╰──── 2026-10-22T09:33:04.3228048Z  help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression. 2026-10-22T09:33:04.3228059Z 2026-10-22T09:33:04.3228564Z ⚠ 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-22T09:33:04.3228738Z ╭─[apps/server/src/project/ProjectEnrichmentService.test.ts:28:3] 2026-10-22T09:33:04.3228805Z 27 │ ) { 2026-10-22T09:33:04.3229024Z 28 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-22T09:33:04.3229181Z 29 │ │ const available = yield* service.peek(workspaceRoot); 2026-10-22T09:33:04.3229327Z 30 │ │ if (predicate(available)) return available; 2026-10-22T09:33:04.3229447Z 31 │ │ yield* Effect.yieldNow; 2026-10-22T09:33:04.3229593Z 32 │ ╰─▶ } 2026-10-22T09:33:04.3229791Z 33 │ return yield* Effect.die(`Project metadata for ${workspaceRoot} was not resolved in time.`); 2026-10-22T09:33:04.3229853Z ╰──── 2026-10-22T09:33:04.3229856Z 2026-10-22T09:33:04.3230143Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-22T09:33:04.3230300Z ╭─[packages/provider-opencode/src/server/adapter.ts:3755:7] 2026-10-22T09:33:04.3230361Z 3754 │ 2026-10-22T09:33:04.3230580Z 3755 │ const layer: Layer.Layer = 2026-10-22T09:33:04.3230666Z ·  ──┬── 2026-10-22T09:33:04.3230816Z · ╰── 'layer' is declared here 2026-10-22T09:33:04.3230893Z 3756 │ Layer.effect( 2026-10-22T09:33:04.3230959Z ╰──── 2026-10-22T09:33:04.3231082Z  help: Consider removing this declaration. 2026-10-22T09:33:04.3231085Z 2026-10-22T09:33:04.3231304Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-22T09:33:04.3231476Z ╭─[apps/mobile/src/features/terminal/TerminalContextSheet.tsx:72:15] 2026-10-22T09:33:04.3231557Z 71 │ = Layer.effectDiscard( 2026-10-22T09:33:04.3233039Z ·  ─────┬───── 2026-10-22T09:33:04.3233198Z · ╰── 'layerDaemon' is declared here 2026-10-22T09:33:04.3233366Z 912 │ runDaemon.pipe(Effect.forkScoped), 2026-10-22T09:33:04.3233443Z ╰──── 2026-10-22T09:33:04.3233568Z  help: Consider removing this declaration. 2026-10-22T09:33:04.3233570Z 2026-10-22T09:33:04.3233994Z ⚠ 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-22T09:33:04.3234166Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:50:18] 2026-10-22T09:33:04.3234348Z 49 │ for (const tool of ["sendMessage", "followupTask", "interruptAgent", "listAgents"]) { 2026-10-22T09:33:04.3234544Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-22T09:33:04.3234642Z ·  ───────── 2026-10-22T09:33:04.3234838Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-22T09:33:04.3234899Z ╰──── 2026-10-22T09:33:04.3234902Z 2026-10-22T09:33:04.3235272Z ⚠ 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-22T09:33:04.3235435Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:51:18] 2026-10-22T09:33:04.3235616Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-22T09:33:04.3235818Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-22T09:33:04.3235929Z ·  ───────── 2026-10-22T09:33:04.3235997Z 52 │ } 2026-10-22T09:33:04.3236056Z ╰──── 2026-10-22T09:33:04.3236059Z 2026-10-22T09:33:04.3236425Z ⚠ 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-22T09:33:04.3236586Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:55:5] 2026-10-22T09:33:04.3236740Z 54 │ assert.equal( 2026-10-22T09:33:04.3237030Z 55 │ Schema.is(CodexSchema.ServerNotification__CollabAgentToolCallStatus)("interrupted"), 2026-10-22T09:33:04.3237114Z ·  ───────── 2026-10-22T09:33:04.3237190Z 56 │ true, 2026-10-22T09:33:04.3237258Z ╰──── 2026-10-22T09:33:04.3237260Z 2026-10-22T09:33:04.3237697Z ⚠ 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-22T09:33:04.3237852Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:59:5] 2026-10-22T09:33:04.3237933Z 58 │ assert.equal( 2026-10-22T09:33:04.3238136Z 59 │ Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentToolCallStatus)("interrupted"), 2026-10-22T09:33:04.3238224Z ·  ───────── 2026-10-22T09:33:04.3238292Z 60 │ true, 2026-10-22T09:33:04.3238367Z ╰──── 2026-10-22T09:33:04.3238375Z 2026-10-22T09:33:04.3238733Z ⚠ 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-22T09:33:04.3238903Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:103:16] 2026-10-22T09:33:04.3238965Z 102 │ 2026-10-22T09:33:04.3239164Z 103 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse)(resumeResponse), true); 2026-10-22T09:33:04.3239267Z ·  ───────── 2026-10-22T09:33:04.3239343Z 104 │ }); 2026-10-22T09:33:04.3239409Z ╰──── 2026-10-22T09:33:04.3239412Z 2026-10-22T09:33:04.3239841Z ⚠ 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-22T09:33:04.3239983Z ╭─[packages/effect-acp/src/client.ts:1269:11] 2026-10-22T09:33:04.3240159Z 1268 │ extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) => 2026-10-22T09:33:04.3240352Z 1269 │ Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe( 2026-10-22T09:33:04.3240479Z ·  ────────────────────────── 2026-10-22T09:33:04.3240647Z 1270 │ Effect.mapError(() => AcpError.AcpRequestError.invalidParams()), 2026-10-22T09:33:04.3240716Z ╰──── 2026-10-22T09:33:04.3240718Z 2026-10-22T09:33:04.3240883Z ⚠ react(refs): Cannot access refs during render 2026-10-22T09:33:04.3241057Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39] 2026-10-22T09:33:04.3241127Z 276 │ 2026-10-22T09:33:04.3241347Z 277 │ ╭─▶ return createElement(RawNativeView, { 2026-10-22T09:33:04.3241469Z 278 │ │ ...nativeProps, 2026-10-22T09:33:04.3241632Z 279 │ │ refreshEnabled: props.onPullToRefresh !== undefined, 2026-10-22T09:33:04.3241749Z 280 │ │ ref: nativeRef, 2026-10-22T09:33:04.3241905Z 281 │ ├─▶ }); 2026-10-22T09:33:04.3242170Z · ╰──── Passing a ref to a function may read its value during render 2026-10-22T09:33:04.3242234Z 282 │ } 2026-10-22T09:33:04.3242302Z ╰──── 2026-10-22T09:33:04.3242914Z  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-22T09:33:04.3243356Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T09:33:04.3243359Z 2026-10-22T09:33:04.3243665Z ⚠ eslint(no-unused-vars): Variable 'layerUnavailable' is declared but never used. Unused variables should start with a '_'. 2026-10-22T09:33:04.3243898Z ╭─[apps/server/src/orchestration-v2/Orchestrator.ts:12232:7] 2026-10-22T09:33:04.3244006Z 12231 │ 2026-10-22T09:33:04.3244210Z 12232 │ const layerUnavailable: Layer.Layer = Layer.succeed( 2026-10-22T09:33:04.3244315Z ·  ────────┬─────── 2026-10-22T09:33:04.3244484Z · ╰── 'layerUnavailable' is declared here 2026-10-22T09:33:04.3244582Z 12233 │ OrchestratorV2, 2026-10-22T09:33:04.3244649Z ╰──── 2026-10-22T09:33:04.3244769Z  help: Consider removing this declaration. 2026-10-22T09:33:04.3244772Z 2026-10-22T09:33:04.3245267Z ⚠ 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-22T09:33:04.3245407Z ╭─[packages/effect-acp/src/errors.test.ts:129:28] 2026-10-22T09:33:04.3245518Z 128 │ const secret = "acp-summary-secret"; 2026-10-22T09:33:04.3245650Z 129 │ const cause = yield* Schema.decodeUnknownEffect( 2026-10-22T09:33:04.3245781Z ·  ────────────────────────── 2026-10-22T09:33:04.3245877Z 130 │ Schema.Struct({ 2026-10-22T09:33:04.3245945Z ╰──── 2026-10-22T09:33:04.3245948Z 2026-10-22T09:33:04.3246179Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-22T09:33:04.3246366Z ╭─[apps/server/src/sourceControl/SourceControlProviderRegistry.ts:15:13] 2026-10-22T09:33:04.3246455Z 14 │ } from "@t3tools/contracts"; 2026-10-22T09:33:04.3246563Z 15 │ import type {} from "@t3tools/contracts"; 2026-10-22T09:33:04.3246648Z ·  ── 2026-10-22T09:33:04.3246846Z 16 │ import { detectSourceControlProviderFromRemoteUrl } from "@t3tools/shared/sourceControl"; 2026-10-22T09:33:04.3246915Z ╰──── 2026-10-22T09:33:04.3247017Z  help: Remove empty braces 2026-10-22T09:33:04.3247020Z 2026-10-22T09:33:04.3247524Z ⚠ 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-22T09:33:04.3247669Z ╭─[packages/effect-acp/src/protocol.test.ts:500:31] 2026-10-22T09:33:04.3247732Z 499 │ 2026-10-22T09:33:04.3247872Z 500 │ const response = yield* Schema.decodeUnknownEffect( 2026-10-22T09:33:04.3248005Z ·  ────────────────────────── 2026-10-22T09:33:04.3248133Z 501 │ Schema.fromJsonString(JsonRpcErrorResponse), 2026-10-22T09:33:04.3248190Z ╰──── 2026-10-22T09:33:04.3248193Z 2026-10-22T09:33:04.3248568Z ⚠ 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-22T09:33:04.3248787Z ╭─[packages/effect-acp/src/schema.test.ts:18:12] 2026-10-22T09:33:04.3249143Z 17 │ const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } }; 2026-10-22T09:33:04.3249280Z 18 │ expect(Schema.is(V1.AvailableCommand)(command)).toBe(true); 2026-10-22T09:33:04.3249371Z ·  ───────── 2026-10-22T09:33:04.3249446Z 19 │ expect( 2026-10-22T09:33:04.3249513Z ╰──── 2026-10-22T09:33:04.3249515Z 2026-10-22T09:33:04.3249958Z ⚠ 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-22T09:33:04.3250095Z ╭─[packages/effect-acp/src/schema.test.ts:20:7] 2026-10-22T09:33:04.3250175Z 19 │ expect( 2026-10-22T09:33:04.3250361Z 20 │ Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }), 2026-10-22T09:33:04.3250448Z ·  ───────── 2026-10-22T09:33:04.3250530Z 21 │ ).toBe(true); 2026-10-22T09:33:04.3250599Z ╰──── 2026-10-22T09:33:04.3250601Z 2026-10-22T09:33:04.3250782Z ⚠ eslint(no-empty-pattern): Empty array binding pattern 2026-10-22T09:33:04.3250954Z ╭─[apps/server/src/pullRequest/PullRequestService.test.ts:1429:12] 2026-10-22T09:33:04.3251024Z 1428 │ 2026-10-22T09:33:04.3251111Z 1429 │ for (const [] of [ 2026-10-22T09:33:04.3251198Z ·  ── 2026-10-22T09:33:04.3251280Z 1430 │ ["github", "github.com"], 2026-10-22T09:33:04.3251352Z ╰──── 2026-10-22T09:33:04.3251668Z  help: Passing non-iterable values (null, undefined, numbers, booleans, etc.) will result in a runtime error because these values are not iterable. 2026-10-22T09:33:04.3251671Z 2026-10-22T09:33:04.3251995Z ⚠ eslint(no-unused-vars): Variable 'legacyCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-22T09:33:04.3252177Z ╭─[packages/provider-cursor/src/server/credentialStore.test.ts:15:7] 2026-10-22T09:33:04.3252238Z 14 │ 2026-10-22T09:33:04.3252329Z 15 │ const legacyCredentials = { 2026-10-22T09:33:04.3252426Z ·  ────────┬──────── 2026-10-22T09:33:04.3252585Z · ╰── 'legacyCredentials' is declared here 2026-10-22T09:33:04.3252670Z 16 │ version: 1 as const, 2026-10-22T09:33:04.3252740Z ╰──── 2026-10-22T09:33:04.3252861Z  help: Consider removing this declaration. 2026-10-22T09:33:04.3252865Z 2026-10-22T09:33:04.3253178Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-22T09:33:04.3253325Z ╭─[packages/provider-cursor/src/server/auth.ts:249:20] 2026-10-22T09:33:04.3253399Z 248 │ }, 2026-10-22T09:33:04.3253498Z 249 │ (effect, flow, stopSessions) => 2026-10-22T09:33:04.3253606Z ·  ──────┬───── 2026-10-22T09:33:04.3253771Z · ╰── 'stopSessions' is declared here 2026-10-22T09:33:04.3253851Z 250 │ effect.pipe( 2026-10-22T09:33:04.3253915Z ╰──── 2026-10-22T09:33:04.3254109Z  help: Consider removing this parameter. 2026-10-22T09:33:04.3254113Z 2026-10-22T09:33:04.3254375Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-22T09:33:04.3254527Z ╭─[apps/web/src/components/chat/useComposerSend.ts:978:13] 2026-10-22T09:33:04.3254736Z 977 │ const changedBeforeDecline = draftChangedSinceSend(); 2026-10-22T09:33:04.3255087Z 978 │ ╭─▶ const pendingIdsBeforeDecline = pendingApprovalsRef.current.map( 2026-10-22T09:33:04.3255221Z 979 │ │ (approval) => approval.requestId, 2026-10-22T09:33:04.3255374Z 980 │ ╰─▶ ); 2026-10-22T09:33:04.3255551Z 981 │ const approvalResponding = approvalsToDecline.some((approval) => 2026-10-22T09:33:04.3255651Z ╰──── 2026-10-22T09:33:04.3255753Z  help: Switch to `Set` 2026-10-22T09:33:04.3255755Z 2026-10-22T09:33:04.3255982Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-22T09:33:04.3256174Z ╭─[apps/web/src/components/settings/ProviderSettingsPanel.logic.ts:4:8] 2026-10-22T09:33:04.3256266Z 3 │ AuthProvidersManageScope, 2026-10-22T09:33:04.3256346Z 4 │ type AuthSessionState, 2026-10-22T09:33:04.3256444Z ·  ────────┬─────── 2026-10-22T09:33:04.3256608Z · ╰── 'AuthSessionState' is imported here 2026-10-22T09:33:04.3256711Z 5 │ type EnvironmentId, 2026-10-22T09:33:04.3256773Z ╰──── 2026-10-22T09:33:04.3256890Z  help: Consider removing this import. 2026-10-22T09:33:04.3256893Z 2026-10-22T09:33:04.3257100Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-22T09:33:04.3257237Z ╭─[apps/mobile/src/lib/useHoverGesture.ts:8:15] 2026-10-22T09:33:04.3257305Z 7 │ () => 2026-10-22T09:33:04.3257388Z 8 │ Gesture.Hover() 2026-10-22T09:33:04.3257486Z ·  ──┬── 2026-10-22T09:33:04.3257642Z · ╰── `Hover` may be a component 2026-10-22T09:33:04.3257729Z 9 │ .manualActivation(true) 2026-10-22T09:33:04.3257795Z ╰──── 2026-10-22T09:33:04.3258109Z  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-22T09:33:04.3258617Z  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-22T09:33:04.3258620Z 2026-10-22T09:33:04.3258863Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-22T09:33:04.3259009Z ╭─[apps/mobile/src/lib/markdownDocument.ts:138:28] 2026-10-22T09:33:04.3259109Z 137 │ visit(parser.parse(markdown)); 2026-10-22T09:33:04.3259212Z 138 │ for (const edit of edits.reverse()) 2026-10-22T09:33:04.3259329Z ·  ─────── 2026-10-22T09:33:04.3259510Z 139 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-22T09:33:04.3259580Z ╰──── 2026-10-22T09:33:04.3259879Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-22T09:33:04.3259882Z 2026-10-22T09:33:04.3260117Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-22T09:33:04.3260251Z ╭─[apps/mobile/src/lib/markdownDocument.ts:169:28] 2026-10-22T09:33:04.3260431Z 168 │ visit(parser.parse(markdown)); 2026-10-22T09:33:04.3260618Z 169 │ for (const edit of edits.reverse()) 2026-10-22T09:33:04.3260729Z ·  ─────── 2026-10-22T09:33:04.3260908Z 170 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-22T09:33:04.3260983Z ╰──── 2026-10-22T09:33:04.3261348Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-22T09:33:04.3261351Z 2026-10-22T09:33:04.3261584Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-22T09:33:04.3261725Z ╭─[apps/mobile/src/lib/markdownDocument.ts:223:38] 2026-10-22T09:33:04.3261814Z 222 │ visit(parser.parse(markdown)); 2026-10-22T09:33:04.3261942Z 223 │ for (const lineStart of lineStarts.reverse()) { 2026-10-22T09:33:04.3262071Z ·  ─────── 2026-10-22T09:33:04.3262258Z 224 │ // The header row may be a lazy line without its container markers (`>` or list indent), 2026-10-22T09:33:04.3262319Z ╰──── 2026-10-22T09:33:04.3262612Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-22T09:33:04.3262615Z 2026-10-22T09:33:04.3262710Z Found 0 errors and 357 warnings in 5384 files (9.7s, 8 threads) 2026-10-22T09:33:04.4021651Z Post job cleanup. 2026-10-22T09:33:04.5061777Z Cache hit occurred on the primary key electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309, not saving cache. 2026-10-22T09:33:04.5191579Z Post job cleanup. 2026-10-22T09:33:04.5219889Z ##[start-action display=Cache full pnpm store;id=__76a3e230-a8ea-4336-a735-8e15fcf83273.__actions_cache_2] 2026-10-22T09:33:04.5763415Z Post job cleanup. 2026-10-22T09:33:04.6671380Z Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-d651407d7d0c7ecacd035718e6d120760bb0bb1ea0b966bcda4a8197c80ebc8f, not saving cache. 2026-10-22T09:33:04.6715654Z ##[end-action id=__76a3e230-a8ea-4336-a735-8e15fcf83273.__actions_cache_2;outcome=success;conclusion=success;duration_ms=149] 2026-10-22T09:33:04.6718269Z ##[start-action display=Setup Vite+;id=__76a3e230-a8ea-4336-a735-8e15fcf83273.__voidzero-dev_setup-vp] 2026-10-22T09:33:04.6744998Z Post job cleanup. 2026-10-22T09:33:04.7652259Z ##[end-action id=__76a3e230-a8ea-4336-a735-8e15fcf83273.__voidzero-dev_setup-vp;outcome=success;conclusion=success;duration_ms=93] 2026-10-22T09:33:04.7654339Z ##[start-action display=Cache Vite+;id=__76a3e230-a8ea-4336-a735-8e15fcf83273.__actions_cache] 2026-10-22T09:33:04.7679061Z Post job cleanup. 2026-10-22T09:33:04.8728430Z Cache hit occurred on the primary key vite-plus-home-v1-Linux-X64-1.3.0, not saving cache. 2026-10-22T09:33:04.8784367Z ##[end-action id=__76a3e230-a8ea-4336-a735-8e15fcf83273.__actions_cache;outcome=success;conclusion=success;duration_ms=112] 2026-10-22T09:33:04.8842160Z Post job cleanup. 2026-10-22T09:33:04.9418431Z [command]/usr/local/bin/git version 2026-10-22T09:33:04.9468270Z git version 2.55.0 2026-10-22T09:33:04.9497502Z Temporarily overriding HOME='/home/runner/_work/_temp/0a767e33-5eba-4b00-8263-6ba6a28d3968' before making global git config changes 2026-10-22T09:33:04.9498200Z Adding repository directory to the temporary git global config as a safe directory 2026-10-22T09:33:04.9505460Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-22T09:33:04.9546895Z Removing SSH command configuration 2026-10-22T09:33:04.9553065Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-22T09:33:04.9600743Z [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-22T09:33:04.9844969Z fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules 2026-10-22T09:33:04.9885518Z ##[warning]The process '/usr/local/bin/git' failed with exit code 128 2026-10-22T09:33:04.9967266Z A job completed hook has been configured by the self-hosted runner administrator 2026-10-22T09:33:04.9992710Z ##[group]Run '/job_completed.sh' 2026-10-22T09:33:05.0001914Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-22T09:33:05.0002187Z env: 2026-10-22T09:33:05.0002385Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 200 2026-10-22T09:33:05.0002583Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 456 2026-10-22T09:33:05.0002752Z BLACKSMITH_CHECK_RUN_ID: 119748187318 2026-10-22T09:33:05.0002911Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-22T09:33:05.0003077Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-22T09:33:05.0003230Z ##[endgroup] 2026-10-22T09:33:05.0120499Z Docker container cache not activated, skipping hash computation. 2026-10-22T09:33:05.0515423Z No active SSH sessions detected. Proceeding with shutdown immediately. 2026-10-22T09:33:05.0588418Z Cleaning up orphan processes