2026-10-22T20:13:44.6096216Z Current runner version: '2.337.0' 2026-10-22T20:13:44.6105537Z Runner name: 'blacksmith-8vcpu-ubuntu-2404-rme47k4bi6n4visp' 2026-10-22T20:13:44.6106917Z Runner group name: 'blacksmith scale sets - blacksmith-8vcpu-ubuntu-2404' 2026-10-22T20:13:44.6108615Z Machine name: 'ip-172-31-73-130' 2026-10-22T20:13:44.6111568Z ##[group]GITHUB_TOKEN Permissions 2026-10-22T20:13:44.6115238Z Contents: read 2026-10-22T20:13:44.6116011Z Metadata: read 2026-10-22T20:13:44.6116666Z ##[endgroup] 2026-10-22T20:13:44.6119619Z Secret source: Actions 2026-10-22T20:13:44.6120796Z Cache mode: write 2026-10-22T20:13:44.6121721Z Prepare workflow directory 2026-10-22T20:13:44.6479586Z Prepare all required actions 2026-10-22T20:13:44.6533335Z Getting action download info 2026-10-22T20:13:44.8438214Z Download action repository 'actions/checkout@v6' (SHA:d23441a48e516b6c34aea4fa41551a30e30af803) 2026-10-22T20:13:44.8963189Z Download action repository 'actions/cache@v6' (SHA:55cc8345863c7cc4c66a329aec7e433d2d1c52a9) 2026-10-22T20:13:45.0594782Z Setting BLACKSMITH_ACTIONS_RESULTS_URL to https://results-receiver.actions.githubusercontent.com/ 2026-10-22T20:13:45.0667234Z Complete job name: Lint 2026-10-22T20:13:45.1490394Z A job started hook has been configured by the self-hosted runner administrator 2026-10-22T20:13:45.1745405Z ##[group]Run '/setup.sh' 2026-10-22T20:13:45.1783093Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-22T20:13:45.1784463Z env: 2026-10-22T20:13:45.1784936Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 1181 2026-10-22T20:13:45.1785429Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 572 2026-10-22T20:13:45.1785913Z BLACKSMITH_CHECK_RUN_ID: 120062729322 2026-10-22T20:13:45.1786382Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-22T20:13:45.1786855Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-22T20:13:45.1787334Z ##[endgroup] 2026-10-22T20:13:45.2497964Z Logging daemon started (blacksmithd for logs) 2026-10-22T20:13:45.2746119Z Results daemon started (blacksmithd for results) 2026-10-22T20:13:45.3332468Z Background adoption and SSH setup started (PID: 3155) 2026-10-22T20:13:45.3333643Z 2026-10-22T20:13:45.3333913Z ---------------------------------------- 2026-10-22T20:13:45.3335080Z View this job: https://app.blacksmith.sh/pingdotgg/runs/39846979790/jobs/120062729322 2026-10-22T20:13:45.3335945Z SSH Access (using your GitHub SSH key): 2026-10-22T20:13:45.3336875Z ssh -p 64000 runner@blacksmith-8vcpu-ubuntu-2404-rme47k4bi6n4visp.vm.blacksmith.sh 2026-10-22T20:13:45.3337574Z 2026-10-22T20:13:45.3337819Z No GitHub SSH key? Add one at: 2026-10-22T20:13:45.3338855Z https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account 2026-10-22T20:13:45.3339644Z 2026-10-22T20:13:45.3339881Z ---------------------------------------- 2026-10-22T20:13:45.3340520Z 2026-10-22T20:13:45.3340812Z VM ID: blacksmith-8vcpu-ubuntu-2404-rme47k4bi6n4visp 2026-10-22T20:13:45.3341439Z Host: production-152.236.40.84-x8664 2026-10-22T20:13:45.3341980Z Host Agent PID: 2010785 2026-10-22T20:13:45.3342490Z Host Agent Git SHA: 266f03d96 2026-10-22T20:13:45.3343014Z Host CPU Manufacturer: AuthenticAMD 2026-10-22T20:13:45.3343563Z Blacksmith Host Generation: gen 2 2026-10-22T20:13:45.3344131Z Petname: production-credible-cheetah-820bda00 2026-10-22T20:13:45.3344708Z Region: us-east 2026-10-22T20:13:45.3345154Z Rootfs Version: ubuntu24-full-x64-081926 2026-10-22T20:13:45.3363528Z OS Version: Ubuntu 24.04.4 LTS 2026-10-22T20:13:45.3364186Z 2026-10-22T20:13:45.3364402Z Enabling Blacksmith transparent cache 2026-10-22T20:13:45.4240811Z ##[group]Run actions/checkout@v6 2026-10-22T20:13:45.4241368Z with: 2026-10-22T20:13:45.4241891Z sparse-checkout: /* !/.repos/ !/apps/mobile/modules/t3-terminal/Vendor/**/*.a 2026-10-22T20:13:45.4242519Z sparse-checkout-cone-mode: false 2026-10-22T20:13:45.4242954Z repository: pingdotgg/t3code 2026-10-22T20:13:45.4246139Z token: *** 2026-10-22T20:13:45.4246508Z ssh-strict: true 2026-10-22T20:13:45.4246838Z ssh-user: git 2026-10-22T20:13:45.4247292Z persist-credentials: true 2026-10-22T20:13:45.4248174Z clean: true 2026-10-22T20:13:45.4248404Z fetch-depth: 1 2026-10-22T20:13:45.4248635Z fetch-tags: false 2026-10-22T20:13:45.4248868Z show-progress: true 2026-10-22T20:13:45.4249116Z lfs: false 2026-10-22T20:13:45.4249640Z submodules: false 2026-10-22T20:13:45.4249888Z set-safe-directory: true 2026-10-22T20:13:45.4250153Z allow-unsafe-pr-checkout: false 2026-10-22T20:13:45.4250472Z env: 2026-10-22T20:13:45.4250760Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 1181 2026-10-22T20:13:45.4251062Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 572 2026-10-22T20:13:45.4251350Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T20:13:45.4251638Z ##[endgroup] 2026-10-22T20:13:45.6615958Z Syncing repository: pingdotgg/t3code 2026-10-22T20:13:45.6617636Z ##[group]Getting Git version info 2026-10-22T20:13:45.6618076Z Working directory is '/home/runner/_work/t3code/t3code' 2026-10-22T20:13:45.6618677Z [command]/usr/local/bin/git version 2026-10-22T20:13:45.6762571Z git version 2.55.0 2026-10-22T20:13:45.6783879Z ##[endgroup] 2026-10-22T20:13:45.6799146Z Temporarily overriding HOME='/home/runner/_work/_temp/47c3c54c-5e58-4d85-b64a-4990d3ed5440' before making global git config changes 2026-10-22T20:13:45.6800038Z Adding repository directory to the temporary git global config as a safe directory 2026-10-22T20:13:45.6804567Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-22T20:13:45.6871861Z Deleting the contents of '/home/runner/_work/t3code/t3code' 2026-10-22T20:13:45.6875203Z ##[group]Determining repository object format 2026-10-22T20:13:45.6877047Z ##[endgroup] 2026-10-22T20:13:45.6877687Z ##[group]Initializing the repository 2026-10-22T20:13:45.6882509Z [command]/usr/local/bin/git init /home/runner/_work/t3code/t3code 2026-10-22T20:13:45.6951785Z hint: Using 'master' as the name for the initial branch. This default branch name 2026-10-22T20:13:45.6952654Z hint: will change to "main" in Git 3.0. To configure the initial branch name 2026-10-22T20:13:45.6953435Z hint: to use in all of your new repositories, which will suppress this warning, 2026-10-22T20:13:45.6954022Z hint: call: 2026-10-22T20:13:45.6954331Z hint: 2026-10-22T20:13:45.6954763Z hint: git config --global init.defaultBranch 2026-10-22T20:13:45.6955207Z hint: 2026-10-22T20:13:45.6955636Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and 2026-10-22T20:13:45.6956332Z hint: 'development'. The just-created branch can be renamed via this command: 2026-10-22T20:13:45.6956894Z hint: 2026-10-22T20:13:45.6957281Z hint: git branch -m 2026-10-22T20:13:45.6957649Z hint: 2026-10-22T20:13:45.6958135Z hint: Disable this message with "git config set advice.defaultBranchName false" 2026-10-22T20:13:45.6958945Z Initialized empty Git repository in /home/runner/_work/t3code/t3code/.git/ 2026-10-22T20:13:45.6962006Z [command]/usr/local/bin/git remote add origin https://github.com/pingdotgg/t3code 2026-10-22T20:13:45.7004403Z ##[endgroup] 2026-10-22T20:13:45.7005049Z ##[group]Disabling automatic garbage collection 2026-10-22T20:13:45.7010372Z [command]/usr/local/bin/git config --local gc.auto 0 2026-10-22T20:13:45.7053146Z ##[endgroup] 2026-10-22T20:13:45.7053729Z ##[group]Setting up auth 2026-10-22T20:13:45.7054362Z Removing SSH command configuration 2026-10-22T20:13:45.7062674Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-22T20:13:45.7123422Z [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-22T20:13:45.7413876Z Removing HTTP extra header 2026-10-22T20:13:45.7421078Z [command]/usr/local/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader 2026-10-22T20:13:45.7468485Z [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-22T20:13:45.7618125Z Removing includeIf entries pointing to credentials config files 2026-10-22T20:13:45.7641472Z [command]/usr/local/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: 2026-10-22T20:13:45.7708924Z [command]/usr/local/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url 2026-10-22T20:13:45.7979361Z [command]/usr/local/bin/git config --file /home/runner/_work/_temp/git-credentials-db4232e7-a6d7-486f-8be4-9c75a6a6e9f4.config http.https://github.com/.extraheader AUTHORIZATION: basic *** 2026-10-22T20:13:45.8080275Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git.path /home/runner/_work/_temp/git-credentials-db4232e7-a6d7-486f-8be4-9c75a6a6e9f4.config 2026-10-22T20:13:45.8154165Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git/worktrees/*.path /home/runner/_work/_temp/git-credentials-db4232e7-a6d7-486f-8be4-9c75a6a6e9f4.config 2026-10-22T20:13:45.8203174Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-db4232e7-a6d7-486f-8be4-9c75a6a6e9f4.config 2026-10-22T20:13:45.8258722Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-db4232e7-a6d7-486f-8be4-9c75a6a6e9f4.config 2026-10-22T20:13:45.8301024Z ##[endgroup] 2026-10-22T20:13:45.8301704Z ##[group]Fetching the repository 2026-10-22T20:13:45.8314367Z [command]/usr/local/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --filter=blob:none --depth=1 origin +2522a27092d203b5414685d1820d8e8fcffab645:refs/remotes/pull/23364/merge 2026-10-22T20:13:46.2070517Z From https://github.com/pingdotgg/t3code 2026-10-22T20:13:46.2071890Z * [new ref] 2522a27092d203b5414685d1820d8e8fcffab645 -> pull/23364/merge 2026-10-22T20:13:46.2141543Z ##[endgroup] 2026-10-22T20:13:46.2143015Z ##[group]Determining the checkout info 2026-10-22T20:13:46.2144279Z ##[endgroup] 2026-10-22T20:13:46.2145295Z ##[group]Setting up sparse checkout 2026-10-22T20:13:46.2154331Z [command]/usr/local/bin/git config core.sparseCheckout true 2026-10-22T20:13:46.2227920Z [command]/usr/local/bin/git rev-parse --git-path info/sparse-checkout 2026-10-22T20:13:46.2280286Z .git/info/sparse-checkout 2026-10-22T20:13:46.2288723Z ##[endgroup] 2026-10-22T20:13:46.2290190Z ##[group]Checking out the ref 2026-10-22T20:13:46.2295619Z [command]/usr/local/bin/git checkout --progress --force refs/remotes/pull/23364/merge 2026-10-22T20:13:53.9889977Z Updating files: 0% (1/6306) 2026-10-22T20:13:53.9927600Z Updating files: 1% (64/6306) 2026-10-22T20:13:53.9950691Z Updating files: 2% (127/6306) 2026-10-22T20:13:53.9980329Z Updating files: 3% (190/6306) 2026-10-22T20:13:54.0004122Z Updating files: 4% (253/6306) 2026-10-22T20:13:54.0036529Z Updating files: 5% (316/6306) 2026-10-22T20:13:54.0060680Z Updating files: 6% (379/6306) 2026-10-22T20:13:54.0122345Z Updating files: 7% (442/6306) 2026-10-22T20:13:54.0155748Z Updating files: 8% (505/6306) 2026-10-22T20:13:54.0184174Z Updating files: 9% (568/6306) 2026-10-22T20:13:54.0476338Z Updating files: 10% (631/6306) 2026-10-22T20:13:54.0493481Z Updating files: 11% (694/6306) 2026-10-22T20:13:54.0506658Z Updating files: 12% (757/6306) 2026-10-22T20:13:54.0522644Z Updating files: 13% (820/6306) 2026-10-22T20:13:54.0541260Z Updating files: 14% (883/6306) 2026-10-22T20:13:54.0560367Z Updating files: 15% (946/6306) 2026-10-22T20:13:54.0580719Z Updating files: 16% (1009/6306) 2026-10-22T20:13:54.0596309Z Updating files: 17% (1073/6306) 2026-10-22T20:13:54.0615553Z Updating files: 18% (1136/6306) 2026-10-22T20:13:54.0632089Z Updating files: 19% (1199/6306) 2026-10-22T20:13:54.0657700Z Updating files: 20% (1262/6306) 2026-10-22T20:13:54.0676787Z Updating files: 21% (1325/6306) 2026-10-22T20:13:54.0697181Z Updating files: 22% (1388/6306) 2026-10-22T20:13:54.0712318Z Updating files: 23% (1451/6306) 2026-10-22T20:13:54.0725828Z Updating files: 24% (1514/6306) 2026-10-22T20:13:54.0742148Z Updating files: 25% (1577/6306) 2026-10-22T20:13:54.0756679Z Updating files: 26% (1640/6306) 2026-10-22T20:13:54.0771656Z Updating files: 27% (1703/6306) 2026-10-22T20:13:54.0796283Z Updating files: 28% (1766/6306) 2026-10-22T20:13:54.0832327Z Updating files: 29% (1829/6306) 2026-10-22T20:13:54.0852764Z Updating files: 30% (1892/6306) 2026-10-22T20:13:54.0886937Z Updating files: 31% (1955/6306) 2026-10-22T20:13:54.0923999Z Updating files: 32% (2018/6306) 2026-10-22T20:13:54.0957777Z Updating files: 33% (2081/6306) 2026-10-22T20:13:54.1039774Z Updating files: 34% (2145/6306) 2026-10-22T20:13:54.1102264Z Updating files: 35% (2208/6306) 2026-10-22T20:13:54.1141284Z Updating files: 36% (2271/6306) 2026-10-22T20:13:54.1188338Z Updating files: 37% (2334/6306) 2026-10-22T20:13:54.1241211Z Updating files: 38% (2397/6306) 2026-10-22T20:13:54.1272812Z Updating files: 39% (2460/6306) 2026-10-22T20:13:54.1316204Z Updating files: 40% (2523/6306) 2026-10-22T20:13:54.1359488Z Updating files: 41% (2586/6306) 2026-10-22T20:13:54.1381633Z Updating files: 42% (2649/6306) 2026-10-22T20:13:54.1396475Z Updating files: 43% (2712/6306) 2026-10-22T20:13:54.1422173Z Updating files: 44% (2775/6306) 2026-10-22T20:13:54.1462580Z Updating files: 45% (2838/6306) 2026-10-22T20:13:54.1499598Z Updating files: 46% (2901/6306) 2026-10-22T20:13:54.1533259Z Updating files: 47% (2964/6306) 2026-10-22T20:13:54.1573615Z Updating files: 48% (3027/6306) 2026-10-22T20:13:54.1615416Z Updating files: 49% (3090/6306) 2026-10-22T20:13:54.1667555Z Updating files: 50% (3153/6306) 2026-10-22T20:13:54.1687818Z Updating files: 51% (3217/6306) 2026-10-22T20:13:54.1736397Z Updating files: 52% (3280/6306) 2026-10-22T20:13:54.1770475Z Updating files: 53% (3343/6306) 2026-10-22T20:13:54.1796389Z Updating files: 54% (3406/6306) 2026-10-22T20:13:54.1828451Z Updating files: 55% (3469/6306) 2026-10-22T20:13:54.1852538Z Updating files: 56% (3532/6306) 2026-10-22T20:13:54.1872174Z Updating files: 57% (3595/6306) 2026-10-22T20:13:54.1895065Z Updating files: 58% (3658/6306) 2026-10-22T20:13:54.2293206Z Updating files: 59% (3721/6306) 2026-10-22T20:13:54.2308145Z Updating files: 60% (3784/6306) 2026-10-22T20:13:54.2326929Z Updating files: 61% (3847/6306) 2026-10-22T20:13:54.2347731Z Updating files: 62% (3910/6306) 2026-10-22T20:13:54.2375828Z Updating files: 63% (3973/6306) 2026-10-22T20:13:54.2406028Z Updating files: 64% (4036/6306) 2026-10-22T20:13:54.2429068Z Updating files: 65% (4099/6306) 2026-10-22T20:13:54.2448335Z Updating files: 66% (4162/6306) 2026-10-22T20:13:54.2477329Z Updating files: 67% (4226/6306) 2026-10-22T20:13:54.2492309Z Updating files: 68% (4289/6306) 2026-10-22T20:13:54.2513893Z Updating files: 69% (4352/6306) 2026-10-22T20:13:54.2527105Z Updating files: 70% (4415/6306) 2026-10-22T20:13:54.2546767Z Updating files: 71% (4478/6306) 2026-10-22T20:13:54.2564642Z Updating files: 72% (4541/6306) 2026-10-22T20:13:54.2596093Z Updating files: 73% (4604/6306) 2026-10-22T20:13:54.2718782Z Updating files: 74% (4667/6306) 2026-10-22T20:13:54.2911483Z Updating files: 74% (4717/6306) 2026-10-22T20:13:54.3071618Z Updating files: 75% (4730/6306) 2026-10-22T20:13:54.3092740Z Updating files: 76% (4793/6306) 2026-10-22T20:13:54.3115777Z Updating files: 77% (4856/6306) 2026-10-22T20:13:54.3143490Z Updating files: 78% (4919/6306) 2026-10-22T20:13:54.3163646Z Updating files: 79% (4982/6306) 2026-10-22T20:13:54.3186354Z Updating files: 80% (5045/6306) 2026-10-22T20:13:54.3204054Z Updating files: 81% (5108/6306) 2026-10-22T20:13:54.3224591Z Updating files: 82% (5171/6306) 2026-10-22T20:13:54.3244581Z Updating files: 83% (5234/6306) 2026-10-22T20:13:54.3268668Z Updating files: 84% (5298/6306) 2026-10-22T20:13:54.3287860Z Updating files: 85% (5361/6306) 2026-10-22T20:13:54.3314569Z Updating files: 86% (5424/6306) 2026-10-22T20:13:54.3388565Z Updating files: 87% (5487/6306) 2026-10-22T20:13:54.3419769Z Updating files: 88% (5550/6306) 2026-10-22T20:13:54.3440716Z Updating files: 89% (5613/6306) 2026-10-22T20:13:54.3465361Z Updating files: 90% (5676/6306) 2026-10-22T20:13:54.3499721Z Updating files: 91% (5739/6306) 2026-10-22T20:13:54.3515262Z Updating files: 92% (5802/6306) 2026-10-22T20:13:54.3531746Z Updating files: 93% (5865/6306) 2026-10-22T20:13:54.3554624Z Updating files: 94% (5928/6306) 2026-10-22T20:13:54.3579213Z Updating files: 95% (5991/6306) 2026-10-22T20:13:54.3636106Z Updating files: 96% (6054/6306) 2026-10-22T20:13:54.3664810Z Updating files: 97% (6117/6306) 2026-10-22T20:13:54.3713459Z Updating files: 98% (6180/6306) 2026-10-22T20:13:54.3733682Z Updating files: 99% (6243/6306) 2026-10-22T20:13:54.3734313Z Updating files: 100% (6306/6306) 2026-10-22T20:13:54.3734572Z Updating files: 100% (6306/6306), done. 2026-10-22T20:13:54.3899234Z Note: switching to 'refs/remotes/pull/23364/merge'. 2026-10-22T20:13:54.3899516Z 2026-10-22T20:13:54.3899677Z You are in 'detached HEAD' state. You can look around, make experimental 2026-10-22T20:13:54.3900063Z changes and commit them, and you can discard any commits you make in this 2026-10-22T20:13:54.3900524Z state without impacting any branches by switching back to a branch. 2026-10-22T20:13:54.3900737Z 2026-10-22T20:13:54.3900888Z If you want to create a new branch to retain commits you create, you may 2026-10-22T20:13:54.3901254Z do so (now or later) by using -c with the switch command. Example: 2026-10-22T20:13:54.3901445Z 2026-10-22T20:13:54.3901540Z git switch -c 2026-10-22T20:13:54.3901685Z 2026-10-22T20:13:54.3901775Z Or undo this operation with: 2026-10-22T20:13:54.3901905Z 2026-10-22T20:13:54.3902055Z git switch - 2026-10-22T20:13:54.3902170Z 2026-10-22T20:13:54.3902332Z Turn off this advice by setting config variable advice.detachedHead to false 2026-10-22T20:13:54.3902577Z 2026-10-22T20:13:54.3902832Z HEAD is now at 2522a27 Merge 23ea5b2b743d022a61998c5814825907bc9df4f3 into 22840ab943b8418744b48223411e46ba4fdcef1a 2026-10-22T20:13:54.3913071Z ##[endgroup] 2026-10-22T20:13:54.3963704Z [command]/usr/local/bin/git log -1 --format=%H 2026-10-22T20:13:54.3990640Z 2522a27092d203b5414685d1820d8e8fcffab645 2026-10-22T20:13:54.4153470Z ##[group]Run files="$(git ls-files .github/pr-assets)" 2026-10-22T20:13:54.4153851Z files="$(git ls-files .github/pr-assets)" 2026-10-22T20:13:54.4154091Z if test -n "$files"; then 2026-10-22T20:13:54.4154348Z  printf 'PR evidence must be uploaded to GitHub, not committed:\n%s\n' "$files" >&2 2026-10-22T20:13:54.4154583Z  exit 1 2026-10-22T20:13:54.4154714Z fi 2026-10-22T20:13:54.4177445Z shell: /usr/bin/bash -e {0} 2026-10-22T20:13:54.4177669Z env: 2026-10-22T20:13:54.4177842Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 1181 2026-10-22T20:13:54.4178009Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 572 2026-10-22T20:13:54.4178172Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T20:13:54.4178322Z ##[endgroup] 2026-10-22T20:13:54.4451216Z Prepare all required actions 2026-10-22T20:13:54.4451778Z Getting action download info 2026-10-22T20:13:54.5612965Z Download action repository 'voidzero-dev/setup-vp@v1' (SHA:250f29ce396baf5e8f24498e17c0dfdebabc26eb) 2026-10-22T20:13:54.6664945Z ##[group]Run ./.github/actions/setup-ci-deps 2026-10-22T20:13:54.6665187Z env: 2026-10-22T20:13:54.6665354Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 1181 2026-10-22T20:13:54.6665544Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 572 2026-10-22T20:13:54.6665723Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T20:13:54.6665877Z ##[endgroup] 2026-10-22T20:13:54.6783584Z ##[start-action display=Resolve Vite+ version;id=__self.vp] 2026-10-22T20:13:54.6808341Z ##[group]Run echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-22T20:13:54.6809067Z echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-22T20:13:54.6809395Z echo "node=$(jq -r '.engines.node' package.json)" >> "$GITHUB_OUTPUT" 2026-10-22T20:13:54.6809637Z echo "pnpm=$(jq -r '.packageManager' package.json)" >> "$GITHUB_OUTPUT" 2026-10-22T20:13:54.6830240Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-22T20:13:54.6830442Z env: 2026-10-22T20:13:54.6830569Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 1181 2026-10-22T20:13:54.6830735Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 572 2026-10-22T20:13:54.6830896Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T20:13:54.6831048Z ##[endgroup] 2026-10-22T20:13:54.6965050Z ##[end-action id=__self.vp;outcome=success;conclusion=success;duration_ms=18] 2026-10-22T20:13:54.6969521Z ##[start-action display=Cache Vite+;id=__self.vp_cache] 2026-10-22T20:13:54.7059493Z ##[group]Run actions/cache@v6 2026-10-22T20:13:54.7059716Z with: 2026-10-22T20:13:54.7059886Z path: ~/.vite-plus 2026-10-22T20:13:54.7060130Z key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-22T20:13:54.7060600Z enableCrossOsArchive: false 2026-10-22T20:13:54.7060803Z fail-on-cache-miss: false 2026-10-22T20:13:54.7061006Z lookup-only: false 2026-10-22T20:13:54.7061189Z save-always: false 2026-10-22T20:13:54.7061401Z env: 2026-10-22T20:13:54.7061577Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 1181 2026-10-22T20:13:54.7061813Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 572 2026-10-22T20:13:54.7062037Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T20:13:54.7062245Z ##[endgroup] 2026-10-22T20:13:55.0382218Z Cache hit for: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-22T20:13:55.5800140Z Received 170349591 of 170349591 (100.0%), 314.2 MBs/sec 2026-10-22T20:13:55.5802425Z Cache Size: ~162 MB (170349591 B) 2026-10-22T20:13:55.5842847Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/a2eb9a36-2502-4a11-9ac8-e9b669c6b854/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-22T20:13:56.5892875Z Cache restored successfully 2026-10-22T20:13:56.6517808Z Cache restored from key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-22T20:13:56.6683713Z ##[end-action id=__self.vp_cache;outcome=success;conclusion=success;duration_ms=1971] 2026-10-22T20:13:56.6688773Z ##[start-action display=Use cached Vite+;id=__self.__run] 2026-10-22T20:13:56.6737214Z ##[group]Run echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-22T20:13:56.6737483Z echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-22T20:13:56.6737765Z "$HOME/.vite-plus/bin/vp" env use "26.12.1" 2026-10-22T20:13:56.6766496Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-22T20:13:56.6766683Z env: 2026-10-22T20:13:56.6766830Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 1181 2026-10-22T20:13:56.6767005Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 572 2026-10-22T20:13:56.6767199Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T20:13:56.6767358Z ##[endgroup] 2026-10-22T20:13:56.6848913Z Using Node.js v26.12.1 (resolved from 26.12.1) 2026-10-22T20:13:56.6869991Z ##[end-action id=__self.__run;outcome=success;conclusion=success;duration_ms=17] 2026-10-22T20:13:56.6874032Z ##[start-action display=Setup Vite+;id=__self.__voidzero-dev_setup-vp] 2026-10-22T20:13:56.6912326Z ##[end-action id=__self.__voidzero-dev_setup-vp;outcome=skipped;conclusion=skipped;duration_ms=0] 2026-10-22T20:13:56.6914957Z ##[start-action display=Resolve pnpm store path;id=__self.pnpm_store] 2026-10-22T20:13:56.6938523Z ##[group]Run store_path="$(vp pm cache dir)" 2026-10-22T20:13:56.6938881Z store_path="$(vp pm cache dir)" 2026-10-22T20:13:56.6939082Z echo "path=$store_path" >> "$GITHUB_OUTPUT" 2026-10-22T20:13:56.6972832Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-22T20:13:56.6973128Z env: 2026-10-22T20:13:56.6973303Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 1181 2026-10-22T20:13:56.6974011Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 572 2026-10-22T20:13:56.6974224Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T20:13:56.6974386Z ##[endgroup] 2026-10-22T20:13:56.7289723Z ##[end-action id=__self.pnpm_store;outcome=success;conclusion=success;duration_ms=37] 2026-10-22T20:13:56.7293397Z ##[start-action display=Cache full pnpm store;id=__self.__actions_cache] 2026-10-22T20:13:56.8462603Z ##[group]Run actions/cache@v6 2026-10-22T20:13:56.8462839Z with: 2026-10-22T20:13:56.8463051Z path: /home/runner/.local/share/pnpm/store/v11 2026-10-22T20:13:56.8463524Z key: pnpm-full-v1-Linux-X64-26aca9b234a64276fce695cfd449de6b85aa0230cc5c8763604ee919eee10c91 2026-10-22T20:13:56.8463938Z restore-keys: pnpm-full-v1-Linux-X64- 2026-10-22T20:13:56.8464183Z enableCrossOsArchive: false 2026-10-22T20:13:56.8464406Z fail-on-cache-miss: false 2026-10-22T20:13:56.8464607Z lookup-only: false 2026-10-22T20:13:56.8464792Z save-always: false 2026-10-22T20:13:56.8465011Z env: 2026-10-22T20:13:56.8465190Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 1181 2026-10-22T20:13:56.8465448Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 572 2026-10-22T20:13:56.8465681Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T20:13:56.8465906Z ##[endgroup] 2026-10-22T20:13:57.0840307Z Cache hit for: pnpm-full-v1-Linux-X64-26aca9b234a64276fce695cfd449de6b85aa0230cc5c8763604ee919eee10c91 2026-10-22T20:13:58.2269311Z Received 402653184 of 994976796 (40.5%), 345.6 MBs/sec 2026-10-22T20:13:59.3322243Z Received 805306368 of 994976796 (80.9%), 346.6 MBs/sec 2026-10-22T20:13:59.8698334Z Received 994976796 of 994976796 (100.0%), 344.7 MBs/sec 2026-10-22T20:13:59.8700573Z Cache Size: ~949 MB (994976796 B) 2026-10-22T20:13:59.8829615Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/b3acf2d1-5e9f-4043-8f3f-d73c046746cd/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-22T20:14:07.8953005Z Cache restored successfully 2026-10-22T20:14:07.9661552Z Cache restored from key: pnpm-full-v1-Linux-X64-26aca9b234a64276fce695cfd449de6b85aa0230cc5c8763604ee919eee10c91 2026-10-22T20:14:07.9813522Z ##[end-action id=__self.__actions_cache;outcome=success;conclusion=success;duration_ms=11251] 2026-10-22T20:14:07.9817426Z ##[start-action display=Install dependencies;id=__self.__run_2] 2026-10-22T20:14:07.9843721Z ##[group]Run vp install 2026-10-22T20:14:07.9843918Z vp install 2026-10-22T20:14:07.9872234Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-22T20:14:07.9872436Z env: 2026-10-22T20:14:07.9872578Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 1181 2026-10-22T20:14:07.9872739Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 572 2026-10-22T20:14:07.9872893Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T20:14:07.9873055Z ##[endgroup] 2026-10-22T20:14:08.0432114Z Scope: all 33 workspace projects 2026-10-22T20:14:08.2455072Z ? Verifying lockfile against supply-chain policies (2088 entries)... 2026-10-22T20:14:08.7221029Z Packages are hard linked from the content-addressable store to the virtual store. 2026-10-22T20:14:08.7221982Z Content-addressable store is at: /home/runner/.local/share/pnpm/store/v11 2026-10-22T20:14:08.7223382Z Virtual store is at: node_modules/.pnpm 2026-10-22T20:14:09.8570791Z Progress: resolved 1712, reused 1712, downloaded 0, added 1712 2026-10-22T20:14:12.4382449Z ✓ Lockfile passes supply-chain policies (2088 entries in 4.2s) 2026-10-22T20:14:12.4383092Z Lockfile is up to date, resolution step is skipped 2026-10-22T20:14:12.4859660Z Packages: +1721 2026-10-22T20:14:12.4860389Z ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2026-10-22T20:14:12.5766621Z Progress: resolved 1721, reused 1718, downloaded 0, added 1721, done 2026-10-22T20:14:14.1550406Z . prepare$ vp config --no-agent 2026-10-22T20:14:14.3519835Z . prepare: Done 2026-10-22T20:14:14.3551293Z 2026-10-22T20:14:14.3552578Z devDependencies: 2026-10-22T20:14:14.3553053Z + @coderabbitai/config 1.1.0 2026-10-22T20:14:14.3553416Z + @shadcn/lint 0.1.5 2026-10-22T20:14:14.3553724Z + @types/node 24.12.4 2026-10-22T20:14:14.3553946Z + knip 6.34.0 2026-10-22T20:14:14.3554233Z + typescript <- @tsc-rs/typescript 0.8.0 2026-10-22T20:14:14.3554518Z + vite-plus 1.3.0 2026-10-22T20:14:14.3554648Z 2026-10-22T20:14:14.3584681Z Done in 6.3s using pnpm v12.14.0 2026-10-22T20:14:14.3968549Z ##[end-action id=__self.__run_2;outcome=success;conclusion=success;duration_ms=6415] 2026-10-22T20:14:14.5011337Z ##[group]Run actions/cache@v6 2026-10-22T20:14:14.5011671Z with: 2026-10-22T20:14:14.5011973Z path: ~/.cache/electron 2026-10-22T20:14:14.5012397Z key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-22T20:14:14.5012881Z enableCrossOsArchive: false 2026-10-22T20:14:14.5013137Z fail-on-cache-miss: false 2026-10-22T20:14:14.5013416Z lookup-only: false 2026-10-22T20:14:14.5013673Z save-always: false 2026-10-22T20:14:14.5013893Z env: 2026-10-22T20:14:14.5014177Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 1181 2026-10-22T20:14:14.5014460Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 572 2026-10-22T20:14:14.5014770Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T20:14:14.5015043Z ##[endgroup] 2026-10-22T20:14:14.7799687Z Cache hit for: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-22T20:14:15.0850498Z Received 122906203 of 122906203 (100.0%), 424.7 MBs/sec 2026-10-22T20:14:15.0851050Z Cache Size: ~117 MB (122906203 B) 2026-10-22T20:14:15.0901929Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/34454a45-0b84-4ad5-820f-691838f2a2fa/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-22T20:14:15.2134627Z Cache restored successfully 2026-10-22T20:14:15.2394803Z Cache restored from key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-22T20:14:15.2590795Z ##[group]Run vp run --filter @t3tools/desktop ensure:electron 2026-10-22T20:14:15.2591309Z vp run --filter @t3tools/desktop ensure:electron 2026-10-22T20:14:15.2628857Z shell: /usr/bin/bash -e {0} 2026-10-22T20:14:15.2629200Z env: 2026-10-22T20:14:15.2629441Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 1181 2026-10-22T20:14:15.2629770Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 572 2026-10-22T20:14:15.2630070Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T20:14:15.2630384Z ##[endgroup] 2026-10-22T20:14:15.5788357Z ~/apps/desktop$ node scripts/ensure-electron-runtime.mjs ⊘ cache disabled 2026-10-22T20:14:16.4559154Z /home/runner/_work/t3code/t3code/node_modules/.pnpm/electron@44.9.3_supports-color@8.1.1/node_modules/electron/dist/electron 2026-10-22T20:14:16.4630736Z 2026-10-22T20:14:16.5074999Z ##[group]Run vp run knip:check 2026-10-22T20:14:16.5075647Z vp run knip:check 2026-10-22T20:14:16.5139402Z shell: /usr/bin/bash -e {0} 2026-10-22T20:14:16.5139746Z env: 2026-10-22T20:14:16.5139992Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 1181 2026-10-22T20:14:16.5140368Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 572 2026-10-22T20:14:16.5140575Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T20:14:16.5140760Z ##[endgroup] 2026-10-22T20:14:17.0203023Z $ knip --include files,dependencies --no-config-hints ⊘ cache disabled 2026-10-22T20:14:29.1710974Z 2026-10-22T20:14:29.1720935Z $ 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-22T20:15:20.1690700Z 2026-10-22T20:15:20.1693622Z --- 2026-10-22T20:15:20.1694217Z vp run: 2/2 successful. (Run `vp run --last-details` for full details) 2026-10-22T20:15:20.1877840Z ##[group]Run vp run --filter @t3tools/source-control-github generate --check 2026-10-22T20:15:20.1878507Z vp run --filter @t3tools/source-control-github generate --check 2026-10-22T20:15:20.1915741Z shell: /usr/bin/bash -e {0} 2026-10-22T20:15:20.1916156Z env: 2026-10-22T20:15:20.1916409Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 1181 2026-10-22T20:15:20.1916784Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 572 2026-10-22T20:15:20.1917127Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T20:15:20.1917476Z ##[endgroup] 2026-10-22T20:15:20.4374797Z ~/packages/source-control-github$ graphqlgen --check ⊘ cache disabled 2026-10-22T20:15:20.6983946Z 2026-10-22T20:15:20.7082719Z ##[group]Run vp run --filter t3 generate --check 2026-10-22T20:15:20.7083188Z vp run --filter t3 generate --check 2026-10-22T20:15:20.7106234Z shell: /usr/bin/bash -e {0} 2026-10-22T20:15:20.7106518Z env: 2026-10-22T20:15:20.7106745Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 1181 2026-10-22T20:15:20.7107048Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 572 2026-10-22T20:15:20.7107308Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T20:15:20.7107551Z ##[endgroup] 2026-10-22T20:15:20.9162047Z ~/apps/server$ graphqlgen --check ⊘ cache disabled 2026-10-22T20:15:21.1226955Z 2026-10-22T20:15:21.1349807Z ##[group]Run vp check 2026-10-22T20:15:21.1349974Z vp check 2026-10-22T20:15:21.1369543Z shell: /usr/bin/bash -e {0} 2026-10-22T20:15:21.1369715Z env: 2026-10-22T20:15:21.1369832Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 1181 2026-10-22T20:15:21.1369984Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 572 2026-10-22T20:15:21.1370151Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-22T20:15:21.1370285Z ##[endgroup] 2026-10-22T20:15:21.8809001Z pass: All 5662 files are correctly formatted (541ms, 8 threads) 2026-10-22T20:15:30.5491086Z warn: Lint warnings found 2026-10-22T20:15:30.5493127Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.5494150Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:215:7] 2026-10-22T20:15:30.5494678Z 211 │ }; 2026-10-22T20:15:30.5495055Z 212 │ useEffect(() => { 2026-10-22T20:15:30.5495552Z ·  ────┬──── 2026-10-22T20:15:30.5496126Z · ╰── This is the containing effect 2026-10-22T20:15:30.5496975Z 213 │ const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null; 2026-10-22T20:15:30.5497606Z 214 │ if (inserted) { 2026-10-22T20:15:30.5498022Z 215 │ setSelection((current) => 2026-10-22T20:15:30.5498500Z ·  ──────┬───── 2026-10-22T20:15:30.5499121Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.5499861Z 216 │ current.start === inserted.start && current.end === inserted.end ? current : inserted, 2026-10-22T20:15:30.5500490Z ╰──── 2026-10-22T20:15:30.5501758Z  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-22T20:15:30.5503403Z  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-22T20:15:30.5503990Z 2026-10-22T20:15:30.5504501Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.5505353Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:296:7] 2026-10-22T20:15:30.5505841Z 284 │ }, [hasWorkspaceSnapshot]); 2026-10-22T20:15:30.5506257Z 285 │ useEffect(() => { 2026-10-22T20:15:30.5506600Z ·  ────┬──── 2026-10-22T20:15:30.5507066Z · ╰── This is the containing effect 2026-10-22T20:15:30.5507675Z 286 │ if (!environmentId || !projectCwd || !selectedProviderInstanceId) return; 2026-10-22T20:15:30.5508288Z 287 │ const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`; 2026-10-22T20:15:30.5508794Z 288 │ const now = Date.now(); 2026-10-22T20:15:30.5509219Z 289 │ const lastRequest = workspaceRefreshKeyRef.current; 2026-10-22T20:15:30.5509674Z 290 │ if ( 2026-10-22T20:15:30.5510039Z 291 │ lastRequest?.key === key && 2026-10-22T20:15:30.5510583Z 292 │ now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS 2026-10-22T20:15:30.5511013Z 293 │ ) 2026-10-22T20:15:30.5511347Z 294 │ return; 2026-10-22T20:15:30.5511975Z 295 │ if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) { 2026-10-22T20:15:30.5512574Z 296 │ setWorkspaceRefreshRetry(null); 2026-10-22T20:15:30.5513010Z ·  ────────────┬─────────── 2026-10-22T20:15:30.5513573Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.5514099Z 297 │ return; 2026-10-22T20:15:30.5514412Z ╰──── 2026-10-22T20:15:30.5516170Z  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-22T20:15:30.5517938Z  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-22T20:15:30.5518640Z 2026-10-22T20:15:30.5519087Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T20:15:30.5519898Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:326:5] 2026-10-22T20:15:30.5520379Z 325 │ }, [ 2026-10-22T20:15:30.5520743Z 326 │ draftMessage, 2026-10-22T20:15:30.5521108Z ·  ──────┬───── 2026-10-22T20:15:30.5521618Z · ╰── Unnecessary dependency `draftMessage` 2026-10-22T20:15:30.5522186Z 327 │ environmentId, 2026-10-22T20:15:30.5522527Z ╰──── 2026-10-22T20:15:30.5523262Z  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-22T20:15:30.5524363Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.5524910Z 2026-10-22T20:15:30.5525297Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-22T20:15:30.5525955Z ╭─[packages/client-runtime/src/state/shell.ts:189:5] 2026-10-22T20:15:30.5526455Z 186 │ let waiting = yield* Ref.get(awaitingCompletion); 2026-10-22T20:15:30.5526881Z 187 │ let next = initial; 2026-10-22T20:15:30.5527296Z ·  ──┬─ 2026-10-22T20:15:30.5527663Z · ╰── From this accumulator 2026-10-22T20:15:30.5528024Z 188 │ let receivedSnapshot = false; 2026-10-22T20:15:30.5528309Z 189 │ for (const item of items) { 2026-10-22T20:15:30.5528611Z ·  ─┬─ 2026-10-22T20:15:30.5528901Z · ╰── For this loop 2026-10-22T20:15:30.5529242Z 190 │ if (item.kind === "synchronized") { 2026-10-22T20:15:30.5529515Z 191 │ waiting = false; 2026-10-22T20:15:30.5529845Z 192 │ if (Option.isSome(next.snapshot)) { 2026-10-22T20:15:30.5530189Z 193 │ next = { ...next, status: "live", error: Option.none() }; 2026-10-22T20:15:30.5530509Z ·  ───┬─── 2026-10-22T20:15:30.5530909Z · ╰── From this spread 2026-10-22T20:15:30.5531205Z 194 │ } 2026-10-22T20:15:30.5531462Z ╰──── 2026-10-22T20:15:30.5531772Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-22T20:15:30.5532295Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-22T20:15:30.5532530Z 2026-10-22T20:15:30.5532840Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.5533372Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:60:5] 2026-10-22T20:15:30.5533680Z 57 │ 2026-10-22T20:15:30.5533949Z 58 │ useEffect(() => { 2026-10-22T20:15:30.5534189Z ·  ────┬──── 2026-10-22T20:15:30.5534544Z · ╰── This is the containing effect 2026-10-22T20:15:30.5535105Z 59 │ const controller = new AbortController(); 2026-10-22T20:15:30.5535496Z 60 │ setLoadState("pending"); 2026-10-22T20:15:30.5535752Z ·  ──────┬───── 2026-10-22T20:15:30.5536143Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.5536598Z 61 │ // A renewed signature is used on Retry, not as a reason to reset the native player. 2026-10-22T20:15:30.5536909Z ╰──── 2026-10-22T20:15:30.5537700Z  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-22T20:15:30.5538710Z  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-22T20:15:30.5539040Z 2026-10-22T20:15:30.5539263Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T20:15:30.5539614Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:71:7] 2026-10-22T20:15:30.5539925Z 70 │ return () => controller.abort(); 2026-10-22T20:15:30.5540773Z 71 │ }, [player, props.playRequested, attempt]); 2026-10-22T20:15:30.5541174Z ·  ───┬── ─────────┬───────── ───┬─── 2026-10-22T20:15:30.5541731Z · │ │ ╰── Unnecessary dependency `attempt` 2026-10-22T20:15:30.5542320Z · │ ╰── Unnecessary dependency `props.playRequested` 2026-10-22T20:15:30.5542787Z · ╰── Unnecessary dependency `player_0` 2026-10-22T20:15:30.5543075Z 72 │ 2026-10-22T20:15:30.5543274Z ╰──── 2026-10-22T20:15:30.5543752Z  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-22T20:15:30.5544488Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.5544825Z 2026-10-22T20:15:30.5545114Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-22T20:15:30.5545552Z ╭─[apps/mobile/src/Stack.tsx:1044:21] 2026-10-22T20:15:30.5545847Z 1043 │ } 2026-10-22T20:15:30.5546828Z ·  ───────────────────────────────────────────── 2026-10-22T20:15:30.5547217Z 1045 │ screenListeners={{ 2026-10-22T20:15:30.5547444Z ╰──── 2026-10-22T20:15:30.5547988Z  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-22T20:15:30.5548355Z 2026-10-22T20:15:30.5548601Z ⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`. 2026-10-22T20:15:30.5549021Z ╭─[apps/web/src/terminal/ghostty/core.ts:194:19] 2026-10-22T20:15:30.5549545Z 193 │ const count = Math.min(CHUNK_SIZE, graphemeLength - start); 2026-10-22T20:15:30.5549997Z 194 │ const codes = new Array(count); 2026-10-22T20:15:30.5550308Z ·  ──────────────────────── 2026-10-22T20:15:30.5550651Z 195 │ for (let index = 0; index < count; index += 1) { 2026-10-22T20:15:30.5550910Z ╰──── 2026-10-22T20:15:30.5551483Z  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-22T20:15:30.5552003Z 2026-10-22T20:15:30.5552266Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-22T20:15:30.5552689Z ╭─[apps/mobile/src/lib/useHoverGesture.ts:8:15] 2026-10-22T20:15:30.5552958Z 7 │ () => 2026-10-22T20:15:30.5553199Z 8 │ Gesture.Hover() 2026-10-22T20:15:30.5553492Z ·  ──┬── 2026-10-22T20:15:30.5553813Z · ╰── `Hover` may be a component 2026-10-22T20:15:30.5554145Z 9 │ .manualActivation(true) 2026-10-22T20:15:30.5554376Z ╰──── 2026-10-22T20:15:30.5554854Z  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-22T20:15:30.5555681Z  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-22T20:15:30.5556156Z 2026-10-22T20:15:30.5556499Z ⚠ eslint(no-unused-vars): Identifier 'Arr' is imported but never used. 2026-10-22T20:15:30.5633466Z ╭─[packages/client-runtime/src/state/threadSort.ts:4:13] 2026-10-22T20:15:30.5634496Z 3 │ import type { EnvironmentThreadShell } from "./models.ts"; 2026-10-22T20:15:30.5634753Z 4 │ import * as Arr from "effect/Array"; 2026-10-22T20:15:30.5634991Z ·  ─┬─ 2026-10-22T20:15:30.5635291Z · ╰── 'Arr' is imported here 2026-10-22T20:15:30.5635541Z 5 │ import * as Order from "effect/Order"; 2026-10-22T20:15:30.5635724Z ╰──── 2026-10-22T20:15:30.5635925Z  help: Consider removing this import. 2026-10-22T20:15:30.5636061Z 2026-10-22T20:15:30.5636290Z ⚠ eslint(no-unused-vars): Identifier 'Order' is imported but never used. 2026-10-22T20:15:30.5636674Z ╭─[packages/client-runtime/src/state/threadSort.ts:5:13] 2026-10-22T20:15:30.5637656Z 4 │ import * as Arr from "effect/Array"; 2026-10-22T20:15:30.5637885Z 5 │ import * as Order from "effect/Order"; 2026-10-22T20:15:30.5638100Z ·  ──┬── 2026-10-22T20:15:30.5638386Z · ╰── 'Order' is imported here 2026-10-22T20:15:30.5638604Z 6 │ 2026-10-22T20:15:30.5638745Z ╰──── 2026-10-22T20:15:30.5638914Z  help: Consider removing this import. 2026-10-22T20:15:30.5639050Z 2026-10-22T20:15:30.5639566Z ⚠ 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-22T20:15:30.5640236Z ╭─[packages/client-runtime/src/connection/supervisor.test.ts:135:3] 2026-10-22T20:15:30.5641173Z 134 │ let lastState = yield* SubscriptionRef.get(state); 2026-10-22T20:15:30.5641735Z 135 │ ╭─▶ for (let iteration = 0; iteration < 100; iteration += 1) { 2026-10-22T20:15:30.5642192Z 136 │ │ lastState = yield* SubscriptionRef.get(state); 2026-10-22T20:15:30.5642493Z 137 │ │ if (predicate(lastState)) { 2026-10-22T20:15:30.5642756Z 138 │ │ return lastState; 2026-10-22T20:15:30.5642989Z 139 │ │ } 2026-10-22T20:15:30.5643213Z 140 │ │ yield* Effect.yieldNow; 2026-10-22T20:15:30.5643504Z 141 │ ╰─▶ } 2026-10-22T20:15:30.5643737Z 142 │ return yield* Effect.die( 2026-10-22T20:15:30.5643917Z ╰──── 2026-10-22T20:15:30.5643994Z 2026-10-22T20:15:30.5644247Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-22T20:15:30.5644636Z ╭─[apps/web/src/lib/composerContextReferences.ts:90:40] 2026-10-22T20:15:30.5644875Z 89 │ let cursor = prompt.length; 2026-10-22T20:15:30.5645116Z 90 │ for (const occurrence of occurrences.reverse()) { 2026-10-22T20:15:30.5645379Z ·  ─────── 2026-10-22T20:15:30.5645608Z 91 │ let { start, end } = occurrence; 2026-10-22T20:15:30.5645791Z ╰──── 2026-10-22T20:15:30.5646173Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-22T20:15:30.5646438Z 2026-10-22T20:15:30.5646693Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-22T20:15:30.5647076Z ╭─[packages/shared/src/serverSettings.ts:346:9] 2026-10-22T20:15:30.5647344Z 345 │ const entry: ProjectSettingsOverrides = { 2026-10-22T20:15:30.5647638Z 346 │ ...(entries.get(projectId) ?? currentEntries[projectId] ?? {}), 2026-10-22T20:15:30.5648009Z ·  ────────────────────────────────────────────────────────────── 2026-10-22T20:15:30.5648291Z 347 │ }; 2026-10-22T20:15:30.5648440Z ╰──── 2026-10-22T20:15:30.5648802Z  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-22T20:15:30.5649075Z 2026-10-22T20:15:30.5649330Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in Array.prototype.reduce() 2026-10-22T20:15:30.5649705Z ╭─[packages/shared/src/serverSettings.ts:448:24] 2026-10-22T20:15:30.5650074Z 447 │ const favorites = 2026-10-22T20:15:30.5650373Z 448 │ setModelFavorites?.reduce((current, change) => { 2026-10-22T20:15:30.5650631Z ·  ───┬── 2026-10-22T20:15:30.5650897Z · ╰── For this reduce 2026-10-22T20:15:30.5651150Z 449 │ const exists = current.some( 2026-10-22T20:15:30.5651465Z 450 │ (favorite) => favorite.provider === change.provider && favorite.model === change.model, 2026-10-22T20:15:30.5651733Z 451 │ ); 2026-10-22T20:15:30.5651936Z 452 │ return change.favorite 2026-10-22T20:15:30.5652133Z 453 │ ? exists 2026-10-22T20:15:30.5652293Z 454 │ ? current 2026-10-22T20:15:30.5652534Z 455 │ : [...current, { provider: change.provider, model: change.model }] 2026-10-22T20:15:30.5652805Z ·  ─────┬──── 2026-10-22T20:15:30.5653107Z · ╰── From this spread 2026-10-22T20:15:30.5653359Z 456 │ : current.filter( 2026-10-22T20:15:30.5653523Z ╰──── 2026-10-22T20:15:30.5653834Z  help: Consider using `Object.assign()` or `Array.prototype.push()` to mutate the accumulator instead. 2026-10-22T20:15:30.5654247Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-22T20:15:30.5654439Z 2026-10-22T20:15:30.5654656Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-22T20:15:30.5654992Z ╭─[packages/shared/src/serverSettings.ts:466:3] 2026-10-22T20:15:30.5655218Z 464 │ null; 2026-10-22T20:15:30.5655432Z 465 │ let nextModelPreferences = initialModelPreferences; 2026-10-22T20:15:30.5655689Z ·  ──────────┬───────── 2026-10-22T20:15:30.5655955Z · ╰── From this accumulator 2026-10-22T20:15:30.5656219Z 466 │ for (const change of setModelsHidden ?? []) { 2026-10-22T20:15:30.5656426Z ·  ─┬─ 2026-10-22T20:15:30.5656641Z · ╰── For this loop 2026-10-22T20:15:30.5656932Z 467 │ const preferences = nextModelPreferences?.[change.provider] ?? { 2026-10-22T20:15:30.5657169Z 468 │ hiddenModels: [], 2026-10-22T20:15:30.5657350Z 469 │ modelOrder: [], 2026-10-22T20:15:30.5657513Z 470 │ }; 2026-10-22T20:15:30.5657819Z 471 │ const hiddenModels = preferences.hiddenModels.filter((model) => model !== change.model); 2026-10-22T20:15:30.5658136Z 472 │ if (change.hidden) hiddenModels.push(change.model); 2026-10-22T20:15:30.5658363Z 473 │ nextModelPreferences = { 2026-10-22T20:15:30.5658561Z 474 │ ...nextModelPreferences, 2026-10-22T20:15:30.5658784Z ·  ───────────┬─────────── 2026-10-22T20:15:30.5659041Z · ╰── From this spread 2026-10-22T20:15:30.5659325Z 475 │ [change.provider]: { ...preferences, hiddenModels }, 2026-10-22T20:15:30.5659545Z ╰──── 2026-10-22T20:15:30.5659787Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-22T20:15:30.5660144Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-22T20:15:30.5660445Z 2026-10-22T20:15:30.5660944Z ⚠ 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-22T20:15:30.5661677Z ╭─[packages/effect-acp/src/errors.test.ts:129:28] 2026-10-22T20:15:30.5662027Z 128 │ const secret = "acp-summary-secret"; 2026-10-22T20:15:30.5662291Z 129 │ const cause = yield* Schema.decodeUnknownEffect( 2026-10-22T20:15:30.5662584Z ·  ────────────────────────── 2026-10-22T20:15:30.5662802Z 130 │ Schema.Struct({ 2026-10-22T20:15:30.5662970Z ╰──── 2026-10-22T20:15:30.5663031Z 2026-10-22T20:15:30.5663441Z ⚠ 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-22T20:15:30.5663936Z ╭─[packages/effect-acp/src/client.ts:1269:11] 2026-10-22T20:15:30.5664242Z 1268 │ extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) => 2026-10-22T20:15:30.5664622Z 1269 │ Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe( 2026-10-22T20:15:30.5664938Z ·  ────────────────────────── 2026-10-22T20:15:30.5665228Z 1270 │ Effect.mapError(() => AcpError.AcpRequestError.invalidParams()), 2026-10-22T20:15:30.5665459Z ╰──── 2026-10-22T20:15:30.5665525Z 2026-10-22T20:15:30.5665759Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-22T20:15:30.5666128Z ╭─[packages/shared/src/composerContextLegacySend.ts:19:45] 2026-10-22T20:15:30.5666428Z 18 │ const occurrences = collectComposerContextReferences(text); 2026-10-22T20:15:30.5666696Z 19 │ for (const occurrence of [...occurrences].reverse()) { 2026-10-22T20:15:30.5667040Z ·  ─────── 2026-10-22T20:15:30.5667308Z 20 │ const record = recordsById.get(occurrence.contextId); 2026-10-22T20:15:30.5667517Z ╰──── 2026-10-22T20:15:30.5667875Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-22T20:15:30.5668142Z 2026-10-22T20:15:30.5668519Z ⚠ 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-22T20:15:30.5668977Z ╭─[packages/effect-acp/src/schema.test.ts:18:12] 2026-10-22T20:15:30.5669305Z 17 │ const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } }; 2026-10-22T20:15:30.5669620Z 18 │ expect(Schema.is(V1.AvailableCommand)(command)).toBe(true); 2026-10-22T20:15:30.5669874Z ·  ───────── 2026-10-22T20:15:30.5670061Z 19 │ expect( 2026-10-22T20:15:30.5670218Z ╰──── 2026-10-22T20:15:30.5670281Z 2026-10-22T20:15:30.5670632Z ⚠ 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-22T20:15:30.5671098Z ╭─[packages/effect-acp/src/schema.test.ts:20:7] 2026-10-22T20:15:30.5671304Z 19 │ expect( 2026-10-22T20:15:30.5671580Z 20 │ Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }), 2026-10-22T20:15:30.5671854Z ·  ───────── 2026-10-22T20:15:30.5672075Z 21 │ ).toBe(true); 2026-10-22T20:15:30.5672226Z ╰──── 2026-10-22T20:15:30.5672302Z 2026-10-22T20:15:30.5672924Z ⚠ 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-22T20:15:30.5673571Z ╭─[packages/effect-acp/src/protocol.test.ts:500:31] 2026-10-22T20:15:30.5673783Z 499 │ 2026-10-22T20:15:30.5673976Z 500 │ const response = yield* Schema.decodeUnknownEffect( 2026-10-22T20:15:30.5674282Z ·  ────────────────────────── 2026-10-22T20:15:30.5674546Z 501 │ Schema.fromJsonString(JsonRpcErrorResponse), 2026-10-22T20:15:30.5674744Z ╰──── 2026-10-22T20:15:30.5674813Z 2026-10-22T20:15:30.5675318Z ⚠ 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-22T20:15:30.5675928Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:169:7] 2026-10-22T20:15:30.5676164Z 168 │ }); 2026-10-22T20:15:30.5676475Z 169 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-22T20:15:30.5676901Z 170 │ │ if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break; 2026-10-22T20:15:30.5677224Z 171 │ │ yield* Effect.yieldNow; 2026-10-22T20:15:30.5677506Z 172 │ ╰─▶ } 2026-10-22T20:15:30.5677716Z 173 │ 2026-10-22T20:15:30.5677846Z ╰──── 2026-10-22T20:15:30.5677913Z 2026-10-22T20:15:30.5678405Z ⚠ 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-22T20:15:30.5679008Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:178:7] 2026-10-22T20:15:30.5679289Z 177 │ yield* Deferred.succeed(releaseSave, undefined); 2026-10-22T20:15:30.5679644Z 178 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-22T20:15:30.5679990Z 179 │ │ if ((yield* Ref.get(saved)).length > 0) break; 2026-10-22T20:15:30.5680262Z 180 │ │ yield* Effect.yieldNow; 2026-10-22T20:15:30.5680530Z 181 │ ╰─▶ } 2026-10-22T20:15:30.5680738Z 182 │ 2026-10-22T20:15:30.5680874Z ╰──── 2026-10-22T20:15:30.5680940Z 2026-10-22T20:15:30.5681429Z ⚠ 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-22T20:15:30.5682079Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7] 2026-10-22T20:15:30.5682396Z 306 │ yield* Deferred.succeed(releaseUnenrichedSave, undefined); 2026-10-22T20:15:30.5682767Z 307 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-22T20:15:30.5683109Z 308 │ │ const values = yield* Ref.get(saved); 2026-10-22T20:15:30.5683468Z 309 │ │ if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) { 2026-10-22T20:15:30.5683780Z 310 │ │ break; 2026-10-22T20:15:30.5684063Z 311 │ │ } 2026-10-22T20:15:30.5684357Z 312 │ │ yield* Effect.yieldNow; 2026-10-22T20:15:30.5684629Z 313 │ ╰─▶ } 2026-10-22T20:15:30.5684849Z 314 │ 2026-10-22T20:15:30.5684979Z ╰──── 2026-10-22T20:15:30.5685047Z 2026-10-22T20:15:30.5685275Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T20:15:30.5685621Z ╭─[apps/mobile/src/state/thread-order.ts:29:7] 2026-10-22T20:15:30.5685845Z 28 │ getPendingThreadOrder(); 2026-10-22T20:15:30.5686049Z 29 │ }, [nowMinute, snoozeWakeTick]); 2026-10-22T20:15:30.5686307Z ·  ────┬──── ───────┬────── 2026-10-22T20:15:30.5686683Z · │ ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-22T20:15:30.5687059Z · ╰── Unnecessary dependency `nowMinute` 2026-10-22T20:15:30.5687294Z 30 │ return pending; 2026-10-22T20:15:30.5687441Z ╰──── 2026-10-22T20:15:30.5687830Z  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-22T20:15:30.5688497Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.5688816Z 2026-10-22T20:15:30.5689098Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.5689515Z ╭─[apps/mobile/src/state/use-vcs-action-state.ts:86:5] 2026-10-22T20:15:30.5689797Z 83 │ const [nowMs, setNowMs] = useState(() => Date.now()); 2026-10-22T20:15:30.5690005Z 84 │ useEffect(() => { 2026-10-22T20:15:30.5690198Z ·  ────┬──── 2026-10-22T20:15:30.5690448Z · ╰── This is the containing effect 2026-10-22T20:15:30.5690718Z 85 │ if (!actionState.isRunning) return; 2026-10-22T20:15:30.5690918Z 86 │ setNowMs(Date.now()); 2026-10-22T20:15:30.5691109Z ·  ────┬─── 2026-10-22T20:15:30.5691409Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.5691736Z 87 │ const interval = setInterval(() => setNowMs(Date.now()), 1000); 2026-10-22T20:15:30.5691996Z ╰──── 2026-10-22T20:15:30.5692722Z  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-22T20:15:30.5693637Z  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-22T20:15:30.5693962Z 2026-10-22T20:15:30.5694249Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-22T20:15:30.5694668Z ╭─[packages/provider-opencode/src/server/adapter.ts:3755:7] 2026-10-22T20:15:30.5694907Z 3754 │ 2026-10-22T20:15:30.5695199Z 3755 │ const layer: Layer.Layer = 2026-10-22T20:15:30.5695586Z ·  ──┬── 2026-10-22T20:15:30.5695870Z · ╰── 'layer' is declared here 2026-10-22T20:15:30.5696087Z 3756 │ Layer.effect( 2026-10-22T20:15:30.5696241Z ╰──── 2026-10-22T20:15:30.5696420Z  help: Consider removing this declaration. 2026-10-22T20:15:30.5696555Z 2026-10-22T20:15:30.5696760Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-22T20:15:30.5697159Z ╭─[packages/provider-opencode/src/server/OpenCodeRuntime.environment.test.ts:53:14] 2026-10-22T20:15:30.5697437Z 52 │ 2026-10-22T20:15:30.5697573Z 53 │ for (const {} of [ 2026-10-22T20:15:30.5697757Z ·  ── 2026-10-22T20:15:30.5697940Z 54 │ { healthy: true }, 2026-10-22T20:15:30.5698102Z ╰──── 2026-10-22T20:15:30.5698417Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-22T20:15:30.5698662Z 2026-10-22T20:15:30.5698945Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-22T20:15:30.5699346Z ╭─[packages/provider-pi/src/server/adapter.ts:3389:7] 2026-10-22T20:15:30.5699561Z 3388 │ 2026-10-22T20:15:30.5699834Z 3389 │ const layer: Layer.Layer = 2026-10-22T20:15:30.5700120Z ·  ──┬── 2026-10-22T20:15:30.5700536Z · ╰── 'layer' is declared here 2026-10-22T20:15:30.5700761Z 3390 │ Layer.effect( 2026-10-22T20:15:30.5700965Z ╰──── 2026-10-22T20:15:30.5701144Z  help: Consider removing this declaration. 2026-10-22T20:15:30.5701281Z 2026-10-22T20:15:30.5701527Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-22T20:15:30.5701924Z ╭─[apps/mobile/src/lib/markdownDocument.ts:138:28] 2026-10-22T20:15:30.5702181Z 137 │ visit(parser.parse(markdown)); 2026-10-22T20:15:30.5702400Z 138 │ for (const edit of edits.reverse()) 2026-10-22T20:15:30.5702642Z ·  ─────── 2026-10-22T20:15:30.5702952Z 139 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-22T20:15:30.5703197Z ╰──── 2026-10-22T20:15:30.5703553Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-22T20:15:30.5703825Z 2026-10-22T20:15:30.5704203Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-22T20:15:30.5704618Z ╭─[apps/mobile/src/lib/markdownDocument.ts:169:28] 2026-10-22T20:15:30.5704865Z 168 │ visit(parser.parse(markdown)); 2026-10-22T20:15:30.5705062Z 169 │ for (const edit of edits.reverse()) 2026-10-22T20:15:30.5705278Z ·  ─────── 2026-10-22T20:15:30.5705587Z 170 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-22T20:15:30.5705823Z ╰──── 2026-10-22T20:15:30.5706165Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-22T20:15:30.5706424Z 2026-10-22T20:15:30.5706649Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-22T20:15:30.5707009Z ╭─[apps/mobile/src/lib/markdownDocument.ts:223:38] 2026-10-22T20:15:30.5707239Z 222 │ visit(parser.parse(markdown)); 2026-10-22T20:15:30.5707462Z 223 │ for (const lineStart of lineStarts.reverse()) { 2026-10-22T20:15:30.5707716Z ·  ─────── 2026-10-22T20:15:30.5708029Z 224 │ // The header row may be a lazy line without its container markers (`>` or list indent), 2026-10-22T20:15:30.5708264Z ╰──── 2026-10-22T20:15:30.5708606Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-22T20:15:30.5708863Z 2026-10-22T20:15:30.5709085Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T20:15:30.5709461Z ╭─[apps/mobile/src/state/use-thread-outbox-drain.ts:1315:5] 2026-10-22T20:15:30.5709716Z 1314 │ queuedMessagesByThreadKey, 2026-10-22T20:15:30.5709902Z 1315 │ retryTick, 2026-10-22T20:15:30.5710079Z ·  ────┬──── 2026-10-22T20:15:30.5710344Z · ╰── Unnecessary dependency `retryTick` 2026-10-22T20:15:30.5710580Z 1316 │ restoreQueuedMessage, 2026-10-22T20:15:30.5710741Z ╰──── 2026-10-22T20:15:30.5711120Z  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-22T20:15:30.5711764Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.5712125Z 2026-10-22T20:15:30.5712342Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-22T20:15:30.5712739Z ╭─[apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx:814:17] 2026-10-22T20:15:30.5712997Z 813 │
2026-10-22T20:15:30.5732549Z 817 │ 2026-10-22T20:15:30.5732829Z ·  ──────────────────── 2026-10-22T20:15:30.5733074Z 818 │ 2026-10-22T20:15:30.5735294Z 832 │ 2026-10-22T20:15:30.5735594Z ·  ──────────────────── 2026-10-22T20:15:30.5735851Z 833 │ 2026-10-22T20:15:30.5736037Z ╰──── 2026-10-22T20:15:30.5736333Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-22T20:15:30.5736712Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-22T20:15:30.5736897Z 2026-10-22T20:15:30.5737193Z ⚠ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'. 2026-10-22T20:15:30.5737702Z ╭─[apps/web/src/components/preview/PreviewPanelShell.tsx:61:9] 2026-10-22T20:15:30.5737980Z 60 │ ) { 2026-10-22T20:15:30.5738230Z 61 │ const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded"; 2026-10-22T20:15:30.5738500Z ·  ──────┬────── 2026-10-22T20:15:30.5738774Z · ╰── 'useDragRegion' is declared here 2026-10-22T20:15:30.5739037Z 62 │ const isInline = props.mode === "inline"; 2026-10-22T20:15:30.5739210Z ╰──── 2026-10-22T20:15:30.5739384Z  help: Consider removing this declaration. 2026-10-22T20:15:30.5739524Z 2026-10-22T20:15:30.5739714Z ⚠ react(purity): Cannot call impure function during render 2026-10-22T20:15:30.5740035Z ╭─[apps/web/src/hooks/useThreadActions.ts:821:56] 2026-10-22T20:15:30.5740412Z 820 │ const resolved = resolveThreadTarget(target); 2026-10-22T20:15:30.5740720Z 821 │ if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) { 2026-10-22T20:15:30.5741031Z ·  ─────┬──── 2026-10-22T20:15:30.5741366Z · ╰── Cannot call impure function 2026-10-22T20:15:30.5741631Z 822 │ return AsyncResult.failure( 2026-10-22T20:15:30.5741795Z ╰──── 2026-10-22T20:15:30.5742190Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-22T20:15:30.5742801Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-22T20:15:30.5743101Z 2026-10-22T20:15:30.5743285Z ⚠ react(purity): Cannot call impure function during render 2026-10-22T20:15:30.5743610Z ╭─[apps/web/src/hooks/useThreadActions.ts:709:46] 2026-10-22T20:15:30.5743830Z 708 │ const wokeAt = resolved 2026-10-22T20:15:30.5744080Z 709 │ ? threadWokeAt(resolved.thread, { now: new Date().toISOString() }) 2026-10-22T20:15:30.5744368Z ·  ─────┬──── 2026-10-22T20:15:30.5744694Z · ╰── Cannot call impure function 2026-10-22T20:15:30.5744940Z 710 │ : null; 2026-10-22T20:15:30.5745088Z ╰──── 2026-10-22T20:15:30.5745451Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-22T20:15:30.5746042Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-22T20:15:30.5746337Z 2026-10-22T20:15:30.5746506Z ⚠ react(immutability): This value cannot be modified 2026-10-22T20:15:30.5746856Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:42:5] 2026-10-22T20:15:30.5747088Z 35 │ 2026-10-22T20:15:30.5747306Z 36 │ const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0); 2026-10-22T20:15:30.5747561Z ·  ────────┬──────── 2026-10-22T20:15:30.5747852Z · ╰── `inspectorProgress` originates here 2026-10-22T20:15:30.5748123Z 37 │ const { renderedInspectorWidth } = props; 2026-10-22T20:15:30.5748403Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-22T20:15:30.5748904Z 39 │ 2026-10-22T20:15:30.5749145Z 40 │ const onClosed = props.onClosed; 2026-10-22T20:15:30.5749338Z 41 │ useEffect(() => { 2026-10-22T20:15:30.5749541Z 42 │ inspectorProgress.value = withTiming( 2026-10-22T20:15:30.5749767Z ·  ────────┬──────── 2026-10-22T20:15:30.5750052Z · ╰── `inspectorProgress` cannot be modified 2026-10-22T20:15:30.5750321Z 43 │ inspectorVisible ? 1 : 0, 2026-10-22T20:15:30.5750498Z ╰──── 2026-10-22T20:15:30.5750858Z  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-22T20:15:30.5751448Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T20:15:30.5751751Z 2026-10-22T20:15:30.5751964Z ⚠ react(immutability): This value cannot be modified 2026-10-22T20:15:30.5752324Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:67:7] 2026-10-22T20:15:30.5752619Z 37 │ const { renderedInspectorWidth } = props; 2026-10-22T20:15:30.5752881Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-22T20:15:30.5753137Z ·  ──────────┬───────── 2026-10-22T20:15:30.5753424Z · ╰── `renderedContentWidth` originates here 2026-10-22T20:15:30.5753653Z 39 │ 2026-10-22T20:15:30.5753805Z 40 │ const onClosed = props.onClosed; 2026-10-22T20:15:30.5753980Z 41 │ useEffect(() => { 2026-10-22T20:15:30.5754173Z 42 │ inspectorProgress.value = withTiming( 2026-10-22T20:15:30.5754370Z 43 │ inspectorVisible ? 1 : 0, 2026-10-22T20:15:30.5754564Z 44 │ WORKSPACE_PANE_TIMING, 2026-10-22T20:15:30.5754733Z 45 │ (finished) => { 2026-10-22T20:15:30.5754973Z 46 │ if (finished === true && !inspectorVisible && onClosed !== undefined) { 2026-10-22T20:15:30.5755209Z 47 │ runOnJS(onClosed)(); 2026-10-22T20:15:30.5755375Z 48 │ } 2026-10-22T20:15:30.5755515Z 49 │ }, 2026-10-22T20:15:30.5755645Z 50 │ ); 2026-10-22T20:15:30.5755868Z 51 │ const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0; 2026-10-22T20:15:30.5756106Z 52 │ renderedInspectorWidth.set( 2026-10-22T20:15:30.5756374Z 53 │ resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING), 2026-10-22T20:15:30.5756602Z 54 │ ); 2026-10-22T20:15:30.5756736Z 55 │ }, [ 2026-10-22T20:15:30.5756877Z 56 │ inspectorProgress, 2026-10-22T20:15:30.5757047Z 57 │ inspectorVisible, 2026-10-22T20:15:30.5757307Z 58 │ inspectorWidth, 2026-10-22T20:15:30.5757511Z 59 │ onClosed, 2026-10-22T20:15:30.5757684Z 60 │ renderedInspectorWidth, 2026-10-22T20:15:30.5757854Z 61 │ resizing, 2026-10-22T20:15:30.5757998Z 62 │ ]); 2026-10-22T20:15:30.5758122Z 63 │ 2026-10-22T20:15:30.5758267Z 64 │ useEffect(() => { 2026-10-22T20:15:30.5758455Z 65 │ const targetWidth = inspectorWidth ?? 0; 2026-10-22T20:15:30.5758678Z 66 │ if (!inspectorVisible || resizing) { 2026-10-22T20:15:30.5758913Z 67 │ renderedContentWidth.value = targetWidth; 2026-10-22T20:15:30.5759141Z ·  ──────────┬───────── 2026-10-22T20:15:30.5759441Z · ╰── `renderedContentWidth` cannot be modified 2026-10-22T20:15:30.5759685Z 68 │ return; 2026-10-22T20:15:30.5759831Z ╰──── 2026-10-22T20:15:30.5760184Z  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-22T20:15:30.5760790Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T20:15:30.5761100Z 2026-10-22T20:15:30.5761328Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T20:15:30.5761723Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7] 2026-10-22T20:15:30.5762039Z 256 │ return () => cancelAnimationFrame(frame); 2026-10-22T20:15:30.5762262Z 257 │ }, [props.path, targetIndex]); 2026-10-22T20:15:30.5762455Z ·  ─────┬──── 2026-10-22T20:15:30.5762732Z · ╰── Unnecessary dependency `props.path` 2026-10-22T20:15:30.5762955Z 258 │ 2026-10-22T20:15:30.5763089Z ╰──── 2026-10-22T20:15:30.5763471Z  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-22T20:15:30.5764105Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.5764415Z 2026-10-22T20:15:30.5764633Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-22T20:15:30.5765014Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23] 2026-10-22T20:15:30.5765259Z 292 │ 2026-10-22T20:15:30.5767841Z ·  ─────────── 2026-10-22T20:15:30.5768109Z 310 │ {body} 2026-10-22T20:15:30.5768373Z ╰──── 2026-10-22T20:15:30.5768729Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-22T20:15:30.5769003Z 2026-10-22T20:15:30.5769559Z ⚠ 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-22T20:15:30.5770245Z ╭─[packages/contracts/src/composerContext.test.ts:181:18] 2026-10-22T20:15:30.5770613Z 180 │ it("sends a message without the records the wire cannot carry", () => { 2026-10-22T20:15:30.5771034Z 181 │ const wire = Schema.encodeUnknownSync(Schema.toCodecJson(OrchestrationMessageContext))({ 2026-10-22T20:15:30.5771438Z ·  ──────────────────────── 2026-10-22T20:15:30.5771684Z 182 │ version: 1, 2026-10-22T20:15:30.5771945Z ╰──── 2026-10-22T20:15:30.5772007Z 2026-10-22T20:15:30.5772547Z ⚠ 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-22T20:15:30.5773168Z ╭─[packages/contracts/src/baseSchemas.test.ts:39:9] 2026-10-22T20:15:30.5773397Z 38 │ JSON.stringify( 2026-10-22T20:15:30.5773628Z 39 │ Schema.encodeUnknownSync(Schema.toCodecJson(Named))([ 2026-10-22T20:15:30.5773929Z ·  ──────────────────────── 2026-10-22T20:15:30.5774163Z 40 │ { name: "a" }, 2026-10-22T20:15:30.5774401Z ╰──── 2026-10-22T20:15:30.5774529Z 2026-10-22T20:15:30.5774811Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.5775297Z ╭─[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5] 2026-10-22T20:15:30.5775524Z 150 │ 2026-10-22T20:15:30.5775705Z 151 │ useEffect(() => { 2026-10-22T20:15:30.5775888Z ·  ────┬──── 2026-10-22T20:15:30.5776171Z · ╰── This is the containing effect 2026-10-22T20:15:30.5776430Z 152 │ if (!controlledSelectedPath) { 2026-10-22T20:15:30.5776621Z 153 │ return; 2026-10-22T20:15:30.5776772Z 154 │ } 2026-10-22T20:15:30.5776936Z 155 │ setExpandedPaths((current) => { 2026-10-22T20:15:30.5777149Z ·  ────────┬─────── 2026-10-22T20:15:30.5777528Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.5777867Z 156 │ const ancestors = ancestorPaths(controlledSelectedPath); 2026-10-22T20:15:30.5778095Z ╰──── 2026-10-22T20:15:30.5778804Z  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-22T20:15:30.5779724Z  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-22T20:15:30.5780054Z 2026-10-22T20:15:30.5781450Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-22T20:15:30.5781811Z ╭─[packages/contracts/src/rpc.ts:295:8] 2026-10-22T20:15:30.5782112Z 294 │ } from "./device.ts"; 2026-10-22T20:15:30.5782461Z 295 │ import {} from "./previewAutomation.ts"; 2026-10-22T20:15:30.5782839Z ·  ── 2026-10-22T20:15:30.5783024Z 296 │ import { 2026-10-22T20:15:30.5783202Z ╰──── 2026-10-22T20:15:30.5783353Z  help: Remove empty braces 2026-10-22T20:15:30.5783493Z 2026-10-22T20:15:30.5783766Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-22T20:15:30.5784160Z ╭─[apps/web/src/components/chat/useComposerSend.ts:978:13] 2026-10-22T20:15:30.5784492Z 977 │ const changedBeforeDecline = draftChangedSinceSend(); 2026-10-22T20:15:30.5784939Z 978 │ ╭─▶ const pendingIdsBeforeDecline = pendingApprovalsRef.current.map( 2026-10-22T20:15:30.5785387Z 979 │ │ (approval) => approval.requestId, 2026-10-22T20:15:30.5785710Z 980 │ ╰─▶ ); 2026-10-22T20:15:30.5786080Z 981 │ const approvalResponding = approvalsToDecline.some((approval) => 2026-10-22T20:15:30.5786327Z ╰──── 2026-10-22T20:15:30.5786483Z  help: Switch to `Set` 2026-10-22T20:15:30.5786584Z 2026-10-22T20:15:30.5787016Z ⚠ 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-22T20:15:30.5787542Z ╭─[packages/contracts/src/auth.test.ts:17:12] 2026-10-22T20:15:30.5787909Z 16 │ it("decodes legacy review credentials without offering them in new grants", () => { 2026-10-22T20:15:30.5788306Z 17 │ expect(Schema.decodeUnknownSync(AuthEnvironmentScopes)(["review:write"])).toEqual([ 2026-10-22T20:15:30.5788666Z ·  ──────────────────────── 2026-10-22T20:15:30.5788871Z 18 │ "review:write", 2026-10-22T20:15:30.5789036Z ╰──── 2026-10-22T20:15:30.5789134Z 2026-10-22T20:15:30.5789520Z ⚠ 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-22T20:15:30.5790001Z ╭─[packages/contracts/src/auth.test.ts:20:18] 2026-10-22T20:15:30.5790203Z 19 │ ]); 2026-10-22T20:15:30.5790490Z 20 │ expect(() => Schema.decodeUnknownSync(AuthGrantScopes)(["review:write"])).toThrow(); 2026-10-22T20:15:30.5790836Z ·  ──────────────────────── 2026-10-22T20:15:30.5791129Z 21 │ expect(AuthStandardClientScopes).not.toContain("review:write"); 2026-10-22T20:15:30.5791376Z ╰──── 2026-10-22T20:15:30.5791474Z 2026-10-22T20:15:30.5791910Z ⚠ 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-22T20:15:30.5792424Z ╭─[packages/contracts/src/auth.test.ts:58:21] 2026-10-22T20:15:30.5792750Z 57 │ it("ignores unknown response permissions without falling back to broader scopes", () => { 2026-10-22T20:15:30.5793078Z 58 │ const session = Schema.decodeUnknownSync(AuthSessionState)({ 2026-10-22T20:15:30.5793364Z ·  ──────────────────────── 2026-10-22T20:15:30.5793573Z 59 │ authenticated: true, 2026-10-22T20:15:30.5793808Z ╰──── 2026-10-22T20:15:30.5793893Z 2026-10-22T20:15:30.5794151Z ⚠ react(static-components): Cannot create components during render 2026-10-22T20:15:30.5794741Z ╭─[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10] 2026-10-22T20:15:30.5795144Z 196 │ const { onInput, onResize } = props; 2026-10-22T20:15:30.5795508Z 197 │ const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView(); 2026-10-22T20:15:30.5795936Z ·  ────────────────┬─────────────── 2026-10-22T20:15:30.5796418Z · ╰── The component is created during render here 2026-10-22T20:15:30.5796810Z 198 │ const hasNativeSurface = Boolean(NativeTerminalSurfaceView); 2026-10-22T20:15:30.5797078Z 199 │ 2026-10-22T20:15:30.5797346Z 200 │ useEffect(() => { 2026-10-22T20:15:30.5797626Z 201 │ terminalDebugLog("native:surface", { 2026-10-22T20:15:30.5797903Z 202 │ terminalKey: props.terminalKey, 2026-10-22T20:15:30.5798148Z 203 │ native: hasNativeSurface, 2026-10-22T20:15:30.5798457Z 204 │ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(), 2026-10-22T20:15:30.5798722Z 205 │ bufferLen: props.buffer.length, 2026-10-22T20:15:30.5798927Z 206 │ isRunning: props.isRunning, 2026-10-22T20:15:30.5799125Z 207 │ }); 2026-10-22T20:15:30.5799393Z 208 │ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]); 2026-10-22T20:15:30.5799675Z 209 │ const handleNativeInput = useCallback( 2026-10-22T20:15:30.5799929Z 210 │ (event: NativeSyntheticEvent) => { 2026-10-22T20:15:30.5800207Z 211 │ if (!props.isRunning || props.readOnly) { 2026-10-22T20:15:30.5800402Z 212 │ return; 2026-10-22T20:15:30.5800572Z 213 │ } 2026-10-22T20:15:30.5800747Z 214 │ terminalDebugLog("native:onInput", { 2026-10-22T20:15:30.5801126Z 215 │ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)), 2026-10-22T20:15:30.5801413Z 216 │ }); 2026-10-22T20:15:30.5801619Z 217 │ onInput(event.nativeEvent.data); 2026-10-22T20:15:30.5801794Z 218 │ }, 2026-10-22T20:15:30.5802046Z 219 │ [onInput, props.isRunning, props.readOnly], 2026-10-22T20:15:30.5802282Z 220 │ ); 2026-10-22T20:15:30.5802494Z 221 │ const handleNativeResize = useCallback( 2026-10-22T20:15:30.5802880Z 222 │ (event: NativeSyntheticEvent) => { 2026-10-22T20:15:30.5803180Z 223 │ onResize({ 2026-10-22T20:15:30.5803412Z 224 │ cols: event.nativeEvent.cols, 2026-10-22T20:15:30.5803678Z 225 │ rows: event.nativeEvent.rows, 2026-10-22T20:15:30.5803942Z 226 │ }); 2026-10-22T20:15:30.5804176Z 227 │ }, 2026-10-22T20:15:30.5804407Z 228 │ [onResize], 2026-10-22T20:15:30.5804596Z 229 │ ); 2026-10-22T20:15:30.5804843Z 230 │ 2026-10-22T20:15:30.5805074Z 231 │ if (NativeTerminalSurfaceView) { 2026-10-22T20:15:30.5805260Z 232 │ return ( 2026-10-22T20:15:30.5805438Z 233 │ 2026-10-22T20:15:30.5805640Z 234 │ { 2026-10-22T20:15:30.5808921Z 458 │ let result: Array = divisor.map((_) => 0); 2026-10-22T20:15:30.5809159Z ·  ┬ 2026-10-22T20:15:30.5809447Z · ╰── '_' is declared here 2026-10-22T20:15:30.5809682Z 459 │ for (const b of data) { 2026-10-22T20:15:30.5809847Z ╰──── 2026-10-22T20:15:30.5810030Z  help: Consider removing this parameter. 2026-10-22T20:15:30.5810162Z 2026-10-22T20:15:30.5810462Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.5810914Z ╭─[apps/mobile/src/features/terminal/terminalLaunchContext.ts:117:5] 2026-10-22T20:15:30.5811279Z 112 │ const [entry, setEntry] = useState(() => ({ key: input.targetKey, location: candidate })); 2026-10-22T20:15:30.5811562Z 113 │ useEffect(() => { 2026-10-22T20:15:30.5811759Z ·  ────┬──── 2026-10-22T20:15:30.5812045Z · ╰── This is the containing effect 2026-10-22T20:15:30.5812405Z 114 │ if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) { 2026-10-22T20:15:30.5812658Z 115 │ return; 2026-10-22T20:15:30.5812804Z 116 │ } 2026-10-22T20:15:30.5813010Z 117 │ setEntry({ key: input.targetKey, location: candidate }); 2026-10-22T20:15:30.5813239Z ·  ────┬─── 2026-10-22T20:15:30.5813529Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.5813843Z 118 │ }, [candidate, entry.key, entry.location, input.targetKey]); 2026-10-22T20:15:30.5814054Z ╰──── 2026-10-22T20:15:30.5814756Z  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-22T20:15:30.5815664Z  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-22T20:15:30.5815997Z 2026-10-22T20:15:30.5816278Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-22T20:15:30.5832674Z ╭─[apps/mobile/src/features/terminal/TerminalContextSheet.tsx:72:15] 2026-10-22T20:15:30.5832968Z 71 │ { 2026-10-22T20:15:30.5835502Z ·  ────┬──── 2026-10-22T20:15:30.5835749Z · ╰── This is the containing effect 2026-10-22T20:15:30.5835998Z 119 │ void refreshNotifications(); 2026-10-22T20:15:30.5836218Z ·  ──────────┬───────── 2026-10-22T20:15:30.5836537Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.5836883Z 120 │ const subscription = AppState.addEventListener("change", (state) => { 2026-10-22T20:15:30.5837114Z ╰──── 2026-10-22T20:15:30.5837826Z  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-22T20:15:30.5838765Z  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-22T20:15:30.5839090Z 2026-10-22T20:15:30.5839373Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.5839839Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7] 2026-10-22T20:15:30.5840103Z 125 │ 2026-10-22T20:15:30.5840244Z 126 │ useEffect(() => { 2026-10-22T20:15:30.5840412Z ·  ────┬──── 2026-10-22T20:15:30.5840662Z · ╰── This is the containing effect 2026-10-22T20:15:30.5840885Z 127 │ if (!isLoaded) { 2026-10-22T20:15:30.5841077Z 128 │ setLiveActivityStatus("checking"); 2026-10-22T20:15:30.5841294Z ·  ──────────┬────────── 2026-10-22T20:15:30.5841596Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.5841849Z 129 │ return; 2026-10-22T20:15:30.5842020Z ╰──── 2026-10-22T20:15:30.5842717Z  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-22T20:15:30.5843764Z  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-22T20:15:30.5844155Z 2026-10-22T20:15:30.5844432Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.5844888Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:643:5] 2026-10-22T20:15:30.5845139Z 638 │ 2026-10-22T20:15:30.5845278Z 639 │ useEffect(() => { 2026-10-22T20:15:30.5845446Z ·  ────┬──── 2026-10-22T20:15:30.5845693Z · ╰── This is the containing effect 2026-10-22T20:15:30.5845965Z 640 │ if (pendingLaunchEntry.key === launchTargetKey) { 2026-10-22T20:15:30.5846170Z 641 │ return; 2026-10-22T20:15:30.5846316Z 642 │ } 2026-10-22T20:15:30.5846467Z 643 │ setPendingLaunchEntry({ 2026-10-22T20:15:30.5846675Z ·  ──────────┬────────── 2026-10-22T20:15:30.5846992Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.5847264Z 644 │ key: launchTargetKey, 2026-10-22T20:15:30.5847419Z ╰──── 2026-10-22T20:15:30.5848113Z  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-22T20:15:30.5849014Z  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-22T20:15:30.5849343Z 2026-10-22T20:15:30.5849630Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.5850091Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5] 2026-10-22T20:15:30.5850361Z 648 │ 2026-10-22T20:15:30.5850504Z 649 │ useEffect(() => { 2026-10-22T20:15:30.5850690Z ·  ────┬──── 2026-10-22T20:15:30.5850943Z · ╰── This is the containing effect 2026-10-22T20:15:30.5851248Z 650 │ if (initialAttachGridEntry.key === launchTargetKey) { 2026-10-22T20:15:30.5851465Z 651 │ return; 2026-10-22T20:15:30.5851626Z 652 │ } 2026-10-22T20:15:30.5851785Z 653 │ setInitialAttachGridEntry({ 2026-10-22T20:15:30.5852051Z ·  ────────────┬──────────── 2026-10-22T20:15:30.5852372Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.5852641Z 654 │ key: launchTargetKey, 2026-10-22T20:15:30.5852798Z ╰──── 2026-10-22T20:15:30.5853487Z  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-22T20:15:30.5854405Z  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-22T20:15:30.5854732Z 2026-10-22T20:15:30.5855010Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.5855565Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7] 2026-10-22T20:15:30.5855885Z 743 │ 2026-10-22T20:15:30.5856029Z 744 │ useEffect(() => { 2026-10-22T20:15:30.5856202Z ·  ────┬──── 2026-10-22T20:15:30.5856449Z · ╰── This is the containing effect 2026-10-22T20:15:30.5856714Z 745 │ if (!routeEnvironmentId || !routeThreadId) { 2026-10-22T20:15:30.5856920Z 746 │ setLastGridSize({ 2026-10-22T20:15:30.5857109Z ·  ───────┬─────── 2026-10-22T20:15:30.5857411Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.5857687Z 747 │ cols: DEFAULT_TERMINAL_COLS, 2026-10-22T20:15:30.5857866Z ╰──── 2026-10-22T20:15:30.5858566Z  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-22T20:15:30.5859481Z  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-22T20:15:30.5859807Z 2026-10-22T20:15:30.5860023Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T20:15:30.5860538Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24] 2026-10-22T20:15:30.5860791Z 537 │ }); 2026-10-22T20:15:30.5861013Z 538 │ }, [terminal.buffer, terminal.buffer.length, terminalKey]); 2026-10-22T20:15:30.5861292Z ·  ───────────┬────────── 2026-10-22T20:15:30.5861711Z · ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead 2026-10-22T20:15:30.5862177Z 539 │ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null; 2026-10-22T20:15:30.5862426Z ╰──── 2026-10-22T20:15:30.5862801Z  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-22T20:15:30.5863433Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.5863747Z 2026-10-22T20:15:30.5863971Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T20:15:30.5864385Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7] 2026-10-22T20:15:30.5864679Z 708 │ sentInitialInputKeyRef.current = null; 2026-10-22T20:15:30.5864879Z 709 │ }, [terminalKey]); 2026-10-22T20:15:30.5865055Z ·  ─────┬───── 2026-10-22T20:15:30.5865325Z · ╰── Unnecessary dependency `terminalKey` 2026-10-22T20:15:30.5865546Z 710 │ 2026-10-22T20:15:30.5865672Z ╰──── 2026-10-22T20:15:30.5866043Z  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-22T20:15:30.5866670Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.5867087Z 2026-10-22T20:15:30.5867381Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T20:15:30.5867783Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52] 2026-10-22T20:15:30.5868033Z 799 │ }; 2026-10-22T20:15:30.5868306Z 800 │ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]); 2026-10-22T20:15:30.5868738Z ·  ────────────┬──────────── ─────┬───── 2026-10-22T20:15:30.5869189Z · │ ╰── Unnecessary dependency `terminalKey` 2026-10-22T20:15:30.5869662Z · ╰── Unnecessary dependency `terminal.lifecycleVersion` 2026-10-22T20:15:30.5869959Z 801 │ 2026-10-22T20:15:30.5870088Z ╰──── 2026-10-22T20:15:30.5870464Z  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-22T20:15:30.5871095Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.5871414Z 2026-10-22T20:15:30.5871580Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.5871963Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24] 2026-10-22T20:15:30.5872220Z 792 │ } 2026-10-22T20:15:30.5872409Z 793 │ const pasteSession = pasteSessionRef.current; 2026-10-22T20:15:30.5872684Z ·  ───────────┬─────────── 2026-10-22T20:15:30.5873024Z · ╰── Cannot access ref value during render 2026-10-22T20:15:30.5873269Z 794 │ 2026-10-22T20:15:30.5873406Z ╰──── 2026-10-22T20:15:30.5873980Z  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-22T20:15:30.5874754Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.5875056Z 2026-10-22T20:15:30.5875425Z ⚠ eslint(no-unused-vars): Function 'promptResponseHasMissingXAiStopReason' is declared but never used. 2026-10-22T20:15:30.5875924Z ╭─[packages/provider-grok/src/server/xaiAcpExtension.ts:1620:10] 2026-10-22T20:15:30.5876161Z 1619 │ 2026-10-22T20:15:30.5876466Z 1620 │ function promptResponseHasMissingXAiStopReason(response: EffectAcpSchema.PromptResponse): boolean { 2026-10-22T20:15:30.5876838Z ·  ──────────────────┬────────────────── 2026-10-22T20:15:30.5877215Z · ╰── 'promptResponseHasMissingXAiStopReason' is declared here 2026-10-22T20:15:30.5877520Z 1621 │ const meta = response._meta; 2026-10-22T20:15:30.5877698Z ╰──── 2026-10-22T20:15:30.5877884Z  help: Consider removing this declaration. 2026-10-22T20:15:30.5878019Z 2026-10-22T20:15:30.5878310Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.5878755Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-22T20:15:30.5879006Z 259 │ .join("|"); 2026-10-22T20:15:30.5879163Z 260 │ useEffect(() => { 2026-10-22T20:15:30.5879341Z ·  ────┬──── 2026-10-22T20:15:30.5879586Z · ╰── This is the containing effect 2026-10-22T20:15:30.5879809Z 261 │ stop(); 2026-10-22T20:15:30.5879964Z ·  ──┬─ 2026-10-22T20:15:30.5880237Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.5880497Z 262 │ }, [orderVersion]); 2026-10-22T20:15:30.5880645Z ╰──── 2026-10-22T20:15:30.5881356Z  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-22T20:15:30.5882319Z  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-22T20:15:30.5882661Z 2026-10-22T20:15:30.5882915Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-22T20:15:30.5883326Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-22T20:15:30.5883602Z 260 │ useEffect(() => { 2026-10-22T20:15:30.5883767Z 261 │ stop(); 2026-10-22T20:15:30.5883928Z ·  ──┬─ 2026-10-22T20:15:30.5884176Z · ╰── Missing dependency `stop` 2026-10-22T20:15:30.5884427Z 262 │ }, [orderVersion]); 2026-10-22T20:15:30.5884619Z ·  ──────┬───── 2026-10-22T20:15:30.5884902Z · ╰── Unnecessary dependency `orderVersion` 2026-10-22T20:15:30.5885146Z 263 │ useEffect( 2026-10-22T20:15:30.5885291Z ╰──── 2026-10-22T20:15:30.5885824Z  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-22T20:15:30.5886574Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.5886883Z 2026-10-22T20:15:30.5887162Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.5887576Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9] 2026-10-22T20:15:30.5887846Z 95 │ const latest = useRef(props); 2026-10-22T20:15:30.5888034Z 96 │ latest.current = props; 2026-10-22T20:15:30.5888255Z ·  ───┬──────┬─── 2026-10-22T20:15:30.5888581Z · │ ╰── Cannot update ref value during render 2026-10-22T20:15:30.5888920Z · ╰── This value is a ref 2026-10-22T20:15:30.5889141Z 97 │ const gesture = useMemo( 2026-10-22T20:15:30.5889297Z ╰──── 2026-10-22T20:15:30.5889876Z  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-22T20:15:30.5890665Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.5890975Z 2026-10-22T20:15:30.5891135Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.5891485Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18] 2026-10-22T20:15:30.5891734Z 103 │ .runOnJS(true) 2026-10-22T20:15:30.5891973Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-22T20:15:30.5892244Z ·  ───────────────┬────────────── 2026-10-22T20:15:30.5892610Z · ╰── Passing a ref to a function may read its value during render 2026-10-22T20:15:30.5892968Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-22T20:15:30.5893183Z ╰──── 2026-10-22T20:15:30.5893741Z  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-22T20:15:30.5894501Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.5894800Z 2026-10-22T20:15:30.5894955Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.5895294Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19] 2026-10-22T20:15:30.5895585Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-22T20:15:30.5895857Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-22T20:15:30.5896183Z ·  ──────────────────────────┬───────────────────────── 2026-10-22T20:15:30.5896587Z · ╰── Passing a ref to a function may read its value during render 2026-10-22T20:15:30.5896942Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-22T20:15:30.5897156Z ╰──── 2026-10-22T20:15:30.5897724Z  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-22T20:15:30.5898616Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.5898967Z 2026-10-22T20:15:30.5899122Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.5899469Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16] 2026-10-22T20:15:30.5899790Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-22T20:15:30.5900081Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-22T20:15:30.5900507Z ·  ──────────────────────────┬───────────────────────── 2026-10-22T20:15:30.5900902Z · ╰── Passing a ref to a function may read its value during render 2026-10-22T20:15:30.5901265Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-22T20:15:30.5901489Z ╰──── 2026-10-22T20:15:30.5902075Z  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-22T20:15:30.5902838Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.5903138Z 2026-10-22T20:15:30.5903294Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.5903638Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21] 2026-10-22T20:15:30.5903960Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-22T20:15:30.5904253Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-22T20:15:30.5904562Z ·  ───────────────────────┬────────────────────── 2026-10-22T20:15:30.5904979Z · ╰── Passing a ref to a function may read its value during render 2026-10-22T20:15:30.5905275Z 108 │ [props.disabled], 2026-10-22T20:15:30.5905436Z ╰──── 2026-10-22T20:15:30.5905988Z  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-22T20:15:30.5906751Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.5907052Z 2026-10-22T20:15:30.5907209Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.5907551Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:249:9] 2026-10-22T20:15:30.5907853Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-22T20:15:30.5908108Z 249 │ latest.current = { rows, planners, moveThread }; 2026-10-22T20:15:30.5908354Z ·  ───┬──────┬─── 2026-10-22T20:15:30.5908678Z · │ ╰── Cannot update ref value during render 2026-10-22T20:15:30.5908997Z · ╰── This value is a ref 2026-10-22T20:15:30.5909194Z 250 │ 2026-10-22T20:15:30.5909319Z ╰──── 2026-10-22T20:15:30.5909983Z  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-22T20:15:30.5910800Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.5911099Z 2026-10-22T20:15:30.5911258Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.5911591Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:247:22] 2026-10-22T20:15:30.5911918Z 246 │ const [preview, setPreview] = useState(null); 2026-10-22T20:15:30.5912219Z 247 │ const translateY = useRef(new Animated.Value(0)).current; 2026-10-22T20:15:30.5912514Z ·  ──────────────────┬────────────────── 2026-10-22T20:15:30.5912852Z · ╰── Cannot access ref value during render 2026-10-22T20:15:30.5913158Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-22T20:15:30.5913352Z ╰──── 2026-10-22T20:15:30.5913909Z  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-22T20:15:30.5914660Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.5914956Z 2026-10-22T20:15:30.5915141Z ⚠ react(purity): Cannot call impure function during render 2026-10-22T20:15:30.5915499Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:324:16] 2026-10-22T20:15:30.5915760Z 323 │ update(0); 2026-10-22T20:15:30.5915948Z 324 │ let last = performance.now(); 2026-10-22T20:15:30.5916177Z ·  ────────┬──────── 2026-10-22T20:15:30.5916457Z · ╰── Cannot call impure function 2026-10-22T20:15:30.5916687Z 325 │ const tick = () => { 2026-10-22T20:15:30.5916840Z ╰──── 2026-10-22T20:15:30.5917240Z  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-22T20:15:30.5917865Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-22T20:15:30.5918167Z 2026-10-22T20:15:30.5918445Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-22T20:15:30.5918865Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15] 2026-10-22T20:15:30.5919110Z  98 │ () => 2026-10-22T20:15:30.5919257Z  99 │ Gesture.Pan() 2026-10-22T20:15:30.5919435Z ·  ─┬─ 2026-10-22T20:15:30.5919686Z · ╰── `Pan` may be a component 2026-10-22T20:15:30.5919922Z 100 │ .enabled(!props.disabled) 2026-10-22T20:15:30.5920098Z ╰──── 2026-10-22T20:15:30.5920459Z  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-22T20:15:30.5921217Z  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-22T20:15:30.5921647Z 2026-10-22T20:15:30.5921847Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-22T20:15:30.5922254Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5] 2026-10-22T20:15:30.5922506Z 103 │ .runOnJS(true) 2026-10-22T20:15:30.5922718Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-22T20:15:30.5922941Z ·  ───┬── 2026-10-22T20:15:30.5923539Z · ╰── 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-22T20:15:30.5924096Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-22T20:15:30.5924398Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-22T20:15:30.5924678Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-22T20:15:30.5924909Z 108 │ [props.disabled], 2026-10-22T20:15:30.5925092Z ·  ────────┬─────── 2026-10-22T20:15:30.5925408Z · ╰── This dependency list is missing values used by the callback 2026-10-22T20:15:30.5925666Z 109 │ ); 2026-10-22T20:15:30.5925795Z ╰──── 2026-10-22T20:15:30.5926077Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-22T20:15:30.5926637Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.5926949Z 2026-10-22T20:15:30.5927235Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.5927674Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:57:5] 2026-10-22T20:15:30.5927908Z 55 │ 2026-10-22T20:15:30.5928049Z 56 │ useEffect(() => { 2026-10-22T20:15:30.5928225Z ·  ────┬──── 2026-10-22T20:15:30.5928461Z · ╰── This is the containing effect 2026-10-22T20:15:30.5928692Z 57 │ setDecodedSize(null); 2026-10-22T20:15:30.5928877Z ·  ───────┬────── 2026-10-22T20:15:30.5929274Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.5929581Z 58 │ }, [props.sourceKey]); 2026-10-22T20:15:30.5929745Z ╰──── 2026-10-22T20:15:30.5930444Z  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-22T20:15:30.5931365Z  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-22T20:15:30.5931690Z 2026-10-22T20:15:30.5932015Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.5932476Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5] 2026-10-22T20:15:30.5932712Z 59 │ 2026-10-22T20:15:30.5932866Z 60 │ useEffect(() => { 2026-10-22T20:15:30.5933030Z ·  ────┬──── 2026-10-22T20:15:30.5933286Z · ╰── This is the containing effect 2026-10-22T20:15:30.5933519Z 61 │ setFailedUri(null); 2026-10-22T20:15:30.5933700Z ·  ──────┬───── 2026-10-22T20:15:30.5933987Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.5934243Z 62 │ }, [props.uri]); 2026-10-22T20:15:30.5934404Z ╰──── 2026-10-22T20:15:30.5935116Z  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-22T20:15:30.5936030Z  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-22T20:15:30.5936352Z 2026-10-22T20:15:30.5936609Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-22T20:15:30.5937001Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10] 2026-10-22T20:15:30.5937409Z 6 │ import { parse, SvgAst, type JsxAST } from "react-native-svg"; 2026-10-22T20:15:30.5937749Z 7 │ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native"; 2026-10-22T20:15:30.5938048Z ·  ────────┬──────── 2026-10-22T20:15:30.5938333Z · ╰── 'ActivityIndicator' is imported here 2026-10-22T20:15:30.5938567Z 8 │ 2026-10-22T20:15:30.5938687Z ╰──── 2026-10-22T20:15:30.5938855Z  help: Consider removing this import. 2026-10-22T20:15:30.5938983Z 2026-10-22T20:15:30.5939209Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T20:15:30.5939582Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7] 2026-10-22T20:15:30.5939830Z 57 │ setDecodedSize(null); 2026-10-22T20:15:30.5940002Z 58 │ }, [props.sourceKey]); 2026-10-22T20:15:30.5940293Z ·  ───────┬─────── 2026-10-22T20:15:30.5940569Z · ╰── Unnecessary dependency `props.sourceKey` 2026-10-22T20:15:30.5940795Z 59 │ 2026-10-22T20:15:30.5940919Z ╰──── 2026-10-22T20:15:30.5941435Z  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-22T20:15:30.5942151Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.5942468Z 2026-10-22T20:15:30.5942696Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T20:15:30.5943084Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7] 2026-10-22T20:15:30.5943341Z 61 │ setFailedUri(null); 2026-10-22T20:15:30.5943518Z 62 │ }, [props.uri]); 2026-10-22T20:15:30.5943701Z ·  ────┬──── 2026-10-22T20:15:30.5943962Z · ╰── Unnecessary dependency `props.uri` 2026-10-22T20:15:30.5944189Z 63 │ 2026-10-22T20:15:30.5944313Z ╰──── 2026-10-22T20:15:30.5944684Z  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-22T20:15:30.5945323Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.5945648Z 2026-10-22T20:15:30.5945934Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-22T20:15:30.5946353Z ╭─[packages/provider-grok/src/server/adapter.ts:408:7] 2026-10-22T20:15:30.5946585Z 407 │ 2026-10-22T20:15:30.5946739Z 408 │ const layer: Layer.Layer< 2026-10-22T20:15:30.5946923Z ·  ──┬── 2026-10-22T20:15:30.5947171Z · ╰── 'layer' is declared here 2026-10-22T20:15:30.5947423Z 409 │ ProviderAdapter.ProviderAdapterV2, 2026-10-22T20:15:30.5947606Z ╰──── 2026-10-22T20:15:30.5947780Z  help: Consider removing this declaration. 2026-10-22T20:15:30.5947915Z 2026-10-22T20:15:30.5948197Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.5948650Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:79:5] 2026-10-22T20:15:30.5948914Z 76 │ 2026-10-22T20:15:30.5949054Z 77 │ useEffect(() => { 2026-10-22T20:15:30.5949235Z ·  ────┬──── 2026-10-22T20:15:30.5949476Z · ╰── This is the containing effect 2026-10-22T20:15:30.5949776Z 78 │ const { host, code } = parsePairingUrl(connectionPairingUrl); 2026-10-22T20:15:30.5950012Z 79 │ setHostInput(host); 2026-10-22T20:15:30.5950202Z ·  ──────┬───── 2026-10-22T20:15:30.5950498Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.5950758Z 80 │ setCodeInput(code); 2026-10-22T20:15:30.5950922Z ╰──── 2026-10-22T20:15:30.5951625Z  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-22T20:15:30.5952648Z  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-22T20:15:30.5953021Z 2026-10-22T20:15:30.5953296Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.5953748Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:89:5] 2026-10-22T20:15:30.5953996Z 82 │ 2026-10-22T20:15:30.5954145Z 83 │ useEffect(() => { 2026-10-22T20:15:30.5954325Z ·  ────┬──── 2026-10-22T20:15:30.5954597Z · ╰── This is the containing effect 2026-10-22T20:15:30.5954842Z 84 │ if (routePairingUrl.length === 0) { 2026-10-22T20:15:30.5955046Z 85 │ return; 2026-10-22T20:15:30.5955198Z 86 │ } 2026-10-22T20:15:30.5955332Z 87 │ 2026-10-22T20:15:30.5955530Z 88 │ const { host, code } = parsePairingUrl(routePairingUrl); 2026-10-22T20:15:30.5955757Z 89 │ setHostInput(host); 2026-10-22T20:15:30.5955962Z ·  ──────┬───── 2026-10-22T20:15:30.5956252Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.5956341Z 90 │ setCodeInput(code); 2026-10-22T20:15:30.5956416Z ╰──── 2026-10-22T20:15:30.5957048Z  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-22T20:15:30.5957391Z  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-22T20:15:30.5957398Z 2026-10-22T20:15:30.5957676Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.5957867Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:95:7] 2026-10-22T20:15:30.5957925Z 92 │ 2026-10-22T20:15:30.5957996Z 93 │ useEffect(() => { 2026-10-22T20:15:30.5958069Z ·  ────┬──── 2026-10-22T20:15:30.5958209Z · ╰── This is the containing effect 2026-10-22T20:15:30.5958306Z 94 │ if (pairingConnectionError) { 2026-10-22T20:15:30.5958388Z 95 │ setIsSubmitting(false); 2026-10-22T20:15:30.5958480Z ·  ───────┬─────── 2026-10-22T20:15:30.5958671Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.5958746Z 96 │ } 2026-10-22T20:15:30.5958808Z ╰──── 2026-10-22T20:15:30.5959430Z  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-22T20:15:30.5959774Z  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-22T20:15:30.5959777Z 2026-10-22T20:15:30.5959959Z ⚠ react(immutability): This value cannot be modified 2026-10-22T20:15:30.5960145Z ╭─[apps/mobile/src/features/connection/ConnectionStatusDot.tsx:58:7] 2026-10-22T20:15:30.5960339Z 53 │ function usePulseAnimation(pulse: boolean) { 2026-10-22T20:15:30.5960516Z 54 │ const pulseProgress = useSharedValue(0); 2026-10-22T20:15:30.5960620Z ·  ──────┬────── 2026-10-22T20:15:30.5960791Z · ╰── `pulseProgress` originates here 2026-10-22T20:15:30.5960856Z 55 │ 2026-10-22T20:15:30.5960927Z 56 │ useEffect(() => { 2026-10-22T20:15:30.5961001Z 57 │ if (pulse) { 2026-10-22T20:15:30.5961116Z 58 │ pulseProgress.value = withRepeat( 2026-10-22T20:15:30.5961209Z ·  ──────┬────── 2026-10-22T20:15:30.5961383Z · ╰── `pulseProgress` cannot be modified 2026-10-22T20:15:30.5961469Z 59 │ withTiming(1, { 2026-10-22T20:15:30.5961533Z ╰──── 2026-10-22T20:15:30.5961822Z  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-22T20:15:30.5962203Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T20:15:30.5962206Z 2026-10-22T20:15:30.5962381Z ⚠ react(immutability): This value cannot be modified 2026-10-22T20:15:30.5962561Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-22T20:15:30.5962624Z  86 │ 2026-10-22T20:15:30.5962728Z  87 │ const cardCoverage = props.cardCoverage; 2026-10-22T20:15:30.5962826Z ·  ──────┬───── 2026-10-22T20:15:30.5962982Z · ╰── `cardCoverage` originates here 2026-10-22T20:15:30.5963079Z  88 │ const barHeightRef = useRef(0); 2026-10-22T20:15:30.5963169Z  89 │ const cardHeightRef = useRef(0); 2026-10-22T20:15:30.5963282Z  90 │ const cardHeight = useSharedValue(0); 2026-10-22T20:15:30.5963391Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-22T20:15:30.5963473Z  92 │ if (!cardCoverage) { 2026-10-22T20:15:30.5963539Z  93 │ return; 2026-10-22T20:15:30.5963603Z  94 │ } 2026-10-22T20:15:30.5963775Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-22T20:15:30.5963878Z  96 │ if (coverage === cardCoverage.value) { 2026-10-22T20:15:30.5963941Z  97 │ return; 2026-10-22T20:15:30.5964017Z  98 │ } 2026-10-22T20:15:30.5964113Z  99 │ if (cardCoverage.value === 0) { 2026-10-22T20:15:30.5964202Z 100 │ cardCoverage.value = coverage; 2026-10-22T20:15:30.5964296Z ·  ──────┬───── 2026-10-22T20:15:30.5964558Z · ╰── `cardCoverage` cannot be modified 2026-10-22T20:15:30.5964715Z 101 │ return; 2026-10-22T20:15:30.5964770Z ╰──── 2026-10-22T20:15:30.5965089Z  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-22T20:15:30.5965415Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T20:15:30.5965417Z 2026-10-22T20:15:30.5965591Z ⚠ react(immutability): This value cannot be modified 2026-10-22T20:15:30.5965773Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7] 2026-10-22T20:15:30.5965862Z  89 │ const cardHeightRef = useRef(0); 2026-10-22T20:15:30.5965961Z  90 │ const cardHeight = useSharedValue(0); 2026-10-22T20:15:30.5966061Z ·  ─────┬──── 2026-10-22T20:15:30.5966221Z · ╰── `cardHeight` originates here 2026-10-22T20:15:30.5966324Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-22T20:15:30.5966411Z  92 │ if (!cardCoverage) { 2026-10-22T20:15:30.5966491Z  93 │ return; 2026-10-22T20:15:30.5966559Z  94 │ } 2026-10-22T20:15:30.5966718Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-22T20:15:30.5966830Z  96 │ if (coverage === cardCoverage.value) { 2026-10-22T20:15:30.5966902Z  97 │ return; 2026-10-22T20:15:30.5966963Z  98 │ } 2026-10-22T20:15:30.5967054Z  99 │ if (cardCoverage.value === 0) { 2026-10-22T20:15:30.5967154Z 100 │ cardCoverage.value = coverage; 2026-10-22T20:15:30.5967235Z 101 │ return; 2026-10-22T20:15:30.5967297Z 102 │ } 2026-10-22T20:15:30.5967412Z 103 │ cardCoverage.value = withTiming(coverage, { 2026-10-22T20:15:30.5967522Z 104 │ duration: USER_INPUT_TOGGLE_DURATION_MS, 2026-10-22T20:15:30.5967617Z 105 │ easing: Easing.out(Easing.cubic), 2026-10-22T20:15:30.5967681Z 106 │ }); 2026-10-22T20:15:30.5967768Z 107 │ }, [cardCoverage]); 2026-10-22T20:15:30.5967871Z 108 │ const handleBarLayout = useCallback( 2026-10-22T20:15:30.5967966Z 109 │ (event: LayoutChangeEvent) => { 2026-10-22T20:15:30.5968103Z 110 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-22T20:15:30.5968182Z 111 │ notifyCoverage(); 2026-10-22T20:15:30.5968252Z 112 │ }, 2026-10-22T20:15:30.5968331Z 113 │ [notifyCoverage], 2026-10-22T20:15:30.5968388Z 114 │ ); 2026-10-22T20:15:30.5968487Z 115 │ const handleCardLayout = useCallback( 2026-10-22T20:15:30.5968583Z 116 │ (event: LayoutChangeEvent) => { 2026-10-22T20:15:30.5968731Z 117 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-22T20:15:30.5968855Z 118 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-22T20:15:30.5968952Z ·  ─────┬──── 2026-10-22T20:15:30.5969107Z · ╰── `cardHeight` cannot be modified 2026-10-22T20:15:30.5969190Z 119 │ notifyCoverage(); 2026-10-22T20:15:30.5969249Z ╰──── 2026-10-22T20:15:30.5969535Z  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-22T20:15:30.5969859Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T20:15:30.5969862Z 2026-10-22T20:15:30.5970163Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-22T20:15:30.5970389Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-22T20:15:30.5970488Z  90 │ const cardHeight = useSharedValue(0); 2026-10-22T20:15:30.5970602Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-22T20:15:30.5970724Z ·  ───┬─── 2026-10-22T20:15:30.5970990Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-22T20:15:30.5971072Z  92 │ if (!cardCoverage) { 2026-10-22T20:15:30.5971143Z  93 │ return; 2026-10-22T20:15:30.5971213Z  94 │ } 2026-10-22T20:15:30.5971379Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-22T20:15:30.5971479Z  96 │ if (coverage === cardCoverage.value) { 2026-10-22T20:15:30.5971550Z  97 │ return; 2026-10-22T20:15:30.5971615Z  98 │ } 2026-10-22T20:15:30.5971699Z  99 │ if (cardCoverage.value === 0) { 2026-10-22T20:15:30.5971798Z 100 │ cardCoverage.value = coverage; 2026-10-22T20:15:30.5971901Z ·  ──────┬───── 2026-10-22T20:15:30.5972086Z · ╰── This modifies `cardCoverage` 2026-10-22T20:15:30.5972149Z 101 │ return; 2026-10-22T20:15:30.5972211Z ╰──── 2026-10-22T20:15:30.5972577Z  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-22T20:15:30.5972913Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T20:15:30.5972918Z 2026-10-22T20:15:30.5973134Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-22T20:15:30.5973307Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-22T20:15:30.5973400Z  99 │ if (cardCoverage.value === 0) { 2026-10-22T20:15:30.5973490Z 100 │ cardCoverage.value = coverage; 2026-10-22T20:15:30.5973575Z ·  ──────┬───── 2026-10-22T20:15:30.5973731Z · ╰── This modifies `cardCoverage` 2026-10-22T20:15:30.5973808Z 101 │ return; 2026-10-22T20:15:30.5973881Z 102 │ } 2026-10-22T20:15:30.5973991Z 103 │ cardCoverage.value = withTiming(coverage, { 2026-10-22T20:15:30.5974106Z 104 │ duration: USER_INPUT_TOGGLE_DURATION_MS, 2026-10-22T20:15:30.5974203Z 105 │ easing: Easing.out(Easing.cubic), 2026-10-22T20:15:30.5974276Z 106 │ }); 2026-10-22T20:15:30.5974347Z 107 │ }, [cardCoverage]); 2026-10-22T20:15:30.5974447Z 108 │ const handleBarLayout = useCallback( 2026-10-22T20:15:30.5974542Z 109 │ (event: LayoutChangeEvent) => { 2026-10-22T20:15:30.5974678Z ·  ───────────────┬─────────────── 2026-10-22T20:15:30.5974925Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-22T20:15:30.5975063Z 110 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-22T20:15:30.5975136Z ╰──── 2026-10-22T20:15:30.5975558Z  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-22T20:15:30.5975927Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T20:15:30.5975934Z 2026-10-22T20:15:30.5976148Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-22T20:15:30.5976321Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7] 2026-10-22T20:15:30.5976420Z 115 │ const handleCardLayout = useCallback( 2026-10-22T20:15:30.5976518Z 116 │ (event: LayoutChangeEvent) => { 2026-10-22T20:15:30.5976636Z ·  ───────────────┬─────────────── 2026-10-22T20:15:30.5976887Z · ╰── This function may (indirectly) reassign or modify `cardHeight` after render 2026-10-22T20:15:30.5977035Z 117 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-22T20:15:30.5977172Z 118 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-22T20:15:30.5977265Z ·  ─────┬──── 2026-10-22T20:15:30.5977416Z · ╰── This modifies `cardHeight` 2026-10-22T20:15:30.5977508Z 119 │ notifyCoverage(); 2026-10-22T20:15:30.5977577Z ╰──── 2026-10-22T20:15:30.5977933Z  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-22T20:15:30.5978263Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T20:15:30.5978266Z 2026-10-22T20:15:30.5978516Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-22T20:15:30.5978708Z ╭─[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:370:7] 2026-10-22T20:15:30.5978802Z 369 │ mountedRef.current = false; 2026-10-22T20:15:30.5978889Z 370 │ flow.setBranchQuery(""); 2026-10-22T20:15:30.5978972Z ·  ──┬─ 2026-10-22T20:15:30.5979118Z · ╰── Missing dependency `flow` 2026-10-22T20:15:30.5979182Z 371 │ }; 2026-10-22T20:15:30.5979267Z 372 │ }, [flow.setBranchQuery]); 2026-10-22T20:15:30.5979367Z ·  ─────────┬───────── 2026-10-22T20:15:30.5979597Z · ╰── Overly precise dependency `flow.setBranchQuery`, use `flow` instead 2026-10-22T20:15:30.5979660Z 373 │ 2026-10-22T20:15:30.5979724Z ╰──── 2026-10-22T20:15:30.5980256Z  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-22T20:15:30.5980608Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.5980611Z 2026-10-22T20:15:30.5980909Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.5981090Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:118:7] 2026-10-22T20:15:30.5981154Z 113 │ 2026-10-22T20:15:30.5981230Z 114 │ useEffect(() => { 2026-10-22T20:15:30.5981413Z ·  ────┬──── 2026-10-22T20:15:30.5981613Z · ╰── This is the containing effect 2026-10-22T20:15:30.5981720Z 115 │ if (orientationSettled) return; 2026-10-22T20:15:30.5981845Z 116 │ const orientation = getNativeShowcaseOrientation(); 2026-10-22T20:15:30.5981952Z 117 │ if (orientation === null) { 2026-10-22T20:15:30.5982047Z 118 │ setOrientationSettled(true); 2026-10-22T20:15:30.5982156Z ·  ──────────┬────────── 2026-10-22T20:15:30.5982348Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.5982422Z 119 │ return; 2026-10-22T20:15:30.5982476Z ╰──── 2026-10-22T20:15:30.5983114Z  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-22T20:15:30.5983463Z  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-22T20:15:30.5983466Z 2026-10-22T20:15:30.5983747Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.5983936Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:317:7] 2026-10-22T20:15:30.5984000Z 305 │ 2026-10-22T20:15:30.5984074Z 306 │ useEffect(() => { 2026-10-22T20:15:30.5984164Z ·  ────┬──── 2026-10-22T20:15:30.5984318Z · ╰── This is the containing effect 2026-10-22T20:15:30.5984387Z 307 │ if ( 2026-10-22T20:15:30.5984468Z 308 │ scene === null || 2026-10-22T20:15:30.5984558Z 309 │ requestedScene === null || 2026-10-22T20:15:30.5984647Z 310 │ scene !== requestedScene || 2026-10-22T20:15:30.5984721Z 311 │ !hasFixture || 2026-10-22T20:15:30.5984810Z 312 │ !orientationSettled || 2026-10-22T20:15:30.5984890Z 313 │ !themeApplied || 2026-10-22T20:15:30.5985020Z 314 │ (scene === "agent-activity" && !agentActivityStaged) || 2026-10-22T20:15:30.5985167Z 315 │ !isShowcaseNativeContentReady({ scene, themeId, renderSignal }) 2026-10-22T20:15:30.5985244Z 316 │ ) { 2026-10-22T20:15:30.5985325Z 317 │ setReadyScene(null); 2026-10-22T20:15:30.5985411Z ·  ──────┬────── 2026-10-22T20:15:30.5985613Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.5985696Z 318 │ return; 2026-10-22T20:15:30.5985757Z ╰──── 2026-10-22T20:15:30.5986386Z  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-22T20:15:30.5986724Z  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-22T20:15:30.5986727Z 2026-10-22T20:15:30.5987029Z ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'. 2026-10-22T20:15:30.5987280Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:123:9] 2026-10-22T20:15:30.5987431Z 122 │ let cancelled = false; 2026-10-22T20:15:30.5987530Z 123 │ let lastOutcome: string | null = null; 2026-10-22T20:15:30.5987619Z ·  ─────┬───── 2026-10-22T20:15:30.5987775Z · ╰── 'lastOutcome' is declared here 2026-10-22T20:15:30.5987974Z 124 │ void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), { 2026-10-22T20:15:30.5988034Z ╰──── 2026-10-22T20:15:30.5988144Z  help: Consider removing this declaration. 2026-10-22T20:15:30.5988147Z 2026-10-22T20:15:30.5988373Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-22T20:15:30.5988512Z ╭─[apps/web/src/contextMenuFallback.test.ts:38:9] 2026-10-22T20:15:30.5988601Z 37 │ get isConnected() { 2026-10-22T20:15:30.5988700Z 38 │ let current: FakeElement | null = this; 2026-10-22T20:15:30.5988787Z ·  ─────── 2026-10-22T20:15:30.5988883Z 39 │ while (current?.parent) { 2026-10-22T20:15:30.5988946Z ╰──── 2026-10-22T20:15:30.5989241Z  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-22T20:15:30.5989245Z 2026-10-22T20:15:30.5989526Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.5989692Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:402:5] 2026-10-22T20:15:30.5989754Z 400 │ 2026-10-22T20:15:30.5989826Z 401 │ useEffect(() => { 2026-10-22T20:15:30.5989913Z ·  ────┬──── 2026-10-22T20:15:30.5990065Z · ╰── This is the containing effect 2026-10-22T20:15:30.5990166Z 402 │ setInspectorSelection((current) => { 2026-10-22T20:15:30.5990259Z ·  ──────────┬────────── 2026-10-22T20:15:30.5990452Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.5990566Z 403 │ if (props.renderInspector === undefined) { 2026-10-22T20:15:30.5990625Z ╰──── 2026-10-22T20:15:30.5991249Z  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-22T20:15:30.5991646Z  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-22T20:15:30.5991688Z 2026-10-22T20:15:30.5991951Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-22T20:15:30.5992121Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:530:24] 2026-10-22T20:15:30.5992293Z 529 │ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top; 2026-10-22T20:15:30.5992477Z 530 │ ╭─▶ const GitInspector = () => ( 2026-10-22T20:15:30.5992590Z 531 │ │ 2026-10-22T20:15:30.5993274Z 536 │ ╰─▶ ); 2026-10-22T20:15:30.5993371Z 537 │ const FilesInspector = () => 2026-10-22T20:15:30.5993427Z ╰──── 2026-10-22T20:15:30.5993662Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-22T20:15:30.5993665Z 2026-10-22T20:15:30.5993896Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-22T20:15:30.5994066Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:537:26] 2026-10-22T20:15:30.5994143Z 536 │ ); 2026-10-22T20:15:30.5994324Z 537 │ ╭─▶ const FilesInspector = () => 2026-10-22T20:15:30.5994490Z 538 │ │ selectedThread !== null && selectedThreadCwd !== null ? ( 2026-10-22T20:15:30.5994609Z 539 │ │ 2026-10-22T20:15:30.5995699Z 547 │ ╰─▶ ) : null; 2026-10-22T20:15:30.5995866Z 548 │ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset); 2026-10-22T20:15:30.5995922Z ╰──── 2026-10-22T20:15:30.5996152Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-22T20:15:30.5996154Z 2026-10-22T20:15:30.5996357Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-22T20:15:30.5996526Z ╭─[apps/mobile/src/features/threads/ThreadQueueControl.tsx:602:27] 2026-10-22T20:15:30.5996765Z 601 │ const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success)); 2026-10-22T20:15:30.5996892Z 602 │ const gesture = Gesture.Pan() 2026-10-22T20:15:30.5996990Z ·  ─┬─ 2026-10-22T20:15:30.5997148Z · ╰── `Pan` may be a component 2026-10-22T20:15:30.5997230Z 603 │ .enabled(!props.disabled) 2026-10-22T20:15:30.5997290Z ╰──── 2026-10-22T20:15:30.5997582Z  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-22T20:15:30.5998047Z  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-22T20:15:30.5998050Z 2026-10-22T20:15:30.5998298Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-22T20:15:30.5998432Z ╭─[apps/server/src/terminal/Manager.test.ts:731:31] 2026-10-22T20:15:30.5998498Z 730 │ ); 2026-10-22T20:15:30.5998681Z 731 │ const snapshot = events.filter((event) => event.type === "snapshot").at(-1)?.snapshot; 2026-10-22T20:15:30.5998792Z ·  ────── 2026-10-22T20:15:30.5999018Z 732 │ expect(snapshot?.history).toBe("aa😀\rEND"); 2026-10-22T20:15:30.5999082Z ╰──── 2026-10-22T20:15:30.5999264Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-22T20:15:30.5999267Z 2026-10-22T20:15:30.5999549Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.5999721Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:508:5] 2026-10-22T20:15:30.5999791Z 506 │ }, []); 2026-10-22T20:15:30.5999865Z 507 │ useEffect(() => { 2026-10-22T20:15:30.5999946Z ·  ────┬──── 2026-10-22T20:15:30.6000091Z · ╰── This is the containing effect 2026-10-22T20:15:30.6000188Z 508 │ setKeyboardStateSuspect(false); 2026-10-22T20:15:30.6000301Z ·  ───────────┬─────────── 2026-10-22T20:15:30.6000498Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.6000608Z 509 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-22T20:15:30.6000668Z ╰──── 2026-10-22T20:15:30.6001310Z  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-22T20:15:30.6001674Z  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-22T20:15:30.6001678Z 2026-10-22T20:15:30.6002019Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.6002194Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:868:7] 2026-10-22T20:15:30.6002380Z 865 │ const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0); 2026-10-22T20:15:30.6002470Z 866 │ useEffect(() => { 2026-10-22T20:15:30.6002568Z ·  ────┬──── 2026-10-22T20:15:30.6002807Z · ╰── This is the containing effect 2026-10-22T20:15:30.6003073Z 867 │ if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) { 2026-10-22T20:15:30.6003214Z 868 │ setLastKnownKeyboardHeight(liveKeyboardHeight); 2026-10-22T20:15:30.6003340Z ·  ─────────────┬──────────── 2026-10-22T20:15:30.6003535Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.6003623Z 869 │ } 2026-10-22T20:15:30.6003700Z ╰──── 2026-10-22T20:15:30.6004346Z  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-22T20:15:30.6004690Z  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-22T20:15:30.6004692Z 2026-10-22T20:15:30.6004977Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.6005155Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1115:5] 2026-10-22T20:15:30.6005218Z 1113 │ 2026-10-22T20:15:30.6005295Z 1114 │ useEffect(() => { 2026-10-22T20:15:30.6005372Z ·  ────┬──── 2026-10-22T20:15:30.6005533Z · ╰── This is the containing effect 2026-10-22T20:15:30.6005627Z 1115 │ setAnchorMessageId(null); 2026-10-22T20:15:30.6005748Z ·  ─────────┬──────── 2026-10-22T20:15:30.6005943Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.6006041Z 1116 │ setSubmittedMessageId(null); 2026-10-22T20:15:30.6006101Z ╰──── 2026-10-22T20:15:30.6006724Z  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-22T20:15:30.6007062Z  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-22T20:15:30.6007065Z 2026-10-22T20:15:30.6007283Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T20:15:30.6007450Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:509:7] 2026-10-22T20:15:30.6007552Z 508 │ setKeyboardStateSuspect(false); 2026-10-22T20:15:30.6007659Z 509 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-22T20:15:30.6007818Z ·  ────────┬──────── ─────────┬──────── 2026-10-22T20:15:30.6008046Z · │ ╰── Unnecessary dependency `liveKeyboardHeight` 2026-10-22T20:15:30.6008227Z · ╰── Unnecessary dependency `isKeyboardVisible` 2026-10-22T20:15:30.6008366Z 510 │ const handleOwnedInputFocusChange = (focused: boolean) => { 2026-10-22T20:15:30.6008427Z ╰──── 2026-10-22T20:15:30.6008805Z  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-22T20:15:30.6009186Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.6009189Z 2026-10-22T20:15:30.6009406Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T20:15:30.6009588Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1063:7] 2026-10-22T20:15:30.6009683Z 1062 │ userInputInsetProgress.set(1); 2026-10-22T20:15:30.6009860Z 1063 │ }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]); 2026-10-22T20:15:30.6009972Z ·  ────────────┬─────────── 2026-10-22T20:15:30.6010179Z · ╰── Unnecessary dependency `activeUserInputRequestId` 2026-10-22T20:15:30.6010299Z 1064 │ const showContent = props.showContent ?? true; 2026-10-22T20:15:30.6010358Z ╰──── 2026-10-22T20:15:30.6010674Z  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-22T20:15:30.6011002Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.6011005Z 2026-10-22T20:15:30.6011224Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T20:15:30.6011391Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1121:15] 2026-10-22T20:15:30.6011472Z 1120 │ freeze.set(false); 2026-10-22T20:15:30.6011570Z 1121 │ }, [freeze, selectedThreadKey]); 2026-10-22T20:15:30.6011674Z ·  ────────┬──────── 2026-10-22T20:15:30.6011849Z · ╰── Unnecessary dependency `selectedThreadKey` 2026-10-22T20:15:30.6011937Z 1122 │ 2026-10-22T20:15:30.6011997Z ╰──── 2026-10-22T20:15:30.6012305Z  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-22T20:15:30.6012629Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.6012631Z 2026-10-22T20:15:30.6012805Z ⚠ react(immutability): This value cannot be modified 2026-10-22T20:15:30.6012980Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:951:5] 2026-10-22T20:15:30.6013102Z 946 │ const composerPopoverHeight = useSharedValue(0); 2026-10-22T20:15:30.6013224Z 947 │ const floatingControlCoverage = useSharedValue( 2026-10-22T20:15:30.6013332Z ·  ───────────┬─────────── 2026-10-22T20:15:30.6013524Z · ╰── `floatingControlCoverage` originates here 2026-10-22T20:15:30.6013659Z 948 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-22T20:15:30.6013725Z 949 │ ); 2026-10-22T20:15:30.6013809Z 950 │ useEffect(() => { 2026-10-22T20:15:30.6013924Z 951 │ floatingControlCoverage.value = withTiming( 2026-10-22T20:15:30.6014037Z ·  ───────────┬─────────── 2026-10-22T20:15:30.6014301Z · ╰── `floatingControlCoverage` cannot be modified 2026-10-22T20:15:30.6014512Z 952 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-22T20:15:30.6014589Z ╰──── 2026-10-22T20:15:30.6014871Z  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-22T20:15:30.6015193Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T20:15:30.6015197Z 2026-10-22T20:15:30.6015363Z ⚠ react(immutability): This value cannot be modified 2026-10-22T20:15:30.6015529Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:969:7] 2026-10-22T20:15:30.6015742Z 959 │ const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null; 2026-10-22T20:15:30.6015885Z 960 │ const combinedContentInsetEndAdjustment = useSharedValue( 2026-10-22T20:15:30.6016012Z ·  ────────────────┬──────────────── 2026-10-22T20:15:30.6016220Z · ╰── `combinedContentInsetEndAdjustment` originates here 2026-10-22T20:15:30.6016365Z 961 │ Math.max(0, estimatedOverlayHeight - nativeInsetOvercount), 2026-10-22T20:15:30.6016428Z 962 │ ); 2026-10-22T20:15:30.6016503Z 963 │ useAnimatedReaction( 2026-10-22T20:15:30.6016576Z 964 │ () => 2026-10-22T20:15:30.6016679Z 965 │ contentInsetEndAdjustment.value + 2026-10-22T20:15:30.6016776Z 966 │ floatingControlCoverage.value + 2026-10-22T20:15:30.6016980Z 967 │ (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0), 2026-10-22T20:15:30.6017053Z 968 │ (value) => { 2026-10-22T20:15:30.6017188Z 969 │ combinedContentInsetEndAdjustment.value = value; 2026-10-22T20:15:30.6017322Z ·  ────────────────┬──────────────── 2026-10-22T20:15:30.6017525Z · ╰── `combinedContentInsetEndAdjustment` cannot be modified 2026-10-22T20:15:30.6017594Z 970 │ }, 2026-10-22T20:15:30.6017654Z ╰──── 2026-10-22T20:15:30.6017933Z  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-22T20:15:30.6018251Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T20:15:30.6018257Z 2026-10-22T20:15:30.6018595Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.6018808Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:361:7] 2026-10-22T20:15:30.6018957Z 355 │ }, [cancelledIncomingShareId, navigation, props.incomingShareId]); 2026-10-22T20:15:30.6019035Z 356 │ useEffect(() => { 2026-10-22T20:15:30.6019114Z ·  ────┬──── 2026-10-22T20:15:30.6019260Z · ╰── This is the containing effect 2026-10-22T20:15:30.6019358Z 357 │ if (!isReturningToProjectPicker) { 2026-10-22T20:15:30.6019430Z 358 │ return; 2026-10-22T20:15:30.6019491Z 359 │ } 2026-10-22T20:15:30.6019610Z 360 │ if (requestedInitialProjectAvailable) { 2026-10-22T20:15:30.6019717Z 361 │ setIsReturningToProjectPicker(false); 2026-10-22T20:15:30.6019835Z ·  ──────────────┬────────────── 2026-10-22T20:15:30.6020041Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.6020113Z 362 │ return; 2026-10-22T20:15:30.6020186Z ╰──── 2026-10-22T20:15:30.6020876Z  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-22T20:15:30.6021212Z  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-22T20:15:30.6021216Z 2026-10-22T20:15:30.6021495Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.6021662Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:504:9] 2026-10-22T20:15:30.6021723Z 447 │ 2026-10-22T20:15:30.6021792Z 448 │ useEffect(() => { 2026-10-22T20:15:30.6021900Z ·  ────┬──── 2026-10-22T20:15:30.6022056Z · ╰── This is the containing effect 2026-10-22T20:15:30.6022176Z 449 │ if (props.pendingTaskId || props.draftId) { 2026-10-22T20:15:30.6022240Z 450 │ return; 2026-10-22T20:15:30.6022313Z 451 │ } 2026-10-22T20:15:30.6022466Z 452 │ if (lastInitialProjectRefRef.current !== props.initialProjectRef) { 2026-10-22T20:15:30.6022612Z 453 │ lastInitialProjectRefRef.current = props.initialProjectRef; 2026-10-22T20:15:30.6022725Z 454 │ appliedInitialProjectKeyRef.current = null; 2026-10-22T20:15:30.6022795Z 455 │ } 2026-10-22T20:15:30.6022957Z 456 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-22T20:15:30.6023100Z 457 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-22T20:15:30.6023212Z 458 │ if (initialEnvironmentId && initialProjectId) { 2026-10-22T20:15:30.6023295Z 459 │ const directProject = 2026-10-22T20:15:30.6023377Z 460 │ projects.find( 2026-10-22T20:15:30.6023455Z 461 │ (project) => 2026-10-22T20:15:30.6023638Z 462 │ project.environmentId === initialEnvironmentId && project.id === initialProjectId, 2026-10-22T20:15:30.6023720Z 463 │ ) ?? null; 2026-10-22T20:15:30.6023780Z 464 │ 2026-10-22T20:15:30.6023858Z 465 │ if (directProject) { 2026-10-22T20:15:30.6024013Z 466 │ // Apply the route's project once. Re-applying on every change would 2026-10-22T20:15:30.6024280Z 467 │ // instantly revert environment/project switches made in the picker. 2026-10-22T20:15:30.6024534Z 468 │ const directProjectKey = `${directProject.environmentId}:${directProject.id}`; 2026-10-22T20:15:30.6024687Z 469 │ if (appliedInitialProjectKeyRef.current === directProjectKey) { 2026-10-22T20:15:30.6024752Z 470 │ return; 2026-10-22T20:15:30.6024827Z 471 │ } 2026-10-22T20:15:30.6024938Z 472 │ if (props.initialProjectRef?.branch) { 2026-10-22T20:15:30.6025009Z 473 │ if ( 2026-10-22T20:15:30.6025167Z 474 │ selectedProject?.environmentId !== directProject.environmentId || 2026-10-22T20:15:30.6025284Z 475 │ selectedProject.id !== directProject.id 2026-10-22T20:15:30.6025360Z 476 │ ) { 2026-10-22T20:15:30.6025622Z 477 │ setProject(directProject); 2026-10-22T20:15:30.6025732Z 478 │ return; 2026-10-22T20:15:30.6025846Z 479 │ } 2026-10-22T20:15:30.6025997Z 480 │ if (!flow.draftKey) return; 2026-10-22T20:15:30.6026166Z 481 │ // The route completes checkout before mounting this composer. Local 2026-10-22T20:15:30.6026662Z 482 │ // mode reuses an existing worktree; worktree mode would create another. 2026-10-22T20:15:30.6026822Z 483 │ updateComposerDraftSettings(flow.draftKey, { 2026-10-22T20:15:30.6026932Z 484 │ workspaceSelection: { 2026-10-22T20:15:30.6051616Z 485 │ mode: "local", 2026-10-22T20:15:30.6051972Z 486 │ branch: props.initialProjectRef.branch, 2026-10-22T20:15:30.6052137Z 487 │ worktreePath: props.initialProjectRef.worktreePath ?? null, 2026-10-22T20:15:30.6052242Z 488 │ startFromOrigin: false, 2026-10-22T20:15:30.6052320Z 489 │ }, 2026-10-22T20:15:30.6052413Z 490 │ }); 2026-10-22T20:15:30.6052498Z 491 │ } 2026-10-22T20:15:30.6052643Z 492 │ appliedInitialProjectKeyRef.current = directProjectKey; 2026-10-22T20:15:30.6052719Z 493 │ if ( 2026-10-22T20:15:30.6052875Z 494 │ selectedProject?.environmentId === directProject.environmentId && 2026-10-22T20:15:30.6052996Z 495 │ selectedProject.id === directProject.id 2026-10-22T20:15:30.6053072Z 496 │ ) { 2026-10-22T20:15:30.6053159Z 497 │ return; 2026-10-22T20:15:30.6053224Z 498 │ } 2026-10-22T20:15:30.6053325Z 499 │ setProject(directProject); 2026-10-22T20:15:30.6053400Z 500 │ return; 2026-10-22T20:15:30.6053463Z 501 │ } 2026-10-22T20:15:30.6053520Z 502 │ 2026-10-22T20:15:30.6053610Z 503 │ if (projects.length > 0) { 2026-10-22T20:15:30.6053720Z 504 │ setIsReturningToProjectPicker(true); 2026-10-22T20:15:30.6053861Z ·  ──────────────┬────────────── 2026-10-22T20:15:30.6054096Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.6054169Z 505 │ } 2026-10-22T20:15:30.6054238Z ╰──── 2026-10-22T20:15:30.6054872Z  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-22T20:15:30.6055219Z  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-22T20:15:30.6055223Z 2026-10-22T20:15:30.6055783Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.6056018Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:604:5] 2026-10-22T20:15:30.6056082Z 545 │ 2026-10-22T20:15:30.6056155Z 546 │ useEffect(() => { 2026-10-22T20:15:30.6056244Z ·  ────┬──── 2026-10-22T20:15:30.6056419Z · ╰── This is the containing effect 2026-10-22T20:15:30.6056529Z 547 │ const shareId = props.incomingShareId; 2026-10-22T20:15:30.6056618Z 548 │ const draftKey = flow.draftKey; 2026-10-22T20:15:30.6056734Z 549 │ const destinationProject = selectedProject; 2026-10-22T20:15:30.6056900Z 550 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-22T20:15:30.6057054Z 551 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-22T20:15:30.6057151Z 552 │ const selectedProjectMatchesRoute = 2026-10-22T20:15:30.6057242Z 553 │ !initialEnvironmentId || 2026-10-22T20:15:30.6057329Z 554 │ !initialProjectId || 2026-10-22T20:15:30.6057475Z 555 │ (destinationProject?.environmentId === initialEnvironmentId && 2026-10-22T20:15:30.6057593Z 556 │ destinationProject.id === initialProjectId); 2026-10-22T20:15:30.6057669Z 557 │ if ( 2026-10-22T20:15:30.6057751Z 558 │ !shareId || 2026-10-22T20:15:30.6057832Z 559 │ !draftKey || 2026-10-22T20:15:30.6057915Z 560 │ !destinationProject || 2026-10-22T20:15:30.6058017Z 561 │ !selectedProjectMatchesRoute || 2026-10-22T20:15:30.6058129Z 562 │ cancelledIncomingShareId === shareId 2026-10-22T20:15:30.6058202Z 563 │ ) { 2026-10-22T20:15:30.6058285Z 564 │ return; 2026-10-22T20:15:30.6058358Z 565 │ } 2026-10-22T20:15:30.6058473Z 566 │ const importKey = `${shareId}:${draftKey}`; 2026-10-22T20:15:30.6058551Z 567 │ if ( 2026-10-22T20:15:30.6058676Z 568 │ startedShareImportKeyRef.current === importKey || 2026-10-22T20:15:30.6058808Z 569 │ cancellingShareImportKeyRef.current === importKey 2026-10-22T20:15:30.6058875Z 570 │ ) { 2026-10-22T20:15:30.6058940Z 571 │ return; 2026-10-22T20:15:30.6059010Z 572 │ } 2026-10-22T20:15:30.6059075Z 573 │ 2026-10-22T20:15:30.6059166Z 574 │ if (!incomingShare) { 2026-10-22T20:15:30.6059375Z 575 │ if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) { 2026-10-22T20:15:30.6059522Z 576 │ alertedUnavailableIncomingShareIdRef.current = shareId; 2026-10-22T20:15:30.6059597Z 577 │ Dialog.alert( 2026-10-22T20:15:30.6059704Z 578 │ "Shared content unavailable", 2026-10-22T20:15:30.6059889Z 579 │ "The shared content is no longer in the inbox. You can continue editing this task draft.", 2026-10-22T20:15:30.6059967Z 580 │ ); 2026-10-22T20:15:30.6060035Z 581 │ } 2026-10-22T20:15:30.6060102Z 582 │ return; 2026-10-22T20:15:30.6060268Z 583 │ } 2026-10-22T20:15:30.6060338Z 584 │ 2026-10-22T20:15:30.6060404Z 585 │ if ( 2026-10-22T20:15:30.6060582Z 586 │ incomingShare.attachments.some((attachment) => attachment.type === "file") && 2026-10-22T20:15:30.6060689Z 587 │ selectedEnvironmentServerConfig === null 2026-10-22T20:15:30.6060769Z 588 │ ) { 2026-10-22T20:15:30.6060841Z 589 │ return; 2026-10-22T20:15:30.6060906Z 590 │ } 2026-10-22T20:15:30.6060963Z 591 │ 2026-10-22T20:15:30.6061123Z 592 │ if (alertedUnavailableIncomingShareIdRef.current === shareId) { 2026-10-22T20:15:30.6061390Z 593 │ alertedUnavailableIncomingShareIdRef.current = null; 2026-10-22T20:15:30.6061505Z 594 │ } 2026-10-22T20:15:30.6061630Z 595 │ startedShareImportKeyRef.current = importKey; 2026-10-22T20:15:30.6061713Z 596 │ const draftBackup = 2026-10-22T20:15:30.6061944Z 597 │ shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey); 2026-10-22T20:15:30.6062097Z 598 │ shareImportDraftBackupRef.current.set(importKey, draftBackup); 2026-10-22T20:15:30.6062206Z 599 │ const importToken = Symbol(importKey); 2026-10-22T20:15:30.6062305Z 600 │ let didReserveShare = false; 2026-10-22T20:15:30.6062394Z 601 │ let didConsumeShare = false; 2026-10-22T20:15:30.6062482Z 602 │ let needsDraftRestore = false; 2026-10-22T20:15:30.6062614Z 603 │ activeShareImportTokenRef.current = importToken; 2026-10-22T20:15:30.6062721Z 604 │ setImportingShareKey(importKey); 2026-10-22T20:15:30.6062832Z ·  ──────────┬───────── 2026-10-22T20:15:30.6063023Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.6063102Z 605 │ void (async () => { 2026-10-22T20:15:30.6063166Z ╰──── 2026-10-22T20:15:30.6063801Z  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-22T20:15:30.6064152Z  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-22T20:15:30.6064155Z 2026-10-22T20:15:30.6064395Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T20:15:30.6064568Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:524:5] 2026-10-22T20:15:30.6064669Z 523 │ props.initialProjectRef, 2026-10-22T20:15:30.6064751Z 524 │ props.incomingShareId, 2026-10-22T20:15:30.6064850Z ·  ──────────┬────────── 2026-10-22T20:15:30.6065045Z · ╰── Unnecessary dependency `props.incomingShareId` 2026-10-22T20:15:30.6065123Z 525 │ props.pendingTaskId, 2026-10-22T20:15:30.6065193Z ╰──── 2026-10-22T20:15:30.6065502Z  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-22T20:15:30.6065839Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.6065844Z 2026-10-22T20:15:30.6066083Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-22T20:15:30.6066262Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:543:5] 2026-10-22T20:15:30.6066398Z 542 │ loadedBranchesProjectKeyRef.current = projectKey; 2026-10-22T20:15:30.6066479Z 543 │ flow.loadBranches(); 2026-10-22T20:15:30.6066568Z ·  ──┬─ 2026-10-22T20:15:30.6066711Z · ╰── Missing dependency `flow` 2026-10-22T20:15:30.6066817Z 544 │ }, [flow.loadBranches, selectedProject]); 2026-10-22T20:15:30.6066913Z ·  ────────┬──────── 2026-10-22T20:15:30.6067218Z · ╰── Overly precise dependency `flow.loadBranches`, use `flow` instead 2026-10-22T20:15:30.6067336Z 545 │ 2026-10-22T20:15:30.6067401Z ╰──── 2026-10-22T20:15:30.6067839Z  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-22T20:15:30.6068171Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.6068174Z 2026-10-22T20:15:30.6068393Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T20:15:30.6068561Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:766:5] 2026-10-22T20:15:30.6068644Z 765 │ flow.draftKey, 2026-10-22T20:15:30.6068734Z 766 │ hasImportedIncomingShare, 2026-10-22T20:15:30.6068849Z ·  ────────────┬─────────── 2026-10-22T20:15:30.6069043Z · ╰── Unnecessary dependency `hasImportedIncomingShare` 2026-10-22T20:15:30.6069113Z 767 │ incomingShare, 2026-10-22T20:15:30.6069212Z 768 │ isIncomingShareInboxLoading, 2026-10-22T20:15:30.6069321Z ·  ─────────────┬───────────── 2026-10-22T20:15:30.6069522Z · ╰── Unnecessary dependency `isIncomingShareInboxLoading` 2026-10-22T20:15:30.6069611Z 769 │ isIncomingShareUnavailable, 2026-10-22T20:15:30.6069698Z 770 │ props.incomingShareId, 2026-10-22T20:15:30.6069805Z 771 │ props.initialProjectRef?.environmentId, 2026-10-22T20:15:30.6069925Z 772 │ props.initialProjectRef?.projectId, 2026-10-22T20:15:30.6070009Z 773 │ releaseShareReservation, 2026-10-22T20:15:30.6070089Z 774 │ reserveShare, 2026-10-22T20:15:30.6070189Z 775 │ selectedEnvironmentServerConfig, 2026-10-22T20:15:30.6070270Z 776 │ selectedProject, 2026-10-22T20:15:30.6070353Z 777 │ shareImportAttempt, 2026-10-22T20:15:30.6070453Z ·  ─────────┬──────── 2026-10-22T20:15:30.6070637Z · ╰── Unnecessary dependency `shareImportAttempt` 2026-10-22T20:15:30.6070701Z 778 │ ]); 2026-10-22T20:15:30.6070765Z ╰──── 2026-10-22T20:15:30.6071089Z  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-22T20:15:30.6071420Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.6071425Z 2026-10-22T20:15:30.6071711Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.6071906Z ╭─[apps/mobile/src/features/threads/use-worktree-setup.ts:30:40] 2026-10-22T20:15:30.6072078Z 28 │ const snapshot = resolveWorktreeSetupSnapshot(input.threadId, query.data, live); 2026-10-22T20:15:30.6072157Z 29 │ useEffect(() => { 2026-10-22T20:15:30.6072244Z ·  ────┬──── 2026-10-22T20:15:30.6072405Z · ╰── This is the containing effect 2026-10-22T20:15:30.6072537Z 30 │ if (snapshot && snapshot !== live) setHeld({ key, snapshot }); 2026-10-22T20:15:30.6072752Z ·  ───┬─── 2026-10-22T20:15:30.6073014Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.6073095Z 31 │ }, [key, live, snapshot]); 2026-10-22T20:15:30.6073157Z ╰──── 2026-10-22T20:15:30.6073796Z  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-22T20:15:30.6074144Z  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-22T20:15:30.6074147Z 2026-10-22T20:15:30.6074324Z ⚠ react(immutability): This value cannot be modified 2026-10-22T20:15:30.6074503Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:111:5] 2026-10-22T20:15:30.6074563Z 107 │ ); 2026-10-22T20:15:30.6074728Z 108 │ const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0); 2026-10-22T20:15:30.6074828Z ·  ─────────┬──────── 2026-10-22T20:15:30.6074992Z · ╰── `separationProgress` originates here 2026-10-22T20:15:30.6075049Z 109 │ 2026-10-22T20:15:30.6075122Z 110 │ useEffect(() => { 2026-10-22T20:15:30.6075308Z 111 │ separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING); 2026-10-22T20:15:30.6075402Z ·  ─────────┬──────── 2026-10-22T20:15:30.6075572Z · ╰── `separationProgress` cannot be modified 2026-10-22T20:15:30.6075694Z 112 │ }, [props.showScrollToEnd, separationProgress]); 2026-10-22T20:15:30.6075753Z ╰──── 2026-10-22T20:15:30.6076033Z  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-22T20:15:30.6076347Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T20:15:30.6076350Z 2026-10-22T20:15:30.6076519Z ⚠ react(immutability): This value cannot be modified 2026-10-22T20:15:30.6076697Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-22T20:15:30.6076819Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-22T20:15:30.6076997Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-22T20:15:30.6077127Z ·  ──────┬───── 2026-10-22T20:15:30.6077281Z · ╰── `capsuleWidth` originates here 2026-10-22T20:15:30.6077402Z 130 │ const measuredWidthRef = useRef(null); 2026-10-22T20:15:30.6077525Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-22T20:15:30.6077640Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-22T20:15:30.6077748Z 133 │ if (width === measuredWidthRef.current) { 2026-10-22T20:15:30.6077814Z 134 │ return; 2026-10-22T20:15:30.6077872Z 135 │ } 2026-10-22T20:15:30.6077988Z 136 │ const first = measuredWidthRef.current === null; 2026-10-22T20:15:30.6078080Z 137 │ measuredWidthRef.current = width; 2026-10-22T20:15:30.6078233Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-22T20:15:30.6078320Z ·  ──────┬───── 2026-10-22T20:15:30.6078478Z · ╰── `capsuleWidth` cannot be modified 2026-10-22T20:15:30.6078540Z 139 │ }; 2026-10-22T20:15:30.6078599Z ╰──── 2026-10-22T20:15:30.6078873Z  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-22T20:15:30.6079190Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T20:15:30.6079193Z 2026-10-22T20:15:30.6079361Z ⚠ react(immutability): This value cannot be modified 2026-10-22T20:15:30.6079538Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-22T20:15:30.6079666Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-22T20:15:30.6079788Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-22T20:15:30.6079879Z ·  ──────┬───── 2026-10-22T20:15:30.6080030Z · ╰── `capsuleWidth` originates here 2026-10-22T20:15:30.6080149Z 130 │ const measuredWidthRef = useRef(null); 2026-10-22T20:15:30.6080270Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-22T20:15:30.6080385Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-22T20:15:30.6080487Z 133 │ if (width === measuredWidthRef.current) { 2026-10-22T20:15:30.6080554Z 134 │ return; 2026-10-22T20:15:30.6080610Z 135 │ } 2026-10-22T20:15:30.6080725Z 136 │ const first = measuredWidthRef.current === null; 2026-10-22T20:15:30.6080824Z 137 │ measuredWidthRef.current = width; 2026-10-22T20:15:30.6080976Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-22T20:15:30.6081032Z 139 │ }; 2026-10-22T20:15:30.6081137Z 140 │ const hasStatus = props.status !== null; 2026-10-22T20:15:30.6081282Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-22T20:15:30.6081352Z 142 │ useEffect(() => { 2026-10-22T20:15:30.6081426Z 143 │ if (!hasStatus) { 2026-10-22T20:15:30.6081521Z 144 │ measuredWidthRef.current = null; 2026-10-22T20:15:30.6081608Z 145 │ capsuleWidth.value = null; 2026-10-22T20:15:30.6081690Z ·  ──────┬───── 2026-10-22T20:15:30.6081846Z · ╰── `capsuleWidth` cannot be modified 2026-10-22T20:15:30.6081947Z 146 │ } 2026-10-22T20:15:30.6082009Z ╰──── 2026-10-22T20:15:30.6082354Z  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-22T20:15:30.6082719Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T20:15:30.6082722Z 2026-10-22T20:15:30.6082940Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-22T20:15:30.6083116Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-22T20:15:30.6083262Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-22T20:15:30.6083331Z 142 │ useEffect(() => { 2026-10-22T20:15:30.6083416Z ·  ───┬─── 2026-10-22T20:15:30.6083664Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-22T20:15:30.6083743Z 143 │ if (!hasStatus) { 2026-10-22T20:15:30.6083840Z 144 │ measuredWidthRef.current = null; 2026-10-22T20:15:30.6083929Z 145 │ capsuleWidth.value = null; 2026-10-22T20:15:30.6084017Z ·  ──────┬───── 2026-10-22T20:15:30.6084169Z · ╰── This modifies `capsuleWidth` 2026-10-22T20:15:30.6084227Z 146 │ } 2026-10-22T20:15:30.6084287Z ╰──── 2026-10-22T20:15:30.6084649Z  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-22T20:15:30.6084971Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T20:15:30.6084976Z 2026-10-22T20:15:30.6085186Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-22T20:15:30.6085362Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-22T20:15:30.6085486Z 130 │ const measuredWidthRef = useRef(null); 2026-10-22T20:15:30.6085613Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-22T20:15:30.6085748Z ·  ───────────────┬─────────────── 2026-10-22T20:15:30.6086009Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-22T20:15:30.6086128Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-22T20:15:30.6086240Z 133 │ if (width === measuredWidthRef.current) { 2026-10-22T20:15:30.6086313Z 134 │ return; 2026-10-22T20:15:30.6086369Z 135 │ } 2026-10-22T20:15:30.6086490Z 136 │ const first = measuredWidthRef.current === null; 2026-10-22T20:15:30.6086585Z 137 │ measuredWidthRef.current = width; 2026-10-22T20:15:30.6086734Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-22T20:15:30.6086820Z ·  ──────┬───── 2026-10-22T20:15:30.6086970Z · ╰── This modifies `capsuleWidth` 2026-10-22T20:15:30.6087034Z 139 │ }; 2026-10-22T20:15:30.6087088Z ╰──── 2026-10-22T20:15:30.6087441Z  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-22T20:15:30.6087818Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T20:15:30.6087863Z 2026-10-22T20:15:30.6088358Z ⚠ 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-22T20:15:30.6088498Z ╭─[packages/shared/src/atomicWrite.test.ts:139:5] 2026-10-22T20:15:30.6088582Z 138 │ Effect.gen(function* () { 2026-10-22T20:15:30.6088800Z 139 │ ╭─▶ while (fiber.pollUnsafe() === undefined) { 2026-10-22T20:15:30.6088945Z 140 │ │ yield* TestClock.adjust("100 millis"); 2026-10-22T20:15:30.6089303Z 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-22T20:15:30.6089515Z 142 │ │ yield* Effect.promise(() => new Promise((resolve) => setImmediate(resolve))); 2026-10-22T20:15:30.6089655Z 143 │ ╰─▶ } 2026-10-22T20:15:30.6089755Z 144 │ return yield* Fiber.join(fiber); 2026-10-22T20:15:30.6089817Z ╰──── 2026-10-22T20:15:30.6089820Z 2026-10-22T20:15:30.6090092Z ⚠ eslint(no-unused-vars): Function 'normalizeTerminalContextSelection' is declared but never used. 2026-10-22T20:15:30.6090217Z ╭─[apps/web/src/lib/terminalContext.ts:56:10] 2026-10-22T20:15:30.6090283Z 55 │ 2026-10-22T20:15:30.6090391Z 56 │ function normalizeTerminalContextSelection( 2026-10-22T20:15:30.6090524Z ·  ────────────────┬──────────────── 2026-10-22T20:15:30.6090730Z · ╰── 'normalizeTerminalContextSelection' is declared here 2026-10-22T20:15:30.6090830Z 57 │ selection: TerminalContextSelection, 2026-10-22T20:15:30.6090895Z ╰──── 2026-10-22T20:15:30.6091010Z  help: Consider removing this declaration. 2026-10-22T20:15:30.6091012Z 2026-10-22T20:15:30.6091283Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.6091435Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2109:5] 2026-10-22T20:15:30.6091501Z 2107 │ ); 2026-10-22T20:15:30.6091581Z 2108 │ useEffect(() => { 2026-10-22T20:15:30.6091660Z ·  ────┬──── 2026-10-22T20:15:30.6091815Z · ╰── This is the containing effect 2026-10-22T20:15:30.6091964Z 2109 │ setExpandedVideo(null); 2026-10-22T20:15:30.6092057Z ·  ────────┬─────── 2026-10-22T20:15:30.6092245Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.6092334Z 2110 │ setExpandedFile(null); 2026-10-22T20:15:30.6092392Z ╰──── 2026-10-22T20:15:30.6093023Z  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-22T20:15:30.6093471Z  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-22T20:15:30.6093515Z 2026-10-22T20:15:30.6093760Z ⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used. 2026-10-22T20:15:30.6093907Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:62:10] 2026-10-22T20:15:30.6094055Z 61 │ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets"; 2026-10-22T20:15:30.6094220Z 62 │ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks"; 2026-10-22T20:15:30.6094326Z ·  ───────────┬─────────── 2026-10-22T20:15:30.6094515Z · ╰── 'isMarkdownFileLinkLabel' is imported here 2026-10-22T20:15:30.6094685Z 63 │ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments"; 2026-10-22T20:15:30.6094751Z ╰──── 2026-10-22T20:15:30.6094858Z  help: Consider removing this import. 2026-10-22T20:15:30.6094865Z 2026-10-22T20:15:30.6095081Z ⚠ eslint(no-unused-vars): Identifier 'createContext' is imported but never used. 2026-10-22T20:15:30.6095224Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:88:3] 2026-10-22T20:15:30.6095292Z 87 │ import { 2026-10-22T20:15:30.6095360Z 88 │ createContext, 2026-10-22T20:15:30.6095447Z ·  ──────┬────── 2026-10-22T20:15:30.6095600Z · ╰── 'createContext' is imported here 2026-10-22T20:15:30.6095664Z 89 │ memo, 2026-10-22T20:15:30.6095718Z ╰──── 2026-10-22T20:15:30.6095831Z  help: Consider removing this import. 2026-10-22T20:15:30.6095834Z 2026-10-22T20:15:30.6096067Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-22T20:15:30.6096214Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:103:3] 2026-10-22T20:15:30.6096279Z 102 │ import { 2026-10-22T20:15:30.6096350Z 103 │ ActivityIndicator, 2026-10-22T20:15:30.6096442Z ·  ────────┬──────── 2026-10-22T20:15:30.6096601Z · ╰── 'ActivityIndicator' is imported here 2026-10-22T20:15:30.6096662Z 104 │ Image, 2026-10-22T20:15:30.6096721Z ╰──── 2026-10-22T20:15:30.6096825Z  help: Consider removing this import. 2026-10-22T20:15:30.6096828Z 2026-10-22T20:15:30.6097039Z ⚠ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used. 2026-10-22T20:15:30.6097181Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:110:3] 2026-10-22T20:15:30.6097307Z 109 │ Pressable, 2026-10-22T20:15:30.6097418Z 110 │ ScrollView, 2026-10-22T20:15:30.6097499Z ·  ─────┬──── 2026-10-22T20:15:30.6097649Z · ╰── 'ScrollView' is imported here 2026-10-22T20:15:30.6097722Z 111 │ StyleSheet, 2026-10-22T20:15:30.6097779Z ╰──── 2026-10-22T20:15:30.6097882Z  help: Consider removing this import. 2026-10-22T20:15:30.6097885Z 2026-10-22T20:15:30.6098091Z ⚠ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used. 2026-10-22T20:15:30.6098239Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:112:11] 2026-10-22T20:15:30.6098315Z 111 │ StyleSheet, 2026-10-22T20:15:30.6098391Z 112 │ Text as NativeText, 2026-10-22T20:15:30.6098475Z ·  ─────┬──── 2026-10-22T20:15:30.6098632Z · ╰── 'NativeText' is imported here 2026-10-22T20:15:30.6098710Z 113 │ type ColorValue, 2026-10-22T20:15:30.6098768Z ╰──── 2026-10-22T20:15:30.6098867Z  help: Consider removing this import. 2026-10-22T20:15:30.6098870Z 2026-10-22T20:15:30.6099100Z ⚠ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used. 2026-10-22T20:15:30.6099248Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:134:10] 2026-10-22T20:15:30.6099396Z 133 │ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic"; 2026-10-22T20:15:30.6099534Z 134 │ import { tryOpenExternalUrl } from "../../lib/openExternalUrl"; 2026-10-22T20:15:30.6099629Z ·  ─────────┬──────── 2026-10-22T20:15:30.6099804Z · ╰── 'tryOpenExternalUrl' is imported here 2026-10-22T20:15:30.6099967Z 135 │ import { downloadAndShareAttachment } from "../../lib/attachmentDownload"; 2026-10-22T20:15:30.6100027Z ╰──── 2026-10-22T20:15:30.6100127Z  help: Consider removing this import. 2026-10-22T20:15:30.6100129Z 2026-10-22T20:15:30.6100432Z ⚠ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used. 2026-10-22T20:15:30.6100578Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:137:10] 2026-10-22T20:15:30.6100724Z 136 │ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks"; 2026-10-22T20:15:30.6100854Z 137 │ import { faviconUrlForOrigin } from "@t3tools/shared/favicon"; 2026-10-22T20:15:30.6100956Z ·  ─────────┬───────── 2026-10-22T20:15:30.6101131Z · ╰── 'faviconUrlForOrigin' is imported here 2026-10-22T20:15:30.6101202Z 138 │ import { 2026-10-22T20:15:30.6101260Z ╰──── 2026-10-22T20:15:30.6101366Z  help: Consider removing this import. 2026-10-22T20:15:30.6101368Z 2026-10-22T20:15:30.6101598Z ⚠ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used. 2026-10-22T20:15:30.6101744Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:151:10] 2026-10-22T20:15:30.6101921Z 150 │ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile"; 2026-10-22T20:15:30.6102072Z 151 │ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer"; 2026-10-22T20:15:30.6102170Z ·  ────────┬─────── 2026-10-22T20:15:30.6102335Z · ╰── 'MediaVideoPlayer' is imported here 2026-10-22T20:15:30.6102591Z 152 │ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia"; 2026-10-22T20:15:30.6102710Z ╰──── 2026-10-22T20:15:30.6102815Z  help: Consider removing this import. 2026-10-22T20:15:30.6102818Z 2026-10-22T20:15:30.6103054Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used. 2026-10-22T20:15:30.6103196Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:155:3] 2026-10-22T20:15:30.6103288Z 154 │ attachmentVideoPreviewSource, 2026-10-22T20:15:30.6103365Z 155 │ mediaVideoPreviewUri, 2026-10-22T20:15:30.6103460Z ·  ──────────┬───────── 2026-10-22T20:15:30.6103624Z · ╰── 'mediaVideoPreviewUri' is imported here 2026-10-22T20:15:30.6103704Z 156 │ mediaVideoThumbnailKey, 2026-10-22T20:15:30.6103767Z ╰──── 2026-10-22T20:15:30.6103878Z  help: Consider removing this import. 2026-10-22T20:15:30.6103884Z 2026-10-22T20:15:30.6104120Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used. 2026-10-22T20:15:30.6104259Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:156:3] 2026-10-22T20:15:30.6104337Z 155 │ mediaVideoPreviewUri, 2026-10-22T20:15:30.6104416Z 156 │ mediaVideoThumbnailKey, 2026-10-22T20:15:30.6104511Z ·  ───────────┬────────── 2026-10-22T20:15:30.6104681Z · ╰── 'mediaVideoThumbnailKey' is imported here 2026-10-22T20:15:30.6104772Z 157 │ type MediaVideoPreviewSource, 2026-10-22T20:15:30.6104832Z ╰──── 2026-10-22T20:15:30.6104931Z  help: Consider removing this import. 2026-10-22T20:15:30.6104936Z 2026-10-22T20:15:30.6105168Z ⚠ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used. 2026-10-22T20:15:30.6105317Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:157:8] 2026-10-22T20:15:30.6105395Z 156 │ mediaVideoThumbnailKey, 2026-10-22T20:15:30.6105482Z 157 │ type MediaVideoPreviewSource, 2026-10-22T20:15:30.6105586Z ·  ───────────┬─────────── 2026-10-22T20:15:30.6105764Z · ╰── 'MediaVideoPreviewSource' is imported here 2026-10-22T20:15:30.6105864Z 158 │ } from "../../lib/videoPreviewSource"; 2026-10-22T20:15:30.6105923Z ╰──── 2026-10-22T20:15:30.6106022Z  help: Consider removing this import. 2026-10-22T20:15:30.6106025Z 2026-10-22T20:15:30.6106240Z ⚠ eslint(no-unused-vars): Type 'ReviewDiffTheme' is imported but never used. 2026-10-22T20:15:30.6106391Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:165:15] 2026-10-22T20:15:30.6106587Z 164 │ import { parseReviewCommentMessageSegments } from "../review/reviewCommentSelection"; 2026-10-22T20:15:30.6106734Z 165 │ import type { ReviewDiffTheme } from "../review/shikiReviewHighlighter"; 2026-10-22T20:15:30.6106837Z ·  ───────┬─────── 2026-10-22T20:15:30.6106998Z · ╰── 'ReviewDiffTheme' is imported here 2026-10-22T20:15:30.6107064Z 166 │ import { 2026-10-22T20:15:30.6107120Z ╰──── 2026-10-22T20:15:30.6107224Z  help: Consider removing this import. 2026-10-22T20:15:30.6107226Z 2026-10-22T20:15:30.6107476Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used. 2026-10-22T20:15:30.6107706Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:180:3] 2026-10-22T20:15:30.6107833Z 179 │ import { 2026-10-22T20:15:30.6107923Z 180 │ resolveMarkdownFontSizes, 2026-10-22T20:15:30.6108026Z ·  ────────────┬─────────── 2026-10-22T20:15:30.6108202Z · ╰── 'resolveMarkdownFontSizes' is imported here 2026-10-22T20:15:30.6108293Z 181 │ resolveNativeMarkdownTypography, 2026-10-22T20:15:30.6108353Z ╰──── 2026-10-22T20:15:30.6108458Z  help: Consider removing this import. 2026-10-22T20:15:30.6108461Z 2026-10-22T20:15:30.6108698Z ⚠ eslint(no-unused-vars): Identifier 'markdownLinkIconSource' is imported but never used. 2026-10-22T20:15:30.6108837Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:185:10] 2026-10-22T20:15:30.6108989Z 184 │ import { PierreEntryIcon } from "../../components/PierreEntryIcon"; 2026-10-22T20:15:30.6109146Z 185 │ import { markdownLinkIconSource } from "../../lib/markdownLinkIcons"; 2026-10-22T20:15:30.6109260Z ·  ───────────┬────────── 2026-10-22T20:15:30.6109433Z · ╰── 'markdownLinkIconSource' is imported here 2026-10-22T20:15:30.6109508Z 186 │ import { 2026-10-22T20:15:30.6109571Z ╰──── 2026-10-22T20:15:30.6109690Z  help: Consider removing this import. 2026-10-22T20:15:30.6109693Z 2026-10-22T20:15:30.6109961Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used. 2026-10-22T20:15:30.6110111Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:188:3] 2026-10-22T20:15:30.6110204Z 187 │ normalizeNativeMarkdownUrl, 2026-10-22T20:15:30.6110313Z 188 │ resolveMarkdownInlineCodePresentation, 2026-10-22T20:15:30.6110443Z ·  ──────────────────┬────────────────── 2026-10-22T20:15:30.6110664Z · ╰── 'resolveMarkdownInlineCodePresentation' is imported here 2026-10-22T20:15:30.6110758Z 189 │ resolveMarkdownLinkIcon, 2026-10-22T20:15:30.6110827Z ╰──── 2026-10-22T20:15:30.6110929Z  help: Consider removing this import. 2026-10-22T20:15:30.6110939Z 2026-10-22T20:15:30.6111174Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownLinkIcon' is imported but never used. 2026-10-22T20:15:30.6111320Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:189:3] 2026-10-22T20:15:30.6111429Z 188 │ resolveMarkdownInlineCodePresentation, 2026-10-22T20:15:30.6111510Z 189 │ resolveMarkdownLinkIcon, 2026-10-22T20:15:30.6111610Z ·  ───────────┬─────────── 2026-10-22T20:15:30.6111796Z · ╰── 'resolveMarkdownLinkIcon' is imported here 2026-10-22T20:15:30.6111926Z 190 │ resolveMarkdownLinkPresentation, 2026-10-22T20:15:30.6111987Z ╰──── 2026-10-22T20:15:30.6112086Z  help: Consider removing this import. 2026-10-22T20:15:30.6112089Z 2026-10-22T20:15:30.6112329Z ⚠ eslint(no-unused-vars): Identifier 'useMarkdownCodeHighlight' is imported but never used. 2026-10-22T20:15:30.6112476Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:228:10] 2026-10-22T20:15:30.6112589Z 227 │ import { ThreadMcpApp } from "./McpAppWebView"; 2026-10-22T20:15:30.6112741Z 228 │ import { useMarkdownCodeHighlight } from "./markdownCodeHighlightState"; 2026-10-22T20:15:30.6112856Z ·  ────────────┬─────────── 2026-10-22T20:15:30.6113124Z · ╰── 'useMarkdownCodeHighlight' is imported here 2026-10-22T20:15:30.6113292Z 229 │ import { 2026-10-22T20:15:30.6113353Z ╰──── 2026-10-22T20:15:30.6113469Z  help: Consider removing this import. 2026-10-22T20:15:30.6113472Z 2026-10-22T20:15:30.6113698Z ⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used. 2026-10-22T20:15:30.6113843Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:232:3] 2026-10-22T20:15:30.6113911Z 231 │ useAssetUrl, 2026-10-22T20:15:30.6113991Z 232 │ useAssetUrlState, 2026-10-22T20:15:30.6114085Z ·  ────────┬─────── 2026-10-22T20:15:30.6114246Z · ╰── 'useAssetUrlState' is imported here 2026-10-22T20:15:30.6114320Z 233 │ useRefreshAssetUrl, 2026-10-22T20:15:30.6114380Z ╰──── 2026-10-22T20:15:30.6114488Z  help: Consider removing this import. 2026-10-22T20:15:30.6114493Z 2026-10-22T20:15:30.6114709Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T20:15:30.6114854Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2111:7] 2026-10-22T20:15:30.6114940Z 2110 │ setExpandedFile(null); 2026-10-22T20:15:30.6115107Z 2111 │ }, [props.environmentId, props.threadId, props.contentPresentation.kind]); 2026-10-22T20:15:30.6115381Z ·  ─────────┬───────── ───────┬────── ───────────────┬────────────── 2026-10-22T20:15:30.6115695Z · │ │ ╰── Unnecessary dependency `props.contentPresentation.kind` 2026-10-22T20:15:30.6115931Z · │ ╰── Unnecessary dependency `props.threadId` 2026-10-22T20:15:30.6116119Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-22T20:15:30.6116271Z 2112 │ const horizontalPadding = props.layoutVariant === "split" ? 20 : 16; 2026-10-22T20:15:30.6116332Z ╰──── 2026-10-22T20:15:30.6116638Z  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-22T20:15:30.6116972Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.6116976Z 2026-10-22T20:15:30.6117254Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T20:15:30.6117449Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2578:7] 2026-10-22T20:15:30.6117557Z 2577 │ reportHeaderMaterialVisibility(false); 2026-10-22T20:15:30.6117682Z 2578 │ }, [feedThreadKey, reportHeaderMaterialVisibility]); 2026-10-22T20:15:30.6117777Z ·  ──────┬────── 2026-10-22T20:15:30.6117943Z · ╰── Unnecessary dependency `feedThreadKey` 2026-10-22T20:15:30.6118006Z 2579 │ 2026-10-22T20:15:30.6118063Z ╰──── 2026-10-22T20:15:30.6118370Z  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-22T20:15:30.6118716Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.6118721Z 2026-10-22T20:15:30.6118938Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T20:15:30.6119079Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2594:7] 2026-10-22T20:15:30.6119147Z 2593 │ } 2026-10-22T20:15:30.6119292Z 2594 │ }, [listMountKey, props.contentInsetEndAdjustment, listRef]); 2026-10-22T20:15:30.6119379Z ·  ──────┬───── 2026-10-22T20:15:30.6119541Z · ╰── Unnecessary dependency `listMountKey` 2026-10-22T20:15:30.6119606Z 2595 │ 2026-10-22T20:15:30.6119676Z ╰──── 2026-10-22T20:15:30.6119990Z  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-22T20:15:30.6120314Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.6120324Z 2026-10-22T20:15:30.6120535Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T20:15:30.6120692Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2751:7] 2026-10-22T20:15:30.6120760Z 2750 │ } 2026-10-22T20:15:30.6120962Z 2751 │ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]); 2026-10-22T20:15:30.6121206Z ·  ───────┬─────── ─────────┬──────── ────────┬─────── 2026-10-22T20:15:30.6121493Z · │ │ ╰── Unnecessary dependency `expandedWorkRows` 2026-10-22T20:15:30.6121731Z · │ ╰── Unnecessary dependency `expandedWorkGroups` 2026-10-22T20:15:30.6121950Z · ╰── Unnecessary dependency `expandedTurnIds` 2026-10-22T20:15:30.6122012Z 2752 │ 2026-10-22T20:15:30.6122080Z ╰──── 2026-10-22T20:15:30.6122400Z  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-22T20:15:30.6122729Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.6122732Z 2026-10-22T20:15:30.6123001Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-22T20:15:30.6123181Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:603:9] 2026-10-22T20:15:30.6123247Z 602 │ }; 2026-10-22T20:15:30.6123376Z 603 │ }, [props.environmentId, attachment.id, httpBaseUrl]), 2026-10-22T20:15:30.6123601Z ·  ─────────┬───────── ──────┬────── ─────┬───── 2026-10-22T20:15:30.6123857Z · │ │ ╰── Unnecessary dependency `httpBaseUrl` 2026-10-22T20:15:30.6124074Z · │ ╰── Unnecessary dependency `attachment.id` 2026-10-22T20:15:30.6124267Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-22T20:15:30.6124335Z 604 │ ); 2026-10-22T20:15:30.6124393Z ╰──── 2026-10-22T20:15:30.6124728Z  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-22T20:15:30.6125057Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.6125062Z 2026-10-22T20:15:30.6125275Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-22T20:15:30.6125434Z ╭─[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9] 2026-10-22T20:15:30.6125527Z 35 │ label.name.trim().toLowerCase()); 2026-10-22T20:15:30.6126899Z ·  ───────────────────────────────────────────────────────────────────── 2026-10-22T20:15:30.6127068Z 188 │ const holds = (label: string) => labels.includes(label.trim().toLowerCase()); 2026-10-22T20:15:30.6127130Z ╰──── 2026-10-22T20:15:30.6127226Z  help: Switch to `Set` 2026-10-22T20:15:30.6127229Z 2026-10-22T20:15:30.6127631Z ⚠ 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-22T20:15:30.6127768Z ╭─[packages/shared/src/otelEnvironment.ts:143:14] 2026-10-22T20:15:30.6127831Z 142 │ name, 2026-10-22T20:15:30.6127985Z 143 │ (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()), 2026-10-22T20:15:30.6128113Z ·  ────────────────────────── 2026-10-22T20:15:30.6128259Z 144 │ `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`, 2026-10-22T20:15:30.6128313Z ╰──── 2026-10-22T20:15:30.6128320Z 2026-10-22T20:15:30.6128630Z ⚠ eslint(no-unneeded-ternary): Unnecessary use of boolean literals in conditional expression 2026-10-22T20:15:30.6128830Z ╭─[packages/shared/src/serverSettings.test.ts:35:7] 2026-10-22T20:15:30.6129029Z 34 │ const fallback = fallbackTextGenerationModelSelection(providerInstances, (instanceId) => 2026-10-22T20:15:30.6129139Z 35 │ instanceId === configured ? true : false, 2026-10-22T20:15:30.6129271Z ·  ──────────────────────────────────────── 2026-10-22T20:15:30.6129344Z 36 │ ); 2026-10-22T20:15:30.6129402Z ╰──── 2026-10-22T20:15:30.6129528Z  help: Remove this ternary operator 2026-10-22T20:15:30.6129531Z 2026-10-22T20:15:30.6129804Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.6129988Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:40:5] 2026-10-22T20:15:30.6130114Z 37 │ const [initialized, setInitialized] = useState(false); 2026-10-22T20:15:30.6130200Z 38 │ useLayoutEffect(() => { 2026-10-22T20:15:30.6130284Z ·  ───────┬─────── 2026-10-22T20:15:30.6130434Z · ╰── This is the containing effect 2026-10-22T20:15:30.6130507Z 39 │ reset(); 2026-10-22T20:15:30.6130591Z 40 │ setInitialized(true); 2026-10-22T20:15:30.6130674Z ·  ───────┬────── 2026-10-22T20:15:30.6130869Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.6130948Z 41 │ }, [reset]); 2026-10-22T20:15:30.6131009Z ╰──── 2026-10-22T20:15:30.6131639Z  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-22T20:15:30.6132011Z  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-22T20:15:30.6132014Z 2026-10-22T20:15:30.6132287Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.6132458Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:93:5] 2026-10-22T20:15:30.6132525Z 88 │ 2026-10-22T20:15:30.6132593Z 89 │ useEffect(() => { 2026-10-22T20:15:30.6132670Z ·  ────┬──── 2026-10-22T20:15:30.6132882Z · ╰── This is the containing effect 2026-10-22T20:15:30.6133092Z 90 │ if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return; 2026-10-22T20:15:30.6133203Z 91 │ const branchName = initialProjectRef.branch; 2026-10-22T20:15:30.6133279Z 92 │ let active = true; 2026-10-22T20:15:30.6133387Z 93 │ setPendingCheckouts((count) => count + 1); 2026-10-22T20:15:30.6133480Z ·  ─────────┬───────── 2026-10-22T20:15:30.6133664Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.6133831Z 94 │ // Serialize replacements: ignoring a stale result cannot undo its Git mutation. 2026-10-22T20:15:30.6133889Z ╰──── 2026-10-22T20:15:30.6134522Z  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-22T20:15:30.6134861Z  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-22T20:15:30.6134871Z 2026-10-22T20:15:30.6135073Z ⚠ eslint(require-yield): This generator function does not have `yield` 2026-10-22T20:15:30.6135238Z ╭─[packages/provider-acp/src/server/mcpOverAcpBridge.ts:81:78] 2026-10-22T20:15:30.6135302Z  80 │ 2026-10-22T20:15:30.6135610Z  81 │ ╭─▶ export const makeAcpMcpOverAcpBridge = Effect.fn("AcpMcpOverAcpBridge.make")(function* ( 2026-10-22T20:15:30.6135746Z  82 │ │ options: AcpMcpOverAcpBridgeOptions, 2026-10-22T20:15:30.6135889Z  83 │ │ ): Effect.fn.Return { 2026-10-22T20:15:30.6136078Z  84 │ │ const fetchImplementation = options.fetchImplementation ?? fetch; 2026-10-22T20:15:30.6136239Z  85 │ │ const connections = new Map(); 2026-10-22T20:15:30.6136314Z  86 │ │ 2026-10-22T20:15:30.6136545Z  87 │ │ const connectionFor = (connectionId: string): Effect.Effect => 2026-10-22T20:15:30.6136657Z  88 │ │ Effect.suspend(() => { 2026-10-22T20:15:30.6136806Z  89 │ │ const connection = connections.get(connectionId); 2026-10-22T20:15:30.6136925Z  90 │ │ return connection === undefined 2026-10-22T20:15:30.6137157Z  91 │ │ ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`)) 2026-10-22T20:15:30.6137302Z  92 │ │ : Effect.succeed(connection); 2026-10-22T20:15:30.6137390Z  93 │ │ }); 2026-10-22T20:15:30.6137467Z  94 │ │ 2026-10-22T20:15:30.6137564Z  95 │ │ const send = ( 2026-10-22T20:15:30.6137674Z  96 │ │ connection: Connection, 2026-10-22T20:15:30.6137778Z  97 │ │ message: unknown, 2026-10-22T20:15:30.6137946Z  98 │ │ ): Effect.Effect, AcpMcpOverAcpError> => 2026-10-22T20:15:30.6138075Z  99 │ │ connection.mutex.withPermits(1)( 2026-10-22T20:15:30.6138262Z 100 │ │ Effect.gen(function* () { 2026-10-22T20:15:30.6138452Z 101 │ │ const body = JSON.stringify(message); 2026-10-22T20:15:30.6138604Z 102 │ │ if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) { 2026-10-22T20:15:30.6138835Z 103 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB.")); 2026-10-22T20:15:30.6138924Z 104 │ │ } 2026-10-22T20:15:30.6139069Z 105 │ │ const response = yield* Effect.tryPromise({ 2026-10-22T20:15:30.6139183Z 106 │ │ try: (signal) => 2026-10-22T20:15:30.6139328Z 107 │ │ fetchImplementation(options.endpoint, { 2026-10-22T20:15:30.6139445Z 108 │ │ method: "POST", 2026-10-22T20:15:30.6139554Z 109 │ │ signal, 2026-10-22T20:15:30.6139671Z 110 │ │ headers: { 2026-10-22T20:15:30.6139806Z 111 │ │ "content-type": "application/json", 2026-10-22T20:15:30.6139963Z 112 │ │ accept: "application/json, text/event-stream", 2026-10-22T20:15:30.6140114Z 113 │ │ authorization: options.authorization, 2026-10-22T20:15:30.6140356Z 114 │ │ ...(connection.sessionId === null 2026-10-22T20:15:30.6140468Z 115 │ │ ? {} 2026-10-22T20:15:30.6140628Z 116 │ │ : { "mcp-session-id": connection.sessionId }), 2026-10-22T20:15:30.6140773Z 117 │ │ ...(connection.protocolVersion === null 2026-10-22T20:15:30.6140887Z 118 │ │ ? {} 2026-10-22T20:15:30.6141065Z 119 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-22T20:15:30.6141158Z 120 │ │ }, 2026-10-22T20:15:30.6141258Z 121 │ │ body, 2026-10-22T20:15:30.6141355Z 122 │ │ }), 2026-10-22T20:15:30.6141465Z 123 │ │ catch: bridgeError, 2026-10-22T20:15:30.6141554Z 124 │ │ }); 2026-10-22T20:15:30.6141787Z 125 │ │ connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId; 2026-10-22T20:15:30.6141929Z 126 │ │ if (!response.ok) { 2026-10-22T20:15:30.6142045Z 127 │ │ yield* Effect.promise( 2026-10-22T20:15:30.6142260Z 128 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-22T20:15:30.6142354Z 129 │ │ ); 2026-10-22T20:15:30.6142485Z 130 │ │ return yield* Effect.fail( 2026-10-22T20:15:30.6142711Z 131 │ │ new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`), 2026-10-22T20:15:30.6142804Z 132 │ │ ); 2026-10-22T20:15:30.6142894Z 133 │ │ } 2026-10-22T20:15:30.6143127Z 134 │ │ const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))]; 2026-10-22T20:15:30.6143256Z 135 │ │ for (const payload of payloads) { 2026-10-22T20:15:30.6143596Z 136 │ │ connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion; 2026-10-22T20:15:30.6143759Z 137 │ │ } 2026-10-22T20:15:30.6143878Z 138 │ │ return payloads; 2026-10-22T20:15:30.6144007Z 139 │ │ }).pipe(Effect.mapError(bridgeError)), 2026-10-22T20:15:30.6144090Z 140 │ │ ); 2026-10-22T20:15:30.6144172Z 141 │ │ 2026-10-22T20:15:30.6144366Z 142 │ │ const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* ( 2026-10-22T20:15:30.6144507Z 143 │ │ request: AcpSchema.DisconnectMcpRequest, 2026-10-22T20:15:30.6144705Z 144 │ │ ): Effect.fn.Return { 2026-10-22T20:15:30.6144892Z 145 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-22T20:15:30.6145041Z 146 │ │ connections.delete(request.connectionId); 2026-10-22T20:15:30.6145179Z 147 │ │ const sessionId = connection.sessionId; 2026-10-22T20:15:30.6145289Z 148 │ │ if (sessionId !== null) { 2026-10-22T20:15:30.6145437Z 149 │ │ const response = yield* Effect.tryPromise({ 2026-10-22T20:15:30.6145550Z 150 │ │ try: (signal) => 2026-10-22T20:15:30.6145696Z 151 │ │ fetchImplementation(options.endpoint, { 2026-10-22T20:15:30.6145809Z 152 │ │ method: "DELETE", 2026-10-22T20:15:30.6145907Z 153 │ │ signal, 2026-10-22T20:15:30.6146017Z 154 │ │ headers: { 2026-10-22T20:15:30.6146176Z 155 │ │ authorization: options.authorization, 2026-10-22T20:15:30.6146313Z 156 │ │ "mcp-session-id": sessionId, 2026-10-22T20:15:30.6146468Z 157 │ │ ...(connection.protocolVersion === null 2026-10-22T20:15:30.6146573Z 158 │ │ ? {} 2026-10-22T20:15:30.6146754Z 159 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-22T20:15:30.6146841Z 160 │ │ }, 2026-10-22T20:15:30.6146938Z 161 │ │ }), 2026-10-22T20:15:30.6147053Z 162 │ │ catch: bridgeError, 2026-10-22T20:15:30.6147140Z 163 │ │ }); 2026-10-22T20:15:30.6147292Z 164 │ │ if (!response.ok && response.status !== 404) { 2026-10-22T20:15:30.6147422Z 165 │ │ return yield* Effect.fail( 2026-10-22T20:15:30.6147542Z 166 │ │ new AcpMcpOverAcpError( 2026-10-22T20:15:30.6147740Z 167 │ │ `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`, 2026-10-22T20:15:30.6147825Z 168 │ │ ), 2026-10-22T20:15:30.6147923Z 169 │ │ ); 2026-10-22T20:15:30.6148010Z 170 │ │ } 2026-10-22T20:15:30.6148129Z 171 │ │ yield* Effect.promise( 2026-10-22T20:15:30.6148320Z 172 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-22T20:15:30.6148421Z 173 │ │ ); 2026-10-22T20:15:30.6148506Z 174 │ │ } 2026-10-22T20:15:30.6148706Z 175 │ │ return {}; 2026-10-22T20:15:30.6148872Z 176 │ │ }); 2026-10-22T20:15:30.6148952Z 177 │ │ 2026-10-22T20:15:30.6149048Z 178 │ │ return { 2026-10-22T20:15:30.6149234Z 179 │ │ connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) { 2026-10-22T20:15:30.6149364Z 180 │ │ if (request.serverId !== "t3-code") { 2026-10-22T20:15:30.6149486Z 181 │ │ return yield* Effect.fail( 2026-10-22T20:15:30.6149689Z 182 │ │ new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`), 2026-10-22T20:15:30.6149778Z 183 │ │ ); 2026-10-22T20:15:30.6149859Z 184 │ │ } 2026-10-22T20:15:30.6150010Z 185 │ │ if (connections.size >= MAX_CONNECTIONS) { 2026-10-22T20:15:30.6150247Z 186 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections.")); 2026-10-22T20:15:30.6150334Z 187 │ │ } 2026-10-22T20:15:30.6150498Z 188 │ │ const connectionId = yield* options.allocateConnectionId; 2026-10-22T20:15:30.6150629Z 189 │ │ connections.set(connectionId, { 2026-10-22T20:15:30.6150763Z 190 │ │ mutex: yield* Semaphore.make(1), 2026-10-22T20:15:30.6150873Z 191 │ │ sessionId: null, 2026-10-22T20:15:30.6150988Z 192 │ │ protocolVersion: null, 2026-10-22T20:15:30.6151112Z 193 │ │ nextRequestId: 0, 2026-10-22T20:15:30.6151224Z 194 │ │ }); 2026-10-22T20:15:30.6151344Z 195 │ │ return { connectionId }; 2026-10-22T20:15:30.6151429Z 196 │ │ }), 2026-10-22T20:15:30.6151615Z 197 │ │ message: Effect.fn("mcpOverAcpBridge.message")(function* (request) { 2026-10-22T20:15:30.6151797Z 198 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-22T20:15:30.6151967Z 199 │ │ const id = ++connection.nextRequestId; 2026-10-22T20:15:30.6152105Z 200 │ │ const payloads = yield* send(connection, { 2026-10-22T20:15:30.6152209Z 201 │ │ jsonrpc: "2.0", 2026-10-22T20:15:30.6152307Z 202 │ │ id, 2026-10-22T20:15:30.6152431Z 203 │ │ method: request.method, 2026-10-22T20:15:30.6152612Z 204 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-22T20:15:30.6152701Z 205 │ │ }); 2026-10-22T20:15:30.6152913Z 206 │ │ const response = payloads.find((payload) => asEnvelope(payload)?.id === id); 2026-10-22T20:15:30.6153048Z 207 │ │ const envelope = asEnvelope(response); 2026-10-22T20:15:30.6153162Z 208 │ │ if (envelope === null) { 2026-10-22T20:15:30.6153278Z 209 │ │ return yield* Effect.fail( 2026-10-22T20:15:30.6153481Z 210 │ │ new AcpMcpOverAcpError("MCP server did not return a matching response."), 2026-10-22T20:15:30.6153568Z 211 │ │ ); 2026-10-22T20:15:30.6153650Z 212 │ │ } 2026-10-22T20:15:30.6153868Z 213 │ │ if (envelope.error !== undefined) { 2026-10-22T20:15:30.6154127Z 214 │ │ return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error))); 2026-10-22T20:15:30.6154213Z 215 │ │ } 2026-10-22T20:15:30.6154396Z 216 │ │ return (envelope.result ?? null) as AcpSchema.MessageMcpResponse; 2026-10-22T20:15:30.6154475Z 217 │ │ }), 2026-10-22T20:15:30.6154690Z 218 │ │ notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) { 2026-10-22T20:15:30.6154865Z 219 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-22T20:15:30.6154979Z 220 │ │ yield* send(connection, { 2026-10-22T20:15:30.6155079Z 221 │ │ jsonrpc: "2.0", 2026-10-22T20:15:30.6155198Z 222 │ │ method: request.method, 2026-10-22T20:15:30.6155373Z 223 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-22T20:15:30.6155462Z 224 │ │ }); 2026-10-22T20:15:30.6155539Z 225 │ │ }), 2026-10-22T20:15:30.6155638Z 226 │ │ disconnect, 2026-10-22T20:15:30.6155759Z 227 │ │ dispose: Effect.suspend(() => 2026-10-22T20:15:30.6155870Z 228 │ │ Effect.forEach( 2026-10-22T20:15:30.6155983Z 229 │ │ [...connections.keys()], 2026-10-22T20:15:30.6156175Z 230 │ │ (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore), 2026-10-22T20:15:30.6156287Z 231 │ │ { discard: true }, 2026-10-22T20:15:30.6156382Z 232 │ │ ), 2026-10-22T20:15:30.6156464Z 233 │ │ ), 2026-10-22T20:15:30.6156551Z 234 │ │ }; 2026-10-22T20:15:30.6156690Z 235 │ ╰─▶ }); 2026-10-22T20:15:30.6156749Z ╰──── 2026-10-22T20:15:30.6157012Z  help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed. 2026-10-22T20:15:30.6157015Z 2026-10-22T20:15:30.6157243Z ⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used. 2026-10-22T20:15:30.6157398Z ╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10] 2026-10-22T20:15:30.6157467Z 21 │ 2026-10-22T20:15:30.6157642Z 22 │ function summarizePayload(payload: unknown): Readonly> { 2026-10-22T20:15:30.6157750Z ·  ────────┬─────── 2026-10-22T20:15:30.6157918Z · ╰── 'summarizePayload' is declared here 2026-10-22T20:15:30.6158041Z 23 │ if (payload === null) return { valueType: "null" }; 2026-10-22T20:15:30.6158101Z ╰──── 2026-10-22T20:15:30.6158222Z  help: Consider removing this declaration. 2026-10-22T20:15:30.6158225Z 2026-10-22T20:15:30.6158510Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.6158694Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:285:5] 2026-10-22T20:15:30.6158834Z 283 │ const [snoozeWakeTick, bumpSnoozeWakeTick] = useState(0); 2026-10-22T20:15:30.6158904Z 284 │ useEffect(() => { 2026-10-22T20:15:30.6159090Z ·  ────┬──── 2026-10-22T20:15:30.6159291Z · ╰── This is the containing effect 2026-10-22T20:15:30.6159394Z 285 │ setNow(new Date().toISOString()); 2026-10-22T20:15:30.6159472Z ·  ───┬── 2026-10-22T20:15:30.6159658Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.6159809Z 286 │ const id = setInterval(() => setNow(new Date().toISOString()), 60_000); 2026-10-22T20:15:30.6159873Z ╰──── 2026-10-22T20:15:30.6160494Z  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-22T20:15:30.6160846Z  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-22T20:15:30.6160851Z 2026-10-22T20:15:30.6161071Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T20:15:30.6161252Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:365:25] 2026-10-22T20:15:30.6161404Z 364 │ // range) the boundary string is identical and the chain would die. 2026-10-22T20:15:30.6161508Z 365 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-22T20:15:30.6161630Z ·  ───────┬────── 2026-10-22T20:15:30.6161816Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-22T20:15:30.6161972Z 366 │ const listItems = ((): readonly SidebarListItem[] => { 2026-10-22T20:15:30.6162033Z ╰──── 2026-10-22T20:15:30.6162348Z  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-22T20:15:30.6162681Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.6162684Z 2026-10-22T20:15:30.6162869Z ⚠ react(purity): Cannot call impure function during render 2026-10-22T20:15:30.6163041Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:356:53] 2026-10-22T20:15:30.6163138Z 355 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-22T20:15:30.6163312Z 356 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-22T20:15:30.6163448Z ·  ─────┬──── 2026-10-22T20:15:30.6163634Z · ╰── Cannot call impure function 2026-10-22T20:15:30.6163717Z 357 │ const id = setTimeout(() => { 2026-10-22T20:15:30.6163776Z ╰──── 2026-10-22T20:15:30.6164079Z  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-22T20:15:30.6164391Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-22T20:15:30.6164393Z 2026-10-22T20:15:30.6164570Z ⚠ react(purity): Cannot call impure function during render 2026-10-22T20:15:30.6164808Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:697:76] 2026-10-22T20:15:30.6165044Z 696 │ const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() })); 2026-10-22T20:15:30.6165223Z 697 │ if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() }); 2026-10-22T20:15:30.6165373Z ·  ─────┬──── 2026-10-22T20:15:30.6165572Z · ╰── Cannot call impure function 2026-10-22T20:15:30.6165726Z 698 │ const snoozeGateNow = new Date(snoozeGateClock.now).toISOString(); 2026-10-22T20:15:30.6165787Z ╰──── 2026-10-22T20:15:30.6166094Z  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-22T20:15:30.6166401Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-22T20:15:30.6166404Z 2026-10-22T20:15:30.6166586Z ⚠ react(purity): Cannot call impure function during render 2026-10-22T20:15:30.6166761Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:718:71] 2026-10-22T20:15:30.6166859Z 717 │ const snoozePresets = useMemo( 2026-10-22T20:15:30.6167048Z 718 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-22T20:15:30.6167198Z ·  ─────┬──── 2026-10-22T20:15:30.6167407Z · ╰── Cannot call impure function 2026-10-22T20:15:30.6167545Z 719 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-22T20:15:30.6167603Z ╰──── 2026-10-22T20:15:30.6167893Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-22T20:15:30.6168210Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-22T20:15:30.6168213Z 2026-10-22T20:15:30.6168418Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-22T20:15:30.6168584Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:719:6] 2026-10-22T20:15:30.6168829Z 718 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-22T20:15:30.6168999Z 719 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-22T20:15:30.6169108Z ·  ────────────┬─────────── 2026-10-22T20:15:30.6169311Z · ╰── Unnecessary dependency `props.snoozePresetMinute` 2026-10-22T20:15:30.6169369Z 720 │ ); 2026-10-22T20:15:30.6169433Z ╰──── 2026-10-22T20:15:30.6169771Z  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-22T20:15:30.6170106Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.6170109Z 2026-10-22T20:15:30.6170310Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-22T20:15:30.6170475Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:765:7] 2026-10-22T20:15:30.6170565Z 764 │ thread.pinnedAt, 2026-10-22T20:15:30.6170635Z 765 │ variant, 2026-10-22T20:15:30.6170723Z ·  ───┬─── 2026-10-22T20:15:30.6170869Z · ╰── Unnecessary dependency `variant` 2026-10-22T20:15:30.6170935Z 766 │ ], 2026-10-22T20:15:30.6170994Z ╰──── 2026-10-22T20:15:30.6171325Z  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-22T20:15:30.6171650Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.6171658Z 2026-10-22T20:15:30.6171892Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-22T20:15:30.6172104Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1215:21] 2026-10-22T20:15:30.6172252Z 1214 │ {providerDrivers.slice(0, -1).map((driver, index) => ( 2026-10-22T20:15:30.6172401Z 1215 │ 2026-10-22T20:15:30.6172534Z ·  ────────────────────────── 2026-10-22T20:15:30.6172658Z 1216 │ 2026-10-22T20:15:30.6172723Z ╰──── 2026-10-22T20:15:30.6172882Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-22T20:15:30.6172885Z 2026-10-22T20:15:30.6173119Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-22T20:15:30.6173282Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:771:7] 2026-10-22T20:15:30.6173399Z 770 │ if (settingsSheetPresentation.isActive) { 2026-10-22T20:15:30.6173540Z 771 │ settingsRoutePresentation.present(settingsRouteSession); 2026-10-22T20:15:30.6173645Z ·  ────────────┬──────────── 2026-10-22T20:15:30.6173836Z · ╰── Missing dependency `settingsRoutePresentation` 2026-10-22T20:15:30.6173904Z 772 │ } 2026-10-22T20:15:30.6174121Z 773 │ }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]); 2026-10-22T20:15:30.6174244Z ·  ────────────────┬──────────────── 2026-10-22T20:15:30.6174611Z · ╰── Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead 2026-10-22T20:15:30.6174729Z 774 │ 2026-10-22T20:15:30.6174791Z ╰──── 2026-10-22T20:15:30.6175239Z  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-22T20:15:30.6175565Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.6175567Z 2026-10-22T20:15:30.6175743Z ⚠ react(immutability): This value cannot be modified 2026-10-22T20:15:30.6175900Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:389:5] 2026-10-22T20:15:30.6176081Z 385 │ typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0; 2026-10-22T20:15:30.6176225Z 386 │ const animatedBorderRadius = useSharedValue(targetBorderRadius); 2026-10-22T20:15:30.6176332Z ·  ──────────┬───────── 2026-10-22T20:15:30.6176503Z · ╰── `animatedBorderRadius` originates here 2026-10-22T20:15:30.6176677Z 387 │ const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android"; 2026-10-22T20:15:30.6176750Z 388 │ useLayoutEffect(() => { 2026-10-22T20:15:30.6176864Z 389 │ animatedBorderRadius.value = shouldAnimate 2026-10-22T20:15:30.6176961Z ·  ──────────┬───────── 2026-10-22T20:15:30.6177135Z · ╰── `animatedBorderRadius` cannot be modified 2026-10-22T20:15:30.6177245Z 390 │ ? withTiming(targetBorderRadius, { 2026-10-22T20:15:30.6177311Z ╰──── 2026-10-22T20:15:30.6177593Z  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-22T20:15:30.6177917Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T20:15:30.6177920Z 2026-10-22T20:15:30.6178202Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.6178391Z ╭─[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:60:5] 2026-10-22T20:15:30.6178466Z 58 │ 2026-10-22T20:15:30.6178546Z 59 │ useEffect(() => { 2026-10-22T20:15:30.6178628Z ·  ────┬──── 2026-10-22T20:15:30.6178777Z · ╰── This is the containing effect 2026-10-22T20:15:30.6178875Z 60 │ setMountedModes((current) => { 2026-10-22T20:15:30.6178970Z ·  ───────┬─────── 2026-10-22T20:15:30.6179166Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.6179260Z 61 │ if (current.has(props.mode)) { 2026-10-22T20:15:30.6179321Z ╰──── 2026-10-22T20:15:30.6179947Z  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-22T20:15:30.6180454Z  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-22T20:15:30.6180520Z 2026-10-22T20:15:30.6180771Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-22T20:15:30.6180944Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:290:50] 2026-10-22T20:15:30.6181014Z 289 │ return ( 2026-10-22T20:15:30.6181163Z 290 │ 2026-10-22T20:15:30.6181298Z ·  ───────────── 2026-10-22T20:15:30.6181372Z 291 │ {props.children} 2026-10-22T20:15:30.6181429Z ╰──── 2026-10-22T20:15:30.6181664Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-22T20:15:30.6181819Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-22T20:15:30.6181825Z 2026-10-22T20:15:30.6182098Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-22T20:15:30.6182267Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:654:44] 2026-10-22T20:15:30.6182340Z 653 │ return ( 2026-10-22T20:15:30.6182484Z 654 │ 2026-10-22T20:15:30.6182609Z ·  ───────────── 2026-10-22T20:15:30.6182692Z 655 │ {props.children} 2026-10-22T20:15:30.6182758Z ╰──── 2026-10-22T20:15:30.6182994Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-22T20:15:30.6183140Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-22T20:15:30.6183147Z 2026-10-22T20:15:30.6183402Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-22T20:15:30.6183573Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1462:55] 2026-10-22T20:15:30.6183723Z 1461 │ return ( 2026-10-22T20:15:30.6184084Z 1462 │ 2026-10-22T20:15:30.6184281Z ·  ──────────────────── 2026-10-22T20:15:30.6184434Z 1463 │ ) { 2026-10-22T20:15:30.6186119Z 160 │ │ clipboardItemConstructor(data); 2026-10-22T20:15:30.6186240Z 161 │ │ } 2026-10-22T20:15:30.6186499Z 162 │ ╰─▶ }, 2026-10-22T20:15:30.6186670Z 163 │ clipboard: { 2026-10-22T20:15:30.6186769Z ╰──── 2026-10-22T20:15:30.6186978Z  help: Try replacing this class with a standalone function or deleting it entirely 2026-10-22T20:15:30.6186981Z 2026-10-22T20:15:30.6187319Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-22T20:15:30.6187543Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:387:19] 2026-10-22T20:15:30.6187662Z 386 │ onFilters, 2026-10-22T20:15:30.6187754Z 387 │ authorOptions = [], 2026-10-22T20:15:30.6187874Z ·  ── 2026-10-22T20:15:30.6187972Z 388 │ labelOptions = [], 2026-10-22T20:15:30.6188088Z ╰──── 2026-10-22T20:15:30.6188451Z  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-22T20:15:30.6188456Z 2026-10-22T20:15:30.6188790Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-22T20:15:30.6189007Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:388:18] 2026-10-22T20:15:30.6189118Z 387 │ authorOptions = [], 2026-10-22T20:15:30.6189238Z 388 │ labelOptions = [], 2026-10-22T20:15:30.6189336Z ·  ── 2026-10-22T20:15:30.6189437Z 389 │ host, 2026-10-22T20:15:30.6189525Z ╰──── 2026-10-22T20:15:30.6189927Z  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-22T20:15:30.6189932Z 2026-10-22T20:15:30.6190101Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.6190315Z ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14] 2026-10-22T20:15:30.6190440Z 26 │ const latestInput = useRef(input); 2026-10-22T20:15:30.6190566Z 27 │ latestInput.current = input; 2026-10-22T20:15:30.6190723Z ·  ─────┬─────────┬─── 2026-10-22T20:15:30.6190967Z · │ ╰── Cannot update ref value during render 2026-10-22T20:15:30.6191130Z · ╰── This value is a ref 2026-10-22T20:15:30.6191243Z 28 │ const mounted = useRef(true); 2026-10-22T20:15:30.6191334Z ╰──── 2026-10-22T20:15:30.6192001Z  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-22T20:15:30.6192395Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.6192397Z 2026-10-22T20:15:30.6192608Z ⚠ react(immutability): This value cannot be modified 2026-10-22T20:15:30.6192830Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5] 2026-10-22T20:15:30.6192925Z 90 │ }) { 2026-10-22T20:15:30.6193084Z 91 │ const rotation = useSharedValue(props.hidden ? 1 : 0); 2026-10-22T20:15:30.6193210Z ·  ────┬─── 2026-10-22T20:15:30.6193394Z · ╰── `rotation` originates here 2026-10-22T20:15:30.6193502Z 92 │ useLayoutEffect(() => { 2026-10-22T20:15:30.6193711Z 93 │ rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING); 2026-10-22T20:15:30.6193830Z ·  ────┬─── 2026-10-22T20:15:30.6194025Z · ╰── `rotation` cannot be modified 2026-10-22T20:15:30.6194118Z 94 │ }, [props.hidden, rotation]); 2026-10-22T20:15:30.6194238Z ╰──── 2026-10-22T20:15:30.6194556Z  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-22T20:15:30.6194924Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T20:15:30.6194927Z 2026-10-22T20:15:30.6195130Z ⚠ react(immutability): This value cannot be modified 2026-10-22T20:15:30.6195348Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:269:5] 2026-10-22T20:15:30.6195499Z 266 │ const variant = props.variant ?? "plain"; 2026-10-22T20:15:30.6195681Z 267 │ const loadingVisibility = useSharedValue(props.loading ? 1 : 0); 2026-10-22T20:15:30.6195809Z ·  ────────┬──────── 2026-10-22T20:15:30.6195978Z · ╰── `loadingVisibility` originates here 2026-10-22T20:15:30.6196119Z 268 │ useLayoutEffect(() => { 2026-10-22T20:15:30.6196331Z 269 │ loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING); 2026-10-22T20:15:30.6196459Z ·  ────────┬──────── 2026-10-22T20:15:30.6196645Z · ╰── `loadingVisibility` cannot be modified 2026-10-22T20:15:30.6196790Z 270 │ }, [loadingVisibility, props.loading]); 2026-10-22T20:15:30.6196897Z ╰──── 2026-10-22T20:15:30.6197210Z  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-22T20:15:30.6197546Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T20:15:30.6197574Z 2026-10-22T20:15:30.6197743Z ⚠ react(immutability): This value cannot be modified 2026-10-22T20:15:30.6197979Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:328:5] 2026-10-22T20:15:30.6198076Z 325 │ }) { 2026-10-22T20:15:30.6198357Z 326 │ const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0); 2026-10-22T20:15:30.6198513Z ·  ─────────┬───────── 2026-10-22T20:15:30.6198733Z · ╰── `recordingVisibility` originates here 2026-10-22T20:15:30.6198870Z 327 │ useLayoutEffect(() => { 2026-10-22T20:15:30.6199114Z 328 │ recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING); 2026-10-22T20:15:30.6199222Z ·  ─────────┬───────── 2026-10-22T20:15:30.6199413Z · ╰── `recordingVisibility` cannot be modified 2026-10-22T20:15:30.6199577Z 329 │ }, [props.phase, recordingVisibility]); 2026-10-22T20:15:30.6199673Z ╰──── 2026-10-22T20:15:30.6199962Z  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-22T20:15:30.6200325Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T20:15:30.6200331Z 2026-10-22T20:15:30.6200543Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.6200776Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:122:38] 2026-10-22T20:15:30.6200988Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-22T20:15:30.6201136Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-22T20:15:30.6201308Z ·  ───────────┬────────── 2026-10-22T20:15:30.6201553Z · ╰── Cannot access ref value during render 2026-10-22T20:15:30.6201729Z 123 │ const sessionRef = useRef(null); 2026-10-22T20:15:30.6201810Z ╰──── 2026-10-22T20:15:30.6202385Z  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-22T20:15:30.6202730Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.6202733Z 2026-10-22T20:15:30.6202943Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.6203152Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8] 2026-10-22T20:15:30.6203236Z 125 │ 2026-10-22T20:15:30.6203399Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-22T20:15:30.6203566Z ·  ─────────┬──────── 2026-10-22T20:15:30.6203767Z · ╰── Cannot access ref value during render 2026-10-22T20:15:30.6203892Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-22T20:15:30.6203986Z ╰──── 2026-10-22T20:15:30.6204512Z  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-22T20:15:30.6204861Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.6204863Z 2026-10-22T20:15:30.6205129Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.6205365Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7] 2026-10-22T20:15:30.6205451Z 125 │ 2026-10-22T20:15:30.6205641Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-22T20:15:30.6205780Z ·  ─────────┬───────── 2026-10-22T20:15:30.6205958Z · ╰── Cannot access ref value during render 2026-10-22T20:15:30.6206109Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-22T20:15:30.6206205Z ╰──── 2026-10-22T20:15:30.6206754Z  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-22T20:15:30.6207113Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.6207118Z 2026-10-22T20:15:30.6207302Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.6207499Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31] 2026-10-22T20:15:30.6207641Z 125 │ 2026-10-22T20:15:30.6207800Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-22T20:15:30.6207945Z ·  ─────────┬───────── 2026-10-22T20:15:30.6208163Z · ╰── Cannot access ref value during render 2026-10-22T20:15:30.6208304Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-22T20:15:30.6208421Z ╰──── 2026-10-22T20:15:30.6208961Z  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-22T20:15:30.6209285Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.6209288Z 2026-10-22T20:15:30.6209480Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.6209727Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30] 2026-10-22T20:15:30.6209840Z 125 │ 2026-10-22T20:15:30.6209975Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-22T20:15:30.6210153Z ·  ──────────┬───────── 2026-10-22T20:15:30.6210409Z · ╰── Cannot access ref value during render 2026-10-22T20:15:30.6210580Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-22T20:15:30.6210689Z ╰──── 2026-10-22T20:15:30.6211193Z  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-22T20:15:30.6211555Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.6211560Z 2026-10-22T20:15:30.6211790Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.6212136Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46] 2026-10-22T20:15:30.6212362Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-22T20:15:30.6212595Z 127 │ ╭─▶ const recorder = createLazyVoiceRecorder({ 2026-10-22T20:15:30.6212835Z 128 │ │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-22T20:15:30.6213020Z 129 │ │ onStatus: (status: RecordingStatus) => { 2026-10-22T20:15:30.6213233Z 130 │ │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-22T20:15:30.6213381Z 131 │ │ isFinished: status.isFinished, 2026-10-22T20:15:30.6213597Z 132 │ │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-22T20:15:30.6213789Z 133 │ │ error: status.error, 2026-10-22T20:15:30.6213946Z 134 │ │ url: status.url, 2026-10-22T20:15:30.6214051Z 135 │ │ }); 2026-10-22T20:15:30.6214179Z 136 │ │ }, 2026-10-22T20:15:30.6214460Z 137 │ │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-22T20:15:30.6214636Z 138 │ │ selectInput: (inputs) => { 2026-10-22T20:15:30.6214851Z 139 │ │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-22T20:15:30.6215026Z 140 │ │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-22T20:15:30.6215242Z 141 │ │ const known = microphoneOrder(preferences.value.microphones); 2026-10-22T20:15:30.6215471Z 142 │ │ const order = rememberMicrophones(known, inputs); 2026-10-22T20:15:30.6215628Z 143 │ │ if (order !== known) { 2026-10-22T20:15:30.6215793Z 144 │ │ registry.set(updateMobilePreferencesAtom, { 2026-10-22T20:15:30.6215957Z 145 │ │ transform: (current) => ({ 2026-10-22T20:15:30.6216217Z 146 │ │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-22T20:15:30.6216376Z 147 │ │ }), 2026-10-22T20:15:30.6216484Z 148 │ │ }); 2026-10-22T20:15:30.6216621Z 149 │ │ } 2026-10-22T20:15:30.6216813Z 150 │ │ return preferredMicrophoneInput(inputs, order); 2026-10-22T20:15:30.6216978Z 151 │ │ }, 2026-10-22T20:15:30.6217144Z 152 │ ├─▶ }); 2026-10-22T20:15:30.6217446Z · ╰──── Passing a ref to a function may read its value during render 2026-10-22T20:15:30.6217577Z 153 │ recorderRef.current = recorder; 2026-10-22T20:15:30.6217679Z ╰──── 2026-10-22T20:15:30.6218217Z  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-22T20:15:30.6218536Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.6218611Z 2026-10-22T20:15:30.6218857Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.6219058Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16] 2026-10-22T20:15:30.6219195Z 152 │ }); 2026-10-22T20:15:30.6219299Z 153 │ recorderRef.current = recorder; 2026-10-22T20:15:30.6219477Z ·  ─────┬─────────┬─── 2026-10-22T20:15:30.6219733Z · │ ╰── Cannot update ref value during render 2026-10-22T20:15:30.6219909Z · ╰── This value is a ref 2026-10-22T20:15:30.6220070Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-22T20:15:30.6220148Z ╰──── 2026-10-22T20:15:30.6220799Z  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-22T20:15:30.6221133Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.6221136Z 2026-10-22T20:15:30.6221362Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.6221563Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48] 2026-10-22T20:15:30.6221670Z 153 │ recorderRef.current = recorder; 2026-10-22T20:15:30.6221972Z 154 │ ╭─▶ sessionRef.current = new VoiceInputSession({ 2026-10-22T20:15:30.6222115Z 155 │ │ recorder, 2026-10-22T20:15:30.6222319Z 156 │ │ getTranscriber: getLocalVoiceTranscriber, 2026-10-22T20:15:30.6222462Z 157 │ │ requestPermission: async () => { 2026-10-22T20:15:30.6222684Z 158 │ │ const permission = await requestRecordingPermissionsAsync(); 2026-10-22T20:15:30.6222923Z 159 │ │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-22T20:15:30.6223075Z 160 │ │ }, 2026-10-22T20:15:30.6223244Z 161 │ │ configureRecording: configureVoiceRecordingAudio, 2026-10-22T20:15:30.6223440Z 162 │ │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-22T20:15:30.6223624Z 163 │ │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-22T20:15:30.6223799Z 164 │ │ onStateChange: (nextState) => 2026-10-22T20:15:30.6223924Z 165 │ │ setState({ 2026-10-22T20:15:30.6224074Z 166 │ │ state: nextState, 2026-10-22T20:15:30.6224262Z 167 │ │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-22T20:15:30.6224430Z 168 │ │ label: sessionRef.current?.label ?? null, 2026-10-22T20:15:30.6224585Z 169 │ │ }), 2026-10-22T20:15:30.6224744Z 170 │ ├─▶ }); 2026-10-22T20:15:30.6225007Z · ╰──── Cannot access ref value during render 2026-10-22T20:15:30.6225118Z 171 │ } 2026-10-22T20:15:30.6225222Z ╰──── 2026-10-22T20:15:30.6225867Z  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-22T20:15:30.6226296Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.6226299Z 2026-10-22T20:15:30.6226506Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.6226714Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15] 2026-10-22T20:15:30.6226884Z 153 │ recorderRef.current = recorder; 2026-10-22T20:15:30.6227016Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-22T20:15:30.6227206Z ·  ─────┬────────┬─── 2026-10-22T20:15:30.6227461Z · │ ╰── Cannot update ref value during render 2026-10-22T20:15:30.6227647Z · ╰── This value is a ref 2026-10-22T20:15:30.6227747Z 155 │ recorder, 2026-10-22T20:15:30.6227855Z ╰──── 2026-10-22T20:15:30.6228386Z  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-22T20:15:30.6228724Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.6228727Z 2026-10-22T20:15:30.6228950Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.6229140Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7] 2026-10-22T20:15:30.6229271Z 184 │ return () => subscription.remove(); 2026-10-22T20:15:30.6229385Z 185 │ }, [controller]); 2026-10-22T20:15:30.6229516Z ·  ─────┬──── 2026-10-22T20:15:30.6229697Z · ╰── Cannot access ref value during render 2026-10-22T20:15:30.6229785Z 186 │ 2026-10-22T20:15:30.6229885Z ╰──── 2026-10-22T20:15:30.6230407Z  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-22T20:15:30.6230820Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.6230919Z 2026-10-22T20:15:30.6231099Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.6231328Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6] 2026-10-22T20:15:30.6231467Z 184 │ return () => subscription.remove(); 2026-10-22T20:15:30.6231612Z 185 │ }, [controller]); 2026-10-22T20:15:30.6231735Z ·  ──────┬───── 2026-10-22T20:15:30.6231995Z · ╰── Cannot access ref value during render 2026-10-22T20:15:30.6232110Z 186 │ 2026-10-22T20:15:30.6232202Z ╰──── 2026-10-22T20:15:30.6232732Z  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-22T20:15:30.6233104Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.6233107Z 2026-10-22T20:15:30.6233297Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.6233520Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6] 2026-10-22T20:15:30.6233631Z 191 │ }, 2026-10-22T20:15:30.6233743Z 192 │ [controller, recorder], 2026-10-22T20:15:30.6233874Z ·  ─────┬──── 2026-10-22T20:15:30.6234077Z · ╰── Cannot access ref value during render 2026-10-22T20:15:30.6234184Z 193 │ ); 2026-10-22T20:15:30.6234309Z ╰──── 2026-10-22T20:15:30.6234851Z  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-22T20:15:30.6235200Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.6235202Z 2026-10-22T20:15:30.6235403Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.6235630Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20] 2026-10-22T20:15:30.6235756Z 174 │ const controller = session.controller; 2026-10-22T20:15:30.6235891Z 175 │ const recorder = recorderRef.current; 2026-10-22T20:15:30.6236048Z ·  ─────────┬───────── 2026-10-22T20:15:30.6236248Z · ╰── Cannot access ref value during render 2026-10-22T20:15:30.6236331Z 176 │ 2026-10-22T20:15:30.6236436Z ╰──── 2026-10-22T20:15:30.6236951Z  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-22T20:15:30.6237282Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.6237284Z 2026-10-22T20:15:30.6237586Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.6237837Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5] 2026-10-22T20:15:30.6237967Z 191 │ }, 2026-10-22T20:15:30.6238083Z 192 │ [controller, recorder], 2026-10-22T20:15:30.6238207Z ·  ───────────┬────────── 2026-10-22T20:15:30.6238397Z · ╰── Cannot access ref value during render 2026-10-22T20:15:30.6238501Z 193 │ ); 2026-10-22T20:15:30.6238592Z ╰──── 2026-10-22T20:15:30.6239105Z  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-22T20:15:30.6239409Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.6239417Z 2026-10-22T20:15:30.6239630Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.6239832Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20] 2026-10-22T20:15:30.6239972Z 245 │ return () => clearInterval(intervalId); 2026-10-22T20:15:30.6240119Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-22T20:15:30.6240247Z ·  ─────┬──── 2026-10-22T20:15:30.6240460Z · ╰── Cannot access ref value during render 2026-10-22T20:15:30.6240553Z 247 │ 2026-10-22T20:15:30.6240760Z ╰──── 2026-10-22T20:15:30.6241251Z  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-22T20:15:30.6241619Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.6241621Z 2026-10-22T20:15:30.6241811Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.6242074Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6] 2026-10-22T20:15:30.6242189Z 245 │ return () => clearInterval(intervalId); 2026-10-22T20:15:30.6247057Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-22T20:15:30.6247262Z ·  ────────────────────────┬─────────────────────── 2026-10-22T20:15:30.6247448Z · ╰── Cannot access ref value during render 2026-10-22T20:15:30.6247516Z 247 │ 2026-10-22T20:15:30.6247581Z ╰──── 2026-10-22T20:15:30.6248072Z  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-22T20:15:30.6248381Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.6248384Z 2026-10-22T20:15:30.6248543Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.6248718Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5] 2026-10-22T20:15:30.6248798Z 260 │ setOwnerFocused, 2026-10-22T20:15:30.6248867Z 261 │ session, 2026-10-22T20:15:30.6249075Z ·  ───┬─── 2026-10-22T20:15:30.6249281Z · ╰── Cannot access ref value during render 2026-10-22T20:15:30.6249351Z 262 │ stop, 2026-10-22T20:15:30.6249406Z ╰──── 2026-10-22T20:15:30.6249896Z  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-22T20:15:30.6250203Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.6250206Z 2026-10-22T20:15:30.6250370Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.6250552Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10] 2026-10-22T20:15:30.6250617Z 250 │ 2026-10-22T20:15:30.6250777Z 251 │ ╭─▶ return { 2026-10-22T20:15:30.6251019Z 252 │ │ isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null, 2026-10-22T20:15:30.6251124Z 253 │ │ state, 2026-10-22T20:15:30.6251218Z 254 │ │ audioLevels, 2026-10-22T20:15:30.6251323Z 255 │ │ elapsedSeconds, 2026-10-22T20:15:30.6251473Z 256 │ │ isBusy: voiceInputBlocksSubmission(state), 2026-10-22T20:15:30.6251574Z 257 │ │ ownerKey, 2026-10-22T20:15:30.6251662Z 258 │ │ label, 2026-10-22T20:15:30.6251772Z 259 │ │ focusedOwners, 2026-10-22T20:15:30.6251924Z 260 │ │ setOwnerFocused, 2026-10-22T20:15:30.6252015Z 261 │ │ session, 2026-10-22T20:15:30.6252100Z 262 │ │ stop, 2026-10-22T20:15:30.6252190Z 263 │ │ cancel, 2026-10-22T20:15:30.6252333Z 264 │ ├─▶ }; 2026-10-22T20:15:30.6252554Z · ╰──── Cannot access ref value during render 2026-10-22T20:15:30.6252614Z 265 │ } 2026-10-22T20:15:30.6252674Z ╰──── 2026-10-22T20:15:30.6253168Z  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-22T20:15:30.6253477Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.6253480Z 2026-10-22T20:15:30.6253650Z ⚠ react(immutability): This value cannot be modified 2026-10-22T20:15:30.6253815Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-22T20:15:30.6253992Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-22T20:15:30.6254130Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-22T20:15:30.6254222Z ·  ─────┬───── 2026-10-22T20:15:30.6254369Z · ╰── `audioLevels` originates here 2026-10-22T20:15:30.6254577Z 123 │ const sessionRef = useRef(null); 2026-10-22T20:15:30.6254779Z 124 │ const recorderRef = useRef | null>(null); 2026-10-22T20:15:30.6254838Z 125 │ 2026-10-22T20:15:30.6254950Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-22T20:15:30.6255067Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-22T20:15:30.6255219Z 128 │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-22T20:15:30.6255323Z 129 │ onStatus: (status: RecordingStatus) => { 2026-10-22T20:15:30.6255458Z 130 │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-22T20:15:30.6255558Z 131 │ isFinished: status.isFinished, 2026-10-22T20:15:30.6255714Z 132 │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-22T20:15:30.6255796Z 133 │ error: status.error, 2026-10-22T20:15:30.6255877Z 134 │ url: status.url, 2026-10-22T20:15:30.6255957Z 135 │ }); 2026-10-22T20:15:30.6256023Z 136 │ }, 2026-10-22T20:15:30.6256202Z 137 │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-22T20:15:30.6256287Z 138 │ selectInput: (inputs) => { 2026-10-22T20:15:30.6256423Z 139 │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-22T20:15:30.6256551Z 140 │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-22T20:15:30.6256700Z 141 │ const known = microphoneOrder(preferences.value.microphones); 2026-10-22T20:15:30.6256817Z 142 │ const order = rememberMicrophones(known, inputs); 2026-10-22T20:15:30.6256903Z 143 │ if (order !== known) { 2026-10-22T20:15:30.6257027Z 144 │ registry.set(updateMobilePreferencesAtom, { 2026-10-22T20:15:30.6257129Z 145 │ transform: (current) => ({ 2026-10-22T20:15:30.6257317Z 146 │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-22T20:15:30.6257390Z 147 │ }), 2026-10-22T20:15:30.6257465Z 148 │ }); 2026-10-22T20:15:30.6257525Z 149 │ } 2026-10-22T20:15:30.6257647Z 150 │ return preferredMicrophoneInput(inputs, order); 2026-10-22T20:15:30.6257719Z 151 │ }, 2026-10-22T20:15:30.6257785Z 152 │ }); 2026-10-22T20:15:30.6257874Z 153 │ recorderRef.current = recorder; 2026-10-22T20:15:30.6257987Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-22T20:15:30.6258062Z 155 │ recorder, 2026-10-22T20:15:30.6258176Z 156 │ getTranscriber: getLocalVoiceTranscriber, 2026-10-22T20:15:30.6258266Z 157 │ requestPermission: async () => { 2026-10-22T20:15:30.6258418Z 158 │ const permission = await requestRecordingPermissionsAsync(); 2026-10-22T20:15:30.6258594Z 159 │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-22T20:15:30.6258663Z 160 │ }, 2026-10-22T20:15:30.6258782Z 161 │ configureRecording: configureVoiceRecordingAudio, 2026-10-22T20:15:30.6258904Z 162 │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-22T20:15:30.6259025Z 163 │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-22T20:15:30.6259118Z 164 │ onStateChange: (nextState) => 2026-10-22T20:15:30.6259188Z 165 │ setState({ 2026-10-22T20:15:30.6259274Z 166 │ state: nextState, 2026-10-22T20:15:30.6259395Z 167 │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-22T20:15:30.6259513Z 168 │ label: sessionRef.current?.label ?? null, 2026-10-22T20:15:30.6259578Z 169 │ }), 2026-10-22T20:15:30.6259652Z 170 │ }); 2026-10-22T20:15:30.6259799Z 171 │ } 2026-10-22T20:15:30.6259902Z 172 │ 2026-10-22T20:15:30.6259996Z 173 │ const session = sessionRef.current; 2026-10-22T20:15:30.6260097Z 174 │ const controller = session.controller; 2026-10-22T20:15:30.6260207Z 175 │ const recorder = recorderRef.current; 2026-10-22T20:15:30.6260396Z 176 │ 2026-10-22T20:15:30.6260477Z 177 │ useEffect(() => { 2026-10-22T20:15:30.6260649Z 178 │ const subscription = AppState.addEventListener("change", (nextState) => { 2026-10-22T20:15:30.6260804Z 179 │ // iOS reports `inactive` while its permission dialog is open. Only the 2026-10-22T20:15:30.6260954Z 180 │ // real background state cancels preparation; recorder status handles 2026-10-22T20:15:30.6261076Z 181 │ // calls and route interruptions during capture. 2026-10-22T20:15:30.6261238Z 182 │ if (nextState === "background") controller.appMovedToBackground(); 2026-10-22T20:15:30.6261313Z 183 │ }); 2026-10-22T20:15:30.6261405Z 184 │ return () => subscription.remove(); 2026-10-22T20:15:30.6261480Z 185 │ }, [controller]); 2026-10-22T20:15:30.6261540Z 186 │ 2026-10-22T20:15:30.6261608Z 187 │ useEffect( 2026-10-22T20:15:30.6261675Z 188 │ () => () => { 2026-10-22T20:15:30.6261758Z 189 │ controller.dispose(); 2026-10-22T20:15:30.6261838Z 190 │ recorder.release(); 2026-10-22T20:15:30.6261931Z 191 │ }, 2026-10-22T20:15:30.6262014Z 192 │ [controller, recorder], 2026-10-22T20:15:30.6262091Z 193 │ ); 2026-10-22T20:15:30.6262166Z 194 │ 2026-10-22T20:15:30.6262247Z 195 │ useEffect(() => { 2026-10-22T20:15:30.6262348Z 196 │ if (state.phase !== "recording") return; 2026-10-22T20:15:30.6262410Z 197 │ 2026-10-22T20:15:30.6262581Z 198 │ const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`; 2026-10-22T20:15:30.6262695Z 199 │ const activation = activateKeepAwakeAsync(tag); 2026-10-22T20:15:30.6262798Z 200 │ void activation.catch(() => {}); 2026-10-22T20:15:30.6262873Z 201 │ return () => { 2026-10-22T20:15:30.6263035Z 202 │ // Release after activation settles, even if the recording ends immediately. 2026-10-22T20:15:30.6263184Z 203 │ void activation.then(() => deactivateKeepAwake(tag)).catch(() => {}); 2026-10-22T20:15:30.6263253Z 204 │ }; 2026-10-22T20:15:30.6263343Z 205 │ }, [keepAwakeId, state.phase]); 2026-10-22T20:15:30.6263410Z 206 │ 2026-10-22T20:15:30.6263477Z 207 │ useEffect(() => { 2026-10-22T20:15:30.6263631Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-22T20:15:30.6263691Z 209 │ 2026-10-22T20:15:30.6263831Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-22T20:15:30.6263999Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-22T20:15:30.6264113Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-22T20:15:30.6264211Z ·  ─────┬───── 2026-10-22T20:15:30.6264384Z · ╰── `audioLevels` cannot be modified 2026-10-22T20:15:30.6264444Z 213 │ } 2026-10-22T20:15:30.6264507Z ╰──── 2026-10-22T20:15:30.6264805Z  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-22T20:15:30.6265136Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T20:15:30.6265139Z 2026-10-22T20:15:30.6265466Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-22T20:15:30.6265697Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-22T20:15:30.6265767Z 206 │ 2026-10-22T20:15:30.6265843Z 207 │ useEffect(() => { 2026-10-22T20:15:30.6265935Z ·  ───┬─── 2026-10-22T20:15:30.6266181Z · ╰── This function may (indirectly) reassign or modify `audioLevels` after render 2026-10-22T20:15:30.6266333Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-22T20:15:30.6266394Z 209 │ 2026-10-22T20:15:30.6266526Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-22T20:15:30.6266686Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-22T20:15:30.6266805Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-22T20:15:30.6266898Z ·  ─────┬───── 2026-10-22T20:15:30.6267054Z · ╰── This modifies `audioLevels` 2026-10-22T20:15:30.6267116Z 213 │ } 2026-10-22T20:15:30.6267184Z ╰──── 2026-10-22T20:15:30.6267553Z  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-22T20:15:30.6267875Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T20:15:30.6267878Z 2026-10-22T20:15:30.6268045Z ⚠ react(immutability): This value cannot be modified 2026-10-22T20:15:30.6268212Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:174:5] 2026-10-22T20:15:30.6268376Z 170 │ const expandedAngle = props.collapsedDirection === "right" ? 90 : 180; 2026-10-22T20:15:30.6268531Z 171 │ const rotation = useSharedValue(props.expanded ? expandedAngle : 0); 2026-10-22T20:15:30.6268625Z ·  ────┬─── 2026-10-22T20:15:30.6268777Z · ╰── `rotation` originates here 2026-10-22T20:15:30.6268841Z 172 │ 2026-10-22T20:15:30.6268922Z 173 │ useLayoutEffect(() => { 2026-10-22T20:15:30.6269066Z 174 │ rotation.value = withTiming(props.expanded ? expandedAngle : 0, { 2026-10-22T20:15:30.6269157Z ·  ────┬─── 2026-10-22T20:15:30.6269308Z · ╰── `rotation` cannot be modified 2026-10-22T20:15:30.6269424Z 175 │ duration: THREAD_DISCLOSURE_TRANSITION_MS, 2026-10-22T20:15:30.6269480Z ╰──── 2026-10-22T20:15:30.6269817Z  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-22T20:15:30.6270175Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T20:15:30.6270177Z 2026-10-22T20:15:30.6270389Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-22T20:15:30.6270557Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:1246:23] 2026-10-22T20:15:30.6270630Z 1245 │ { 2026-10-22T20:15:30.6273330Z 68 │ progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING); 2026-10-22T20:15:30.6273415Z ·  ────┬─── 2026-10-22T20:15:30.6273575Z · ╰── `progress` cannot be modified 2026-10-22T20:15:30.6273653Z 69 │ }, [expanded, progress]); 2026-10-22T20:15:30.6273717Z ╰──── 2026-10-22T20:15:30.6274003Z  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-22T20:15:30.6274330Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-22T20:15:30.6274333Z 2026-10-22T20:15:30.6274505Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.6274674Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39] 2026-10-22T20:15:30.6274746Z 276 │ 2026-10-22T20:15:30.6275016Z 277 │ ╭─▶ return createElement(RawNativeView, { 2026-10-22T20:15:30.6275166Z 278 │ │ ...nativeProps, 2026-10-22T20:15:30.6275321Z 279 │ │ refreshEnabled: props.onPullToRefresh !== undefined, 2026-10-22T20:15:30.6275428Z 280 │ │ ref: nativeRef, 2026-10-22T20:15:30.6275572Z 281 │ ├─▶ }); 2026-10-22T20:15:30.6275831Z · ╰──── Passing a ref to a function may read its value during render 2026-10-22T20:15:30.6275891Z 282 │ } 2026-10-22T20:15:30.6275958Z ╰──── 2026-10-22T20:15:30.6276457Z  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-22T20:15:30.6276766Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.6276768Z 2026-10-22T20:15:30.6276949Z ⚠ react(purity): Cannot call impure function during render 2026-10-22T20:15:30.6277088Z ╭─[apps/web/src/components/CommandPalette.tsx:1996:20] 2026-10-22T20:15:30.6277217Z 1995 │ title: inferProjectTitleFromPath(destinationPath), 2026-10-22T20:15:30.6277327Z 1996 │ createdAt: new Date().toISOString(), 2026-10-22T20:15:30.6277431Z ·  ─────┬──── 2026-10-22T20:15:30.6277586Z · ╰── Cannot call impure function 2026-10-22T20:15:30.6277706Z 1997 │ remoteUrl: addProjectCloneFlow.remoteUrl, 2026-10-22T20:15:30.6277775Z ╰──── 2026-10-22T20:15:30.6278073Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-22T20:15:30.6278386Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-22T20:15:30.6278388Z 2026-10-22T20:15:30.6278612Z ⚠ eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used. 2026-10-22T20:15:30.6278720Z ╭─[apps/web/src/types.ts:22:3] 2026-10-22T20:15:30.6278803Z 21 │ EnvironmentThreadShell, 2026-10-22T20:15:30.6278872Z 22 │ ThreadRunSummary, 2026-10-22T20:15:30.6278966Z ·  ────────┬─────── 2026-10-22T20:15:30.6279129Z · ╰── 'ThreadRunSummary' is imported here 2026-10-22T20:15:30.6279213Z 23 │ ThreadRuntimeSummary, 2026-10-22T20:15:30.6279273Z ╰──── 2026-10-22T20:15:30.6279387Z  help: Consider removing this import. 2026-10-22T20:15:30.6279390Z 2026-10-22T20:15:30.6279698Z ⚠ eslint(no-unused-vars): Variable 'revokeActiveMcpThread' is declared but never used. Unused variables should start with a '_'. 2026-10-22T20:15:30.6279842Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:218:7] 2026-10-22T20:15:30.6279899Z 217 │ 2026-10-22T20:15:30.6280068Z 218 │ const revokeActiveMcpThread = (threadId: ThreadId): Effect.Effect => 2026-10-22T20:15:30.6280173Z ·  ──────────┬────────── 2026-10-22T20:15:30.6280346Z · ╰── 'revokeActiveMcpThread' is declared here 2026-10-22T20:15:30.6280610Z 219 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeThread(threadId) : Effect.void; 2026-10-22T20:15:30.6280705Z ╰──── 2026-10-22T20:15:30.6280822Z  help: Consider removing this declaration. 2026-10-22T20:15:30.6280825Z 2026-10-22T20:15:30.6281152Z ⚠ eslint(no-unused-vars): Variable 'revokeAllActiveMcpCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-22T20:15:30.6281290Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:221:7] 2026-10-22T20:15:30.6281347Z 220 │ 2026-10-22T20:15:30.6281495Z 221 │ const revokeAllActiveMcpCredentials = (): Effect.Effect => 2026-10-22T20:15:30.6281612Z ·  ──────────────┬────────────── 2026-10-22T20:15:30.6281806Z · ╰── 'revokeAllActiveMcpCredentials' is declared here 2026-10-22T20:15:30.6282027Z 222 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void; 2026-10-22T20:15:30.6282097Z ╰──── 2026-10-22T20:15:30.6282213Z  help: Consider removing this declaration. 2026-10-22T20:15:30.6282216Z 2026-10-22T20:15:30.6282489Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.6282644Z ╭─[apps/mobile/src/components/VideoPreviewModal.ios.tsx:63:55] 2026-10-22T20:15:30.6282714Z 61 │ }, []); 2026-10-22T20:15:30.6282787Z 62 │ useEffect(() => { 2026-10-22T20:15:30.6282869Z ·  ────┬──── 2026-10-22T20:15:30.6283008Z · ╰── This is the containing effect 2026-10-22T20:15:30.6283172Z 63 │ if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl); 2026-10-22T20:15:30.6283318Z ·  ───────┬────── 2026-10-22T20:15:30.6283549Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.6283637Z 64 │ }, [playbackUrl, resolvedUrl]); 2026-10-22T20:15:30.6283695Z ╰──── 2026-10-22T20:15:30.6284332Z  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-22T20:15:30.6284674Z  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-22T20:15:30.6284681Z 2026-10-22T20:15:30.6284905Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T20:15:30.6285044Z ╭─[apps/mobile/src/components/ComposerEditor.tsx:82:6] 2026-10-22T20:15:30.6285114Z 81 │ }, 2026-10-22T20:15:30.6285188Z 82 │ [draftKey], 2026-10-22T20:15:30.6285276Z ·  ────┬─── 2026-10-22T20:15:30.6285429Z · ╰── Unnecessary dependency `draftKey` 2026-10-22T20:15:30.6285490Z 83 │ ); 2026-10-22T20:15:30.6285553Z ╰──── 2026-10-22T20:15:30.6285866Z  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-22T20:15:30.6286270Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.6286313Z 2026-10-22T20:15:30.6286589Z ⚠ unicorn(prefer-add-event-listener): Prefer `addEventListener()` over their `on`-function counterparts. 2026-10-22T20:15:30.6286751Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:12:14] 2026-10-22T20:15:30.6286920Z 11 │ addEventListener(_type: string, listener: (event: { data: string }) => void) { 2026-10-22T20:15:30.6287010Z 12 │ this.onmessage = listener; 2026-10-22T20:15:30.6287098Z ·  ───────── 2026-10-22T20:15:30.6287160Z 13 │ } 2026-10-22T20:15:30.6287222Z ╰──── 2026-10-22T20:15:30.6287564Z  help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on` replaces any previously registered handler. 2026-10-22T20:15:30.6287573Z 2026-10-22T20:15:30.6287791Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-22T20:15:30.6287947Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:16:9] 2026-10-22T20:15:30.6288025Z 15 │ constructor() { 2026-10-22T20:15:30.6288100Z 16 │ source = this; 2026-10-22T20:15:30.6288177Z ·  ────── 2026-10-22T20:15:30.6288243Z 17 │ } 2026-10-22T20:15:30.6288311Z ╰──── 2026-10-22T20:15:30.6288601Z  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-22T20:15:30.6288606Z 2026-10-22T20:15:30.6288817Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T20:15:30.6288972Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:542:25] 2026-10-22T20:15:30.6289121Z 541 │ // range) the boundary string is identical and the chain would die. 2026-10-22T20:15:30.6289223Z 542 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-22T20:15:30.6289338Z ·  ───────┬────── 2026-10-22T20:15:30.6289522Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-22T20:15:30.6289674Z 543 │ const v2SearchQuery = props.searchQuery.trim().toLocaleLowerCase(); 2026-10-22T20:15:30.6289742Z ╰──── 2026-10-22T20:15:30.6290047Z  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-22T20:15:30.6290382Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.6290387Z 2026-10-22T20:15:30.6290575Z ⚠ react(purity): Cannot call impure function during render 2026-10-22T20:15:30.6290714Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:533:53] 2026-10-22T20:15:30.6290813Z 532 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-22T20:15:30.6290983Z 533 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-22T20:15:30.6291118Z ·  ─────┬──── 2026-10-22T20:15:30.6291317Z · ╰── Cannot call impure function 2026-10-22T20:15:30.6291404Z 534 │ const id = setTimeout(() => { 2026-10-22T20:15:30.6291463Z ╰──── 2026-10-22T20:15:30.6291838Z  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-22T20:15:30.6292231Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-22T20:15:30.6292234Z 2026-10-22T20:15:30.6292390Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.6292558Z ╭─[apps/mobile/src/features/home/thread-swipe-actions.tsx:494:27] 2026-10-22T20:15:30.6292619Z 493 │ > 2026-10-22T20:15:30.6292703Z 494 │ {props.children(close)} 2026-10-22T20:15:30.6292802Z ·  ──┬── 2026-10-22T20:15:30.6292975Z · ╰── Cannot access ref value during render 2026-10-22T20:15:30.6293062Z 495 │ 2026-10-22T20:15:30.6293124Z ╰──── 2026-10-22T20:15:30.6293617Z  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-22T20:15:30.6293927Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.6293929Z 2026-10-22T20:15:30.6294142Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-22T20:15:30.6294326Z ╭─[apps/server/src/sourceControl/SourceControlProviderRegistry.ts:15:13] 2026-10-22T20:15:30.6294419Z 14 │ } from "@t3tools/contracts"; 2026-10-22T20:15:30.6294529Z 15 │ import type {} from "@t3tools/contracts"; 2026-10-22T20:15:30.6294609Z ·  ── 2026-10-22T20:15:30.6294803Z 16 │ import { detectSourceControlProviderFromRemoteUrl } from "@t3tools/shared/sourceControl"; 2026-10-22T20:15:30.6294867Z ╰──── 2026-10-22T20:15:30.6294965Z  help: Remove empty braces 2026-10-22T20:15:30.6294968Z 2026-10-22T20:15:30.6295241Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-22T20:15:30.6295379Z ╭─[apps/server/src/serverRuntimeStartup.ts:728:7] 2026-10-22T20:15:30.6295441Z 727 │ 2026-10-22T20:15:30.6295538Z 728 │ const layer = layerWithOptions(); 2026-10-22T20:15:30.6295613Z ·  ──┬── 2026-10-22T20:15:30.6295828Z · ╰── 'layer' is declared here 2026-10-22T20:15:30.6295938Z ╰──── 2026-10-22T20:15:30.6296061Z  help: Consider removing this declaration. 2026-10-22T20:15:30.6296064Z 2026-10-22T20:15:30.6296239Z ⚠ react(purity): Cannot call impure function during render 2026-10-22T20:15:30.6296401Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:372:47] 2026-10-22T20:15:30.6296556Z 371 │ const { open, onOpenChange, onSnooze, timestampFormat } = props; 2026-10-22T20:15:30.6296724Z 372 │ const presets = open ? resolveSnoozePresets(new Date(), timestampFormat) : []; 2026-10-22T20:15:30.6296855Z ·  ─────┬──── 2026-10-22T20:15:30.6297029Z · ╰── Cannot call impure function 2026-10-22T20:15:30.6297103Z 373 │ return ( 2026-10-22T20:15:30.6297168Z ╰──── 2026-10-22T20:15:30.6297465Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-22T20:15:30.6297771Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-22T20:15:30.6297773Z 2026-10-22T20:15:30.6297960Z ⚠ react(purity): Cannot call impure function during render 2026-10-22T20:15:30.6298135Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:853:39] 2026-10-22T20:15:30.6298239Z 852 │ if (snoozeGateClock.thread !== thread) { 2026-10-22T20:15:30.6298373Z 853 │ setSnoozeGateClock({ thread, now: new Date().toISOString() }); 2026-10-22T20:15:30.6298503Z ·  ─────┬──── 2026-10-22T20:15:30.6298683Z · ╰── Cannot call impure function 2026-10-22T20:15:30.6298752Z 854 │ } 2026-10-22T20:15:30.6298808Z ╰──── 2026-10-22T20:15:30.6299097Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-22T20:15:30.6299405Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-22T20:15:30.6299407Z 2026-10-22T20:15:30.6299607Z ⚠ eslint(no-unused-vars): Type 'Scope' is imported but never used. 2026-10-22T20:15:30.6299759Z ╭─[apps/server/src/provider/ProviderAuthService.ts:15:18] 2026-10-22T20:15:30.6299866Z 14 │ import * as Layer from "effect/Layer"; 2026-10-22T20:15:30.6299985Z 15 │ import type * as Scope from "effect/Scope"; 2026-10-22T20:15:30.6300080Z ·  ──┬── 2026-10-22T20:15:30.6300287Z · ╰── 'Scope' is imported here 2026-10-22T20:15:30.6300383Z 16 │ import * as Stream from "effect/Stream"; 2026-10-22T20:15:30.6300453Z ╰──── 2026-10-22T20:15:30.6300566Z  help: Consider removing this import. 2026-10-22T20:15:30.6300569Z 2026-10-22T20:15:30.6300723Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.6300884Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:152:27] 2026-10-22T20:15:30.6301082Z 151 │ 2026-10-22T20:15:30.6301174Z 152 │ {props.children(open)} 2026-10-22T20:15:30.6301363Z ·  ──┬─ 2026-10-22T20:15:30.6301587Z · ╰── Cannot access ref value during render 2026-10-22T20:15:30.6301672Z 153 │ 2026-10-22T20:15:30.6301733Z ╰──── 2026-10-22T20:15:30.6302254Z  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-22T20:15:30.6302559Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.6302561Z 2026-10-22T20:15:30.6302774Z ⚠ react(memo-dependencies): Found missing/extra memoization dependencies 2026-10-22T20:15:30.6302945Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:140:9] 2026-10-22T20:15:30.6303039Z 139 │ if (action.id !== undefined) { 2026-10-22T20:15:30.6303126Z 140 │ props.onPressAction?.({ 2026-10-22T20:15:30.6303203Z ·  ──┬── 2026-10-22T20:15:30.6303347Z · ╰── Missing dependency `props` 2026-10-22T20:15:30.6303454Z 141 │ nativeEvent: { event: action.id }, 2026-10-22T20:15:30.6303613Z 142 │ } as Parameters>[0]); 2026-10-22T20:15:30.6303674Z 143 │ } 2026-10-22T20:15:30.6303738Z 144 │ }, 2026-10-22T20:15:30.6303831Z 145 │ [close, props.onPressAction], 2026-10-22T20:15:30.6303937Z ·  ─────────┬───────── 2026-10-22T20:15:30.6304172Z · ╰── Overly precise dependency `props.onPressAction`, use `props` instead 2026-10-22T20:15:30.6304243Z 146 │ ); 2026-10-22T20:15:30.6304301Z ╰──── 2026-10-22T20:15:30.6304810Z  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-22T20:15:30.6305143Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.6305151Z 2026-10-22T20:15:30.6305354Z ⚠ eslint(no-unused-vars): Identifier 'Image' is imported but never used. 2026-10-22T20:15:30.6305509Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:17:10] 2026-10-22T20:15:30.6305658Z 16 │ import type { NativeSyntheticEvent, ViewProps } from "react-native"; 2026-10-22T20:15:30.6305782Z 17 │ import { Image, Platform, StyleSheet } from "react-native"; 2026-10-22T20:15:30.6305861Z ·  ──┬── 2026-10-22T20:15:30.6306005Z · ╰── 'Image' is imported here 2026-10-22T20:15:30.6306073Z 18 │ 2026-10-22T20:15:30.6306129Z ╰──── 2026-10-22T20:15:30.6306241Z  help: Consider removing this import. 2026-10-22T20:15:30.6306244Z 2026-10-22T20:15:30.6306462Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-22T20:15:30.6306621Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:227:6] 2026-10-22T20:15:30.6306797Z 223 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-22T20:15:30.6307114Z 224 │ nativeEventSnapshotsRef.current, 2026-10-22T20:15:30.6307257Z ·  ───────────┬─────────── 2026-10-22T20:15:30.6307743Z · ╰── 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-22T20:15:30.6307826Z 225 │ mostRecentEventCount, 2026-10-22T20:15:30.6307884Z 226 │ ); 2026-10-22T20:15:30.6308025Z 227 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-22T20:15:30.6308184Z ·  ──────────────────────────┬────────────────────────── 2026-10-22T20:15:30.6308402Z · ╰── This dependency list is missing values used by the callback 2026-10-22T20:15:30.6308497Z 228 │ const assumedValue = props.value; 2026-10-22T20:15:30.6308564Z ╰──── 2026-10-22T20:15:30.6308748Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-22T20:15:30.6309076Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.6309078Z 2026-10-22T20:15:30.6309310Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-22T20:15:30.6309462Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:235:7] 2026-10-22T20:15:30.6309619Z 234 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-22T20:15:30.6309720Z 235 │ nativeEventSnapshotsRef.current, 2026-10-22T20:15:30.6309824Z ·  ───────────┬─────────── 2026-10-22T20:15:30.6310307Z · ╰── 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-22T20:15:30.6310392Z 236 │ controlledEventCount, 2026-10-22T20:15:30.6310468Z 237 │ assumedValue, 2026-10-22T20:15:30.6310529Z 238 │ ); 2026-10-22T20:15:30.6310702Z 239 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-22T20:15:30.6310857Z ·  ───────────┬────────── 2026-10-22T20:15:30.6311086Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-22T20:15:30.6311192Z 240 │ const acceptNativeEvent = useCallback( 2026-10-22T20:15:30.6311252Z ╰──── 2026-10-22T20:15:30.6311699Z  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-22T20:15:30.6312069Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.6312072Z 2026-10-22T20:15:30.6312228Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.6312391Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:160:29] 2026-10-22T20:15:30.6312525Z 159 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-22T20:15:30.6312714Z 160 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-22T20:15:30.6312884Z ·  ─────────────┬──────────── 2026-10-22T20:15:30.6313074Z · ╰── Cannot access ref value during render 2026-10-22T20:15:30.6313136Z 161 │ }); 2026-10-22T20:15:30.6313197Z ╰──── 2026-10-22T20:15:30.6313683Z  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-22T20:15:30.6313992Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.6313994Z 2026-10-22T20:15:30.6314157Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.6314312Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:160:29] 2026-10-22T20:15:30.6314451Z 159 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-22T20:15:30.6314575Z 160 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-22T20:15:30.6314710Z ·  ─────────────┬──────────── 2026-10-22T20:15:30.6314929Z · ╰── Passing a ref to a function may read its value during render 2026-10-22T20:15:30.6314998Z 161 │ }); 2026-10-22T20:15:30.6315058Z ╰──── 2026-10-22T20:15:30.6315548Z  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-22T20:15:30.6315856Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.6315868Z 2026-10-22T20:15:30.6316021Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.6316178Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:23] 2026-10-22T20:15:30.6316240Z 161 │ }); 2026-10-22T20:15:30.6316338Z 162 │ confirmedTokensRef.current = tokens; 2026-10-22T20:15:30.6316472Z ·  ─────────┬────────────┬─── 2026-10-22T20:15:30.6316679Z · │ ╰── Cannot update ref value during render 2026-10-22T20:15:30.6316823Z · ╰── This value is a ref 2026-10-22T20:15:30.6316906Z 163 │ return JSON.stringify( 2026-10-22T20:15:30.6316960Z ╰──── 2026-10-22T20:15:30.6317442Z  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-22T20:15:30.6317747Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.6317750Z 2026-10-22T20:15:30.6317907Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.6318060Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:204:5] 2026-10-22T20:15:30.6318198Z 203 │ mostRecentEventCount, 2026-10-22T20:15:30.6318328Z 204 │ nativeEventSnapshotsRef.current, 2026-10-22T20:15:30.6318448Z ·  ───────────────┬─────────────── 2026-10-22T20:15:30.6318657Z · ╰── Passing a ref to a function may read its value during render 2026-10-22T20:15:30.6318714Z 205 │ ); 2026-10-22T20:15:30.6318773Z ╰──── 2026-10-22T20:15:30.6319250Z  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-22T20:15:30.6319551Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.6319554Z 2026-10-22T20:15:30.6319710Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.6319866Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:210:5] 2026-10-22T20:15:30.6319943Z 209 │ mostRecentEventCount, 2026-10-22T20:15:30.6320038Z 210 │ nativeEventSnapshotsRef.current, 2026-10-22T20:15:30.6320153Z ·  ───────────────┬─────────────── 2026-10-22T20:15:30.6320356Z · ╰── Passing a ref to a function may read its value during render 2026-10-22T20:15:30.6320423Z 211 │ ); 2026-10-22T20:15:30.6320484Z ╰──── 2026-10-22T20:15:30.6320967Z  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-22T20:15:30.6321277Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.6321279Z 2026-10-22T20:15:30.6321485Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-22T20:15:30.6321642Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:195:6] 2026-10-22T20:15:30.6321776Z 159 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-22T20:15:30.6321924Z 160 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-22T20:15:30.6322054Z ·  ─────────┬──────── 2026-10-22T20:15:30.6322641Z · ╰── 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-22T20:15:30.6322738Z 161 │ }); 2026-10-22T20:15:30.6322833Z 162 │ confirmedTokensRef.current = tokens; 2026-10-22T20:15:30.6322914Z 163 │ return JSON.stringify( 2026-10-22T20:15:30.6323095Z 164 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-22T20:15:30.6323173Z 165 │ const record = 2026-10-22T20:15:30.6323257Z 166 │ token.type === "context" 2026-10-22T20:15:30.6323439Z 167 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-22T20:15:30.6323513Z 168 │ : undefined; 2026-10-22T20:15:30.6323630Z 169 │ const presentation = contextChipPresentation( 2026-10-22T20:15:30.6323750Z 170 │ token.type === "context" ? token.kind : token.type, 2026-10-22T20:15:30.6323825Z 171 │ record, 2026-10-22T20:15:30.6323892Z 172 │ ); 2026-10-22T20:15:30.6323983Z 173 │ const icon = contextChipIcon( 2026-10-22T20:15:30.6324054Z 174 │ presentation, 2026-10-22T20:15:30.6324208Z 175 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-22T20:15:30.6324273Z 176 │ ); 2026-10-22T20:15:30.6324346Z 177 │ return { 2026-10-22T20:15:30.6324420Z 178 │ type: token.type, 2026-10-22T20:15:30.6324505Z 179 │ source: token.source, 2026-10-22T20:15:30.6324584Z 180 │ start: token.start, 2026-10-22T20:15:30.6324662Z 181 │ end: token.end, 2026-10-22T20:15:30.6324753Z 182 │ accent: presentation.accent, 2026-10-22T20:15:30.6324822Z 183 │ label: 2026-10-22T20:15:30.6324915Z 184 │ token.type === "skill" 2026-10-22T20:15:30.6325038Z 185 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-22T20:15:30.6325126Z 186 │ : token.type === "context" 2026-10-22T20:15:30.6325375Z 187 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-22T20:15:30.6325466Z 188 │ : basename(token.value), 2026-10-22T20:15:30.6325618Z 189 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-22T20:15:30.6325715Z 190 │ iconUri: contextChipIconUri(icon), 2026-10-22T20:15:30.6325812Z 191 │ tintsIcon: icon.kind === "chip", 2026-10-22T20:15:30.6325878Z 192 │ }; 2026-10-22T20:15:30.6325941Z 193 │ }), 2026-10-22T20:15:30.6326001Z 194 │ ); 2026-10-22T20:15:30.6326116Z 195 │ }, [props.value, props.context, skillLabels]); 2026-10-22T20:15:30.6326253Z ·  ────────────────────┬──────────────────── 2026-10-22T20:15:30.6326468Z · ╰── This dependency list is missing values used by the callback 2026-10-22T20:15:30.6326616Z 196 │ // Every render resolves against the snapshot history, so a render whose 2026-10-22T20:15:30.6326679Z ╰──── 2026-10-22T20:15:30.6326895Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-22T20:15:30.6327223Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.6327225Z 2026-10-22T20:15:30.6327422Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-22T20:15:30.6327641Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:257:5] 2026-10-22T20:15:30.6327822Z 249 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-22T20:15:30.6327934Z 250 │ nativeEventSnapshotsRef.current.push({ 2026-10-22T20:15:30.6328036Z ·  ───────────┬─────────── 2026-10-22T20:15:30.6328519Z · ╰── 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-22T20:15:30.6328627Z 251 │ eventCount: acknowledgedEventCount, 2026-10-22T20:15:30.6328696Z 252 │ value, 2026-10-22T20:15:30.6328783Z 253 │ selection: nextSelection, 2026-10-22T20:15:30.6328843Z 254 │ }); 2026-10-22T20:15:30.6328944Z 255 │ return acknowledgedEventCount; 2026-10-22T20:15:30.6329011Z 256 │ }, 2026-10-22T20:15:30.6329069Z 257 │ [], 2026-10-22T20:15:30.6329148Z ·  ─┬ 2026-10-22T20:15:30.6329343Z · ╰── This dependency list is missing values used by the callback 2026-10-22T20:15:30.6329404Z 258 │ ); 2026-10-22T20:15:30.6329459Z ╰──── 2026-10-22T20:15:30.6329675Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-22T20:15:30.6330005Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.6330008Z 2026-10-22T20:15:30.6330167Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.6330298Z ╭─[apps/mobile/src/components/ui/Menu.tsx:54:36] 2026-10-22T20:15:30.6330487Z 53 │ const child = children as ReactElement>; 2026-10-22T20:15:30.6330682Z 54 │ ╭─▶ children = cloneElement(child, { 2026-10-22T20:15:30.6330799Z 55 │ │ onTouchStart: (event) => { 2026-10-22T20:15:30.6330973Z 56 │ │ // Reset for a new touch, not onPressIn, which also fires when a 2026-10-22T20:15:30.6331142Z 57 │ │ // finger moves out of the row and back during the same gesture. 2026-10-22T20:15:30.6331284Z 58 │ │ menuPress.current.isPreparing = false; 2026-10-22T20:15:30.6331469Z 59 │ │ menuPress.current.suppressPress = menuPress.current.isOpen; 2026-10-22T20:15:30.6331597Z 60 │ │ pendingPress.current = null; 2026-10-22T20:15:30.6331727Z 61 │ │ child.props.onTouchStart?.(event); 2026-10-22T20:15:30.6331814Z 62 │ │ }, 2026-10-22T20:15:30.6331951Z 63 │ │ onPress: (event) => { 2026-10-22T20:15:30.6332157Z 64 │ │ // Accessibility clicks have no touch identifier and must not inherit 2026-10-22T20:15:30.6332300Z 65 │ │ // cancellation from a previous physical gesture. 2026-10-22T20:15:30.6332480Z 66 │ │ const isTouch = typeof event.nativeEvent.identifier === "number"; 2026-10-22T20:15:30.6332687Z 67 │ │ if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) { 2026-10-22T20:15:30.6332785Z 68 │ │ return; 2026-10-22T20:15:30.6332928Z 69 │ │ } 2026-10-22T20:15:30.6333111Z 70 │ │ if (isTouch && menuPress.current.isPreparing) { 2026-10-22T20:15:30.6333291Z 71 │ │ // A release can arrive between native menu preparation and display. 2026-10-22T20:15:30.6333468Z 72 │ │ // Let UIKit's display/cancel callback decide this press's outcome. 2026-10-22T20:15:30.6333577Z 73 │ │ event.persist(); 2026-10-22T20:15:30.6333748Z 74 │ │ pendingPress.current = () => child.props.onPress?.(event); 2026-10-22T20:15:30.6333844Z 75 │ │ return; 2026-10-22T20:15:30.6333931Z 76 │ │ } 2026-10-22T20:15:30.6334057Z 77 │ │ child.props.onPress?.(event); 2026-10-22T20:15:30.6334142Z 78 │ │ }, 2026-10-22T20:15:30.6334303Z 79 │ ├─▶ }); 2026-10-22T20:15:30.6334558Z · ╰──── Passing a ref to a function may read its value during render 2026-10-22T20:15:30.6334671Z 80 │ menuProps.onMenuInteractionStart = () => { 2026-10-22T20:15:30.6334731Z ╰──── 2026-10-22T20:15:30.6335222Z  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-22T20:15:30.6335534Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.6335541Z 2026-10-22T20:15:30.6335767Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-22T20:15:30.6335916Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:229:6] 2026-10-22T20:15:30.6336088Z 225 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-22T20:15:30.6336187Z 226 │ nativeEventSnapshotsRef.current, 2026-10-22T20:15:30.6336291Z ·  ───────────┬─────────── 2026-10-22T20:15:30.6336779Z · ╰── 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-22T20:15:30.6336859Z 227 │ mostRecentEventCount, 2026-10-22T20:15:30.6336926Z 228 │ ); 2026-10-22T20:15:30.6337066Z 229 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-22T20:15:30.6337232Z ·  ──────────────────────────┬────────────────────────── 2026-10-22T20:15:30.6337444Z · ╰── This dependency list is missing values used by the callback 2026-10-22T20:15:30.6337539Z 230 │ const assumedValue = props.value; 2026-10-22T20:15:30.6337608Z ╰──── 2026-10-22T20:15:30.6337788Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-22T20:15:30.6338111Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.6338117Z 2026-10-22T20:15:30.6338406Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-22T20:15:30.6338594Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:237:7] 2026-10-22T20:15:30.6338754Z 236 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-22T20:15:30.6338855Z 237 │ nativeEventSnapshotsRef.current, 2026-10-22T20:15:30.6338953Z ·  ───────────┬─────────── 2026-10-22T20:15:30.6339436Z · ╰── 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-22T20:15:30.6339516Z 238 │ controlledEventCount, 2026-10-22T20:15:30.6339594Z 239 │ assumedValue, 2026-10-22T20:15:30.6339654Z 240 │ ); 2026-10-22T20:15:30.6339829Z 241 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-22T20:15:30.6339982Z ·  ───────────┬────────── 2026-10-22T20:15:30.6340222Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-22T20:15:30.6340792Z 242 │ const acceptNativeEvent = useCallback( 2026-10-22T20:15:30.6340857Z ╰──── 2026-10-22T20:15:30.6341308Z  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-22T20:15:30.6341638Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.6341641Z 2026-10-22T20:15:30.6341808Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.6341987Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:162:29] 2026-10-22T20:15:30.6342121Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-22T20:15:30.6342245Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-22T20:15:30.6342382Z ·  ─────────────┬──────────── 2026-10-22T20:15:30.6342560Z · ╰── Cannot access ref value during render 2026-10-22T20:15:30.6342625Z 163 │ }); 2026-10-22T20:15:30.6342690Z ╰──── 2026-10-22T20:15:30.6343188Z  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-22T20:15:30.6343501Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.6343503Z 2026-10-22T20:15:30.6343656Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.6343807Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:162:29] 2026-10-22T20:15:30.6343942Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-22T20:15:30.6344065Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-22T20:15:30.6344192Z ·  ─────────────┬──────────── 2026-10-22T20:15:30.6344521Z · ╰── Passing a ref to a function may read its value during render 2026-10-22T20:15:30.6344640Z 163 │ }); 2026-10-22T20:15:30.6344701Z ╰──── 2026-10-22T20:15:30.6345181Z  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-22T20:15:30.6345490Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.6345493Z 2026-10-22T20:15:30.6345654Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.6345801Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:23] 2026-10-22T20:15:30.6345865Z 163 │ }); 2026-10-22T20:15:30.6345965Z 164 │ confirmedTokensRef.current = tokens; 2026-10-22T20:15:30.6346110Z ·  ─────────┬────────────┬─── 2026-10-22T20:15:30.6346319Z · │ ╰── Cannot update ref value during render 2026-10-22T20:15:30.6346452Z · ╰── This value is a ref 2026-10-22T20:15:30.6346528Z 165 │ return JSON.stringify( 2026-10-22T20:15:30.6346594Z ╰──── 2026-10-22T20:15:30.6347080Z  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-22T20:15:30.6347399Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.6347404Z 2026-10-22T20:15:30.6347567Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.6347710Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:206:5] 2026-10-22T20:15:30.6347793Z 205 │ mostRecentEventCount, 2026-10-22T20:15:30.6347894Z 206 │ nativeEventSnapshotsRef.current, 2026-10-22T20:15:30.6348014Z ·  ───────────────┬─────────────── 2026-10-22T20:15:30.6348215Z · ╰── Passing a ref to a function may read its value during render 2026-10-22T20:15:30.6348280Z 207 │ ); 2026-10-22T20:15:30.6348336Z ╰──── 2026-10-22T20:15:30.6348877Z  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-22T20:15:30.6349207Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.6349211Z 2026-10-22T20:15:30.6349368Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.6349513Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:212:5] 2026-10-22T20:15:30.6349594Z 211 │ mostRecentEventCount, 2026-10-22T20:15:30.6349689Z 212 │ nativeEventSnapshotsRef.current, 2026-10-22T20:15:30.6349814Z ·  ───────────────┬─────────────── 2026-10-22T20:15:30.6350017Z · ╰── Passing a ref to a function may read its value during render 2026-10-22T20:15:30.6350085Z 213 │ ); 2026-10-22T20:15:30.6350147Z ╰──── 2026-10-22T20:15:30.6350629Z  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-22T20:15:30.6350936Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.6350941Z 2026-10-22T20:15:30.6351147Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-22T20:15:30.6351295Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:197:6] 2026-10-22T20:15:30.6351425Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-22T20:15:30.6351560Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-22T20:15:30.6351691Z ·  ─────────┬──────── 2026-10-22T20:15:30.6352213Z · ╰── 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-22T20:15:30.6352278Z 163 │ }); 2026-10-22T20:15:30.6352371Z 164 │ confirmedTokensRef.current = tokens; 2026-10-22T20:15:30.6352455Z 165 │ return JSON.stringify( 2026-10-22T20:15:30.6352634Z 166 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-22T20:15:30.6352707Z 167 │ const record = 2026-10-22T20:15:30.6352796Z 168 │ token.type === "context" 2026-10-22T20:15:30.6352977Z 169 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-22T20:15:30.6353059Z 170 │ : undefined; 2026-10-22T20:15:30.6353174Z 171 │ const presentation = contextChipPresentation( 2026-10-22T20:15:30.6353297Z 172 │ token.type === "context" ? token.kind : token.type, 2026-10-22T20:15:30.6353371Z 173 │ record, 2026-10-22T20:15:30.6353437Z 174 │ ); 2026-10-22T20:15:30.6353527Z 175 │ const icon = contextChipIcon( 2026-10-22T20:15:30.6353608Z 176 │ presentation, 2026-10-22T20:15:30.6353766Z 177 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-22T20:15:30.6353834Z 178 │ ); 2026-10-22T20:15:30.6353902Z 179 │ return { 2026-10-22T20:15:30.6353986Z 180 │ type: token.type, 2026-10-22T20:15:30.6354143Z 181 │ source: token.source, 2026-10-22T20:15:30.6354280Z 182 │ start: token.start, 2026-10-22T20:15:30.6354353Z 183 │ end: token.end, 2026-10-22T20:15:30.6354456Z 184 │ accent: presentation.accent, 2026-10-22T20:15:30.6354529Z 185 │ label: 2026-10-22T20:15:30.6354619Z 186 │ token.type === "skill" 2026-10-22T20:15:30.6354736Z 187 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-22T20:15:30.6354831Z 188 │ : token.type === "context" 2026-10-22T20:15:30.6355088Z 189 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-22T20:15:30.6355190Z 190 │ : basename(token.value), 2026-10-22T20:15:30.6355341Z 191 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-22T20:15:30.6355458Z 192 │ iconUri: contextChipIconUri(icon), 2026-10-22T20:15:30.6355571Z 193 │ tintsIcon: icon.kind === "chip", 2026-10-22T20:15:30.6355647Z 194 │ }; 2026-10-22T20:15:30.6355710Z 195 │ }), 2026-10-22T20:15:30.6355779Z 196 │ ); 2026-10-22T20:15:30.6355891Z 197 │ }, [props.value, props.context, skillLabels]); 2026-10-22T20:15:30.6356034Z ·  ────────────────────┬──────────────────── 2026-10-22T20:15:30.6356246Z · ╰── This dependency list is missing values used by the callback 2026-10-22T20:15:30.6356398Z 198 │ // Every render resolves against the snapshot history, so a render whose 2026-10-22T20:15:30.6356457Z ╰──── 2026-10-22T20:15:30.6356689Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-22T20:15:30.6357021Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.6357027Z 2026-10-22T20:15:30.6357235Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-22T20:15:30.6357386Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:259:5] 2026-10-22T20:15:30.6357532Z 251 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-22T20:15:30.6357638Z 252 │ nativeEventSnapshotsRef.current.push({ 2026-10-22T20:15:30.6357745Z ·  ───────────┬─────────── 2026-10-22T20:15:30.6358235Z · ╰── 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-22T20:15:30.6358346Z 253 │ eventCount: acknowledgedEventCount, 2026-10-22T20:15:30.6358417Z 254 │ value, 2026-10-22T20:15:30.6358499Z 255 │ selection: nextSelection, 2026-10-22T20:15:30.6358564Z 256 │ }); 2026-10-22T20:15:30.6358659Z 257 │ return acknowledgedEventCount; 2026-10-22T20:15:30.6358716Z 258 │ }, 2026-10-22T20:15:30.6358778Z 259 │ [], 2026-10-22T20:15:30.6358856Z ·  ─┬ 2026-10-22T20:15:30.6359065Z · ╰── This dependency list is missing values used by the callback 2026-10-22T20:15:30.6359124Z 260 │ ); 2026-10-22T20:15:30.6359182Z ╰──── 2026-10-22T20:15:30.6359403Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-22T20:15:30.6359802Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.6359844Z 2026-10-22T20:15:30.6360029Z ⚠ react(purity): Cannot call impure function during render 2026-10-22T20:15:30.6360173Z ╭─[apps/web/src/components/CustomSnoozeDialog.tsx:140:58] 2026-10-22T20:15:30.6360320Z 139 │ {...(weekStartsOn === undefined ? {} : { weekStartsOn })} 2026-10-22T20:15:30.6360477Z 140 │ disabled={{ before: new Date(new Date().setHours(0, 0, 0, 0)) }} 2026-10-22T20:15:30.6360613Z ·  ─────┬──── 2026-10-22T20:15:30.6360797Z · ╰── Cannot call impure function 2026-10-22T20:15:30.6360913Z 141 │ onSelect={(selected) => { 2026-10-22T20:15:30.6360982Z ╰──── 2026-10-22T20:15:30.6361280Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-22T20:15:30.6361587Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-22T20:15:30.6361599Z 2026-10-22T20:15:30.6361753Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.6361911Z ╭─[apps/mobile/src/native/StackHeader.tsx:184:9] 2026-10-22T20:15:30.6361988Z 183 │ "options", 2026-10-22T20:15:30.6362102Z 184 │ latestOptionFunctionsRef.current, 2026-10-22T20:15:30.6362230Z ·  ────────────────┬─────────────── 2026-10-22T20:15:30.6362448Z · ╰── Passing a ref to a function may read its value during render 2026-10-22T20:15:30.6362558Z 185 │ optionFunctionWrappersRef.current, 2026-10-22T20:15:30.6362621Z ╰──── 2026-10-22T20:15:30.6363105Z  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-22T20:15:30.6363412Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.6363415Z 2026-10-22T20:15:30.6363579Z ⚠ react(refs): Cannot access refs during render 2026-10-22T20:15:30.6363713Z ╭─[apps/mobile/src/native/StackHeader.tsx:185:9] 2026-10-22T20:15:30.6363816Z 184 │ latestOptionFunctionsRef.current, 2026-10-22T20:15:30.6363923Z 185 │ optionFunctionWrappersRef.current, 2026-10-22T20:15:30.6364053Z ·  ────────────────┬──────────────── 2026-10-22T20:15:30.6364273Z · ╰── Passing a ref to a function may read its value during render 2026-10-22T20:15:30.6364374Z 186 │ ) as NativeStackNavigationOptions) 2026-10-22T20:15:30.6364430Z ╰──── 2026-10-22T20:15:30.6364913Z  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-22T20:15:30.6365294Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-22T20:15:30.6365344Z 2026-10-22T20:15:30.6365533Z ⚠ react(purity): Cannot call impure function during render 2026-10-22T20:15:30.6365690Z ╭─[apps/web/src/components/chat/useThreadLifecycle.tsx:178:58] 2026-10-22T20:15:30.6365818Z 177 │ if (snoozeClockState.shell !== activeThreadShell) { 2026-10-22T20:15:30.6366006Z 178 │ setSnoozeClockState({ shell: activeThreadShell, now: new Date().toISOString() }); 2026-10-22T20:15:30.6366145Z ·  ─────┬──── 2026-10-22T20:15:30.6366338Z · ╰── Cannot call impure function 2026-10-22T20:15:30.6366397Z 179 │ } 2026-10-22T20:15:30.6366465Z ╰──── 2026-10-22T20:15:30.6366767Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-22T20:15:30.6367080Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-22T20:15:30.6367083Z 2026-10-22T20:15:30.6367357Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.6367536Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:444:5] 2026-10-22T20:15:30.6367614Z 434 │ : null; 2026-10-22T20:15:30.6367691Z 435 │ useEffect(() => { 2026-10-22T20:15:30.6367767Z ·  ────┬──── 2026-10-22T20:15:30.6367917Z · ╰── This is the containing effect 2026-10-22T20:15:30.6367986Z 436 │ if ( 2026-10-22T20:15:30.6368073Z 437 │ props.active === false || 2026-10-22T20:15:30.6368153Z 438 │ activeDraftKey !== null || 2026-10-22T20:15:30.6368253Z 439 │ editingPendingTask !== null || 2026-10-22T20:15:30.6368338Z 440 │ selectedProject === null 2026-10-22T20:15:30.6368403Z 441 │ ) { 2026-10-22T20:15:30.6368472Z 442 │ return; 2026-10-22T20:15:30.6368538Z 443 │ } 2026-10-22T20:15:30.6368614Z 444 │ setActiveDraftKey( 2026-10-22T20:15:30.6368704Z ·  ────────┬──────── 2026-10-22T20:15:30.6368892Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.6368976Z 445 │ createNewTaskDraft({ 2026-10-22T20:15:30.6369041Z ╰──── 2026-10-22T20:15:30.6369680Z  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-22T20:15:30.6370030Z  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-22T20:15:30.6370034Z 2026-10-22T20:15:30.6370300Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-22T20:15:30.6370480Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1244:36] 2026-10-22T20:15:30.6370601Z 1243 │ 2026-10-22T20:15:30.6370873Z 1244 │ {props.children} 2026-10-22T20:15:30.6371043Z ·  ───────────── 2026-10-22T20:15:30.6371133Z 1245 │ 2026-10-22T20:15:30.6371197Z ╰──── 2026-10-22T20:15:30.6371441Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-22T20:15:30.6371587Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-22T20:15:30.6371590Z 2026-10-22T20:15:30.6371773Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-22T20:15:30.6371940Z ╭─[apps/server/src/process/externalLauncher.test.ts:186:12] 2026-10-22T20:15:30.6372021Z 185 │ 2026-10-22T20:15:30.6372133Z 186 │ for (const {} of ["darwin", "linux"] as const) { 2026-10-22T20:15:30.6372222Z ·  ── 2026-10-22T20:15:30.6372286Z 187 │ } 2026-10-22T20:15:30.6372350Z ╰──── 2026-10-22T20:15:30.6372591Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-22T20:15:30.6372593Z 2026-10-22T20:15:30.6372772Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-22T20:15:30.6372925Z ╭─[apps/server/src/process/externalLauncher.test.ts:189:12] 2026-10-22T20:15:30.6372994Z 188 │ 2026-10-22T20:15:30.6373065Z 189 │ for (const {} of [ 2026-10-22T20:15:30.6373146Z ·  ── 2026-10-22T20:15:30.6373252Z 190 │ { kind: "browser", folderVerb: "none" }, 2026-10-22T20:15:30.6373315Z ╰──── 2026-10-22T20:15:30.6373558Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-22T20:15:30.6373564Z 2026-10-22T20:15:30.6373746Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-22T20:15:30.6373902Z ╭─[apps/server/src/process/externalLauncher.test.ts:311:12] 2026-10-22T20:15:30.6373964Z 310 │ 2026-10-22T20:15:30.6374103Z 311 │ for (const {} of ["rejected", "spawn-error", "stalled"] as const) { 2026-10-22T20:15:30.6374183Z ·  ── 2026-10-22T20:15:30.6374248Z 312 │ } 2026-10-22T20:15:30.6374311Z ╰──── 2026-10-22T20:15:30.6374548Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-22T20:15:30.6374551Z 2026-10-22T20:15:30.6374789Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-22T20:15:30.6374993Z ╭─[apps/server/src/process/externalLauncher.test.ts:314:12] 2026-10-22T20:15:30.6375054Z 313 │ 2026-10-22T20:15:30.6375122Z 314 │ for (const {} of [ 2026-10-22T20:15:30.6375203Z ·  ── 2026-10-22T20:15:30.6375264Z 315 │ { 2026-10-22T20:15:30.6375326Z ╰──── 2026-10-22T20:15:30.6375561Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-22T20:15:30.6375564Z 2026-10-22T20:15:30.6375845Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.6375992Z ╭─[apps/mobile/src/components/ProjectFavicon.tsx:158:5] 2026-10-22T20:15:30.6376211Z 153 │ const [activeFaviconRequest, setActiveFaviconRequest] = useState(null); 2026-10-22T20:15:30.6376292Z 154 │ useLayoutEffect(() => { 2026-10-22T20:15:30.6376384Z ·  ───────┬─────── 2026-10-22T20:15:30.6376547Z · ╰── This is the containing effect 2026-10-22T20:15:30.6376650Z 155 │ if (faviconRequest === null) return; 2026-10-22T20:15:30.6376706Z 156 │ 2026-10-22T20:15:30.6376860Z 157 │ const endRequest = beginProjectFaviconRequest(faviconRequest); 2026-10-22T20:15:30.6376973Z 158 │ setActiveFaviconRequest(faviconRequest); 2026-10-22T20:15:30.6377077Z ·  ───────────┬─────────── 2026-10-22T20:15:30.6377264Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.6377351Z 159 │ return endRequest; 2026-10-22T20:15:30.6377413Z ╰──── 2026-10-22T20:15:30.6378057Z  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-22T20:15:30.6378408Z  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-22T20:15:30.6378413Z 2026-10-22T20:15:30.6378681Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.6378832Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:68:5] 2026-10-22T20:15:30.6378951Z 66 │ const { id: attachmentId, fileUri } = attachment; 2026-10-22T20:15:30.6379027Z 67 │ useEffect(() => { 2026-10-22T20:15:30.6379109Z ·  ────┬──── 2026-10-22T20:15:30.6379254Z · ╰── This is the containing effect 2026-10-22T20:15:30.6379325Z 68 │ setUri(null); 2026-10-22T20:15:30.6379406Z ·  ───┬── 2026-10-22T20:15:30.6379579Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.6379656Z 69 │ setError(null); 2026-10-22T20:15:30.6379714Z ╰──── 2026-10-22T20:15:30.6380401Z  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-22T20:15:30.6380832Z  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-22T20:15:30.6380888Z 2026-10-22T20:15:30.6381101Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T20:15:30.6381251Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:91:7] 2026-10-22T20:15:30.6381319Z 90 │ }; 2026-10-22T20:15:30.6381403Z 91 │ }, [attachmentId, fileUri]); 2026-10-22T20:15:30.6381530Z ·  ──────┬───── ───┬─── 2026-10-22T20:15:30.6381739Z · │ ╰── Unnecessary dependency `fileUri` 2026-10-22T20:15:30.6381919Z · ╰── Unnecessary dependency `attachmentId` 2026-10-22T20:15:30.6382072Z 92 │ const mimeType = videoMimeType(attachment) ?? attachment.mimeType; 2026-10-22T20:15:30.6382131Z ╰──── 2026-10-22T20:15:30.6382454Z  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-22T20:15:30.6382786Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.6382788Z 2026-10-22T20:15:30.6383025Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-22T20:15:30.6383182Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:213:34] 2026-10-22T20:15:30.6383256Z 212 │ useEffect(() => { 2026-10-22T20:15:30.6383389Z 213 │ if (!isFocused && hasSource) props.onRequestClose(); 2026-10-22T20:15:30.6383502Z ·  ──┬── 2026-10-22T20:15:30.6383670Z · ╰── Missing dependency `props` 2026-10-22T20:15:30.6383785Z 214 │ }, [isFocused, hasSource, props.onRequestClose]); 2026-10-22T20:15:30.6383914Z ·  ──────────┬───────── 2026-10-22T20:15:30.6384163Z · ╰── Overly precise dependency `props.onRequestClose`, use `props` instead 2026-10-22T20:15:30.6384246Z 215 │ const { source } = props; 2026-10-22T20:15:30.6384301Z ╰──── 2026-10-22T20:15:30.6384753Z  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-22T20:15:30.6385091Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.6385095Z 2026-10-22T20:15:30.6385302Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-22T20:15:30.6385460Z ╭─[apps/mobile/src/components/ComposerContextSheet.tsx:267:25] 2026-10-22T20:15:30.6385580Z 266 │ {record.elements?.map((element, index) => ( 2026-10-22T20:15:30.6385762Z 267 │ 2026-10-22T20:15:30.6385944Z ·  ─────────────────────────────────────────────────────── 2026-10-22T20:15:30.6386030Z 268 │ { 2026-10-22T20:15:30.6400377Z 236 │ const input = Schema.decodeUnknownSync(SettingsUpdate)(payload); 2026-10-22T20:15:30.6400500Z ·  ──────────────────────── 2026-10-22T20:15:30.6400653Z 237 │ const scopes = requiredScopesForServerSettingsPatch(input.patch); 2026-10-22T20:15:30.6400711Z ╰──── 2026-10-22T20:15:30.6400714Z 2026-10-22T20:15:30.6401105Z ⚠ 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-22T20:15:30.6401240Z ╭─[apps/server/src/auth/RpcAuthorization.ts:255:26] 2026-10-22T20:15:30.6401420Z 254 │ if (method === WS_METHODS.assetsCreateUrl) { 2026-10-22T20:15:30.6401620Z 255 │ const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload); 2026-10-22T20:15:30.6401750Z ·  ──────────────────────── 2026-10-22T20:15:30.6401818Z 256 │ return [ 2026-10-22T20:15:30.6401899Z ╰──── 2026-10-22T20:15:30.6401902Z 2026-10-22T20:15:30.6402169Z ⚠ unicorn(prefer-string-starts-ends-with): Prefer String#startsWith over a regex with a caret. 2026-10-22T20:15:30.6402301Z ╭─[apps/server/src/vcs/GitVcsDriverCore.ts:509:11] 2026-10-22T20:15:30.6402412Z 508 │ GIT_DIAGNOSTIC_LINE_PATTERN.test(line) || 2026-10-22T20:15:30.6402564Z 509 │ (!/^remote:/.test(line) && SSH_TRANSPORT_REFUSAL_PATTERN.test(line)), 2026-10-22T20:15:30.6402664Z ·  ─────────────── 2026-10-22T20:15:30.6402729Z 510 │ ) 2026-10-22T20:15:30.6402792Z ╰──── 2026-10-22T20:15:30.6402959Z  help: Replace `/^remote:/.test(line)` with `line.startsWith('remote:')`. 2026-10-22T20:15:30.6402962Z 2026-10-22T20:15:30.6403244Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-22T20:15:30.6403384Z ╭─[apps/server/src/telemetry/AnalyticsService.ts:340:7] 2026-10-22T20:15:30.6403448Z 339 │ 2026-10-22T20:15:30.6403565Z 340 │ const layerTest = AnalyticsService.layerTest; 2026-10-22T20:15:30.6403649Z ·  ────┬──── 2026-10-22T20:15:30.6403791Z · ╰── 'layerTest' is declared here 2026-10-22T20:15:30.6403850Z ╰──── 2026-10-22T20:15:30.6403973Z  help: Consider removing this declaration. 2026-10-22T20:15:30.6403979Z 2026-10-22T20:15:30.6404350Z ⚠ 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-22T20:15:30.6404492Z ╭─[apps/server/src/vcs/GitVcsDriverCore.test.ts:1713:34] 2026-10-22T20:15:30.6404642Z 1712 │ const stat = branch.files!.find((file) => file.path === path)!; 2026-10-22T20:15:30.6404805Z 1713 │ const request = yield* Schema.decodeEffect(ReviewDiffPreviewInput)({ 2026-10-22T20:15:30.6404932Z ·  ─────────────────── 2026-10-22T20:15:30.6404999Z 1714 │ cwd, 2026-10-22T20:15:30.6405066Z ╰──── 2026-10-22T20:15:30.6405068Z 2026-10-22T20:15:30.6405564Z ⚠ 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-22T20:15:30.6405718Z ╭─[apps/server/src/project/ProjectService.test.ts:94:3] 2026-10-22T20:15:30.6405784Z 93 │ ) { 2026-10-22T20:15:30.6405999Z 94 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-22T20:15:30.6406189Z 95 │ │ const project = Option.getOrThrow(yield* service.getById(projectId)); 2026-10-22T20:15:30.6406322Z 96 │ │ if (predicate(project)) return project; 2026-10-22T20:15:30.6406435Z 97 │ │ yield* Effect.yieldNow; 2026-10-22T20:15:30.6406568Z 98 │ ╰─▶ } 2026-10-22T20:15:30.6406811Z 99 │ return yield* Effect.die(`Project ${projectId} was not enriched in time.`); 2026-10-22T20:15:30.6406912Z ╰──── 2026-10-22T20:15:30.6406915Z 2026-10-22T20:15:30.6407231Z ⚠ eslint(no-unused-vars): Variable 'layerFromProviderAdapter' is declared but never used. Unused variables should start with a '_'. 2026-10-22T20:15:30.6407408Z ╭─[apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts:346:7] 2026-10-22T20:15:30.6407480Z 345 │ 2026-10-22T20:15:30.6407593Z 346 │ const layerFromProviderAdapter: Layer.Layer< 2026-10-22T20:15:30.6407702Z ·  ────────────┬─────────── 2026-10-22T20:15:30.6407876Z · ╰── 'layerFromProviderAdapter' is declared here 2026-10-22T20:15:30.6407967Z 347 │ ProviderAdapterRegistryV2, 2026-10-22T20:15:30.6408029Z ╰──── 2026-10-22T20:15:30.6408151Z  help: Consider removing this declaration. 2026-10-22T20:15:30.6408157Z 2026-10-22T20:15:30.6408427Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-22T20:15:30.6408620Z ╭─[apps/server/src/orchestration-v2/ThreadPullRequestService.ts:408:7] 2026-10-22T20:15:30.6408681Z 407 │ 2026-10-22T20:15:30.6408826Z 408 │ const layer = Layer.effect(ThreadPullRequestServiceV2, make); 2026-10-22T20:15:30.6408900Z ·  ──┬── 2026-10-22T20:15:30.6409041Z · ╰── 'layer' is declared here 2026-10-22T20:15:30.6409100Z ╰──── 2026-10-22T20:15:30.6409218Z  help: Consider removing this declaration. 2026-10-22T20:15:30.6409220Z 2026-10-22T20:15:30.6409509Z ⚠ eslint(no-unused-vars): Variable 'layerDaemon' is declared but never used. Unused variables should start with a '_'. 2026-10-22T20:15:30.6409660Z ╭─[apps/server/src/orchestration-v2/EffectWorker.ts:911:7] 2026-10-22T20:15:30.6409725Z 910 │ 2026-10-22T20:15:30.6409929Z 911 │ const layerDaemon: Layer.Layer = Layer.effectDiscard( 2026-10-22T20:15:30.6410016Z ·  ─────┬───── 2026-10-22T20:15:30.6410162Z · ╰── 'layerDaemon' is declared here 2026-10-22T20:15:30.6410263Z 912 │ runDaemon.pipe(Effect.forkScoped), 2026-10-22T20:15:30.6410323Z ╰──── 2026-10-22T20:15:30.6410430Z  help: Consider removing this declaration. 2026-10-22T20:15:30.6410439Z 2026-10-22T20:15:30.6410648Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-22T20:15:30.6410831Z ╭─[apps/web/src/components/settings/ProviderSettingsPanel.logic.ts:4:8] 2026-10-22T20:15:30.6410925Z 3 │ AuthProvidersManageScope, 2026-10-22T20:15:30.6411014Z 4 │ type AuthSessionState, 2026-10-22T20:15:30.6411108Z ·  ────────┬─────── 2026-10-22T20:15:30.6411272Z · ╰── 'AuthSessionState' is imported here 2026-10-22T20:15:30.6411349Z 5 │ type EnvironmentId, 2026-10-22T20:15:30.6411411Z ╰──── 2026-10-22T20:15:30.6411514Z  help: Consider removing this import. 2026-10-22T20:15:30.6411516Z 2026-10-22T20:15:30.6411720Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-22T20:15:30.6411938Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:555:70] 2026-10-22T20:15:30.6412031Z 554 │ assert.deepStrictEqual( 2026-10-22T20:15:30.6412274Z 555 │ (yield* Ref.get(fixture.syncCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-22T20:15:30.6412453Z ·  ┬ 2026-10-22T20:15:30.6412635Z · ╰── '_' is declared here 2026-10-22T20:15:30.6412709Z 556 │ [ 2026-10-22T20:15:30.6412763Z ╰──── 2026-10-22T20:15:30.6412881Z  help: Consider removing this parameter. 2026-10-22T20:15:30.6412884Z 2026-10-22T20:15:30.6413082Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-22T20:15:30.6413270Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:1155:70] 2026-10-22T20:15:30.6413360Z 1154 │ assert.deepStrictEqual( 2026-10-22T20:15:30.6413557Z 1155 │ (yield* Ref.get(fixture.linkCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-22T20:15:30.6413698Z ·  ┬ 2026-10-22T20:15:30.6413882Z · ╰── '_' is declared here 2026-10-22T20:15:30.6413953Z 1156 │ [ 2026-10-22T20:15:30.6414016Z ╰──── 2026-10-22T20:15:30.6414134Z  help: Consider removing this parameter. 2026-10-22T20:15:30.6414136Z 2026-10-22T20:15:30.6414657Z ⚠ 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-22T20:15:30.6414852Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7] 2026-10-22T20:15:30.6414964Z 565 │ let afterSequence = created[0]!.sequence; 2026-10-22T20:15:30.6415179Z 566 │ ╭─▶ for (let index = 1; index <= 32; index += 1) { 2026-10-22T20:15:30.6415301Z 567 │ │ const nextEvent = { 2026-10-22T20:15:30.6415480Z 568 │ │ id: EventId.make(`event:foundation-stream-race:${index}`), 2026-10-22T20:15:30.6415628Z 569 │ │ type: "thread.metadata-updated" as const, 2026-10-22T20:15:30.6415729Z 570 │ │ threadId, 2026-10-22T20:15:30.6415853Z 571 │ │ providerInstanceId, 2026-10-22T20:15:30.6415963Z 572 │ │ occurredAt: now, 2026-10-22T20:15:30.6416134Z 573 │ │ payload: { ...thread, title: `Race update ${index}` }, 2026-10-22T20:15:30.6416295Z 574 │ │ } satisfies OrchestrationV2DomainEvent; 2026-10-22T20:15:30.6416426Z 575 │ │ const reader = yield* eventSink 2026-10-22T20:15:30.6416567Z 576 │ │ .stream({ threadId, afterSequence }) 2026-10-22T20:15:30.6416710Z 577 │ │ .pipe(Stream.runHead, Effect.forkChild); 2026-10-22T20:15:30.6416830Z 578 │ │ yield* Effect.yieldNow; 2026-10-22T20:15:30.6417007Z 579 │ │ const written = yield* eventSink.write({ events: [nextEvent] }); 2026-10-22T20:15:30.6417155Z 580 │ │ const received = yield* Fiber.join(reader); 2026-10-22T20:15:30.6417353Z 581 │ │ if (Option.isNone(received)) { 2026-10-22T20:15:30.6417606Z 582 │ │ return yield* Effect.die("The event stream ended before delivering the live event."); 2026-10-22T20:15:30.6417695Z 583 │ │ } 2026-10-22T20:15:30.6417869Z 584 │ │ assert.equal(received.value.sequence, written[0]?.sequence); 2026-10-22T20:15:30.6418028Z 585 │ │ assert.equal(received.value.event.id, nextEvent.id); 2026-10-22T20:15:30.6418166Z 586 │ │ afterSequence = received.value.sequence; 2026-10-22T20:15:30.6418316Z 587 │ ╰─▶ } 2026-10-22T20:15:30.6418384Z 588 │ }), 2026-10-22T20:15:30.6418448Z ╰──── 2026-10-22T20:15:30.6418450Z 2026-10-22T20:15:30.6418942Z ⚠ 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-22T20:15:30.6419132Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:2327:9] 2026-10-22T20:15:30.6419225Z 2326 │ let settled = false; 2026-10-22T20:15:30.6419407Z 2327 │ ╭─▶ while (!settled) { 2026-10-22T20:15:30.6419580Z 2328 │ │ settled = (yield* outbox.listByCommandId(commandId)).every( 2026-10-22T20:15:30.6419740Z 2329 │ │ (effect) => effect.status === "succeeded", 2026-10-22T20:15:30.6419835Z 2330 │ │ ); 2026-10-22T20:15:30.6419972Z 2331 │ │ if (!settled) yield* Effect.yieldNow; 2026-10-22T20:15:30.6420132Z 2332 │ ╰─▶ } 2026-10-22T20:15:30.6420523Z 2333 │ }).pipe(Effect.provide(layerWorker), Effect.scoped); 2026-10-22T20:15:30.6420592Z ╰──── 2026-10-22T20:15:30.6420594Z 2026-10-22T20:15:30.6420799Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-22T20:15:30.6421000Z ╭─[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:116:34] 2026-10-22T20:15:30.6421074Z 115 │ return [...commands]; 2026-10-22T20:15:30.6421233Z 116 │ }, [activeThreadRef, pathname, registrationVersion, navigation]); 2026-10-22T20:15:30.6421373Z ·  ─────────┬───────── 2026-10-22T20:15:30.6421664Z · ╰── Unnecessary dependency `registrationVersion` 2026-10-22T20:15:30.6421784Z 117 │ 2026-10-22T20:15:30.6421846Z ╰──── 2026-10-22T20:15:30.6422208Z  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-22T20:15:30.6422544Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.6422547Z 2026-10-22T20:15:30.6423030Z ⚠ 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-22T20:15:30.6423205Z ╭─[apps/server/src/project/ProjectEnrichmentService.test.ts:28:3] 2026-10-22T20:15:30.6423277Z 27 │ ) { 2026-10-22T20:15:30.6423497Z 28 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-22T20:15:30.6423659Z 29 │ │ const available = yield* service.peek(workspaceRoot); 2026-10-22T20:15:30.6423794Z 30 │ │ if (predicate(available)) return available; 2026-10-22T20:15:30.6423914Z 31 │ │ yield* Effect.yieldNow; 2026-10-22T20:15:30.6424049Z 32 │ ╰─▶ } 2026-10-22T20:15:30.6424243Z 33 │ return yield* Effect.die(`Project metadata for ${workspaceRoot} was not resolved in time.`); 2026-10-22T20:15:30.6424299Z ╰──── 2026-10-22T20:15:30.6424302Z 2026-10-22T20:15:30.6424489Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-22T20:15:30.6424635Z ╭─[apps/server/src/processRunner.test.ts:266:14] 2026-10-22T20:15:30.6424701Z 265 │ 2026-10-22T20:15:30.6424815Z 266 │ for (const {} of ["timeout", "success"] as const) { 2026-10-22T20:15:30.6424901Z ·  ── 2026-10-22T20:15:30.6424964Z 267 │ } 2026-10-22T20:15:30.6425028Z ╰──── 2026-10-22T20:15:30.6425270Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-22T20:15:30.6425273Z 2026-10-22T20:15:30.6425753Z ⚠ 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-22T20:15:30.6425901Z ╭─[apps/server/src/assets/AssetAccess.test.ts:1043:32] 2026-10-22T20:15:30.6426059Z 1042 │ expect(error._tag).toBe("AssetGitHubMediaUrlValidationError"); 2026-10-22T20:15:30.6426268Z 1043 │ const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(AssetAccessError))(error); 2026-10-22T20:15:30.6426391Z ·  ─────────────────── 2026-10-22T20:15:30.6426500Z 1044 │ expect(encoded).not.toContain(url); 2026-10-22T20:15:30.6426561Z ╰──── 2026-10-22T20:15:30.6426564Z 2026-10-22T20:15:30.6427048Z ⚠ 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-22T20:15:30.6431703Z ╭─[apps/server/src/usage/UsageService.test.ts:2383:7] 2026-10-22T20:15:30.6431984Z 2382 │ let orphanedAt: number | undefined; 2026-10-22T20:15:30.6432293Z 2383 │ ╭─▶ for (let interruptAt = 1; interruptAt <= 31; interruptAt += 1) { 2026-10-22T20:15:30.6432432Z 2384 │ │ const tasks: Array<() => void> = []; 2026-10-22T20:15:30.6432592Z 2385 │ │ const dispatcher: Scheduler.SchedulerDispatcher = { 2026-10-22T20:15:30.6432737Z 2386 │ │ scheduleTask: (task) => tasks.push(task), 2026-10-22T20:15:30.6432853Z 2387 │ │ flush: () => { 2026-10-22T20:15:30.6432993Z 2388 │ │ let task: (() => void) | undefined; 2026-10-22T20:15:30.6433154Z 2389 │ │ while ((task = tasks.shift()) !== undefined) task(); 2026-10-22T20:15:30.6433244Z 2390 │ │ }, 2026-10-22T20:15:30.6433343Z 2391 │ │ }; 2026-10-22T20:15:30.6433435Z 2392 │ │ 2026-10-22T20:15:30.6433612Z 2393 │ │ let requestFiber: Fiber.Fiber | undefined; 2026-10-22T20:15:30.6433729Z 2394 │ │ let requestChecks = 0; 2026-10-22T20:15:30.6433877Z 2395 │ │ const scheduler: Scheduler.Scheduler = { 2026-10-22T20:15:30.6434003Z 2396 │ │ executionMode: "async", 2026-10-22T20:15:30.6434146Z 2397 │ │ makeDispatcher: () => dispatcher, 2026-10-22T20:15:30.6434268Z 2398 │ │ shouldYield: (fiber) => { 2026-10-22T20:15:30.6434422Z 2399 │ │ if (fiber !== requestFiber) return false; 2026-10-22T20:15:30.6434552Z 2400 │ │ requestChecks += 1; 2026-10-22T20:15:30.6434718Z 2401 │ │ if (requestChecks !== interruptAt) return false; 2026-10-22T20:15:30.6434843Z 2402 │ │ fiber.interruptUnsafe(); 2026-10-22T20:15:30.6434956Z 2403 │ │ return true; 2026-10-22T20:15:30.6435055Z 2404 │ │ }, 2026-10-22T20:15:30.6435145Z 2405 │ │ }; 2026-10-22T20:15:30.6435219Z 2406 │ │ 2026-10-22T20:15:30.6435358Z 2407 │ │ const input: UsageSummaryInput = { 2026-10-22T20:15:30.6435464Z 2408 │ │ ...WINDOW, 2026-10-22T20:15:30.6435607Z 2409 │ │ sinceDay: UsageDay.make("2026-09-01"), 2026-10-22T20:15:30.6435823Z 2410 │ │ untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`), 2026-10-22T20:15:30.6435916Z 2411 │ │ }; 2026-10-22T20:15:30.6436041Z 2412 │ │ const first = yield* service 2026-10-22T20:15:30.6436158Z 2413 │ │ .readSummary(input) 2026-10-22T20:15:30.6436253Z 2414 │ │ .pipe( 2026-10-22T20:15:30.6436367Z 2415 │ │ Effect.exit, 2026-10-22T20:15:30.6436541Z 2416 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-22T20:15:30.6436662Z 2417 │ │ Effect.forkChild, 2026-10-22T20:15:30.6436750Z 2418 │ │ ); 2026-10-22T20:15:30.6436866Z 2419 │ │ requestFiber = first; 2026-10-22T20:15:30.6437069Z 2420 │ │ yield* Effect.yieldNow; 2026-10-22T20:15:30.6437248Z 2421 │ │ dispatcher.flush(); 2026-10-22T20:15:30.6437323Z 2422 │ │ 2026-10-22T20:15:30.6437492Z 2423 │ │ const second = yield* service.readSummary(input).pipe( 2026-10-22T20:15:30.6437611Z 2424 │ │ Effect.match({ 2026-10-22T20:15:30.6437747Z 2425 │ │ onFailure: (error) => error.reason, 2026-10-22T20:15:30.6437880Z 2426 │ │ onSuccess: () => "success" as const, 2026-10-22T20:15:30.6437975Z 2427 │ │ }), 2026-10-22T20:15:30.6438149Z 2428 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-22T20:15:30.6438264Z 2429 │ │ Effect.forkChild, 2026-10-22T20:15:30.6438355Z 2430 │ │ ); 2026-10-22T20:15:30.6438477Z 2431 │ │ yield* Effect.yieldNow; 2026-10-22T20:15:30.6438599Z 2432 │ │ dispatcher.flush(); 2026-10-22T20:15:30.6438740Z 2433 │ │ const secondExit = second.pollUnsafe(); 2026-10-22T20:15:30.6438867Z 2434 │ │ if (secondExit === undefined) { 2026-10-22T20:15:30.6438994Z 2435 │ │ second.interruptUnsafe(); 2026-10-22T20:15:30.6439113Z 2436 │ │ orphanedAt = interruptAt; 2026-10-22T20:15:30.6439215Z 2437 │ │ break; 2026-10-22T20:15:30.6439300Z 2438 │ │ } 2026-10-22T20:15:30.6439435Z 2439 │ │ if (Exit.isFailure(secondExit)) { 2026-10-22T20:15:30.6439619Z 2440 │ │ assert.fail("the matching request fiber was interrupted"); 2026-10-22T20:15:30.6439715Z 2441 │ │ } 2026-10-22T20:15:30.6439881Z 2442 │ │ assert.strictEqual(secondExit.value, "invalidWindow"); 2026-10-22T20:15:30.6440033Z 2443 │ ╰─▶ } 2026-10-22T20:15:30.6440099Z 2444 │ 2026-10-22T20:15:30.6440161Z ╰──── 2026-10-22T20:15:30.6440164Z 2026-10-22T20:15:30.6440446Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-22T20:15:30.6440577Z ╭─[apps/server/src/usage/UsageService.ts:169:7] 2026-10-22T20:15:30.6440647Z 168 │ 2026-10-22T20:15:30.6440739Z 169 │ const layerTest = Layer.succeed( 2026-10-22T20:15:30.6440833Z ·  ────┬──── 2026-10-22T20:15:30.6440994Z · ╰── 'layerTest' is declared here 2026-10-22T20:15:30.6441071Z 170 │ UsageService, 2026-10-22T20:15:30.6441139Z ╰──── 2026-10-22T20:15:30.6441248Z  help: Consider removing this declaration. 2026-10-22T20:15:30.6441251Z 2026-10-22T20:15:30.6441701Z ⚠ 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-22T20:15:30.6441886Z ╭─[apps/server/src/provider/acp/AntigravityProtocol.ts:263:20] 2026-10-22T20:15:30.6441978Z 262 │ ...(update._meta !== undefined 2026-10-22T20:15:30.6442164Z 263 │ ? { _meta: Schema.is(Schema.Record(Schema.String, Schema.Json))(meta) ? meta : null } 2026-10-22T20:15:30.6442331Z ·  ───────── 2026-10-22T20:15:30.6442446Z 264 │ : {}), 2026-10-22T20:15:30.6442507Z ╰──── 2026-10-22T20:15:30.6442510Z 2026-10-22T20:15:30.6442794Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.6442974Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:335:7] 2026-10-22T20:15:30.6443045Z 330 │ }; 2026-10-22T20:15:30.6443122Z 331 │ useEffect(() => { 2026-10-22T20:15:30.6443210Z ·  ────┬──── 2026-10-22T20:15:30.6443353Z · ╰── This is the containing effect 2026-10-22T20:15:30.6443462Z 332 │ if (!guidesEnabled && section === "guide") { 2026-10-22T20:15:30.6443567Z 333 │ requestedSection.current = "overview"; 2026-10-22T20:15:30.6443762Z 334 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-22T20:15:30.6443844Z 335 │ setSection("overview"); 2026-10-22T20:15:30.6443933Z ·  ─────┬──── 2026-10-22T20:15:30.6444124Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.6444191Z 336 │ } 2026-10-22T20:15:30.6444245Z ╰──── 2026-10-22T20:15:30.6444887Z  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-22T20:15:30.6445242Z  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-22T20:15:30.6445248Z 2026-10-22T20:15:30.6445476Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-22T20:15:30.6445663Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:337:6] 2026-10-22T20:15:30.6445768Z 332 │ if (!guidesEnabled && section === "guide") { 2026-10-22T20:15:30.6445876Z 333 │ requestedSection.current = "overview"; 2026-10-22T20:15:30.6445969Z ·  ────────┬─────── 2026-10-22T20:15:30.6446440Z · ╰── 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-22T20:15:30.6446619Z 334 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-22T20:15:30.6446804Z ·  ─────────┬───────── ──────┬────── 2026-10-22T20:15:30.6447326Z · │ ╰── 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-22T20:15:30.6447798Z · ╰── 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-22T20:15:30.6447889Z 335 │ setSection("overview"); 2026-10-22T20:15:30.6447947Z 336 │ } 2026-10-22T20:15:30.6448116Z 337 │ }, [guidesEnabled, section, insets.top]); 2026-10-22T20:15:30.6448287Z ·  ──────────────────┬───────────────── 2026-10-22T20:15:30.6448498Z · ╰── This dependency list is missing values used by the callback 2026-10-22T20:15:30.6448592Z 338 │ const tabContent = activityContent; 2026-10-22T20:15:30.6448658Z ╰──── 2026-10-22T20:15:30.6448841Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-22T20:15:30.6449184Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.6449186Z 2026-10-22T20:15:30.6449410Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-22T20:15:30.6449596Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:873:6] 2026-10-22T20:15:30.6449675Z 856 │ if ( 2026-10-22T20:15:30.6449809Z 857 │ lastSelection.current.path === route.params.path && 2026-10-22T20:15:30.6449902Z ·  ──────┬────── 2026-10-22T20:15:30.6450356Z · ╰── 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-22T20:15:30.6450502Z 858 │ lastSelection.current.id === route.params.fileSelectionId 2026-10-22T20:15:30.6450567Z 859 │ ) 2026-10-22T20:15:30.6450641Z 860 │ return; 2026-10-22T20:15:30.6450828Z 861 │ lastSelection.current = { path: route.params.path, id: route.params.fileSelectionId }; 2026-10-22T20:15:30.6450987Z 862 │ if (route.params.focus) navigation.setParams({ focus: undefined }); 2026-10-22T20:15:30.6451092Z 863 │ setJumpPath(route.params.path); 2026-10-22T20:15:30.6451180Z 864 │ setSelectedRowId(null); 2026-10-22T20:15:30.6451270Z 865 │ jumpStarted.current = false; 2026-10-22T20:15:30.6451432Z 866 │ const file = data.files.find((entry) => entry.path === route.params.path); 2026-10-22T20:15:30.6451537Z 867 │ if (!file || !nativeView.current) return; 2026-10-22T20:15:30.6451648Z ·  ─────┬──── 2026-10-22T20:15:30.6452130Z · ╰── 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-22T20:15:30.6452279Z 868 │ setCollapsedIds((ids) => ids.filter((id) => id !== file.id)); 2026-10-22T20:15:30.6452373Z 869 │ jumpStarted.current = true; 2026-10-22T20:15:30.6452529Z 870 │ void nativeView.current.scrollToFile(file.id, false).catch(() => { 2026-10-22T20:15:30.6452618Z 871 │ jumpStarted.current = false; 2026-10-22T20:15:30.6452685Z 872 │ }); 2026-10-22T20:15:30.6452900Z 873 │ }, [route.params.path, route.params.fileSelectionId, route.params.focus, data.files, navigation]); 2026-10-22T20:15:30.6453152Z ·  ──────────────────────────────────────────────┬────────────────────────────────────────────── 2026-10-22T20:15:30.6453385Z · ╰── This dependency list is missing values used by the callback 2026-10-22T20:15:30.6453509Z 874 │ const appliedFilter = useRef(filter.hideTestFiles); 2026-10-22T20:15:30.6453578Z ╰──── 2026-10-22T20:15:30.6453833Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-22T20:15:30.6454213Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.6454215Z 2026-10-22T20:15:30.6454513Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-22T20:15:30.6454655Z ╭─[apps/server/src/provider/AntigravityAuth.ts:285:20] 2026-10-22T20:15:30.6454723Z 284 │ }, 2026-10-22T20:15:30.6454817Z 285 │ (effect, flow, stopSessions) => 2026-10-22T20:15:30.6454915Z ·  ──────┬───── 2026-10-22T20:15:30.6455074Z · ╰── 'stopSessions' is declared here 2026-10-22T20:15:30.6455157Z 286 │ effect.pipe( 2026-10-22T20:15:30.6455219Z ╰──── 2026-10-22T20:15:30.6455332Z  help: Consider removing this parameter. 2026-10-22T20:15:30.6455335Z 2026-10-22T20:15:30.6455830Z ⚠ 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-22T20:15:30.6456030Z ╭─[apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts:223:5] 2026-10-22T20:15:30.6456117Z 222 │ let idlePasses = 0; 2026-10-22T20:15:30.6456278Z 223 │ ╭─▶ for (;;) { 2026-10-22T20:15:30.6456426Z 224 │ │ yield* Effect.promise(() => Promise.resolve()); 2026-10-22T20:15:30.6456587Z 225 │ │ const pending = backgroundRuntime.pending.shift(); 2026-10-22T20:15:30.6456703Z 226 │ │ if (!pending) { 2026-10-22T20:15:30.6456808Z 227 │ │ idlePasses++; 2026-10-22T20:15:30.6456920Z 228 │ │ if (idlePasses >= 3) { 2026-10-22T20:15:30.6457023Z 229 │ │ return; 2026-10-22T20:15:30.6457114Z 230 │ │ } 2026-10-22T20:15:30.6457212Z 231 │ │ continue; 2026-10-22T20:15:30.6457296Z 232 │ │ } 2026-10-22T20:15:30.6457401Z 233 │ │ idlePasses = 0; 2026-10-22T20:15:30.6457531Z 234 │ │ const exit = yield* Effect.exit( 2026-10-22T20:15:30.6457840Z 235 │ │ pending.operation as Effect.Effect, 2026-10-22T20:15:30.6457977Z 236 │ │ ); 2026-10-22T20:15:30.6458096Z 237 │ │ yield* Effect.sync(() => { 2026-10-22T20:15:30.6458217Z 238 │ │ pending.resolve(exit); 2026-10-22T20:15:30.6458306Z 239 │ │ }); 2026-10-22T20:15:30.6458446Z 240 │ ╰─▶ } 2026-10-22T20:15:30.6458511Z 241 │ }, 2026-10-22T20:15:30.6458572Z ╰──── 2026-10-22T20:15:30.6458575Z 2026-10-22T20:15:30.6458756Z ⚠ eslint(no-empty-pattern): Empty array binding pattern 2026-10-22T20:15:30.6458922Z ╭─[apps/server/src/pullRequest/PullRequestService.test.ts:1429:12] 2026-10-22T20:15:30.6458986Z 1428 │ 2026-10-22T20:15:30.6459069Z 1429 │ for (const [] of [ 2026-10-22T20:15:30.6459156Z ·  ── 2026-10-22T20:15:30.6459232Z 1430 │ ["github", "github.com"], 2026-10-22T20:15:30.6459292Z ╰──── 2026-10-22T20:15:30.6459591Z  help: Passing non-iterable values (null, undefined, numbers, booleans, etc.) will result in a runtime error because these values are not iterable. 2026-10-22T20:15:30.6459593Z 2026-10-22T20:15:30.6459824Z ⚠ eslint(no-unused-vars): Function 'describeSchedule' is declared but never used. 2026-10-22T20:15:30.6459961Z ╭─[apps/server/src/scheduledTasks/Schedule.ts:79:10] 2026-10-22T20:15:30.6460025Z 78 │ 2026-10-22T20:15:30.6460233Z 79 │ function describeSchedule(schedule: ScheduledTaskSchedule): string { 2026-10-22T20:15:30.6460334Z ·  ────────┬─────── 2026-10-22T20:15:30.6460502Z · ╰── 'describeSchedule' is declared here 2026-10-22T20:15:30.6460624Z 80 │ if (schedule.type === "webhook") return "On webhook"; 2026-10-22T20:15:30.6460683Z ╰──── 2026-10-22T20:15:30.6460800Z  help: Consider removing this declaration. 2026-10-22T20:15:30.6460803Z 2026-10-22T20:15:30.6461282Z ⚠ 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-22T20:15:30.6461489Z ╭─[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:521:13] 2026-10-22T20:15:30.6461570Z 520 │ })).delivery; 2026-10-22T20:15:30.6461782Z 521 │ ╭─▶ while (delivery.outcome === "accepted") { 2026-10-22T20:15:30.6461940Z 522 │ │ yield* Effect.yieldNow; 2026-10-22T20:15:30.6462099Z 523 │ │ delivery = (yield* service.getWebhookDelivery({ 2026-10-22T20:15:30.6462213Z 524 │ │ id: task.id, 2026-10-22T20:15:30.6462347Z 525 │ │ deliveryId: deliveryId!, 2026-10-22T20:15:30.6462455Z 526 │ │ })).delivery; 2026-10-22T20:15:30.6462603Z 527 │ ╰─▶ } 2026-10-22T20:15:30.6462732Z 528 │ assert.equal(delivery.outcome, "dispatch_failed"); 2026-10-22T20:15:30.6462795Z ╰──── 2026-10-22T20:15:30.6462798Z 2026-10-22T20:15:30.6463016Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T20:15:30.6463246Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:454:7] 2026-10-22T20:15:30.6463406Z 453 │ showAuxiliaryPane("inspector"); 2026-10-22T20:15:30.6463528Z 454 │ }, [environmentId, showAuxiliaryPane, threadId]); 2026-10-22T20:15:30.6463698Z ·  ──────┬────── ────┬─── 2026-10-22T20:15:30.6463912Z · │ ╰── Unnecessary dependency `threadId` 2026-10-22T20:15:30.6464077Z · ╰── Unnecessary dependency `environmentId` 2026-10-22T20:15:30.6464148Z 455 │ const { 2026-10-22T20:15:30.6464210Z ╰──── 2026-10-22T20:15:30.6464520Z  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-22T20:15:30.6464856Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.6464861Z 2026-10-22T20:15:30.6465066Z ⚠ react(static-components): Cannot create components during render 2026-10-22T20:15:30.6465221Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:725:20] 2026-10-22T20:15:30.6465302Z 492 │ // same check. 2026-10-22T20:15:30.6465436Z 493 │ const NativeReviewDiffView = resolveNativeReviewDiffView(); 2026-10-22T20:15:30.6465578Z ·  ─────────────┬───────────── 2026-10-22T20:15:30.6465775Z · ╰── The component is created during render here 2026-10-22T20:15:30.6465948Z 494 │ const nativeReviewDiffViewRef = useRef(null); 2026-10-22T20:15:30.6466078Z 495 │ const showcasedReviewDrawRef = useRef(null); 2026-10-22T20:15:30.6466221Z 496 │ const [isPullRefreshing, setIsPullRefreshing] = useState(false); 2026-10-22T20:15:30.6466326Z 497 │ const handlePullToRefresh = async () => { 2026-10-22T20:15:30.6466415Z 498 │ setIsPullRefreshing(true); 2026-10-22T20:15:30.6466503Z 499 │ await refreshSelectedSection(); 2026-10-22T20:15:30.6466591Z 500 │ setIsPullRefreshing(false); 2026-10-22T20:15:30.6466657Z 501 │ }; 2026-10-22T20:15:30.6466825Z 502 │ const reviewFileNavigatorRef = useRef(null); 2026-10-22T20:15:30.6466980Z 503 │ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : []; 2026-10-22T20:15:30.6467098Z 504 │ const fileVisibility = useReviewFileVisibility({ 2026-10-22T20:15:30.6467202Z 505 │ threadKey: reviewCache.threadKey, 2026-10-22T20:15:30.6467308Z 506 │ sectionId: selectedSection?.id ?? null, 2026-10-22T20:15:30.6467382Z 507 │ files: reviewFiles, 2026-10-22T20:15:30.6467492Z 508 │ cachedExpandedFileIds: selectedSection?.id 2026-10-22T20:15:30.6467639Z 509 │ ? reviewCache.expandedFileIdsBySection[selectedSection.id] 2026-10-22T20:15:30.6467714Z 510 │ : undefined, 2026-10-22T20:15:30.6467814Z 511 │ cachedViewedFileIds: selectedSection?.id 2026-10-22T20:15:30.6467954Z 512 │ ? reviewCache.viewedFileIdsBySection[selectedSection.id] 2026-10-22T20:15:30.6468027Z 513 │ : undefined, 2026-10-22T20:15:30.6468089Z 514 │ }); 2026-10-22T20:15:30.6468287Z 515 │ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility; 2026-10-22T20:15:30.6468438Z 516 │ const commentSelection = useReviewCommentSelectionController({ 2026-10-22T20:15:30.6468599Z 517 │ environmentId, 2026-10-22T20:15:30.6468745Z 518 │ threadId, 2026-10-22T20:15:30.6468821Z 519 │ selectedSection, 2026-10-22T20:15:30.6468908Z 520 │ nativeReviewDiffData, 2026-10-22T20:15:30.6468973Z 521 │ }); 2026-10-22T20:15:30.6469085Z 522 │ const nativeBridge = useNativeReviewDiffBridge({ 2026-10-22T20:15:30.6469185Z 523 │ threadKey: reviewCache.threadKey, 2026-10-22T20:15:30.6469286Z 524 │ sectionId: selectedSection?.id ?? null, 2026-10-22T20:15:30.6469377Z 525 │ diff: selectedSection?.diff, 2026-10-22T20:15:30.6469465Z 526 │ data: nativeReviewDiffData, 2026-10-22T20:15:30.6469542Z 527 │ collapsedFileIds, 2026-10-22T20:15:30.6469616Z 528 │ viewedFileIds, 2026-10-22T20:15:30.6469740Z 529 │ selectedRowIds: commentSelection.selectedRowIds, 2026-10-22T20:15:30.6469848Z 530 │ canHighlight: parsedDiff.kind === "files", 2026-10-22T20:15:30.6469914Z 531 │ }); 2026-10-22T20:15:30.6470000Z 532 │ const showcaseReviewKey = 2026-10-22T20:15:30.6470150Z 533 │ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection 2026-10-22T20:15:30.6470371Z 534 │ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}` 2026-10-22T20:15:30.6470443Z 535 │ : null; 2026-10-22T20:15:30.6470624Z 536 │ const handleNativeDebug = (event: NativeSyntheticEvent>) => { 2026-10-22T20:15:30.6470716Z 537 │ nativeBridge.onDebug(event); 2026-10-22T20:15:30.6470782Z 538 │ if ( 2026-10-22T20:15:30.6470876Z 539 │ showcaseReviewKey === null || 2026-10-22T20:15:30.6471011Z 540 │ showcasedReviewDrawRef.current === showcaseReviewKey || 2026-10-22T20:15:30.6471132Z 541 │ !isNativeReviewDiffDrawEvent(event.nativeEvent) 2026-10-22T20:15:30.6471198Z 542 │ ) { 2026-10-22T20:15:30.6471277Z 543 │ return; 2026-10-22T20:15:30.6471338Z 544 │ } 2026-10-22T20:15:30.6471464Z 545 │ showcasedReviewDrawRef.current = showcaseReviewKey; 2026-10-22T20:15:30.6471637Z 546 │ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId }); 2026-10-22T20:15:30.6471707Z 547 │ }; 2026-10-22T20:15:30.6471770Z 548 │ 2026-10-22T20:15:30.6471911Z 549 │ const handleSelectFile = async (fileId: string | null) => { 2026-10-22T20:15:30.6472062Z 550 │ loadVisibleFile(fileId, true); 2026-10-22T20:15:30.6472164Z 551 │ commentSelection.clearSelection(); 2026-10-22T20:15:30.6472295Z 552 │ if (fileId !== null && collapsedFileIds.includes(fileId)) { 2026-10-22T20:15:30.6472382Z 553 │ toggleExpandedFile(fileId); 2026-10-22T20:15:30.6472452Z 554 │ } 2026-10-22T20:15:30.6472586Z 555 │ const nativeView = nativeReviewDiffViewRef.current; 2026-10-22T20:15:30.6472673Z 556 │ if (!nativeView) return; 2026-10-22T20:15:30.6472778Z 557 │ const result = await settlePromise(() => 2026-10-22T20:15:30.6472972Z 558 │ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true), 2026-10-22T20:15:30.6473042Z 559 │ ); 2026-10-22T20:15:30.6473148Z 560 │ if (AsyncResult.isFailure(result)) { 2026-10-22T20:15:30.6473342Z 561 │ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result)); 2026-10-22T20:15:30.6473408Z 562 │ } 2026-10-22T20:15:30.6473483Z 563 │ }; 2026-10-22T20:15:30.6473576Z 564 │ const handleVisibleFileChange = ( 2026-10-22T20:15:30.6473714Z 565 │ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>, 2026-10-22T20:15:30.6473790Z 566 │ ) => { 2026-10-22T20:15:30.6474158Z 567 │ loadVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-22T20:15:30.6474398Z 568 │ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-22T20:15:30.6474456Z 569 │ }; 2026-10-22T20:15:30.6474543Z 570 │ const renderInspector = () => ( 2026-10-22T20:15:30.6474624Z 571 │ void handleSelectFile(fileId)} 2026-10-22T20:15:30.6475202Z 577 │ /> 2026-10-22T20:15:30.6475268Z 578 │ ); 2026-10-22T20:15:30.6475330Z 579 │ 2026-10-22T20:15:30.6475534Z 580 │ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => { 2026-10-22T20:15:30.6475648Z 581 │ const { fileId } = event.nativeEvent; 2026-10-22T20:15:30.6475723Z 582 │ if (fileId) { 2026-10-22T20:15:30.6475817Z 583 │ loadVisibleFile(fileId, true); 2026-10-22T20:15:30.6475899Z 584 │ toggleExpandedFile(fileId); 2026-10-22T20:15:30.6475970Z 585 │ } 2026-10-22T20:15:30.6476032Z 586 │ }; 2026-10-22T20:15:30.6476091Z 587 │ 2026-10-22T20:15:30.6476187Z 588 │ const handleNativeToggleViewedFile = ( 2026-10-22T20:15:30.6476319Z 589 │ event: NativeSyntheticEvent<{ readonly fileId?: string }>, 2026-10-22T20:15:30.6476387Z 590 │ ) => { 2026-10-22T20:15:30.6476487Z 591 │ const { fileId } = event.nativeEvent; 2026-10-22T20:15:30.6476553Z 592 │ if (fileId) { 2026-10-22T20:15:30.6476639Z 593 │ toggleViewedFile(fileId); 2026-10-22T20:15:30.6476713Z 594 │ } 2026-10-22T20:15:30.6476783Z 595 │ }; 2026-10-22T20:15:30.6476838Z 596 │ 2026-10-22T20:15:30.6476924Z 597 │ const parsedDiffNotice = 2026-10-22T20:15:30.6477101Z 598 │ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null; 2026-10-22T20:15:30.6477239Z 599 │ const hasCachedSelectedDiff = selectedSection?.diff != null; 2026-10-22T20:15:30.6477407Z 600 │ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null); 2026-10-22T20:15:30.6477550Z 601 │ const sectionMenu = buildReviewSectionMenu(reviewSections); 2026-10-22T20:15:30.6477723Z 602 │ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({ 2026-10-22T20:15:30.6477846Z 603 │ hasEnvironmentPresentation: environment.isReady, 2026-10-22T20:15:30.6477958Z 604 │ isEnvironmentConnected: isEnvironmentReady, 2026-10-22T20:15:30.6478046Z 605 │ hasCachedSelectedDiff, 2026-10-22T20:15:30.6478127Z 606 │ hasAnyCachedDiff, 2026-10-22T20:15:30.6478187Z 607 │ }); 2026-10-22T20:15:30.6478287Z 608 │ const handleRetryEnvironment = () => { 2026-10-22T20:15:30.6478387Z 609 │ void retryEnvironment(environmentId); 2026-10-22T20:15:30.6478454Z 610 │ }; 2026-10-22T20:15:30.6478548Z 611 │ const handleReturnToThread = () => { 2026-10-22T20:15:30.6478643Z 612 │ if (navigation.canGoBack()) { 2026-10-22T20:15:30.6478726Z 613 │ navigation.goBack(); 2026-10-22T20:15:30.6478805Z 614 │ return; 2026-10-22T20:15:30.6478862Z 615 │ } 2026-10-22T20:15:30.6478953Z 616 │ navigation.navigate("Thread", { 2026-10-22T20:15:30.6479056Z 617 │ environmentId: String(environmentId), 2026-10-22T20:15:30.6479147Z 618 │ threadId: String(threadId), 2026-10-22T20:15:30.6479210Z 619 │ }); 2026-10-22T20:15:30.6479344Z 620 │ }; 2026-10-22T20:15:30.6479469Z 621 │ const androidHeaderSubtitle = [ 2026-10-22T20:15:30.6479549Z 622 │ selectedSection?.title, 2026-10-22T20:15:30.6479635Z 623 │ headerDiffSummary.additions, 2026-10-22T20:15:30.6479727Z 624 │ headerDiffSummary.deletions, 2026-10-22T20:15:30.6479791Z 625 │ ] 2026-10-22T20:15:30.6479904Z 626 │ .filter((part): part is string => Boolean(part)) 2026-10-22T20:15:30.6479979Z 627 │ .join(" · "); 2026-10-22T20:15:30.6480041Z 628 │ 2026-10-22T20:15:30.6480128Z 629 │ const showChangedFilesPane = 2026-10-22T20:15:30.6480207Z 630 │ !showConnectionNotice && 2026-10-22T20:15:30.6480291Z 631 │ selectedSection !== null && 2026-10-22T20:15:30.6480378Z 632 │ parsedDiff.kind === "files" && 2026-10-22T20:15:30.6480465Z 633 │ NativeReviewDiffView !== null; 2026-10-22T20:15:30.6480652Z 634 │ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined); 2026-10-22T20:15:30.6480837Z 635 │ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane; 2026-10-22T20:15:30.6480901Z 636 │ 2026-10-22T20:15:30.6480989Z 637 │ const listHeader = (() => { 2026-10-22T20:15:30.6481082Z 638 │ const children: ReactElement[] = []; 2026-10-22T20:15:30.6481146Z 639 │ 2026-10-22T20:15:30.6481221Z 640 │ if (error) { 2026-10-22T20:15:30.6481299Z 641 │ children.push( 2026-10-22T20:15:30.6481365Z 642 │ 2026-10-22T20:15:30.6482162Z 649 │ Review unavailable 2026-10-22T20:15:30.6482338Z 650 │ {error} 2026-10-22T20:15:30.6482412Z 651 │ , 2026-10-22T20:15:30.6482482Z 652 │ ); 2026-10-22T20:15:30.6482544Z 653 │ } 2026-10-22T20:15:30.6482618Z 654 │ 2026-10-22T20:15:30.6482706Z 655 │ if (parsedDiffNotice) { 2026-10-22T20:15:30.6482881Z 656 │ children.push(); 2026-10-22T20:15:30.6482938Z 657 │ } 2026-10-22T20:15:30.6483007Z 658 │ 2026-10-22T20:15:30.6483092Z 659 │ if (children.length === 0) { 2026-10-22T20:15:30.6483165Z 660 │ return null; 2026-10-22T20:15:30.6483221Z 661 │ } 2026-10-22T20:15:30.6483292Z 662 │ 2026-10-22T20:15:30.6483377Z 663 │ return <>{children}; 2026-10-22T20:15:30.6483444Z 664 │ })(); 2026-10-22T20:15:30.6483517Z 665 │ const headerSubtitle = [ 2026-10-22T20:15:30.6483605Z 666 │ headerDiffSummary.additions, 2026-10-22T20:15:30.6483691Z 667 │ headerDiffSummary.deletions, 2026-10-22T20:15:30.6483776Z 668 │ pendingReviewCommentCount > 0 2026-10-22T20:15:30.6483965Z 669 │ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}` 2026-10-22T20:15:30.6484042Z 670 │ : null, 2026-10-22T20:15:30.6484105Z 671 │ ] 2026-10-22T20:15:30.6484175Z 672 │ .filter(Boolean) 2026-10-22T20:15:30.6484249Z 673 │ .join(" · "); 2026-10-22T20:15:30.6484399Z 674 │ const headerTitleText = selectedSection?.title ?? "Review changes"; 2026-10-22T20:15:30.6484462Z 675 │ 2026-10-22T20:15:30.6484594Z 676 │ return ( 2026-10-22T20:15:30.6484706Z 677 │ <> 2026-10-22T20:15:30.6484790Z 678 │ 2026-10-22T20:15:30.6486319Z 694 │ 2026-10-22T20:15:30.6486395Z 695 │ 2026-10-22T20:15:30.6486529Z 696 │ 2026-10-22T20:15:30.6486621Z 697 │ {showConnectionNotice ? ( 2026-10-22T20:15:30.6486784Z 698 │ 2026-10-22T20:15:30.6486879Z 699 │ 2026-10-22T20:15:30.6488037Z 711 │ 2026-10-22T20:15:30.6488215Z 712 │ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? ( 2026-10-22T20:15:30.6488291Z 713 │ 2026-10-22T20:15:30.6488828Z 719 │ 2026-10-22T20:15:30.6489242Z 723 │ {listHeader} 2026-10-22T20:15:30.6489378Z 724 │ 2026-10-22T20:15:30.6489473Z 725 │ = Layer.succeed( 2026-10-22T20:15:30.6498795Z ·  ────────┬─────── 2026-10-22T20:15:30.6498953Z · ╰── 'layerUnavailable' is declared here 2026-10-22T20:15:30.6499036Z 12233 │ OrchestratorV2, 2026-10-22T20:15:30.6499105Z ╰──── 2026-10-22T20:15:30.6499219Z  help: Consider removing this declaration. 2026-10-22T20:15:30.6499302Z 2026-10-22T20:15:30.6499607Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.6499821Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:107:5] 2026-10-22T20:15:30.6499883Z 104 │ 2026-10-22T20:15:30.6499960Z 105 │ useEffect(() => { 2026-10-22T20:15:30.6500041Z ·  ────┬──── 2026-10-22T20:15:30.6500258Z · ╰── This is the containing effect 2026-10-22T20:15:30.6500349Z 106 │ clearReviewCommentTarget(); 2026-10-22T20:15:30.6500469Z 107 │ setPendingNativeCommentSelection(null); 2026-10-22T20:15:30.6500592Z ·  ────────────────┬─────────────── 2026-10-22T20:15:30.6500803Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.6500891Z 108 │ }, [selectedSection?.id]); 2026-10-22T20:15:30.6500953Z ╰──── 2026-10-22T20:15:30.6501579Z  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-22T20:15:30.6501964Z  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-22T20:15:30.6501967Z 2026-10-22T20:15:30.6502256Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.6502467Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7] 2026-10-22T20:15:30.6502538Z 109 │ 2026-10-22T20:15:30.6502611Z 110 │ useEffect(() => { 2026-10-22T20:15:30.6502697Z ·  ────┬──── 2026-10-22T20:15:30.6502853Z · ╰── This is the containing effect 2026-10-22T20:15:30.6502954Z 111 │ if (activeCommentTarget === null) { 2026-10-22T20:15:30.6503061Z 112 │ setPendingNativeCommentSelection(null); 2026-10-22T20:15:30.6503191Z ·  ────────────────┬─────────────── 2026-10-22T20:15:30.6503396Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.6503472Z 113 │ } 2026-10-22T20:15:30.6503528Z ╰──── 2026-10-22T20:15:30.6504172Z  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-22T20:15:30.6504520Z  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-22T20:15:30.6504524Z 2026-10-22T20:15:30.6504744Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T20:15:30.6504947Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7] 2026-10-22T20:15:30.6505052Z 107 │ setPendingNativeCommentSelection(null); 2026-10-22T20:15:30.6505147Z 108 │ }, [selectedSection?.id]); 2026-10-22T20:15:30.6505352Z ·  ─────────┬───────── 2026-10-22T20:15:30.6505586Z · ╰── Unnecessary dependency `selectedSection?.id` 2026-10-22T20:15:30.6505648Z 109 │ 2026-10-22T20:15:30.6505717Z ╰──── 2026-10-22T20:15:30.6506033Z  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-22T20:15:30.6506367Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.6506369Z 2026-10-22T20:15:30.6506648Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.6506844Z ╭─[apps/mobile/src/features/review/ReviewCommentComposerSheet.tsx:103:7] 2026-10-22T20:15:30.6506912Z 100 │ 2026-10-22T20:15:30.6506990Z 101 │ useEffect(() => { 2026-10-22T20:15:30.6507073Z ·  ────┬──── 2026-10-22T20:15:30.6507217Z · ╰── This is the containing effect 2026-10-22T20:15:30.6507346Z 102 │ if (!target || selectedLines.length === 0) { 2026-10-22T20:15:30.6507440Z 103 │ setHighlightedLinesById({}); 2026-10-22T20:15:30.6507542Z ·  ───────────┬─────────── 2026-10-22T20:15:30.6507735Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.6507819Z 104 │ return; 2026-10-22T20:15:30.6507886Z ╰──── 2026-10-22T20:15:30.6508515Z  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-22T20:15:30.6508858Z  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-22T20:15:30.6508860Z 2026-10-22T20:15:30.6509129Z ⚠ eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used. 2026-10-22T20:15:30.6509336Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:960:10] 2026-10-22T20:15:30.6509397Z 959 │ 2026-10-22T20:15:30.6509517Z 960 │ function layerClaudeAgentSdkReplayQueryRunner( 2026-10-22T20:15:30.6509663Z ·  ──────────────────┬───────────────── 2026-10-22T20:15:30.6509887Z · ╰── 'layerClaudeAgentSdkReplayQueryRunner' is declared here 2026-10-22T20:15:30.6510010Z 961 │ transcript: ClaudeAgentSdkReplayTranscript, 2026-10-22T20:15:30.6510076Z ╰──── 2026-10-22T20:15:30.6510195Z  help: Consider removing this declaration. 2026-10-22T20:15:30.6510198Z 2026-10-22T20:15:30.6510440Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-22T20:15:30.6510610Z ╭─[packages/client-runtime/src/operations/projects.ts:228:51] 2026-10-22T20:15:30.6510678Z 227 │ ): string { 2026-10-22T20:15:30.6510858Z 228 │ const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? ""; 2026-10-22T20:15:30.6510991Z ·  ────── 2026-10-22T20:15:30.6511235Z 229 │ return target.owner ? `${target.owner}/${folderName}` : folderName; 2026-10-22T20:15:30.6511336Z ╰──── 2026-10-22T20:15:30.6511524Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-22T20:15:30.6511527Z 2026-10-22T20:15:30.6511775Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-22T20:15:30.6511934Z ╭─[scripts/lib/cli-external-packages.test.ts:114:11] 2026-10-22T20:15:30.6512040Z 113 │ const declared = { 2026-10-22T20:15:30.6512138Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-22T20:15:30.6512270Z ·  ──────────────────────────────── 2026-10-22T20:15:30.6512388Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-22T20:15:30.6512450Z ╰──── 2026-10-22T20:15:30.6512736Z  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-22T20:15:30.6512742Z 2026-10-22T20:15:30.6512980Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-22T20:15:30.6513122Z ╭─[scripts/lib/cli-external-packages.test.ts:115:11] 2026-10-22T20:15:30.6513223Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-22T20:15:30.6513334Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-22T20:15:30.6513475Z ·  ──────────────────────────────────────── 2026-10-22T20:15:30.6513582Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-22T20:15:30.6513647Z ╰──── 2026-10-22T20:15:30.6513927Z  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-22T20:15:30.6513933Z 2026-10-22T20:15:30.6514173Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-22T20:15:30.6514313Z ╭─[scripts/lib/cli-external-packages.test.ts:116:11] 2026-10-22T20:15:30.6514427Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-22T20:15:30.6514531Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-22T20:15:30.6514656Z ·  ──────────────────────────────────── 2026-10-22T20:15:30.6514729Z 117 │ }; 2026-10-22T20:15:30.6514787Z ╰──── 2026-10-22T20:15:30.6515060Z  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-22T20:15:30.6515070Z 2026-10-22T20:15:30.6515402Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-22T20:15:30.6515638Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:60:5] 2026-10-22T20:15:30.6515699Z 55 │ 2026-10-22T20:15:30.6515773Z 56 │ useEffect(() => { 2026-10-22T20:15:30.6515849Z ·  ────┬──── 2026-10-22T20:15:30.6515995Z · ╰── This is the containing effect 2026-10-22T20:15:30.6516073Z 57 │ scheduler.reset(); 2026-10-22T20:15:30.6516185Z 58 │ highlightedRowIdsRef.current = new Set(); 2026-10-22T20:15:30.6516276Z 59 │ visibleChunkIndexRef.current = 0; 2026-10-22T20:15:30.6516403Z 60 │ setVisibleRange({ firstRowIndex: 0, lastRowIndex: 80 }); 2026-10-22T20:15:30.6516498Z ·  ───────┬─────── 2026-10-22T20:15:30.6516689Z · ╰── Avoid calling setState() directly within an effect 2026-10-22T20:15:30.6516812Z 61 │ setTokensPatchJson(createEmptyTokenPatch(resetKey)); 2026-10-22T20:15:30.6516873Z ╰──── 2026-10-22T20:15:30.6517502Z  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-22T20:15:30.6517841Z  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-22T20:15:30.6517844Z 2026-10-22T20:15:30.6518058Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-22T20:15:30.6518247Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:63:7] 2026-10-22T20:15:30.6518341Z 62 │ return () => scheduler.cancel(); 2026-10-22T20:15:30.6518452Z 63 │ }, [enabled, resetKey, rows.length, scheduler]); 2026-10-22T20:15:30.6518593Z ·  ───┬─── ─────┬───── 2026-10-22T20:15:30.6518795Z · │ ╰── Unnecessary dependency `rows.length` 2026-10-22T20:15:30.6518950Z · ╰── Unnecessary dependency `enabled` 2026-10-22T20:15:30.6519009Z 64 │ 2026-10-22T20:15:30.6519069Z ╰──── 2026-10-22T20:15:30.6519373Z  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-22T20:15:30.6519706Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.6519712Z 2026-10-22T20:15:30.6519917Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-22T20:15:30.6520083Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:223:31] 2026-10-22T20:15:30.6520200Z 222 │ ? snippetTokens.map((line, lineIndex) => ( 2026-10-22T20:15:30.6520300Z 223 │ 2026-10-22T20:15:30.6520421Z ·  ─────────────── 2026-10-22T20:15:30.6520522Z 224 │ {lineIndex > 0 ? "\n" : ""} 2026-10-22T20:15:30.6520576Z ╰──── 2026-10-22T20:15:30.6520807Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-22T20:15:30.6520851Z 2026-10-22T20:15:30.6521058Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-22T20:15:30.6521221Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25] 2026-10-22T20:15:30.6521306Z 226 │ 2026-10-22T20:15:30.6522559Z ·  ──────┬───── 2026-10-22T20:15:30.6522730Z · ╰── 'stopSessions' is declared here 2026-10-22T20:15:30.6522807Z 250 │ effect.pipe( 2026-10-22T20:15:30.6522862Z ╰──── 2026-10-22T20:15:30.6522975Z  help: Consider removing this parameter. 2026-10-22T20:15:30.6522977Z 2026-10-22T20:15:30.6523275Z ⚠ eslint(no-unused-vars): Variable 'legacyCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-22T20:15:30.6523449Z ╭─[packages/provider-cursor/src/server/credentialStore.test.ts:15:7] 2026-10-22T20:15:30.6523508Z 14 │ 2026-10-22T20:15:30.6523590Z 15 │ const legacyCredentials = { 2026-10-22T20:15:30.6523683Z ·  ────────┬──────── 2026-10-22T20:15:30.6523845Z · ╰── 'legacyCredentials' is declared here 2026-10-22T20:15:30.6523918Z 16 │ version: 1 as const, 2026-10-22T20:15:30.6523975Z ╰──── 2026-10-22T20:15:30.6524088Z  help: Consider removing this declaration. 2026-10-22T20:15:30.6524090Z 2026-10-22T20:15:30.6524365Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-22T20:15:30.6524545Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10555:7] 2026-10-22T20:15:30.6524606Z 10554 │ 2026-10-22T20:15:30.6524696Z 10555 │ const layer: Layer.Layer< 2026-10-22T20:15:30.6524782Z ·  ──┬── 2026-10-22T20:15:30.6524919Z · ╰── 'layer' is declared here 2026-10-22T20:15:30.6525022Z 10556 │ ProviderAdapter.ProviderAdapterV2, 2026-10-22T20:15:30.6525082Z ╰──── 2026-10-22T20:15:30.6525192Z  help: Consider removing this declaration. 2026-10-22T20:15:30.6525195Z 2026-10-22T20:15:30.6525690Z ⚠ 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-22T20:15:30.6525842Z ╭─[packages/client-runtime/src/rpc/client.test.ts:131:9] 2026-10-22T20:15:30.6525915Z 130 │ ) { 2026-10-22T20:15:30.6526222Z 131 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-22T20:15:30.6526407Z 132 │ │ if (subscriptions.length >= count) { 2026-10-22T20:15:30.6526507Z 133 │ │ return; 2026-10-22T20:15:30.6526602Z 134 │ │ } 2026-10-22T20:15:30.6526723Z 135 │ │ yield* Effect.yieldNow; 2026-10-22T20:15:30.6526875Z 136 │ ╰─▶ } 2026-10-22T20:15:30.6527048Z 137 │ return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`)); 2026-10-22T20:15:30.6527113Z ╰──── 2026-10-22T20:15:30.6527116Z 2026-10-22T20:15:30.6527605Z ⚠ 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-22T20:15:30.6527756Z ╭─[packages/client-runtime/src/rpc/client.test.ts:252:7] 2026-10-22T20:15:30.6527926Z 251 │ yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient))); 2026-10-22T20:15:30.6528202Z 252 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) { 2026-10-22T20:15:30.6528319Z 253 │ │ yield* Effect.yieldNow; 2026-10-22T20:15:30.6528468Z 254 │ ╰─▶ } 2026-10-22T20:15:30.6528606Z 255 │ yield* SubscriptionRef.set(activeSession, Option.none()); 2026-10-22T20:15:30.6528664Z ╰──── 2026-10-22T20:15:30.6528666Z 2026-10-22T20:15:30.6529160Z ⚠ 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-22T20:15:30.6529308Z ╭─[packages/client-runtime/src/rpc/client.test.ts:258:7] 2026-10-22T20:15:30.6529377Z 257 │ 2026-10-22T20:15:30.6529645Z 258 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-22T20:15:30.6529764Z 259 │ │ yield* Effect.yieldNow; 2026-10-22T20:15:30.6529909Z 260 │ ╰─▶ } 2026-10-22T20:15:30.6530024Z 261 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-22T20:15:30.6530084Z ╰──── 2026-10-22T20:15:30.6530092Z 2026-10-22T20:15:30.6530576Z ⚠ 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-22T20:15:30.6530722Z ╭─[packages/client-runtime/src/rpc/client.test.ts:322:7] 2026-10-22T20:15:30.6530794Z 321 │ ); 2026-10-22T20:15:30.6531069Z 322 │ ╭─▶ for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) { 2026-10-22T20:15:30.6531182Z 323 │ │ yield* Effect.yieldNow; 2026-10-22T20:15:30.6531331Z 324 │ ╰─▶ } 2026-10-22T20:15:30.6531392Z 325 │ 2026-10-22T20:15:30.6531451Z ╰──── 2026-10-22T20:15:30.6531520Z 2026-10-22T20:15:30.6532066Z ⚠ 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-22T20:15:30.6532207Z ╭─[packages/client-runtime/src/rpc/client.test.ts:330:7] 2026-10-22T20:15:30.6532382Z 329 │ yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient))); 2026-10-22T20:15:30.6532651Z 330 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-22T20:15:30.6532767Z 331 │ │ yield* Effect.yieldNow; 2026-10-22T20:15:30.6532909Z 332 │ ╰─▶ } 2026-10-22T20:15:30.6533028Z 333 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-22T20:15:30.6533094Z ╰──── 2026-10-22T20:15:30.6533096Z 2026-10-22T20:15:30.6533339Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-22T20:15:30.6533520Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:1998:15] 2026-10-22T20:15:30.6533598Z 1997 │ assert.equal( 2026-10-22T20:15:30.6533768Z 1998 │ items.filter((item) => item.type === "assistant_message").at(-1)?.text, 2026-10-22T20:15:30.6533869Z ·  ────── 2026-10-22T20:15:30.6533957Z 1999 │ "authoritative answer", 2026-10-22T20:15:30.6534022Z ╰──── 2026-10-22T20:15:30.6534206Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-22T20:15:30.6534209Z 2026-10-22T20:15:30.6534699Z ⚠ 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-22T20:15:30.6534887Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:3951:7] 2026-10-22T20:15:30.6535078Z 3950 │ const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped); 2026-10-22T20:15:30.6535301Z 3951 │ ╭─▶ while (!responseLifecycle.includes("failed")) { 2026-10-22T20:15:30.6535422Z 3952 │ │ yield* Effect.yieldNow; 2026-10-22T20:15:30.6535575Z 3953 │ ╰─▶ } 2026-10-22T20:15:30.6535709Z 3954 │ const responseExit = yield* Fiber.join(responseFiber); 2026-10-22T20:15:30.6535779Z ╰──── 2026-10-22T20:15:30.6535781Z 2026-10-22T20:15:30.6536267Z ⚠ 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-22T20:15:30.6536453Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6062:9] 2026-10-22T20:15:30.6536551Z 6061 │ .pipe(Effect.forkScoped); 2026-10-22T20:15:30.6536753Z 6062 │ ╭─▶ while (promptGates.length < 1) { 2026-10-22T20:15:30.6536873Z 6063 │ │ yield* Effect.yieldNow; 2026-10-22T20:15:30.6537116Z 6064 │ ╰─▶ } 2026-10-22T20:15:30.6537381Z 6065 │ assert.isDefined(sessionUpdateHandler, "session update handler must be wired"); 2026-10-22T20:15:30.6537442Z ╰──── 2026-10-22T20:15:30.6537446Z 2026-10-22T20:15:30.6537938Z ⚠ 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-22T20:15:30.6538126Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6197:9] 2026-10-22T20:15:30.6538225Z 6196 │ .pipe(Effect.forkScoped); 2026-10-22T20:15:30.6538418Z 6197 │ ╭─▶ while (promptGates.length < 2) { 2026-10-22T20:15:30.6538544Z 6198 │ │ yield* Effect.yieldNow; 2026-10-22T20:15:30.6538696Z 6199 │ ╰─▶ } 2026-10-22T20:15:30.6538877Z 6200 │ if (sessionUpdateHandler === undefined || capturedMutation.current === null) { 2026-10-22T20:15:30.6538932Z ╰──── 2026-10-22T20:15:30.6538941Z 2026-10-22T20:15:30.6539414Z ⚠ 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-22T20:15:30.6539565Z ╭─[packages/client-runtime/src/rpc/session.test.ts:226:3] 2026-10-22T20:15:30.6539631Z 225 │ ) { 2026-10-22T20:15:30.6539859Z 226 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-22T20:15:30.6539980Z 227 │ │ const socket = sockets[index]; 2026-10-22T20:15:30.6540085Z 228 │ │ if (socket) { 2026-10-22T20:15:30.6540296Z 229 │ │ return socket; 2026-10-22T20:15:30.6540388Z 230 │ │ } 2026-10-22T20:15:30.6540498Z 231 │ │ yield* Effect.yieldNow; 2026-10-22T20:15:30.6540640Z 232 │ ╰─▶ } 2026-10-22T20:15:30.6540830Z 233 │ return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket.")); 2026-10-22T20:15:30.6540898Z ╰──── 2026-10-22T20:15:30.6540902Z 2026-10-22T20:15:30.6541458Z ⚠ 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-22T20:15:30.6541658Z ╭─[packages/client-runtime/src/rpc/session.test.ts:240:3] 2026-10-22T20:15:30.6541725Z 239 │ ) { 2026-10-22T20:15:30.6541974Z 240 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-22T20:15:30.6542206Z 241 │ │ const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index]; 2026-10-22T20:15:30.6542305Z 242 │ │ if (request) { 2026-10-22T20:15:30.6542417Z 243 │ │ return request; 2026-10-22T20:15:30.6542500Z 244 │ │ } 2026-10-22T20:15:30.6542618Z 245 │ │ yield* Effect.yieldNow; 2026-10-22T20:15:30.6542752Z 246 │ ╰─▶ } 2026-10-22T20:15:30.6542936Z 247 │ return yield* Effect.die(new Error("Expected the RPC protocol to send a request.")); 2026-10-22T20:15:30.6543002Z ╰──── 2026-10-22T20:15:30.6543004Z 2026-10-22T20:15:30.6543364Z ⚠ eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'. 2026-10-22T20:15:30.6543539Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1432:7] 2026-10-22T20:15:30.6543612Z 1431 │ 2026-10-22T20:15:30.6543752Z 1432 │ const layerCodexAppServerClientFactoryCommand = ( 2026-10-22T20:15:30.6543893Z ·  ───────────────────┬─────────────────── 2026-10-22T20:15:30.6544117Z · ╰── 'layerCodexAppServerClientFactoryCommand' is declared here 2026-10-22T20:15:30.6544259Z 1433 │ options: CodexClient.CodexAppServerClientOptions & { 2026-10-22T20:15:30.6544329Z ╰──── 2026-10-22T20:15:30.6544447Z  help: Consider removing this declaration. 2026-10-22T20:15:30.6544449Z 2026-10-22T20:15:30.6544725Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-22T20:15:30.6544906Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1668:7] 2026-10-22T20:15:30.6544979Z 1667 │ 2026-10-22T20:15:30.6545060Z 1668 │ const layer: Layer.Layer< 2026-10-22T20:15:30.6545137Z ·  ──┬── 2026-10-22T20:15:30.6545275Z · ╰── 'layer' is declared here 2026-10-22T20:15:30.6545380Z 1669 │ ProviderAdapter.ProviderAdapterV2, 2026-10-22T20:15:30.6545446Z ╰──── 2026-10-22T20:15:30.6545567Z  help: Consider removing this declaration. 2026-10-22T20:15:30.6545572Z 2026-10-22T20:15:30.6545743Z ⚠ eslint(no-new): Do not use 'new' for side effects. 2026-10-22T20:15:30.6545883Z ╭─[apps/server/src/mcp/McpToolAccess.test.ts:168:3] 2026-10-22T20:15:30.6546010Z 167 │ // @ts-expect-error a declaration constructed directly 2026-10-22T20:15:30.6546114Z 168 │ new McpToolAccess.Declaration(unchecked); 2026-10-22T20:15:30.6546225Z ·  ───────────────────────────── 2026-10-22T20:15:30.6546376Z 169 │ // @ts-expect-error a handlers layer built outside McpToolAccess 2026-10-22T20:15:30.6546446Z ╰──── 2026-10-22T20:15:30.6546618Z  help: Assign the result of 'new' to a variable or compare it to a reference. 2026-10-22T20:15:30.6546629Z 2026-10-22T20:15:30.6546903Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-22T20:15:30.6547135Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:121:27] 2026-10-22T20:15:30.6547317Z 120 │ const scope = makeScope(options.capabilities ?? new Set(["preview", "worktree"])); 2026-10-22T20:15:30.6547419Z 121 │ const dispatch = vi.fn((_: unknown) => 2026-10-22T20:15:30.6547508Z ·  ┬ 2026-10-22T20:15:30.6547658Z · ╰── '_' is declared here 2026-10-22T20:15:30.6547768Z 122 │ (options.dispatchGate ?? Effect.void).pipe( 2026-10-22T20:15:30.6547828Z ╰──── 2026-10-22T20:15:30.6547938Z  help: Consider removing this parameter. 2026-10-22T20:15:30.6547940Z 2026-10-22T20:15:30.6548140Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-22T20:15:30.6548292Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:134:39] 2026-10-22T20:15:30.6548360Z 133 │ ); 2026-10-22T20:15:30.6548473Z 134 │ const listLocalBranchNames = vi.fn((_: string) => 2026-10-22T20:15:30.6548587Z ·  ┬ 2026-10-22T20:15:30.6548755Z · ╰── '_' is declared here 2026-10-22T20:15:30.6548838Z 135 │ Effect.succeed( 2026-10-22T20:15:30.6548896Z ╰──── 2026-10-22T20:15:30.6549013Z  help: Consider removing this parameter. 2026-10-22T20:15:30.6549015Z 2026-10-22T20:15:30.6549214Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-22T20:15:30.6549363Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:178:31] 2026-10-22T20:15:30.6549423Z 177 │ }); 2026-10-22T20:15:30.6549539Z 178 │ const sendToThread = vi.fn((_: unknown) => { 2026-10-22T20:15:30.6549645Z ·  ┬ 2026-10-22T20:15:30.6549790Z · ╰── '_' is declared here 2026-10-22T20:15:30.6549894Z 179 │ switch (options.continuation ?? "queued") { 2026-10-22T20:15:30.6549952Z ╰──── 2026-10-22T20:15:30.6550060Z  help: Consider removing this parameter. 2026-10-22T20:15:30.6550063Z 2026-10-22T20:15:30.6550260Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-22T20:15:30.6550402Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:203:33] 2026-10-22T20:15:30.6550473Z 202 │ ); 2026-10-22T20:15:30.6550582Z 203 │ const removeWorktree = vi.fn((_: unknown) => 2026-10-22T20:15:30.6550687Z ·  ┬ 2026-10-22T20:15:30.6550833Z · ╰── '_' is declared here 2026-10-22T20:15:30.6550924Z 204 │ options.removeWorktreeFails 2026-10-22T20:15:30.6550984Z ╰──── 2026-10-22T20:15:30.6551092Z  help: Consider removing this parameter. 2026-10-22T20:15:30.6551095Z 2026-10-22T20:15:30.6551284Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-22T20:15:30.6551433Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:208:36] 2026-10-22T20:15:30.6551494Z 207 │ ); 2026-10-22T20:15:30.6551605Z 208 │ const deleteLocalBranch = vi.fn((_: unknown) => 2026-10-22T20:15:30.6551705Z ·  ┬ 2026-10-22T20:15:30.6551966Z · ╰── '_' is declared here 2026-10-22T20:15:30.6552115Z 209 │ options.deleteLocalBranchFails 2026-10-22T20:15:30.6552175Z ╰──── 2026-10-22T20:15:30.6552282Z  help: Consider removing this parameter. 2026-10-22T20:15:30.6552285Z 2026-10-22T20:15:30.6552485Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-22T20:15:30.6552631Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:213:42] 2026-10-22T20:15:30.6552692Z 212 │ ); 2026-10-22T20:15:30.6552810Z 213 │ const fetchWorktreeBaseCommit = vi.fn((_: unknown) => 2026-10-22T20:15:30.6552918Z ·  ┬ 2026-10-22T20:15:30.6553074Z · ╰── '_' is declared here 2026-10-22T20:15:30.6553169Z 214 │ options.fetchWorktreeBaseFails 2026-10-22T20:15:30.6553232Z ╰──── 2026-10-22T20:15:30.6553354Z  help: Consider removing this parameter. 2026-10-22T20:15:30.6553356Z 2026-10-22T20:15:30.6553548Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-22T20:15:30.6553695Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:254:30] 2026-10-22T20:15:30.6553755Z 253 │ ); 2026-10-22T20:15:30.6553857Z 254 │ const localStatus = vi.fn((_: unknown) => 2026-10-22T20:15:30.6553953Z ·  ┬ 2026-10-22T20:15:30.6554100Z · ╰── '_' is declared here 2026-10-22T20:15:30.6554170Z 255 │ Effect.succeed({ 2026-10-22T20:15:30.6554247Z ╰──── 2026-10-22T20:15:30.6554363Z  help: Consider removing this parameter. 2026-10-22T20:15:30.6554365Z 2026-10-22T20:15:30.6554567Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-22T20:15:30.6554721Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:264:32] 2026-10-22T20:15:30.6554782Z 263 │ ); 2026-10-22T20:15:30.6554947Z 264 │ const refreshStatus = vi.fn((_: string) => Effect.die("refreshStatus stub")); 2026-10-22T20:15:30.6555046Z ·  ┬ 2026-10-22T20:15:30.6555197Z · ╰── '_' is declared here 2026-10-22T20:15:30.6555355Z 265 │ const runForThread = vi.fn((input: { readonly worktreePath: string }) => { 2026-10-22T20:15:30.6555420Z ╰──── 2026-10-22T20:15:30.6555531Z  help: Consider removing this parameter. 2026-10-22T20:15:30.6555534Z 2026-10-22T20:15:30.6555773Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-22T20:15:30.6555920Z ╭─[apps/mobile/src/state/use-model-option-memory.ts:21:7] 2026-10-22T20:15:30.6555997Z 20 │ [instanceId]: { 2026-10-22T20:15:30.6556089Z 21 │ ...(state[instanceId] ?? {}), 2026-10-22T20:15:30.6556217Z ·  ──────────────────────────── 2026-10-22T20:15:30.6556293Z 22 │ [model]: options, 2026-10-22T20:15:30.6556355Z ╰──── 2026-10-22T20:15:30.6556644Z  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-22T20:15:30.6556646Z 2026-10-22T20:15:30.6557415Z ⚠ 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-22T20:15:30.6557623Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1228:7] 2026-10-22T20:15:30.6557733Z 1227 │ yield* harness.replaceSession; 2026-10-22T20:15:30.6557966Z 1228 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-22T20:15:30.6558140Z 1229 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) { 2026-10-22T20:15:30.6558247Z 1230 │ │ break; 2026-10-22T20:15:30.6558340Z 1231 │ │ } 2026-10-22T20:15:30.6558458Z 1232 │ │ yield* Effect.yieldNow; 2026-10-22T20:15:30.6558616Z 1233 │ ╰─▶ } 2026-10-22T20:15:30.6558713Z 1234 │ yield* Queue.offer( 2026-10-22T20:15:30.6558780Z ╰──── 2026-10-22T20:15:30.6558787Z 2026-10-22T20:15:30.6559275Z ⚠ 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-22T20:15:30.6559447Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1337:7] 2026-10-22T20:15:30.6559549Z 1336 │ yield* harness.replaceSession; 2026-10-22T20:15:30.6559769Z 1337 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-22T20:15:30.6559954Z 1338 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break; 2026-10-22T20:15:30.6560086Z 1339 │ │ yield* Effect.yieldNow; 2026-10-22T20:15:30.6560243Z 1340 │ ╰─▶ } 2026-10-22T20:15:30.6560383Z 1341 │ expect(yield* Ref.get(harness.subscriptionCount)).toBe(2); 2026-10-22T20:15:30.6560450Z ╰──── 2026-10-22T20:15:30.6560453Z 2026-10-22T20:15:30.6560663Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-22T20:15:30.6560845Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:100:85] 2026-10-22T20:15:30.6560958Z  99 │ const startEditor = startScheduledTaskEditor; 2026-10-22T20:15:30.6561152Z 100 │ const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]); 2026-10-22T20:15:30.6561314Z ·  ─────┬───── 2026-10-22T20:15:30.6561552Z · ╰── Unnecessary dependency `startEditor` 2026-10-22T20:15:30.6561647Z 101 │ const readEditor = useCallback( 2026-10-22T20:15:30.6561701Z ╰──── 2026-10-22T20:15:30.6562086Z  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-22T20:15:30.6562423Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.6562425Z 2026-10-22T20:15:30.6562624Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-22T20:15:30.6562797Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:121:7] 2026-10-22T20:15:30.6562934Z 120 │ setEditor, 2026-10-22T20:15:30.6563058Z 121 │ startEditor, 2026-10-22T20:15:30.6563149Z ·  ─────┬───── 2026-10-22T20:15:30.6563321Z · ╰── Unnecessary dependency `startEditor` 2026-10-22T20:15:30.6563391Z 122 │ hasChanges, 2026-10-22T20:15:30.6563451Z ╰──── 2026-10-22T20:15:30.6563790Z  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-22T20:15:30.6564130Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-22T20:15:30.6564133Z 2026-10-22T20:15:30.6564357Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-22T20:15:30.6564518Z ╭─[packages/client-runtime/src/state/usageAccess.ts:3:8] 2026-10-22T20:15:30.6564610Z 2 │ AuthDiagnosticsReadScope, 2026-10-22T20:15:30.6564697Z 3 │ type AuthSessionState, 2026-10-22T20:15:30.6564802Z ·  ────────┬─────── 2026-10-22T20:15:30.6564974Z · ╰── 'AuthSessionState' is imported here 2026-10-22T20:15:30.6565064Z 4 │ sessionGrantsScope, 2026-10-22T20:15:30.6565129Z ╰──── 2026-10-22T20:15:30.6565235Z  help: Consider removing this import. 2026-10-22T20:15:30.6565238Z 2026-10-22T20:15:30.6565425Z ⚠ eslint(no-control-regex): Unexpected control character 2026-10-22T20:15:30.6565659Z ╭─[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46] 2026-10-22T20:15:30.6565823Z 219 │ 2026-10-22T20:15:30.6565977Z 220 │ {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")} 2026-10-22T20:15:30.6566101Z ·  ──┬─ 2026-10-22T20:15:30.6566289Z · ╰── 'U+001B' is a control character. 2026-10-22T20:15:30.6566365Z 221 │ 2026-10-22T20:15:30.6566423Z ╰──── 2026-10-22T20:15:30.6566675Z  help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression. 2026-10-22T20:15:30.6566678Z 2026-10-22T20:15:30.6566898Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-22T20:15:30.6567119Z ╭─[packages/client-runtime/src/state/filesystem.ts:3:8] 2026-10-22T20:15:30.6567238Z 2 │ AuthFilesystemReadScope, 2026-10-22T20:15:30.6567315Z 3 │ type AuthSessionState, 2026-10-22T20:15:30.6567418Z ·  ────────┬─────── 2026-10-22T20:15:30.6567583Z · ╰── 'AuthSessionState' is imported here 2026-10-22T20:15:30.6567671Z 4 │ type FilesystemBrowseEntry, 2026-10-22T20:15:30.6567728Z ╰──── 2026-10-22T20:15:30.6567835Z  help: Consider removing this import. 2026-10-22T20:15:30.6567837Z 2026-10-22T20:15:30.6567931Z Found 0 errors and 358 warnings in 5396 files (8.6s, 8 threads) 2026-10-22T20:15:30.7273429Z Post job cleanup. 2026-10-22T20:15:30.8078796Z Cache hit occurred on the primary key electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309, not saving cache. 2026-10-22T20:15:30.8167283Z Post job cleanup. 2026-10-22T20:15:30.8184950Z ##[start-action display=Cache full pnpm store;id=__d5725629-fe2a-4865-8070-057ddb9a9ae5.__actions_cache] 2026-10-22T20:15:30.8567585Z Post job cleanup. 2026-10-22T20:15:30.9357725Z Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-26aca9b234a64276fce695cfd449de6b85aa0230cc5c8763604ee919eee10c91, not saving cache. 2026-10-22T20:15:30.9402152Z ##[end-action id=__d5725629-fe2a-4865-8070-057ddb9a9ae5.__actions_cache;outcome=success;conclusion=success;duration_ms=121] 2026-10-22T20:15:30.9404935Z ##[start-action display=Cache Vite+;id=__d5725629-fe2a-4865-8070-057ddb9a9ae5.vp_cache] 2026-10-22T20:15:30.9439343Z Post job cleanup. 2026-10-22T20:15:31.0292944Z Cache hit occurred on the primary key vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0, not saving cache. 2026-10-22T20:15:31.0345262Z ##[end-action id=__d5725629-fe2a-4865-8070-057ddb9a9ae5.vp_cache;outcome=success;conclusion=success;duration_ms=93] 2026-10-22T20:15:31.0404748Z Post job cleanup. 2026-10-22T20:15:31.1003368Z [command]/usr/local/bin/git version 2026-10-22T20:15:31.1045121Z git version 2.55.0 2026-10-22T20:15:31.1066113Z Temporarily overriding HOME='/home/runner/_work/_temp/584b665a-2376-4f5b-8b58-db42e5da219f' before making global git config changes 2026-10-22T20:15:31.1066750Z Adding repository directory to the temporary git global config as a safe directory 2026-10-22T20:15:31.1070070Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-22T20:15:31.1101950Z Removing SSH command configuration 2026-10-22T20:15:31.1105805Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-22T20:15:31.1134878Z [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-22T20:15:31.1321108Z fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules 2026-10-22T20:15:31.1359325Z ##[warning]The process '/usr/local/bin/git' failed with exit code 128 2026-10-22T20:15:31.1403856Z A job completed hook has been configured by the self-hosted runner administrator 2026-10-22T20:15:31.1435815Z ##[group]Run '/job_completed.sh' 2026-10-22T20:15:31.1449998Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-22T20:15:31.1450187Z env: 2026-10-22T20:15:31.1450314Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 1181 2026-10-22T20:15:31.1450476Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 572 2026-10-22T20:15:31.1450622Z BLACKSMITH_CHECK_RUN_ID: 120062729322 2026-10-22T20:15:31.1450768Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-22T20:15:31.1450912Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-22T20:15:31.1451051Z ##[endgroup] 2026-10-22T20:15:31.1564385Z Docker container cache not activated, skipping hash computation. 2026-10-22T20:15:31.1915918Z No active SSH sessions detected. Proceeding with shutdown immediately. 2026-10-22T20:15:31.1983942Z Cleaning up orphan processes