2026-10-24T21:34:09.6362248Z Current runner version: '2.338.1' 2026-10-24T21:34:09.6365690Z Runner name: 'blacksmith-8vcpu-ubuntu-2404-77vffe4ww762j7aw' 2026-10-24T21:34:09.6366385Z Runner group name: 'blacksmith scale sets - blacksmith-8vcpu-ubuntu-2404' 2026-10-24T21:34:09.6367100Z Machine name: 'ip-172-31-73-130' 2026-10-24T21:34:09.6368639Z ##[group]GITHUB_TOKEN Permissions 2026-10-24T21:34:09.6370196Z Contents: read 2026-10-24T21:34:09.6370640Z Metadata: read 2026-10-24T21:34:09.6371105Z ##[endgroup] 2026-10-24T21:34:09.6372481Z Secret source: Actions 2026-10-24T21:34:09.6373114Z Cache mode: write 2026-10-24T21:34:09.6373577Z Prepare workflow directory 2026-10-24T21:34:09.6547402Z Prepare all required actions 2026-10-24T21:34:09.6572379Z Getting action download info 2026-10-24T21:34:09.7574731Z Download action repository 'actions/checkout@v6' (SHA:d23441a48e516b6c34aea4fa41551a30e30af803) 2026-10-24T21:34:09.7879116Z Download action repository 'actions/cache@v6' (SHA:55cc8345863c7cc4c66a329aec7e433d2d1c52a9) 2026-10-24T21:34:09.8959680Z Setting BLACKSMITH_ACTIONS_RESULTS_URL to https://results-receiver.actions.githubusercontent.com/ 2026-10-24T21:34:09.8996719Z Complete job name: Lint 2026-10-24T21:34:09.9341662Z A job started hook has been configured by the self-hosted runner administrator 2026-10-24T21:34:09.9421153Z ##[group]Run '/setup.sh' 2026-10-24T21:34:09.9436731Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T21:34:09.9437139Z env: 2026-10-24T21:34:09.9437358Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 183 2026-10-24T21:34:09.9437651Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 366 2026-10-24T21:34:09.9437928Z BLACKSMITH_CHECK_RUN_ID: 120993907029 2026-10-24T21:34:09.9438207Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-24T21:34:09.9438477Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-24T21:34:09.9438736Z ##[endgroup] 2026-10-24T21:34:09.9652913Z Logging daemon started (blacksmithd for logs) 2026-10-24T21:34:09.9736962Z Results daemon started (blacksmithd for results) 2026-10-24T21:34:09.9859393Z Background adoption and SSH setup started (PID: 3172) 2026-10-24T21:34:09.9859844Z 2026-10-24T21:34:09.9859966Z ---------------------------------------- 2026-10-24T21:34:09.9860466Z View this job: https://app.blacksmith.sh/pingdotgg/runs/40134793376/jobs/120993907029 2026-10-24T21:34:09.9860894Z SSH Access (using your GitHub SSH key): 2026-10-24T21:34:09.9861336Z ssh -p 64000 runner@blacksmith-8vcpu-ubuntu-2404-77vffe4ww762j7aw.vm.blacksmith.sh 2026-10-24T21:34:09.9861662Z 2026-10-24T21:34:09.9861772Z No GitHub SSH key? Add one at: 2026-10-24T21:34:09.9862372Z https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account 2026-10-24T21:34:09.9863008Z 2026-10-24T21:34:09.9863163Z ---------------------------------------- 2026-10-24T21:34:09.9863428Z 2026-10-24T21:34:09.9863631Z VM ID: blacksmith-8vcpu-ubuntu-2404-77vffe4ww762j7aw 2026-10-24T21:34:09.9864136Z Host: production-152.236.39.148-x8664 2026-10-24T21:34:09.9864571Z Host Agent PID: 4098209 2026-10-24T21:34:09.9864994Z Host Agent Git SHA: 1637818df 2026-10-24T21:34:09.9865424Z Host CPU Manufacturer: AuthenticAMD 2026-10-24T21:34:09.9865888Z Blacksmith Host Generation: gen 2 2026-10-24T21:34:09.9866329Z Petname: production-live-kiwi-c07d7b5b 2026-10-24T21:34:09.9866777Z Region: us-east 2026-10-24T21:34:09.9867140Z Rootfs Version: ubuntu24-full-x64-081926 2026-10-24T21:34:09.9890185Z OS Version: Ubuntu 24.04.4 LTS 2026-10-24T21:34:09.9890614Z 2026-10-24T21:34:09.9890829Z Enabling Blacksmith transparent cache 2026-10-24T21:34:10.0101225Z ##[group]Run actions/checkout@v6 2026-10-24T21:34:10.0101525Z with: 2026-10-24T21:34:10.0101847Z sparse-checkout: /* !/.repos/ !/apps/mobile/modules/t3-terminal/Vendor/**/*.a 2026-10-24T21:34:10.0102239Z sparse-checkout-cone-mode: false 2026-10-24T21:34:10.0102513Z repository: pingdotgg/t3code 2026-10-24T21:34:10.0104332Z token: *** 2026-10-24T21:34:10.0104539Z ssh-strict: true 2026-10-24T21:34:10.0104752Z ssh-user: git 2026-10-24T21:34:10.0104973Z persist-credentials: true 2026-10-24T21:34:10.0105366Z clean: true 2026-10-24T21:34:10.0105575Z fetch-depth: 1 2026-10-24T21:34:10.0105784Z fetch-tags: false 2026-10-24T21:34:10.0106005Z show-progress: true 2026-10-24T21:34:10.0106223Z lfs: false 2026-10-24T21:34:10.0106428Z submodules: false 2026-10-24T21:34:10.0106649Z set-safe-directory: true 2026-10-24T21:34:10.0106899Z allow-unsafe-pr-checkout: false 2026-10-24T21:34:10.0107152Z env: 2026-10-24T21:34:10.0108242Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 183 2026-10-24T21:34:10.0108523Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 366 2026-10-24T21:34:10.0108801Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T21:34:10.0109060Z ##[endgroup] 2026-10-24T21:34:10.1081575Z Syncing repository: pingdotgg/t3code 2026-10-24T21:34:10.1082660Z ##[group]Getting Git version info 2026-10-24T21:34:10.1083006Z Working directory is '/home/runner/_work/t3code/t3code' 2026-10-24T21:34:10.1083484Z [command]/usr/local/bin/git version 2026-10-24T21:34:10.1117138Z git version 2.55.0 2026-10-24T21:34:10.1129565Z ##[endgroup] 2026-10-24T21:34:10.1136948Z Temporarily overriding HOME='/home/runner/_work/_temp/2c68a09c-a0c8-432e-8e20-b3ccadeaea3a' before making global git config changes 2026-10-24T21:34:10.1137640Z Adding repository directory to the temporary git global config as a safe directory 2026-10-24T21:34:10.1140362Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-24T21:34:10.1172954Z Deleting the contents of '/home/runner/_work/t3code/t3code' 2026-10-24T21:34:10.1174763Z ##[group]Determining repository object format 2026-10-24T21:34:10.1175843Z ##[endgroup] 2026-10-24T21:34:10.1176206Z ##[group]Initializing the repository 2026-10-24T21:34:10.1178217Z [command]/usr/local/bin/git init /home/runner/_work/t3code/t3code 2026-10-24T21:34:10.1213843Z hint: Using 'master' as the name for the initial branch. This default branch name 2026-10-24T21:34:10.1214317Z hint: will change to "main" in Git 3.0. To configure the initial branch name 2026-10-24T21:34:10.1214772Z hint: to use in all of your new repositories, which will suppress this warning, 2026-10-24T21:34:10.1215130Z hint: call: 2026-10-24T21:34:10.1215332Z hint: 2026-10-24T21:34:10.1215583Z hint: git config --global init.defaultBranch 2026-10-24T21:34:10.1215883Z hint: 2026-10-24T21:34:10.1216164Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and 2026-10-24T21:34:10.1216611Z hint: 'development'. The just-created branch can be renamed via this command: 2026-10-24T21:34:10.1216970Z hint: 2026-10-24T21:34:10.1217182Z hint: git branch -m 2026-10-24T21:34:10.1217412Z hint: 2026-10-24T21:34:10.1217724Z hint: Disable this message with "git config set advice.defaultBranchName false" 2026-10-24T21:34:10.1218183Z Initialized empty Git repository in /home/runner/_work/t3code/t3code/.git/ 2026-10-24T21:34:10.1219182Z [command]/usr/local/bin/git remote add origin https://github.com/pingdotgg/t3code 2026-10-24T21:34:10.1245601Z ##[endgroup] 2026-10-24T21:34:10.1245982Z ##[group]Disabling automatic garbage collection 2026-10-24T21:34:10.1247673Z [command]/usr/local/bin/git config --local gc.auto 0 2026-10-24T21:34:10.1267190Z ##[endgroup] 2026-10-24T21:34:10.1267788Z ##[group]Setting up auth 2026-10-24T21:34:10.1268063Z Removing SSH command configuration 2026-10-24T21:34:10.1271390Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-24T21:34:10.1291631Z [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-24T21:34:10.1412688Z Removing HTTP extra header 2026-10-24T21:34:10.1415281Z [command]/usr/local/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader 2026-10-24T21:34:10.1435836Z [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-24T21:34:10.1528583Z Removing includeIf entries pointing to credentials config files 2026-10-24T21:34:10.1531756Z [command]/usr/local/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: 2026-10-24T21:34:10.1552158Z [command]/usr/local/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url 2026-10-24T21:34:10.1651352Z [command]/usr/local/bin/git config --file /home/runner/_work/_temp/git-credentials-3b9ddf92-a316-499f-ac50-17006f4fc52e.config http.https://github.com/.extraheader AUTHORIZATION: basic *** 2026-10-24T21:34:10.1696263Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git.path /home/runner/_work/_temp/git-credentials-3b9ddf92-a316-499f-ac50-17006f4fc52e.config 2026-10-24T21:34:10.1717726Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git/worktrees/*.path /home/runner/_work/_temp/git-credentials-3b9ddf92-a316-499f-ac50-17006f4fc52e.config 2026-10-24T21:34:10.1735022Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-3b9ddf92-a316-499f-ac50-17006f4fc52e.config 2026-10-24T21:34:10.1752274Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-3b9ddf92-a316-499f-ac50-17006f4fc52e.config 2026-10-24T21:34:10.1767604Z ##[endgroup] 2026-10-24T21:34:10.1767959Z ##[group]Fetching the repository 2026-10-24T21:34:10.1771904Z [command]/usr/local/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --filter=blob:none --depth=1 origin +eea989536849e5b5049987ee24318b5a77326542:refs/remotes/origin/main 2026-10-24T21:34:10.4769256Z From https://github.com/pingdotgg/t3code 2026-10-24T21:34:10.4770237Z * [new ref] eea989536849e5b5049987ee24318b5a77326542 -> origin/main 2026-10-24T21:34:10.4792174Z [command]/usr/local/bin/git branch --list --remote origin/main 2026-10-24T21:34:10.4811060Z origin/main 2026-10-24T21:34:10.4815211Z [command]/usr/local/bin/git rev-parse refs/remotes/origin/main 2026-10-24T21:34:10.4831113Z eea989536849e5b5049987ee24318b5a77326542 2026-10-24T21:34:10.4833168Z ##[endgroup] 2026-10-24T21:34:10.4833898Z ##[group]Determining the checkout info 2026-10-24T21:34:10.4834750Z ##[endgroup] 2026-10-24T21:34:10.4835524Z ##[group]Setting up sparse checkout 2026-10-24T21:34:10.4836250Z [command]/usr/local/bin/git config core.sparseCheckout true 2026-10-24T21:34:10.4854658Z [command]/usr/local/bin/git rev-parse --git-path info/sparse-checkout 2026-10-24T21:34:10.4869548Z .git/info/sparse-checkout 2026-10-24T21:34:10.4873374Z ##[endgroup] 2026-10-24T21:34:10.4874353Z ##[group]Checking out the ref 2026-10-24T21:34:10.4875339Z [command]/usr/local/bin/git checkout --progress --force -B main refs/remotes/origin/main 2026-10-24T21:34:17.8584478Z Updating files: 0% (1/6402) 2026-10-24T21:34:17.8611788Z Updating files: 1% (65/6402) 2026-10-24T21:34:17.8628992Z Updating files: 2% (129/6402) 2026-10-24T21:34:17.8649252Z Updating files: 3% (193/6402) 2026-10-24T21:34:17.8669532Z Updating files: 4% (257/6402) 2026-10-24T21:34:17.8698755Z Updating files: 5% (321/6402) 2026-10-24T21:34:17.8720589Z Updating files: 6% (385/6402) 2026-10-24T21:34:17.8773138Z Updating files: 7% (449/6402) 2026-10-24T21:34:17.8803176Z Updating files: 8% (513/6402) 2026-10-24T21:34:17.8824378Z Updating files: 9% (577/6402) 2026-10-24T21:34:17.9100818Z Updating files: 10% (641/6402) 2026-10-24T21:34:17.9116997Z Updating files: 11% (705/6402) 2026-10-24T21:34:17.9127496Z Updating files: 12% (769/6402) 2026-10-24T21:34:17.9142655Z Updating files: 13% (833/6402) 2026-10-24T21:34:17.9160009Z Updating files: 14% (897/6402) 2026-10-24T21:34:17.9177266Z Updating files: 15% (961/6402) 2026-10-24T21:34:17.9195887Z Updating files: 16% (1025/6402) 2026-10-24T21:34:17.9210161Z Updating files: 17% (1089/6402) 2026-10-24T21:34:17.9228141Z Updating files: 18% (1153/6402) 2026-10-24T21:34:17.9242742Z Updating files: 19% (1217/6402) 2026-10-24T21:34:17.9266724Z Updating files: 20% (1281/6402) 2026-10-24T21:34:17.9282966Z Updating files: 21% (1345/6402) 2026-10-24T21:34:17.9301353Z Updating files: 22% (1409/6402) 2026-10-24T21:34:17.9315037Z Updating files: 23% (1473/6402) 2026-10-24T21:34:17.9328153Z Updating files: 24% (1537/6402) 2026-10-24T21:34:17.9343390Z Updating files: 25% (1601/6402) 2026-10-24T21:34:17.9357308Z Updating files: 26% (1665/6402) 2026-10-24T21:34:17.9370217Z Updating files: 27% (1729/6402) 2026-10-24T21:34:17.9390116Z Updating files: 28% (1793/6402) 2026-10-24T21:34:17.9422714Z Updating files: 29% (1857/6402) 2026-10-24T21:34:17.9442807Z Updating files: 30% (1921/6402) 2026-10-24T21:34:17.9465924Z Updating files: 31% (1985/6402) 2026-10-24T21:34:17.9495590Z Updating files: 32% (2049/6402) 2026-10-24T21:34:17.9523433Z Updating files: 33% (2113/6402) 2026-10-24T21:34:17.9591430Z Updating files: 34% (2177/6402) 2026-10-24T21:34:17.9648373Z Updating files: 35% (2241/6402) 2026-10-24T21:34:17.9683687Z Updating files: 36% (2305/6402) 2026-10-24T21:34:17.9714568Z Updating files: 37% (2369/6402) 2026-10-24T21:34:17.9759361Z Updating files: 38% (2433/6402) 2026-10-24T21:34:17.9786146Z Updating files: 39% (2497/6402) 2026-10-24T21:34:17.9815231Z Updating files: 40% (2561/6402) 2026-10-24T21:34:17.9841044Z Updating files: 41% (2625/6402) 2026-10-24T21:34:17.9856305Z Updating files: 42% (2689/6402) 2026-10-24T21:34:17.9866058Z Updating files: 43% (2753/6402) 2026-10-24T21:34:17.9895071Z Updating files: 44% (2817/6402) 2026-10-24T21:34:17.9922221Z Updating files: 45% (2881/6402) 2026-10-24T21:34:17.9948942Z Updating files: 46% (2945/6402) 2026-10-24T21:34:17.9973990Z Updating files: 47% (3009/6402) 2026-10-24T21:34:18.0001128Z Updating files: 48% (3073/6402) 2026-10-24T21:34:18.0039443Z Updating files: 49% (3137/6402) 2026-10-24T21:34:18.0066852Z Updating files: 50% (3201/6402) 2026-10-24T21:34:18.0081956Z Updating files: 51% (3266/6402) 2026-10-24T21:34:18.0119757Z Updating files: 52% (3330/6402) 2026-10-24T21:34:18.0147611Z Updating files: 53% (3394/6402) 2026-10-24T21:34:18.0166793Z Updating files: 54% (3458/6402) 2026-10-24T21:34:18.0189313Z Updating files: 55% (3522/6402) 2026-10-24T21:34:18.0204531Z Updating files: 56% (3586/6402) 2026-10-24T21:34:18.0224322Z Updating files: 57% (3650/6402) 2026-10-24T21:34:18.0242221Z Updating files: 58% (3714/6402) 2026-10-24T21:34:18.0600558Z Updating files: 59% (3778/6402) 2026-10-24T21:34:18.0615278Z Updating files: 60% (3842/6402) 2026-10-24T21:34:18.0635098Z Updating files: 61% (3906/6402) 2026-10-24T21:34:18.0654245Z Updating files: 62% (3970/6402) 2026-10-24T21:34:18.0675730Z Updating files: 63% (4034/6402) 2026-10-24T21:34:18.0703236Z Updating files: 64% (4098/6402) 2026-10-24T21:34:18.0722449Z Updating files: 65% (4162/6402) 2026-10-24T21:34:18.0739121Z Updating files: 66% (4226/6402) 2026-10-24T21:34:18.0761881Z Updating files: 67% (4290/6402) 2026-10-24T21:34:18.0775826Z Updating files: 68% (4354/6402) 2026-10-24T21:34:18.0793470Z Updating files: 69% (4418/6402) 2026-10-24T21:34:18.0806082Z Updating files: 70% (4482/6402) 2026-10-24T21:34:18.0823922Z Updating files: 71% (4546/6402) 2026-10-24T21:34:18.0836302Z Updating files: 72% (4610/6402) 2026-10-24T21:34:18.0881582Z Updating files: 73% (4674/6402) 2026-10-24T21:34:18.1277337Z Updating files: 74% (4738/6402) 2026-10-24T21:34:18.1299724Z Updating files: 75% (4802/6402) 2026-10-24T21:34:18.1321310Z Updating files: 76% (4866/6402) 2026-10-24T21:34:18.1345713Z Updating files: 77% (4930/6402) 2026-10-24T21:34:18.1366741Z Updating files: 78% (4994/6402) 2026-10-24T21:34:18.1382303Z Updating files: 79% (5058/6402) 2026-10-24T21:34:18.1403972Z Updating files: 80% (5122/6402) 2026-10-24T21:34:18.1419352Z Updating files: 81% (5186/6402) 2026-10-24T21:34:18.1436816Z Updating files: 82% (5250/6402) 2026-10-24T21:34:18.1458789Z Updating files: 83% (5314/6402) 2026-10-24T21:34:18.1482446Z Updating files: 84% (5378/6402) 2026-10-24T21:34:18.1499174Z Updating files: 85% (5442/6402) 2026-10-24T21:34:18.1524583Z Updating files: 86% (5506/6402) 2026-10-24T21:34:18.1593553Z Updating files: 87% (5570/6402) 2026-10-24T21:34:18.1622127Z Updating files: 88% (5634/6402) 2026-10-24T21:34:18.1641317Z Updating files: 89% (5698/6402) 2026-10-24T21:34:18.1669654Z Updating files: 90% (5762/6402) 2026-10-24T21:34:18.1697377Z Updating files: 91% (5826/6402) 2026-10-24T21:34:18.1711968Z Updating files: 92% (5890/6402) 2026-10-24T21:34:18.1733100Z Updating files: 93% (5954/6402) 2026-10-24T21:34:18.1753193Z Updating files: 94% (6018/6402) 2026-10-24T21:34:18.1776110Z Updating files: 95% (6082/6402) 2026-10-24T21:34:18.1830833Z Updating files: 96% (6146/6402) 2026-10-24T21:34:18.1853592Z Updating files: 97% (6210/6402) 2026-10-24T21:34:18.1897954Z Updating files: 98% (6274/6402) 2026-10-24T21:34:18.1917208Z Updating files: 99% (6338/6402) 2026-10-24T21:34:18.1917450Z Updating files: 100% (6402/6402) 2026-10-24T21:34:18.1917595Z Updating files: 100% (6402/6402), done. 2026-10-24T21:34:18.2066990Z Switched to a new branch 'main' 2026-10-24T21:34:18.2068639Z branch 'main' set up to track 'origin/main'. 2026-10-24T21:34:18.2080812Z ##[endgroup] 2026-10-24T21:34:18.2111622Z [command]/usr/local/bin/git log -1 --format=%H 2026-10-24T21:34:18.2128810Z eea989536849e5b5049987ee24318b5a77326542 2026-10-24T21:34:18.2197727Z ##[group]Run files="$(git ls-files .github/pr-assets)" 2026-10-24T21:34:18.2197968Z files="$(git ls-files .github/pr-assets)" 2026-10-24T21:34:18.2198152Z if test -n "$files"; then 2026-10-24T21:34:18.2198377Z  printf 'PR evidence must be uploaded to GitHub, not committed:\n%s\n' "$files" >&2 2026-10-24T21:34:18.2198583Z  exit 1 2026-10-24T21:34:18.2198691Z fi 2026-10-24T21:34:18.2216663Z shell: /usr/bin/bash -e {0} 2026-10-24T21:34:18.2216795Z env: 2026-10-24T21:34:18.2216911Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 183 2026-10-24T21:34:18.2217070Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 366 2026-10-24T21:34:18.2217210Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T21:34:18.2217345Z ##[endgroup] 2026-10-24T21:34:18.2361213Z Prepare all required actions 2026-10-24T21:34:18.2361668Z Getting action download info 2026-10-24T21:34:18.3079347Z Download action repository 'voidzero-dev/setup-vp@v1' (SHA:250f29ce396baf5e8f24498e17c0dfdebabc26eb) 2026-10-24T21:34:18.4238374Z ##[group]Run ./.github/actions/setup-ci-deps 2026-10-24T21:34:18.4238528Z env: 2026-10-24T21:34:18.4238646Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 183 2026-10-24T21:34:18.4238796Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 366 2026-10-24T21:34:18.4238938Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T21:34:18.4239073Z ##[endgroup] 2026-10-24T21:34:18.4317797Z ##[start-action display=Resolve Vite+ version;id=__self.vp] 2026-10-24T21:34:18.4330115Z ##[group]Run echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-24T21:34:18.4330471Z echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-24T21:34:18.4330764Z echo "node=$(jq -r '.engines.node' package.json)" >> "$GITHUB_OUTPUT" 2026-10-24T21:34:18.4331002Z echo "pnpm=$(jq -r '.packageManager' package.json)" >> "$GITHUB_OUTPUT" 2026-10-24T21:34:18.4348552Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T21:34:18.4348724Z env: 2026-10-24T21:34:18.4348842Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 183 2026-10-24T21:34:18.4348987Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 366 2026-10-24T21:34:18.4349129Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T21:34:18.4349265Z ##[endgroup] 2026-10-24T21:34:18.4422580Z ##[end-action id=__self.vp;outcome=success;conclusion=success;duration_ms=10] 2026-10-24T21:34:18.4423875Z ##[start-action display=Cache Vite+;id=__self.vp_cache] 2026-10-24T21:34:18.4462781Z ##[group]Run actions/cache@v6 2026-10-24T21:34:18.4462918Z with: 2026-10-24T21:34:18.4463153Z path: ~/.vite-plus 2026-10-24T21:34:18.4463316Z key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T21:34:18.4463515Z enableCrossOsArchive: false 2026-10-24T21:34:18.4463650Z fail-on-cache-miss: false 2026-10-24T21:34:18.4463775Z lookup-only: false 2026-10-24T21:34:18.4463884Z save-always: false 2026-10-24T21:34:18.4463993Z env: 2026-10-24T21:34:18.4464152Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 183 2026-10-24T21:34:18.4464296Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 366 2026-10-24T21:34:18.4464440Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T21:34:18.4464573Z ##[endgroup] 2026-10-24T21:34:18.9441435Z Cache hit for: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T21:34:19.3205819Z Received 170349591 of 170349591 (100.0%), 458.9 MBs/sec 2026-10-24T21:34:19.3206562Z Cache Size: ~162 MB (170349591 B) 2026-10-24T21:34:19.3240785Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/d9231542-f4b6-41de-8f5e-35afb4eb3ea1/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T21:34:19.9282833Z Cache restored successfully 2026-10-24T21:34:19.9420406Z Cache restored from key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T21:34:19.9476844Z ##[end-action id=__self.vp_cache;outcome=success;conclusion=success;duration_ms=1505] 2026-10-24T21:34:19.9479017Z ##[start-action display=Use cached Vite+;id=__self.__run] 2026-10-24T21:34:19.9496604Z ##[group]Run echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-24T21:34:19.9496823Z echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-24T21:34:19.9496998Z "$HOME/.vite-plus/bin/vp" env use "26.12.1" 2026-10-24T21:34:19.9516355Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T21:34:19.9516524Z env: 2026-10-24T21:34:19.9516643Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 183 2026-10-24T21:34:19.9516789Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 366 2026-10-24T21:34:19.9516935Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T21:34:19.9517083Z ##[endgroup] 2026-10-24T21:34:19.9557391Z Using Node.js v26.12.1 (resolved from 26.12.1) 2026-10-24T21:34:19.9565066Z ##[end-action id=__self.__run;outcome=success;conclusion=success;duration_ms=8] 2026-10-24T21:34:19.9566708Z ##[start-action display=Setup Vite+;id=__self.__voidzero-dev_setup-vp] 2026-10-24T21:34:19.9570390Z ##[end-action id=__self.__voidzero-dev_setup-vp;outcome=skipped;conclusion=skipped;duration_ms=0] 2026-10-24T21:34:19.9571680Z ##[start-action display=Resolve pnpm store path;id=__self.pnpm_store] 2026-10-24T21:34:19.9580993Z ##[group]Run store_path="$(vp pm cache dir)" 2026-10-24T21:34:19.9581165Z store_path="$(vp pm cache dir)" 2026-10-24T21:34:19.9581329Z echo "path=$store_path" >> "$GITHUB_OUTPUT" 2026-10-24T21:34:19.9597582Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T21:34:19.9597761Z env: 2026-10-24T21:34:19.9597874Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 183 2026-10-24T21:34:19.9598023Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 366 2026-10-24T21:34:19.9598174Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T21:34:19.9598305Z ##[endgroup] 2026-10-24T21:34:19.9730226Z ##[end-action id=__self.pnpm_store;outcome=success;conclusion=success;duration_ms=15] 2026-10-24T21:34:19.9732095Z ##[start-action display=Cache full pnpm store;id=__self.__actions_cache] 2026-10-24T21:34:20.0053240Z ##[group]Run actions/cache@v6 2026-10-24T21:34:20.0053443Z with: 2026-10-24T21:34:20.0053573Z path: /home/runner/.local/share/pnpm/store/v11 2026-10-24T21:34:20.0053826Z key: pnpm-full-v1-Linux-X64-bab31c3827e90e1352d302da4c761fd1b91963ae565f5f0ea70972d0942af1f6 2026-10-24T21:34:20.0054120Z restore-keys: pnpm-full-v1-Linux-X64- 2026-10-24T21:34:20.0054266Z enableCrossOsArchive: false 2026-10-24T21:34:20.0054399Z fail-on-cache-miss: false 2026-10-24T21:34:20.0054519Z lookup-only: false 2026-10-24T21:34:20.0054628Z save-always: false 2026-10-24T21:34:20.0054739Z env: 2026-10-24T21:34:20.0054921Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 183 2026-10-24T21:34:20.0055325Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 366 2026-10-24T21:34:20.0055563Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T21:34:20.0055729Z ##[endgroup] 2026-10-24T21:34:20.1928205Z Cache hit for: pnpm-full-v1-Linux-X64-bab31c3827e90e1352d302da4c761fd1b91963ae565f5f0ea70972d0942af1f6 2026-10-24T21:34:21.2215802Z Received 637534208 of 995395870 (64.0%), 607.4 MBs/sec 2026-10-24T21:34:21.7828274Z Received 995395870 of 995395870 (100.0%), 607.7 MBs/sec 2026-10-24T21:34:21.7829218Z Cache Size: ~949 MB (995395870 B) 2026-10-24T21:34:21.7869847Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/8e90210f-c65f-45c0-afc5-4bbfb0e4d71f/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T21:34:26.8358879Z Cache restored successfully 2026-10-24T21:34:26.8820026Z Cache restored from key: pnpm-full-v1-Linux-X64-bab31c3827e90e1352d302da4c761fd1b91963ae565f5f0ea70972d0942af1f6 2026-10-24T21:34:26.8879903Z ##[end-action id=__self.__actions_cache;outcome=success;conclusion=success;duration_ms=6914] 2026-10-24T21:34:26.8882210Z ##[start-action display=Install dependencies;id=__self.__run_2] 2026-10-24T21:34:26.8891794Z ##[group]Run vp install 2026-10-24T21:34:26.8891938Z vp install 2026-10-24T21:34:26.8910080Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T21:34:26.8910247Z env: 2026-10-24T21:34:26.8910365Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 183 2026-10-24T21:34:26.8910513Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 366 2026-10-24T21:34:26.8910660Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T21:34:26.8910794Z ##[endgroup] 2026-10-24T21:34:26.9217576Z Scope: all 34 workspace projects 2026-10-24T21:34:27.0243499Z ? Verifying lockfile against supply-chain policies (2088 entries)... 2026-10-24T21:34:27.2521220Z Packages are hard linked from the content-addressable store to the virtual store. 2026-10-24T21:34:27.2521629Z Content-addressable store is at: /home/runner/.local/share/pnpm/store/v11 2026-10-24T21:34:27.2521986Z Virtual store is at: node_modules/.pnpm 2026-10-24T21:34:29.2896214Z ✓ Lockfile passes supply-chain policies (2088 entries in 2.3s) 2026-10-24T21:34:29.2896588Z Lockfile is up to date, resolution step is skipped 2026-10-24T21:34:29.3055133Z Packages: +1721 2026-10-24T21:34:29.3055388Z ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2026-10-24T21:34:29.3341626Z Progress: resolved 1721, reused 1718, downloaded 0, added 1721, done 2026-10-24T21:34:30.1951355Z . prepare$ vp config --no-agent 2026-10-24T21:34:30.2838568Z . prepare: Done 2026-10-24T21:34:30.2856205Z 2026-10-24T21:34:30.2856479Z devDependencies: 2026-10-24T21:34:30.2856707Z + @coderabbitai/config 1.1.0 2026-10-24T21:34:30.2856956Z + @shadcn/lint 0.1.5 2026-10-24T21:34:30.2857223Z + @types/node 24.12.4 2026-10-24T21:34:30.2857463Z + knip 6.34.0 2026-10-24T21:34:30.2857675Z + typescript <- @tsc-rs/typescript 0.8.0 2026-10-24T21:34:30.2857910Z + vite-plus 1.3.0 2026-10-24T21:34:30.2858018Z 2026-10-24T21:34:30.2879143Z Done in 3.4s using pnpm v12.14.0 2026-10-24T21:34:30.3072289Z ##[end-action id=__self.__run_2;outcome=success;conclusion=success;duration_ms=3418] 2026-10-24T21:34:30.3802946Z ##[group]Run actions/cache@v6 2026-10-24T21:34:30.3803170Z with: 2026-10-24T21:34:30.3803296Z path: ~/.cache/electron 2026-10-24T21:34:30.3803539Z key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T21:34:30.3803795Z enableCrossOsArchive: false 2026-10-24T21:34:30.3803950Z fail-on-cache-miss: false 2026-10-24T21:34:30.3804077Z lookup-only: false 2026-10-24T21:34:30.3804191Z save-always: false 2026-10-24T21:34:30.3804302Z env: 2026-10-24T21:34:30.3804424Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 183 2026-10-24T21:34:30.3804569Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 366 2026-10-24T21:34:30.3804731Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T21:34:30.3804868Z ##[endgroup] 2026-10-24T21:34:30.5708149Z Cache hit for: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T21:34:30.7374262Z Received 122906203 of 122906203 (100.0%), 781.4 MBs/sec 2026-10-24T21:34:30.7374594Z Cache Size: ~117 MB (122906203 B) 2026-10-24T21:34:30.7416642Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/73df75af-502f-4bf4-bbc0-9f2ec4aa6d2d/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T21:34:30.7951337Z Cache restored successfully 2026-10-24T21:34:30.8062044Z Cache restored from key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T21:34:30.8150310Z ##[group]Run vp run --filter @t3tools/desktop ensure:electron 2026-10-24T21:34:30.8150579Z vp run --filter @t3tools/desktop ensure:electron 2026-10-24T21:34:30.8168663Z shell: /usr/bin/bash -e {0} 2026-10-24T21:34:30.8168790Z env: 2026-10-24T21:34:30.8169051Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 183 2026-10-24T21:34:30.8169200Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 366 2026-10-24T21:34:30.8169340Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T21:34:30.8169476Z ##[endgroup] 2026-10-24T21:34:30.9637691Z ~/apps/desktop$ node scripts/ensure-electron-runtime.mjs ⊘ cache disabled 2026-10-24T21:34:31.5194019Z /home/runner/_work/t3code/t3code/node_modules/.pnpm/electron@44.9.3_supports-color@8.1.1/node_modules/electron/dist/electron 2026-10-24T21:34:31.5208454Z 2026-10-24T21:34:31.5281397Z ##[group]Run vp run knip:check 2026-10-24T21:34:31.5281570Z vp run knip:check 2026-10-24T21:34:31.5299765Z shell: /usr/bin/bash -e {0} 2026-10-24T21:34:31.5299892Z env: 2026-10-24T21:34:31.5300008Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 183 2026-10-24T21:34:31.5300159Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 366 2026-10-24T21:34:31.5300303Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T21:34:31.5300442Z ##[endgroup] 2026-10-24T21:34:31.6702985Z $ knip --include files,dependencies --no-config-hints ⊘ cache disabled 2026-10-24T21:34:35.2439745Z 2026-10-24T21:34:35.2442980Z $ knip --workspace apps/server --workspace apps/desktop --workspace apps/web --workspace packages/client-runtime --workspace packages/contracts --workspace packages/effect-acp --workspace packages/effect-codex-app-server --workspace packages/shared --workspace packages/ssh --workspace packages/tailscale --workspace packages/provider-core --workspace packages/provider-acp --workspace packages/provider-acp-registry --workspace packages/provider-testing --workspace packages/provider-pi --workspace packages/provider-muse --workspace packages/provider-opencode --workspace packages/provider-cursor --workspace packages/provider-grok --workspace packages/source-control-core --workspace packages/source-control-definitions --workspace packages/source-control-azure-devops --workspace packages/source-control-bitbucket --workspace packages/source-control-forgejo --workspace packages/source-control-gitcafe --workspace packages/source-control-github --workspace packages/source-control-gitlab --workspace packages/source-control-testing --exports --preprocessor ./scripts/knip-schemas.ts --no-config-hints ⊘ cache disabled 2026-10-24T21:34:43.1694953Z 2026-10-24T21:34:43.1696049Z --- 2026-10-24T21:34:43.1696338Z vp run: 2/2 successful. (Run `vp run --last-details` for full details) 2026-10-24T21:34:43.1765921Z ##[group]Run vp run --filter @t3tools/source-control-github generate --check 2026-10-24T21:34:43.1766350Z vp run --filter @t3tools/source-control-github generate --check 2026-10-24T21:34:43.1788715Z shell: /usr/bin/bash -e {0} 2026-10-24T21:34:43.1788915Z env: 2026-10-24T21:34:43.1789095Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 183 2026-10-24T21:34:43.1789332Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 366 2026-10-24T21:34:43.1789558Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T21:34:43.1789773Z ##[endgroup] 2026-10-24T21:34:43.3288352Z ~/packages/source-control-github$ graphqlgen --check ⊘ cache disabled 2026-10-24T21:34:43.5116757Z 2026-10-24T21:34:43.5193284Z ##[group]Run vp run --filter t3 generate --check 2026-10-24T21:34:43.5193497Z vp run --filter t3 generate --check 2026-10-24T21:34:43.5211432Z shell: /usr/bin/bash -e {0} 2026-10-24T21:34:43.5211563Z env: 2026-10-24T21:34:43.5211687Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 183 2026-10-24T21:34:43.5212074Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 366 2026-10-24T21:34:43.5212240Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T21:34:43.5212385Z ##[endgroup] 2026-10-24T21:34:43.6629496Z ~/apps/server$ graphqlgen --check ⊘ cache disabled 2026-10-24T21:34:43.8084046Z 2026-10-24T21:34:43.8150249Z ##[group]Run vp check 2026-10-24T21:34:43.8150451Z vp check 2026-10-24T21:34:43.8169119Z shell: /usr/bin/bash -e {0} 2026-10-24T21:34:43.8169255Z env: 2026-10-24T21:34:43.8169375Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 183 2026-10-24T21:34:43.8169529Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 366 2026-10-24T21:34:43.8169678Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T21:34:43.8169820Z ##[endgroup] 2026-10-24T21:34:44.3302711Z pass: All 5751 files are correctly formatted (380ms, 8 threads) 2026-10-24T21:34:49.2730237Z warn: Lint warnings found 2026-10-24T21:34:49.2731403Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-24T21:34:49.2731837Z ╭─[apps/server/src/usage/UsageService.ts:169:7] 2026-10-24T21:34:49.2732028Z 168 │ 2026-10-24T21:34:49.2732179Z 169 │ const layerTest = Layer.succeed( 2026-10-24T21:34:49.2732383Z ·  ────┬──── 2026-10-24T21:34:49.2732625Z · ╰── 'layerTest' is declared here 2026-10-24T21:34:49.2732840Z 170 │ UsageService, 2026-10-24T21:34:49.2732985Z ╰──── 2026-10-24T21:34:49.2733157Z  help: Consider removing this declaration. 2026-10-24T21:34:49.2733284Z 2026-10-24T21:34:49.2733763Z ⚠ 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-24T21:34:49.2734355Z ╭─[apps/server/src/usage/UsageService.test.ts:2615:7] 2026-10-24T21:34:49.2734610Z 2614 │ let orphanedAt: number | undefined; 2026-10-24T21:34:49.2734959Z 2615 │ ╭─▶ for (let interruptAt = 1; interruptAt <= 31; interruptAt += 1) { 2026-10-24T21:34:49.2735301Z 2616 │ │ const tasks: Array<() => void> = []; 2026-10-24T21:34:49.2735594Z 2617 │ │ const dispatcher: Scheduler.SchedulerDispatcher = { 2026-10-24T21:34:49.2735889Z 2618 │ │ scheduleTask: (task) => tasks.push(task), 2026-10-24T21:34:49.2736130Z 2619 │ │ flush: () => { 2026-10-24T21:34:49.2736388Z 2620 │ │ let task: (() => void) | undefined; 2026-10-24T21:34:49.2736671Z 2621 │ │ while ((task = tasks.shift()) !== undefined) task(); 2026-10-24T21:34:49.2736905Z 2622 │ │ }, 2026-10-24T21:34:49.2737088Z 2623 │ │ }; 2026-10-24T21:34:49.2737259Z 2624 │ │ 2026-10-24T21:34:49.2737512Z 2625 │ │ let requestFiber: Fiber.Fiber | undefined; 2026-10-24T21:34:49.2737793Z 2626 │ │ let requestChecks = 0; 2026-10-24T21:34:49.2738051Z 2627 │ │ const scheduler: Scheduler.Scheduler = { 2026-10-24T21:34:49.2738302Z 2628 │ │ executionMode: "async", 2026-10-24T21:34:49.2738563Z 2629 │ │ makeDispatcher: () => dispatcher, 2026-10-24T21:34:49.2738814Z 2630 │ │ shouldYield: (fiber) => { 2026-10-24T21:34:49.2739077Z 2631 │ │ if (fiber !== requestFiber) return false; 2026-10-24T21:34:49.2739322Z 2632 │ │ requestChecks += 1; 2026-10-24T21:34:49.2739588Z 2633 │ │ if (requestChecks !== interruptAt) return false; 2026-10-24T21:34:49.2739850Z 2634 │ │ fiber.interruptUnsafe(); 2026-10-24T21:34:49.2740075Z 2635 │ │ return true; 2026-10-24T21:34:49.2740267Z 2636 │ │ }, 2026-10-24T21:34:49.2740447Z 2637 │ │ }; 2026-10-24T21:34:49.2740614Z 2638 │ │ 2026-10-24T21:34:49.2740955Z 2639 │ │ const input: UsageSummaryInput = { 2026-10-24T21:34:49.2741258Z 2640 │ │ ...WINDOW, 2026-10-24T21:34:49.2741493Z 2641 │ │ sinceDay: UsageDay.make("2026-09-01"), 2026-10-24T21:34:49.2741830Z 2642 │ │ untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`), 2026-10-24T21:34:49.2742098Z 2643 │ │ }; 2026-10-24T21:34:49.2742308Z 2644 │ │ const first = yield* service 2026-10-24T21:34:49.2742537Z 2645 │ │ .readSummary(input) 2026-10-24T21:34:49.2742749Z 2646 │ │ .pipe( 2026-10-24T21:34:49.2742950Z 2647 │ │ Effect.exit, 2026-10-24T21:34:49.2743219Z 2648 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-24T21:34:49.2743488Z 2649 │ │ Effect.forkChild, 2026-10-24T21:34:49.2744065Z 2650 │ │ ); 2026-10-24T21:34:49.2744267Z 2651 │ │ requestFiber = first; 2026-10-24T21:34:49.2744486Z 2652 │ │ yield* Effect.yieldNow; 2026-10-24T21:34:49.2744713Z 2653 │ │ dispatcher.flush(); 2026-10-24T21:34:49.2744905Z 2654 │ │ 2026-10-24T21:34:49.2745144Z 2655 │ │ const second = yield* service.readSummary(input).pipe( 2026-10-24T21:34:49.2745439Z 2656 │ │ Effect.match({ 2026-10-24T21:34:49.2745675Z 2657 │ │ onFailure: (error) => error.reason, 2026-10-24T21:34:49.2745930Z 2658 │ │ onSuccess: () => "success" as const, 2026-10-24T21:34:49.2746150Z 2659 │ │ }), 2026-10-24T21:34:49.2746407Z 2660 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-24T21:34:49.2746661Z 2661 │ │ Effect.forkChild, 2026-10-24T21:34:49.2746861Z 2662 │ │ ); 2026-10-24T21:34:49.2747063Z 2663 │ │ yield* Effect.yieldNow; 2026-10-24T21:34:49.2747371Z 2664 │ │ dispatcher.flush(); 2026-10-24T21:34:49.2747609Z 2665 │ │ const secondExit = second.pollUnsafe(); 2026-10-24T21:34:49.2747863Z 2666 │ │ if (secondExit === undefined) { 2026-10-24T21:34:49.2748108Z 2667 │ │ second.interruptUnsafe(); 2026-10-24T21:34:49.2748353Z 2668 │ │ orphanedAt = interruptAt; 2026-10-24T21:34:49.2748571Z 2669 │ │ break; 2026-10-24T21:34:49.2748759Z 2670 │ │ } 2026-10-24T21:34:49.2748973Z 2671 │ │ if (Exit.isFailure(secondExit)) { 2026-10-24T21:34:49.2749261Z 2672 │ │ assert.fail("the matching request fiber was interrupted"); 2026-10-24T21:34:49.2749496Z 2673 │ │ } 2026-10-24T21:34:49.2749739Z 2674 │ │ assert.strictEqual(secondExit.value, "invalidWindow"); 2026-10-24T21:34:49.2750045Z 2675 │ ╰─▶ } 2026-10-24T21:34:49.2750238Z 2676 │ 2026-10-24T21:34:49.2750363Z ╰──── 2026-10-24T21:34:49.2750422Z 2026-10-24T21:34:49.2750569Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.2751027Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39] 2026-10-24T21:34:49.2751312Z 276 │ 2026-10-24T21:34:49.2751552Z 277 │ ╭─▶ return createElement(RawNativeView, { 2026-10-24T21:34:49.2751817Z 278 │ │ ...nativeProps, 2026-10-24T21:34:49.2752068Z 279 │ │ refreshEnabled: props.onPullToRefresh !== undefined, 2026-10-24T21:34:49.2752311Z 280 │ │ ref: nativeRef, 2026-10-24T21:34:49.2752544Z 281 │ ├─▶ }); 2026-10-24T21:34:49.2752917Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T21:34:49.2753186Z 282 │ } 2026-10-24T21:34:49.2753313Z ╰──── 2026-10-24T21:34:49.2753833Z  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-24T21:34:49.2754567Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.2754845Z 2026-10-24T21:34:49.2755123Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-24T21:34:49.2755510Z ╭─[apps/server/src/provider/AntigravityAuth.ts:285:20] 2026-10-24T21:34:49.2755706Z 284 │ }, 2026-10-24T21:34:49.2755856Z 285 │ (effect, flow, stopSessions) => 2026-10-24T21:34:49.2756053Z ·  ──────┬───── 2026-10-24T21:34:49.2756307Z · ╰── 'stopSessions' is declared here 2026-10-24T21:34:49.2756521Z 286 │ effect.pipe( 2026-10-24T21:34:49.2756662Z ╰──── 2026-10-24T21:34:49.2756820Z  help: Consider removing this parameter. 2026-10-24T21:34:49.2756938Z 2026-10-24T21:34:49.2757144Z ⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used. 2026-10-24T21:34:49.2757478Z ╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10] 2026-10-24T21:34:49.2757680Z 21 │ 2026-10-24T21:34:49.2757895Z 22 │ function summarizePayload(payload: unknown): Readonly> { 2026-10-24T21:34:49.2758146Z ·  ────────┬─────── 2026-10-24T21:34:49.2758399Z · ╰── 'summarizePayload' is declared here 2026-10-24T21:34:49.2758650Z 23 │ if (payload === null) return { valueType: "null" }; 2026-10-24T21:34:49.2758826Z ╰──── 2026-10-24T21:34:49.2758988Z  help: Consider removing this declaration. 2026-10-24T21:34:49.2759106Z 2026-10-24T21:34:49.2759472Z ⚠ 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-24T21:34:49.2759909Z ╭─[packages/contracts/src/auth.test.ts:17:12] 2026-10-24T21:34:49.2760189Z 16 │ it("decodes legacy review credentials without offering them in new grants", () => { 2026-10-24T21:34:49.2760516Z 17 │ expect(Schema.decodeUnknownSync(AuthEnvironmentScopes)(["review:write"])).toEqual([ 2026-10-24T21:34:49.2760874Z ·  ──────────────────────── 2026-10-24T21:34:49.2761093Z 18 │ "review:write", 2026-10-24T21:34:49.2761257Z ╰──── 2026-10-24T21:34:49.2761312Z 2026-10-24T21:34:49.2761666Z ⚠ 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-24T21:34:49.2762102Z ╭─[packages/contracts/src/auth.test.ts:20:18] 2026-10-24T21:34:49.2762283Z 19 │ ]); 2026-10-24T21:34:49.2762515Z 20 │ expect(() => Schema.decodeUnknownSync(AuthGrantScopes)(["review:write"])).toThrow(); 2026-10-24T21:34:49.2762791Z ·  ──────────────────────── 2026-10-24T21:34:49.2763037Z 21 │ expect(AuthStandardClientScopes).not.toContain("review:write"); 2026-10-24T21:34:49.2763229Z ╰──── 2026-10-24T21:34:49.2763288Z 2026-10-24T21:34:49.2763646Z ⚠ 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-24T21:34:49.2764082Z ╭─[packages/contracts/src/auth.test.ts:58:21] 2026-10-24T21:34:49.2764372Z 57 │ it("ignores unknown response permissions without falling back to broader scopes", () => { 2026-10-24T21:34:49.2764670Z 58 │ const session = Schema.decodeUnknownSync(AuthSessionState)({ 2026-10-24T21:34:49.2764915Z ·  ──────────────────────── 2026-10-24T21:34:49.2765098Z 59 │ authenticated: true, 2026-10-24T21:34:49.2765239Z ╰──── 2026-10-24T21:34:49.2765295Z 2026-10-24T21:34:49.2765752Z ⚠ 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-24T21:34:49.2766386Z ╭─[packages/contracts/src/baseSchemas.test.ts:39:9] 2026-10-24T21:34:49.2766591Z 38 │ JSON.stringify( 2026-10-24T21:34:49.2766799Z 39 │ Schema.encodeUnknownSync(Schema.toCodecJson(Named))([ 2026-10-24T21:34:49.2767048Z ·  ──────────────────────── 2026-10-24T21:34:49.2767223Z 40 │ { name: "a" }, 2026-10-24T21:34:49.2767361Z ╰──── 2026-10-24T21:34:49.2767419Z 2026-10-24T21:34:49.2767865Z ⚠ 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-24T21:34:49.2768397Z ╭─[packages/contracts/src/composerContext.test.ts:181:18] 2026-10-24T21:34:49.2768687Z 180 │ it("sends a message without the records the wire cannot carry", () => { 2026-10-24T21:34:49.2769020Z 181 │ const wire = Schema.encodeUnknownSync(Schema.toCodecJson(OrchestrationMessageContext))({ 2026-10-24T21:34:49.2769312Z ·  ──────────────────────── 2026-10-24T21:34:49.2769490Z 182 │ version: 1, 2026-10-24T21:34:49.2769625Z ╰──── 2026-10-24T21:34:49.2769682Z 2026-10-24T21:34:49.2769875Z ⚠ eslint(require-yield): This generator function does not have `yield` 2026-10-24T21:34:49.2770208Z ╭─[packages/provider-acp/src/server/mcpOverAcpBridge.ts:81:78] 2026-10-24T21:34:49.2770415Z  80 │ 2026-10-24T21:34:49.2770748Z  81 │ ╭─▶ export const makeAcpMcpOverAcpBridge = Effect.fn("AcpMcpOverAcpBridge.make")(function* ( 2026-10-24T21:34:49.2771191Z  82 │ │ options: AcpMcpOverAcpBridgeOptions, 2026-10-24T21:34:49.2771512Z  83 │ │ ): Effect.fn.Return { 2026-10-24T21:34:49.2771811Z  84 │ │ const fetchImplementation = options.fetchImplementation ?? fetch; 2026-10-24T21:34:49.2772116Z  85 │ │ const connections = new Map(); 2026-10-24T21:34:49.2772329Z  86 │ │ 2026-10-24T21:34:49.2772634Z  87 │ │ const connectionFor = (connectionId: string): Effect.Effect => 2026-10-24T21:34:49.2772942Z  88 │ │ Effect.suspend(() => { 2026-10-24T21:34:49.2773194Z  89 │ │ const connection = connections.get(connectionId); 2026-10-24T21:34:49.2773449Z  90 │ │ return connection === undefined 2026-10-24T21:34:49.2773782Z  91 │ │ ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`)) 2026-10-24T21:34:49.2774102Z  92 │ │ : Effect.succeed(connection); 2026-10-24T21:34:49.2774302Z  93 │ │ }); 2026-10-24T21:34:49.2774469Z  94 │ │ 2026-10-24T21:34:49.2774647Z  95 │ │ const send = ( 2026-10-24T21:34:49.2774852Z  96 │ │ connection: Connection, 2026-10-24T21:34:49.2775059Z  97 │ │ message: unknown, 2026-10-24T21:34:49.2775330Z  98 │ │ ): Effect.Effect, AcpMcpOverAcpError> => 2026-10-24T21:34:49.2775608Z  99 │ │ connection.mutex.withPermits(1)( 2026-10-24T21:34:49.2775848Z 100 │ │ Effect.gen(function* () { 2026-10-24T21:34:49.2776091Z 101 │ │ const body = JSON.stringify(message); 2026-10-24T21:34:49.2776367Z 102 │ │ if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) { 2026-10-24T21:34:49.2776730Z 103 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB.")); 2026-10-24T21:34:49.2777021Z 104 │ │ } 2026-10-24T21:34:49.2777255Z 105 │ │ const response = yield* Effect.tryPromise({ 2026-10-24T21:34:49.2777495Z 106 │ │ try: (signal) => 2026-10-24T21:34:49.2777737Z 107 │ │ fetchImplementation(options.endpoint, { 2026-10-24T21:34:49.2777979Z 108 │ │ method: "POST", 2026-10-24T21:34:49.2778194Z 109 │ │ signal, 2026-10-24T21:34:49.2778403Z 110 │ │ headers: { 2026-10-24T21:34:49.2778645Z 111 │ │ "content-type": "application/json", 2026-10-24T21:34:49.2778922Z 112 │ │ accept: "application/json, text/event-stream", 2026-10-24T21:34:49.2779201Z 113 │ │ authorization: options.authorization, 2026-10-24T21:34:49.2779465Z 114 │ │ ...(connection.sessionId === null 2026-10-24T21:34:49.2779696Z 115 │ │ ? {} 2026-10-24T21:34:49.2779950Z 116 │ │ : { "mcp-session-id": connection.sessionId }), 2026-10-24T21:34:49.2780230Z 117 │ │ ...(connection.protocolVersion === null 2026-10-24T21:34:49.2780522Z 118 │ │ ? {} 2026-10-24T21:34:49.2780828Z 119 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-24T21:34:49.2781080Z 120 │ │ }, 2026-10-24T21:34:49.2781302Z 121 │ │ body, 2026-10-24T21:34:49.2781494Z 122 │ │ }), 2026-10-24T21:34:49.2781698Z 123 │ │ catch: bridgeError, 2026-10-24T21:34:49.2781897Z 124 │ │ }); 2026-10-24T21:34:49.2782205Z 125 │ │ connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId; 2026-10-24T21:34:49.2782516Z 126 │ │ if (!response.ok) { 2026-10-24T21:34:49.2782736Z 127 │ │ yield* Effect.promise( 2026-10-24T21:34:49.2783046Z 128 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-24T21:34:49.2783309Z 129 │ │ ); 2026-10-24T21:34:49.2783523Z 130 │ │ return yield* Effect.fail( 2026-10-24T21:34:49.2783855Z 131 │ │ new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`), 2026-10-24T21:34:49.2784147Z 132 │ │ ); 2026-10-24T21:34:49.2784324Z 133 │ │ } 2026-10-24T21:34:49.2784637Z 134 │ │ const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))]; 2026-10-24T21:34:49.2784958Z 135 │ │ for (const payload of payloads) { 2026-10-24T21:34:49.2785315Z 136 │ │ connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion; 2026-10-24T21:34:49.2785608Z 137 │ │ } 2026-10-24T21:34:49.2785808Z 138 │ │ return payloads; 2026-10-24T21:34:49.2786043Z 139 │ │ }).pipe(Effect.mapError(bridgeError)), 2026-10-24T21:34:49.2786258Z 140 │ │ ); 2026-10-24T21:34:49.2786424Z 141 │ │ 2026-10-24T21:34:49.2786686Z 142 │ │ const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* ( 2026-10-24T21:34:49.2786995Z 143 │ │ request: AcpSchema.DisconnectMcpRequest, 2026-10-24T21:34:49.2787392Z 144 │ │ ): Effect.fn.Return { 2026-10-24T21:34:49.2787806Z 145 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T21:34:49.2788159Z 146 │ │ connections.delete(request.connectionId); 2026-10-24T21:34:49.2788427Z 147 │ │ const sessionId = connection.sessionId; 2026-10-24T21:34:49.2788668Z 148 │ │ if (sessionId !== null) { 2026-10-24T21:34:49.2788922Z 149 │ │ const response = yield* Effect.tryPromise({ 2026-10-24T21:34:49.2789160Z 150 │ │ try: (signal) => 2026-10-24T21:34:49.2789407Z 151 │ │ fetchImplementation(options.endpoint, { 2026-10-24T21:34:49.2789646Z 152 │ │ method: "DELETE", 2026-10-24T21:34:49.2789856Z 153 │ │ signal, 2026-10-24T21:34:49.2790068Z 154 │ │ headers: { 2026-10-24T21:34:49.2790318Z 155 │ │ authorization: options.authorization, 2026-10-24T21:34:49.2790580Z 156 │ │ "mcp-session-id": sessionId, 2026-10-24T21:34:49.2790846Z 157 │ │ ...(connection.protocolVersion === null 2026-10-24T21:34:49.2791080Z 158 │ │ ? {} 2026-10-24T21:34:49.2791380Z 159 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-24T21:34:49.2791631Z 160 │ │ }, 2026-10-24T21:34:49.2791814Z 161 │ │ }), 2026-10-24T21:34:49.2792017Z 162 │ │ catch: bridgeError, 2026-10-24T21:34:49.2792212Z 163 │ │ }); 2026-10-24T21:34:49.2792446Z 164 │ │ if (!response.ok && response.status !== 404) { 2026-10-24T21:34:49.2792704Z 165 │ │ return yield* Effect.fail( 2026-10-24T21:34:49.2792946Z 166 │ │ new AcpMcpOverAcpError( 2026-10-24T21:34:49.2793250Z 167 │ │ `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`, 2026-10-24T21:34:49.2793515Z 168 │ │ ), 2026-10-24T21:34:49.2793694Z 169 │ │ ); 2026-10-24T21:34:49.2793880Z 170 │ │ } 2026-10-24T21:34:49.2794085Z 171 │ │ yield* Effect.promise( 2026-10-24T21:34:49.2794395Z 172 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-24T21:34:49.2794655Z 173 │ │ ); 2026-10-24T21:34:49.2794834Z 174 │ │ } 2026-10-24T21:34:49.2795024Z 175 │ │ return {}; 2026-10-24T21:34:49.2795205Z 176 │ │ }); 2026-10-24T21:34:49.2795373Z 177 │ │ 2026-10-24T21:34:49.2795545Z 178 │ │ return { 2026-10-24T21:34:49.2795825Z 179 │ │ connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) { 2026-10-24T21:34:49.2796124Z 180 │ │ if (request.serverId !== "t3-code") { 2026-10-24T21:34:49.2796380Z 181 │ │ return yield* Effect.fail( 2026-10-24T21:34:49.2796701Z 182 │ │ new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`), 2026-10-24T21:34:49.2796975Z 183 │ │ ); 2026-10-24T21:34:49.2797152Z 184 │ │ } 2026-10-24T21:34:49.2797449Z 185 │ │ if (connections.size >= MAX_CONNECTIONS) { 2026-10-24T21:34:49.2797841Z 186 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections.")); 2026-10-24T21:34:49.2798130Z 187 │ │ } 2026-10-24T21:34:49.2798387Z 188 │ │ const connectionId = yield* options.allocateConnectionId; 2026-10-24T21:34:49.2798667Z 189 │ │ connections.set(connectionId, { 2026-10-24T21:34:49.2798916Z 190 │ │ mutex: yield* Semaphore.make(1), 2026-10-24T21:34:49.2799151Z 191 │ │ sessionId: null, 2026-10-24T21:34:49.2799378Z 192 │ │ protocolVersion: null, 2026-10-24T21:34:49.2799603Z 193 │ │ nextRequestId: 0, 2026-10-24T21:34:49.2799815Z 194 │ │ }); 2026-10-24T21:34:49.2800026Z 195 │ │ return { connectionId }; 2026-10-24T21:34:49.2800231Z 196 │ │ }), 2026-10-24T21:34:49.2800503Z 197 │ │ message: Effect.fn("mcpOverAcpBridge.message")(function* (request) { 2026-10-24T21:34:49.2800849Z 198 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T21:34:49.2801154Z 199 │ │ const id = ++connection.nextRequestId; 2026-10-24T21:34:49.2801451Z 200 │ │ const payloads = yield* send(connection, { 2026-10-24T21:34:49.2801697Z 201 │ │ jsonrpc: "2.0", 2026-10-24T21:34:49.2801900Z 202 │ │ id, 2026-10-24T21:34:49.2802110Z 203 │ │ method: request.method, 2026-10-24T21:34:49.2802404Z 204 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-24T21:34:49.2802656Z 205 │ │ }); 2026-10-24T21:34:49.2802947Z 206 │ │ const response = payloads.find((payload) => asEnvelope(payload)?.id === id); 2026-10-24T21:34:49.2803271Z 207 │ │ const envelope = asEnvelope(response); 2026-10-24T21:34:49.2803512Z 208 │ │ if (envelope === null) { 2026-10-24T21:34:49.2803748Z 209 │ │ return yield* Effect.fail( 2026-10-24T21:34:49.2804067Z 210 │ │ new AcpMcpOverAcpError("MCP server did not return a matching response."), 2026-10-24T21:34:49.2804346Z 211 │ │ ); 2026-10-24T21:34:49.2804526Z 212 │ │ } 2026-10-24T21:34:49.2804751Z 213 │ │ if (envelope.error !== undefined) { 2026-10-24T21:34:49.2805094Z 214 │ │ return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error))); 2026-10-24T21:34:49.2805377Z 215 │ │ } 2026-10-24T21:34:49.2805654Z 216 │ │ return (envelope.result ?? null) as AcpSchema.MessageMcpResponse; 2026-10-24T21:34:49.2805914Z 217 │ │ }), 2026-10-24T21:34:49.2806210Z 218 │ │ notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) { 2026-10-24T21:34:49.2806579Z 219 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T21:34:49.2806859Z 220 │ │ yield* send(connection, { 2026-10-24T21:34:49.2807087Z 221 │ │ jsonrpc: "2.0", 2026-10-24T21:34:49.2807370Z 222 │ │ method: request.method, 2026-10-24T21:34:49.2807702Z 223 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-24T21:34:49.2807952Z 224 │ │ }); 2026-10-24T21:34:49.2808130Z 225 │ │ }), 2026-10-24T21:34:49.2808319Z 226 │ │ disconnect, 2026-10-24T21:34:49.2808539Z 227 │ │ dispose: Effect.suspend(() => 2026-10-24T21:34:49.2808774Z 228 │ │ Effect.forEach( 2026-10-24T21:34:49.2808998Z 229 │ │ [...connections.keys()], 2026-10-24T21:34:49.2809307Z 230 │ │ (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore), 2026-10-24T21:34:49.2809589Z 231 │ │ { discard: true }, 2026-10-24T21:34:49.2809799Z 232 │ │ ), 2026-10-24T21:34:49.2809983Z 233 │ │ ), 2026-10-24T21:34:49.2810163Z 234 │ │ }; 2026-10-24T21:34:49.2810395Z 235 │ ╰─▶ }); 2026-10-24T21:34:49.2810593Z ╰──── 2026-10-24T21:34:49.2810915Z  help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed. 2026-10-24T21:34:49.2811166Z 2026-10-24T21:34:49.2811416Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T21:34:49.2811771Z ╭─[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9] 2026-10-24T21:34:49.2812025Z 35 │ { 2026-10-24T21:34:49.2823228Z ·  ────┬──── 2026-10-24T21:34:49.2823459Z · ╰── This is the containing effect 2026-10-24T21:34:49.2823735Z 30 │ if (snapshot && snapshot !== live) setHeld({ key, snapshot }); 2026-10-24T21:34:49.2823986Z ·  ───┬─── 2026-10-24T21:34:49.2824308Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.2824578Z 31 │ }, [key, live, snapshot]); 2026-10-24T21:34:49.2824726Z ╰──── 2026-10-24T21:34:49.2825406Z  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-24T21:34:49.2826287Z  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-24T21:34:49.2826600Z 2026-10-24T21:34:49.2826777Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T21:34:49.2827122Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:698:76] 2026-10-24T21:34:49.2827551Z 697 │ const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() })); 2026-10-24T21:34:49.2827917Z 698 │ if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() }); 2026-10-24T21:34:49.2828311Z ·  ─────┬──── 2026-10-24T21:34:49.2828689Z · ╰── Cannot call impure function 2026-10-24T21:34:49.2829006Z 699 │ const snoozeGateNow = new Date(snoozeGateClock.now).toISOString(); 2026-10-24T21:34:49.2829215Z ╰──── 2026-10-24T21:34:49.2829563Z  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-24T21:34:49.2830145Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T21:34:49.2830428Z 2026-10-24T21:34:49.2830601Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T21:34:49.2830940Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:719:71] 2026-10-24T21:34:49.2831220Z 718 │ const snoozePresets = useMemo( 2026-10-24T21:34:49.2831507Z 719 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-24T21:34:49.2831839Z ·  ─────┬──── 2026-10-24T21:34:49.2832162Z · ╰── Cannot call impure function 2026-10-24T21:34:49.2832456Z 720 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-24T21:34:49.2832652Z ╰──── 2026-10-24T21:34:49.2832994Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T21:34:49.2833566Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T21:34:49.2833852Z 2026-10-24T21:34:49.2834043Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T21:34:49.2834394Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:720:6] 2026-10-24T21:34:49.2834744Z 719 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-24T21:34:49.2835056Z 720 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-24T21:34:49.2835289Z ·  ────────────┬─────────── 2026-10-24T21:34:49.2835582Z · ╰── Unnecessary dependency `props.snoozePresetMinute` 2026-10-24T21:34:49.2835824Z 721 │ ); 2026-10-24T21:34:49.2835955Z ╰──── 2026-10-24T21:34:49.2836342Z  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-24T21:34:49.2836958Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.2837260Z 2026-10-24T21:34:49.2837445Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T21:34:49.2837782Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:766:7] 2026-10-24T21:34:49.2838027Z 765 │ thread.pinnedAt, 2026-10-24T21:34:49.2852944Z 766 │ variant, 2026-10-24T21:34:49.2853380Z ·  ───┬─── 2026-10-24T21:34:49.2853817Z · ╰── Unnecessary dependency `variant` 2026-10-24T21:34:49.2854076Z 767 │ ], 2026-10-24T21:34:49.2854198Z ╰──── 2026-10-24T21:34:49.2854583Z  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-24T21:34:49.2855206Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.2855502Z 2026-10-24T21:34:49.2855707Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T21:34:49.2856063Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1216:21] 2026-10-24T21:34:49.2856368Z 1215 │ {providerDrivers.slice(0, -1).map((driver, index) => ( 2026-10-24T21:34:49.2856641Z 1216 │ 2026-10-24T21:34:49.2856899Z ·  ────────────────────────── 2026-10-24T21:34:49.2857130Z 1217 │ 2026-10-24T21:34:49.2857305Z ╰──── 2026-10-24T21:34:49.2857508Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T21:34:49.2857662Z 2026-10-24T21:34:49.2857868Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T21:34:49.2858205Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:231:6] 2026-10-24T21:34:49.2858513Z 227 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-24T21:34:49.2858777Z 228 │ nativeEventSnapshotsRef.current, 2026-10-24T21:34:49.2858987Z ·  ───────────┬─────────── 2026-10-24T21:34:49.2859561Z · ╰── 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-24T21:34:49.2860053Z 229 │ mostRecentEventCount, 2026-10-24T21:34:49.2860205Z 230 │ ); 2026-10-24T21:34:49.2860394Z 231 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-24T21:34:49.2860675Z ·  ──────────────────────────┬────────────────────────── 2026-10-24T21:34:49.2861013Z · ╰── This dependency list is missing values used by the callback 2026-10-24T21:34:49.2861322Z 232 │ const assumedValue = props.value; 2026-10-24T21:34:49.2861477Z ╰──── 2026-10-24T21:34:49.2861761Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T21:34:49.2862278Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.2862574Z 2026-10-24T21:34:49.2862791Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T21:34:49.2863133Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:239:7] 2026-10-24T21:34:49.2863422Z 238 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-24T21:34:49.2863664Z 239 │ nativeEventSnapshotsRef.current, 2026-10-24T21:34:49.2863865Z ·  ───────────┬─────────── 2026-10-24T21:34:49.2864425Z · ╰── 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-24T21:34:49.2864906Z 240 │ controlledEventCount, 2026-10-24T21:34:49.2865062Z 241 │ assumedValue, 2026-10-24T21:34:49.2865203Z 242 │ ); 2026-10-24T21:34:49.2865422Z 243 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-24T21:34:49.2865723Z ·  ───────────┬────────── 2026-10-24T21:34:49.2866063Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-24T21:34:49.2866343Z 244 │ const acceptNativeEvent = useCallback( 2026-10-24T21:34:49.2866500Z ╰──── 2026-10-24T21:34:49.2866973Z  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-24T21:34:49.2868037Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.2868332Z 2026-10-24T21:34:49.2868478Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.2868763Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29] 2026-10-24T21:34:49.2869032Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T21:34:49.2869279Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T21:34:49.2869534Z ·  ─────────────┬──────────── 2026-10-24T21:34:49.2869825Z · ╰── Cannot access ref value during render 2026-10-24T21:34:49.2870040Z 165 │ }); 2026-10-24T21:34:49.2870160Z ╰──── 2026-10-24T21:34:49.2870672Z  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-24T21:34:49.2871415Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.2871688Z 2026-10-24T21:34:49.2871832Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.2872203Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29] 2026-10-24T21:34:49.2872508Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T21:34:49.2872751Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T21:34:49.2872994Z ·  ─────────────┬──────────── 2026-10-24T21:34:49.2873323Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T21:34:49.2873570Z 165 │ }); 2026-10-24T21:34:49.2873690Z ╰──── 2026-10-24T21:34:49.2874195Z  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-24T21:34:49.2874902Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.2875183Z 2026-10-24T21:34:49.2875326Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.2875609Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:166:23] 2026-10-24T21:34:49.2875808Z 165 │ }); 2026-10-24T21:34:49.2875966Z 166 │ confirmedTokensRef.current = tokens; 2026-10-24T21:34:49.2876200Z ·  ─────────┬────────────┬─── 2026-10-24T21:34:49.2876517Z · │ ╰── Cannot update ref value during render 2026-10-24T21:34:49.2876818Z · ╰── This value is a ref 2026-10-24T21:34:49.2877024Z 167 │ return JSON.stringify( 2026-10-24T21:34:49.2877167Z ╰──── 2026-10-24T21:34:49.2877677Z  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-24T21:34:49.2878370Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.2878647Z 2026-10-24T21:34:49.2878793Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.2879078Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:208:5] 2026-10-24T21:34:49.2879299Z 207 │ mostRecentEventCount, 2026-10-24T21:34:49.2879474Z 208 │ nativeEventSnapshotsRef.current, 2026-10-24T21:34:49.2879695Z ·  ───────────────┬─────────────── 2026-10-24T21:34:49.2879996Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T21:34:49.2880234Z 209 │ ); 2026-10-24T21:34:49.2880348Z ╰──── 2026-10-24T21:34:49.2880859Z  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-24T21:34:49.2881586Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.2881860Z 2026-10-24T21:34:49.2882005Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.2882339Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:214:5] 2026-10-24T21:34:49.2882589Z 213 │ mostRecentEventCount, 2026-10-24T21:34:49.2882765Z 214 │ nativeEventSnapshotsRef.current, 2026-10-24T21:34:49.2882978Z ·  ───────────────┬─────────────── 2026-10-24T21:34:49.2883273Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T21:34:49.2883508Z 215 │ ); 2026-10-24T21:34:49.2883619Z ╰──── 2026-10-24T21:34:49.2884123Z  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-24T21:34:49.2884828Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.2885111Z 2026-10-24T21:34:49.2885299Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T21:34:49.2885615Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:199:6] 2026-10-24T21:34:49.2885880Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T21:34:49.2886127Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T21:34:49.2886367Z ·  ─────────┬──────── 2026-10-24T21:34:49.2886944Z · ╰── 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-24T21:34:49.2887409Z 165 │ }); 2026-10-24T21:34:49.2887568Z 166 │ confirmedTokensRef.current = tokens; 2026-10-24T21:34:49.2887750Z 167 │ return JSON.stringify( 2026-10-24T21:34:49.2888003Z 168 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-24T21:34:49.2888240Z 169 │ const record = 2026-10-24T21:34:49.2888412Z 170 │ token.type === "context" 2026-10-24T21:34:49.2888675Z 171 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-24T21:34:49.2888909Z 172 │ : undefined; 2026-10-24T21:34:49.2889101Z 173 │ const presentation = contextChipPresentation( 2026-10-24T21:34:49.2889338Z 174 │ token.type === "context" ? token.kind : token.type, 2026-10-24T21:34:49.2889528Z 175 │ record, 2026-10-24T21:34:49.2889669Z 176 │ ); 2026-10-24T21:34:49.2889831Z 177 │ const icon = contextChipIcon( 2026-10-24T21:34:49.2890002Z 178 │ presentation, 2026-10-24T21:34:49.2890236Z 179 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-24T21:34:49.2890447Z 180 │ ); 2026-10-24T21:34:49.2890581Z 181 │ return { 2026-10-24T21:34:49.2890728Z 182 │ type: token.type, 2026-10-24T21:34:49.2890894Z 183 │ source: token.source, 2026-10-24T21:34:49.2891062Z 184 │ start: token.start, 2026-10-24T21:34:49.2891248Z 185 │ end: token.end, 2026-10-24T21:34:49.2891482Z 186 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-24T21:34:49.2891703Z 187 │ label: 2026-10-24T21:34:49.2891859Z 188 │ token.type === "skill" 2026-10-24T21:34:49.2892121Z 189 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-24T21:34:49.2892370Z 190 │ : token.type === "context" 2026-10-24T21:34:49.2892704Z 191 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-24T21:34:49.2893012Z 192 │ : basename(token.value), 2026-10-24T21:34:49.2893257Z 193 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-24T21:34:49.2893504Z 194 │ iconUri: contextChipIconUri(icon), 2026-10-24T21:34:49.2893704Z 195 │ tintsIcon: icon.kind === "chip", 2026-10-24T21:34:49.2893870Z 196 │ }; 2026-10-24T21:34:49.2893997Z 197 │ }), 2026-10-24T21:34:49.2894122Z 198 │ ); 2026-10-24T21:34:49.2894321Z 199 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-24T21:34:49.2894634Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-24T21:34:49.2894999Z · ╰── This dependency list is missing values used by the callback 2026-10-24T21:34:49.2895330Z 200 │ // Every render resolves against the snapshot history, so a render whose 2026-10-24T21:34:49.2895537Z ╰──── 2026-10-24T21:34:49.2895796Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T21:34:49.2896309Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.2896608Z 2026-10-24T21:34:49.2896795Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T21:34:49.2897123Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:261:5] 2026-10-24T21:34:49.2897410Z 253 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-24T21:34:49.2897653Z 254 │ nativeEventSnapshotsRef.current.push({ 2026-10-24T21:34:49.2897864Z ·  ───────────┬─────────── 2026-10-24T21:34:49.2898424Z · ╰── 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-24T21:34:49.2898923Z 255 │ eventCount: acknowledgedEventCount, 2026-10-24T21:34:49.2899096Z 256 │ value, 2026-10-24T21:34:49.2899251Z 257 │ selection: nextSelection, 2026-10-24T21:34:49.2899415Z 258 │ }); 2026-10-24T21:34:49.2899565Z 259 │ return acknowledgedEventCount; 2026-10-24T21:34:49.2899782Z 260 │ }, 2026-10-24T21:34:49.2899939Z 261 │ [], 2026-10-24T21:34:49.2900078Z ·  ─┬ 2026-10-24T21:34:49.2900344Z · ╰── This dependency list is missing values used by the callback 2026-10-24T21:34:49.2900576Z 262 │ ); 2026-10-24T21:34:49.2900691Z ╰──── 2026-10-24T21:34:49.2900948Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T21:34:49.2901491Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.2901788Z 2026-10-24T21:34:49.2901982Z ⚠ eslint(no-unused-vars): Identifier 'Image' is imported but never used. 2026-10-24T21:34:49.2902318Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:17:10] 2026-10-24T21:34:49.2902617Z 16 │ import type { NativeSyntheticEvent, ViewProps } from "react-native"; 2026-10-24T21:34:49.2902877Z 17 │ import { Image, Platform, StyleSheet } from "react-native"; 2026-10-24T21:34:49.2903081Z ·  ──┬── 2026-10-24T21:34:49.2903301Z · ╰── 'Image' is imported here 2026-10-24T21:34:49.2903487Z 18 │ 2026-10-24T21:34:49.2903602Z ╰──── 2026-10-24T21:34:49.2903757Z  help: Consider removing this import. 2026-10-24T21:34:49.2903872Z 2026-10-24T21:34:49.2904074Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T21:34:49.2904412Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:229:6] 2026-10-24T21:34:49.2904726Z 225 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-24T21:34:49.2904994Z 226 │ nativeEventSnapshotsRef.current, 2026-10-24T21:34:49.2905200Z ·  ───────────┬─────────── 2026-10-24T21:34:49.2905756Z · ╰── 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-24T21:34:49.2906236Z 227 │ mostRecentEventCount, 2026-10-24T21:34:49.2906384Z 228 │ ); 2026-10-24T21:34:49.2906575Z 229 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-24T21:34:49.2906849Z ·  ──────────────────────────┬────────────────────────── 2026-10-24T21:34:49.2907184Z · ╰── This dependency list is missing values used by the callback 2026-10-24T21:34:49.2907520Z 230 │ const assumedValue = props.value; 2026-10-24T21:34:49.2907678Z ╰──── 2026-10-24T21:34:49.2907902Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T21:34:49.2908380Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.2908673Z 2026-10-24T21:34:49.2908886Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T21:34:49.2909233Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:237:7] 2026-10-24T21:34:49.2909527Z 236 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-24T21:34:49.2909772Z 237 │ nativeEventSnapshotsRef.current, 2026-10-24T21:34:49.2910041Z ·  ───────────┬─────────── 2026-10-24T21:34:49.2910662Z · ╰── 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-24T21:34:49.2911142Z 238 │ controlledEventCount, 2026-10-24T21:34:49.2911329Z 239 │ assumedValue, 2026-10-24T21:34:49.2911476Z 240 │ ); 2026-10-24T21:34:49.2911699Z 241 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-24T21:34:49.2912003Z ·  ───────────┬────────── 2026-10-24T21:34:49.2912340Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-24T21:34:49.2912626Z 242 │ const acceptNativeEvent = useCallback( 2026-10-24T21:34:49.2912788Z ╰──── 2026-10-24T21:34:49.2913257Z  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-24T21:34:49.2913945Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.2914238Z 2026-10-24T21:34:49.2914385Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.2914676Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29] 2026-10-24T21:34:49.2914953Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T21:34:49.2915206Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T21:34:49.2915460Z ·  ─────────────┬──────────── 2026-10-24T21:34:49.2915748Z · ╰── Cannot access ref value during render 2026-10-24T21:34:49.2915964Z 163 │ }); 2026-10-24T21:34:49.2916084Z ╰──── 2026-10-24T21:34:49.2916604Z  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-24T21:34:49.2917309Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.2917584Z 2026-10-24T21:34:49.2917734Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.2918028Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29] 2026-10-24T21:34:49.2918300Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T21:34:49.2918545Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T21:34:49.2918791Z ·  ─────────────┬──────────── 2026-10-24T21:34:49.2919116Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T21:34:49.2919365Z 163 │ }); 2026-10-24T21:34:49.2919483Z ╰──── 2026-10-24T21:34:49.2920048Z  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-24T21:34:49.2920780Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.2921052Z 2026-10-24T21:34:49.2921208Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.2921527Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:164:23] 2026-10-24T21:34:49.2921736Z 163 │ }); 2026-10-24T21:34:49.2921893Z 164 │ confirmedTokensRef.current = tokens; 2026-10-24T21:34:49.2922129Z ·  ─────────┬────────────┬─── 2026-10-24T21:34:49.2922440Z · │ ╰── Cannot update ref value during render 2026-10-24T21:34:49.2922742Z · ╰── This value is a ref 2026-10-24T21:34:49.2922942Z 165 │ return JSON.stringify( 2026-10-24T21:34:49.2923082Z ╰──── 2026-10-24T21:34:49.2923594Z  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-24T21:34:49.2924292Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.2924564Z 2026-10-24T21:34:49.2924711Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.2925001Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:206:5] 2026-10-24T21:34:49.2925224Z 205 │ mostRecentEventCount, 2026-10-24T21:34:49.2925402Z 206 │ nativeEventSnapshotsRef.current, 2026-10-24T21:34:49.2925619Z ·  ───────────────┬─────────────── 2026-10-24T21:34:49.2925914Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T21:34:49.2926149Z 207 │ ); 2026-10-24T21:34:49.2926263Z ╰──── 2026-10-24T21:34:49.2926776Z  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-24T21:34:49.2927470Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.2927745Z 2026-10-24T21:34:49.2927894Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.2928183Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:212:5] 2026-10-24T21:34:49.2928406Z 211 │ mostRecentEventCount, 2026-10-24T21:34:49.2928583Z 212 │ nativeEventSnapshotsRef.current, 2026-10-24T21:34:49.2928797Z ·  ───────────────┬─────────────── 2026-10-24T21:34:49.2929089Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T21:34:49.2929322Z 213 │ ); 2026-10-24T21:34:49.2929435Z ╰──── 2026-10-24T21:34:49.2930003Z  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-24T21:34:49.2930723Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.2930998Z 2026-10-24T21:34:49.2931194Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T21:34:49.2931539Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:197:6] 2026-10-24T21:34:49.2931812Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T21:34:49.2932060Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T21:34:49.2932299Z ·  ─────────┬──────── 2026-10-24T21:34:49.2932876Z · ╰── 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-24T21:34:49.2933342Z 163 │ }); 2026-10-24T21:34:49.2933498Z 164 │ confirmedTokensRef.current = tokens; 2026-10-24T21:34:49.2933682Z 165 │ return JSON.stringify( 2026-10-24T21:34:49.2933936Z 166 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-24T21:34:49.2934178Z 167 │ const record = 2026-10-24T21:34:49.2934343Z 168 │ token.type === "context" 2026-10-24T21:34:49.2934611Z 169 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-24T21:34:49.2934850Z 170 │ : undefined; 2026-10-24T21:34:49.2935041Z 171 │ const presentation = contextChipPresentation( 2026-10-24T21:34:49.2935279Z 172 │ token.type === "context" ? token.kind : token.type, 2026-10-24T21:34:49.2935468Z 173 │ record, 2026-10-24T21:34:49.2935605Z 174 │ ); 2026-10-24T21:34:49.2935758Z 175 │ const icon = contextChipIcon( 2026-10-24T21:34:49.2935931Z 176 │ presentation, 2026-10-24T21:34:49.2936158Z 177 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-24T21:34:49.2936368Z 178 │ ); 2026-10-24T21:34:49.2936498Z 179 │ return { 2026-10-24T21:34:49.2936649Z 180 │ type: token.type, 2026-10-24T21:34:49.2936811Z 181 │ source: token.source, 2026-10-24T21:34:49.2936976Z 182 │ start: token.start, 2026-10-24T21:34:49.2937138Z 183 │ end: token.end, 2026-10-24T21:34:49.2937371Z 184 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-24T21:34:49.2937591Z 185 │ label: 2026-10-24T21:34:49.2937798Z 186 │ token.type === "skill" 2026-10-24T21:34:49.2938036Z 187 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-24T21:34:49.2938243Z 188 │ : token.type === "context" 2026-10-24T21:34:49.2938578Z 189 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-24T21:34:49.2938886Z 190 │ : basename(token.value), 2026-10-24T21:34:49.2939137Z 191 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-24T21:34:49.2939382Z 192 │ iconUri: contextChipIconUri(icon), 2026-10-24T21:34:49.2939580Z 193 │ tintsIcon: icon.kind === "chip", 2026-10-24T21:34:49.2939748Z 194 │ }; 2026-10-24T21:34:49.2939874Z 195 │ }), 2026-10-24T21:34:49.2940002Z 196 │ ); 2026-10-24T21:34:49.2940204Z 197 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-24T21:34:49.2940515Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-24T21:34:49.2940867Z · ╰── This dependency list is missing values used by the callback 2026-10-24T21:34:49.2941227Z 198 │ // Every render resolves against the snapshot history, so a render whose 2026-10-24T21:34:49.2941429Z ╰──── 2026-10-24T21:34:49.2941695Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T21:34:49.2942201Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.2942494Z 2026-10-24T21:34:49.2942686Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T21:34:49.2943011Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:259:5] 2026-10-24T21:34:49.2943294Z 251 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-24T21:34:49.2943538Z 252 │ nativeEventSnapshotsRef.current.push({ 2026-10-24T21:34:49.2943750Z ·  ───────────┬─────────── 2026-10-24T21:34:49.2944306Z · ╰── 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-24T21:34:49.2944815Z 253 │ eventCount: acknowledgedEventCount, 2026-10-24T21:34:49.2944986Z 254 │ value, 2026-10-24T21:34:49.2945145Z 255 │ selection: nextSelection, 2026-10-24T21:34:49.2945307Z 256 │ }); 2026-10-24T21:34:49.2945463Z 257 │ return acknowledgedEventCount; 2026-10-24T21:34:49.2945623Z 258 │ }, 2026-10-24T21:34:49.2945743Z 259 │ [], 2026-10-24T21:34:49.2945880Z ·  ─┬ 2026-10-24T21:34:49.2946146Z · ╰── This dependency list is missing values used by the callback 2026-10-24T21:34:49.2946380Z 260 │ ); 2026-10-24T21:34:49.2946495Z ╰──── 2026-10-24T21:34:49.2946756Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T21:34:49.2947320Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.2947614Z 2026-10-24T21:34:49.2947838Z ⚠ react(immutability): This value cannot be modified 2026-10-24T21:34:49.2948183Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:174:5] 2026-10-24T21:34:49.2948485Z 170 │ const expandedAngle = props.collapsedDirection === "right" ? 90 : 180; 2026-10-24T21:34:49.2948778Z 171 │ const rotation = useSharedValue(props.expanded ? expandedAngle : 0); 2026-10-24T21:34:49.2949008Z ·  ────┬─── 2026-10-24T21:34:49.2949232Z · ╰── `rotation` originates here 2026-10-24T21:34:49.2949422Z 172 │ 2026-10-24T21:34:49.2949557Z 173 │ useLayoutEffect(() => { 2026-10-24T21:34:49.2949784Z 174 │ rotation.value = withTiming(props.expanded ? expandedAngle : 0, { 2026-10-24T21:34:49.2950004Z ·  ────┬─── 2026-10-24T21:34:49.2950224Z · ╰── `rotation` cannot be modified 2026-10-24T21:34:49.2950469Z 175 │ duration: THREAD_DISCLOSURE_TRANSITION_MS, 2026-10-24T21:34:49.2950641Z ╰──── 2026-10-24T21:34:49.2950966Z  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-24T21:34:49.2951553Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T21:34:49.2951843Z 2026-10-24T21:34:49.2952036Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T21:34:49.2952376Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:1246:23] 2026-10-24T21:34:49.2952601Z 1245 │ { 2026-10-24T21:34:49.2961527Z ·  ────┬──── 2026-10-24T21:34:49.2961746Z · ╰── This is the containing effect 2026-10-24T21:34:49.2961987Z 330 │ if (!guidesEnabled && section === "guide") { 2026-10-24T21:34:49.2962198Z 331 │ requestedSection.current = "overview"; 2026-10-24T21:34:49.2962485Z 332 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-24T21:34:49.2962732Z 333 │ setSection("overview"); 2026-10-24T21:34:49.2962914Z ·  ─────┬──── 2026-10-24T21:34:49.2963181Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.2963407Z 334 │ } 2026-10-24T21:34:49.2963528Z ╰──── 2026-10-24T21:34:49.2964177Z  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-24T21:34:49.2965029Z  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-24T21:34:49.2965333Z 2026-10-24T21:34:49.2965543Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T21:34:49.2965915Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:335:6] 2026-10-24T21:34:49.2966190Z 330 │ if (!guidesEnabled && section === "guide") { 2026-10-24T21:34:49.2966399Z 331 │ requestedSection.current = "overview"; 2026-10-24T21:34:49.2966606Z ·  ────────┬─────── 2026-10-24T21:34:49.2967144Z · ╰── 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-24T21:34:49.2967701Z 332 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-24T21:34:49.2968024Z ·  ─────────┬───────── ──────┬────── 2026-10-24T21:34:49.2968715Z · │ ╰── 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-24T21:34:49.2969610Z · ╰── 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-24T21:34:49.2970085Z 333 │ setSection("overview"); 2026-10-24T21:34:49.2970234Z 334 │ } 2026-10-24T21:34:49.2970395Z 335 │ }, [guidesEnabled, section, insets.top]); 2026-10-24T21:34:49.2970619Z ·  ──────────────────┬───────────────── 2026-10-24T21:34:49.2970936Z · ╰── This dependency list is missing values used by the callback 2026-10-24T21:34:49.2971218Z 336 │ const tabContent = activityContent; 2026-10-24T21:34:49.2971402Z ╰──── 2026-10-24T21:34:49.2971626Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T21:34:49.2972112Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.2972408Z 2026-10-24T21:34:49.2972616Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T21:34:49.2972988Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:877:6] 2026-10-24T21:34:49.2973220Z 860 │ if ( 2026-10-24T21:34:49.2973410Z 861 │ lastSelection.current.path === route.params.path && 2026-10-24T21:34:49.2973624Z ·  ──────┬────── 2026-10-24T21:34:49.2974150Z · ╰── 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-24T21:34:49.2974664Z 862 │ lastSelection.current.id === route.params.fileSelectionId 2026-10-24T21:34:49.2974858Z 863 │ ) 2026-10-24T21:34:49.2974991Z 864 │ return; 2026-10-24T21:34:49.2975243Z 865 │ lastSelection.current = { path: route.params.path, id: route.params.fileSelectionId }; 2026-10-24T21:34:49.2975563Z 866 │ if (route.params.focus) navigation.setParams({ focus: undefined }); 2026-10-24T21:34:49.2975800Z 867 │ setJumpPath(route.params.path); 2026-10-24T21:34:49.2976031Z 868 │ setSelectedRowId(null); 2026-10-24T21:34:49.2976240Z 869 │ jumpStarted.current = false; 2026-10-24T21:34:49.2976490Z 870 │ const file = data.files.find((entry) => entry.path === route.params.path); 2026-10-24T21:34:49.2976740Z 871 │ if (!file || !nativeView.current) return; 2026-10-24T21:34:49.2976944Z ·  ─────┬──── 2026-10-24T21:34:49.2977482Z · ╰── 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-24T21:34:49.2977991Z 872 │ setCollapsedIds((ids) => ids.filter((id) => id !== file.id)); 2026-10-24T21:34:49.2978208Z 873 │ jumpStarted.current = true; 2026-10-24T21:34:49.2978448Z 874 │ void nativeView.current.scrollToFile(file.id, false).catch(() => { 2026-10-24T21:34:49.2978683Z 875 │ jumpStarted.current = false; 2026-10-24T21:34:49.2978851Z 876 │ }); 2026-10-24T21:34:49.2979112Z 877 │ }, [route.params.path, route.params.fileSelectionId, route.params.focus, data.files, navigation]); 2026-10-24T21:34:49.2979515Z ·  ──────────────────────────────────────────────┬────────────────────────────────────────────── 2026-10-24T21:34:49.2979923Z · ╰── This dependency list is missing values used by the callback 2026-10-24T21:34:49.2980235Z 878 │ const appliedFilter = useRef(filter.hideTestFiles); 2026-10-24T21:34:49.2980414Z ╰──── 2026-10-24T21:34:49.2980636Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T21:34:49.2981122Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.2981443Z 2026-10-24T21:34:49.2981641Z ⚠ eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used. 2026-10-24T21:34:49.2981936Z ╭─[apps/web/src/types.ts:22:3] 2026-10-24T21:34:49.2982118Z 21 │ EnvironmentThreadShell, 2026-10-24T21:34:49.2982280Z 22 │ ThreadRunSummary, 2026-10-24T21:34:49.2982442Z ·  ────────┬─────── 2026-10-24T21:34:49.2982680Z · ╰── 'ThreadRunSummary' is imported here 2026-10-24T21:34:49.2982894Z 23 │ ThreadRuntimeSummary, 2026-10-24T21:34:49.2983039Z ╰──── 2026-10-24T21:34:49.2983192Z  help: Consider removing this import. 2026-10-24T21:34:49.2983305Z 2026-10-24T21:34:49.2983470Z ⚠ react(immutability): This value cannot be modified 2026-10-24T21:34:49.2983784Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-24T21:34:49.2984002Z 83 │ 2026-10-24T21:34:49.2984154Z 84 │ const cardCoverage = props.cardCoverage; 2026-10-24T21:34:49.2984344Z ·  ──────┬───── 2026-10-24T21:34:49.2984582Z · ╰── `cardCoverage` originates here 2026-10-24T21:34:49.2984802Z 85 │ const barHeightRef = useRef(0); 2026-10-24T21:34:49.2984984Z 86 │ const cardHeightRef = useRef(0); 2026-10-24T21:34:49.2985169Z 87 │ const cardHeight = useSharedValue(0); 2026-10-24T21:34:49.2985362Z 88 │ const notifyCoverage = useCallback(() => { 2026-10-24T21:34:49.2985539Z 89 │ if (!cardCoverage) { 2026-10-24T21:34:49.2985689Z 90 │ return; 2026-10-24T21:34:49.2985817Z 91 │ } 2026-10-24T21:34:49.2986095Z 92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-24T21:34:49.2986397Z 93 │ // feed inset and floating controls trailing it. 2026-10-24T21:34:49.2986667Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T21:34:49.2986909Z ·  ──────┬───── 2026-10-24T21:34:49.2987140Z · ╰── `cardCoverage` cannot be modified 2026-10-24T21:34:49.2987406Z 95 │ }, [cardCoverage]); 2026-10-24T21:34:49.2987542Z ╰──── 2026-10-24T21:34:49.2987893Z  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-24T21:34:49.2988477Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T21:34:49.2988772Z 2026-10-24T21:34:49.2988931Z ⚠ react(immutability): This value cannot be modified 2026-10-24T21:34:49.2989242Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:106:7] 2026-10-24T21:34:49.2989487Z  86 │ const cardHeightRef = useRef(0); 2026-10-24T21:34:49.2989674Z  87 │ const cardHeight = useSharedValue(0); 2026-10-24T21:34:49.2989861Z ·  ─────┬──── 2026-10-24T21:34:49.2990087Z · ╰── `cardHeight` originates here 2026-10-24T21:34:49.2990319Z  88 │ const notifyCoverage = useCallback(() => { 2026-10-24T21:34:49.2990497Z  89 │ if (!cardCoverage) { 2026-10-24T21:34:49.2990648Z  90 │ return; 2026-10-24T21:34:49.2990774Z  91 │ } 2026-10-24T21:34:49.2991004Z  92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-24T21:34:49.2991299Z  93 │ // feed inset and floating controls trailing it. 2026-10-24T21:34:49.2991564Z  94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T21:34:49.2991796Z  95 │ }, [cardCoverage]); 2026-10-24T21:34:49.2991964Z  96 │ const handleBarLayout = useCallback( 2026-10-24T21:34:49.2992151Z  97 │ (event: LayoutChangeEvent) => { 2026-10-24T21:34:49.2992371Z  98 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T21:34:49.2992576Z  99 │ notifyCoverage(); 2026-10-24T21:34:49.2992715Z 100 │ }, 2026-10-24T21:34:49.2992843Z 101 │ [notifyCoverage], 2026-10-24T21:34:49.2992981Z 102 │ ); 2026-10-24T21:34:49.2993126Z 103 │ const handleCardLayout = useCallback( 2026-10-24T21:34:49.2993315Z 104 │ (event: LayoutChangeEvent) => { 2026-10-24T21:34:49.2993546Z 105 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T21:34:49.2993801Z 106 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-24T21:34:49.2994005Z ·  ─────┬──── 2026-10-24T21:34:49.2994235Z · ╰── `cardHeight` cannot be modified 2026-10-24T21:34:49.2994443Z 107 │ notifyCoverage(); 2026-10-24T21:34:49.2994579Z ╰──── 2026-10-24T21:34:49.2994895Z  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-24T21:34:49.2995449Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T21:34:49.2995733Z 2026-10-24T21:34:49.2996003Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T21:34:49.2996391Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-24T21:34:49.2996638Z 87 │ const cardHeight = useSharedValue(0); 2026-10-24T21:34:49.2996834Z 88 │ const notifyCoverage = useCallback(() => { 2026-10-24T21:34:49.2997046Z ·  ───┬─── 2026-10-24T21:34:49.2997396Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-24T21:34:49.2997678Z 89 │ if (!cardCoverage) { 2026-10-24T21:34:49.2997822Z 90 │ return; 2026-10-24T21:34:49.2997945Z 91 │ } 2026-10-24T21:34:49.2998167Z 92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-24T21:34:49.2998441Z 93 │ // feed inset and floating controls trailing it. 2026-10-24T21:34:49.2998714Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T21:34:49.2998951Z ·  ──────┬───── 2026-10-24T21:34:49.2999170Z · ╰── This modifies `cardCoverage` 2026-10-24T21:34:49.2999373Z 95 │ }, [cardCoverage]); 2026-10-24T21:34:49.2999507Z ╰──── 2026-10-24T21:34:49.2999900Z  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-24T21:34:49.3000512Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T21:34:49.3000800Z 2026-10-24T21:34:49.3001000Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T21:34:49.3001451Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-24T21:34:49.3001712Z 93 │ // feed inset and floating controls trailing it. 2026-10-24T21:34:49.3001980Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T21:34:49.3002221Z ·  ──────┬───── 2026-10-24T21:34:49.3002439Z · ╰── This modifies `cardCoverage` 2026-10-24T21:34:49.3002639Z 95 │ }, [cardCoverage]); 2026-10-24T21:34:49.3002808Z 96 │ const handleBarLayout = useCallback( 2026-10-24T21:34:49.3002988Z 97 │ (event: LayoutChangeEvent) => { 2026-10-24T21:34:49.3003194Z ·  ───────────────┬─────────────── 2026-10-24T21:34:49.3003532Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-24T21:34:49.3003866Z 98 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T21:34:49.3004055Z ╰──── 2026-10-24T21:34:49.3004441Z  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-24T21:34:49.3005048Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T21:34:49.3005337Z 2026-10-24T21:34:49.3005534Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T21:34:49.3005928Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:106:7] 2026-10-24T21:34:49.3006209Z 103 │ const handleCardLayout = useCallback( 2026-10-24T21:34:49.3006394Z 104 │ (event: LayoutChangeEvent) => { 2026-10-24T21:34:49.3006601Z ·  ───────────────┬─────────────── 2026-10-24T21:34:49.3006924Z · ╰── This function may (indirectly) reassign or modify `cardHeight` after render 2026-10-24T21:34:49.3007258Z 105 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T21:34:49.3007509Z 106 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-24T21:34:49.3007718Z ·  ─────┬──── 2026-10-24T21:34:49.3007937Z · ╰── This modifies `cardHeight` 2026-10-24T21:34:49.3008139Z 107 │ notifyCoverage(); 2026-10-24T21:34:49.3008276Z ╰──── 2026-10-24T21:34:49.3008666Z  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-24T21:34:49.3009273Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T21:34:49.3009558Z 2026-10-24T21:34:49.3009922Z ⚠ 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-24T21:34:49.3010372Z ╭─[packages/shared/src/otelEnvironment.ts:146:14] 2026-10-24T21:34:49.3010561Z 145 │ name, 2026-10-24T21:34:49.3010767Z 146 │ (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()), 2026-10-24T21:34:49.3011026Z ·  ────────────────────────── 2026-10-24T21:34:49.3011270Z 147 │ `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`, 2026-10-24T21:34:49.3011478Z ╰──── 2026-10-24T21:34:49.3011532Z 2026-10-24T21:34:49.3012000Z ⚠ 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-24T21:34:49.3012569Z ╭─[packages/client-runtime/src/connection/supervisor.test.ts:135:3] 2026-10-24T21:34:49.3012837Z 134 │ let lastState = yield* SubscriptionRef.get(state); 2026-10-24T21:34:49.3013172Z 135 │ ╭─▶ for (let iteration = 0; iteration < 100; iteration += 1) { 2026-10-24T21:34:49.3013549Z 136 │ │ lastState = yield* SubscriptionRef.get(state); 2026-10-24T21:34:49.3013827Z 137 │ │ if (predicate(lastState)) { 2026-10-24T21:34:49.3014040Z 138 │ │ return lastState; 2026-10-24T21:34:49.3014222Z 139 │ │ } 2026-10-24T21:34:49.3014419Z 140 │ │ yield* Effect.yieldNow; 2026-10-24T21:34:49.3014659Z 141 │ ╰─▶ } 2026-10-24T21:34:49.3014869Z 142 │ return yield* Effect.die( 2026-10-24T21:34:49.3015013Z ╰──── 2026-10-24T21:34:49.3015071Z 2026-10-24T21:34:49.3015526Z ⚠ 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-24T21:34:49.3016075Z ╭─[packages/client-runtime/src/rpc/client.test.ts:131:9] 2026-10-24T21:34:49.3016280Z 130 │ ) { 2026-10-24T21:34:49.3016562Z 131 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T21:34:49.3016880Z 132 │ │ if (subscriptions.length >= count) { 2026-10-24T21:34:49.3017105Z 133 │ │ return; 2026-10-24T21:34:49.3017297Z 134 │ │ } 2026-10-24T21:34:49.3017506Z 135 │ │ yield* Effect.yieldNow; 2026-10-24T21:34:49.3017765Z 136 │ ╰─▶ } 2026-10-24T21:34:49.3018071Z 137 │ return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`)); 2026-10-24T21:34:49.3018291Z ╰──── 2026-10-24T21:34:49.3018346Z 2026-10-24T21:34:49.3018809Z ⚠ 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-24T21:34:49.3019354Z ╭─[packages/client-runtime/src/rpc/client.test.ts:252:7] 2026-10-24T21:34:49.3019654Z 251 │ yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient))); 2026-10-24T21:34:49.3020072Z 252 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) { 2026-10-24T21:34:49.3020404Z 253 │ │ yield* Effect.yieldNow; 2026-10-24T21:34:49.3020656Z 254 │ ╰─▶ } 2026-10-24T21:34:49.3020922Z 255 │ yield* SubscriptionRef.set(activeSession, Option.none()); 2026-10-24T21:34:49.3021115Z ╰──── 2026-10-24T21:34:49.3021168Z 2026-10-24T21:34:49.3021653Z ⚠ 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-24T21:34:49.3022196Z ╭─[packages/client-runtime/src/rpc/client.test.ts:258:7] 2026-10-24T21:34:49.3022392Z 257 │ 2026-10-24T21:34:49.3022703Z 258 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-24T21:34:49.3023032Z 259 │ │ yield* Effect.yieldNow; 2026-10-24T21:34:49.3023344Z 260 │ ╰─▶ } 2026-10-24T21:34:49.3023622Z 261 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-24T21:34:49.3029418Z ╰──── 2026-10-24T21:34:49.3029484Z 2026-10-24T21:34:49.3029950Z ⚠ 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-24T21:34:49.3030495Z ╭─[packages/client-runtime/src/rpc/client.test.ts:322:7] 2026-10-24T21:34:49.3030695Z 321 │ ); 2026-10-24T21:34:49.3031027Z 322 │ ╭─▶ for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) { 2026-10-24T21:34:49.3031403Z 323 │ │ yield* Effect.yieldNow; 2026-10-24T21:34:49.3031658Z 324 │ ╰─▶ } 2026-10-24T21:34:49.3031851Z 325 │ 2026-10-24T21:34:49.3031963Z ╰──── 2026-10-24T21:34:49.3032019Z 2026-10-24T21:34:49.3032472Z ⚠ 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-24T21:34:49.3033007Z ╭─[packages/client-runtime/src/rpc/client.test.ts:330:7] 2026-10-24T21:34:49.3033308Z 329 │ yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient))); 2026-10-24T21:34:49.3033722Z 330 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-24T21:34:49.3034058Z 331 │ │ yield* Effect.yieldNow; 2026-10-24T21:34:49.3034308Z 332 │ ╰─▶ } 2026-10-24T21:34:49.3034550Z 333 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-24T21:34:49.3034721Z ╰──── 2026-10-24T21:34:49.3034778Z 2026-10-24T21:34:49.3034947Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T21:34:49.3035305Z ╭─[packages/provider-opencode/src/server/OpenCodeRuntime.environment.test.ts:53:14] 2026-10-24T21:34:49.3035551Z 52 │ 2026-10-24T21:34:49.3035676Z 53 │ for (const {} of [ 2026-10-24T21:34:49.3035841Z ·  ── 2026-10-24T21:34:49.3035996Z 54 │ { healthy: true }, 2026-10-24T21:34:49.3036134Z ╰──── 2026-10-24T21:34:49.3036427Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T21:34:49.3036652Z 2026-10-24T21:34:49.3037109Z ⚠ 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-24T21:34:49.3037650Z ╭─[packages/client-runtime/src/rpc/session.test.ts:226:3] 2026-10-24T21:34:49.3037851Z 225 │ ) { 2026-10-24T21:34:49.3038121Z 226 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T21:34:49.3038435Z 227 │ │ const socket = sockets[index]; 2026-10-24T21:34:49.3038649Z 228 │ │ if (socket) { 2026-10-24T21:34:49.3038852Z 229 │ │ return socket; 2026-10-24T21:34:49.3039132Z 230 │ │ } 2026-10-24T21:34:49.3039367Z 231 │ │ yield* Effect.yieldNow; 2026-10-24T21:34:49.3039611Z 232 │ ╰─▶ } 2026-10-24T21:34:49.3039916Z 233 │ return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket.")); 2026-10-24T21:34:49.3040145Z ╰──── 2026-10-24T21:34:49.3040204Z 2026-10-24T21:34:49.3040657Z ⚠ 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-24T21:34:49.3041210Z ╭─[packages/client-runtime/src/rpc/session.test.ts:240:3] 2026-10-24T21:34:49.3041431Z 239 │ ) { 2026-10-24T21:34:49.3041707Z 240 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T21:34:49.3042108Z 241 │ │ const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index]; 2026-10-24T21:34:49.3042407Z 242 │ │ if (request) { 2026-10-24T21:34:49.3042612Z 243 │ │ return request; 2026-10-24T21:34:49.3042800Z 244 │ │ } 2026-10-24T21:34:49.3042993Z 245 │ │ yield* Effect.yieldNow; 2026-10-24T21:34:49.3043237Z 246 │ ╰─▶ } 2026-10-24T21:34:49.3043536Z 247 │ return yield* Effect.die(new Error("Expected the RPC protocol to send a request.")); 2026-10-24T21:34:49.3043761Z ╰──── 2026-10-24T21:34:49.3043817Z 2026-10-24T21:34:49.3044278Z ⚠ 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-24T21:34:49.3044819Z ╭─[packages/effect-acp/src/protocol.test.ts:500:31] 2026-10-24T21:34:49.3045006Z 499 │ 2026-10-24T21:34:49.3045180Z 500 │ const response = yield* Schema.decodeUnknownEffect( 2026-10-24T21:34:49.3045430Z ·  ────────────────────────── 2026-10-24T21:34:49.3045664Z 501 │ Schema.fromJsonString(JsonRpcErrorResponse), 2026-10-24T21:34:49.3045714Z ╰──── 2026-10-24T21:34:49.3045717Z 2026-10-24T21:34:49.3046176Z ⚠ 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-24T21:34:49.3046303Z ╭─[packages/effect-acp/src/errors.test.ts:129:28] 2026-10-24T21:34:49.3046399Z 128 │ const secret = "acp-summary-secret"; 2026-10-24T21:34:49.3046506Z 129 │ const cause = yield* Schema.decodeUnknownEffect( 2026-10-24T21:34:49.3046627Z ·  ────────────────────────── 2026-10-24T21:34:49.3046698Z 130 │ Schema.Struct({ 2026-10-24T21:34:49.3046751Z ╰──── 2026-10-24T21:34:49.3046754Z 2026-10-24T21:34:49.3047117Z ⚠ 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-24T21:34:49.3047235Z ╭─[packages/effect-acp/src/client.ts:1269:11] 2026-10-24T21:34:49.3047437Z 1268 │ extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) => 2026-10-24T21:34:49.3047645Z 1269 │ Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe( 2026-10-24T21:34:49.3047753Z ·  ────────────────────────── 2026-10-24T21:34:49.3047899Z 1270 │ Effect.mapError(() => AcpError.AcpRequestError.invalidParams()), 2026-10-24T21:34:49.3047955Z ╰──── 2026-10-24T21:34:49.3047957Z 2026-10-24T21:34:49.3048321Z ⚠ 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-24T21:34:49.3048449Z ╭─[apps/server/src/assets/AssetAccess.test.ts:975:35] 2026-10-24T21:34:49.3048595Z 974 │ // Every client and server release spells the resource this way on the wire. 2026-10-24T21:34:49.3048757Z 975 │ const { resource } = yield* Schema.decodeUnknownEffect(AssetCreateUrlInput)({ 2026-10-24T21:34:49.3048885Z ·  ────────────────────────── 2026-10-24T21:34:49.3049005Z 976 │ resource: { _tag: "github-media", cwd: "/repo", url }, 2026-10-24T21:34:49.3049056Z ╰──── 2026-10-24T21:34:49.3049059Z 2026-10-24T21:34:49.3049499Z ⚠ 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-24T21:34:49.3049630Z ╭─[apps/server/src/assets/AssetAccess.test.ts:1012:32] 2026-10-24T21:34:49.3049768Z 1011 │ expect(error._tag).toBe("AssetGitHubMediaUrlValidationError"); 2026-10-24T21:34:49.3049961Z 1012 │ const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(AssetAccessError))(error); 2026-10-24T21:34:49.3050078Z ·  ─────────────────── 2026-10-24T21:34:49.3050177Z 1013 │ expect(encoded).not.toContain(url); 2026-10-24T21:34:49.3050232Z ╰──── 2026-10-24T21:34:49.3050234Z 2026-10-24T21:34:49.3050671Z ⚠ 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-24T21:34:49.3050791Z ╭─[apps/server/src/serverSettings.test.ts:1741:32] 2026-10-24T21:34:49.3050962Z 1740 │ const model = createModelSelection(ProviderInstanceId.make("codex"), "gpt-5.5"); 2026-10-24T21:34:49.3051146Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-24T21:34:49.3051295Z ·  ─────────────────── 2026-10-24T21:34:49.3051406Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-24T21:34:49.3051458Z ╰──── 2026-10-24T21:34:49.3051461Z 2026-10-24T21:34:49.3051895Z ⚠ 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-24T21:34:49.3052019Z ╭─[apps/server/src/serverSettings.test.ts:1742:34] 2026-10-24T21:34:49.3052202Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-24T21:34:49.3052307Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-24T21:34:49.3052424Z ·  ─────────────────── 2026-10-24T21:34:49.3052589Z 1743 │ Schema.fromJsonString(Schema.Array(ProjectScript)), 2026-10-24T21:34:49.3052670Z ╰──── 2026-10-24T21:34:49.3052673Z 2026-10-24T21:34:49.3052904Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-24T21:34:49.3053042Z ╭─[apps/web/src/components/chat/useComposerSend.ts:985:13] 2026-10-24T21:34:49.3053173Z 984 │ const changedBeforeDecline = draftChangedSinceSend(); 2026-10-24T21:34:49.3053414Z 985 │ ╭─▶ const pendingIdsBeforeDecline = pendingApprovalsRef.current.map( 2026-10-24T21:34:49.3053535Z 986 │ │ (approval) => approval.requestId, 2026-10-24T21:34:49.3053668Z 987 │ ╰─▶ ); 2026-10-24T21:34:49.3053815Z 988 │ const approvalResponding = approvalsToDecline.some((approval) => 2026-10-24T21:34:49.3053871Z ╰──── 2026-10-24T21:34:49.3053950Z  help: Switch to `Set` 2026-10-24T21:34:49.3053953Z 2026-10-24T21:34:49.3054118Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T21:34:49.3054267Z ╭─[apps/web/src/components/chat/useThreadLifecycle.tsx:178:58] 2026-10-24T21:34:49.3054378Z 177 │ if (snoozeClockState.shell !== activeThreadShell) { 2026-10-24T21:34:49.3054542Z 178 │ setSnoozeClockState({ shell: activeThreadShell, now: new Date().toISOString() }); 2026-10-24T21:34:49.3054664Z ·  ─────┬──── 2026-10-24T21:34:49.3054835Z · ╰── Cannot call impure function 2026-10-24T21:34:49.3054898Z 179 │ } 2026-10-24T21:34:49.3054955Z ╰──── 2026-10-24T21:34:49.3055234Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T21:34:49.3055531Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T21:34:49.3055534Z 2026-10-24T21:34:49.3055862Z ⚠ 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-24T21:34:49.3055983Z ╭─[packages/effect-acp/src/schema.test.ts:18:12] 2026-10-24T21:34:49.3056143Z 17 │ const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } }; 2026-10-24T21:34:49.3056306Z 18 │ expect(Schema.is(V1.AvailableCommand)(command)).toBe(true); 2026-10-24T21:34:49.3056446Z ·  ───────── 2026-10-24T21:34:49.3056509Z 19 │ expect( 2026-10-24T21:34:49.3056562Z ╰──── 2026-10-24T21:34:49.3056564Z 2026-10-24T21:34:49.3056884Z ⚠ 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-24T21:34:49.3057002Z ╭─[packages/effect-acp/src/schema.test.ts:20:7] 2026-10-24T21:34:49.3057064Z 19 │ expect( 2026-10-24T21:34:49.3057233Z 20 │ Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }), 2026-10-24T21:34:49.3057307Z ·  ───────── 2026-10-24T21:34:49.3057373Z 21 │ ).toBe(true); 2026-10-24T21:34:49.3057427Z ╰──── 2026-10-24T21:34:49.3057429Z 2026-10-24T21:34:49.3057639Z ⚠ typescript(no-extraneous-class): Unexpected class with only a constructor. 2026-10-24T21:34:49.3057763Z ╭─[apps/desktop/src/preview/Manager.test.ts:158:18] 2026-10-24T21:34:49.3057869Z 157 │ BrowserWindow: browserWindowConstructor, 2026-10-24T21:34:49.3058030Z 158 │ ╭─▶ ClipboardItem: class { 2026-10-24T21:34:49.3058163Z 159 │ │ constructor(data: Record) { 2026-10-24T21:34:49.3058279Z 160 │ │ clipboardItemConstructor(data); 2026-10-24T21:34:49.3058357Z 161 │ │ } 2026-10-24T21:34:49.3058484Z 162 │ ╰─▶ }, 2026-10-24T21:34:49.3058551Z 163 │ clipboard: { 2026-10-24T21:34:49.3058602Z ╰──── 2026-10-24T21:34:49.3058777Z  help: Try replacing this class with a standalone function or deleting it entirely 2026-10-24T21:34:49.3058782Z 2026-10-24T21:34:49.3059039Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T21:34:49.3059192Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:406:5] 2026-10-24T21:34:49.3059248Z 404 │ 2026-10-24T21:34:49.3059313Z 405 │ useEffect(() => { 2026-10-24T21:34:49.3059387Z ·  ────┬──── 2026-10-24T21:34:49.3059519Z · ╰── This is the containing effect 2026-10-24T21:34:49.3059609Z 406 │ setInspectorSelection((current) => { 2026-10-24T21:34:49.3059699Z ·  ──────────┬────────── 2026-10-24T21:34:49.3059879Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3059991Z 407 │ if (props.renderInspector === undefined) { 2026-10-24T21:34:49.3060042Z ╰──── 2026-10-24T21:34:49.3060633Z  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-24T21:34:49.3060954Z  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-24T21:34:49.3060958Z 2026-10-24T21:34:49.3061173Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T21:34:49.3061406Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:534:24] 2026-10-24T21:34:49.3061590Z 533 │ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top; 2026-10-24T21:34:49.3061757Z 534 │ ╭─▶ const GitInspector = () => ( 2026-10-24T21:34:49.3061859Z 535 │ │ 2026-10-24T21:34:49.3062473Z 540 │ ╰─▶ ); 2026-10-24T21:34:49.3062561Z 541 │ const FilesInspector = () => 2026-10-24T21:34:49.3062616Z ╰──── 2026-10-24T21:34:49.3062835Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-24T21:34:49.3062838Z 2026-10-24T21:34:49.3063050Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T21:34:49.3063202Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:541:26] 2026-10-24T21:34:49.3063260Z 540 │ ); 2026-10-24T21:34:49.3063425Z 541 │ ╭─▶ const FilesInspector = () => 2026-10-24T21:34:49.3063577Z 542 │ │ selectedThread !== null && selectedThreadCwd !== null ? ( 2026-10-24T21:34:49.3063686Z 543 │ │ 2026-10-24T21:34:49.3064661Z 551 │ ╰─▶ ) : null; 2026-10-24T21:34:49.3064808Z 552 │ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset); 2026-10-24T21:34:49.3064866Z ╰──── 2026-10-24T21:34:49.3065085Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-24T21:34:49.3065087Z 2026-10-24T21:34:49.3065343Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T21:34:49.3065480Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:68:5] 2026-10-24T21:34:49.3065584Z 66 │ const { id: attachmentId, fileUri } = attachment; 2026-10-24T21:34:49.3065650Z 67 │ useEffect(() => { 2026-10-24T21:34:49.3065725Z ·  ────┬──── 2026-10-24T21:34:49.3065854Z · ╰── This is the containing effect 2026-10-24T21:34:49.3065915Z 68 │ setUri(null); 2026-10-24T21:34:49.3065989Z ·  ───┬── 2026-10-24T21:34:49.3066201Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3066302Z 69 │ setError(null); 2026-10-24T21:34:49.3066352Z ╰──── 2026-10-24T21:34:49.3066944Z  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-24T21:34:49.3067324Z  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-24T21:34:49.3067326Z 2026-10-24T21:34:49.3067527Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T21:34:49.3067665Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:91:7] 2026-10-24T21:34:49.3067722Z 90 │ }; 2026-10-24T21:34:49.3067800Z 91 │ }, [attachmentId, fileUri]); 2026-10-24T21:34:49.3067920Z ·  ──────┬───── ───┬─── 2026-10-24T21:34:49.3068098Z · │ ╰── Unnecessary dependency `fileUri` 2026-10-24T21:34:49.3068242Z · ╰── Unnecessary dependency `attachmentId` 2026-10-24T21:34:49.3068377Z 92 │ const mimeType = videoMimeType(attachment) ?? attachment.mimeType; 2026-10-24T21:34:49.3068429Z ╰──── 2026-10-24T21:34:49.3068722Z  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-24T21:34:49.3069032Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.3069036Z 2026-10-24T21:34:49.3069250Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T21:34:49.3069390Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:213:34] 2026-10-24T21:34:49.3069459Z 212 │ useEffect(() => { 2026-10-24T21:34:49.3069572Z 213 │ if (!isFocused && hasSource) props.onRequestClose(); 2026-10-24T21:34:49.3069675Z ·  ──┬── 2026-10-24T21:34:49.3069826Z · ╰── Missing dependency `props` 2026-10-24T21:34:49.3069934Z 214 │ }, [isFocused, hasSource, props.onRequestClose]); 2026-10-24T21:34:49.3070051Z ·  ──────────┬───────── 2026-10-24T21:34:49.3070282Z · ╰── Overly precise dependency `props.onRequestClose`, use `props` instead 2026-10-24T21:34:49.3070357Z 215 │ const { source } = props; 2026-10-24T21:34:49.3070410Z ╰──── 2026-10-24T21:34:49.3070827Z  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-24T21:34:49.3071132Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.3071135Z 2026-10-24T21:34:49.3071474Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T21:34:49.3071652Z ╭─[packages/provider-opencode/src/server/adapter.ts:3755:7] 2026-10-24T21:34:49.3071711Z 3754 │ 2026-10-24T21:34:49.3071907Z 3755 │ const layer: Layer.Layer = 2026-10-24T21:34:49.3071981Z ·  ──┬── 2026-10-24T21:34:49.3072110Z · ╰── 'layer' is declared here 2026-10-24T21:34:49.3072175Z 3756 │ Layer.effect( 2026-10-24T21:34:49.3072228Z ╰──── 2026-10-24T21:34:49.3072333Z  help: Consider removing this declaration. 2026-10-24T21:34:49.3072336Z 2026-10-24T21:34:49.3072552Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T21:34:49.3072728Z ╭─[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:249:7] 2026-10-24T21:34:49.3072813Z 248 │ mountedRef.current = false; 2026-10-24T21:34:49.3072889Z 249 │ flow.setBranchQuery(""); 2026-10-24T21:34:49.3072959Z ·  ──┬─ 2026-10-24T21:34:49.3073085Z · ╰── Missing dependency `flow` 2026-10-24T21:34:49.3073142Z 250 │ }; 2026-10-24T21:34:49.3073214Z 251 │ }, [flow.setBranchQuery]); 2026-10-24T21:34:49.3073303Z ·  ─────────┬───────── 2026-10-24T21:34:49.3073504Z · ╰── Overly precise dependency `flow.setBranchQuery`, use `flow` instead 2026-10-24T21:34:49.3073558Z 252 │ 2026-10-24T21:34:49.3073608Z ╰──── 2026-10-24T21:34:49.3074027Z  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-24T21:34:49.3074338Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.3074340Z 2026-10-24T21:34:49.3074485Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.3074636Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:152:27] 2026-10-24T21:34:49.3074811Z 151 │ 2026-10-24T21:34:49.3074893Z 152 │ {props.children(open)} 2026-10-24T21:34:49.3074986Z ·  ──┬─ 2026-10-24T21:34:49.3075150Z · ╰── Cannot access ref value during render 2026-10-24T21:34:49.3075213Z 153 │ 2026-10-24T21:34:49.3075265Z ╰──── 2026-10-24T21:34:49.3075728Z  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-24T21:34:49.3076016Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.3076019Z 2026-10-24T21:34:49.3076216Z ⚠ react(memo-dependencies): Found missing/extra memoization dependencies 2026-10-24T21:34:49.3076363Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:140:9] 2026-10-24T21:34:49.3076497Z 139 │ if (action.id !== undefined) { 2026-10-24T21:34:49.3076605Z 140 │ props.onPressAction?.({ 2026-10-24T21:34:49.3076677Z ·  ──┬── 2026-10-24T21:34:49.3076804Z · ╰── Missing dependency `props` 2026-10-24T21:34:49.3076898Z 141 │ nativeEvent: { event: action.id }, 2026-10-24T21:34:49.3077043Z 142 │ } as Parameters>[0]); 2026-10-24T21:34:49.3077098Z 143 │ } 2026-10-24T21:34:49.3077151Z 144 │ }, 2026-10-24T21:34:49.3077232Z 145 │ [close, props.onPressAction], 2026-10-24T21:34:49.3077326Z ·  ─────────┬───────── 2026-10-24T21:34:49.3077536Z · ╰── Overly precise dependency `props.onPressAction`, use `props` instead 2026-10-24T21:34:49.3077590Z 146 │ ); 2026-10-24T21:34:49.3077649Z ╰──── 2026-10-24T21:34:49.3078122Z  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-24T21:34:49.3078429Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.3078431Z 2026-10-24T21:34:49.3078684Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T21:34:49.3078837Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:57:5] 2026-10-24T21:34:49.3078890Z 55 │ 2026-10-24T21:34:49.3078956Z 56 │ useEffect(() => { 2026-10-24T21:34:49.3079030Z ·  ────┬──── 2026-10-24T21:34:49.3079160Z · ╰── This is the containing effect 2026-10-24T21:34:49.3079229Z 57 │ setDecodedSize(null); 2026-10-24T21:34:49.3079308Z ·  ───────┬────── 2026-10-24T21:34:49.3079477Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3079547Z 58 │ }, [props.sourceKey]); 2026-10-24T21:34:49.3079599Z ╰──── 2026-10-24T21:34:49.3080187Z  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-24T21:34:49.3080507Z  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-24T21:34:49.3080512Z 2026-10-24T21:34:49.3080762Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T21:34:49.3080913Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5] 2026-10-24T21:34:49.3080966Z 59 │ 2026-10-24T21:34:49.3081031Z 60 │ useEffect(() => { 2026-10-24T21:34:49.3081098Z ·  ────┬──── 2026-10-24T21:34:49.3081236Z · ╰── This is the containing effect 2026-10-24T21:34:49.3081328Z 61 │ setFailedUri(null); 2026-10-24T21:34:49.3081403Z ·  ──────┬───── 2026-10-24T21:34:49.3081610Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3081703Z 62 │ }, [props.uri]); 2026-10-24T21:34:49.3081755Z ╰──── 2026-10-24T21:34:49.3082338Z  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-24T21:34:49.3082656Z  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-24T21:34:49.3082659Z 2026-10-24T21:34:49.3082869Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-24T21:34:49.3083020Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10] 2026-10-24T21:34:49.3083145Z 6 │ import { parse, SvgAst, type JsxAST } from "react-native-svg"; 2026-10-24T21:34:49.3083319Z 7 │ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native"; 2026-10-24T21:34:49.3083406Z ·  ────────┬──────── 2026-10-24T21:34:49.3083555Z · ╰── 'ActivityIndicator' is imported here 2026-10-24T21:34:49.3083609Z 8 │ 2026-10-24T21:34:49.3083661Z ╰──── 2026-10-24T21:34:49.3083760Z  help: Consider removing this import. 2026-10-24T21:34:49.3083763Z 2026-10-24T21:34:49.3083962Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T21:34:49.3084110Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7] 2026-10-24T21:34:49.3084183Z 57 │ setDecodedSize(null); 2026-10-24T21:34:49.3084251Z 58 │ }, [props.sourceKey]); 2026-10-24T21:34:49.3084335Z ·  ───────┬─────── 2026-10-24T21:34:49.3084486Z · ╰── Unnecessary dependency `props.sourceKey` 2026-10-24T21:34:49.3084538Z 59 │ 2026-10-24T21:34:49.3084587Z ╰──── 2026-10-24T21:34:49.3084876Z  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-24T21:34:49.3085183Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.3085185Z 2026-10-24T21:34:49.3085386Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T21:34:49.3085577Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7] 2026-10-24T21:34:49.3085670Z 61 │ setFailedUri(null); 2026-10-24T21:34:49.3085734Z 62 │ }, [props.uri]); 2026-10-24T21:34:49.3085807Z ·  ────┬──── 2026-10-24T21:34:49.3085945Z · ╰── Unnecessary dependency `props.uri` 2026-10-24T21:34:49.3085996Z 63 │ 2026-10-24T21:34:49.3086047Z ╰──── 2026-10-24T21:34:49.3086334Z  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-24T21:34:49.3086635Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.3086637Z 2026-10-24T21:34:49.3086839Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-24T21:34:49.3086962Z ╭─[apps/web/src/contextMenuFallback.test.ts:38:9] 2026-10-24T21:34:49.3087030Z 37 │ get isConnected() { 2026-10-24T21:34:49.3087122Z 38 │ let current: FakeElement | null = this; 2026-10-24T21:34:49.3087192Z ·  ─────── 2026-10-24T21:34:49.3087263Z 39 │ while (current?.parent) { 2026-10-24T21:34:49.3087315Z ╰──── 2026-10-24T21:34:49.3087584Z  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-24T21:34:49.3087587Z 2026-10-24T21:34:49.3087835Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T21:34:49.3088008Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:79:5] 2026-10-24T21:34:49.3088064Z 76 │ 2026-10-24T21:34:49.3088126Z 77 │ useEffect(() => { 2026-10-24T21:34:49.3088195Z ·  ────┬──── 2026-10-24T21:34:49.3088323Z · ╰── This is the containing effect 2026-10-24T21:34:49.3088448Z 78 │ const { host, code } = parsePairingUrl(connectionPairingUrl); 2026-10-24T21:34:49.3088517Z 79 │ setHostInput(host); 2026-10-24T21:34:49.3088589Z ·  ──────┬───── 2026-10-24T21:34:49.3088754Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3088821Z 80 │ setCodeInput(code); 2026-10-24T21:34:49.3088873Z ╰──── 2026-10-24T21:34:49.3089463Z  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-24T21:34:49.3089779Z  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-24T21:34:49.3089781Z 2026-10-24T21:34:49.3090033Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T21:34:49.3090199Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:89:5] 2026-10-24T21:34:49.3090252Z 82 │ 2026-10-24T21:34:49.3090314Z 83 │ useEffect(() => { 2026-10-24T21:34:49.3090383Z ·  ────┬──── 2026-10-24T21:34:49.3090553Z · ╰── This is the containing effect 2026-10-24T21:34:49.3090670Z 84 │ if (routePairingUrl.length === 0) { 2026-10-24T21:34:49.3090730Z 85 │ return; 2026-10-24T21:34:49.3090784Z 86 │ } 2026-10-24T21:34:49.3090836Z 87 │ 2026-10-24T21:34:49.3090951Z 88 │ const { host, code } = parsePairingUrl(routePairingUrl); 2026-10-24T21:34:49.3091016Z 89 │ setHostInput(host); 2026-10-24T21:34:49.3091091Z ·  ──────┬───── 2026-10-24T21:34:49.3091279Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3091348Z 90 │ setCodeInput(code); 2026-10-24T21:34:49.3091398Z ╰──── 2026-10-24T21:34:49.3091984Z  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-24T21:34:49.3092302Z  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-24T21:34:49.3092304Z 2026-10-24T21:34:49.3092557Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T21:34:49.3092723Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:95:7] 2026-10-24T21:34:49.3092775Z 92 │ 2026-10-24T21:34:49.3092839Z 93 │ useEffect(() => { 2026-10-24T21:34:49.3092909Z ·  ────┬──── 2026-10-24T21:34:49.3093039Z · ╰── This is the containing effect 2026-10-24T21:34:49.3093122Z 94 │ if (pairingConnectionError) { 2026-10-24T21:34:49.3093194Z 95 │ setIsSubmitting(false); 2026-10-24T21:34:49.3093276Z ·  ───────┬─────── 2026-10-24T21:34:49.3093445Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3093499Z 96 │ } 2026-10-24T21:34:49.3093549Z ╰──── 2026-10-24T21:34:49.3094138Z  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-24T21:34:49.3094460Z  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-24T21:34:49.3094464Z 2026-10-24T21:34:49.3094618Z ⚠ react(immutability): This value cannot be modified 2026-10-24T21:34:49.3094772Z ╭─[apps/mobile/src/features/connection/ConnectionStatusDot.tsx:58:7] 2026-10-24T21:34:49.3094868Z 53 │ function usePulseAnimation(pulse: boolean) { 2026-10-24T21:34:49.3094961Z 54 │ const pulseProgress = useSharedValue(0); 2026-10-24T21:34:49.3095042Z ·  ──────┬────── 2026-10-24T21:34:49.3095178Z · ╰── `pulseProgress` originates here 2026-10-24T21:34:49.3095232Z 55 │ 2026-10-24T21:34:49.3095295Z 56 │ useEffect(() => { 2026-10-24T21:34:49.3095358Z 57 │ if (pulse) { 2026-10-24T21:34:49.3095444Z 58 │ pulseProgress.value = withRepeat( 2026-10-24T21:34:49.3095578Z ·  ──────┬────── 2026-10-24T21:34:49.3095750Z · ╰── `pulseProgress` cannot be modified 2026-10-24T21:34:49.3095815Z 59 │ withTiming(1, { 2026-10-24T21:34:49.3095867Z ╰──── 2026-10-24T21:34:49.3096127Z  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-24T21:34:49.3096424Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T21:34:49.3096427Z 2026-10-24T21:34:49.3096581Z ⚠ react(immutability): This value cannot be modified 2026-10-24T21:34:49.3096736Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:42:5] 2026-10-24T21:34:49.3096789Z 35 │ 2026-10-24T21:34:49.3096930Z 36 │ const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0); 2026-10-24T21:34:49.3097017Z ·  ────────┬──────── 2026-10-24T21:34:49.3097161Z · ╰── `inspectorProgress` originates here 2026-10-24T21:34:49.3097255Z 37 │ const { renderedInspectorWidth } = props; 2026-10-24T21:34:49.3097388Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-24T21:34:49.3097441Z 39 │ 2026-10-24T21:34:49.3097519Z 40 │ const onClosed = props.onClosed; 2026-10-24T21:34:49.3097583Z 41 │ useEffect(() => { 2026-10-24T21:34:49.3097671Z 42 │ inspectorProgress.value = withTiming( 2026-10-24T21:34:49.3097752Z ·  ────────┬──────── 2026-10-24T21:34:49.3097898Z · ╰── `inspectorProgress` cannot be modified 2026-10-24T21:34:49.3097981Z 43 │ inspectorVisible ? 1 : 0, 2026-10-24T21:34:49.3098036Z ╰──── 2026-10-24T21:34:49.3098292Z  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-24T21:34:49.3098586Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T21:34:49.3098589Z 2026-10-24T21:34:49.3098742Z ⚠ react(immutability): This value cannot be modified 2026-10-24T21:34:49.3098899Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:67:7] 2026-10-24T21:34:49.3098991Z 37 │ const { renderedInspectorWidth } = props; 2026-10-24T21:34:49.3099119Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-24T21:34:49.3099213Z ·  ──────────┬───────── 2026-10-24T21:34:49.3099371Z · ╰── `renderedContentWidth` originates here 2026-10-24T21:34:49.3099423Z 39 │ 2026-10-24T21:34:49.3099501Z 40 │ const onClosed = props.onClosed; 2026-10-24T21:34:49.3099565Z 41 │ useEffect(() => { 2026-10-24T21:34:49.3099652Z 42 │ inspectorProgress.value = withTiming( 2026-10-24T21:34:49.3099727Z 43 │ inspectorVisible ? 1 : 0, 2026-10-24T21:34:49.3099798Z 44 │ WORKSPACE_PANE_TIMING, 2026-10-24T21:34:49.3099862Z 45 │ (finished) => { 2026-10-24T21:34:49.3100000Z 46 │ if (finished === true && !inspectorVisible && onClosed !== undefined) { 2026-10-24T21:34:49.3100071Z 47 │ runOnJS(onClosed)(); 2026-10-24T21:34:49.3100128Z 48 │ } 2026-10-24T21:34:49.3100183Z 49 │ }, 2026-10-24T21:34:49.3100286Z 50 │ ); 2026-10-24T21:34:49.3100444Z 51 │ const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0; 2026-10-24T21:34:49.3100520Z 52 │ renderedInspectorWidth.set( 2026-10-24T21:34:49.3100661Z 53 │ resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING), 2026-10-24T21:34:49.3100715Z 54 │ ); 2026-10-24T21:34:49.3100768Z 55 │ }, [ 2026-10-24T21:34:49.3100834Z 56 │ inspectorProgress, 2026-10-24T21:34:49.3100903Z 57 │ inspectorVisible, 2026-10-24T21:34:49.3100965Z 58 │ inspectorWidth, 2026-10-24T21:34:49.3101023Z 59 │ onClosed, 2026-10-24T21:34:49.3101096Z 60 │ renderedInspectorWidth, 2026-10-24T21:34:49.3101154Z 61 │ resizing, 2026-10-24T21:34:49.3101218Z 62 │ ]); 2026-10-24T21:34:49.3101268Z 63 │ 2026-10-24T21:34:49.3101376Z 64 │ useEffect(() => { 2026-10-24T21:34:49.3101474Z 65 │ const targetWidth = inspectorWidth ?? 0; 2026-10-24T21:34:49.3101562Z 66 │ if (!inspectorVisible || resizing) { 2026-10-24T21:34:49.3101658Z 67 │ renderedContentWidth.value = targetWidth; 2026-10-24T21:34:49.3101744Z ·  ──────────┬───────── 2026-10-24T21:34:49.3101900Z · ╰── `renderedContentWidth` cannot be modified 2026-10-24T21:34:49.3101958Z 68 │ return; 2026-10-24T21:34:49.3102008Z ╰──── 2026-10-24T21:34:49.3102267Z  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-24T21:34:49.3102563Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T21:34:49.3102566Z 2026-10-24T21:34:49.3102814Z ⚠ eslint(no-unused-vars): Function 'normalizeTerminalContextSelection' is declared but never used. 2026-10-24T21:34:49.3102926Z ╭─[apps/web/src/lib/terminalContext.ts:56:10] 2026-10-24T21:34:49.3102978Z 55 │ 2026-10-24T21:34:49.3103075Z 56 │ function normalizeTerminalContextSelection( 2026-10-24T21:34:49.3103185Z ·  ────────────────┬──────────────── 2026-10-24T21:34:49.3103370Z · ╰── 'normalizeTerminalContextSelection' is declared here 2026-10-24T21:34:49.3103456Z 57 │ selection: TerminalContextSelection, 2026-10-24T21:34:49.3103508Z ╰──── 2026-10-24T21:34:49.3103611Z  help: Consider removing this declaration. 2026-10-24T21:34:49.3103613Z 2026-10-24T21:34:49.3103824Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T21:34:49.3103952Z ╭─[apps/web/src/lib/announce.browser.test.ts:41:46] 2026-10-24T21:34:49.3104010Z 40 │ 2026-10-24T21:34:49.3104115Z 41 │ expect(regionTexts()).toEqual([...first].reverse()); 2026-10-24T21:34:49.3104225Z ·  ─────── 2026-10-24T21:34:49.3104319Z 42 │ expect(regionTexts()).toContain("Claude"); 2026-10-24T21:34:49.3104370Z ╰──── 2026-10-24T21:34:49.3104635Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T21:34:49.3104637Z 2026-10-24T21:34:49.3104783Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.3104934Z ╭─[apps/mobile/src/features/home/thread-swipe-actions.tsx:494:27] 2026-10-24T21:34:49.3104994Z 493 │ > 2026-10-24T21:34:49.3105123Z 494 │ {props.children(close)} 2026-10-24T21:34:49.3105245Z ·  ──┬── 2026-10-24T21:34:49.3105402Z · ╰── Cannot access ref value during render 2026-10-24T21:34:49.3105480Z 495 │ 2026-10-24T21:34:49.3105533Z ╰──── 2026-10-24T21:34:49.3105997Z  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-24T21:34:49.3106281Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.3106286Z 2026-10-24T21:34:49.3106489Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T21:34:49.3106624Z ╭─[packages/client-runtime/src/state/usageAccess.ts:3:8] 2026-10-24T21:34:49.3106699Z 2 │ AuthDiagnosticsReadScope, 2026-10-24T21:34:49.3106768Z 3 │ type AuthSessionState, 2026-10-24T21:34:49.3106849Z ·  ────────┬─────── 2026-10-24T21:34:49.3106995Z · ╰── 'AuthSessionState' is imported here 2026-10-24T21:34:49.3107065Z 4 │ sessionGrantsScope, 2026-10-24T21:34:49.3107115Z ╰──── 2026-10-24T21:34:49.3107259Z  help: Consider removing this import. 2026-10-24T21:34:49.3107262Z 2026-10-24T21:34:49.3107450Z ⚠ eslint(no-unused-vars): Identifier 'Arr' is imported but never used. 2026-10-24T21:34:49.3107585Z ╭─[packages/client-runtime/src/state/threadSort.ts:4:13] 2026-10-24T21:34:49.3107706Z 3 │ import type { EnvironmentThreadShell } from "./models.ts"; 2026-10-24T21:34:49.3107784Z 4 │ import * as Arr from "effect/Array"; 2026-10-24T21:34:49.3107857Z ·  ─┬─ 2026-10-24T21:34:49.3107978Z · ╰── 'Arr' is imported here 2026-10-24T21:34:49.3108061Z 5 │ import * as Order from "effect/Order"; 2026-10-24T21:34:49.3108111Z ╰──── 2026-10-24T21:34:49.3108207Z  help: Consider removing this import. 2026-10-24T21:34:49.3108209Z 2026-10-24T21:34:49.3108397Z ⚠ eslint(no-unused-vars): Identifier 'Order' is imported but never used. 2026-10-24T21:34:49.3108527Z ╭─[packages/client-runtime/src/state/threadSort.ts:5:13] 2026-10-24T21:34:49.3108604Z 4 │ import * as Arr from "effect/Array"; 2026-10-24T21:34:49.3108747Z 5 │ import * as Order from "effect/Order"; 2026-10-24T21:34:49.3108861Z ·  ──┬── 2026-10-24T21:34:49.3108991Z · ╰── 'Order' is imported here 2026-10-24T21:34:49.3109043Z 6 │ 2026-10-24T21:34:49.3109094Z ╰──── 2026-10-24T21:34:49.3109189Z  help: Consider removing this import. 2026-10-24T21:34:49.3109192Z 2026-10-24T21:34:49.3109389Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T21:34:49.3109546Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:155:7] 2026-10-24T21:34:49.3109603Z 154 │ } 2026-10-24T21:34:49.3109673Z 155 │ }, [wrappedRender]); 2026-10-24T21:34:49.3109752Z ·  ──────┬────── 2026-10-24T21:34:49.3109908Z · ╰── Unnecessary dependency `wrappedRender` 2026-10-24T21:34:49.3109966Z 156 │ 2026-10-24T21:34:49.3110018Z ╰──── 2026-10-24T21:34:49.3110310Z  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-24T21:34:49.3110616Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.3110618Z 2026-10-24T21:34:49.3110857Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T21:34:49.3111022Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:800:42] 2026-10-24T21:34:49.3111079Z 799 │ > 2026-10-24T21:34:49.3111235Z 800 │ 2026-10-24T21:34:49.3111363Z ·  ──────────────────── 2026-10-24T21:34:49.3111470Z 801 │ 2026-10-24T21:34:49.3111524Z ╰──── 2026-10-24T21:34:49.3111744Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T21:34:49.3111885Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T21:34:49.3111887Z 2026-10-24T21:34:49.3112073Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T21:34:49.3112228Z ╭─[apps/mobile/src/features/threads/ThreadQueueControl.tsx:602:27] 2026-10-24T21:34:49.3112398Z 601 │ const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success)); 2026-10-24T21:34:49.3112481Z 602 │ const gesture = Gesture.Pan() 2026-10-24T21:34:49.3112574Z ·  ─┬─ 2026-10-24T21:34:49.3112717Z · ╰── `Pan` may be a component 2026-10-24T21:34:49.3112793Z 603 │ .enabled(!props.disabled) 2026-10-24T21:34:49.3112845Z ╰──── 2026-10-24T21:34:49.3113117Z  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-24T21:34:49.3113556Z  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-24T21:34:49.3113558Z 2026-10-24T21:34:49.3113832Z ⚠ eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used. 2026-10-24T21:34:49.3113985Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:15:8] 2026-10-24T21:34:49.3114056Z 14 │ threadSearchMatchKey, 2026-10-24T21:34:49.3114142Z 15 │ type EnvironmentThreadSearchMatch, 2026-10-24T21:34:49.3114246Z ·  ──────────────┬───────────── 2026-10-24T21:34:49.3114419Z · ╰── 'EnvironmentThreadSearchMatch' is imported here 2026-10-24T21:34:49.3114530Z 16 │ } from "@t3tools/client-runtime/state/thread-search"; 2026-10-24T21:34:49.3114584Z ╰──── 2026-10-24T21:34:49.3114683Z  help: Consider removing this import. 2026-10-24T21:34:49.3114685Z 2026-10-24T21:34:49.3114883Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T21:34:49.3115018Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:527:25] 2026-10-24T21:34:49.3115154Z 526 │ // range) the boundary string is identical and the chain would die. 2026-10-24T21:34:49.3115247Z 527 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-24T21:34:49.3115350Z ·  ───────┬────── 2026-10-24T21:34:49.3115511Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T21:34:49.3115650Z 528 │ const v2SearchQuery = props.searchQuery.trim().toLocaleLowerCase(); 2026-10-24T21:34:49.3115703Z ╰──── 2026-10-24T21:34:49.3115996Z  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-24T21:34:49.3116308Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.3116313Z 2026-10-24T21:34:49.3116480Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T21:34:49.3116608Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:518:53] 2026-10-24T21:34:49.3116697Z 517 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-24T21:34:49.3116852Z 518 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-24T21:34:49.3116973Z ·  ─────┬──── 2026-10-24T21:34:49.3117139Z · ╰── Cannot call impure function 2026-10-24T21:34:49.3117221Z 519 │ const id = setTimeout(() => { 2026-10-24T21:34:49.3117275Z ╰──── 2026-10-24T21:34:49.3117561Z  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-24T21:34:49.3117855Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T21:34:49.3117858Z 2026-10-24T21:34:49.3118044Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-24T21:34:49.3118170Z ╭─[packages/client-runtime/src/state/shell.ts:189:5] 2026-10-24T21:34:49.3118278Z 186 │ let waiting = yield* Ref.get(awaitingCompletion); 2026-10-24T21:34:49.3118349Z 187 │ let next = initial; 2026-10-24T21:34:49.3118421Z ·  ──┬─ 2026-10-24T21:34:49.3118544Z · ╰── From this accumulator 2026-10-24T21:34:49.3118669Z 188 │ let receivedSnapshot = false; 2026-10-24T21:34:49.3118774Z 189 │ for (const item of items) { 2026-10-24T21:34:49.3118843Z ·  ─┬─ 2026-10-24T21:34:49.3118949Z · ╰── For this loop 2026-10-24T21:34:49.3119037Z 190 │ if (item.kind === "synchronized") { 2026-10-24T21:34:49.3119108Z 191 │ waiting = false; 2026-10-24T21:34:49.3119200Z 192 │ if (Option.isSome(next.snapshot)) { 2026-10-24T21:34:49.3119320Z 193 │ next = { ...next, status: "live", error: Option.none() }; 2026-10-24T21:34:49.3119404Z ·  ───┬─── 2026-10-24T21:34:49.3119540Z · ╰── From this spread 2026-10-24T21:34:49.3119603Z 194 │ } 2026-10-24T21:34:49.3119658Z ╰──── 2026-10-24T21:34:49.3119819Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-24T21:34:49.3119982Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T21:34:49.3119984Z 2026-10-24T21:34:49.3120143Z ⚠ react(immutability): This value cannot be modified 2026-10-24T21:34:49.3120307Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:111:5] 2026-10-24T21:34:49.3120363Z 107 │ ); 2026-10-24T21:34:49.3120520Z 108 │ const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0); 2026-10-24T21:34:49.3120608Z ·  ─────────┬──────── 2026-10-24T21:34:49.3120760Z · ╰── `separationProgress` originates here 2026-10-24T21:34:49.3120813Z 109 │ 2026-10-24T21:34:49.3120883Z 110 │ useEffect(() => { 2026-10-24T21:34:49.3121062Z 111 │ separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING); 2026-10-24T21:34:49.3121150Z ·  ─────────┬──────── 2026-10-24T21:34:49.3121321Z · ╰── `separationProgress` cannot be modified 2026-10-24T21:34:49.3121432Z 112 │ }, [props.showScrollToEnd, separationProgress]); 2026-10-24T21:34:49.3121487Z ╰──── 2026-10-24T21:34:49.3121751Z  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-24T21:34:49.3122052Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T21:34:49.3122058Z 2026-10-24T21:34:49.3122216Z ⚠ react(immutability): This value cannot be modified 2026-10-24T21:34:49.3122383Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-24T21:34:49.3122496Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-24T21:34:49.3122613Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-24T21:34:49.3122693Z ·  ──────┬───── 2026-10-24T21:34:49.3122833Z · ╰── `capsuleWidth` originates here 2026-10-24T21:34:49.3122945Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T21:34:49.3123062Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T21:34:49.3123168Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T21:34:49.3123267Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T21:34:49.3123333Z 134 │ return; 2026-10-24T21:34:49.3123439Z 135 │ } 2026-10-24T21:34:49.3123574Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T21:34:49.3123662Z 137 │ measuredWidthRef.current = width; 2026-10-24T21:34:49.3123802Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T21:34:49.3123880Z ·  ──────┬───── 2026-10-24T21:34:49.3124019Z · ╰── `capsuleWidth` cannot be modified 2026-10-24T21:34:49.3124077Z 139 │ }; 2026-10-24T21:34:49.3124130Z ╰──── 2026-10-24T21:34:49.3124387Z  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-24T21:34:49.3124688Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T21:34:49.3124695Z 2026-10-24T21:34:49.3124852Z ⚠ react(immutability): This value cannot be modified 2026-10-24T21:34:49.3125014Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-24T21:34:49.3125125Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-24T21:34:49.3125237Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-24T21:34:49.3125320Z ·  ──────┬───── 2026-10-24T21:34:49.3125457Z · ╰── `capsuleWidth` originates here 2026-10-24T21:34:49.3125568Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T21:34:49.3125681Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T21:34:49.3125786Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T21:34:49.3125888Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T21:34:49.3125957Z 134 │ return; 2026-10-24T21:34:49.3126011Z 135 │ } 2026-10-24T21:34:49.3126118Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T21:34:49.3126204Z 137 │ measuredWidthRef.current = width; 2026-10-24T21:34:49.3126347Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T21:34:49.3126401Z 139 │ }; 2026-10-24T21:34:49.3126494Z 140 │ const hasStatus = props.status !== null; 2026-10-24T21:34:49.3126629Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-24T21:34:49.3126699Z 142 │ useEffect(() => { 2026-10-24T21:34:49.3126764Z 143 │ if (!hasStatus) { 2026-10-24T21:34:49.3126855Z 144 │ measuredWidthRef.current = null; 2026-10-24T21:34:49.3126935Z 145 │ capsuleWidth.value = null; 2026-10-24T21:34:49.3127019Z ·  ──────┬───── 2026-10-24T21:34:49.3127160Z · ╰── `capsuleWidth` cannot be modified 2026-10-24T21:34:49.3127219Z 146 │ } 2026-10-24T21:34:49.3127273Z ╰──── 2026-10-24T21:34:49.3127532Z  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-24T21:34:49.3127829Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T21:34:49.3127832Z 2026-10-24T21:34:49.3128033Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T21:34:49.3128195Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-24T21:34:49.3128377Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-24T21:34:49.3128475Z 142 │ useEffect(() => { 2026-10-24T21:34:49.3128557Z ·  ───┬─── 2026-10-24T21:34:49.3128778Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-24T21:34:49.3128848Z 143 │ if (!hasStatus) { 2026-10-24T21:34:49.3128935Z 144 │ measuredWidthRef.current = null; 2026-10-24T21:34:49.3129014Z 145 │ capsuleWidth.value = null; 2026-10-24T21:34:49.3129092Z ·  ──────┬───── 2026-10-24T21:34:49.3129229Z · ╰── This modifies `capsuleWidth` 2026-10-24T21:34:49.3129284Z 146 │ } 2026-10-24T21:34:49.3129337Z ╰──── 2026-10-24T21:34:49.3129680Z  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-24T21:34:49.3129982Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T21:34:49.3129984Z 2026-10-24T21:34:49.3130183Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T21:34:49.3130341Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-24T21:34:49.3130456Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T21:34:49.3130575Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T21:34:49.3130702Z ·  ───────────────┬─────────────── 2026-10-24T21:34:49.3130943Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-24T21:34:49.3131054Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T21:34:49.3131151Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T21:34:49.3131228Z 134 │ return; 2026-10-24T21:34:49.3131304Z 135 │ } 2026-10-24T21:34:49.3131410Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T21:34:49.3131497Z 137 │ measuredWidthRef.current = width; 2026-10-24T21:34:49.3131638Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T21:34:49.3131715Z ·  ──────┬───── 2026-10-24T21:34:49.3131851Z · ╰── This modifies `capsuleWidth` 2026-10-24T21:34:49.3131908Z 139 │ }; 2026-10-24T21:34:49.3132032Z ╰──── 2026-10-24T21:34:49.3132392Z  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-24T21:34:49.3132702Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T21:34:49.3132704Z 2026-10-24T21:34:49.3132901Z ⚠ eslint(no-unused-vars): Type 'EnvironmentId' is imported but never used. 2026-10-24T21:34:49.3133041Z ╭─[packages/client-runtime/src/state/sharedSettings.ts:2:3] 2026-10-24T21:34:49.3133105Z 1 │ import type { 2026-10-24T21:34:49.3133170Z 2 │ EnvironmentId, 2026-10-24T21:34:49.3133246Z ·  ──────┬────── 2026-10-24T21:34:49.3133387Z · ╰── 'EnvironmentId' is imported here 2026-10-24T21:34:49.3133473Z 3 │ ExecutionEnvironmentCapabilities, 2026-10-24T21:34:49.3133527Z ╰──── 2026-10-24T21:34:49.3133626Z  help: Consider removing this import. 2026-10-24T21:34:49.3133629Z 2026-10-24T21:34:49.3134092Z ⚠ 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-24T21:34:49.3134247Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1680:7] 2026-10-24T21:34:49.3134338Z 1679 │ yield* harness.replaceSession; 2026-10-24T21:34:49.3134550Z 1680 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T21:34:49.3134710Z 1681 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) { 2026-10-24T21:34:49.3134802Z 1682 │ │ break; 2026-10-24T21:34:49.3134880Z 1683 │ │ } 2026-10-24T21:34:49.3134989Z 1684 │ │ yield* Effect.yieldNow; 2026-10-24T21:34:49.3135125Z 1685 │ ╰─▶ } 2026-10-24T21:34:49.3135201Z 1686 │ yield* Queue.offer( 2026-10-24T21:34:49.3135253Z ╰──── 2026-10-24T21:34:49.3135256Z 2026-10-24T21:34:49.3135712Z ⚠ 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-24T21:34:49.3135872Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1789:7] 2026-10-24T21:34:49.3135967Z 1788 │ yield* harness.replaceSession; 2026-10-24T21:34:49.3136170Z 1789 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T21:34:49.3136330Z 1790 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break; 2026-10-24T21:34:49.3136438Z 1791 │ │ yield* Effect.yieldNow; 2026-10-24T21:34:49.3136571Z 1792 │ ╰─▶ } 2026-10-24T21:34:49.3136703Z 1793 │ expect(yield* Ref.get(harness.subscriptionCount)).toBe(2); 2026-10-24T21:34:49.3136756Z ╰──── 2026-10-24T21:34:49.3136759Z 2026-10-24T21:34:49.3137018Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T21:34:49.3137193Z ╭─[apps/web/src/lib/composerContextReferences.ts:90:40] 2026-10-24T21:34:49.3137271Z 89 │ let cursor = prompt.length; 2026-10-24T21:34:49.3137377Z 90 │ for (const occurrence of occurrences.reverse()) { 2026-10-24T21:34:49.3137487Z ·  ─────── 2026-10-24T21:34:49.3137569Z 91 │ let { start, end } = occurrence; 2026-10-24T21:34:49.3137623Z ╰──── 2026-10-24T21:34:49.3137880Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T21:34:49.3137883Z 2026-10-24T21:34:49.3138086Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T21:34:49.3138223Z ╭─[packages/client-runtime/src/state/filesystem.ts:3:8] 2026-10-24T21:34:49.3138302Z 2 │ AuthFilesystemReadScope, 2026-10-24T21:34:49.3138371Z 3 │ type AuthSessionState, 2026-10-24T21:34:49.3138456Z ·  ────────┬─────── 2026-10-24T21:34:49.3138603Z · ╰── 'AuthSessionState' is imported here 2026-10-24T21:34:49.3138679Z 4 │ type FilesystemBrowseEntry, 2026-10-24T21:34:49.3138730Z ╰──── 2026-10-24T21:34:49.3138828Z  help: Consider removing this import. 2026-10-24T21:34:49.3138831Z 2026-10-24T21:34:49.3139086Z ⚠ eslint(no-unused-vars): Function 'promptResponseHasMissingXAiStopReason' is declared but never used. 2026-10-24T21:34:49.3139245Z ╭─[packages/provider-grok/src/server/xaiAcpExtension.ts:1620:10] 2026-10-24T21:34:49.3139298Z 1619 │ 2026-10-24T21:34:49.3139514Z 1620 │ function promptResponseHasMissingXAiStopReason(response: EffectAcpSchema.PromptResponse): boolean { 2026-10-24T21:34:49.3139638Z ·  ──────────────────┬────────────────── 2026-10-24T21:34:49.3139839Z · ╰── 'promptResponseHasMissingXAiStopReason' is declared here 2026-10-24T21:34:49.3139917Z 1621 │ const meta = response._meta; 2026-10-24T21:34:49.3139969Z ╰──── 2026-10-24T21:34:49.3140076Z  help: Consider removing this declaration. 2026-10-24T21:34:49.3140078Z 2026-10-24T21:34:49.3140221Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.3140338Z ╭─[apps/mobile/src/components/ui/Menu.tsx:54:36] 2026-10-24T21:34:49.3140515Z 53 │ const child = children as ReactElement>; 2026-10-24T21:34:49.3140696Z 54 │ ╭─▶ children = cloneElement(child, { 2026-10-24T21:34:49.3140807Z 55 │ │ onTouchStart: (event) => { 2026-10-24T21:34:49.3140966Z 56 │ │ // Reset for a new touch, not onPressIn, which also fires when a 2026-10-24T21:34:49.3141121Z 57 │ │ // finger moves out of the row and back during the same gesture. 2026-10-24T21:34:49.3141276Z 58 │ │ menuPress.current.isPreparing = false; 2026-10-24T21:34:49.3141446Z 59 │ │ menuPress.current.suppressPress = menuPress.current.isOpen; 2026-10-24T21:34:49.3141560Z 60 │ │ pendingPress.current = null; 2026-10-24T21:34:49.3141678Z 61 │ │ child.props.onTouchStart?.(event); 2026-10-24T21:34:49.3141758Z 62 │ │ }, 2026-10-24T21:34:49.3141907Z 63 │ │ onPress: (event) => { 2026-10-24T21:34:49.3142107Z 64 │ │ // Accessibility clicks have no touch identifier and must not inherit 2026-10-24T21:34:49.3142242Z 65 │ │ // cancellation from a previous physical gesture. 2026-10-24T21:34:49.3142410Z 66 │ │ const isTouch = typeof event.nativeEvent.identifier === "number"; 2026-10-24T21:34:49.3142598Z 67 │ │ if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) { 2026-10-24T21:34:49.3142688Z 68 │ │ return; 2026-10-24T21:34:49.3142764Z 69 │ │ } 2026-10-24T21:34:49.3142904Z 70 │ │ if (isTouch && menuPress.current.isPreparing) { 2026-10-24T21:34:49.3143079Z 71 │ │ // A release can arrive between native menu preparation and display. 2026-10-24T21:34:49.3143248Z 72 │ │ // Let UIKit's display/cancel callback decide this press's outcome. 2026-10-24T21:34:49.3143350Z 73 │ │ event.persist(); 2026-10-24T21:34:49.3143506Z 74 │ │ pendingPress.current = () => child.props.onPress?.(event); 2026-10-24T21:34:49.3143592Z 75 │ │ return; 2026-10-24T21:34:49.3143671Z 76 │ │ } 2026-10-24T21:34:49.3143786Z 77 │ │ child.props.onPress?.(event); 2026-10-24T21:34:49.3143860Z 78 │ │ }, 2026-10-24T21:34:49.3143989Z 79 │ ├─▶ }); 2026-10-24T21:34:49.3144228Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T21:34:49.3144335Z 80 │ menuProps.onMenuInteractionStart = () => { 2026-10-24T21:34:49.3144387Z ╰──── 2026-10-24T21:34:49.3144848Z  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-24T21:34:49.3145136Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.3145138Z 2026-10-24T21:34:49.3145349Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T21:34:49.3145497Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:773:7] 2026-10-24T21:34:49.3145599Z 772 │ if (settingsSheetPresentation.isActive) { 2026-10-24T21:34:49.3145729Z 773 │ settingsRoutePresentation.present(settingsRouteSession); 2026-10-24T21:34:49.3145826Z ·  ────────────┬──────────── 2026-10-24T21:34:49.3145998Z · ╰── Missing dependency `settingsRoutePresentation` 2026-10-24T21:34:49.3146053Z 774 │ } 2026-10-24T21:34:49.3146254Z 775 │ }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]); 2026-10-24T21:34:49.3146364Z ·  ────────────────┬──────────────── 2026-10-24T21:34:49.3146641Z · ╰── Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead 2026-10-24T21:34:49.3146693Z 776 │ 2026-10-24T21:34:49.3146802Z ╰──── 2026-10-24T21:34:49.3147307Z  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-24T21:34:49.3147620Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.3147622Z 2026-10-24T21:34:49.3147780Z ⚠ react(immutability): This value cannot be modified 2026-10-24T21:34:49.3147919Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:391:5] 2026-10-24T21:34:49.3148076Z 387 │ typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0; 2026-10-24T21:34:49.3148214Z 388 │ const animatedBorderRadius = useSharedValue(targetBorderRadius); 2026-10-24T21:34:49.3148308Z ·  ──────────┬───────── 2026-10-24T21:34:49.3148460Z · ╰── `animatedBorderRadius` originates here 2026-10-24T21:34:49.3148617Z 389 │ const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android"; 2026-10-24T21:34:49.3148688Z 390 │ useLayoutEffect(() => { 2026-10-24T21:34:49.3148789Z 391 │ animatedBorderRadius.value = shouldAnimate 2026-10-24T21:34:49.3148876Z ·  ──────────┬───────── 2026-10-24T21:34:49.3149033Z · ╰── `animatedBorderRadius` cannot be modified 2026-10-24T21:34:49.3149122Z 392 │ ? withTiming(targetBorderRadius, { 2026-10-24T21:34:49.3149176Z ╰──── 2026-10-24T21:34:49.3149443Z  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-24T21:34:49.3149746Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T21:34:49.3149749Z 2026-10-24T21:34:49.3150004Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T21:34:49.3150136Z ╭─[packages/provider-grok/src/server/adapter.ts:408:7] 2026-10-24T21:34:49.3150188Z 407 │ 2026-10-24T21:34:49.3150261Z 408 │ const layer: Layer.Layer< 2026-10-24T21:34:49.3150331Z ·  ──┬── 2026-10-24T21:34:49.3150456Z · ╰── 'layer' is declared here 2026-10-24T21:34:49.3150545Z 409 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T21:34:49.3150605Z ╰──── 2026-10-24T21:34:49.3150714Z  help: Consider removing this declaration. 2026-10-24T21:34:49.3150716Z 2026-10-24T21:34:49.3150971Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T21:34:49.3151124Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:570:5] 2026-10-24T21:34:49.3151207Z 568 │ }, []); 2026-10-24T21:34:49.3151277Z 569 │ useEffect(() => { 2026-10-24T21:34:49.3151349Z ·  ────┬──── 2026-10-24T21:34:49.3151477Z · ╰── This is the containing effect 2026-10-24T21:34:49.3151564Z 570 │ setKeyboardStateSuspect(false); 2026-10-24T21:34:49.3151656Z ·  ───────────┬─────────── 2026-10-24T21:34:49.3151891Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3152028Z 571 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-24T21:34:49.3152083Z ╰──── 2026-10-24T21:34:49.3152679Z  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-24T21:34:49.3152998Z  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-24T21:34:49.3153000Z 2026-10-24T21:34:49.3153255Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T21:34:49.3153410Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:966:7] 2026-10-24T21:34:49.3153569Z 963 │ const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0); 2026-10-24T21:34:49.3153638Z 964 │ useEffect(() => { 2026-10-24T21:34:49.3153710Z ·  ────┬──── 2026-10-24T21:34:49.3153836Z · ╰── This is the containing effect 2026-10-24T21:34:49.3153996Z 965 │ if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) { 2026-10-24T21:34:49.3154110Z 966 │ setLastKnownKeyboardHeight(liveKeyboardHeight); 2026-10-24T21:34:49.3154208Z ·  ─────────────┬──────────── 2026-10-24T21:34:49.3154384Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3154440Z 967 │ } 2026-10-24T21:34:49.3154499Z ╰──── 2026-10-24T21:34:49.3155090Z  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-24T21:34:49.3155409Z  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-24T21:34:49.3155411Z 2026-10-24T21:34:49.3155662Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T21:34:49.3155816Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1222:5] 2026-10-24T21:34:49.3155872Z 1220 │ 2026-10-24T21:34:49.3155985Z 1221 │ useEffect(() => { 2026-10-24T21:34:49.3156089Z ·  ────┬──── 2026-10-24T21:34:49.3156222Z · ╰── This is the containing effect 2026-10-24T21:34:49.3156300Z 1222 │ setAnchorMessageId(null); 2026-10-24T21:34:49.3156386Z ·  ─────────┬──────── 2026-10-24T21:34:49.3156554Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3156638Z 1223 │ setSubmittedMessageId(null); 2026-10-24T21:34:49.3156693Z ╰──── 2026-10-24T21:34:49.3157282Z  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-24T21:34:49.3157601Z  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-24T21:34:49.3157604Z 2026-10-24T21:34:49.3157801Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T21:34:49.3157952Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:571:7] 2026-10-24T21:34:49.3158038Z 570 │ setKeyboardStateSuspect(false); 2026-10-24T21:34:49.3158138Z 571 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-24T21:34:49.3158278Z ·  ────────┬──────── ─────────┬──────── 2026-10-24T21:34:49.3158491Z · │ ╰── Unnecessary dependency `liveKeyboardHeight` 2026-10-24T21:34:49.3158652Z · ╰── Unnecessary dependency `isKeyboardVisible` 2026-10-24T21:34:49.3158781Z 572 │ const handleOwnedInputFocusChange = (focused: boolean) => { 2026-10-24T21:34:49.3158835Z ╰──── 2026-10-24T21:34:49.3159122Z  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-24T21:34:49.3159431Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.3159434Z 2026-10-24T21:34:49.3159634Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T21:34:49.3159795Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1170:7] 2026-10-24T21:34:49.3159883Z 1169 │ userInputInsetProgress.set(1); 2026-10-24T21:34:49.3160044Z 1170 │ }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]); 2026-10-24T21:34:49.3160141Z ·  ────────────┬─────────── 2026-10-24T21:34:49.3160319Z · ╰── Unnecessary dependency `activeUserInputRequestId` 2026-10-24T21:34:49.3160422Z 1171 │ const showContent = props.showContent ?? true; 2026-10-24T21:34:49.3160477Z ╰──── 2026-10-24T21:34:49.3160764Z  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-24T21:34:49.3161115Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.3161147Z 2026-10-24T21:34:49.3161369Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T21:34:49.3161527Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1228:15] 2026-10-24T21:34:49.3161598Z 1227 │ freeze.set(false); 2026-10-24T21:34:49.3161682Z 1228 │ }, [freeze, selectedThreadKey]); 2026-10-24T21:34:49.3161779Z ·  ────────┬──────── 2026-10-24T21:34:49.3161941Z · ╰── Unnecessary dependency `selectedThreadKey` 2026-10-24T21:34:49.3161998Z 1229 │ 2026-10-24T21:34:49.3162051Z ╰──── 2026-10-24T21:34:49.3162336Z  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-24T21:34:49.3162643Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.3162652Z 2026-10-24T21:34:49.3162806Z ⚠ react(immutability): This value cannot be modified 2026-10-24T21:34:49.3162959Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1058:5] 2026-10-24T21:34:49.3163071Z 1053 │ const composerPopoverHeight = useSharedValue(0); 2026-10-24T21:34:49.3163179Z 1054 │ const floatingControlCoverage = useSharedValue( 2026-10-24T21:34:49.3163273Z ·  ───────────┬─────────── 2026-10-24T21:34:49.3163437Z · ╰── `floatingControlCoverage` originates here 2026-10-24T21:34:49.3163570Z 1055 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-24T21:34:49.3163633Z 1056 │ ); 2026-10-24T21:34:49.3163702Z 1057 │ useEffect(() => { 2026-10-24T21:34:49.3163809Z 1058 │ floatingControlCoverage.value = withTiming( 2026-10-24T21:34:49.3163904Z ·  ───────────┬─────────── 2026-10-24T21:34:49.3164067Z · ╰── `floatingControlCoverage` cannot be modified 2026-10-24T21:34:49.3164193Z 1059 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-24T21:34:49.3164249Z ╰──── 2026-10-24T21:34:49.3164512Z  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-24T21:34:49.3164809Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T21:34:49.3164812Z 2026-10-24T21:34:49.3164970Z ⚠ react(immutability): This value cannot be modified 2026-10-24T21:34:49.3165125Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1076:7] 2026-10-24T21:34:49.3165313Z 1066 │ const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null; 2026-10-24T21:34:49.3165440Z 1067 │ const combinedContentInsetEndAdjustment = useSharedValue( 2026-10-24T21:34:49.3165551Z ·  ────────────────┬──────────────── 2026-10-24T21:34:49.3165738Z · ╰── `combinedContentInsetEndAdjustment` originates here 2026-10-24T21:34:49.3165870Z 1068 │ Math.max(0, estimatedOverlayHeight - nativeInsetOvercount), 2026-10-24T21:34:49.3165926Z 1069 │ ); 2026-10-24T21:34:49.3165996Z 1070 │ useAnimatedReaction( 2026-10-24T21:34:49.3166113Z 1071 │ () => 2026-10-24T21:34:49.3166254Z 1072 │ contentInsetEndAdjustment.value + 2026-10-24T21:34:49.3166344Z 1073 │ floatingControlCoverage.value + 2026-10-24T21:34:49.3166535Z 1074 │ (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0), 2026-10-24T21:34:49.3166602Z 1075 │ (value) => { 2026-10-24T21:34:49.3166718Z 1076 │ combinedContentInsetEndAdjustment.value = value; 2026-10-24T21:34:49.3166828Z ·  ────────────────┬──────────────── 2026-10-24T21:34:49.3167014Z · ╰── `combinedContentInsetEndAdjustment` cannot be modified 2026-10-24T21:34:49.3167074Z 1077 │ }, 2026-10-24T21:34:49.3167129Z ╰──── 2026-10-24T21:34:49.3167396Z  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-24T21:34:49.3167695Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T21:34:49.3167701Z 2026-10-24T21:34:49.3167952Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T21:34:49.3168128Z ╭─[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:60:5] 2026-10-24T21:34:49.3168184Z 58 │ 2026-10-24T21:34:49.3168250Z 59 │ useEffect(() => { 2026-10-24T21:34:49.3168320Z ·  ────┬──── 2026-10-24T21:34:49.3168453Z · ╰── This is the containing effect 2026-10-24T21:34:49.3168535Z 60 │ setMountedModes((current) => { 2026-10-24T21:34:49.3168621Z ·  ───────┬─────── 2026-10-24T21:34:49.3168788Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3168873Z 61 │ if (current.has(props.mode)) { 2026-10-24T21:34:49.3168928Z ╰──── 2026-10-24T21:34:49.3169510Z  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-24T21:34:49.3169825Z  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-24T21:34:49.3169830Z 2026-10-24T21:34:49.3170087Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T21:34:49.3170251Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-24T21:34:49.3170317Z 259 │ .join("|"); 2026-10-24T21:34:49.3170386Z 260 │ useEffect(() => { 2026-10-24T21:34:49.3170459Z ·  ────┬──── 2026-10-24T21:34:49.3170592Z · ╰── This is the containing effect 2026-10-24T21:34:49.3170654Z 261 │ stop(); 2026-10-24T21:34:49.3170724Z ·  ──┬─ 2026-10-24T21:34:49.3170886Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3170956Z 262 │ }, [orderVersion]); 2026-10-24T21:34:49.3171011Z ╰──── 2026-10-24T21:34:49.3171673Z  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-24T21:34:49.3172014Z  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-24T21:34:49.3172019Z 2026-10-24T21:34:49.3172230Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T21:34:49.3172390Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-24T21:34:49.3172457Z 260 │ useEffect(() => { 2026-10-24T21:34:49.3172520Z 261 │ stop(); 2026-10-24T21:34:49.3172588Z ·  ──┬─ 2026-10-24T21:34:49.3172718Z · ╰── Missing dependency `stop` 2026-10-24T21:34:49.3172787Z 262 │ }, [orderVersion]); 2026-10-24T21:34:49.3172865Z ·  ──────┬───── 2026-10-24T21:34:49.3173013Z · ╰── Unnecessary dependency `orderVersion` 2026-10-24T21:34:49.3173077Z 263 │ useEffect( 2026-10-24T21:34:49.3173131Z ╰──── 2026-10-24T21:34:49.3173542Z  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-24T21:34:49.3173850Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.3173853Z 2026-10-24T21:34:49.3174010Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.3174168Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9] 2026-10-24T21:34:49.3174246Z 95 │ const latest = useRef(props); 2026-10-24T21:34:49.3174315Z 96 │ latest.current = props; 2026-10-24T21:34:49.3174422Z ·  ───┬──────┬─── 2026-10-24T21:34:49.3174602Z · │ ╰── Cannot update ref value during render 2026-10-24T21:34:49.3174718Z · ╰── This value is a ref 2026-10-24T21:34:49.3174786Z 97 │ const gesture = useMemo( 2026-10-24T21:34:49.3174841Z ╰──── 2026-10-24T21:34:49.3175348Z  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-24T21:34:49.3175667Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.3175669Z 2026-10-24T21:34:49.3175814Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.3175973Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18] 2026-10-24T21:34:49.3176042Z 103 │ .runOnJS(true) 2026-10-24T21:34:49.3176143Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T21:34:49.3176262Z ·  ───────────────┬────────────── 2026-10-24T21:34:49.3176464Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T21:34:49.3176603Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T21:34:49.3176657Z ╰──── 2026-10-24T21:34:49.3177117Z  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-24T21:34:49.3177399Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.3177405Z 2026-10-24T21:34:49.3177547Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.3177707Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19] 2026-10-24T21:34:49.3177811Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T21:34:49.3177946Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T21:34:49.3178088Z ·  ──────────────────────────┬───────────────────────── 2026-10-24T21:34:49.3178295Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T21:34:49.3178420Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T21:34:49.3178474Z ╰──── 2026-10-24T21:34:49.3178923Z  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-24T21:34:49.3179214Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.3179219Z 2026-10-24T21:34:49.3179362Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.3179518Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16] 2026-10-24T21:34:49.3179648Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T21:34:49.3179769Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T21:34:49.3179911Z ·  ──────────────────────────┬───────────────────────── 2026-10-24T21:34:49.3180114Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T21:34:49.3180282Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T21:34:49.3180366Z ╰──── 2026-10-24T21:34:49.3180818Z  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-24T21:34:49.3181103Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.3181105Z 2026-10-24T21:34:49.3181258Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.3181453Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21] 2026-10-24T21:34:49.3181573Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T21:34:49.3181701Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T21:34:49.3181843Z ·  ───────────────────────┬────────────────────── 2026-10-24T21:34:49.3182049Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T21:34:49.3182119Z 108 │ [props.disabled], 2026-10-24T21:34:49.3182172Z ╰──── 2026-10-24T21:34:49.3182626Z  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-24T21:34:49.3182918Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.3182923Z 2026-10-24T21:34:49.3183064Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.3183218Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:249:9] 2026-10-24T21:34:49.3183335Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-24T21:34:49.3183443Z 249 │ latest.current = { rows, planners, moveThread }; 2026-10-24T21:34:49.3183551Z ·  ───┬──────┬─── 2026-10-24T21:34:49.3183728Z · │ ╰── Cannot update ref value during render 2026-10-24T21:34:49.3183846Z · ╰── This value is a ref 2026-10-24T21:34:49.3183903Z 250 │ 2026-10-24T21:34:49.3183957Z ╰──── 2026-10-24T21:34:49.3184415Z  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-24T21:34:49.3184701Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.3184703Z 2026-10-24T21:34:49.3184848Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.3185006Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:247:22] 2026-10-24T21:34:49.3185127Z 246 │ const [preview, setPreview] = useState(null); 2026-10-24T21:34:49.3185238Z 247 │ const translateY = useRef(new Animated.Value(0)).current; 2026-10-24T21:34:49.3185412Z ·  ──────────────────┬────────────────── 2026-10-24T21:34:49.3185612Z · ╰── Cannot access ref value during render 2026-10-24T21:34:49.3185725Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-24T21:34:49.3185776Z ╰──── 2026-10-24T21:34:49.3186229Z  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-24T21:34:49.3186512Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.3186515Z 2026-10-24T21:34:49.3186688Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T21:34:49.3186848Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:324:16] 2026-10-24T21:34:49.3186914Z 323 │ update(0); 2026-10-24T21:34:49.3186998Z 324 │ let last = performance.now(); 2026-10-24T21:34:49.3187096Z ·  ────────┬──────── 2026-10-24T21:34:49.3187281Z · ╰── Cannot call impure function 2026-10-24T21:34:49.3187348Z 325 │ const tick = () => { 2026-10-24T21:34:49.3187403Z ╰──── 2026-10-24T21:34:49.3187697Z  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-24T21:34:49.3187986Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T21:34:49.3187994Z 2026-10-24T21:34:49.3188181Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T21:34:49.3188340Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15] 2026-10-24T21:34:49.3188402Z  98 │ () => 2026-10-24T21:34:49.3188471Z  99 │ Gesture.Pan() 2026-10-24T21:34:49.3188546Z ·  ─┬─ 2026-10-24T21:34:49.3188678Z · ╰── `Pan` may be a component 2026-10-24T21:34:49.3188759Z 100 │ .enabled(!props.disabled) 2026-10-24T21:34:49.3188813Z ╰──── 2026-10-24T21:34:49.3189080Z  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-24T21:34:49.3189519Z  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-24T21:34:49.3189524Z 2026-10-24T21:34:49.3189712Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T21:34:49.3189871Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5] 2026-10-24T21:34:49.3189939Z 103 │ .runOnJS(true) 2026-10-24T21:34:49.3190037Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T21:34:49.3190126Z ·  ───┬── 2026-10-24T21:34:49.3190612Z · ╰── 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-24T21:34:49.3190782Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T21:34:49.3190905Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T21:34:49.3191031Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T21:34:49.3191101Z 108 │ [props.disabled], 2026-10-24T21:34:49.3191216Z ·  ────────┬─────── 2026-10-24T21:34:49.3191400Z · ╰── This dependency list is missing values used by the callback 2026-10-24T21:34:49.3191458Z 109 │ ); 2026-10-24T21:34:49.3191511Z ╰──── 2026-10-24T21:34:49.3191715Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T21:34:49.3192027Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.3192032Z 2026-10-24T21:34:49.3192196Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T21:34:49.3192345Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:372:47] 2026-10-24T21:34:49.3192476Z 371 │ const { open, onOpenChange, onSnooze, timestampFormat } = props; 2026-10-24T21:34:49.3192631Z 372 │ const presets = open ? resolveSnoozePresets(new Date(), timestampFormat) : []; 2026-10-24T21:34:49.3192743Z ·  ─────┬──── 2026-10-24T21:34:49.3192904Z · ╰── Cannot call impure function 2026-10-24T21:34:49.3192966Z 373 │ return ( 2026-10-24T21:34:49.3193025Z ╰──── 2026-10-24T21:34:49.3193299Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T21:34:49.3193589Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T21:34:49.3193592Z 2026-10-24T21:34:49.3193758Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T21:34:49.3193903Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:853:39] 2026-10-24T21:34:49.3193998Z 852 │ if (snoozeGateClock.thread !== thread) { 2026-10-24T21:34:49.3194127Z 853 │ setSnoozeGateClock({ thread, now: new Date().toISOString() }); 2026-10-24T21:34:49.3194240Z ·  ─────┬──── 2026-10-24T21:34:49.3194399Z · ╰── Cannot call impure function 2026-10-24T21:34:49.3194458Z 854 │ } 2026-10-24T21:34:49.3194509Z ╰──── 2026-10-24T21:34:49.3194783Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T21:34:49.3195072Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T21:34:49.3195075Z 2026-10-24T21:34:49.3195259Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T21:34:49.3195363Z ╭─[packages/shared/src/qrCode.ts:458:44] 2026-10-24T21:34:49.3195431Z 457 │ ): Array { 2026-10-24T21:34:49.3195586Z 458 │ let result: Array = divisor.map((_) => 0); 2026-10-24T21:34:49.3195722Z ·  ┬ 2026-10-24T21:34:49.3195863Z · ╰── '_' is declared here 2026-10-24T21:34:49.3195938Z 459 │ for (const b of data) { 2026-10-24T21:34:49.3195993Z ╰──── 2026-10-24T21:34:49.3196096Z  help: Consider removing this parameter. 2026-10-24T21:34:49.3196099Z 2026-10-24T21:34:49.3196294Z ⚠ eslint(no-unused-vars): Identifier 'Duration' is imported but never used. 2026-10-24T21:34:49.3196428Z ╭─[packages/provider-pi/src/server/adapter.test.ts:24:13] 2026-10-24T21:34:49.3196526Z 23 │ import * as Deferred from "effect/Deferred"; 2026-10-24T21:34:49.3196625Z 24 │ import * as Duration from "effect/Duration"; 2026-10-24T21:34:49.3196710Z ·  ────┬─── 2026-10-24T21:34:49.3196848Z · ╰── 'Duration' is imported here 2026-10-24T21:34:49.3196939Z 25 │ import * as Effect from "effect/Effect"; 2026-10-24T21:34:49.3230148Z ╰──── 2026-10-24T21:34:49.3230359Z  help: Consider removing this import. 2026-10-24T21:34:49.3230364Z 2026-10-24T21:34:49.3230650Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T21:34:49.3230813Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:361:7] 2026-10-24T21:34:49.3230952Z 355 │ }, [cancelledIncomingShareId, navigation, props.incomingShareId]); 2026-10-24T21:34:49.3231018Z 356 │ useEffect(() => { 2026-10-24T21:34:49.3231096Z ·  ────┬──── 2026-10-24T21:34:49.3231292Z · ╰── This is the containing effect 2026-10-24T21:34:49.3231386Z 357 │ if (!isReturningToProjectPicker) { 2026-10-24T21:34:49.3231447Z 358 │ return; 2026-10-24T21:34:49.3231503Z 359 │ } 2026-10-24T21:34:49.3231599Z 360 │ if (requestedInitialProjectAvailable) { 2026-10-24T21:34:49.3231690Z 361 │ setIsReturningToProjectPicker(false); 2026-10-24T21:34:49.3231794Z ·  ──────────────┬────────────── 2026-10-24T21:34:49.3231974Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3232034Z 362 │ return; 2026-10-24T21:34:49.3232087Z ╰──── 2026-10-24T21:34:49.3232809Z  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-24T21:34:49.3233184Z  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-24T21:34:49.3233187Z 2026-10-24T21:34:49.3233443Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T21:34:49.3233594Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:504:9] 2026-10-24T21:34:49.3233648Z 447 │ 2026-10-24T21:34:49.3233711Z 448 │ useEffect(() => { 2026-10-24T21:34:49.3233783Z ·  ────┬──── 2026-10-24T21:34:49.3233911Z · ╰── This is the containing effect 2026-10-24T21:34:49.3234018Z 449 │ if (props.pendingTaskId || props.draftId) { 2026-10-24T21:34:49.3234077Z 450 │ return; 2026-10-24T21:34:49.3234129Z 451 │ } 2026-10-24T21:34:49.3234269Z 452 │ if (lastInitialProjectRefRef.current !== props.initialProjectRef) { 2026-10-24T21:34:49.3234398Z 453 │ lastInitialProjectRefRef.current = props.initialProjectRef; 2026-10-24T21:34:49.3234504Z 454 │ appliedInitialProjectKeyRef.current = null; 2026-10-24T21:34:49.3234557Z 455 │ } 2026-10-24T21:34:49.3234696Z 456 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-24T21:34:49.3234821Z 457 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-24T21:34:49.3234923Z 458 │ if (initialEnvironmentId && initialProjectId) { 2026-10-24T21:34:49.3234998Z 459 │ const directProject = 2026-10-24T21:34:49.3235064Z 460 │ projects.find( 2026-10-24T21:34:49.3235133Z 461 │ (project) => 2026-10-24T21:34:49.3235306Z 462 │ project.environmentId === initialEnvironmentId && project.id === initialProjectId, 2026-10-24T21:34:49.3235369Z 463 │ ) ?? null; 2026-10-24T21:34:49.3235420Z 464 │ 2026-10-24T21:34:49.3235487Z 465 │ if (directProject) { 2026-10-24T21:34:49.3235625Z 466 │ // Apply the route's project once. Re-applying on every change would 2026-10-24T21:34:49.3235761Z 467 │ // instantly revert environment/project switches made in the picker. 2026-10-24T21:34:49.3235919Z 468 │ const directProjectKey = `${directProject.environmentId}:${directProject.id}`; 2026-10-24T21:34:49.3236051Z 469 │ if (appliedInitialProjectKeyRef.current === directProjectKey) { 2026-10-24T21:34:49.3236115Z 470 │ return; 2026-10-24T21:34:49.3236174Z 471 │ } 2026-10-24T21:34:49.3236275Z 472 │ if (props.initialProjectRef?.branch) { 2026-10-24T21:34:49.3236339Z 473 │ if ( 2026-10-24T21:34:49.3236482Z 474 │ selectedProject?.environmentId !== directProject.environmentId || 2026-10-24T21:34:49.3236580Z 475 │ selectedProject.id !== directProject.id 2026-10-24T21:34:49.3236638Z 476 │ ) { 2026-10-24T21:34:49.3236720Z 477 │ setProject(directProject); 2026-10-24T21:34:49.3236782Z 478 │ return; 2026-10-24T21:34:49.3236839Z 479 │ } 2026-10-24T21:34:49.3236921Z 480 │ if (!flow.draftKey) return; 2026-10-24T21:34:49.3237056Z 481 │ // The route completes checkout before mounting this composer. Local 2026-10-24T21:34:49.3237196Z 482 │ // mode reuses an existing worktree; worktree mode would create another. 2026-10-24T21:34:49.3237303Z 483 │ updateComposerDraftSettings(flow.draftKey, { 2026-10-24T21:34:49.3237437Z 484 │ workspaceSelection: { 2026-10-24T21:34:49.3237532Z 485 │ mode: "local", 2026-10-24T21:34:49.3237636Z 486 │ branch: props.initialProjectRef.branch, 2026-10-24T21:34:49.3237768Z 487 │ worktreePath: props.initialProjectRef.worktreePath ?? null, 2026-10-24T21:34:49.3237847Z 488 │ startFromOrigin: false, 2026-10-24T21:34:49.3237905Z 489 │ }, 2026-10-24T21:34:49.3237963Z 490 │ }); 2026-10-24T21:34:49.3238018Z 491 │ } 2026-10-24T21:34:49.3238142Z 492 │ appliedInitialProjectKeyRef.current = directProjectKey; 2026-10-24T21:34:49.3238199Z 493 │ if ( 2026-10-24T21:34:49.3238339Z 494 │ selectedProject?.environmentId === directProject.environmentId && 2026-10-24T21:34:49.3238434Z 495 │ selectedProject.id === directProject.id 2026-10-24T21:34:49.3238496Z 496 │ ) { 2026-10-24T21:34:49.3238559Z 497 │ return; 2026-10-24T21:34:49.3238613Z 498 │ } 2026-10-24T21:34:49.3238691Z 499 │ setProject(directProject); 2026-10-24T21:34:49.3238750Z 500 │ return; 2026-10-24T21:34:49.3238805Z 501 │ } 2026-10-24T21:34:49.3238856Z 502 │ 2026-10-24T21:34:49.3238931Z 503 │ if (projects.length > 0) { 2026-10-24T21:34:49.3239025Z 504 │ setIsReturningToProjectPicker(true); 2026-10-24T21:34:49.3239133Z ·  ──────────────┬────────────── 2026-10-24T21:34:49.3239314Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3239368Z 505 │ } 2026-10-24T21:34:49.3239418Z ╰──── 2026-10-24T21:34:49.3240016Z  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-24T21:34:49.3240336Z  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-24T21:34:49.3240339Z 2026-10-24T21:34:49.3240593Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T21:34:49.3240742Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:604:5] 2026-10-24T21:34:49.3240793Z 545 │ 2026-10-24T21:34:49.3240857Z 546 │ useEffect(() => { 2026-10-24T21:34:49.3240928Z ·  ────┬──── 2026-10-24T21:34:49.3241060Z · ╰── This is the containing effect 2026-10-24T21:34:49.3241153Z 547 │ const shareId = props.incomingShareId; 2026-10-24T21:34:49.3241270Z 548 │ const draftKey = flow.draftKey; 2026-10-24T21:34:49.3241370Z 549 │ const destinationProject = selectedProject; 2026-10-24T21:34:49.3241506Z 550 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-24T21:34:49.3241630Z 551 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-24T21:34:49.3241716Z 552 │ const selectedProjectMatchesRoute = 2026-10-24T21:34:49.3241792Z 553 │ !initialEnvironmentId || 2026-10-24T21:34:49.3241861Z 554 │ !initialProjectId || 2026-10-24T21:34:49.3241987Z 555 │ (destinationProject?.environmentId === initialEnvironmentId && 2026-10-24T21:34:49.3242090Z 556 │ destinationProject.id === initialProjectId); 2026-10-24T21:34:49.3242191Z 557 │ if ( 2026-10-24T21:34:49.3242279Z 558 │ !shareId || 2026-10-24T21:34:49.3242339Z 559 │ !draftKey || 2026-10-24T21:34:49.3242410Z 560 │ !destinationProject || 2026-10-24T21:34:49.3242494Z 561 │ !selectedProjectMatchesRoute || 2026-10-24T21:34:49.3242580Z 562 │ cancelledIncomingShareId === shareId 2026-10-24T21:34:49.3242634Z 563 │ ) { 2026-10-24T21:34:49.3242692Z 564 │ return; 2026-10-24T21:34:49.3242745Z 565 │ } 2026-10-24T21:34:49.3242837Z 566 │ const importKey = `${shareId}:${draftKey}`; 2026-10-24T21:34:49.3242892Z 567 │ if ( 2026-10-24T21:34:49.3243001Z 568 │ startedShareImportKeyRef.current === importKey || 2026-10-24T21:34:49.3243109Z 569 │ cancellingShareImportKeyRef.current === importKey 2026-10-24T21:34:49.3243161Z 570 │ ) { 2026-10-24T21:34:49.3243226Z 571 │ return; 2026-10-24T21:34:49.3243282Z 572 │ } 2026-10-24T21:34:49.3243333Z 573 │ 2026-10-24T21:34:49.3243399Z 574 │ if (!incomingShare) { 2026-10-24T21:34:49.3243591Z 575 │ if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) { 2026-10-24T21:34:49.3243718Z 576 │ alertedUnavailableIncomingShareIdRef.current = shareId; 2026-10-24T21:34:49.3243782Z 577 │ Dialog.alert( 2026-10-24T21:34:49.3243864Z 578 │ "Shared content unavailable", 2026-10-24T21:34:49.3244038Z 579 │ "The shared content is no longer in the inbox. You can continue editing this task draft.", 2026-10-24T21:34:49.3244095Z 580 │ ); 2026-10-24T21:34:49.3244149Z 581 │ } 2026-10-24T21:34:49.3244205Z 582 │ return; 2026-10-24T21:34:49.3244257Z 583 │ } 2026-10-24T21:34:49.3244308Z 584 │ 2026-10-24T21:34:49.3244367Z 585 │ if ( 2026-10-24T21:34:49.3244527Z 586 │ incomingShare.attachments.some((attachment) => attachment.type === "file") && 2026-10-24T21:34:49.3244627Z 587 │ selectedEnvironmentServerConfig === null 2026-10-24T21:34:49.3244681Z 588 │ ) { 2026-10-24T21:34:49.3244736Z 589 │ return; 2026-10-24T21:34:49.3244790Z 590 │ } 2026-10-24T21:34:49.3244839Z 591 │ 2026-10-24T21:34:49.3244975Z 592 │ if (alertedUnavailableIncomingShareIdRef.current === shareId) { 2026-10-24T21:34:49.3245093Z 593 │ alertedUnavailableIncomingShareIdRef.current = null; 2026-10-24T21:34:49.3245146Z 594 │ } 2026-10-24T21:34:49.3245249Z 595 │ startedShareImportKeyRef.current = importKey; 2026-10-24T21:34:49.3245316Z 596 │ const draftBackup = 2026-10-24T21:34:49.3245498Z 597 │ shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey); 2026-10-24T21:34:49.3245637Z 598 │ shareImportDraftBackupRef.current.set(importKey, draftBackup); 2026-10-24T21:34:49.3245727Z 599 │ const importToken = Symbol(importKey); 2026-10-24T21:34:49.3245802Z 600 │ let didReserveShare = false; 2026-10-24T21:34:49.3245875Z 601 │ let didConsumeShare = false; 2026-10-24T21:34:49.3245954Z 602 │ let needsDraftRestore = false; 2026-10-24T21:34:49.3246066Z 603 │ activeShareImportTokenRef.current = importToken; 2026-10-24T21:34:49.3246147Z 604 │ setImportingShareKey(importKey); 2026-10-24T21:34:49.3246233Z ·  ──────────┬───────── 2026-10-24T21:34:49.3246403Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3246468Z 605 │ void (async () => { 2026-10-24T21:34:49.3246521Z ╰──── 2026-10-24T21:34:49.3247150Z  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-24T21:34:49.3247500Z  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-24T21:34:49.3247503Z 2026-10-24T21:34:49.3247704Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T21:34:49.3247854Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:524:5] 2026-10-24T21:34:49.3247927Z 523 │ props.initialProjectRef, 2026-10-24T21:34:49.3247996Z 524 │ props.incomingShareId, 2026-10-24T21:34:49.3248089Z ·  ──────────┬────────── 2026-10-24T21:34:49.3248254Z · ╰── Unnecessary dependency `props.incomingShareId` 2026-10-24T21:34:49.3248323Z 525 │ props.pendingTaskId, 2026-10-24T21:34:49.3248372Z ╰──── 2026-10-24T21:34:49.3248659Z  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-24T21:34:49.3248965Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.3248969Z 2026-10-24T21:34:49.3249178Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T21:34:49.3249323Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:543:5] 2026-10-24T21:34:49.3249440Z 542 │ loadedBranchesProjectKeyRef.current = projectKey; 2026-10-24T21:34:49.3249508Z 543 │ flow.loadBranches(); 2026-10-24T21:34:49.3249576Z ·  ──┬─ 2026-10-24T21:34:49.3249697Z · ╰── Missing dependency `flow` 2026-10-24T21:34:49.3249788Z 544 │ }, [flow.loadBranches, selectedProject]); 2026-10-24T21:34:49.3249872Z ·  ────────┬──────── 2026-10-24T21:34:49.3250065Z · ╰── Overly precise dependency `flow.loadBranches`, use `flow` instead 2026-10-24T21:34:49.3250116Z 545 │ 2026-10-24T21:34:49.3250165Z ╰──── 2026-10-24T21:34:49.3250584Z  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-24T21:34:49.3250890Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.3250893Z 2026-10-24T21:34:49.3251087Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T21:34:49.3251243Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:766:5] 2026-10-24T21:34:49.3251330Z 765 │ flow.draftKey, 2026-10-24T21:34:49.3251405Z 766 │ hasImportedIncomingShare, 2026-10-24T21:34:49.3251494Z ·  ────────────┬─────────── 2026-10-24T21:34:49.3251665Z · ╰── Unnecessary dependency `hasImportedIncomingShare` 2026-10-24T21:34:49.3251727Z 767 │ incomingShare, 2026-10-24T21:34:49.3251852Z 768 │ isIncomingShareInboxLoading, 2026-10-24T21:34:49.3251978Z ·  ─────────────┬───────────── 2026-10-24T21:34:49.3252153Z · ╰── Unnecessary dependency `isIncomingShareInboxLoading` 2026-10-24T21:34:49.3252230Z 769 │ isIncomingShareUnavailable, 2026-10-24T21:34:49.3252301Z 770 │ props.incomingShareId, 2026-10-24T21:34:49.3252392Z 771 │ props.initialProjectRef?.environmentId, 2026-10-24T21:34:49.3252478Z 772 │ props.initialProjectRef?.projectId, 2026-10-24T21:34:49.3252550Z 773 │ releaseShareReservation, 2026-10-24T21:34:49.3252613Z 774 │ reserveShare, 2026-10-24T21:34:49.3252701Z 775 │ selectedEnvironmentServerConfig, 2026-10-24T21:34:49.3252764Z 776 │ selectedProject, 2026-10-24T21:34:49.3252834Z 777 │ shareImportAttempt, 2026-10-24T21:34:49.3252917Z ·  ─────────┬──────── 2026-10-24T21:34:49.3253083Z · ╰── Unnecessary dependency `shareImportAttempt` 2026-10-24T21:34:49.3253137Z 778 │ ]); 2026-10-24T21:34:49.3253186Z ╰──── 2026-10-24T21:34:49.3253471Z  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-24T21:34:49.3253775Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.3253778Z 2026-10-24T21:34:49.3253976Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-24T21:34:49.3254143Z ╭─[apps/server/src/sourceControl/SourceControlProviderRegistry.ts:15:13] 2026-10-24T21:34:49.3254219Z 14 │ } from "@t3tools/contracts"; 2026-10-24T21:34:49.3254309Z 15 │ import type {} from "@t3tools/contracts"; 2026-10-24T21:34:49.3254377Z ·  ── 2026-10-24T21:34:49.3254428Z 16 │ 2026-10-24T21:34:49.3254479Z ╰──── 2026-10-24T21:34:49.3254558Z  help: Remove empty braces 2026-10-24T21:34:49.3254561Z 2026-10-24T21:34:49.3254796Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T21:34:49.3254949Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:290:50] 2026-10-24T21:34:49.3255008Z 289 │ return ( 2026-10-24T21:34:49.3255140Z 290 │ 2026-10-24T21:34:49.3255258Z ·  ───────────── 2026-10-24T21:34:49.3255372Z 291 │ {props.children} 2026-10-24T21:34:49.3255447Z ╰──── 2026-10-24T21:34:49.3255664Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T21:34:49.3255800Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T21:34:49.3255802Z 2026-10-24T21:34:49.3256036Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T21:34:49.3256187Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:654:44] 2026-10-24T21:34:49.3256245Z 653 │ return ( 2026-10-24T21:34:49.3256362Z 654 │ 2026-10-24T21:34:49.3256475Z ·  ───────────── 2026-10-24T21:34:49.3256541Z 655 │ {props.children} 2026-10-24T21:34:49.3256596Z ╰──── 2026-10-24T21:34:49.3256814Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T21:34:49.3256948Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T21:34:49.3256951Z 2026-10-24T21:34:49.3257183Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T21:34:49.3257339Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1462:55] 2026-10-24T21:34:49.3257399Z 1461 │ return ( 2026-10-24T21:34:49.3257556Z 1462 │ 2026-10-24T21:34:49.3257687Z ·  ──────────────────── 2026-10-24T21:34:49.3257790Z 1463 │ = 2026-10-24T21:34:49.3258881Z ·  ──┬── 2026-10-24T21:34:49.3259009Z · ╰── 'layer' is declared here 2026-10-24T21:34:49.3259074Z 3406 │ Layer.effect( 2026-10-24T21:34:49.3259125Z ╰──── 2026-10-24T21:34:49.3259228Z  help: Consider removing this declaration. 2026-10-24T21:34:49.3259230Z 2026-10-24T21:34:49.3259431Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T21:34:49.3259563Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:454:7] 2026-10-24T21:34:49.3259645Z 453 │ showAuxiliaryPane("inspector"); 2026-10-24T21:34:49.3259749Z 454 │ }, [environmentId, showAuxiliaryPane, threadId]); 2026-10-24T21:34:49.3259891Z ·  ──────┬────── ────┬─── 2026-10-24T21:34:49.3260131Z · │ ╰── Unnecessary dependency `threadId` 2026-10-24T21:34:49.3260303Z · ╰── Unnecessary dependency `environmentId` 2026-10-24T21:34:49.3260362Z 455 │ const { 2026-10-24T21:34:49.3260412Z ╰──── 2026-10-24T21:34:49.3260700Z  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-24T21:34:49.3261005Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.3261008Z 2026-10-24T21:34:49.3261217Z ⚠ react(static-components): Cannot create components during render 2026-10-24T21:34:49.3261349Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:725:20] 2026-10-24T21:34:49.3261416Z 492 │ // same check. 2026-10-24T21:34:49.3261543Z 493 │ const NativeReviewDiffView = resolveNativeReviewDiffView(); 2026-10-24T21:34:49.3261662Z ·  ─────────────┬───────────── 2026-10-24T21:34:49.3261837Z · ╰── The component is created during render here 2026-10-24T21:34:49.3261986Z 494 │ const nativeReviewDiffViewRef = useRef(null); 2026-10-24T21:34:49.3262104Z 495 │ const showcasedReviewDrawRef = useRef(null); 2026-10-24T21:34:49.3262231Z 496 │ const [isPullRefreshing, setIsPullRefreshing] = useState(false); 2026-10-24T21:34:49.3262322Z 497 │ const handlePullToRefresh = async () => { 2026-10-24T21:34:49.3262399Z 498 │ setIsPullRefreshing(true); 2026-10-24T21:34:49.3262480Z 499 │ await refreshSelectedSection(); 2026-10-24T21:34:49.3262560Z 500 │ setIsPullRefreshing(false); 2026-10-24T21:34:49.3262617Z 501 │ }; 2026-10-24T21:34:49.3262755Z 502 │ const reviewFileNavigatorRef = useRef(null); 2026-10-24T21:34:49.3262894Z 503 │ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : []; 2026-10-24T21:34:49.3262998Z 504 │ const fileVisibility = useReviewFileVisibility({ 2026-10-24T21:34:49.3263081Z 505 │ threadKey: reviewCache.threadKey, 2026-10-24T21:34:49.3263168Z 506 │ sectionId: selectedSection?.id ?? null, 2026-10-24T21:34:49.3263233Z 507 │ files: reviewFiles, 2026-10-24T21:34:49.3263331Z 508 │ cachedExpandedFileIds: selectedSection?.id 2026-10-24T21:34:49.3263460Z 509 │ ? reviewCache.expandedFileIdsBySection[selectedSection.id] 2026-10-24T21:34:49.3263522Z 510 │ : undefined, 2026-10-24T21:34:49.3263619Z 511 │ cachedViewedFileIds: selectedSection?.id 2026-10-24T21:34:49.3263744Z 512 │ ? reviewCache.viewedFileIdsBySection[selectedSection.id] 2026-10-24T21:34:49.3263807Z 513 │ : undefined, 2026-10-24T21:34:49.3263861Z 514 │ }); 2026-10-24T21:34:49.3264046Z 515 │ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility; 2026-10-24T21:34:49.3264175Z 516 │ const commentSelection = useReviewCommentSelectionController({ 2026-10-24T21:34:49.3264237Z 517 │ environmentId, 2026-10-24T21:34:49.3264303Z 518 │ threadId, 2026-10-24T21:34:49.3264366Z 519 │ selectedSection, 2026-10-24T21:34:49.3264436Z 520 │ nativeReviewDiffData, 2026-10-24T21:34:49.3264490Z 521 │ }); 2026-10-24T21:34:49.3264597Z 522 │ const nativeBridge = useNativeReviewDiffBridge({ 2026-10-24T21:34:49.3264679Z 523 │ threadKey: reviewCache.threadKey, 2026-10-24T21:34:49.3264820Z 524 │ sectionId: selectedSection?.id ?? null, 2026-10-24T21:34:49.3264922Z 525 │ diff: selectedSection?.diff, 2026-10-24T21:34:49.3264998Z 526 │ data: nativeReviewDiffData, 2026-10-24T21:34:49.3265063Z 527 │ collapsedFileIds, 2026-10-24T21:34:49.3265125Z 528 │ viewedFileIds, 2026-10-24T21:34:49.3265234Z 529 │ selectedRowIds: commentSelection.selectedRowIds, 2026-10-24T21:34:49.3265329Z 530 │ canHighlight: parsedDiff.kind === "files", 2026-10-24T21:34:49.3265382Z 531 │ }); 2026-10-24T21:34:49.3265456Z 532 │ const showcaseReviewKey = 2026-10-24T21:34:49.3265585Z 533 │ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection 2026-10-24T21:34:49.3265790Z 534 │ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}` 2026-10-24T21:34:49.3265848Z 535 │ : null; 2026-10-24T21:34:49.3266017Z 536 │ const handleNativeDebug = (event: NativeSyntheticEvent>) => { 2026-10-24T21:34:49.3266096Z 537 │ nativeBridge.onDebug(event); 2026-10-24T21:34:49.3266150Z 538 │ if ( 2026-10-24T21:34:49.3266229Z 539 │ showcaseReviewKey === null || 2026-10-24T21:34:49.3266351Z 540 │ showcasedReviewDrawRef.current === showcaseReviewKey || 2026-10-24T21:34:49.3266460Z 541 │ !isNativeReviewDiffDrawEvent(event.nativeEvent) 2026-10-24T21:34:49.3266515Z 542 │ ) { 2026-10-24T21:34:49.3266574Z 543 │ return; 2026-10-24T21:34:49.3266626Z 544 │ } 2026-10-24T21:34:49.3266738Z 545 │ showcasedReviewDrawRef.current = showcaseReviewKey; 2026-10-24T21:34:49.3266898Z 546 │ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId }); 2026-10-24T21:34:49.3266952Z 547 │ }; 2026-10-24T21:34:49.3267003Z 548 │ 2026-10-24T21:34:49.3267122Z 549 │ const handleSelectFile = async (fileId: string | null) => { 2026-10-24T21:34:49.3267202Z 550 │ loadVisibleFile(fileId, true); 2026-10-24T21:34:49.3267380Z 551 │ commentSelection.clearSelection(); 2026-10-24T21:34:49.3267499Z 552 │ if (fileId !== null && collapsedFileIds.includes(fileId)) { 2026-10-24T21:34:49.3267577Z 553 │ toggleExpandedFile(fileId); 2026-10-24T21:34:49.3267630Z 554 │ } 2026-10-24T21:34:49.3267741Z 555 │ const nativeView = nativeReviewDiffViewRef.current; 2026-10-24T21:34:49.3267810Z 556 │ if (!nativeView) return; 2026-10-24T21:34:49.3267902Z 557 │ const result = await settlePromise(() => 2026-10-24T21:34:49.3268072Z 558 │ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true), 2026-10-24T21:34:49.3268126Z 559 │ ); 2026-10-24T21:34:49.3268213Z 560 │ if (AsyncResult.isFailure(result)) { 2026-10-24T21:34:49.3268397Z 561 │ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result)); 2026-10-24T21:34:49.3268451Z 562 │ } 2026-10-24T21:34:49.3268507Z 563 │ }; 2026-10-24T21:34:49.3268588Z 564 │ const handleVisibleFileChange = ( 2026-10-24T21:34:49.3268717Z 565 │ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>, 2026-10-24T21:34:49.3268772Z 566 │ ) => { 2026-10-24T21:34:49.3268881Z 567 │ loadVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-24T21:34:49.3269047Z 568 │ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-24T21:34:49.3269100Z 569 │ }; 2026-10-24T21:34:49.3269176Z 570 │ const renderInspector = () => ( 2026-10-24T21:34:49.3269244Z 571 │ void handleSelectFile(fileId)} 2026-10-24T21:34:49.3269844Z 577 │ /> 2026-10-24T21:34:49.3269898Z 578 │ ); 2026-10-24T21:34:49.3269952Z 579 │ 2026-10-24T21:34:49.3270134Z 580 │ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => { 2026-10-24T21:34:49.3270218Z 581 │ const { fileId } = event.nativeEvent; 2026-10-24T21:34:49.3270281Z 582 │ if (fileId) { 2026-10-24T21:34:49.3270367Z 583 │ loadVisibleFile(fileId, true); 2026-10-24T21:34:49.3270443Z 584 │ toggleExpandedFile(fileId); 2026-10-24T21:34:49.3270495Z 585 │ } 2026-10-24T21:34:49.3270549Z 586 │ }; 2026-10-24T21:34:49.3270599Z 587 │ 2026-10-24T21:34:49.3270693Z 588 │ const handleNativeToggleViewedFile = ( 2026-10-24T21:34:49.3270809Z 589 │ event: NativeSyntheticEvent<{ readonly fileId?: string }>, 2026-10-24T21:34:49.3270867Z 590 │ ) => { 2026-10-24T21:34:49.3270951Z 591 │ const { fileId } = event.nativeEvent; 2026-10-24T21:34:49.3271013Z 592 │ if (fileId) { 2026-10-24T21:34:49.3271089Z 593 │ toggleViewedFile(fileId); 2026-10-24T21:34:49.3271142Z 594 │ } 2026-10-24T21:34:49.3271222Z 595 │ }; 2026-10-24T21:34:49.3271272Z 596 │ 2026-10-24T21:34:49.3271343Z 597 │ const parsedDiffNotice = 2026-10-24T21:34:49.3271501Z 598 │ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null; 2026-10-24T21:34:49.3271620Z 599 │ const hasCachedSelectedDiff = selectedSection?.diff != null; 2026-10-24T21:34:49.3271778Z 600 │ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null); 2026-10-24T21:34:49.3271899Z 601 │ const sectionMenu = buildReviewSectionMenu(reviewSections); 2026-10-24T21:34:49.3272057Z 602 │ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({ 2026-10-24T21:34:49.3272164Z 603 │ hasEnvironmentPresentation: environment.isReady, 2026-10-24T21:34:49.3272262Z 604 │ isEnvironmentConnected: isEnvironmentReady, 2026-10-24T21:34:49.3272334Z 605 │ hasCachedSelectedDiff, 2026-10-24T21:34:49.3272400Z 606 │ hasAnyCachedDiff, 2026-10-24T21:34:49.3272453Z 607 │ }); 2026-10-24T21:34:49.3272539Z 608 │ const handleRetryEnvironment = () => { 2026-10-24T21:34:49.3272625Z 609 │ void retryEnvironment(environmentId); 2026-10-24T21:34:49.3272678Z 610 │ }; 2026-10-24T21:34:49.3272760Z 611 │ const handleReturnToThread = () => { 2026-10-24T21:34:49.3272836Z 612 │ if (navigation.canGoBack()) { 2026-10-24T21:34:49.3272911Z 613 │ navigation.goBack(); 2026-10-24T21:34:49.3272971Z 614 │ return; 2026-10-24T21:34:49.3273023Z 615 │ } 2026-10-24T21:34:49.3273101Z 616 │ navigation.navigate("Thread", { 2026-10-24T21:34:49.3273190Z 617 │ environmentId: String(environmentId), 2026-10-24T21:34:49.3273265Z 618 │ threadId: String(threadId), 2026-10-24T21:34:49.3273318Z 619 │ }); 2026-10-24T21:34:49.3273371Z 620 │ }; 2026-10-24T21:34:49.3273450Z 621 │ const androidHeaderSubtitle = [ 2026-10-24T21:34:49.3273521Z 622 │ selectedSection?.title, 2026-10-24T21:34:49.3273598Z 623 │ headerDiffSummary.additions, 2026-10-24T21:34:49.3273676Z 624 │ headerDiffSummary.deletions, 2026-10-24T21:34:49.3273730Z 625 │ ] 2026-10-24T21:34:49.3273834Z 626 │ .filter((part): part is string => Boolean(part)) 2026-10-24T21:34:49.3273894Z 627 │ .join(" · "); 2026-10-24T21:34:49.3273994Z 628 │ 2026-10-24T21:34:49.3274099Z 629 │ const showChangedFilesPane = 2026-10-24T21:34:49.3274169Z 630 │ !showConnectionNotice && 2026-10-24T21:34:49.3274240Z 631 │ selectedSection !== null && 2026-10-24T21:34:49.3274319Z 632 │ parsedDiff.kind === "files" && 2026-10-24T21:34:49.3274396Z 633 │ NativeReviewDiffView !== null; 2026-10-24T21:34:49.3274564Z 634 │ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined); 2026-10-24T21:34:49.3274729Z 635 │ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane; 2026-10-24T21:34:49.3274781Z 636 │ 2026-10-24T21:34:49.3274852Z 637 │ const listHeader = (() => { 2026-10-24T21:34:49.3274939Z 638 │ const children: ReactElement[] = []; 2026-10-24T21:34:49.3274992Z 639 │ 2026-10-24T21:34:49.3275053Z 640 │ if (error) { 2026-10-24T21:34:49.3275124Z 641 │ children.push( 2026-10-24T21:34:49.3275184Z 642 │ 2026-10-24T21:34:49.3275822Z 649 │ Review unavailable 2026-10-24T21:34:49.3275976Z 650 │ {error} 2026-10-24T21:34:49.3276037Z 651 │ , 2026-10-24T21:34:49.3276093Z 652 │ ); 2026-10-24T21:34:49.3276145Z 653 │ } 2026-10-24T21:34:49.3276201Z 654 │ 2026-10-24T21:34:49.3276275Z 655 │ if (parsedDiffNotice) { 2026-10-24T21:34:49.3276433Z 656 │ children.push(); 2026-10-24T21:34:49.3276485Z 657 │ } 2026-10-24T21:34:49.3276534Z 658 │ 2026-10-24T21:34:49.3276611Z 659 │ if (children.length === 0) { 2026-10-24T21:34:49.3276673Z 660 │ return null; 2026-10-24T21:34:49.3276725Z 661 │ } 2026-10-24T21:34:49.3276774Z 662 │ 2026-10-24T21:34:49.3276843Z 663 │ return <>{children}; 2026-10-24T21:34:49.3276898Z 664 │ })(); 2026-10-24T21:34:49.3276965Z 665 │ const headerSubtitle = [ 2026-10-24T21:34:49.3277042Z 666 │ headerDiffSummary.additions, 2026-10-24T21:34:49.3277120Z 667 │ headerDiffSummary.deletions, 2026-10-24T21:34:49.3277200Z 668 │ pendingReviewCommentCount > 0 2026-10-24T21:34:49.3277374Z 669 │ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}` 2026-10-24T21:34:49.3277436Z 670 │ : null, 2026-10-24T21:34:49.3277489Z 671 │ ] 2026-10-24T21:34:49.3277551Z 672 │ .filter(Boolean) 2026-10-24T21:34:49.3277612Z 673 │ .join(" · "); 2026-10-24T21:34:49.3277745Z 674 │ const headerTitleText = selectedSection?.title ?? "Review changes"; 2026-10-24T21:34:49.3277796Z 675 │ 2026-10-24T21:34:49.3277853Z 676 │ return ( 2026-10-24T21:34:49.3277906Z 677 │ <> 2026-10-24T21:34:49.3277969Z 678 │ 2026-10-24T21:34:49.3279325Z 694 │ 2026-10-24T21:34:49.3279390Z 695 │ 2026-10-24T21:34:49.3279513Z 696 │ 2026-10-24T21:34:49.3279595Z 697 │ {showConnectionNotice ? ( 2026-10-24T21:34:49.3279733Z 698 │ 2026-10-24T21:34:49.3279819Z 699 │ 2026-10-24T21:34:49.3280812Z 711 │ 2026-10-24T21:34:49.3280967Z 712 │ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? ( 2026-10-24T21:34:49.3281026Z 713 │ 2026-10-24T21:34:49.3281490Z 719 │ 2026-10-24T21:34:49.3281847Z 723 │ {listHeader} 2026-10-24T21:34:49.3281965Z 724 │ 2026-10-24T21:34:49.3282046Z 725 │ { 2026-10-24T21:34:49.3286885Z ·  ────┬──── 2026-10-24T21:34:49.3287013Z · ╰── This is the containing effect 2026-10-24T21:34:49.3287086Z 2195 │ setExpandedVideo(null); 2026-10-24T21:34:49.3287168Z ·  ────────┬─────── 2026-10-24T21:34:49.3287335Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3287406Z 2196 │ setExpandedFile(null); 2026-10-24T21:34:49.3287458Z ╰──── 2026-10-24T21:34:49.3288049Z  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-24T21:34:49.3288369Z  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-24T21:34:49.3288372Z 2026-10-24T21:34:49.3288622Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T21:34:49.3288753Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2700:9] 2026-10-24T21:34:49.3288890Z 2691 │ const stopFollowingEnd = useEffectEvent(() => setEndFollow(false)); 2026-10-24T21:34:49.3288955Z 2692 │ useEffect(() => { 2026-10-24T21:34:49.3289028Z ·  ────┬──── 2026-10-24T21:34:49.3289154Z · ╰── This is the containing effect 2026-10-24T21:34:49.3289280Z 2693 │ if (!jumpToMessageId || loadedListKey !== listMountKey) return; 2026-10-24T21:34:49.3289373Z 2694 │ const index = presentedFeed.findIndex( 2026-10-24T21:34:49.3289506Z 2695 │ (entry) => entry.type === "message" && entry.id === jumpToMessageId, 2026-10-24T21:34:49.3289559Z 2696 │ ); 2026-10-24T21:34:49.3289630Z 2697 │ if (index === -1) { 2026-10-24T21:34:49.3289756Z 2698 │ const runId = messageFoldRunId(props.feed, jumpToMessageId); 2026-10-24T21:34:49.3289859Z 2699 │ if (runId && !expandedTurnIds.has(runId)) { 2026-10-24T21:34:49.3289950Z 2700 │ setInteractionState((current) => ({ 2026-10-24T21:34:49.3290046Z ·  ─────────┬───────── 2026-10-24T21:34:49.3290222Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3290286Z 2701 │ ...current, 2026-10-24T21:34:49.3290336Z ╰──── 2026-10-24T21:34:49.3290919Z  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-24T21:34:49.3291260Z  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-24T21:34:49.3291262Z 2026-10-24T21:34:49.3291527Z ⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used. 2026-10-24T21:34:49.3291683Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:70:10] 2026-10-24T21:34:49.3291814Z 69 │ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets"; 2026-10-24T21:34:49.3291950Z 70 │ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks"; 2026-10-24T21:34:49.3292046Z ·  ───────────┬─────────── 2026-10-24T21:34:49.3292208Z · ╰── 'isMarkdownFileLinkLabel' is imported here 2026-10-24T21:34:49.3292359Z 71 │ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments"; 2026-10-24T21:34:49.3292409Z ╰──── 2026-10-24T21:34:49.3292504Z  help: Consider removing this import. 2026-10-24T21:34:49.3292507Z 2026-10-24T21:34:49.3292713Z ⚠ eslint(no-unused-vars): Identifier 'createContext' is imported but never used. 2026-10-24T21:34:49.3292842Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:96:3] 2026-10-24T21:34:49.3292896Z 95 │ import { 2026-10-24T21:34:49.3292959Z 96 │ createContext, 2026-10-24T21:34:49.3293034Z ·  ──────┬────── 2026-10-24T21:34:49.3293167Z · ╰── 'createContext' is imported here 2026-10-24T21:34:49.3293222Z 97 │ memo, 2026-10-24T21:34:49.3293271Z ╰──── 2026-10-24T21:34:49.3293365Z  help: Consider removing this import. 2026-10-24T21:34:49.3293367Z 2026-10-24T21:34:49.3293575Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-24T21:34:49.3293709Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:112:3] 2026-10-24T21:34:49.3293771Z 111 │ import { 2026-10-24T21:34:49.3293839Z 112 │ ActivityIndicator, 2026-10-24T21:34:49.3293918Z ·  ────────┬──────── 2026-10-24T21:34:49.3294058Z · ╰── 'ActivityIndicator' is imported here 2026-10-24T21:34:49.3294114Z 113 │ Image, 2026-10-24T21:34:49.3294165Z ╰──── 2026-10-24T21:34:49.3294257Z  help: Consider removing this import. 2026-10-24T21:34:49.3294261Z 2026-10-24T21:34:49.3294455Z ⚠ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used. 2026-10-24T21:34:49.3294583Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:119:3] 2026-10-24T21:34:49.3294643Z 118 │ Pressable, 2026-10-24T21:34:49.3294706Z 119 │ ScrollView, 2026-10-24T21:34:49.3294781Z ·  ─────┬──── 2026-10-24T21:34:49.3294911Z · ╰── 'ScrollView' is imported here 2026-10-24T21:34:49.3294972Z 120 │ StyleSheet, 2026-10-24T21:34:49.3295026Z ╰──── 2026-10-24T21:34:49.3295122Z  help: Consider removing this import. 2026-10-24T21:34:49.3295125Z 2026-10-24T21:34:49.3295317Z ⚠ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used. 2026-10-24T21:34:49.3295446Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:121:11] 2026-10-24T21:34:49.3295505Z 120 │ StyleSheet, 2026-10-24T21:34:49.3295569Z 121 │ Text as NativeText, 2026-10-24T21:34:49.3295646Z ·  ─────┬──── 2026-10-24T21:34:49.3295779Z · ╰── 'NativeText' is imported here 2026-10-24T21:34:49.3295842Z 122 │ type ColorValue, 2026-10-24T21:34:49.3295936Z ╰──── 2026-10-24T21:34:49.3296059Z  help: Consider removing this import. 2026-10-24T21:34:49.3296062Z 2026-10-24T21:34:49.3296271Z ⚠ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used. 2026-10-24T21:34:49.3296402Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:144:10] 2026-10-24T21:34:49.3296533Z 143 │ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic"; 2026-10-24T21:34:49.3296660Z 144 │ import { tryOpenExternalUrl } from "../../lib/openExternalUrl"; 2026-10-24T21:34:49.3296749Z ·  ─────────┬──────── 2026-10-24T21:34:49.3296900Z · ╰── 'tryOpenExternalUrl' is imported here 2026-10-24T21:34:49.3297044Z 145 │ import { downloadAndShareAttachment } from "../../lib/attachmentDownload"; 2026-10-24T21:34:49.3297100Z ╰──── 2026-10-24T21:34:49.3297195Z  help: Consider removing this import. 2026-10-24T21:34:49.3297198Z 2026-10-24T21:34:49.3297411Z ⚠ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used. 2026-10-24T21:34:49.3297538Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:147:10] 2026-10-24T21:34:49.3297671Z 146 │ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks"; 2026-10-24T21:34:49.3297793Z 147 │ import { faviconUrlForOrigin } from "@t3tools/shared/favicon"; 2026-10-24T21:34:49.3297883Z ·  ─────────┬───────── 2026-10-24T21:34:49.3298033Z · ╰── 'faviconUrlForOrigin' is imported here 2026-10-24T21:34:49.3298090Z 148 │ import { 2026-10-24T21:34:49.3298139Z ╰──── 2026-10-24T21:34:49.3298237Z  help: Consider removing this import. 2026-10-24T21:34:49.3298242Z 2026-10-24T21:34:49.3298449Z ⚠ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used. 2026-10-24T21:34:49.3298577Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:161:10] 2026-10-24T21:34:49.3298724Z 160 │ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile"; 2026-10-24T21:34:49.3298856Z 161 │ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer"; 2026-10-24T21:34:49.3298940Z ·  ────────┬─────── 2026-10-24T21:34:49.3299089Z · ╰── 'MediaVideoPlayer' is imported here 2026-10-24T21:34:49.3299225Z 162 │ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia"; 2026-10-24T21:34:49.3299275Z ╰──── 2026-10-24T21:34:49.3299373Z  help: Consider removing this import. 2026-10-24T21:34:49.3299380Z 2026-10-24T21:34:49.3299594Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used. 2026-10-24T21:34:49.3299723Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:165:3] 2026-10-24T21:34:49.3299802Z 164 │ attachmentVideoPreviewSource, 2026-10-24T21:34:49.3299873Z 165 │ mediaVideoPreviewUri, 2026-10-24T21:34:49.3299956Z ·  ──────────┬───────── 2026-10-24T21:34:49.3300105Z · ╰── 'mediaVideoPreviewUri' is imported here 2026-10-24T21:34:49.3300176Z 166 │ mediaVideoThumbnailKey, 2026-10-24T21:34:49.3300224Z ╰──── 2026-10-24T21:34:49.3300318Z  help: Consider removing this import. 2026-10-24T21:34:49.3300321Z 2026-10-24T21:34:49.3300588Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used. 2026-10-24T21:34:49.3300744Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:166:3] 2026-10-24T21:34:49.3300813Z 165 │ mediaVideoPreviewUri, 2026-10-24T21:34:49.3300883Z 166 │ mediaVideoThumbnailKey, 2026-10-24T21:34:49.3300969Z ·  ───────────┬────────── 2026-10-24T21:34:49.3301122Z · ╰── 'mediaVideoThumbnailKey' is imported here 2026-10-24T21:34:49.3301213Z 167 │ type MediaVideoPreviewSource, 2026-10-24T21:34:49.3301261Z ╰──── 2026-10-24T21:34:49.3301385Z  help: Consider removing this import. 2026-10-24T21:34:49.3301388Z 2026-10-24T21:34:49.3301596Z ⚠ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used. 2026-10-24T21:34:49.3301728Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:167:8] 2026-10-24T21:34:49.3301801Z 166 │ mediaVideoThumbnailKey, 2026-10-24T21:34:49.3301878Z 167 │ type MediaVideoPreviewSource, 2026-10-24T21:34:49.3301971Z ·  ───────────┬─────────── 2026-10-24T21:34:49.3302131Z · ╰── 'MediaVideoPreviewSource' is imported here 2026-10-24T21:34:49.3302215Z 168 │ } from "../../lib/videoPreviewSource"; 2026-10-24T21:34:49.3302265Z ╰──── 2026-10-24T21:34:49.3302360Z  help: Consider removing this import. 2026-10-24T21:34:49.3302363Z 2026-10-24T21:34:49.3302558Z ⚠ eslint(no-unused-vars): Type 'ReviewDiffTheme' is imported but never used. 2026-10-24T21:34:49.3302686Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:175:15] 2026-10-24T21:34:49.3302865Z 174 │ import { parseReviewCommentMessageSegments } from "../review/reviewCommentSelection"; 2026-10-24T21:34:49.3303003Z 175 │ import type { ReviewDiffTheme } from "../review/shikiReviewHighlighter"; 2026-10-24T21:34:49.3303092Z ·  ───────┬─────── 2026-10-24T21:34:49.3303236Z · ╰── 'ReviewDiffTheme' is imported here 2026-10-24T21:34:49.3303298Z 176 │ import { 2026-10-24T21:34:49.3303351Z ╰──── 2026-10-24T21:34:49.3303442Z  help: Consider removing this import. 2026-10-24T21:34:49.3303445Z 2026-10-24T21:34:49.3303667Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used. 2026-10-24T21:34:49.3303796Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:190:3] 2026-10-24T21:34:49.3303853Z 189 │ import { 2026-10-24T21:34:49.3303926Z 190 │ resolveMarkdownFontSizes, 2026-10-24T21:34:49.3304019Z ·  ────────────┬─────────── 2026-10-24T21:34:49.3304176Z · ╰── 'resolveMarkdownFontSizes' is imported here 2026-10-24T21:34:49.3304260Z 191 │ resolveNativeMarkdownTypography, 2026-10-24T21:34:49.3304313Z ╰──── 2026-10-24T21:34:49.3304404Z  help: Consider removing this import. 2026-10-24T21:34:49.3304406Z 2026-10-24T21:34:49.3304661Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used. 2026-10-24T21:34:49.3304790Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:197:3] 2026-10-24T21:34:49.3304864Z 196 │ normalizeNativeMarkdownUrl, 2026-10-24T21:34:49.3304956Z 197 │ resolveMarkdownInlineCodePresentation, 2026-10-24T21:34:49.3305064Z ·  ──────────────────┬────────────────── 2026-10-24T21:34:49.3305308Z · ╰── 'resolveMarkdownInlineCodePresentation' is imported here 2026-10-24T21:34:49.3305420Z 198 │ resolveMarkdownLinkPresentation, 2026-10-24T21:34:49.3305468Z ╰──── 2026-10-24T21:34:49.3305563Z  help: Consider removing this import. 2026-10-24T21:34:49.3305566Z 2026-10-24T21:34:49.3305788Z ⚠ eslint(no-unused-vars): Identifier 'useMarkdownCodeHighlight' is imported but never used. 2026-10-24T21:34:49.3305916Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:242:10] 2026-10-24T21:34:49.3306016Z 241 │ import { ThreadMcpApp } from "./McpAppWebView"; 2026-10-24T21:34:49.3306156Z 242 │ import { useMarkdownCodeHighlight } from "./markdownCodeHighlightState"; 2026-10-24T21:34:49.3306254Z ·  ────────────┬─────────── 2026-10-24T21:34:49.3306423Z · ╰── 'useMarkdownCodeHighlight' is imported here 2026-10-24T21:34:49.3306483Z 243 │ import { 2026-10-24T21:34:49.3306532Z ╰──── 2026-10-24T21:34:49.3306625Z  help: Consider removing this import. 2026-10-24T21:34:49.3306627Z 2026-10-24T21:34:49.3306833Z ⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used. 2026-10-24T21:34:49.3306961Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:246:3] 2026-10-24T21:34:49.3307023Z 245 │ useAssetUrl, 2026-10-24T21:34:49.3307091Z 246 │ useAssetUrlState, 2026-10-24T21:34:49.3307169Z ·  ────────┬─────── 2026-10-24T21:34:49.3307363Z · ╰── 'useAssetUrlState' is imported here 2026-10-24T21:34:49.3307429Z 247 │ useRefreshAssetUrl, 2026-10-24T21:34:49.3307484Z ╰──── 2026-10-24T21:34:49.3307579Z  help: Consider removing this import. 2026-10-24T21:34:49.3307581Z 2026-10-24T21:34:49.3307778Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T21:34:49.3307908Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2197:7] 2026-10-24T21:34:49.3307981Z 2196 │ setExpandedFile(null); 2026-10-24T21:34:49.3308136Z 2197 │ }, [props.environmentId, props.threadId, props.contentPresentation.kind]); 2026-10-24T21:34:49.3308358Z ·  ─────────┬───────── ───────┬────── ───────────────┬────────────── 2026-10-24T21:34:49.3308706Z · │ │ ╰── Unnecessary dependency `props.contentPresentation.kind` 2026-10-24T21:34:49.3308935Z · │ ╰── Unnecessary dependency `props.threadId` 2026-10-24T21:34:49.3309097Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-24T21:34:49.3309237Z 2198 │ const horizontalPadding = props.layoutVariant === "split" ? 20 : 16; 2026-10-24T21:34:49.3309289Z ╰──── 2026-10-24T21:34:49.3309577Z  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-24T21:34:49.3309885Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.3309888Z 2026-10-24T21:34:49.3310089Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T21:34:49.3310226Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2669:7] 2026-10-24T21:34:49.3310321Z 2668 │ reportHeaderMaterialVisibility(false); 2026-10-24T21:34:49.3310433Z 2669 │ }, [feedThreadKey, reportHeaderMaterialVisibility]); 2026-10-24T21:34:49.3310513Z ·  ──────┬────── 2026-10-24T21:34:49.3310662Z · ╰── Unnecessary dependency `feedThreadKey` 2026-10-24T21:34:49.3310713Z 2670 │ 2026-10-24T21:34:49.3310764Z ╰──── 2026-10-24T21:34:49.3311051Z  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-24T21:34:49.3311392Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.3311397Z 2026-10-24T21:34:49.3311594Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T21:34:49.3311724Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2685:7] 2026-10-24T21:34:49.3311780Z 2684 │ } 2026-10-24T21:34:49.3311908Z 2685 │ }, [listMountKey, props.contentInsetEndAdjustment, listRef]); 2026-10-24T21:34:49.3311987Z ·  ──────┬───── 2026-10-24T21:34:49.3312129Z · ╰── Unnecessary dependency `listMountKey` 2026-10-24T21:34:49.3312271Z 2686 │ // Opening at a message: its run unfolds, the list stops following the end 2026-10-24T21:34:49.3312322Z ╰──── 2026-10-24T21:34:49.3312613Z  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-24T21:34:49.3312916Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.3312919Z 2026-10-24T21:34:49.3313119Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T21:34:49.3313249Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2881:7] 2026-10-24T21:34:49.3313304Z 2880 │ } 2026-10-24T21:34:49.3313480Z 2881 │ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]); 2026-10-24T21:34:49.3313678Z ·  ───────┬─────── ─────────┬──────── ────────┬─────── 2026-10-24T21:34:49.3313975Z · │ │ ╰── Unnecessary dependency `expandedWorkRows` 2026-10-24T21:34:49.3314207Z · │ ╰── Unnecessary dependency `expandedWorkGroups` 2026-10-24T21:34:49.3314358Z · ╰── Unnecessary dependency `expandedTurnIds` 2026-10-24T21:34:49.3314410Z 2882 │ 2026-10-24T21:34:49.3314460Z ╰──── 2026-10-24T21:34:49.3314746Z  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-24T21:34:49.3315051Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.3315059Z 2026-10-24T21:34:49.3315240Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T21:34:49.3315370Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:627:9] 2026-10-24T21:34:49.3315428Z 626 │ }; 2026-10-24T21:34:49.3315544Z 627 │ }, [props.environmentId, attachment.id, httpBaseUrl]), 2026-10-24T21:34:49.3315731Z ·  ─────────┬───────── ──────┬────── ─────┬───── 2026-10-24T21:34:49.3315964Z · │ │ ╰── Unnecessary dependency `httpBaseUrl` 2026-10-24T21:34:49.3316158Z · │ ╰── Unnecessary dependency `attachment.id` 2026-10-24T21:34:49.3316326Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-24T21:34:49.3316385Z 628 │ ); 2026-10-24T21:34:49.3316435Z ╰──── 2026-10-24T21:34:49.3316743Z  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-24T21:34:49.3317050Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.3317053Z 2026-10-24T21:34:49.3317306Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T21:34:49.3317479Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:60:5] 2026-10-24T21:34:49.3317535Z 55 │ 2026-10-24T21:34:49.3317602Z 56 │ useEffect(() => { 2026-10-24T21:34:49.3317673Z ·  ────┬──── 2026-10-24T21:34:49.3317802Z · ╰── This is the containing effect 2026-10-24T21:34:49.3317868Z 57 │ scheduler.reset(); 2026-10-24T21:34:49.3317966Z 58 │ highlightedRowIdsRef.current = new Set(); 2026-10-24T21:34:49.3318056Z 59 │ visibleChunkIndexRef.current = 0; 2026-10-24T21:34:49.3318170Z 60 │ setVisibleRange({ firstRowIndex: 0, lastRowIndex: 80 }); 2026-10-24T21:34:49.3318249Z ·  ───────┬─────── 2026-10-24T21:34:49.3318414Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3318524Z 61 │ setTokensPatchJson(createEmptyTokenPatch(resetKey)); 2026-10-24T21:34:49.3318574Z ╰──── 2026-10-24T21:34:49.3319205Z  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-24T21:34:49.3319546Z  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-24T21:34:49.3319549Z 2026-10-24T21:34:49.3319745Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T21:34:49.3319916Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:63:7] 2026-10-24T21:34:49.3319995Z 62 │ return () => scheduler.cancel(); 2026-10-24T21:34:49.3320096Z 63 │ }, [enabled, resetKey, rows.length, scheduler]); 2026-10-24T21:34:49.3320221Z ·  ───┬─── ─────┬───── 2026-10-24T21:34:49.3320409Z · │ ╰── Unnecessary dependency `rows.length` 2026-10-24T21:34:49.3320546Z · ╰── Unnecessary dependency `enabled` 2026-10-24T21:34:49.3320597Z 64 │ 2026-10-24T21:34:49.3320648Z ╰──── 2026-10-24T21:34:49.3320935Z  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-24T21:34:49.3321249Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.3321252Z 2026-10-24T21:34:49.3321534Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T21:34:49.3321695Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:444:5] 2026-10-24T21:34:49.3321756Z 434 │ : null; 2026-10-24T21:34:49.3321821Z 435 │ useEffect(() => { 2026-10-24T21:34:49.3321890Z ·  ────┬──── 2026-10-24T21:34:49.3322020Z · ╰── This is the containing effect 2026-10-24T21:34:49.3322076Z 436 │ if ( 2026-10-24T21:34:49.3322153Z 437 │ props.active === false || 2026-10-24T21:34:49.3322227Z 438 │ activeDraftKey !== null || 2026-10-24T21:34:49.3322309Z 439 │ editingPendingTask !== null || 2026-10-24T21:34:49.3322385Z 440 │ selectedProject === null 2026-10-24T21:34:49.3322440Z 441 │ ) { 2026-10-24T21:34:49.3322543Z 442 │ return; 2026-10-24T21:34:49.3322620Z 443 │ } 2026-10-24T21:34:49.3322687Z 444 │ setActiveDraftKey( 2026-10-24T21:34:49.3322767Z ·  ────────┬──────── 2026-10-24T21:34:49.3322932Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3323003Z 445 │ createNewTaskDraft({ 2026-10-24T21:34:49.3323053Z ╰──── 2026-10-24T21:34:49.3323641Z  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-24T21:34:49.3323957Z  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-24T21:34:49.3323964Z 2026-10-24T21:34:49.3324199Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T21:34:49.3324362Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1244:36] 2026-10-24T21:34:49.3324469Z 1243 │ 2026-10-24T21:34:49.3324659Z 1244 │ {props.children} 2026-10-24T21:34:49.3324768Z ·  ───────────── 2026-10-24T21:34:49.3324842Z 1245 │ 2026-10-24T21:34:49.3324893Z ╰──── 2026-10-24T21:34:49.3325118Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T21:34:49.3325253Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T21:34:49.3325256Z 2026-10-24T21:34:49.3325507Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T21:34:49.3325667Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:217:7] 2026-10-24T21:34:49.3325720Z 213 │ }; 2026-10-24T21:34:49.3325784Z 214 │ useEffect(() => { 2026-10-24T21:34:49.3325855Z ·  ────┬──── 2026-10-24T21:34:49.3325987Z · ╰── This is the containing effect 2026-10-24T21:34:49.3326156Z 215 │ const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null; 2026-10-24T21:34:49.3326218Z 216 │ if (inserted) { 2026-10-24T21:34:49.3326298Z 217 │ setSelection((current) => 2026-10-24T21:34:49.3326377Z ·  ──────┬───── 2026-10-24T21:34:49.3326544Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3326711Z 218 │ current.start === inserted.start && current.end === inserted.end ? current : inserted, 2026-10-24T21:34:49.3326761Z ╰──── 2026-10-24T21:34:49.3327351Z  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-24T21:34:49.3327711Z  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-24T21:34:49.3327742Z 2026-10-24T21:34:49.3327991Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T21:34:49.3328151Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:298:7] 2026-10-24T21:34:49.3328227Z 286 │ }, [hasWorkspaceSnapshot]); 2026-10-24T21:34:49.3328291Z 287 │ useEffect(() => { 2026-10-24T21:34:49.3328361Z ·  ────┬──── 2026-10-24T21:34:49.3328488Z · ╰── This is the containing effect 2026-10-24T21:34:49.3328638Z 288 │ if (!environmentId || !projectCwd || !selectedProviderInstanceId) return; 2026-10-24T21:34:49.3328787Z 289 │ const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`; 2026-10-24T21:34:49.3328860Z 290 │ const now = Date.now(); 2026-10-24T21:34:49.3328976Z 291 │ const lastRequest = workspaceRefreshKeyRef.current; 2026-10-24T21:34:49.3329034Z 292 │ if ( 2026-10-24T21:34:49.3329112Z 293 │ lastRequest?.key === key && 2026-10-24T21:34:49.3329247Z 294 │ now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS 2026-10-24T21:34:49.3329299Z 295 │ ) 2026-10-24T21:34:49.3329358Z 296 │ return; 2026-10-24T21:34:49.3329531Z 297 │ if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) { 2026-10-24T21:34:49.3329616Z 298 │ setWorkspaceRefreshRetry(null); 2026-10-24T21:34:49.3329708Z ·  ────────────┬─────────── 2026-10-24T21:34:49.3329883Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3329943Z 299 │ return; 2026-10-24T21:34:49.3329995Z ╰──── 2026-10-24T21:34:49.3330585Z  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-24T21:34:49.3330900Z  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-24T21:34:49.3330903Z 2026-10-24T21:34:49.3331102Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T21:34:49.3331272Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:328:5] 2026-10-24T21:34:49.3331352Z 327 │ }, [ 2026-10-24T21:34:49.3331414Z 328 │ draftMessage, 2026-10-24T21:34:49.3331493Z ·  ──────┬───── 2026-10-24T21:34:49.3331637Z · ╰── Unnecessary dependency `draftMessage` 2026-10-24T21:34:49.3331701Z 329 │ environmentId, 2026-10-24T21:34:49.3331749Z ╰──── 2026-10-24T21:34:49.3332036Z  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-24T21:34:49.3332341Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.3332344Z 2026-10-24T21:34:49.3332539Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T21:34:49.3332732Z ╭─[apps/mobile/src/state/use-thread-outbox-drain.ts:1321:5] 2026-10-24T21:34:49.3332841Z 1320 │ queuedMessagesByThreadKey, 2026-10-24T21:34:49.3332907Z 1321 │ retryTick, 2026-10-24T21:34:49.3332981Z ·  ────┬──── 2026-10-24T21:34:49.3333117Z · ╰── Unnecessary dependency `retryTick` 2026-10-24T21:34:49.3333189Z 1322 │ restoreQueuedMessage, 2026-10-24T21:34:49.3333243Z ╰──── 2026-10-24T21:34:49.3333531Z  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-24T21:34:49.3333837Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.3333840Z 2026-10-24T21:34:49.3334033Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T21:34:49.3334191Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:223:31] 2026-10-24T21:34:49.3334304Z 222 │ ? snippetTokens.map((line, lineIndex) => ( 2026-10-24T21:34:49.3334405Z 223 │ 2026-10-24T21:34:49.3334511Z ·  ─────────────── 2026-10-24T21:34:49.3334609Z 224 │ {lineIndex > 0 ? "\n" : ""} 2026-10-24T21:34:49.3334666Z ╰──── 2026-10-24T21:34:49.3334814Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T21:34:49.3334816Z 2026-10-24T21:34:49.3335005Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T21:34:49.3335161Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25] 2026-10-24T21:34:49.3335244Z 226 │ { 2026-10-24T21:34:49.3336355Z ·  ────┬──── 2026-10-24T21:34:49.3336488Z · ╰── This is the containing effect 2026-10-24T21:34:49.3336570Z 106 │ clearReviewCommentTarget(); 2026-10-24T21:34:49.3336671Z 107 │ setPendingNativeCommentSelection(null); 2026-10-24T21:34:49.3336774Z ·  ────────────────┬─────────────── 2026-10-24T21:34:49.3336951Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3337027Z 108 │ }, [selectedSection?.id]); 2026-10-24T21:34:49.3337080Z ╰──── 2026-10-24T21:34:49.3337719Z  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-24T21:34:49.3338062Z  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-24T21:34:49.3338065Z 2026-10-24T21:34:49.3338319Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T21:34:49.3338509Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7] 2026-10-24T21:34:49.3338567Z 109 │ 2026-10-24T21:34:49.3338634Z 110 │ useEffect(() => { 2026-10-24T21:34:49.3338707Z ·  ────┬──── 2026-10-24T21:34:49.3338839Z · ╰── This is the containing effect 2026-10-24T21:34:49.3338952Z 111 │ if (activeCommentTarget === null) { 2026-10-24T21:34:49.3339072Z 112 │ setPendingNativeCommentSelection(null); 2026-10-24T21:34:49.3339250Z ·  ────────────────┬─────────────── 2026-10-24T21:34:49.3339469Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3339552Z 113 │ } 2026-10-24T21:34:49.3339616Z ╰──── 2026-10-24T21:34:49.3340222Z  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-24T21:34:49.3340586Z  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-24T21:34:49.3340594Z 2026-10-24T21:34:49.3340822Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T21:34:49.3341083Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7] 2026-10-24T21:34:49.3341222Z 107 │ setPendingNativeCommentSelection(null); 2026-10-24T21:34:49.3341334Z 108 │ }, [selectedSection?.id]); 2026-10-24T21:34:49.3341459Z ·  ─────────┬───────── 2026-10-24T21:34:49.3341656Z · ╰── Unnecessary dependency `selectedSection?.id` 2026-10-24T21:34:49.3341723Z 109 │ 2026-10-24T21:34:49.3341802Z ╰──── 2026-10-24T21:34:49.3342140Z  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-24T21:34:49.3342479Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.3342485Z 2026-10-24T21:34:49.3342766Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T21:34:49.3342912Z ╭─[apps/mobile/src/state/use-vcs-action-state.ts:86:5] 2026-10-24T21:34:49.3343050Z 83 │ const [nowMs, setNowMs] = useState(() => Date.now()); 2026-10-24T21:34:49.3343152Z 84 │ useEffect(() => { 2026-10-24T21:34:49.3343254Z ·  ────┬──── 2026-10-24T21:34:49.3343394Z · ╰── This is the containing effect 2026-10-24T21:34:49.3343507Z 85 │ if (!actionState.isRunning) return; 2026-10-24T21:34:49.3343623Z 86 │ setNowMs(Date.now()); 2026-10-24T21:34:49.3343812Z ·  ────┬─── 2026-10-24T21:34:49.3344036Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3344189Z 87 │ const interval = setInterval(() => setNowMs(Date.now()), 1000); 2026-10-24T21:34:49.3344270Z ╰──── 2026-10-24T21:34:49.3344893Z  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-24T21:34:49.3345240Z  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-24T21:34:49.3345242Z 2026-10-24T21:34:49.3345426Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T21:34:49.3345568Z ╭─[apps/web/src/components/Sidebar.tsx:1136:11] 2026-10-24T21:34:49.3345715Z 1135 │ foldSearchQuery(threadSearchQuery), 2026-10-24T21:34:49.3345819Z 1136 │ Date.now(), 2026-10-24T21:34:49.3345914Z ·  ─────┬──── 2026-10-24T21:34:49.3346078Z · ╰── Cannot call impure function 2026-10-24T21:34:49.3346247Z 1137 │ // A list filter, as on mobile: a pick would move rows unexplained. 2026-10-24T21:34:49.3346343Z ╰──── 2026-10-24T21:34:49.3346641Z  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-24T21:34:49.3346965Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T21:34:49.3346970Z 2026-10-24T21:34:49.3347299Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T21:34:49.3347513Z ╭─[apps/mobile/src/features/review/ReviewCommentComposerSheet.tsx:103:7] 2026-10-24T21:34:49.3347645Z 100 │ 2026-10-24T21:34:49.3347727Z 101 │ useEffect(() => { 2026-10-24T21:34:49.3347829Z ·  ────┬──── 2026-10-24T21:34:49.3347991Z · ╰── This is the containing effect 2026-10-24T21:34:49.3348136Z 102 │ if (!target || selectedLines.length === 0) { 2026-10-24T21:34:49.3348235Z 103 │ setHighlightedLinesById({}); 2026-10-24T21:34:49.3348423Z ·  ───────────┬─────────── 2026-10-24T21:34:49.3348668Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3348774Z 104 │ return; 2026-10-24T21:34:49.3348838Z ╰──── 2026-10-24T21:34:49.3349455Z  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-24T21:34:49.3349802Z  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-24T21:34:49.3349804Z 2026-10-24T21:34:49.3350056Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T21:34:49.3350231Z ╭─[apps/mobile/src/state/use-model-option-memory.ts:21:7] 2026-10-24T21:34:49.3350311Z 20 │ [instanceId]: { 2026-10-24T21:34:49.3350424Z 21 │ ...(state[instanceId] ?? {}), 2026-10-24T21:34:49.3350548Z ·  ──────────────────────────── 2026-10-24T21:34:49.3350713Z 22 │ [model]: options, 2026-10-24T21:34:49.3350778Z ╰──── 2026-10-24T21:34:49.3351068Z  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-24T21:34:49.3351071Z 2026-10-24T21:34:49.3351294Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T21:34:49.3351463Z ╭─[apps/web/src/components/CustomSnoozeDialog.tsx:140:58] 2026-10-24T21:34:49.3351638Z 139 │ {...(weekStartsOn === undefined ? {} : { weekStartsOn })} 2026-10-24T21:34:49.3351798Z 140 │ disabled={{ before: new Date(new Date().setHours(0, 0, 0, 0)) }} 2026-10-24T21:34:49.3351957Z ·  ─────┬──── 2026-10-24T21:34:49.3352147Z · ╰── Cannot call impure function 2026-10-24T21:34:49.3352297Z 141 │ onSelect={(selected) => { 2026-10-24T21:34:49.3352362Z ╰──── 2026-10-24T21:34:49.3352671Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T21:34:49.3352995Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T21:34:49.3353000Z 2026-10-24T21:34:49.3353280Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T21:34:49.3353478Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:279:5] 2026-10-24T21:34:49.3353614Z 277 │ const [snoozeWakeTick, bumpSnoozeWakeTick] = useState(0); 2026-10-24T21:34:49.3353713Z 278 │ useEffect(() => { 2026-10-24T21:34:49.3353845Z ·  ────┬──── 2026-10-24T21:34:49.3354023Z · ╰── This is the containing effect 2026-10-24T21:34:49.3354123Z 279 │ setNow(new Date().toISOString()); 2026-10-24T21:34:49.3354226Z ·  ───┬── 2026-10-24T21:34:49.3354471Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3354667Z 280 │ const id = setInterval(() => setNow(new Date().toISOString()), 60_000); 2026-10-24T21:34:49.3354744Z ╰──── 2026-10-24T21:34:49.3355365Z  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-24T21:34:49.3355708Z  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-24T21:34:49.3355710Z 2026-10-24T21:34:49.3355956Z ⚠ eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used. 2026-10-24T21:34:49.3356171Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:13:8] 2026-10-24T21:34:49.3356257Z 12 │ threadSearchMatchKey, 2026-10-24T21:34:49.3356374Z 13 │ type EnvironmentThreadSearchMatch, 2026-10-24T21:34:49.3356506Z ·  ──────────────┬───────────── 2026-10-24T21:34:49.3356717Z · ╰── 'EnvironmentThreadSearchMatch' is imported here 2026-10-24T21:34:49.3356850Z 14 │ } from "@t3tools/client-runtime/state/thread-search"; 2026-10-24T21:34:49.3356929Z ╰──── 2026-10-24T21:34:49.3357112Z  help: Consider removing this import. 2026-10-24T21:34:49.3357114Z 2026-10-24T21:34:49.3357336Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T21:34:49.3357550Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:359:25] 2026-10-24T21:34:49.3357701Z 358 │ // range) the boundary string is identical and the chain would die. 2026-10-24T21:34:49.3357825Z 359 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-24T21:34:49.3357962Z ·  ───────┬────── 2026-10-24T21:34:49.3358162Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T21:34:49.3358295Z 360 │ const listItems = ((): readonly SidebarListItem[] => { 2026-10-24T21:34:49.3358378Z ╰──── 2026-10-24T21:34:49.3358698Z  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-24T21:34:49.3359030Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.3359038Z 2026-10-24T21:34:49.3359248Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T21:34:49.3359423Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:350:53] 2026-10-24T21:34:49.3359540Z 349 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-24T21:34:49.3359728Z 350 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-24T21:34:49.3359877Z ·  ─────┬──── 2026-10-24T21:34:49.3360061Z · ╰── Cannot call impure function 2026-10-24T21:34:49.3360171Z 351 │ const id = setTimeout(() => { 2026-10-24T21:34:49.3360299Z ╰──── 2026-10-24T21:34:49.3360653Z  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-24T21:34:49.3360995Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T21:34:49.3361022Z 2026-10-24T21:34:49.3361245Z ⚠ eslint(no-unused-vars): Type 'Scope' is imported but never used. 2026-10-24T21:34:49.3361413Z ╭─[apps/server/src/provider/ProviderAuthService.ts:15:18] 2026-10-24T21:34:49.3361533Z 14 │ import * as Layer from "effect/Layer"; 2026-10-24T21:34:49.3361658Z 15 │ import type * as Scope from "effect/Scope"; 2026-10-24T21:34:49.3361759Z ·  ──┬── 2026-10-24T21:34:49.3361922Z · ╰── 'Scope' is imported here 2026-10-24T21:34:49.3362045Z 16 │ import * as Stream from "effect/Stream"; 2026-10-24T21:34:49.3362120Z ╰──── 2026-10-24T21:34:49.3362249Z  help: Consider removing this import. 2026-10-24T21:34:49.3362252Z 2026-10-24T21:34:49.3362543Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T21:34:49.3362729Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:40:5] 2026-10-24T21:34:49.3362867Z 37 │ const [initialized, setInitialized] = useState(false); 2026-10-24T21:34:49.3362943Z 38 │ useLayoutEffect(() => { 2026-10-24T21:34:49.3363117Z ·  ───────┬─────── 2026-10-24T21:34:49.3363276Z · ╰── This is the containing effect 2026-10-24T21:34:49.3363365Z 39 │ reset(); 2026-10-24T21:34:49.3363446Z 40 │ setInitialized(true); 2026-10-24T21:34:49.3363562Z ·  ───────┬────── 2026-10-24T21:34:49.3363772Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3363863Z 41 │ }, [reset]); 2026-10-24T21:34:49.3363928Z ╰──── 2026-10-24T21:34:49.3364540Z  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-24T21:34:49.3364905Z  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-24T21:34:49.3364908Z 2026-10-24T21:34:49.3365193Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T21:34:49.3365381Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:93:5] 2026-10-24T21:34:49.3365456Z 88 │ 2026-10-24T21:34:49.3365550Z 89 │ useEffect(() => { 2026-10-24T21:34:49.3365654Z ·  ────┬──── 2026-10-24T21:34:49.3365812Z · ╰── This is the containing effect 2026-10-24T21:34:49.3365998Z 90 │ if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return; 2026-10-24T21:34:49.3366112Z 91 │ const branchName = initialProjectRef.branch; 2026-10-24T21:34:49.3366263Z 92 │ let active = true; 2026-10-24T21:34:49.3366387Z 93 │ setPendingCheckouts((count) => count + 1); 2026-10-24T21:34:49.3366506Z ·  ─────────┬───────── 2026-10-24T21:34:49.3366745Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3366958Z 94 │ // Serialize replacements: ignoring a stale result cannot undo its Git mutation. 2026-10-24T21:34:49.3367043Z ╰──── 2026-10-24T21:34:49.3367661Z  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-24T21:34:49.3367988Z  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-24T21:34:49.3368007Z 2026-10-24T21:34:49.3368233Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T21:34:49.3368414Z ╭─[apps/mobile/src/state/use-composer-drafts.ts:1022:15] 2026-10-24T21:34:49.3368514Z 1021 │ instanceId, 2026-10-24T21:34:49.3368686Z 1022 │ { ...(persisted.modelOptionMemory[instanceId] ?? {}), ...models }, 2026-10-24T21:34:49.3368838Z ·  ────────────────────────────────────────────────── 2026-10-24T21:34:49.3368942Z 1023 │ ]), 2026-10-24T21:34:49.3369031Z ╰──── 2026-10-24T21:34:49.3369328Z  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-24T21:34:49.3369331Z 2026-10-24T21:34:49.3369765Z ⚠ 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-24T21:34:49.3369906Z ╭─[apps/server/src/vcs/GitVcsDriverCore.test.ts:1786:34] 2026-10-24T21:34:49.3370088Z 1785 │ const stat = branch.files!.find((file) => file.path === path)!; 2026-10-24T21:34:49.3370265Z 1786 │ const request = yield* Schema.decodeEffect(ReviewDiffPreviewInput)({ 2026-10-24T21:34:49.3370408Z ·  ─────────────────── 2026-10-24T21:34:49.3370485Z 1787 │ cwd, 2026-10-24T21:34:49.3370570Z ╰──── 2026-10-24T21:34:49.3370573Z 2026-10-24T21:34:49.3370813Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T21:34:49.3370959Z ╭─[apps/mobile/src/state/thread-order.ts:29:7] 2026-10-24T21:34:49.3371048Z 28 │ getPendingThreadOrder(); 2026-10-24T21:34:49.3371157Z 29 │ }, [nowMinute, snoozeWakeTick]); 2026-10-24T21:34:49.3371365Z ·  ────┬──── ───────┬────── 2026-10-24T21:34:49.3371586Z · │ ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T21:34:49.3371737Z · ╰── Unnecessary dependency `nowMinute` 2026-10-24T21:34:49.3371832Z 30 │ return pending; 2026-10-24T21:34:49.3371915Z ╰──── 2026-10-24T21:34:49.3372246Z  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-24T21:34:49.3372584Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.3372587Z 2026-10-24T21:34:49.3372923Z ⚠ eslint(no-unneeded-ternary): Unnecessary use of boolean literals in conditional expression 2026-10-24T21:34:49.3373111Z ╭─[packages/shared/src/serverSettings.test.ts:35:7] 2026-10-24T21:34:49.3373337Z 34 │ const fallback = fallbackTextGenerationModelSelection(providerInstances, (instanceId) => 2026-10-24T21:34:49.3373463Z 35 │ instanceId === configured ? true : false, 2026-10-24T21:34:49.3373592Z ·  ──────────────────────────────────────── 2026-10-24T21:34:49.3373682Z 36 │ ); 2026-10-24T21:34:49.3373770Z ╰──── 2026-10-24T21:34:49.3373904Z  help: Remove this ternary operator 2026-10-24T21:34:49.3373907Z 2026-10-24T21:34:49.3374265Z ⚠ 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-24T21:34:49.3374430Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:50:18] 2026-10-24T21:34:49.3374613Z 49 │ for (const tool of ["sendMessage", "followupTask", "interruptAgent", "listAgents"]) { 2026-10-24T21:34:49.3374829Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-24T21:34:49.3374943Z ·  ───────── 2026-10-24T21:34:49.3375134Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-24T21:34:49.3375219Z ╰──── 2026-10-24T21:34:49.3375222Z 2026-10-24T21:34:49.3375580Z ⚠ 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-24T21:34:49.3375756Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:51:18] 2026-10-24T21:34:49.3376017Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-24T21:34:49.3376208Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-24T21:34:49.3376312Z ·  ───────── 2026-10-24T21:34:49.3376409Z 52 │ } 2026-10-24T21:34:49.3376490Z ╰──── 2026-10-24T21:34:49.3376493Z 2026-10-24T21:34:49.3376832Z ⚠ 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-24T21:34:49.3376999Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:55:5] 2026-10-24T21:34:49.3377099Z 54 │ assert.equal( 2026-10-24T21:34:49.3377307Z 55 │ Schema.is(CodexSchema.ServerNotification__CollabAgentToolCallStatus)("interrupted"), 2026-10-24T21:34:49.3377450Z ·  ───────── 2026-10-24T21:34:49.3377569Z 56 │ true, 2026-10-24T21:34:49.3377641Z ╰──── 2026-10-24T21:34:49.3377643Z 2026-10-24T21:34:49.3378018Z ⚠ 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-24T21:34:49.3378185Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:59:5] 2026-10-24T21:34:49.3378261Z 58 │ assert.equal( 2026-10-24T21:34:49.3378467Z 59 │ Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentToolCallStatus)("interrupted"), 2026-10-24T21:34:49.3378571Z ·  ───────── 2026-10-24T21:34:49.3378721Z 60 │ true, 2026-10-24T21:34:49.3378785Z ╰──── 2026-10-24T21:34:49.3378787Z 2026-10-24T21:34:49.3379146Z ⚠ 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-24T21:34:49.3379316Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:103:16] 2026-10-24T21:34:49.3379419Z 102 │ 2026-10-24T21:34:49.3379600Z 103 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse)(resumeResponse), true); 2026-10-24T21:34:49.3379714Z ·  ───────── 2026-10-24T21:34:49.3379798Z 104 │ }); 2026-10-24T21:34:49.3379885Z ╰──── 2026-10-24T21:34:49.3379887Z 2026-10-24T21:34:49.3380142Z ⚠ unicorn(prefer-string-starts-ends-with): Prefer String#startsWith over a regex with a caret. 2026-10-24T21:34:49.3380296Z ╭─[apps/server/src/vcs/GitVcsDriverCore.ts:517:11] 2026-10-24T21:34:49.3380425Z 516 │ GIT_DIAGNOSTIC_LINE_PATTERN.test(line) || 2026-10-24T21:34:49.3380595Z 517 │ (!/^remote:/.test(line) && SSH_TRANSPORT_REFUSAL_PATTERN.test(line)), 2026-10-24T21:34:49.3380705Z ·  ─────────────── 2026-10-24T21:34:49.3380797Z 518 │ ) 2026-10-24T21:34:49.3380879Z ╰──── 2026-10-24T21:34:49.3381064Z  help: Replace `/^remote:/.test(line)` with `line.startsWith('remote:')`. 2026-10-24T21:34:49.3381067Z 2026-10-24T21:34:49.3381595Z ⚠ 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-24T21:34:49.3381789Z ╭─[packages/shared/src/atomicWrite.test.ts:139:5] 2026-10-24T21:34:49.3381895Z 138 │ Effect.gen(function* () { 2026-10-24T21:34:49.3382123Z 139 │ ╭─▶ while (fiber.pollUnsafe() === undefined) { 2026-10-24T21:34:49.3382274Z 140 │ │ yield* TestClock.adjust("100 millis"); 2026-10-24T21:34:49.3382613Z 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-24T21:34:49.3382835Z 142 │ │ yield* Effect.promise(() => new Promise((resolve) => setImmediate(resolve))); 2026-10-24T21:34:49.3382992Z 143 │ ╰─▶ } 2026-10-24T21:34:49.3383116Z 144 │ return yield* Fiber.join(fiber); 2026-10-24T21:34:49.3383202Z ╰──── 2026-10-24T21:34:49.3383204Z 2026-10-24T21:34:49.3383443Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T21:34:49.3383640Z ╭─[packages/shared/src/serverSettings.ts:346:9] 2026-10-24T21:34:49.3383804Z 345 │ const entry: ProjectSettingsOverrides = { 2026-10-24T21:34:49.3383943Z 346 │ ...(entries.get(projectId) ?? currentEntries[projectId] ?? {}), 2026-10-24T21:34:49.3387601Z ·  ────────────────────────────────────────────────────────────── 2026-10-24T21:34:49.3387675Z 347 │ }; 2026-10-24T21:34:49.3387725Z ╰──── 2026-10-24T21:34:49.3387997Z  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-24T21:34:49.3388000Z 2026-10-24T21:34:49.3388224Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in Array.prototype.reduce() 2026-10-24T21:34:49.3388346Z ╭─[packages/shared/src/serverSettings.ts:448:24] 2026-10-24T21:34:49.3388425Z 447 │ const favorites = 2026-10-24T21:34:49.3388539Z 448 │ setModelFavorites?.reduce((current, change) => { 2026-10-24T21:34:49.3388637Z ·  ───┬── 2026-10-24T21:34:49.3388762Z · ╰── For this reduce 2026-10-24T21:34:49.3388842Z 449 │ const exists = current.some( 2026-10-24T21:34:49.3389015Z 450 │ (favorite) => favorite.provider === change.provider && favorite.model === change.model, 2026-10-24T21:34:49.3389074Z 451 │ ); 2026-10-24T21:34:49.3389147Z 452 │ return change.favorite 2026-10-24T21:34:49.3389208Z 453 │ ? exists 2026-10-24T21:34:49.3389274Z 454 │ ? current 2026-10-24T21:34:49.3389410Z 455 │ : [...current, { provider: change.provider, model: change.model }] 2026-10-24T21:34:49.3389501Z ·  ─────┬──── 2026-10-24T21:34:49.3389622Z · ╰── From this spread 2026-10-24T21:34:49.3389693Z 456 │ : current.filter( 2026-10-24T21:34:49.3389744Z ╰──── 2026-10-24T21:34:49.3389950Z  help: Consider using `Object.assign()` or `Array.prototype.push()` to mutate the accumulator instead. 2026-10-24T21:34:49.3390101Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T21:34:49.3390104Z 2026-10-24T21:34:49.3390290Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-24T21:34:49.3390407Z ╭─[packages/shared/src/serverSettings.ts:466:3] 2026-10-24T21:34:49.3390467Z 464 │ null; 2026-10-24T21:34:49.3390581Z 465 │ let nextModelPreferences = initialModelPreferences; 2026-10-24T21:34:49.3390677Z ·  ──────────┬───────── 2026-10-24T21:34:49.3390806Z · ╰── From this accumulator 2026-10-24T21:34:49.3390906Z 466 │ for (const change of setModelsHidden ?? []) { 2026-10-24T21:34:49.3390972Z ·  ─┬─ 2026-10-24T21:34:49.3391077Z · ╰── For this loop 2026-10-24T21:34:49.3391246Z 467 │ const preferences = nextModelPreferences?.[change.provider] ?? { 2026-10-24T21:34:49.3391315Z 468 │ hiddenModels: [], 2026-10-24T21:34:49.3391380Z 469 │ modelOrder: [], 2026-10-24T21:34:49.3391436Z 470 │ }; 2026-10-24T21:34:49.3391613Z 471 │ const hiddenModels = preferences.hiddenModels.filter((model) => model !== change.model); 2026-10-24T21:34:49.3391722Z 472 │ if (change.hidden) hiddenModels.push(change.model); 2026-10-24T21:34:49.3391795Z 473 │ nextModelPreferences = { 2026-10-24T21:34:49.3391958Z 474 │ ...nextModelPreferences, 2026-10-24T21:34:49.3392094Z ·  ───────────┬─────────── 2026-10-24T21:34:49.3392218Z · ╰── From this spread 2026-10-24T21:34:49.3392327Z 475 │ [change.provider]: { ...preferences, hiddenModels }, 2026-10-24T21:34:49.3392380Z ╰──── 2026-10-24T21:34:49.3392532Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-24T21:34:49.3392687Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T21:34:49.3392690Z 2026-10-24T21:34:49.3392853Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T21:34:49.3392977Z ╭─[apps/web/src/hooks/useThreadActions.ts:821:56] 2026-10-24T21:34:49.3393085Z 820 │ const resolved = resolveThreadTarget(target); 2026-10-24T21:34:49.3393240Z 821 │ if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) { 2026-10-24T21:34:49.3393360Z ·  ─────┬──── 2026-10-24T21:34:49.3393530Z · ╰── Cannot call impure function 2026-10-24T21:34:49.3393614Z 822 │ return AsyncResult.failure( 2026-10-24T21:34:49.3393667Z ╰──── 2026-10-24T21:34:49.3393946Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T21:34:49.3394239Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T21:34:49.3394242Z 2026-10-24T21:34:49.3394412Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T21:34:49.3394534Z ╭─[apps/web/src/hooks/useThreadActions.ts:709:46] 2026-10-24T21:34:49.3394605Z 708 │ const wokeAt = resolved 2026-10-24T21:34:49.3394738Z 709 │ ? threadWokeAt(resolved.thread, { now: new Date().toISOString() }) 2026-10-24T21:34:49.3394852Z ·  ─────┬──── 2026-10-24T21:34:49.3395012Z · ╰── Cannot call impure function 2026-10-24T21:34:49.3395076Z 710 │ : null; 2026-10-24T21:34:49.3395126Z ╰──── 2026-10-24T21:34:49.3395398Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T21:34:49.3395692Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T21:34:49.3395697Z 2026-10-24T21:34:49.3395863Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T21:34:49.3396014Z ╭─[apps/server/src/provider/Drivers/CodexDriver.test.ts:466:14] 2026-10-24T21:34:49.3396067Z 465 │ 2026-10-24T21:34:49.3396172Z 466 │ for (const {} of ["direct", "wrapper"] as const) { 2026-10-24T21:34:49.3396246Z ·  ── 2026-10-24T21:34:49.3396300Z 467 │ } 2026-10-24T21:34:49.3396352Z ╰──── 2026-10-24T21:34:49.3396578Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T21:34:49.3396581Z 2026-10-24T21:34:49.3396838Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T21:34:49.3397009Z ╭─[packages/shared/src/composerContextLegacySend.ts:19:45] 2026-10-24T21:34:49.3397134Z 18 │ const occurrences = collectComposerContextReferences(text); 2026-10-24T21:34:49.3397242Z 19 │ for (const occurrence of [...occurrences].reverse()) { 2026-10-24T21:34:49.3397352Z ·  ─────── 2026-10-24T21:34:49.3397463Z 20 │ const record = recordsById.get(occurrence.contextId); 2026-10-24T21:34:49.3397513Z ╰──── 2026-10-24T21:34:49.3397771Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T21:34:49.3397774Z 2026-10-24T21:34:49.3398200Z ⚠ 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-24T21:34:49.3398347Z ╭─[apps/server/src/provider/acp/AntigravityProtocol.ts:263:20] 2026-10-24T21:34:49.3398429Z 262 │ ...(update._meta !== undefined 2026-10-24T21:34:49.3398592Z 263 │ ? { _meta: Schema.is(Schema.Record(Schema.String, Schema.Json))(meta) ? meta : null } 2026-10-24T21:34:49.3398680Z ·  ───────── 2026-10-24T21:34:49.3398742Z 264 │ : {}), 2026-10-24T21:34:49.3398792Z ╰──── 2026-10-24T21:34:49.3398797Z 2026-10-24T21:34:49.3399000Z ⚠ eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used. 2026-10-24T21:34:49.3399104Z ╭─[infra/relay/src/http/Api.ts:69:13] 2026-10-24T21:34:49.3399247Z 68 │ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts"; 2026-10-24T21:34:49.3399362Z 69 │ import * as HookForwarder from "../hooks/HookForwarder.ts"; 2026-10-24T21:34:49.3399446Z ·  ──────┬────── 2026-10-24T21:34:49.3399591Z · ╰── 'HookForwarder' is imported here 2026-10-24T21:34:49.3399693Z 70 │ import * as HeldHooks from "../hooks/HeldHooks.ts"; 2026-10-24T21:34:49.3399745Z ╰──── 2026-10-24T21:34:49.3399842Z  help: Consider removing this import. 2026-10-24T21:34:49.3399845Z 2026-10-24T21:34:49.3400111Z ⚠ eslint(no-unused-vars): Variable 'claudeCaps' is declared but never used. Unused variables should start with a '_'. 2026-10-24T21:34:49.3400221Z ╭─[packages/shared/src/model.test.ts:36:7] 2026-10-24T21:34:49.3400274Z 35 │ 2026-10-24T21:34:49.3400447Z 36 │ const claudeCaps: ModelCapabilities = createModelCapabilities({ 2026-10-24T21:34:49.3400551Z ·  ─────┬──── 2026-10-24T21:34:49.3400683Z · ╰── 'claudeCaps' is declared here 2026-10-24T21:34:49.3400754Z 37 │ optionDescriptors: [ 2026-10-24T21:34:49.3400803Z ╰──── 2026-10-24T21:34:49.3400907Z  help: Consider removing this declaration. 2026-10-24T21:34:49.3400909Z 2026-10-24T21:34:49.3401193Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-24T21:34:49.3401348Z ╭─[packages/provider-cursor/src/server/auth.ts:249:20] 2026-10-24T21:34:49.3401407Z 248 │ }, 2026-10-24T21:34:49.3401489Z 249 │ (effect, flow, stopSessions) => 2026-10-24T21:34:49.3401589Z ·  ──────┬───── 2026-10-24T21:34:49.3401738Z · ╰── 'stopSessions' is declared here 2026-10-24T21:34:49.3401803Z 250 │ effect.pipe( 2026-10-24T21:34:49.3401855Z ╰──── 2026-10-24T21:34:49.3401956Z  help: Consider removing this parameter. 2026-10-24T21:34:49.3401959Z 2026-10-24T21:34:49.3402235Z ⚠ eslint(no-unused-vars): Variable 'legacyCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-24T21:34:49.3402388Z ╭─[packages/provider-cursor/src/server/credentialStore.test.ts:15:7] 2026-10-24T21:34:49.3402442Z 14 │ 2026-10-24T21:34:49.3402514Z 15 │ const legacyCredentials = { 2026-10-24T21:34:49.3402597Z ·  ────────┬──────── 2026-10-24T21:34:49.3402746Z · ╰── 'legacyCredentials' is declared here 2026-10-24T21:34:49.3402816Z 16 │ version: 1 as const, 2026-10-24T21:34:49.3402868Z ╰──── 2026-10-24T21:34:49.3402971Z  help: Consider removing this declaration. 2026-10-24T21:34:49.3402973Z 2026-10-24T21:34:49.3403180Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T21:34:49.3403283Z ╭─[apps/mobile/src/Stack.tsx:1079:21] 2026-10-24T21:34:49.3403348Z 1078 │ } 2026-10-24T21:34:49.3403613Z ·  ───────────────────────────────────────────── 2026-10-24T21:34:49.3403694Z 1080 │ screenOptions={({ route }) => 2026-10-24T21:34:49.3403749Z ╰──── 2026-10-24T21:34:49.3404119Z  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-24T21:34:49.3404124Z 2026-10-24T21:34:49.3404290Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T21:34:49.3404418Z ╭─[apps/web/src/components/CommandPalette.tsx:2037:20] 2026-10-24T21:34:49.3404536Z 2036 │ title: inferProjectTitleFromPath(destinationPath), 2026-10-24T21:34:49.3404628Z 2037 │ createdAt: new Date().toISOString(), 2026-10-24T21:34:49.3404720Z ·  ─────┬──── 2026-10-24T21:34:49.3404860Z · ╰── Cannot call impure function 2026-10-24T21:34:49.3404965Z 2038 │ remoteUrl: addProjectCloneFlow.remoteUrl, 2026-10-24T21:34:49.3405017Z ╰──── 2026-10-24T21:34:49.3405361Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T21:34:49.3405761Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T21:34:49.3405763Z 2026-10-24T21:34:49.3405983Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T21:34:49.3406124Z ╭─[packages/client-runtime/src/operations/projects.ts:238:51] 2026-10-24T21:34:49.3406187Z 237 │ ): string { 2026-10-24T21:34:49.3406342Z 238 │ const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? ""; 2026-10-24T21:34:49.3406454Z ·  ────── 2026-10-24T21:34:49.3406589Z 239 │ return target.owner ? `${target.owner}/${folderName}` : folderName; 2026-10-24T21:34:49.3406640Z ╰──── 2026-10-24T21:34:49.3406804Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T21:34:49.3406809Z 2026-10-24T21:34:49.3407061Z ⚠ unicorn(prefer-add-event-listener): Prefer `addEventListener()` over their `on`-function counterparts. 2026-10-24T21:34:49.3407201Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:12:14] 2026-10-24T21:34:49.3407353Z 11 │ addEventListener(_type: string, listener: (event: { data: string }) => void) { 2026-10-24T21:34:49.3407433Z 12 │ this.onmessage = listener; 2026-10-24T21:34:49.3407510Z ·  ───────── 2026-10-24T21:34:49.3407564Z 13 │ } 2026-10-24T21:34:49.3407616Z ╰──── 2026-10-24T21:34:49.3407931Z  help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on` replaces any previously registered handler. 2026-10-24T21:34:49.3407936Z 2026-10-24T21:34:49.3408132Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-24T21:34:49.3408270Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:16:9] 2026-10-24T21:34:49.3408335Z 15 │ constructor() { 2026-10-24T21:34:49.3408398Z 16 │ source = this; 2026-10-24T21:34:49.3408468Z ·  ────── 2026-10-24T21:34:49.3408524Z 17 │ } 2026-10-24T21:34:49.3408577Z ╰──── 2026-10-24T21:34:49.3408846Z  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-24T21:34:49.3408849Z 2026-10-24T21:34:49.3409071Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T21:34:49.3409194Z ╭─[apps/server/src/terminal/Manager.test.ts:731:31] 2026-10-24T21:34:49.3409252Z 730 │ ); 2026-10-24T21:34:49.3409420Z 731 │ const snapshot = events.filter((event) => event.type === "snapshot").at(-1)?.snapshot; 2026-10-24T21:34:49.3409513Z ·  ────── 2026-10-24T21:34:49.3409626Z 732 │ expect(snapshot?.history).toBe("aa😀\rEND"); 2026-10-24T21:34:49.3409677Z ╰──── 2026-10-24T21:34:49.3409843Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T21:34:49.3409846Z 2026-10-24T21:34:49.3410165Z ⚠ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'. 2026-10-24T21:34:49.3410338Z ╭─[apps/web/src/components/preview/PreviewPanelShell.tsx:61:9] 2026-10-24T21:34:49.3410391Z 60 │ ) { 2026-10-24T21:34:49.3410556Z 61 │ const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded"; 2026-10-24T21:34:49.3410637Z ·  ──────┬────── 2026-10-24T21:34:49.3410774Z · ╰── 'useDragRegion' is declared here 2026-10-24T21:34:49.3410868Z 62 │ const isInline = props.mode === "inline"; 2026-10-24T21:34:49.3410919Z ╰──── 2026-10-24T21:34:49.3411021Z  help: Consider removing this declaration. 2026-10-24T21:34:49.3411023Z 2026-10-24T21:34:49.3411331Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T21:34:49.3411487Z ╭─[apps/web/src/components/settings/SettingInheritance.tsx:163:24] 2026-10-24T21:34:49.3411547Z 162 │ keys, 2026-10-24T21:34:49.3411619Z 163 │ overridingProjects = [], 2026-10-24T21:34:49.3411699Z ·  ── 2026-10-24T21:34:49.3411766Z 164 │ onClearOverrides, 2026-10-24T21:34:49.3411820Z ╰──── 2026-10-24T21:34:49.3412132Z  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-24T21:34:49.3412136Z 2026-10-24T21:34:49.3412331Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T21:34:49.3412492Z ╭─[apps/web/src/components/settings/ProviderSettingsPanel.logic.ts:4:8] 2026-10-24T21:34:49.3412565Z 3 │ AuthProvidersManageScope, 2026-10-24T21:34:49.3412639Z 4 │ type AuthSessionState, 2026-10-24T21:34:49.3412720Z ·  ────────┬─────── 2026-10-24T21:34:49.3412865Z · ╰── 'AuthSessionState' is imported here 2026-10-24T21:34:49.3412931Z 5 │ type EnvironmentId, 2026-10-24T21:34:49.3412981Z ╰──── 2026-10-24T21:34:49.3413076Z  help: Consider removing this import. 2026-10-24T21:34:49.3413079Z 2026-10-24T21:34:49.3413350Z ⚠ eslint(no-unused-vars): Variable 'layerUnavailable' is declared but never used. Unused variables should start with a '_'. 2026-10-24T21:34:49.3413491Z ╭─[apps/server/src/orchestration-v2/Orchestrator.ts:12395:7] 2026-10-24T21:34:49.3413546Z 12394 │ 2026-10-24T21:34:49.3413684Z 12395 │ const layerUnavailable: Layer.Layer = Layer.succeed( 2026-10-24T21:34:49.3413776Z ·  ────────┬─────── 2026-10-24T21:34:49.3413929Z · ╰── 'layerUnavailable' is declared here 2026-10-24T21:34:49.3413996Z 12396 │ OrchestratorV2, 2026-10-24T21:34:49.3414047Z ╰──── 2026-10-24T21:34:49.3414150Z  help: Consider removing this declaration. 2026-10-24T21:34:49.3414153Z 2026-10-24T21:34:49.3414305Z ⚠ eslint(no-new): Do not use 'new' for side effects. 2026-10-24T21:34:49.3414429Z ╭─[apps/server/src/mcp/McpToolAccess.test.ts:168:3] 2026-10-24T21:34:49.3414539Z 167 │ // @ts-expect-error a declaration constructed directly 2026-10-24T21:34:49.3414634Z 168 │ new McpToolAccess.Declaration(unchecked); 2026-10-24T21:34:49.3414729Z ·  ───────────────────────────── 2026-10-24T21:34:49.3414905Z 169 │ // @ts-expect-error a handlers layer built outside McpToolAccess 2026-10-24T21:34:49.3414989Z ╰──── 2026-10-24T21:34:49.3415142Z  help: Assign the result of 'new' to a variable or compare it to a reference. 2026-10-24T21:34:49.3415144Z 2026-10-24T21:34:49.3415399Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-24T21:34:49.3415528Z ╭─[apps/server/src/telemetry/AnalyticsService.ts:340:7] 2026-10-24T21:34:49.3415582Z 339 │ 2026-10-24T21:34:49.3415680Z 340 │ const layerTest = AnalyticsService.layerTest; 2026-10-24T21:34:49.3415754Z ·  ────┬──── 2026-10-24T21:34:49.3415888Z · ╰── 'layerTest' is declared here 2026-10-24T21:34:49.3415938Z ╰──── 2026-10-24T21:34:49.3416038Z  help: Consider removing this declaration. 2026-10-24T21:34:49.3416047Z 2026-10-24T21:34:49.3416251Z ⚠ eslint(no-unused-vars): Function 'nonEmptyString' is declared but never used. 2026-10-24T21:34:49.3416397Z ╭─[packages/client-runtime/src/work-log/presentation.ts:237:10] 2026-10-24T21:34:49.3416450Z 236 │ 2026-10-24T21:34:49.3416562Z 237 │ function nonEmptyString(value: unknown): string | null { 2026-10-24T21:34:49.3416646Z ·  ───────┬────── 2026-10-24T21:34:49.3416794Z · ╰── 'nonEmptyString' is declared here 2026-10-24T21:34:49.3416936Z 238 │ return typeof value === "string" && value.trim().length > 0 ? value : null; 2026-10-24T21:34:49.3416985Z ╰──── 2026-10-24T21:34:49.3417085Z  help: Consider removing this declaration. 2026-10-24T21:34:49.3417088Z 2026-10-24T21:34:49.3417419Z ⚠ eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'. 2026-10-24T21:34:49.3417583Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1444:7] 2026-10-24T21:34:49.3417635Z 1443 │ 2026-10-24T21:34:49.3417747Z 1444 │ const layerCodexAppServerClientFactoryCommand = ( 2026-10-24T21:34:49.3417862Z ·  ───────────────────┬─────────────────── 2026-10-24T21:34:49.3418063Z · ╰── 'layerCodexAppServerClientFactoryCommand' is declared here 2026-10-24T21:34:49.3418180Z 1445 │ options: CodexClient.CodexAppServerClientOptions & { 2026-10-24T21:34:49.3418233Z ╰──── 2026-10-24T21:34:49.3418332Z  help: Consider removing this declaration. 2026-10-24T21:34:49.3418334Z 2026-10-24T21:34:49.3418591Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T21:34:49.3418753Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1680:7] 2026-10-24T21:34:49.3418804Z 1679 │ 2026-10-24T21:34:49.3418876Z 1680 │ const layer: Layer.Layer< 2026-10-24T21:34:49.3418947Z ·  ──┬── 2026-10-24T21:34:49.3419069Z · ╰── 'layer' is declared here 2026-10-24T21:34:49.3419161Z 1681 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T21:34:49.3419211Z ╰──── 2026-10-24T21:34:49.3419309Z  help: Consider removing this declaration. 2026-10-24T21:34:49.3419312Z 2026-10-24T21:34:49.3419555Z ⚠ eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used. 2026-10-24T21:34:49.3419777Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:960:10] 2026-10-24T21:34:49.3419859Z 959 │ 2026-10-24T21:34:49.3419965Z 960 │ function layerClaudeAgentSdkReplayQueryRunner( 2026-10-24T21:34:49.3420078Z ·  ──────────────────┬───────────────── 2026-10-24T21:34:49.3420271Z · ╰── 'layerClaudeAgentSdkReplayQueryRunner' is declared here 2026-10-24T21:34:49.3420374Z 961 │ transcript: ClaudeAgentSdkReplayTranscript, 2026-10-24T21:34:49.3420425Z ╰──── 2026-10-24T21:34:49.3420524Z  help: Consider removing this declaration. 2026-10-24T21:34:49.3420526Z 2026-10-24T21:34:49.3420705Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T21:34:49.3420845Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:121:27] 2026-10-24T21:34:49.3421009Z 120 │ const scope = makeScope(options.capabilities ?? new Set(["preview", "worktree"])); 2026-10-24T21:34:49.3421096Z 121 │ const dispatch = vi.fn((_: unknown) => 2026-10-24T21:34:49.3421187Z ·  ┬ 2026-10-24T21:34:49.3421338Z · ╰── '_' is declared here 2026-10-24T21:34:49.3421436Z 122 │ (options.dispatchGate ?? Effect.void).pipe( 2026-10-24T21:34:49.3421489Z ╰──── 2026-10-24T21:34:49.3421588Z  help: Consider removing this parameter. 2026-10-24T21:34:49.3421591Z 2026-10-24T21:34:49.3421769Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T21:34:49.3421902Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:134:39] 2026-10-24T21:34:49.3421959Z 133 │ ); 2026-10-24T21:34:49.3422067Z 134 │ const listLocalBranchNames = vi.fn((_: string) => 2026-10-24T21:34:49.3422167Z ·  ┬ 2026-10-24T21:34:49.3422305Z · ╰── '_' is declared here 2026-10-24T21:34:49.3422371Z 135 │ Effect.succeed( 2026-10-24T21:34:49.3422420Z ╰──── 2026-10-24T21:34:49.3422518Z  help: Consider removing this parameter. 2026-10-24T21:34:49.3422521Z 2026-10-24T21:34:49.3422697Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T21:34:49.3422826Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:178:31] 2026-10-24T21:34:49.3422880Z 177 │ }); 2026-10-24T21:34:49.3422975Z 178 │ const sendToThread = vi.fn((_: unknown) => { 2026-10-24T21:34:49.3423106Z ·  ┬ 2026-10-24T21:34:49.3423266Z · ╰── '_' is declared here 2026-10-24T21:34:49.3423362Z 179 │ switch (options.continuation ?? "queued") { 2026-10-24T21:34:49.3423413Z ╰──── 2026-10-24T21:34:49.3423510Z  help: Consider removing this parameter. 2026-10-24T21:34:49.3423512Z 2026-10-24T21:34:49.3423688Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T21:34:49.3423818Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:203:33] 2026-10-24T21:34:49.3423872Z 202 │ ); 2026-10-24T21:34:49.3423968Z 203 │ const removeWorktree = vi.fn((_: unknown) => 2026-10-24T21:34:49.3424057Z ·  ┬ 2026-10-24T21:34:49.3424193Z · ╰── '_' is declared here 2026-10-24T21:34:49.3424273Z 204 │ options.removeWorktreeFails 2026-10-24T21:34:49.3424323Z ╰──── 2026-10-24T21:34:49.3424421Z  help: Consider removing this parameter. 2026-10-24T21:34:49.3424423Z 2026-10-24T21:34:49.3424597Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T21:34:49.3424727Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:208:36] 2026-10-24T21:34:49.3424780Z 207 │ ); 2026-10-24T21:34:49.3424878Z 208 │ const deleteLocalBranch = vi.fn((_: unknown) => 2026-10-24T21:34:49.3424968Z ·  ┬ 2026-10-24T21:34:49.3425102Z · ╰── '_' is declared here 2026-10-24T21:34:49.3425186Z 209 │ options.deleteLocalBranchFails 2026-10-24T21:34:49.3425241Z ╰──── 2026-10-24T21:34:49.3425340Z  help: Consider removing this parameter. 2026-10-24T21:34:49.3425342Z 2026-10-24T21:34:49.3425518Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T21:34:49.3425646Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:213:42] 2026-10-24T21:34:49.3425699Z 212 │ ); 2026-10-24T21:34:49.3425808Z 213 │ const fetchWorktreeBaseCommit = vi.fn((_: unknown) => 2026-10-24T21:34:49.3425904Z ·  ┬ 2026-10-24T21:34:49.3426043Z · ╰── '_' is declared here 2026-10-24T21:34:49.3426125Z 214 │ options.fetchWorktreeBaseFails 2026-10-24T21:34:49.3426173Z ╰──── 2026-10-24T21:34:49.3426269Z  help: Consider removing this parameter. 2026-10-24T21:34:49.3426276Z 2026-10-24T21:34:49.3426454Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T21:34:49.3426584Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:254:30] 2026-10-24T21:34:49.3426638Z 253 │ ); 2026-10-24T21:34:49.3426726Z 254 │ const localStatus = vi.fn((_: unknown) => 2026-10-24T21:34:49.3426813Z ·  ┬ 2026-10-24T21:34:49.3426943Z · ╰── '_' is declared here 2026-10-24T21:34:49.3427011Z 255 │ Effect.succeed({ 2026-10-24T21:34:49.3427059Z ╰──── 2026-10-24T21:34:49.3427156Z  help: Consider removing this parameter. 2026-10-24T21:34:49.3427158Z 2026-10-24T21:34:49.3427386Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T21:34:49.3427576Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:264:32] 2026-10-24T21:34:49.3427668Z 263 │ ); 2026-10-24T21:34:49.3427818Z 264 │ const refreshStatus = vi.fn((_: string) => Effect.die("refreshStatus stub")); 2026-10-24T21:34:49.3427904Z ·  ┬ 2026-10-24T21:34:49.3428036Z · ╰── '_' is declared here 2026-10-24T21:34:49.3428178Z 265 │ const runForThread = vi.fn((input: { readonly worktreePath: string }) => { 2026-10-24T21:34:49.3428228Z ╰──── 2026-10-24T21:34:49.3428325Z  help: Consider removing this parameter. 2026-10-24T21:34:49.3428327Z 2026-10-24T21:34:49.3428546Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T21:34:49.3428716Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:1998:15] 2026-10-24T21:34:49.3428783Z 1997 │ assert.equal( 2026-10-24T21:34:49.3428929Z 1998 │ items.filter((item) => item.type === "assistant_message").at(-1)?.text, 2026-10-24T21:34:49.3429007Z ·  ────── 2026-10-24T21:34:49.3429082Z 1999 │ "authoritative answer", 2026-10-24T21:34:49.3429133Z ╰──── 2026-10-24T21:34:49.3429301Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T21:34:49.3429304Z 2026-10-24T21:34:49.3429764Z ⚠ 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-24T21:34:49.3429935Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:3951:7] 2026-10-24T21:34:49.3430114Z 3950 │ const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped); 2026-10-24T21:34:49.3430318Z 3951 │ ╭─▶ while (!responseLifecycle.includes("failed")) { 2026-10-24T21:34:49.3430426Z 3952 │ │ yield* Effect.yieldNow; 2026-10-24T21:34:49.3430562Z 3953 │ ╰─▶ } 2026-10-24T21:34:49.3430680Z 3954 │ const responseExit = yield* Fiber.join(responseFiber); 2026-10-24T21:34:49.3430733Z ╰──── 2026-10-24T21:34:49.3430735Z 2026-10-24T21:34:49.3431239Z ⚠ 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-24T21:34:49.3431406Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6062:9] 2026-10-24T21:34:49.3431492Z 6061 │ .pipe(Effect.forkScoped); 2026-10-24T21:34:49.3431672Z 6062 │ ╭─▶ while (promptGates.length < 1) { 2026-10-24T21:34:49.3431780Z 6063 │ │ yield* Effect.yieldNow; 2026-10-24T21:34:49.3431913Z 6064 │ ╰─▶ } 2026-10-24T21:34:49.3432079Z 6065 │ assert.isDefined(sessionUpdateHandler, "session update handler must be wired"); 2026-10-24T21:34:49.3432128Z ╰──── 2026-10-24T21:34:49.3432131Z 2026-10-24T21:34:49.3432634Z ⚠ 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-24T21:34:49.3432824Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6197:9] 2026-10-24T21:34:49.3432910Z 6196 │ .pipe(Effect.forkScoped); 2026-10-24T21:34:49.3433086Z 6197 │ ╭─▶ while (promptGates.length < 2) { 2026-10-24T21:34:49.3433194Z 6198 │ │ yield* Effect.yieldNow; 2026-10-24T21:34:49.3433324Z 6199 │ ╰─▶ } 2026-10-24T21:34:49.3433487Z 6200 │ if (sessionUpdateHandler === undefined || capturedMutation.current === null) { 2026-10-24T21:34:49.3433536Z ╰──── 2026-10-24T21:34:49.3433539Z 2026-10-24T21:34:49.3433796Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T21:34:49.3433960Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10602:7] 2026-10-24T21:34:49.3434014Z 10601 │ 2026-10-24T21:34:49.3434087Z 10602 │ const layer: Layer.Layer< 2026-10-24T21:34:49.3434159Z ·  ──┬── 2026-10-24T21:34:49.3434285Z · ╰── 'layer' is declared here 2026-10-24T21:34:49.3434378Z 10603 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T21:34:49.3434429Z ╰──── 2026-10-24T21:34:49.3434531Z  help: Consider removing this declaration. 2026-10-24T21:34:49.3434533Z 2026-10-24T21:34:49.3434986Z ⚠ 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-24T21:34:49.3435133Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:169:7] 2026-10-24T21:34:49.3435196Z 168 │ }); 2026-10-24T21:34:49.3435386Z 169 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T21:34:49.3435575Z 170 │ │ if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break; 2026-10-24T21:34:49.3435679Z 171 │ │ yield* Effect.yieldNow; 2026-10-24T21:34:49.3435808Z 172 │ ╰─▶ } 2026-10-24T21:34:49.3435859Z 173 │ 2026-10-24T21:34:49.3435909Z ╰──── 2026-10-24T21:34:49.3435911Z 2026-10-24T21:34:49.3436366Z ⚠ 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-24T21:34:49.3436509Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:178:7] 2026-10-24T21:34:49.3436617Z 177 │ yield* Deferred.succeed(releaseSave, undefined); 2026-10-24T21:34:49.3436801Z 178 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T21:34:49.3436932Z 179 │ │ if ((yield* Ref.get(saved)).length > 0) break; 2026-10-24T21:34:49.3437036Z 180 │ │ yield* Effect.yieldNow; 2026-10-24T21:34:49.3437163Z 181 │ ╰─▶ } 2026-10-24T21:34:49.3437260Z 182 │ 2026-10-24T21:34:49.3437337Z ╰──── 2026-10-24T21:34:49.3437340Z 2026-10-24T21:34:49.3437785Z ⚠ 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-24T21:34:49.3437925Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7] 2026-10-24T21:34:49.3438049Z 306 │ yield* Deferred.succeed(releaseUnenrichedSave, undefined); 2026-10-24T21:34:49.3438237Z 307 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T21:34:49.3438354Z 308 │ │ const values = yield* Ref.get(saved); 2026-10-24T21:34:49.3438549Z 309 │ │ if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) { 2026-10-24T21:34:49.3438635Z 310 │ │ break; 2026-10-24T21:34:49.3438711Z 311 │ │ } 2026-10-24T21:34:49.3438817Z 312 │ │ yield* Effect.yieldNow; 2026-10-24T21:34:49.3438946Z 313 │ ╰─▶ } 2026-10-24T21:34:49.3439000Z 314 │ 2026-10-24T21:34:49.3439049Z ╰──── 2026-10-24T21:34:49.3439052Z 2026-10-24T21:34:49.3439306Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T21:34:49.3439472Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:643:5] 2026-10-24T21:34:49.3439525Z 638 │ 2026-10-24T21:34:49.3439589Z 639 │ useEffect(() => { 2026-10-24T21:34:49.3439667Z ·  ────┬──── 2026-10-24T21:34:49.3439797Z · ╰── This is the containing effect 2026-10-24T21:34:49.3439906Z 640 │ if (pendingLaunchEntry.key === launchTargetKey) { 2026-10-24T21:34:49.3439965Z 641 │ return; 2026-10-24T21:34:49.3440019Z 642 │ } 2026-10-24T21:34:49.3440093Z 643 │ setPendingLaunchEntry({ 2026-10-24T21:34:49.3440178Z ·  ──────────┬────────── 2026-10-24T21:34:49.3440346Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3440416Z 644 │ key: launchTargetKey, 2026-10-24T21:34:49.3440468Z ╰──── 2026-10-24T21:34:49.3441065Z  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-24T21:34:49.3441426Z  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-24T21:34:49.3441429Z 2026-10-24T21:34:49.3441679Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T21:34:49.3441843Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5] 2026-10-24T21:34:49.3441896Z 648 │ 2026-10-24T21:34:49.3441958Z 649 │ useEffect(() => { 2026-10-24T21:34:49.3442028Z ·  ────┬──── 2026-10-24T21:34:49.3442203Z · ╰── This is the containing effect 2026-10-24T21:34:49.3442344Z 650 │ if (initialAttachGridEntry.key === launchTargetKey) { 2026-10-24T21:34:49.3442402Z 651 │ return; 2026-10-24T21:34:49.3442457Z 652 │ } 2026-10-24T21:34:49.3442539Z 653 │ setInitialAttachGridEntry({ 2026-10-24T21:34:49.3442630Z ·  ────────────┬──────────── 2026-10-24T21:34:49.3442798Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3442870Z 654 │ key: launchTargetKey, 2026-10-24T21:34:49.3442919Z ╰──── 2026-10-24T21:34:49.3443507Z  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-24T21:34:49.3443823Z  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-24T21:34:49.3443826Z 2026-10-24T21:34:49.3444073Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T21:34:49.3444236Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7] 2026-10-24T21:34:49.3444288Z 743 │ 2026-10-24T21:34:49.3444351Z 744 │ useEffect(() => { 2026-10-24T21:34:49.3444420Z ·  ────┬──── 2026-10-24T21:34:49.3444546Z · ╰── This is the containing effect 2026-10-24T21:34:49.3444647Z 745 │ if (!routeEnvironmentId || !routeThreadId) { 2026-10-24T21:34:49.3444718Z 746 │ setLastGridSize({ 2026-10-24T21:34:49.3444800Z ·  ───────┬─────── 2026-10-24T21:34:49.3444967Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3445048Z 747 │ cols: DEFAULT_TERMINAL_COLS, 2026-10-24T21:34:49.3445098Z ╰──── 2026-10-24T21:34:49.3445679Z  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-24T21:34:49.3445991Z  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-24T21:34:49.3445994Z 2026-10-24T21:34:49.3446236Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T21:34:49.3446433Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24] 2026-10-24T21:34:49.3446491Z 537 │ }); 2026-10-24T21:34:49.3446611Z 538 │ }, [terminal.buffer, terminal.buffer.length, terminalKey]); 2026-10-24T21:34:49.3446719Z ·  ───────────┬────────── 2026-10-24T21:34:49.3446959Z · ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead 2026-10-24T21:34:49.3447118Z 539 │ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null; 2026-10-24T21:34:49.3447167Z ╰──── 2026-10-24T21:34:49.3447459Z  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-24T21:34:49.3447767Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.3447769Z 2026-10-24T21:34:49.3447964Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T21:34:49.3448132Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7] 2026-10-24T21:34:49.3448228Z 708 │ sentInitialInputKeyRef.current = null; 2026-10-24T21:34:49.3448292Z 709 │ }, [terminalKey]); 2026-10-24T21:34:49.3448369Z ·  ─────┬───── 2026-10-24T21:34:49.3448509Z · ╰── Unnecessary dependency `terminalKey` 2026-10-24T21:34:49.3448559Z 710 │ 2026-10-24T21:34:49.3448615Z ╰──── 2026-10-24T21:34:49.3448900Z  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-24T21:34:49.3449203Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.3449205Z 2026-10-24T21:34:49.3449398Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T21:34:49.3449561Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52] 2026-10-24T21:34:49.3449617Z 799 │ }; 2026-10-24T21:34:49.3449792Z 800 │ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]); 2026-10-24T21:34:49.3449970Z ·  ────────────┬──────────── ─────┬───── 2026-10-24T21:34:49.3450195Z · │ ╰── Unnecessary dependency `terminalKey` 2026-10-24T21:34:49.3450400Z · ╰── Unnecessary dependency `terminal.lifecycleVersion` 2026-10-24T21:34:49.3450453Z 801 │ 2026-10-24T21:34:49.3450503Z ╰──── 2026-10-24T21:34:49.3450785Z  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-24T21:34:49.3451138Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.3451170Z 2026-10-24T21:34:49.3451338Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.3451502Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24] 2026-10-24T21:34:49.3451555Z 792 │ } 2026-10-24T21:34:49.3451658Z 793 │ const pasteSession = pasteSessionRef.current; 2026-10-24T21:34:49.3451769Z ·  ───────────┬─────────── 2026-10-24T21:34:49.3451927Z · ╰── Cannot access ref value during render 2026-10-24T21:34:49.3451979Z 794 │ 2026-10-24T21:34:49.3452027Z ╰──── 2026-10-24T21:34:49.3452488Z  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-24T21:34:49.3452776Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.3452778Z 2026-10-24T21:34:49.3453231Z ⚠ 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-24T21:34:49.3453396Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7] 2026-10-24T21:34:49.3453497Z 565 │ let afterSequence = created[0]!.sequence; 2026-10-24T21:34:49.3453692Z 566 │ ╭─▶ for (let index = 1; index <= 32; index += 1) { 2026-10-24T21:34:49.3453794Z 567 │ │ const nextEvent = { 2026-10-24T21:34:49.3453950Z 568 │ │ id: EventId.make(`event:foundation-stream-race:${index}`), 2026-10-24T21:34:49.3454080Z 569 │ │ type: "thread.metadata-updated" as const, 2026-10-24T21:34:49.3454170Z 570 │ │ threadId, 2026-10-24T21:34:49.3454273Z 571 │ │ providerInstanceId, 2026-10-24T21:34:49.3454370Z 572 │ │ occurredAt: now, 2026-10-24T21:34:49.3454516Z 573 │ │ payload: { ...thread, title: `Race update ${index}` }, 2026-10-24T21:34:49.3454641Z 574 │ │ } satisfies OrchestrationV2DomainEvent; 2026-10-24T21:34:49.3454754Z 575 │ │ const reader = yield* eventSink 2026-10-24T21:34:49.3454880Z 576 │ │ .stream({ threadId, afterSequence }) 2026-10-24T21:34:49.3455009Z 577 │ │ .pipe(Stream.runHead, Effect.forkChild); 2026-10-24T21:34:49.3455117Z 578 │ │ yield* Effect.yieldNow; 2026-10-24T21:34:49.3455276Z 579 │ │ const written = yield* eventSink.write({ events: [nextEvent] }); 2026-10-24T21:34:49.3455402Z 580 │ │ const received = yield* Fiber.join(reader); 2026-10-24T21:34:49.3455514Z 581 │ │ if (Option.isNone(received)) { 2026-10-24T21:34:49.3455709Z 582 │ │ return yield* Effect.die("The event stream ended before delivering the live event."); 2026-10-24T21:34:49.3455787Z 583 │ │ } 2026-10-24T21:34:49.3455993Z 584 │ │ assert.equal(received.value.sequence, written[0]?.sequence); 2026-10-24T21:34:49.3456162Z 585 │ │ assert.equal(received.value.event.id, nextEvent.id); 2026-10-24T21:34:49.3456286Z 586 │ │ afterSequence = received.value.sequence; 2026-10-24T21:34:49.3456414Z 587 │ ╰─▶ } 2026-10-24T21:34:49.3456473Z 588 │ }), 2026-10-24T21:34:49.3456523Z ╰──── 2026-10-24T21:34:49.3456526Z 2026-10-24T21:34:49.3456979Z ⚠ 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-24T21:34:49.3457152Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:2327:9] 2026-10-24T21:34:49.3457234Z 2326 │ let settled = false; 2026-10-24T21:34:49.3457393Z 2327 │ ╭─▶ while (!settled) { 2026-10-24T21:34:49.3457547Z 2328 │ │ settled = (yield* outbox.listByCommandId(commandId)).every( 2026-10-24T21:34:49.3457677Z 2329 │ │ (effect) => effect.status === "succeeded", 2026-10-24T21:34:49.3457758Z 2330 │ │ ); 2026-10-24T21:34:49.3457880Z 2331 │ │ if (!settled) yield* Effect.yieldNow; 2026-10-24T21:34:49.3458012Z 2332 │ ╰─▶ } 2026-10-24T21:34:49.3458127Z 2333 │ }).pipe(Effect.provide(layerWorker), Effect.scoped); 2026-10-24T21:34:49.3458179Z ╰──── 2026-10-24T21:34:49.3458181Z 2026-10-24T21:34:49.3458473Z ⚠ eslint(no-unused-vars): Variable 'revokeActiveMcpThread' is declared but never used. Unused variables should start with a '_'. 2026-10-24T21:34:49.3458597Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:218:7] 2026-10-24T21:34:49.3458648Z 217 │ 2026-10-24T21:34:49.3458792Z 218 │ const revokeActiveMcpThread = (threadId: ThreadId): Effect.Effect => 2026-10-24T21:34:49.3458881Z ·  ──────────┬────────── 2026-10-24T21:34:49.3459033Z · ╰── 'revokeActiveMcpThread' is declared here 2026-10-24T21:34:49.3459214Z 219 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeThread(threadId) : Effect.void; 2026-10-24T21:34:49.3459266Z ╰──── 2026-10-24T21:34:49.3459369Z  help: Consider removing this declaration. 2026-10-24T21:34:49.3459372Z 2026-10-24T21:34:49.3459680Z ⚠ eslint(no-unused-vars): Variable 'revokeAllActiveMcpCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-24T21:34:49.3459803Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:221:7] 2026-10-24T21:34:49.3459854Z 220 │ 2026-10-24T21:34:49.3459984Z 221 │ const revokeAllActiveMcpCredentials = (): Effect.Effect => 2026-10-24T21:34:49.3460087Z ·  ──────────────┬────────────── 2026-10-24T21:34:49.3460260Z · ╰── 'revokeAllActiveMcpCredentials' is declared here 2026-10-24T21:34:49.3460420Z 222 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void; 2026-10-24T21:34:49.3460469Z ╰──── 2026-10-24T21:34:49.3460571Z  help: Consider removing this declaration. 2026-10-24T21:34:49.3460573Z 2026-10-24T21:34:49.3460811Z ⚠ eslint(no-unused-vars): Identifier 'identity' is imported but never used. 2026-10-24T21:34:49.3460938Z ╭─[apps/server/src/auth/http.ts:28:10] 2026-10-24T21:34:49.3461024Z 27 │ import * as Schema from "effect/Schema"; 2026-10-24T21:34:49.3461114Z 28 │ import { identity } from "effect/Function"; 2026-10-24T21:34:49.3461217Z ·  ────┬─── 2026-10-24T21:34:49.3461355Z · ╰── 'identity' is imported here 2026-10-24T21:34:49.3461439Z 29 │ import * as Layer from "effect/Layer"; 2026-10-24T21:34:49.3461490Z ╰──── 2026-10-24T21:34:49.3461586Z  help: Consider removing this import. 2026-10-24T21:34:49.3461589Z 2026-10-24T21:34:49.3461953Z ⚠ 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-24T21:34:49.3462077Z ╭─[apps/server/src/auth/RpcAuthorization.ts:237:17] 2026-10-24T21:34:49.3462209Z 236 │ const requiredScopesForSettingsUpdate = (payload: unknown) => { 2026-10-24T21:34:49.3462339Z 237 │ const input = Schema.decodeUnknownSync(SettingsUpdate)(payload); 2026-10-24T21:34:49.3462443Z ·  ──────────────────────── 2026-10-24T21:34:49.3462579Z 238 │ const scopes = requiredScopesForServerSettingsPatch(input.patch); 2026-10-24T21:34:49.3462630Z ╰──── 2026-10-24T21:34:49.3462632Z 2026-10-24T21:34:49.3462988Z ⚠ 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-24T21:34:49.3463106Z ╭─[apps/server/src/auth/RpcAuthorization.ts:256:26] 2026-10-24T21:34:49.3463211Z 255 │ if (method === WS_METHODS.assetsCreateUrl) { 2026-10-24T21:34:49.3463365Z 256 │ const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload); 2026-10-24T21:34:49.3463474Z ·  ──────────────────────── 2026-10-24T21:34:49.3463533Z 257 │ return [ 2026-10-24T21:34:49.3463585Z ╰──── 2026-10-24T21:34:49.3463587Z 2026-10-24T21:34:49.3463877Z ⚠ eslint(no-unused-vars): Variable 'layerFromProviderAdapter' is declared but never used. Unused variables should start with a '_'. 2026-10-24T21:34:49.3464035Z ╭─[apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts:346:7] 2026-10-24T21:34:49.3464085Z 345 │ 2026-10-24T21:34:49.3464185Z 346 │ const layerFromProviderAdapter: Layer.Layer< 2026-10-24T21:34:49.3464276Z ·  ────────────┬─────────── 2026-10-24T21:34:49.3464443Z · ╰── 'layerFromProviderAdapter' is declared here 2026-10-24T21:34:49.3464522Z 347 │ ProviderAdapterRegistryV2, 2026-10-24T21:34:49.3464573Z ╰──── 2026-10-24T21:34:49.3464675Z  help: Consider removing this declaration. 2026-10-24T21:34:49.3464678Z 2026-10-24T21:34:49.3464928Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T21:34:49.3465082Z ╭─[apps/mobile/src/features/terminal/terminalLaunchContext.ts:117:5] 2026-10-24T21:34:49.3465246Z 112 │ const [entry, setEntry] = useState(() => ({ key: input.targetKey, location: candidate })); 2026-10-24T21:34:49.3465314Z 113 │ useEffect(() => { 2026-10-24T21:34:49.3465387Z ·  ────┬──── 2026-10-24T21:34:49.3465563Z · ╰── This is the containing effect 2026-10-24T21:34:49.3465753Z 114 │ if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) { 2026-10-24T21:34:49.3465816Z 115 │ return; 2026-10-24T21:34:49.3465870Z 116 │ } 2026-10-24T21:34:49.3465986Z 117 │ setEntry({ key: input.targetKey, location: candidate }); 2026-10-24T21:34:49.3466056Z ·  ────┬─── 2026-10-24T21:34:49.3466221Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3466340Z 118 │ }, [candidate, entry.key, entry.location, input.targetKey]); 2026-10-24T21:34:49.3466391Z ╰──── 2026-10-24T21:34:49.3466987Z  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-24T21:34:49.3467386Z  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-24T21:34:49.3467389Z 2026-10-24T21:34:49.3467553Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T21:34:49.3467691Z ╭─[apps/server/src/process/externalLauncher.test.ts:186:12] 2026-10-24T21:34:49.3467743Z 185 │ 2026-10-24T21:34:49.3467841Z 186 │ for (const {} of ["darwin", "linux"] as const) { 2026-10-24T21:34:49.3467910Z ·  ── 2026-10-24T21:34:49.3467963Z 187 │ } 2026-10-24T21:34:49.3468013Z ╰──── 2026-10-24T21:34:49.3468242Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T21:34:49.3468246Z 2026-10-24T21:34:49.3468409Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T21:34:49.3468543Z ╭─[apps/server/src/process/externalLauncher.test.ts:189:12] 2026-10-24T21:34:49.3468595Z 188 │ 2026-10-24T21:34:49.3468659Z 189 │ for (const {} of [ 2026-10-24T21:34:49.3468728Z ·  ── 2026-10-24T21:34:49.3468817Z 190 │ { kind: "browser", folderVerb: "none" }, 2026-10-24T21:34:49.3468866Z ╰──── 2026-10-24T21:34:49.3469088Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T21:34:49.3469091Z 2026-10-24T21:34:49.3469252Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T21:34:49.3469443Z ╭─[apps/server/src/process/externalLauncher.test.ts:311:12] 2026-10-24T21:34:49.3469530Z 310 │ 2026-10-24T21:34:49.3469655Z 311 │ for (const {} of ["rejected", "spawn-error", "stalled"] as const) { 2026-10-24T21:34:49.3469723Z ·  ── 2026-10-24T21:34:49.3469775Z 312 │ } 2026-10-24T21:34:49.3469823Z ╰──── 2026-10-24T21:34:49.3470041Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T21:34:49.3470044Z 2026-10-24T21:34:49.3470204Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T21:34:49.3470336Z ╭─[apps/server/src/process/externalLauncher.test.ts:314:12] 2026-10-24T21:34:49.3470387Z 313 │ 2026-10-24T21:34:49.3470449Z 314 │ for (const {} of [ 2026-10-24T21:34:49.3470523Z ·  ── 2026-10-24T21:34:49.3470579Z 315 │ { 2026-10-24T21:34:49.3470627Z ╰──── 2026-10-24T21:34:49.3470851Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T21:34:49.3470855Z 2026-10-24T21:34:49.3471039Z ⚠ react(static-components): Cannot create components during render 2026-10-24T21:34:49.3471243Z ╭─[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10] 2026-10-24T21:34:49.3471330Z 196 │ const { onInput, onResize } = props; 2026-10-24T21:34:49.3471473Z 197 │ const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView(); 2026-10-24T21:34:49.3471602Z ·  ────────────────┬─────────────── 2026-10-24T21:34:49.3471791Z · ╰── The component is created during render here 2026-10-24T21:34:49.3471919Z 198 │ const hasNativeSurface = Boolean(NativeTerminalSurfaceView); 2026-10-24T21:34:49.3471968Z 199 │ 2026-10-24T21:34:49.3472033Z 200 │ useEffect(() => { 2026-10-24T21:34:49.3472120Z 201 │ terminalDebugLog("native:surface", { 2026-10-24T21:34:49.3472206Z 202 │ terminalKey: props.terminalKey, 2026-10-24T21:34:49.3472280Z 203 │ native: hasNativeSurface, 2026-10-24T21:34:49.3472413Z 204 │ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(), 2026-10-24T21:34:49.3472498Z 205 │ bufferLen: props.buffer.length, 2026-10-24T21:34:49.3472576Z 206 │ isRunning: props.isRunning, 2026-10-24T21:34:49.3472630Z 207 │ }); 2026-10-24T21:34:49.3472788Z 208 │ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]); 2026-10-24T21:34:49.3472879Z 209 │ const handleNativeInput = useCallback( 2026-10-24T21:34:49.3472995Z 210 │ (event: NativeSyntheticEvent) => { 2026-10-24T21:34:49.3473089Z 211 │ if (!props.isRunning || props.readOnly) { 2026-10-24T21:34:49.3473151Z 212 │ return; 2026-10-24T21:34:49.3473208Z 213 │ } 2026-10-24T21:34:49.3473295Z 214 │ terminalDebugLog("native:onInput", { 2026-10-24T21:34:49.3473441Z 215 │ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)), 2026-10-24T21:34:49.3473498Z 216 │ }); 2026-10-24T21:34:49.3473584Z 217 │ onInput(event.nativeEvent.data); 2026-10-24T21:34:49.3473638Z 218 │ }, 2026-10-24T21:34:49.3473734Z 219 │ [onInput, props.isRunning, props.readOnly], 2026-10-24T21:34:49.3473788Z 220 │ ); 2026-10-24T21:34:49.3473876Z 221 │ const handleNativeResize = useCallback( 2026-10-24T21:34:49.3474036Z 222 │ (event: NativeSyntheticEvent) => { 2026-10-24T21:34:49.3474127Z 223 │ onResize({ 2026-10-24T21:34:49.3474209Z 224 │ cols: event.nativeEvent.cols, 2026-10-24T21:34:49.3474290Z 225 │ rows: event.nativeEvent.rows, 2026-10-24T21:34:49.3474344Z 226 │ }); 2026-10-24T21:34:49.3474399Z 227 │ }, 2026-10-24T21:34:49.3474459Z 228 │ [onResize], 2026-10-24T21:34:49.3474511Z 229 │ ); 2026-10-24T21:34:49.3474561Z 230 │ 2026-10-24T21:34:49.3474644Z 231 │ if (NativeTerminalSurfaceView) { 2026-10-24T21:34:49.3474703Z 232 │ return ( 2026-10-24T21:34:49.3474779Z 233 │ 2026-10-24T21:34:49.3474858Z 234 │ { 2026-10-24T21:34:49.3480023Z ·  ────┬──── 2026-10-24T21:34:49.3480148Z · ╰── This is the containing effect 2026-10-24T21:34:49.3480242Z 59 │ const controller = new AbortController(); 2026-10-24T21:34:49.3480316Z 60 │ setLoadState("pending"); 2026-10-24T21:34:49.3480389Z ·  ──────┬───── 2026-10-24T21:34:49.3480554Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3480712Z 61 │ // A renewed signature is used on Retry, not as a reason to reset the native player. 2026-10-24T21:34:49.3480764Z ╰──── 2026-10-24T21:34:49.3481386Z  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-24T21:34:49.3481704Z  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-24T21:34:49.3481707Z 2026-10-24T21:34:49.3481905Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T21:34:49.3482035Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:71:7] 2026-10-24T21:34:49.3482115Z 70 │ return () => controller.abort(); 2026-10-24T21:34:49.3482211Z 71 │ }, [player, props.playRequested, attempt]); 2026-10-24T21:34:49.3482379Z ·  ───┬── ─────────┬───────── ───┬─── 2026-10-24T21:34:49.3482605Z · │ │ ╰── Unnecessary dependency `attempt` 2026-10-24T21:34:49.3482803Z · │ ╰── Unnecessary dependency `props.playRequested` 2026-10-24T21:34:49.3482938Z · ╰── Unnecessary dependency `player_0` 2026-10-24T21:34:49.3482991Z 72 │ 2026-10-24T21:34:49.3483040Z ╰──── 2026-10-24T21:34:49.3483330Z  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-24T21:34:49.3483633Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.3483636Z 2026-10-24T21:34:49.3483886Z ⚠ eslint(no-unused-vars): Function 'describeSchedule' is declared but never used. 2026-10-24T21:34:49.3484041Z ╭─[apps/server/src/scheduledTasks/Schedule.ts:79:10] 2026-10-24T21:34:49.3484092Z 78 │ 2026-10-24T21:34:49.3484226Z 79 │ function describeSchedule(schedule: ScheduledTaskSchedule): string { 2026-10-24T21:34:49.3484311Z ·  ────────┬─────── 2026-10-24T21:34:49.3484456Z · ╰── 'describeSchedule' is declared here 2026-10-24T21:34:49.3484563Z 80 │ if (schedule.type === "webhook") return "On webhook"; 2026-10-24T21:34:49.3484614Z ╰──── 2026-10-24T21:34:49.3484716Z  help: Consider removing this declaration. 2026-10-24T21:34:49.3484718Z 2026-10-24T21:34:49.3484924Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T21:34:49.3485050Z ╭─[apps/mobile/src/lib/markdownDocument.ts:259:28] 2026-10-24T21:34:49.3485152Z 258 │ visit(parser.parse(markdown), false, false); 2026-10-24T21:34:49.3485236Z 259 │ for (const edit of edits.reverse()) 2026-10-24T21:34:49.3485327Z ·  ─────── 2026-10-24T21:34:49.3485487Z 260 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-24T21:34:49.3485538Z ╰──── 2026-10-24T21:34:49.3485796Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T21:34:49.3485798Z 2026-10-24T21:34:49.3486001Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T21:34:49.3486126Z ╭─[apps/mobile/src/lib/markdownDocument.ts:290:28] 2026-10-24T21:34:49.3486206Z 289 │ visit(parser.parse(markdown)); 2026-10-24T21:34:49.3486289Z 290 │ for (const edit of edits.reverse()) 2026-10-24T21:34:49.3486381Z ·  ─────── 2026-10-24T21:34:49.3486538Z 291 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-24T21:34:49.3486587Z ╰──── 2026-10-24T21:34:49.3486840Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T21:34:49.3486843Z 2026-10-24T21:34:49.3487043Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T21:34:49.3487160Z ╭─[apps/mobile/src/lib/markdownDocument.ts:344:38] 2026-10-24T21:34:49.3487236Z 343 │ visit(parser.parse(markdown)); 2026-10-24T21:34:49.3487343Z 344 │ for (const lineStart of lineStarts.reverse()) { 2026-10-24T21:34:49.3487448Z ·  ─────── 2026-10-24T21:34:49.3487608Z 345 │ // The header row may be a lazy line without its container markers (`>` or list indent), 2026-10-24T21:34:49.3487657Z ╰──── 2026-10-24T21:34:49.3487909Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T21:34:49.3487912Z 2026-10-24T21:34:49.3488089Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T21:34:49.3488269Z ╭─[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:116:34] 2026-10-24T21:34:49.3488336Z 115 │ return [...commands]; 2026-10-24T21:34:49.3488511Z 116 │ }, [activeThreadRef, pathname, registrationVersion, navigation]); 2026-10-24T21:34:49.3488649Z ·  ─────────┬───────── 2026-10-24T21:34:49.3488832Z · ╰── Unnecessary dependency `registrationVersion` 2026-10-24T21:34:49.3488884Z 117 │ 2026-10-24T21:34:49.3488933Z ╰──── 2026-10-24T21:34:49.3489242Z  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-24T21:34:49.3489546Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.3489548Z 2026-10-24T21:34:49.3489737Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T21:34:49.3489886Z ╭─[apps/mobile/src/components/ComposerContextSheet.tsx:272:25] 2026-10-24T21:34:49.3489995Z 271 │ {record.elements?.map((element, index) => ( 2026-10-24T21:34:49.3490159Z 272 │ 2026-10-24T21:34:49.3490309Z ·  ─────────────────────────────────────────────────────── 2026-10-24T21:34:49.3490382Z 273 │ { 2026-10-24T21:34:49.3493559Z ·  ────┬──── 2026-10-24T21:34:49.3493689Z · ╰── This is the containing effect 2026-10-24T21:34:49.3493768Z 119 │ void refreshNotifications(); 2026-10-24T21:34:49.3493858Z ·  ──────────┬───────── 2026-10-24T21:34:49.3494029Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3494170Z 120 │ const subscription = AppState.addEventListener("change", (state) => { 2026-10-24T21:34:49.3494220Z ╰──── 2026-10-24T21:34:49.3494809Z  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-24T21:34:49.3495126Z  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-24T21:34:49.3495128Z 2026-10-24T21:34:49.3495375Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T21:34:49.3495557Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7] 2026-10-24T21:34:49.3495609Z 125 │ 2026-10-24T21:34:49.3495674Z 126 │ useEffect(() => { 2026-10-24T21:34:49.3495741Z ·  ────┬──── 2026-10-24T21:34:49.3495867Z · ╰── This is the containing effect 2026-10-24T21:34:49.3495933Z 127 │ if (!isLoaded) { 2026-10-24T21:34:49.3496026Z 128 │ setLiveActivityStatus("checking"); 2026-10-24T21:34:49.3496113Z ·  ──────────┬────────── 2026-10-24T21:34:49.3496282Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3496343Z 129 │ return; 2026-10-24T21:34:49.3496394Z ╰──── 2026-10-24T21:34:49.3496974Z  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-24T21:34:49.3497288Z  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-24T21:34:49.3497335Z 2026-10-24T21:34:49.3497586Z ⚠ eslint(no-unused-vars): Function 'resolveThreadWorkspaceCwd' is declared but never used. 2026-10-24T21:34:49.3497702Z ╭─[apps/server/src/checkpointing/Utils.ts:12:10] 2026-10-24T21:34:49.3497753Z 11 │ 2026-10-24T21:34:49.3497940Z 12 │ function resolveThreadWorkspaceCwd(input: { 2026-10-24T21:34:49.3498040Z ·  ────────────┬──────────── 2026-10-24T21:34:49.3498206Z · ╰── 'resolveThreadWorkspaceCwd' is declared here 2026-10-24T21:34:49.3498271Z 13 │ readonly thread: { 2026-10-24T21:34:49.3498322Z ╰──── 2026-10-24T21:34:49.3498423Z  help: Consider removing this declaration. 2026-10-24T21:34:49.3498426Z 2026-10-24T21:34:49.3498680Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T21:34:49.3498812Z ╭─[apps/mobile/src/components/ProjectFavicon.tsx:172:5] 2026-10-24T21:34:49.3498995Z 167 │ const [activeFaviconRequest, setActiveFaviconRequest] = useState(null); 2026-10-24T21:34:49.3499064Z 168 │ useLayoutEffect(() => { 2026-10-24T21:34:49.3499142Z ·  ───────┬─────── 2026-10-24T21:34:49.3499272Z · ╰── This is the containing effect 2026-10-24T21:34:49.3499356Z 169 │ if (faviconRequest === null) return; 2026-10-24T21:34:49.3499412Z 170 │ 2026-10-24T21:34:49.3499541Z 171 │ const endRequest = beginProjectFaviconRequest(faviconRequest); 2026-10-24T21:34:49.3499640Z 172 │ setActiveFaviconRequest(faviconRequest); 2026-10-24T21:34:49.3499726Z ·  ───────────┬─────────── 2026-10-24T21:34:49.3499902Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3499973Z 173 │ return endRequest; 2026-10-24T21:34:49.3500023Z ╰──── 2026-10-24T21:34:49.3500603Z  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-24T21:34:49.3500919Z  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-24T21:34:49.3500921Z 2026-10-24T21:34:49.3501199Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T21:34:49.3501344Z ╭─[apps/mobile/src/components/VideoPreviewModal.ios.tsx:63:55] 2026-10-24T21:34:49.3501403Z 61 │ }, []); 2026-10-24T21:34:49.3501466Z 62 │ useEffect(() => { 2026-10-24T21:34:49.3501535Z ·  ────┬──── 2026-10-24T21:34:49.3501659Z · ╰── This is the containing effect 2026-10-24T21:34:49.3501805Z 63 │ if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl); 2026-10-24T21:34:49.3501925Z ·  ───────┬────── 2026-10-24T21:34:49.3502126Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3502203Z 64 │ }, [playbackUrl, resolvedUrl]); 2026-10-24T21:34:49.3502305Z ╰──── 2026-10-24T21:34:49.3502917Z  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-24T21:34:49.3503228Z  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-24T21:34:49.3503231Z 2026-10-24T21:34:49.3503686Z ⚠ 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-24T21:34:49.3503835Z ╭─[apps/server/src/background/HostPowerMonitor.test.ts:133:11] 2026-10-24T21:34:49.3503965Z 132 │ const monitor = yield* HostPowerMonitor.HostPowerMonitor; 2026-10-24T21:34:49.3504109Z 133 │ ╭─▶ for ( 2026-10-24T21:34:49.3504210Z 134 │ │ let attempt = 0; 2026-10-24T21:34:49.3504374Z 135 │ │ attempt < 100 && (yield* monitor.snapshot).onBattery !== "true"; 2026-10-24T21:34:49.3504473Z 136 │ │ attempt += 1 2026-10-24T21:34:49.3504555Z 137 │ │ ) { 2026-10-24T21:34:49.3504663Z 138 │ │ yield* Effect.yieldNow; 2026-10-24T21:34:49.3504795Z 139 │ ╰─▶ } 2026-10-24T21:34:49.3504925Z 140 │ expect((yield* monitor.snapshot).onBattery).toBe("true"); 2026-10-24T21:34:49.3504981Z ╰──── 2026-10-24T21:34:49.3504984Z 2026-10-24T21:34:49.3505435Z ⚠ 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-24T21:34:49.3505586Z ╭─[apps/server/src/project/ProjectEnrichmentService.test.ts:28:3] 2026-10-24T21:34:49.3505642Z 27 │ ) { 2026-10-24T21:34:49.3505841Z 28 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T21:34:49.3505982Z 29 │ │ const available = yield* service.peek(workspaceRoot); 2026-10-24T21:34:49.3506108Z 30 │ │ if (predicate(available)) return available; 2026-10-24T21:34:49.3506209Z 31 │ │ yield* Effect.yieldNow; 2026-10-24T21:34:49.3506332Z 32 │ ╰─▶ } 2026-10-24T21:34:49.3506507Z 33 │ return yield* Effect.die(`Project metadata for ${workspaceRoot} was not resolved in time.`); 2026-10-24T21:34:49.3506557Z ╰──── 2026-10-24T21:34:49.3506560Z 2026-10-24T21:34:49.3506724Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T21:34:49.3506842Z ╭─[apps/server/src/processRunner.test.ts:266:14] 2026-10-24T21:34:49.3506894Z 265 │ 2026-10-24T21:34:49.3506996Z 266 │ for (const {} of ["timeout", "success"] as const) { 2026-10-24T21:34:49.3507067Z ·  ── 2026-10-24T21:34:49.3507119Z 267 │ } 2026-10-24T21:34:49.3507169Z ╰──── 2026-10-24T21:34:49.3507500Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T21:34:49.3507544Z 2026-10-24T21:34:49.3507722Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T21:34:49.3507879Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:100:85] 2026-10-24T21:34:49.3507979Z  99 │ const startEditor = startScheduledTaskEditor; 2026-10-24T21:34:49.3508157Z 100 │ const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]); 2026-10-24T21:34:49.3508302Z ·  ─────┬───── 2026-10-24T21:34:49.3508508Z · ╰── Unnecessary dependency `startEditor` 2026-10-24T21:34:49.3508589Z 101 │ const readEditor = useCallback( 2026-10-24T21:34:49.3508638Z ╰──── 2026-10-24T21:34:49.3508949Z  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-24T21:34:49.3509253Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.3509256Z 2026-10-24T21:34:49.3509432Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T21:34:49.3509585Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:121:7] 2026-10-24T21:34:49.3509647Z 120 │ setEditor, 2026-10-24T21:34:49.3509713Z 121 │ startEditor, 2026-10-24T21:34:49.3509793Z ·  ─────┬───── 2026-10-24T21:34:49.3509937Z · ╰── Unnecessary dependency `startEditor` 2026-10-24T21:34:49.3510000Z 122 │ hasChanges, 2026-10-24T21:34:49.3510051Z ╰──── 2026-10-24T21:34:49.3510354Z  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-24T21:34:49.3510657Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.3510660Z 2026-10-24T21:34:49.3510911Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T21:34:49.3511076Z ╭─[apps/server/src/orchestration-v2/ThreadPullRequestService.ts:410:7] 2026-10-24T21:34:49.3511130Z 409 │ 2026-10-24T21:34:49.3511283Z 410 │ const layer = Layer.effect(ThreadPullRequestServiceV2, make); 2026-10-24T21:34:49.3511353Z ·  ──┬── 2026-10-24T21:34:49.3511475Z · ╰── 'layer' is declared here 2026-10-24T21:34:49.3511526Z ╰──── 2026-10-24T21:34:49.3511628Z  help: Consider removing this declaration. 2026-10-24T21:34:49.3511630Z 2026-10-24T21:34:49.3511897Z ⚠ eslint(no-unused-vars): Variable 'layerDaemon' is declared but never used. Unused variables should start with a '_'. 2026-10-24T21:34:49.3512028Z ╭─[apps/server/src/orchestration-v2/EffectWorker.ts:914:7] 2026-10-24T21:34:49.3512079Z 913 │ 2026-10-24T21:34:49.3512311Z 914 │ const layerDaemon: Layer.Layer = Layer.effectDiscard( 2026-10-24T21:34:49.3512413Z ·  ─────┬───── 2026-10-24T21:34:49.3512544Z · ╰── 'layerDaemon' is declared here 2026-10-24T21:34:49.3512632Z 915 │ runDaemon.pipe(Effect.forkScoped), 2026-10-24T21:34:49.3512683Z ╰──── 2026-10-24T21:34:49.3512783Z  help: Consider removing this declaration. 2026-10-24T21:34:49.3512786Z 2026-10-24T21:34:49.3512979Z ⚠ eslint(no-unsafe-optional-chaining): Unsafe usage of optional chaining 2026-10-24T21:34:49.3513142Z ╭─[apps/server/src/orchestration-v2/ThreadLaunchService.test.ts:1783:8] 2026-10-24T21:34:49.3513206Z 1782 │ assert.equal( 2026-10-24T21:34:49.3513349Z 1783 │ (stored.context?.records[0] as { attachmentId: string }).attachmentId, 2026-10-24T21:34:49.3513454Z ·  ────────────────────────── 2026-10-24T21:34:49.3513536Z 1784 │ stored.attachments[0]?.id, 2026-10-24T21:34:49.3513588Z ╰──── 2026-10-24T21:34:49.3513756Z  help: If this short-circuits with 'undefined' the evaluation will throw TypeError 2026-10-24T21:34:49.3513759Z 2026-10-24T21:34:49.3513940Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T21:34:49.3514053Z ╭─[apps/mobile/src/lib/useHoverGesture.ts:8:15] 2026-10-24T21:34:49.3514110Z 7 │ () => 2026-10-24T21:34:49.3514177Z 8 │ Gesture.Hover() 2026-10-24T21:34:49.3514250Z ·  ──┬── 2026-10-24T21:34:49.3514385Z · ╰── `Hover` may be a component 2026-10-24T21:34:49.3514457Z 9 │ .manualActivation(true) 2026-10-24T21:34:49.3514507Z ╰──── 2026-10-24T21:34:49.3514786Z  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-24T21:34:49.3515228Z  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-24T21:34:49.3515231Z 2026-10-24T21:34:49.3515406Z ⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`. 2026-10-24T21:34:49.3515523Z ╭─[apps/web/src/terminal/ghostty/core.ts:194:19] 2026-10-24T21:34:49.3515647Z 193 │ const count = Math.min(CHUNK_SIZE, graphemeLength - start); 2026-10-24T21:34:49.3515736Z 194 │ const codes = new Array(count); 2026-10-24T21:34:49.3515889Z ·  ──────────────────────── 2026-10-24T21:34:49.3516018Z 195 │ for (let index = 0; index < count; index += 1) { 2026-10-24T21:34:49.3516069Z ╰──── 2026-10-24T21:34:49.3516474Z  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-24T21:34:49.3516477Z 2026-10-24T21:34:49.3516658Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T21:34:49.3516825Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:555:70] 2026-10-24T21:34:49.3516906Z 554 │ assert.deepStrictEqual( 2026-10-24T21:34:49.3517065Z 555 │ (yield* Ref.get(fixture.syncCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-24T21:34:49.3517188Z ·  ┬ 2026-10-24T21:34:49.3517350Z · ╰── '_' is declared here 2026-10-24T21:34:49.3517410Z 556 │ [ 2026-10-24T21:34:49.3517459Z ╰──── 2026-10-24T21:34:49.3517560Z  help: Consider removing this parameter. 2026-10-24T21:34:49.3517563Z 2026-10-24T21:34:49.3517740Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T21:34:49.3517910Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:1155:70] 2026-10-24T21:34:49.3517992Z 1154 │ assert.deepStrictEqual( 2026-10-24T21:34:49.3518151Z 1155 │ (yield* Ref.get(fixture.linkCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-24T21:34:49.3518277Z ·  ┬ 2026-10-24T21:34:49.3518441Z · ╰── '_' is declared here 2026-10-24T21:34:49.3518503Z 1156 │ [ 2026-10-24T21:34:49.3518553Z ╰──── 2026-10-24T21:34:49.3518651Z  help: Consider removing this parameter. 2026-10-24T21:34:49.3518654Z 2026-10-24T21:34:49.3519111Z ⚠ 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-24T21:34:49.3519243Z ╭─[apps/server/src/project/ProjectService.test.ts:94:3] 2026-10-24T21:34:49.3519297Z 93 │ ) { 2026-10-24T21:34:49.3519499Z 94 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T21:34:49.3519671Z 95 │ │ const project = Option.getOrThrow(yield* service.getById(projectId)); 2026-10-24T21:34:49.3519790Z 96 │ │ if (predicate(project)) return project; 2026-10-24T21:34:49.3519887Z 97 │ │ yield* Effect.yieldNow; 2026-10-24T21:34:49.3520006Z 98 │ ╰─▶ } 2026-10-24T21:34:49.3520153Z 99 │ return yield* Effect.die(`Project ${projectId} was not enriched in time.`); 2026-10-24T21:34:49.3520205Z ╰──── 2026-10-24T21:34:49.3520207Z 2026-10-24T21:34:49.3520429Z ⚠ eslint(no-unused-vars): Function 'assertUserMessagesExclude' is declared but never used. 2026-10-24T21:34:49.3520638Z ╭─[apps/server/src/orchestration-v2/testkit/fixtures/shared.ts:1398:10] 2026-10-24T21:34:49.3520806Z 1397 │ 2026-10-24T21:34:49.3520892Z 1398 │ function assertUserMessagesExclude( 2026-10-24T21:34:49.3520994Z ·  ────────────┬──────────── 2026-10-24T21:34:49.3521160Z · ╰── 'assertUserMessagesExclude' is declared here 2026-10-24T21:34:49.3521303Z 1399 │ projection: OrchestrationV2ThreadProjection, 2026-10-24T21:34:49.3521355Z ╰──── 2026-10-24T21:34:49.3521457Z  help: Consider removing this declaration. 2026-10-24T21:34:49.3521460Z 2026-10-24T21:34:49.3521713Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T21:34:49.3521881Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:123:7] 2026-10-24T21:34:49.3521937Z 118 │ 2026-10-24T21:34:49.3522006Z 119 │ useEffect(() => { 2026-10-24T21:34:49.3522076Z ·  ────┬──── 2026-10-24T21:34:49.3522205Z · ╰── This is the containing effect 2026-10-24T21:34:49.3522288Z 120 │ if (orientationSettled) return; 2026-10-24T21:34:49.3522400Z 121 │ const orientation = getNativeShowcaseOrientation(); 2026-10-24T21:34:49.3522473Z 122 │ if (orientation === null) { 2026-10-24T21:34:49.3522555Z 123 │ setOrientationSettled(true); 2026-10-24T21:34:49.3522643Z ·  ──────────┬────────── 2026-10-24T21:34:49.3522814Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3522873Z 124 │ return; 2026-10-24T21:34:49.3522923Z ╰──── 2026-10-24T21:34:49.3523517Z  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-24T21:34:49.3523837Z  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-24T21:34:49.3523839Z 2026-10-24T21:34:49.3524091Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T21:34:49.3524256Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:304:7] 2026-10-24T21:34:49.3524308Z 292 │ 2026-10-24T21:34:49.3524372Z 293 │ useEffect(() => { 2026-10-24T21:34:49.3524447Z ·  ────┬──── 2026-10-24T21:34:49.3524575Z · ╰── This is the containing effect 2026-10-24T21:34:49.3524633Z 294 │ if ( 2026-10-24T21:34:49.3524699Z 295 │ scene === null || 2026-10-24T21:34:49.3524774Z 296 │ requestedScene === null || 2026-10-24T21:34:49.3524849Z 297 │ scene !== requestedScene || 2026-10-24T21:34:49.3524913Z 298 │ !hasFixture || 2026-10-24T21:34:49.3524985Z 299 │ !orientationSettled || 2026-10-24T21:34:49.3525051Z 300 │ !themeApplied || 2026-10-24T21:34:49.3525166Z 301 │ (scene === "agent-activity" && !agentActivityStaged) || 2026-10-24T21:34:49.3525298Z 302 │ !isShowcaseNativeContentReady({ scene, themeId, renderSignal }) 2026-10-24T21:34:49.3525353Z 303 │ ) { 2026-10-24T21:34:49.3525419Z 304 │ setReadyScene(null); 2026-10-24T21:34:49.3525548Z ·  ──────┬────── 2026-10-24T21:34:49.3525746Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3525807Z 305 │ return; 2026-10-24T21:34:49.3525857Z ╰──── 2026-10-24T21:34:49.3526442Z  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-24T21:34:49.3526758Z  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-24T21:34:49.3526760Z 2026-10-24T21:34:49.3527029Z ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'. 2026-10-24T21:34:49.3527198Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:128:9] 2026-10-24T21:34:49.3527265Z 127 │ let cancelled = false; 2026-10-24T21:34:49.3527354Z 128 │ let lastOutcome: string | null = null; 2026-10-24T21:34:49.3527431Z ·  ─────┬───── 2026-10-24T21:34:49.3527567Z · ╰── 'lastOutcome' is declared here 2026-10-24T21:34:49.3527741Z 129 │ void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), { 2026-10-24T21:34:49.3527792Z ╰──── 2026-10-24T21:34:49.3527895Z  help: Consider removing this declaration. 2026-10-24T21:34:49.3527897Z 2026-10-24T21:34:49.3528059Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T21:34:49.3528213Z ╭─[apps/web/src/components/CommandPaletteThreadItems.tsx:152:58] 2026-10-24T21:34:49.3528390Z 151 │ if (threadSearchQuery.trim().length > 0 && !threadSearchQuery.startsWith(">") && !isOpen) { 2026-10-24T21:34:49.3528520Z 152 │ claimThreadOpen(thread.environmentId, thread.id, Date.now()); 2026-10-24T21:34:49.3528641Z ·  ─────┬──── 2026-10-24T21:34:49.3528809Z · ╰── Cannot call impure function 2026-10-24T21:34:49.3528863Z 153 │ } 2026-10-24T21:34:49.3528914Z ╰──── 2026-10-24T21:34:49.3529192Z  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-24T21:34:49.3529488Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T21:34:49.3529493Z 2026-10-24T21:34:49.3529691Z ⚠ eslint(no-unused-vars): Identifier 'HostProcess' is imported but never used. 2026-10-24T21:34:49.3529850Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:25:13] 2026-10-24T21:34:49.3529936Z 24 │ import * as Schema from "effect/Schema"; 2026-10-24T21:34:49.3530053Z 25 │ import * as HostProcess from "@t3tools/shared/HostProcess"; 2026-10-24T21:34:49.3530133Z ·  ─────┬───── 2026-10-24T21:34:49.3530271Z · ╰── 'HostProcess' is imported here 2026-10-24T21:34:49.3530324Z 26 │ 2026-10-24T21:34:49.3530375Z ╰──── 2026-10-24T21:34:49.3530517Z  help: Consider removing this import. 2026-10-24T21:34:49.3530547Z 2026-10-24T21:34:49.3530813Z ⚠ eslint(no-unused-vars): Variable 'serverConfig' is declared but never used. Unused variables should start with a '_'. 2026-10-24T21:34:49.3530977Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:124:11] 2026-10-24T21:34:49.3531059Z 123 │ const path = yield* Path.Path; 2026-10-24T21:34:49.3531206Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-24T21:34:49.3531286Z ·  ──────┬───── 2026-10-24T21:34:49.3531422Z · ╰── 'serverConfig' is declared here 2026-10-24T21:34:49.3531562Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-24T21:34:49.3531612Z ╰──── 2026-10-24T21:34:49.3531718Z  help: Consider removing this declaration. 2026-10-24T21:34:49.3531723Z 2026-10-24T21:34:49.3531992Z ⚠ eslint(no-unused-vars): Variable 'serverSettings' is declared but never used. Unused variables should start with a '_'. 2026-10-24T21:34:49.3532153Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:125:11] 2026-10-24T21:34:49.3532268Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-24T21:34:49.3532404Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-24T21:34:49.3532490Z ·  ───────┬────── 2026-10-24T21:34:49.3532632Z · ╰── 'serverSettings' is declared here 2026-10-24T21:34:49.3532767Z 126 │ const gitWorkflow = yield* GitWorkflowService.GitWorkflowService; 2026-10-24T21:34:49.3532815Z ╰──── 2026-10-24T21:34:49.3532923Z  help: Consider removing this declaration. 2026-10-24T21:34:49.3532927Z 2026-10-24T21:34:49.3533091Z ⚠ eslint(no-control-regex): Unexpected control character 2026-10-24T21:34:49.3533282Z ╭─[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46] 2026-10-24T21:34:49.3533419Z 219 │ 2026-10-24T21:34:49.3533558Z 220 │ {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")} 2026-10-24T21:34:49.3533664Z ·  ──┬─ 2026-10-24T21:34:49.3533825Z · ╰── 'U+001B' is a control character. 2026-10-24T21:34:49.3533889Z 221 │ 2026-10-24T21:34:49.3533938Z ╰──── 2026-10-24T21:34:49.3534175Z  help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression. 2026-10-24T21:34:49.3534180Z 2026-10-24T21:34:49.3534636Z ⚠ 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-24T21:34:49.3534810Z ╭─[apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts:223:5] 2026-10-24T21:34:49.3534883Z 222 │ let idlePasses = 0; 2026-10-24T21:34:49.3535023Z 223 │ ╭─▶ for (;;) { 2026-10-24T21:34:49.3535158Z 224 │ │ yield* Effect.promise(() => Promise.resolve()); 2026-10-24T21:34:49.3535351Z 225 │ │ const pending = backgroundRuntime.pending.shift(); 2026-10-24T21:34:49.3535478Z 226 │ │ if (!pending) { 2026-10-24T21:34:49.3535570Z 227 │ │ idlePasses++; 2026-10-24T21:34:49.3535675Z 228 │ │ if (idlePasses >= 3) { 2026-10-24T21:34:49.3535759Z 229 │ │ return; 2026-10-24T21:34:49.3535835Z 230 │ │ } 2026-10-24T21:34:49.3535920Z 231 │ │ continue; 2026-10-24T21:34:49.3535995Z 232 │ │ } 2026-10-24T21:34:49.3536087Z 233 │ │ idlePasses = 0; 2026-10-24T21:34:49.3536201Z 234 │ │ const exit = yield* Effect.exit( 2026-10-24T21:34:49.3536414Z 235 │ │ pending.operation as Effect.Effect, 2026-10-24T21:34:49.3536497Z 236 │ │ ); 2026-10-24T21:34:49.3536603Z 237 │ │ yield* Effect.sync(() => { 2026-10-24T21:34:49.3536706Z 238 │ │ pending.resolve(exit); 2026-10-24T21:34:49.3536783Z 239 │ │ }); 2026-10-24T21:34:49.3536913Z 240 │ ╰─▶ } 2026-10-24T21:34:49.3536971Z 241 │ }, 2026-10-24T21:34:49.3537020Z ╰──── 2026-10-24T21:34:49.3537023Z 2026-10-24T21:34:49.3537165Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.3537320Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:122:38] 2026-10-24T21:34:49.3537475Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-24T21:34:49.3537602Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-24T21:34:49.3537721Z ·  ───────────┬────────── 2026-10-24T21:34:49.3537891Z · ╰── Cannot access ref value during render 2026-10-24T21:34:49.3538010Z 123 │ const sessionRef = useRef(null); 2026-10-24T21:34:49.3538061Z ╰──── 2026-10-24T21:34:49.3538524Z  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-24T21:34:49.3538812Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.3538819Z 2026-10-24T21:34:49.3538961Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.3539117Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8] 2026-10-24T21:34:49.3539168Z 125 │ 2026-10-24T21:34:49.3539275Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T21:34:49.3539362Z ·  ─────────┬──────── 2026-10-24T21:34:49.3539510Z · ╰── Cannot access ref value during render 2026-10-24T21:34:49.3539608Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T21:34:49.3539661Z ╰──── 2026-10-24T21:34:49.3540167Z  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-24T21:34:49.3540482Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.3540485Z 2026-10-24T21:34:49.3540623Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.3540776Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7] 2026-10-24T21:34:49.3540828Z 125 │ 2026-10-24T21:34:49.3540934Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T21:34:49.3541020Z ·  ─────────┬───────── 2026-10-24T21:34:49.3541163Z · ╰── Cannot access ref value during render 2026-10-24T21:34:49.3541301Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T21:34:49.3541356Z ╰──── 2026-10-24T21:34:49.3541813Z  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-24T21:34:49.3542101Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.3542103Z 2026-10-24T21:34:49.3542243Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.3542396Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31] 2026-10-24T21:34:49.3542448Z 125 │ 2026-10-24T21:34:49.3542552Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T21:34:49.3542665Z ·  ─────────┬───────── 2026-10-24T21:34:49.3542831Z · ╰── Cannot access ref value during render 2026-10-24T21:34:49.3542928Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T21:34:49.3542979Z ╰──── 2026-10-24T21:34:49.3543432Z  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-24T21:34:49.3543717Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.3543719Z 2026-10-24T21:34:49.3543861Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.3544064Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30] 2026-10-24T21:34:49.3544143Z 125 │ 2026-10-24T21:34:49.3544246Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T21:34:49.3544358Z ·  ──────────┬───────── 2026-10-24T21:34:49.3545776Z · ╰── Cannot access ref value during render 2026-10-24T21:34:49.3545888Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T21:34:49.3545938Z ╰──── 2026-10-24T21:34:49.3546397Z  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-24T21:34:49.3546691Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.3546696Z 2026-10-24T21:34:49.3546839Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.3546993Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46] 2026-10-24T21:34:49.3547103Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T21:34:49.3547520Z 127 │ ╭─▶ const recorder = createLazyVoiceRecorder({ 2026-10-24T21:34:49.3547691Z 128 │ │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-24T21:34:49.3547815Z 129 │ │ onStatus: (status: RecordingStatus) => { 2026-10-24T21:34:49.3547971Z 130 │ │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-24T21:34:49.3548091Z 131 │ │ isFinished: status.isFinished, 2026-10-24T21:34:49.3548263Z 132 │ │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-24T21:34:49.3548365Z 133 │ │ error: status.error, 2026-10-24T21:34:49.3548461Z 134 │ │ url: status.url, 2026-10-24T21:34:49.3548541Z 135 │ │ }); 2026-10-24T21:34:49.3548618Z 136 │ │ }, 2026-10-24T21:34:49.3548811Z 137 │ │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-24T21:34:49.3548916Z 138 │ │ selectInput: (inputs) => { 2026-10-24T21:34:49.3549074Z 139 │ │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-24T21:34:49.3549220Z 140 │ │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-24T21:34:49.3549384Z 141 │ │ const known = microphoneOrder(preferences.value.microphones); 2026-10-24T21:34:49.3549519Z 142 │ │ const order = rememberMicrophones(known, inputs); 2026-10-24T21:34:49.3549620Z 143 │ │ if (order !== known) { 2026-10-24T21:34:49.3549757Z 144 │ │ registry.set(updateMobilePreferencesAtom, { 2026-10-24T21:34:49.3549868Z 145 │ │ transform: (current) => ({ 2026-10-24T21:34:49.3550069Z 146 │ │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-24T21:34:49.3550224Z 147 │ │ }), 2026-10-24T21:34:49.3550401Z 148 │ │ }); 2026-10-24T21:34:49.3550477Z 149 │ │ } 2026-10-24T21:34:49.3550619Z 150 │ │ return preferredMicrophoneInput(inputs, order); 2026-10-24T21:34:49.3550697Z 151 │ │ }, 2026-10-24T21:34:49.3550824Z 152 │ ├─▶ }); 2026-10-24T21:34:49.3551058Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T21:34:49.3551143Z 153 │ recorderRef.current = recorder; 2026-10-24T21:34:49.3551226Z ╰──── 2026-10-24T21:34:49.3551694Z  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-24T21:34:49.3551982Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.3551985Z 2026-10-24T21:34:49.3552126Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.3552280Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16] 2026-10-24T21:34:49.3552336Z 152 │ }); 2026-10-24T21:34:49.3552416Z 153 │ recorderRef.current = recorder; 2026-10-24T21:34:49.3552528Z ·  ─────┬─────────┬─── 2026-10-24T21:34:49.3552714Z · │ ╰── Cannot update ref value during render 2026-10-24T21:34:49.3552830Z · ╰── This value is a ref 2026-10-24T21:34:49.3552934Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T21:34:49.3552985Z ╰──── 2026-10-24T21:34:49.3553439Z  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-24T21:34:49.3553723Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.3553725Z 2026-10-24T21:34:49.3553865Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.3554024Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48] 2026-10-24T21:34:49.3554111Z 153 │ recorderRef.current = recorder; 2026-10-24T21:34:49.3554298Z 154 │ ╭─▶ sessionRef.current = new VoiceInputSession({ 2026-10-24T21:34:49.3554382Z 155 │ │ recorder, 2026-10-24T21:34:49.3554507Z 156 │ │ getTranscriber: getLocalVoiceTranscriber, 2026-10-24T21:34:49.3554621Z 157 │ │ requestPermission: async () => { 2026-10-24T21:34:49.3554782Z 158 │ │ const permission = await requestRecordingPermissionsAsync(); 2026-10-24T21:34:49.3554969Z 159 │ │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-24T21:34:49.3555045Z 160 │ │ }, 2026-10-24T21:34:49.3555239Z 161 │ │ configureRecording: configureVoiceRecordingAudio, 2026-10-24T21:34:49.3555401Z 162 │ │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-24T21:34:49.3555532Z 163 │ │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-24T21:34:49.3555642Z 164 │ │ onStateChange: (nextState) => 2026-10-24T21:34:49.3555732Z 165 │ │ setState({ 2026-10-24T21:34:49.3555831Z 166 │ │ state: nextState, 2026-10-24T21:34:49.3555965Z 167 │ │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-24T21:34:49.3556091Z 168 │ │ label: sessionRef.current?.label ?? null, 2026-10-24T21:34:49.3556169Z 169 │ │ }), 2026-10-24T21:34:49.3556300Z 170 │ ├─▶ }); 2026-10-24T21:34:49.3556495Z · ╰──── Cannot access ref value during render 2026-10-24T21:34:49.3556550Z 171 │ } 2026-10-24T21:34:49.3556601Z ╰──── 2026-10-24T21:34:49.3557055Z  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-24T21:34:49.3557339Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.3557343Z 2026-10-24T21:34:49.3557482Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.3557641Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15] 2026-10-24T21:34:49.3557724Z 153 │ recorderRef.current = recorder; 2026-10-24T21:34:49.3557825Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T21:34:49.3557933Z ·  ─────┬────────┬─── 2026-10-24T21:34:49.3558110Z · │ ╰── Cannot update ref value during render 2026-10-24T21:34:49.3558224Z · ╰── This value is a ref 2026-10-24T21:34:49.3558287Z 155 │ recorder, 2026-10-24T21:34:49.3558336Z ╰──── 2026-10-24T21:34:49.3558796Z  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-24T21:34:49.3559081Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.3559083Z 2026-10-24T21:34:49.3559222Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.3559374Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7] 2026-10-24T21:34:49.3559462Z 184 │ return () => subscription.remove(); 2026-10-24T21:34:49.3559529Z 185 │ }, [controller]); 2026-10-24T21:34:49.3559604Z ·  ─────┬──── 2026-10-24T21:34:49.3559746Z · ╰── Cannot access ref value during render 2026-10-24T21:34:49.3559797Z 186 │ 2026-10-24T21:34:49.3559846Z ╰──── 2026-10-24T21:34:49.3560344Z  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-24T21:34:49.3560655Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.3560657Z 2026-10-24T21:34:49.3560795Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.3560947Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6] 2026-10-24T21:34:49.3561031Z 184 │ return () => subscription.remove(); 2026-10-24T21:34:49.3561095Z 185 │ }, [controller]); 2026-10-24T21:34:49.3561168Z ·  ──────┬───── 2026-10-24T21:34:49.3561341Z · ╰── Cannot access ref value during render 2026-10-24T21:34:49.3561395Z 186 │ 2026-10-24T21:34:49.3561445Z ╰──── 2026-10-24T21:34:49.3561895Z  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-24T21:34:49.3562175Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.3562178Z 2026-10-24T21:34:49.3562316Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.3562467Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6] 2026-10-24T21:34:49.3562521Z 191 │ }, 2026-10-24T21:34:49.3562594Z 192 │ [controller, recorder], 2026-10-24T21:34:49.3562669Z ·  ─────┬──── 2026-10-24T21:34:49.3562809Z · ╰── Cannot access ref value during render 2026-10-24T21:34:49.3562862Z 193 │ ); 2026-10-24T21:34:49.3562911Z ╰──── 2026-10-24T21:34:49.3563364Z  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-24T21:34:49.3563645Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.3563648Z 2026-10-24T21:34:49.3563792Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.3563944Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20] 2026-10-24T21:34:49.3564033Z 174 │ const controller = session.controller; 2026-10-24T21:34:49.3564117Z 175 │ const recorder = recorderRef.current; 2026-10-24T21:34:49.3564218Z ·  ─────────┬───────── 2026-10-24T21:34:49.3564371Z · ╰── Cannot access ref value during render 2026-10-24T21:34:49.3564422Z 176 │ 2026-10-24T21:34:49.3564474Z ╰──── 2026-10-24T21:34:49.3564925Z  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-24T21:34:49.3565257Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.3565287Z 2026-10-24T21:34:49.3565424Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.3565574Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5] 2026-10-24T21:34:49.3565629Z 191 │ }, 2026-10-24T21:34:49.3565698Z 192 │ [controller, recorder], 2026-10-24T21:34:49.3565784Z ·  ───────────┬────────── 2026-10-24T21:34:49.3565929Z · ╰── Cannot access ref value during render 2026-10-24T21:34:49.3565984Z 193 │ ); 2026-10-24T21:34:49.3566033Z ╰──── 2026-10-24T21:34:49.3566489Z  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-24T21:34:49.3566778Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.3566781Z 2026-10-24T21:34:49.3566919Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.3567072Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20] 2026-10-24T21:34:49.3567161Z 245 │ return () => clearInterval(intervalId); 2026-10-24T21:34:49.3567268Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-24T21:34:49.3567353Z ·  ─────┬──── 2026-10-24T21:34:49.3567507Z · ╰── Cannot access ref value during render 2026-10-24T21:34:49.3567560Z 247 │ 2026-10-24T21:34:49.3567608Z ╰──── 2026-10-24T21:34:49.3568059Z  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-24T21:34:49.3568341Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.3568343Z 2026-10-24T21:34:49.3568482Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.3568634Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6] 2026-10-24T21:34:49.3568721Z 245 │ return () => clearInterval(intervalId); 2026-10-24T21:34:49.3568832Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-24T21:34:49.3568960Z ·  ────────────────────────┬─────────────────────── 2026-10-24T21:34:49.3569115Z · ╰── Cannot access ref value during render 2026-10-24T21:34:49.3569164Z 247 │ 2026-10-24T21:34:49.3569214Z ╰──── 2026-10-24T21:34:49.3569665Z  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-24T21:34:49.3569948Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.3569950Z 2026-10-24T21:34:49.3570135Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.3570315Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5] 2026-10-24T21:34:49.3570381Z 260 │ setOwnerFocused, 2026-10-24T21:34:49.3570441Z 261 │ session, 2026-10-24T21:34:49.3570509Z ·  ───┬─── 2026-10-24T21:34:49.3570644Z · ╰── Cannot access ref value during render 2026-10-24T21:34:49.3570702Z 262 │ stop, 2026-10-24T21:34:49.3570752Z ╰──── 2026-10-24T21:34:49.3571213Z  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-24T21:34:49.3571528Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.3571533Z 2026-10-24T21:34:49.3571671Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.3571821Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10] 2026-10-24T21:34:49.3571874Z 250 │ 2026-10-24T21:34:49.3572009Z 251 │ ╭─▶ return { 2026-10-24T21:34:49.3572213Z 252 │ │ isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null, 2026-10-24T21:34:49.3572291Z 253 │ │ state, 2026-10-24T21:34:49.3572377Z 254 │ │ audioLevels, 2026-10-24T21:34:49.3572466Z 255 │ │ elapsedSeconds, 2026-10-24T21:34:49.3572599Z 256 │ │ isBusy: voiceInputBlocksSubmission(state), 2026-10-24T21:34:49.3572680Z 257 │ │ ownerKey, 2026-10-24T21:34:49.3572756Z 258 │ │ label, 2026-10-24T21:34:49.3572842Z 259 │ │ focusedOwners, 2026-10-24T21:34:49.3572933Z 260 │ │ setOwnerFocused, 2026-10-24T21:34:49.3573014Z 261 │ │ session, 2026-10-24T21:34:49.3573089Z 262 │ │ stop, 2026-10-24T21:34:49.3573166Z 263 │ │ cancel, 2026-10-24T21:34:49.3573290Z 264 │ ├─▶ }; 2026-10-24T21:34:49.3573484Z · ╰──── Cannot access ref value during render 2026-10-24T21:34:49.3573589Z 265 │ } 2026-10-24T21:34:49.3573667Z ╰──── 2026-10-24T21:34:49.3574119Z  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-24T21:34:49.3574401Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.3574404Z 2026-10-24T21:34:49.3574558Z ⚠ react(immutability): This value cannot be modified 2026-10-24T21:34:49.3574711Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-24T21:34:49.3574869Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-24T21:34:49.3574994Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-24T21:34:49.3575072Z ·  ─────┬───── 2026-10-24T21:34:49.3575204Z · ╰── `audioLevels` originates here 2026-10-24T21:34:49.3575319Z 123 │ const sessionRef = useRef(null); 2026-10-24T21:34:49.3575462Z 124 │ const recorderRef = useRef | null>(null); 2026-10-24T21:34:49.3575513Z 125 │ 2026-10-24T21:34:49.3575617Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T21:34:49.3575713Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T21:34:49.3575846Z 128 │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-24T21:34:49.3575938Z 129 │ onStatus: (status: RecordingStatus) => { 2026-10-24T21:34:49.3576061Z 130 │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-24T21:34:49.3576147Z 131 │ isFinished: status.isFinished, 2026-10-24T21:34:49.3576289Z 132 │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-24T21:34:49.3576361Z 133 │ error: status.error, 2026-10-24T21:34:49.3576428Z 134 │ url: status.url, 2026-10-24T21:34:49.3576485Z 135 │ }); 2026-10-24T21:34:49.3576541Z 136 │ }, 2026-10-24T21:34:49.3576702Z 137 │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-24T21:34:49.3576778Z 138 │ selectInput: (inputs) => { 2026-10-24T21:34:49.3576898Z 139 │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-24T21:34:49.3577009Z 140 │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-24T21:34:49.3577144Z 141 │ const known = microphoneOrder(preferences.value.microphones); 2026-10-24T21:34:49.3577250Z 142 │ const order = rememberMicrophones(known, inputs); 2026-10-24T21:34:49.3577321Z 143 │ if (order !== known) { 2026-10-24T21:34:49.3577426Z 144 │ registry.set(updateMobilePreferencesAtom, { 2026-10-24T21:34:49.3577507Z 145 │ transform: (current) => ({ 2026-10-24T21:34:49.3577677Z 146 │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-24T21:34:49.3577737Z 147 │ }), 2026-10-24T21:34:49.3577796Z 148 │ }); 2026-10-24T21:34:49.3577852Z 149 │ } 2026-10-24T21:34:49.3577958Z 150 │ return preferredMicrophoneInput(inputs, order); 2026-10-24T21:34:49.3578013Z 151 │ }, 2026-10-24T21:34:49.3578068Z 152 │ }); 2026-10-24T21:34:49.3578148Z 153 │ recorderRef.current = recorder; 2026-10-24T21:34:49.3578296Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T21:34:49.3578389Z 155 │ recorder, 2026-10-24T21:34:49.3578486Z 156 │ getTranscriber: getLocalVoiceTranscriber, 2026-10-24T21:34:49.3578568Z 157 │ requestPermission: async () => { 2026-10-24T21:34:49.3578695Z 158 │ const permission = await requestRecordingPermissionsAsync(); 2026-10-24T21:34:49.3578847Z 159 │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-24T21:34:49.3578902Z 160 │ }, 2026-10-24T21:34:49.3579010Z 161 │ configureRecording: configureVoiceRecordingAudio, 2026-10-24T21:34:49.3579113Z 162 │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-24T21:34:49.3579213Z 163 │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-24T21:34:49.3579294Z 164 │ onStateChange: (nextState) => 2026-10-24T21:34:49.3579359Z 165 │ setState({ 2026-10-24T21:34:49.3579431Z 166 │ state: nextState, 2026-10-24T21:34:49.3579536Z 167 │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-24T21:34:49.3579632Z 168 │ label: sessionRef.current?.label ?? null, 2026-10-24T21:34:49.3579690Z 169 │ }), 2026-10-24T21:34:49.3579743Z 170 │ }); 2026-10-24T21:34:49.3579795Z 171 │ } 2026-10-24T21:34:49.3579845Z 172 │ 2026-10-24T21:34:49.3579928Z 173 │ const session = sessionRef.current; 2026-10-24T21:34:49.3580013Z 174 │ const controller = session.controller; 2026-10-24T21:34:49.3580096Z 175 │ const recorder = recorderRef.current; 2026-10-24T21:34:49.3580148Z 176 │ 2026-10-24T21:34:49.3580212Z 177 │ useEffect(() => { 2026-10-24T21:34:49.3580358Z 178 │ const subscription = AppState.addEventListener("change", (nextState) => { 2026-10-24T21:34:49.3580502Z 179 │ // iOS reports `inactive` while its permission dialog is open. Only the 2026-10-24T21:34:49.3580639Z 180 │ // real background state cancels preparation; recorder status handles 2026-10-24T21:34:49.3580741Z 181 │ // calls and route interruptions during capture. 2026-10-24T21:34:49.3580871Z 182 │ if (nextState === "background") controller.appMovedToBackground(); 2026-10-24T21:34:49.3580924Z 183 │ }); 2026-10-24T21:34:49.3581007Z 184 │ return () => subscription.remove(); 2026-10-24T21:34:49.3581070Z 185 │ }, [controller]); 2026-10-24T21:34:49.3581120Z 186 │ 2026-10-24T21:34:49.3581210Z 187 │ useEffect( 2026-10-24T21:34:49.3581271Z 188 │ () => () => { 2026-10-24T21:34:49.3581340Z 189 │ controller.dispose(); 2026-10-24T21:34:49.3581407Z 190 │ recorder.release(); 2026-10-24T21:34:49.3581461Z 191 │ }, 2026-10-24T21:34:49.3581529Z 192 │ [controller, recorder], 2026-10-24T21:34:49.3581586Z 193 │ ); 2026-10-24T21:34:49.3581638Z 194 │ 2026-10-24T21:34:49.3581700Z 195 │ useEffect(() => { 2026-10-24T21:34:49.3581791Z 196 │ if (state.phase !== "recording") return; 2026-10-24T21:34:49.3581840Z 197 │ 2026-10-24T21:34:49.3581983Z 198 │ const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`; 2026-10-24T21:34:49.3582085Z 199 │ const activation = activateKeepAwakeAsync(tag); 2026-10-24T21:34:49.3582164Z 200 │ void activation.catch(() => {}); 2026-10-24T21:34:49.3582224Z 201 │ return () => { 2026-10-24T21:34:49.3582371Z 202 │ // Release after activation settles, even if the recording ends immediately. 2026-10-24T21:34:49.3582506Z 203 │ void activation.then(() => deactivateKeepAwake(tag)).catch(() => {}); 2026-10-24T21:34:49.3582558Z 204 │ }; 2026-10-24T21:34:49.3582635Z 205 │ }, [keepAwakeId, state.phase]); 2026-10-24T21:34:49.3582733Z 206 │ 2026-10-24T21:34:49.3582822Z 207 │ useEffect(() => { 2026-10-24T21:34:49.3582952Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-24T21:34:49.3583002Z 209 │ 2026-10-24T21:34:49.3583120Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-24T21:34:49.3583272Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-24T21:34:49.3583371Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-24T21:34:49.3583447Z ·  ─────┬───── 2026-10-24T21:34:49.3583584Z · ╰── `audioLevels` cannot be modified 2026-10-24T21:34:49.3583637Z 213 │ } 2026-10-24T21:34:49.3583687Z ╰──── 2026-10-24T21:34:49.3583956Z  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-24T21:34:49.3584259Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T21:34:49.3584262Z 2026-10-24T21:34:49.3584459Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T21:34:49.3584613Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-24T21:34:49.3584663Z 206 │ 2026-10-24T21:34:49.3584728Z 207 │ useEffect(() => { 2026-10-24T21:34:49.3584806Z ·  ───┬─── 2026-10-24T21:34:49.3585020Z · ╰── This function may (indirectly) reassign or modify `audioLevels` after render 2026-10-24T21:34:49.3585157Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-24T21:34:49.3585210Z 209 │ 2026-10-24T21:34:49.3585327Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-24T21:34:49.3585478Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-24T21:34:49.3585576Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-24T21:34:49.3585651Z ·  ─────┬───── 2026-10-24T21:34:49.3585781Z · ╰── This modifies `audioLevels` 2026-10-24T21:34:49.3585835Z 213 │ } 2026-10-24T21:34:49.3585884Z ╰──── 2026-10-24T21:34:49.3586217Z  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-24T21:34:49.3586523Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T21:34:49.3586528Z 2026-10-24T21:34:49.3586682Z ⚠ react(immutability): This value cannot be modified 2026-10-24T21:34:49.3586848Z ╭─[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5] 2026-10-24T21:34:49.3586949Z 65 │ const [expanded, setExpanded] = useState(false); 2026-10-24T21:34:49.3587031Z 66 │ const progress = useSharedValue(0); 2026-10-24T21:34:49.3587104Z ·  ────┬─── 2026-10-24T21:34:49.3587243Z · ╰── `progress` originates here 2026-10-24T21:34:49.3587307Z 67 │ useEffect(() => { 2026-10-24T21:34:49.3587471Z 68 │ progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING); 2026-10-24T21:34:49.3587541Z ·  ────┬─── 2026-10-24T21:34:49.3587730Z · ╰── `progress` cannot be modified 2026-10-24T21:34:49.3587842Z 69 │ }, [expanded, progress]); 2026-10-24T21:34:49.3587892Z ╰──── 2026-10-24T21:34:49.3588151Z  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-24T21:34:49.3588446Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T21:34:49.3588450Z 2026-10-24T21:34:49.3588601Z ⚠ react(immutability): This value cannot be modified 2026-10-24T21:34:49.3588769Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5] 2026-10-24T21:34:49.3588823Z 90 │ }) { 2026-10-24T21:34:49.3588939Z 91 │ const rotation = useSharedValue(props.hidden ? 1 : 0); 2026-10-24T21:34:49.3589013Z ·  ────┬─── 2026-10-24T21:34:49.3589139Z · ╰── `rotation` originates here 2026-10-24T21:34:49.3589208Z 92 │ useLayoutEffect(() => { 2026-10-24T21:34:49.3589346Z 93 │ rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING); 2026-10-24T21:34:49.3589413Z ·  ────┬─── 2026-10-24T21:34:49.3589541Z · ╰── `rotation` cannot be modified 2026-10-24T21:34:49.3589616Z 94 │ }, [props.hidden, rotation]); 2026-10-24T21:34:49.3589665Z ╰──── 2026-10-24T21:34:49.3589921Z  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-24T21:34:49.3590228Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T21:34:49.3590233Z 2026-10-24T21:34:49.3590385Z ⚠ react(immutability): This value cannot be modified 2026-10-24T21:34:49.3590552Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:269:5] 2026-10-24T21:34:49.3590644Z 266 │ const variant = props.variant ?? "plain"; 2026-10-24T21:34:49.3590775Z 267 │ const loadingVisibility = useSharedValue(props.loading ? 1 : 0); 2026-10-24T21:34:49.3590861Z ·  ────────┬──────── 2026-10-24T21:34:49.3591006Z · ╰── `loadingVisibility` originates here 2026-10-24T21:34:49.3591073Z 268 │ useLayoutEffect(() => { 2026-10-24T21:34:49.3591265Z 269 │ loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING); 2026-10-24T21:34:49.3591348Z ·  ────────┬──────── 2026-10-24T21:34:49.3591493Z · ╰── `loadingVisibility` cannot be modified 2026-10-24T21:34:49.3591581Z 270 │ }, [loadingVisibility, props.loading]); 2026-10-24T21:34:49.3591632Z ╰──── 2026-10-24T21:34:49.3591888Z  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-24T21:34:49.3592187Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T21:34:49.3592190Z 2026-10-24T21:34:49.3592343Z ⚠ react(immutability): This value cannot be modified 2026-10-24T21:34:49.3592553Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:328:5] 2026-10-24T21:34:49.3592637Z 325 │ }) { 2026-10-24T21:34:49.3592792Z 326 │ const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0); 2026-10-24T21:34:49.3592880Z ·  ─────────┬───────── 2026-10-24T21:34:49.3593028Z · ╰── `recordingVisibility` originates here 2026-10-24T21:34:49.3593096Z 327 │ useLayoutEffect(() => { 2026-10-24T21:34:49.3593278Z 328 │ recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING); 2026-10-24T21:34:49.3593364Z ·  ─────────┬───────── 2026-10-24T21:34:49.3593512Z · ╰── `recordingVisibility` cannot be modified 2026-10-24T21:34:49.3593601Z 329 │ }, [props.phase, recordingVisibility]); 2026-10-24T21:34:49.3593652Z ╰──── 2026-10-24T21:34:49.3593916Z  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-24T21:34:49.3594215Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T21:34:49.3594219Z 2026-10-24T21:34:49.3594415Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T21:34:49.3594559Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7] 2026-10-24T21:34:49.3594654Z 256 │ return () => cancelAnimationFrame(frame); 2026-10-24T21:34:49.3594732Z 257 │ }, [props.path, targetIndex]); 2026-10-24T21:34:49.3594805Z ·  ─────┬──── 2026-10-24T21:34:49.3594952Z · ╰── Unnecessary dependency `props.path` 2026-10-24T21:34:49.3595006Z 258 │ 2026-10-24T21:34:49.3595055Z ╰──── 2026-10-24T21:34:49.3595342Z  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-24T21:34:49.3595648Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.3595651Z 2026-10-24T21:34:49.3595841Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T21:34:49.3595984Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23] 2026-10-24T21:34:49.3596055Z 292 │ 2026-10-24T21:34:49.3597121Z ·  ─────────── 2026-10-24T21:34:49.3597185Z 310 │ {body} 2026-10-24T21:34:49.3597233Z ╰──── 2026-10-24T21:34:49.3597424Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T21:34:49.3597455Z 2026-10-24T21:34:49.3597597Z ⚠ react(refs): Cannot access refs during render 2026-10-24T21:34:49.3597759Z ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14] 2026-10-24T21:34:49.3597838Z 26 │ const latestInput = useRef(input); 2026-10-24T21:34:49.3597913Z 27 │ latestInput.current = input; 2026-10-24T21:34:49.3598022Z ·  ─────┬─────────┬─── 2026-10-24T21:34:49.3598204Z · │ ╰── Cannot update ref value during render 2026-10-24T21:34:49.3598315Z · ╰── This value is a ref 2026-10-24T21:34:49.3598389Z 28 │ const mounted = useRef(true); 2026-10-24T21:34:49.3598440Z ╰──── 2026-10-24T21:34:49.3598912Z  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-24T21:34:49.3599200Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T21:34:49.3599202Z 2026-10-24T21:34:49.3599457Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T21:34:49.3599596Z ╭─[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5] 2026-10-24T21:34:49.3599648Z 150 │ 2026-10-24T21:34:49.3599712Z 151 │ useEffect(() => { 2026-10-24T21:34:49.3599785Z ·  ────┬──── 2026-10-24T21:34:49.3599912Z · ╰── This is the containing effect 2026-10-24T21:34:49.3599995Z 152 │ if (!controlledSelectedPath) { 2026-10-24T21:34:49.3600055Z 153 │ return; 2026-10-24T21:34:49.3600108Z 154 │ } 2026-10-24T21:34:49.3600189Z 155 │ setExpandedPaths((current) => { 2026-10-24T21:34:49.3600269Z ·  ────────┬─────── 2026-10-24T21:34:49.3600436Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T21:34:49.3600559Z 156 │ const ancestors = ancestorPaths(controlledSelectedPath); 2026-10-24T21:34:49.3600610Z ╰──── 2026-10-24T21:34:49.3601274Z  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-24T21:34:49.3601622Z  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-24T21:34:49.3601625Z 2026-10-24T21:34:49.3601823Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T21:34:49.3601979Z ╭─[apps/mobile/src/features/workspace/WorkspaceToolbar.ios.tsx:114:33] 2026-10-24T21:34:49.3602075Z 113 │ return () => cancelAnimationFrame(frame); 2026-10-24T21:34:49.3602172Z 114 │ }, [restoreSearch, tabActive, bottomSearch]); 2026-10-24T21:34:49.3602275Z ·  ──────┬───── 2026-10-24T21:34:49.3602442Z · ╰── Unnecessary dependency `bottomSearch` 2026-10-24T21:34:49.3602545Z 115 │ const composeButton = nativeToolbarCompose ? ( 2026-10-24T21:34:49.3602595Z ╰──── 2026-10-24T21:34:49.3602887Z  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-24T21:34:49.3603193Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T21:34:49.3603197Z 2026-10-24T21:34:49.3603473Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T21:34:49.3603640Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:473:19] 2026-10-24T21:34:49.3603705Z 472 │ onFilters, 2026-10-24T21:34:49.3603774Z 473 │ authorOptions = [], 2026-10-24T21:34:49.3603848Z ·  ── 2026-10-24T21:34:49.3603914Z 474 │ labelOptions = [], 2026-10-24T21:34:49.3603964Z ╰──── 2026-10-24T21:34:49.3604277Z  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-24T21:34:49.3604280Z 2026-10-24T21:34:49.3604554Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T21:34:49.3604718Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:474:18] 2026-10-24T21:34:49.3604785Z 473 │ authorOptions = [], 2026-10-24T21:34:49.3604849Z 474 │ labelOptions = [], 2026-10-24T21:34:49.3604928Z ·  ── 2026-10-24T21:34:49.3604993Z 475 │ optionScope, 2026-10-24T21:34:49.3605044Z ╰──── 2026-10-24T21:34:49.3605353Z  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-24T21:34:49.3605355Z 2026-10-24T21:34:49.3605543Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T21:34:49.3605704Z ╭─[apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx:818:17] 2026-10-24T21:34:49.3605767Z 817 │
label.name.trim().toLowerCase()); 2026-10-24T21:34:49.3607214Z ·  ───────────────────────────────────────────────────────────────────── 2026-10-24T21:34:49.3607365Z 263 │ const holds = (label: string) => labels.includes(label.trim().toLowerCase()); 2026-10-24T21:34:49.3607418Z ╰──── 2026-10-24T21:34:49.3607494Z  help: Switch to `Set` 2026-10-24T21:34:49.3607496Z 2026-10-24T21:34:49.3607686Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T21:34:49.3607852Z ╭─[apps/web/src/components/pullRequest/PullRequestChecksPopover.tsx:88:15] 2026-10-24T21:34:49.3607912Z 87 │