2026-10-24T11:15:38.5531907Z Current runner version: '2.338.1' 2026-10-24T11:15:38.5535134Z Runner name: 'blacksmith-8vcpu-ubuntu-2404-sffit3nqhhhx5d5n' 2026-10-24T11:15:38.5535762Z Runner group name: 'blacksmith scale sets - blacksmith-8vcpu-ubuntu-2404' 2026-10-24T11:15:38.5536546Z Machine name: 'ip-172-31-73-130' 2026-10-24T11:15:38.5538102Z ##[group]GITHUB_TOKEN Permissions 2026-10-24T11:15:38.5539348Z Contents: read 2026-10-24T11:15:38.5539727Z Metadata: read 2026-10-24T11:15:38.5540123Z ##[endgroup] 2026-10-24T11:15:38.5541646Z Secret source: Actions 2026-10-24T11:15:38.5542438Z Cache mode: write 2026-10-24T11:15:38.5542975Z Prepare workflow directory 2026-10-24T11:15:38.5715312Z Prepare all required actions 2026-10-24T11:15:38.5740187Z Getting action download info 2026-10-24T11:15:38.6979954Z Download action repository 'actions/checkout@v6' (SHA:d23441a48e516b6c34aea4fa41551a30e30af803) 2026-10-24T11:15:38.7371691Z Download action repository 'actions/cache@v6' (SHA:55cc8345863c7cc4c66a329aec7e433d2d1c52a9) 2026-10-24T11:15:38.8410740Z Setting BLACKSMITH_ACTIONS_RESULTS_URL to https://results-receiver.actions.githubusercontent.com/ 2026-10-24T11:15:38.8447167Z Complete job name: Lint 2026-10-24T11:15:38.8796685Z A job started hook has been configured by the self-hosted runner administrator 2026-10-24T11:15:38.8859415Z ##[group]Run '/setup.sh' 2026-10-24T11:15:38.8872719Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T11:15:38.8873135Z env: 2026-10-24T11:15:38.8873354Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 176 2026-10-24T11:15:38.8873634Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 368 2026-10-24T11:15:38.8873918Z BLACKSMITH_CHECK_RUN_ID: 120858150836 2026-10-24T11:15:38.8874190Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-24T11:15:38.8874456Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-24T11:15:38.8874707Z ##[endgroup] 2026-10-24T11:15:38.9080732Z Logging daemon started (blacksmithd for logs) 2026-10-24T11:15:38.9181036Z Results daemon started (blacksmithd for results) 2026-10-24T11:15:38.9308278Z Background adoption and SSH setup started (PID: 3077) 2026-10-24T11:15:38.9309491Z 2026-10-24T11:15:38.9309601Z ---------------------------------------- 2026-10-24T11:15:38.9310320Z View this job: https://app.blacksmith.sh/pingdotgg/runs/40089177841/jobs/120858150836 2026-10-24T11:15:38.9310751Z SSH Access (using your GitHub SSH key): 2026-10-24T11:15:38.9311184Z ssh -p 64000 runner@blacksmith-8vcpu-ubuntu-2404-sffit3nqhhhx5d5n.vm.blacksmith.sh 2026-10-24T11:15:38.9311489Z 2026-10-24T11:15:38.9311593Z No GitHub SSH key? Add one at: 2026-10-24T11:15:38.9312064Z https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account 2026-10-24T11:15:38.9312457Z 2026-10-24T11:15:38.9312558Z ---------------------------------------- 2026-10-24T11:15:38.9312731Z 2026-10-24T11:15:38.9312869Z VM ID: blacksmith-8vcpu-ubuntu-2404-sffit3nqhhhx5d5n 2026-10-24T11:15:38.9313178Z Host: production-152.236.40.30-x8664 2026-10-24T11:15:38.9313438Z Host Agent PID: 3636175 2026-10-24T11:15:38.9313672Z Host Agent Git SHA: 1637818df 2026-10-24T11:15:38.9313929Z Host CPU Manufacturer: AuthenticAMD 2026-10-24T11:15:38.9314199Z Blacksmith Host Generation: gen 2 2026-10-24T11:15:38.9314478Z Petname: production-still-macaque-20a89838 2026-10-24T11:15:38.9314749Z Region: us-east 2026-10-24T11:15:38.9314970Z Rootfs Version: ubuntu24-full-x64-081926 2026-10-24T11:15:38.9323055Z OS Version: Ubuntu 24.04.4 LTS 2026-10-24T11:15:38.9323317Z 2026-10-24T11:15:38.9323428Z Enabling Blacksmith transparent cache 2026-10-24T11:15:38.9582691Z ##[group]Run actions/checkout@v6 2026-10-24T11:15:38.9582986Z with: 2026-10-24T11:15:38.9583302Z sparse-checkout: /* !/.repos/ !/apps/mobile/modules/t3-terminal/Vendor/**/*.a 2026-10-24T11:15:38.9583690Z sparse-checkout-cone-mode: false 2026-10-24T11:15:38.9583960Z repository: pingdotgg/t3code 2026-10-24T11:15:38.9585701Z token: *** 2026-10-24T11:15:38.9585906Z ssh-strict: true 2026-10-24T11:15:38.9586170Z ssh-user: git 2026-10-24T11:15:38.9586385Z persist-credentials: true 2026-10-24T11:15:38.9586804Z clean: true 2026-10-24T11:15:38.9587014Z fetch-depth: 1 2026-10-24T11:15:38.9587222Z fetch-tags: false 2026-10-24T11:15:38.9587437Z show-progress: true 2026-10-24T11:15:38.9587651Z lfs: false 2026-10-24T11:15:38.9587853Z submodules: false 2026-10-24T11:15:38.9588070Z set-safe-directory: true 2026-10-24T11:15:38.9588319Z allow-unsafe-pr-checkout: false 2026-10-24T11:15:38.9588569Z env: 2026-10-24T11:15:38.9588794Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 176 2026-10-24T11:15:38.9589072Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 368 2026-10-24T11:15:38.9589347Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T11:15:38.9589602Z ##[endgroup] 2026-10-24T11:15:39.0621094Z Syncing repository: pingdotgg/t3code 2026-10-24T11:15:39.0622023Z ##[group]Getting Git version info 2026-10-24T11:15:39.0622345Z Working directory is '/home/runner/_work/t3code/t3code' 2026-10-24T11:15:39.0622810Z [command]/usr/local/bin/git version 2026-10-24T11:15:39.0689632Z git version 2.55.0 2026-10-24T11:15:39.0702073Z ##[endgroup] 2026-10-24T11:15:39.0708794Z Temporarily overriding HOME='/home/runner/_work/_temp/293afcba-5fdc-45dd-96f5-5695ace47b64' before making global git config changes 2026-10-24T11:15:39.0709443Z Adding repository directory to the temporary git global config as a safe directory 2026-10-24T11:15:39.0712053Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-24T11:15:39.0742282Z Deleting the contents of '/home/runner/_work/t3code/t3code' 2026-10-24T11:15:39.0743975Z ##[group]Determining repository object format 2026-10-24T11:15:39.0745082Z ##[endgroup] 2026-10-24T11:15:39.0745432Z ##[group]Initializing the repository 2026-10-24T11:15:39.0747464Z [command]/usr/local/bin/git init /home/runner/_work/t3code/t3code 2026-10-24T11:15:39.0777758Z hint: Using 'master' as the name for the initial branch. This default branch name 2026-10-24T11:15:39.0778257Z hint: will change to "main" in Git 3.0. To configure the initial branch name 2026-10-24T11:15:39.0778723Z hint: to use in all of your new repositories, which will suppress this warning, 2026-10-24T11:15:39.0779077Z hint: call: 2026-10-24T11:15:39.0779291Z hint: 2026-10-24T11:15:39.0779548Z hint: git config --global init.defaultBranch 2026-10-24T11:15:39.0779849Z hint: 2026-10-24T11:15:39.0780131Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and 2026-10-24T11:15:39.0780573Z hint: 'development'. The just-created branch can be renamed via this command: 2026-10-24T11:15:39.0781004Z hint: 2026-10-24T11:15:39.0781207Z hint: git branch -m 2026-10-24T11:15:39.0781439Z hint: 2026-10-24T11:15:39.0781738Z hint: Disable this message with "git config set advice.defaultBranchName false" 2026-10-24T11:15:39.0782195Z Initialized empty Git repository in /home/runner/_work/t3code/t3code/.git/ 2026-10-24T11:15:39.0783553Z [command]/usr/local/bin/git remote add origin https://github.com/pingdotgg/t3code 2026-10-24T11:15:39.0811297Z ##[endgroup] 2026-10-24T11:15:39.0811758Z ##[group]Disabling automatic garbage collection 2026-10-24T11:15:39.0813911Z [command]/usr/local/bin/git config --local gc.auto 0 2026-10-24T11:15:39.0833836Z ##[endgroup] 2026-10-24T11:15:39.0834177Z ##[group]Setting up auth 2026-10-24T11:15:39.0834496Z Removing SSH command configuration 2026-10-24T11:15:39.0837903Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-24T11:15:39.0858927Z [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-24T11:15:39.0976775Z Removing HTTP extra header 2026-10-24T11:15:39.0980230Z [command]/usr/local/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader 2026-10-24T11:15:39.1004785Z [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-24T11:15:39.1098265Z Removing includeIf entries pointing to credentials config files 2026-10-24T11:15:39.1101725Z [command]/usr/local/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: 2026-10-24T11:15:39.1121200Z [command]/usr/local/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url 2026-10-24T11:15:39.1215926Z [command]/usr/local/bin/git config --file /home/runner/_work/_temp/git-credentials-b495c391-a6dd-412f-8278-0f73e44ab243.config http.https://github.com/.extraheader AUTHORIZATION: basic *** 2026-10-24T11:15:39.1237418Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git.path /home/runner/_work/_temp/git-credentials-b495c391-a6dd-412f-8278-0f73e44ab243.config 2026-10-24T11:15:39.1254802Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git/worktrees/*.path /home/runner/_work/_temp/git-credentials-b495c391-a6dd-412f-8278-0f73e44ab243.config 2026-10-24T11:15:39.1273137Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-b495c391-a6dd-412f-8278-0f73e44ab243.config 2026-10-24T11:15:39.1292224Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-b495c391-a6dd-412f-8278-0f73e44ab243.config 2026-10-24T11:15:39.1309833Z ##[endgroup] 2026-10-24T11:15:39.1310188Z ##[group]Fetching the repository 2026-10-24T11:15:39.1314010Z [command]/usr/local/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --filter=blob:none --depth=1 origin +6c39445f966c34e7feb7acff1b08f7877689d92d:refs/remotes/pull/23191/merge 2026-10-24T11:15:39.3997107Z From https://github.com/pingdotgg/t3code 2026-10-24T11:15:39.3998000Z * [new ref] 6c39445f966c34e7feb7acff1b08f7877689d92d -> pull/23191/merge 2026-10-24T11:15:39.4022807Z ##[endgroup] 2026-10-24T11:15:39.4023548Z ##[group]Determining the checkout info 2026-10-24T11:15:39.4024324Z ##[endgroup] 2026-10-24T11:15:39.4024975Z ##[group]Setting up sparse checkout 2026-10-24T11:15:39.4026866Z [command]/usr/local/bin/git config core.sparseCheckout true 2026-10-24T11:15:39.4050752Z [command]/usr/local/bin/git rev-parse --git-path info/sparse-checkout 2026-10-24T11:15:39.4069104Z .git/info/sparse-checkout 2026-10-24T11:15:39.4073514Z ##[endgroup] 2026-10-24T11:15:39.4076126Z ##[group]Checking out the ref 2026-10-24T11:15:39.4076927Z [command]/usr/local/bin/git checkout --progress --force refs/remotes/pull/23191/merge 2026-10-24T11:15:46.0282825Z Updating files: 0% (1/6346) 2026-10-24T11:15:46.0310269Z Updating files: 1% (64/6346) 2026-10-24T11:15:46.0328726Z Updating files: 2% (127/6346) 2026-10-24T11:15:46.0349021Z Updating files: 3% (191/6346) 2026-10-24T11:15:46.0368977Z Updating files: 4% (254/6346) 2026-10-24T11:15:46.0399591Z Updating files: 5% (318/6346) 2026-10-24T11:15:46.0420383Z Updating files: 6% (381/6346) 2026-10-24T11:15:46.0476857Z Updating files: 7% (445/6346) 2026-10-24T11:15:46.0514414Z Updating files: 8% (508/6346) 2026-10-24T11:15:46.0538830Z Updating files: 9% (572/6346) 2026-10-24T11:15:46.0826815Z Updating files: 10% (635/6346) 2026-10-24T11:15:46.0841968Z Updating files: 11% (699/6346) 2026-10-24T11:15:46.0852243Z Updating files: 12% (762/6346) 2026-10-24T11:15:46.0866956Z Updating files: 13% (825/6346) 2026-10-24T11:15:46.0882959Z Updating files: 14% (889/6346) 2026-10-24T11:15:46.0901321Z Updating files: 15% (952/6346) 2026-10-24T11:15:46.0919069Z Updating files: 16% (1016/6346) 2026-10-24T11:15:46.0933793Z Updating files: 17% (1079/6346) 2026-10-24T11:15:46.0951333Z Updating files: 18% (1143/6346) 2026-10-24T11:15:46.0965864Z Updating files: 19% (1206/6346) 2026-10-24T11:15:46.0987812Z Updating files: 20% (1270/6346) 2026-10-24T11:15:46.1005297Z Updating files: 21% (1333/6346) 2026-10-24T11:15:46.1023011Z Updating files: 22% (1397/6346) 2026-10-24T11:15:46.1036628Z Updating files: 23% (1460/6346) 2026-10-24T11:15:46.1049506Z Updating files: 24% (1524/6346) 2026-10-24T11:15:46.1064325Z Updating files: 25% (1587/6346) 2026-10-24T11:15:46.1078916Z Updating files: 26% (1650/6346) 2026-10-24T11:15:46.1090740Z Updating files: 27% (1714/6346) 2026-10-24T11:15:46.1110597Z Updating files: 28% (1777/6346) 2026-10-24T11:15:46.1142852Z Updating files: 29% (1841/6346) 2026-10-24T11:15:46.1163147Z Updating files: 30% (1904/6346) 2026-10-24T11:15:46.1185875Z Updating files: 31% (1968/6346) 2026-10-24T11:15:46.1215635Z Updating files: 32% (2031/6346) 2026-10-24T11:15:46.1245764Z Updating files: 33% (2095/6346) 2026-10-24T11:15:46.1312198Z Updating files: 34% (2158/6346) 2026-10-24T11:15:46.1364832Z Updating files: 35% (2222/6346) 2026-10-24T11:15:46.1400955Z Updating files: 36% (2285/6346) 2026-10-24T11:15:46.1435383Z Updating files: 37% (2349/6346) 2026-10-24T11:15:46.1476249Z Updating files: 38% (2412/6346) 2026-10-24T11:15:46.1502360Z Updating files: 39% (2475/6346) 2026-10-24T11:15:46.1531696Z Updating files: 40% (2539/6346) 2026-10-24T11:15:46.1560787Z Updating files: 41% (2602/6346) 2026-10-24T11:15:46.1578852Z Updating files: 42% (2666/6346) 2026-10-24T11:15:46.1589297Z Updating files: 43% (2729/6346) 2026-10-24T11:15:46.1609607Z Updating files: 44% (2793/6346) 2026-10-24T11:15:46.1642786Z Updating files: 45% (2856/6346) 2026-10-24T11:15:46.1665560Z Updating files: 46% (2920/6346) 2026-10-24T11:15:46.1694088Z Updating files: 47% (2983/6346) 2026-10-24T11:15:46.1720488Z Updating files: 48% (3047/6346) 2026-10-24T11:15:46.1751167Z Updating files: 49% (3110/6346) 2026-10-24T11:15:46.1787645Z Updating files: 50% (3173/6346) 2026-10-24T11:15:46.1802986Z Updating files: 51% (3237/6346) 2026-10-24T11:15:46.1835642Z Updating files: 52% (3300/6346) 2026-10-24T11:15:46.1861342Z Updating files: 53% (3364/6346) 2026-10-24T11:15:46.1881105Z Updating files: 54% (3427/6346) 2026-10-24T11:15:46.1905068Z Updating files: 55% (3491/6346) 2026-10-24T11:15:46.1922363Z Updating files: 56% (3554/6346) 2026-10-24T11:15:46.1938345Z Updating files: 57% (3618/6346) 2026-10-24T11:15:46.1957082Z Updating files: 58% (3681/6346) 2026-10-24T11:15:46.2315081Z Updating files: 59% (3745/6346) 2026-10-24T11:15:46.2329193Z Updating files: 60% (3808/6346) 2026-10-24T11:15:46.2345101Z Updating files: 61% (3872/6346) 2026-10-24T11:15:46.2362617Z Updating files: 62% (3935/6346) 2026-10-24T11:15:46.2383567Z Updating files: 63% (3998/6346) 2026-10-24T11:15:46.2409350Z Updating files: 64% (4062/6346) 2026-10-24T11:15:46.2430918Z Updating files: 65% (4125/6346) 2026-10-24T11:15:46.2446232Z Updating files: 66% (4189/6346) 2026-10-24T11:15:46.2471614Z Updating files: 67% (4252/6346) 2026-10-24T11:15:46.2485228Z Updating files: 68% (4316/6346) 2026-10-24T11:15:46.2504083Z Updating files: 69% (4379/6346) 2026-10-24T11:15:46.2515750Z Updating files: 70% (4443/6346) 2026-10-24T11:15:46.2531616Z Updating files: 71% (4506/6346) 2026-10-24T11:15:46.2547542Z Updating files: 72% (4570/6346) 2026-10-24T11:15:46.2572098Z Updating files: 73% (4633/6346) 2026-10-24T11:15:46.2821576Z Updating files: 74% (4697/6346) 2026-10-24T11:15:46.3004436Z Updating files: 75% (4760/6346) 2026-10-24T11:15:46.3026490Z Updating files: 76% (4823/6346) 2026-10-24T11:15:46.3046164Z Updating files: 77% (4887/6346) 2026-10-24T11:15:46.3070703Z Updating files: 78% (4950/6346) 2026-10-24T11:15:46.3088974Z Updating files: 79% (5014/6346) 2026-10-24T11:15:46.3107755Z Updating files: 80% (5077/6346) 2026-10-24T11:15:46.3124331Z Updating files: 81% (5141/6346) 2026-10-24T11:15:46.3143266Z Updating files: 82% (5204/6346) 2026-10-24T11:15:46.3161653Z Updating files: 83% (5268/6346) 2026-10-24T11:15:46.3182712Z Updating files: 84% (5331/6346) 2026-10-24T11:15:46.3204566Z Updating files: 85% (5395/6346) 2026-10-24T11:15:46.3228567Z Updating files: 86% (5458/6346) 2026-10-24T11:15:46.3294723Z Updating files: 87% (5522/6346) 2026-10-24T11:15:46.3325317Z Updating files: 88% (5585/6346) 2026-10-24T11:15:46.3345723Z Updating files: 89% (5648/6346) 2026-10-24T11:15:46.3368625Z Updating files: 90% (5712/6346) 2026-10-24T11:15:46.3401699Z Updating files: 91% (5775/6346) 2026-10-24T11:15:46.3416667Z Updating files: 92% (5839/6346) 2026-10-24T11:15:46.3434172Z Updating files: 93% (5902/6346) 2026-10-24T11:15:46.3454787Z Updating files: 94% (5966/6346) 2026-10-24T11:15:46.3477741Z Updating files: 95% (6029/6346) 2026-10-24T11:15:46.3528908Z Updating files: 96% (6093/6346) 2026-10-24T11:15:46.3556245Z Updating files: 97% (6156/6346) 2026-10-24T11:15:46.3600047Z Updating files: 98% (6220/6346) 2026-10-24T11:15:46.3618870Z Updating files: 99% (6283/6346) 2026-10-24T11:15:46.3619109Z Updating files: 100% (6346/6346) 2026-10-24T11:15:46.3619254Z Updating files: 100% (6346/6346), done. 2026-10-24T11:15:46.3767596Z Note: switching to 'refs/remotes/pull/23191/merge'. 2026-10-24T11:15:46.3767791Z 2026-10-24T11:15:46.3767902Z You are in 'detached HEAD' state. You can look around, make experimental 2026-10-24T11:15:46.3768163Z changes and commit them, and you can discard any commits you make in this 2026-10-24T11:15:46.3768392Z state without impacting any branches by switching back to a branch. 2026-10-24T11:15:46.3768523Z 2026-10-24T11:15:46.3768617Z If you want to create a new branch to retain commits you create, you may 2026-10-24T11:15:46.3768842Z do so (now or later) by using -c with the switch command. Example: 2026-10-24T11:15:46.3768962Z 2026-10-24T11:15:46.3769023Z git switch -c 2026-10-24T11:15:46.3769114Z 2026-10-24T11:15:46.3769171Z Or undo this operation with: 2026-10-24T11:15:46.3769249Z 2026-10-24T11:15:46.3769298Z git switch - 2026-10-24T11:15:46.3769375Z 2026-10-24T11:15:46.3769488Z Turn off this advice by setting config variable advice.detachedHead to false 2026-10-24T11:15:46.3769633Z 2026-10-24T11:15:46.3769801Z HEAD is now at 6c39445 Merge 5de88300e7d8271031784359714ad6c23afdc2dd into bb7783e295506ad423f527ed28a019836e331e8c 2026-10-24T11:15:46.3780239Z ##[endgroup] 2026-10-24T11:15:46.3811470Z [command]/usr/local/bin/git log -1 --format=%H 2026-10-24T11:15:46.3829472Z 6c39445f966c34e7feb7acff1b08f7877689d92d 2026-10-24T11:15:46.3899257Z ##[group]Run files="$(git ls-files .github/pr-assets)" 2026-10-24T11:15:46.3899486Z files="$(git ls-files .github/pr-assets)" 2026-10-24T11:15:46.3899671Z if test -n "$files"; then 2026-10-24T11:15:46.3899885Z  printf 'PR evidence must be uploaded to GitHub, not committed:\n%s\n' "$files" >&2 2026-10-24T11:15:46.3900116Z  exit 1 2026-10-24T11:15:46.3900221Z fi 2026-10-24T11:15:46.3915735Z shell: /usr/bin/bash -e {0} 2026-10-24T11:15:46.3915865Z env: 2026-10-24T11:15:46.3915980Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 176 2026-10-24T11:15:46.3916138Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 368 2026-10-24T11:15:46.3916278Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T11:15:46.3916416Z ##[endgroup] 2026-10-24T11:15:46.4055484Z Prepare all required actions 2026-10-24T11:15:46.4055780Z Getting action download info 2026-10-24T11:15:46.4895956Z Download action repository 'voidzero-dev/setup-vp@v1' (SHA:250f29ce396baf5e8f24498e17c0dfdebabc26eb) 2026-10-24T11:15:46.5992600Z ##[group]Run ./.github/actions/setup-ci-deps 2026-10-24T11:15:46.5992837Z env: 2026-10-24T11:15:46.5992953Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 176 2026-10-24T11:15:46.5993097Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 368 2026-10-24T11:15:46.5993236Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T11:15:46.5993405Z ##[endgroup] 2026-10-24T11:15:46.6077109Z ##[start-action display=Resolve Vite+ version;id=__self.vp] 2026-10-24T11:15:46.6090452Z ##[group]Run echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-24T11:15:46.6090921Z echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-24T11:15:46.6091219Z echo "node=$(jq -r '.engines.node' package.json)" >> "$GITHUB_OUTPUT" 2026-10-24T11:15:46.6091457Z echo "pnpm=$(jq -r '.packageManager' package.json)" >> "$GITHUB_OUTPUT" 2026-10-24T11:15:46.6108831Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T11:15:46.6108998Z env: 2026-10-24T11:15:46.6109112Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 176 2026-10-24T11:15:46.6109274Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 368 2026-10-24T11:15:46.6109413Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T11:15:46.6109547Z ##[endgroup] 2026-10-24T11:15:46.6185627Z ##[end-action id=__self.vp;outcome=success;conclusion=success;duration_ms=10] 2026-10-24T11:15:46.6186996Z ##[start-action display=Cache Vite+;id=__self.vp_cache] 2026-10-24T11:15:46.6227960Z ##[group]Run actions/cache@v6 2026-10-24T11:15:46.6228114Z with: 2026-10-24T11:15:46.6228218Z path: ~/.vite-plus 2026-10-24T11:15:46.6228381Z key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T11:15:46.6228581Z enableCrossOsArchive: false 2026-10-24T11:15:46.6228709Z fail-on-cache-miss: false 2026-10-24T11:15:46.6228832Z lookup-only: false 2026-10-24T11:15:46.6228940Z save-always: false 2026-10-24T11:15:46.6229049Z env: 2026-10-24T11:15:46.6229159Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 176 2026-10-24T11:15:46.6229304Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 368 2026-10-24T11:15:46.6229442Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T11:15:46.6229570Z ##[endgroup] 2026-10-24T11:15:46.8157888Z Cache hit for: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T11:15:47.1674863Z Received 170349591 of 170349591 (100.0%), 487.9 MBs/sec 2026-10-24T11:15:47.1675654Z Cache Size: ~162 MB (170349591 B) 2026-10-24T11:15:47.1698206Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/a7f993c8-71ab-4265-bc81-356802df571d/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T11:15:47.8007515Z Cache restored successfully 2026-10-24T11:15:47.8138566Z Cache restored from key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T11:15:47.8214609Z ##[end-action id=__self.vp_cache;outcome=success;conclusion=success;duration_ms=1202] 2026-10-24T11:15:47.8216778Z ##[start-action display=Use cached Vite+;id=__self.__run] 2026-10-24T11:15:47.8237151Z ##[group]Run echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-24T11:15:47.8237364Z echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-24T11:15:47.8237534Z "$HOME/.vite-plus/bin/vp" env use "26.12.1" 2026-10-24T11:15:47.8253477Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T11:15:47.8253643Z env: 2026-10-24T11:15:47.8253756Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 176 2026-10-24T11:15:47.8253897Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 368 2026-10-24T11:15:47.8254038Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T11:15:47.8254178Z ##[endgroup] 2026-10-24T11:15:47.8293320Z Using Node.js v26.12.1 (resolved from 26.12.1) 2026-10-24T11:15:47.8299560Z ##[end-action id=__self.__run;outcome=success;conclusion=success;duration_ms=8] 2026-10-24T11:15:47.8300919Z ##[start-action display=Setup Vite+;id=__self.__voidzero-dev_setup-vp] 2026-10-24T11:15:47.8304360Z ##[end-action id=__self.__voidzero-dev_setup-vp;outcome=skipped;conclusion=skipped;duration_ms=0] 2026-10-24T11:15:47.8305429Z ##[start-action display=Resolve pnpm store path;id=__self.pnpm_store] 2026-10-24T11:15:47.8329014Z ##[group]Run store_path="$(vp pm cache dir)" 2026-10-24T11:15:47.8329184Z store_path="$(vp pm cache dir)" 2026-10-24T11:15:47.8329346Z echo "path=$store_path" >> "$GITHUB_OUTPUT" 2026-10-24T11:15:47.8343136Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T11:15:47.8343301Z env: 2026-10-24T11:15:47.8343409Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 176 2026-10-24T11:15:47.8343551Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 368 2026-10-24T11:15:47.8343814Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T11:15:47.8343948Z ##[endgroup] 2026-10-24T11:15:47.8471947Z ##[end-action id=__self.pnpm_store;outcome=success;conclusion=success;duration_ms=16] 2026-10-24T11:15:47.8473188Z ##[start-action display=Cache full pnpm store;id=__self.__actions_cache] 2026-10-24T11:15:47.8787140Z ##[group]Run actions/cache@v6 2026-10-24T11:15:47.8787287Z with: 2026-10-24T11:15:47.8787409Z path: /home/runner/.local/share/pnpm/store/v11 2026-10-24T11:15:47.8787666Z key: pnpm-full-v1-Linux-X64-8600a8d4a7fcc9519d421cef0c77201c793c5d8afbbef2897636b5b9305a9b7d 2026-10-24T11:15:47.8787910Z restore-keys: pnpm-full-v1-Linux-X64- 2026-10-24T11:15:47.8788055Z enableCrossOsArchive: false 2026-10-24T11:15:47.8788181Z fail-on-cache-miss: false 2026-10-24T11:15:47.8788301Z lookup-only: false 2026-10-24T11:15:47.8788406Z save-always: false 2026-10-24T11:15:47.8788511Z env: 2026-10-24T11:15:47.8788617Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 176 2026-10-24T11:15:47.8788775Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 368 2026-10-24T11:15:47.8788914Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T11:15:47.8789042Z ##[endgroup] 2026-10-24T11:15:48.0672781Z Cache hit for: pnpm-full-v1-Linux-X64-8600a8d4a7fcc9519d421cef0c77201c793c5d8afbbef2897636b5b9305a9b7d 2026-10-24T11:15:49.0960333Z Received 570425344 of 995169257 (57.3%), 540.8 MBs/sec 2026-10-24T11:15:49.6694139Z Received 995169257 of 995169257 (100.0%), 600.7 MBs/sec 2026-10-24T11:15:49.6695083Z Cache Size: ~949 MB (995169257 B) 2026-10-24T11:15:49.6731571Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/9e3247e8-dd00-4004-b396-6921788bb561/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T11:15:54.7593635Z Cache restored successfully 2026-10-24T11:15:54.8061641Z Cache restored from key: pnpm-full-v1-Linux-X64-8600a8d4a7fcc9519d421cef0c77201c793c5d8afbbef2897636b5b9305a9b7d 2026-10-24T11:15:54.8126825Z ##[end-action id=__self.__actions_cache;outcome=success;conclusion=success;duration_ms=6965] 2026-10-24T11:15:54.8128826Z ##[start-action display=Install dependencies;id=__self.__run_2] 2026-10-24T11:15:54.8140088Z ##[group]Run vp install 2026-10-24T11:15:54.8140239Z vp install 2026-10-24T11:15:54.8156337Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T11:15:54.8156510Z env: 2026-10-24T11:15:54.8156632Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 176 2026-10-24T11:15:54.8156786Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 368 2026-10-24T11:15:54.8156934Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T11:15:54.8157076Z ##[endgroup] 2026-10-24T11:15:54.8474164Z Scope: all 33 workspace projects 2026-10-24T11:15:54.9474620Z ? Verifying lockfile against supply-chain policies (2088 entries)... 2026-10-24T11:15:55.1986829Z Packages are hard linked from the content-addressable store to the virtual store. 2026-10-24T11:15:55.1987341Z Content-addressable store is at: /home/runner/.local/share/pnpm/store/v11 2026-10-24T11:15:55.1987700Z Virtual store is at: node_modules/.pnpm 2026-10-24T11:15:57.2444078Z ✓ Lockfile passes supply-chain policies (2088 entries in 2.3s) 2026-10-24T11:15:57.2444356Z Lockfile is up to date, resolution step is skipped 2026-10-24T11:15:57.2606546Z Packages: +1721 2026-10-24T11:15:57.2606789Z ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2026-10-24T11:15:57.2902661Z Progress: resolved 1721, reused 1718, downloaded 0, added 1721, done 2026-10-24T11:15:58.1480276Z . prepare$ vp config --no-agent 2026-10-24T11:15:58.2391187Z . prepare: Done 2026-10-24T11:15:58.2404658Z 2026-10-24T11:15:58.2404840Z devDependencies: 2026-10-24T11:15:58.2404990Z + @coderabbitai/config 1.1.0 2026-10-24T11:15:58.2405130Z + @shadcn/lint 0.1.5 2026-10-24T11:15:58.2405271Z + @types/node 24.12.4 2026-10-24T11:15:58.2405388Z + knip 6.34.0 2026-10-24T11:15:58.2405526Z + typescript <- @tsc-rs/typescript 0.8.0 2026-10-24T11:15:58.2405664Z + vite-plus 1.3.0 2026-10-24T11:15:58.2405729Z 2026-10-24T11:15:58.2420291Z Done in 3.4s using pnpm v12.14.0 2026-10-24T11:15:58.2562138Z ##[end-action id=__self.__run_2;outcome=success;conclusion=success;duration_ms=3443] 2026-10-24T11:15:58.3023387Z ##[group]Run actions/cache@v6 2026-10-24T11:15:58.3023562Z with: 2026-10-24T11:15:58.3023685Z path: ~/.cache/electron 2026-10-24T11:15:58.3023919Z key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T11:15:58.3024166Z enableCrossOsArchive: false 2026-10-24T11:15:58.3024311Z fail-on-cache-miss: false 2026-10-24T11:15:58.3024442Z lookup-only: false 2026-10-24T11:15:58.3024560Z save-always: false 2026-10-24T11:15:58.3024674Z env: 2026-10-24T11:15:58.3024790Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 176 2026-10-24T11:15:58.3024945Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 368 2026-10-24T11:15:58.3025108Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T11:15:58.3025249Z ##[endgroup] 2026-10-24T11:15:58.5019221Z Cache hit for: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T11:15:58.6590637Z Received 122906203 of 122906203 (100.0%), 825.4 MBs/sec 2026-10-24T11:15:58.6591074Z Cache Size: ~117 MB (122906203 B) 2026-10-24T11:15:58.6606930Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/ef44fa07-ec18-4959-9381-54c23d190a8f/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T11:15:58.7321381Z Cache restored successfully 2026-10-24T11:15:58.7486734Z Cache restored from key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T11:15:58.7615511Z ##[group]Run vp run --filter @t3tools/desktop ensure:electron 2026-10-24T11:15:58.7615846Z vp run --filter @t3tools/desktop ensure:electron 2026-10-24T11:15:58.7634411Z shell: /usr/bin/bash -e {0} 2026-10-24T11:15:58.7634596Z env: 2026-10-24T11:15:58.7634897Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 176 2026-10-24T11:15:58.7635049Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 368 2026-10-24T11:15:58.7635195Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T11:15:58.7635333Z ##[endgroup] 2026-10-24T11:15:58.9209959Z ~/apps/desktop$ node scripts/ensure-electron-runtime.mjs ⊘ cache disabled 2026-10-24T11:15:59.4664680Z /home/runner/_work/t3code/t3code/node_modules/.pnpm/electron@44.9.3_supports-color@8.1.1/node_modules/electron/dist/electron 2026-10-24T11:15:59.4680155Z 2026-10-24T11:15:59.4781260Z ##[group]Run vp run knip:check 2026-10-24T11:15:59.4781551Z vp run knip:check 2026-10-24T11:15:59.4797280Z shell: /usr/bin/bash -e {0} 2026-10-24T11:15:59.4797412Z env: 2026-10-24T11:15:59.4797527Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 176 2026-10-24T11:15:59.4797677Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 368 2026-10-24T11:15:59.4797824Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T11:15:59.4797988Z ##[endgroup] 2026-10-24T11:15:59.6260274Z $ knip --include files,dependencies --no-config-hints ⊘ cache disabled 2026-10-24T11:16:03.1614664Z 2026-10-24T11:16:03.1617769Z $ knip --workspace apps/server --workspace apps/desktop --workspace apps/web --workspace packages/client-runtime --workspace packages/contracts --workspace packages/effect-acp --workspace packages/effect-codex-app-server --workspace packages/shared --workspace packages/ssh --workspace packages/tailscale --workspace packages/provider-core --workspace packages/provider-acp --workspace packages/provider-acp-registry --workspace packages/provider-testing --workspace packages/provider-pi --workspace packages/provider-muse --workspace packages/provider-opencode --workspace packages/provider-cursor --workspace packages/provider-grok --workspace packages/source-control-core --workspace packages/source-control-azure-devops --workspace packages/source-control-bitbucket --workspace packages/source-control-forgejo --workspace packages/source-control-gitcafe --workspace packages/source-control-github --workspace packages/source-control-gitlab --workspace packages/source-control-testing --exports --preprocessor ./scripts/knip-schemas.ts --no-config-hints ⊘ cache disabled 2026-10-24T11:16:11.0263320Z 2026-10-24T11:16:11.0264697Z --- 2026-10-24T11:16:11.0264977Z vp run: 2/2 successful. (Run `vp run --last-details` for full details) 2026-10-24T11:16:11.0337469Z ##[group]Run vp run --filter @t3tools/source-control-github generate --check 2026-10-24T11:16:11.0337958Z vp run --filter @t3tools/source-control-github generate --check 2026-10-24T11:16:11.0359236Z shell: /usr/bin/bash -e {0} 2026-10-24T11:16:11.0359445Z env: 2026-10-24T11:16:11.0359622Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 176 2026-10-24T11:16:11.0359864Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 368 2026-10-24T11:16:11.0360087Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T11:16:11.0360300Z ##[endgroup] 2026-10-24T11:16:11.1799783Z ~/packages/source-control-github$ graphqlgen --check ⊘ cache disabled 2026-10-24T11:16:11.3604473Z 2026-10-24T11:16:11.3669934Z ##[group]Run vp run --filter t3 generate --check 2026-10-24T11:16:11.3670141Z vp run --filter t3 generate --check 2026-10-24T11:16:11.3685375Z shell: /usr/bin/bash -e {0} 2026-10-24T11:16:11.3685503Z env: 2026-10-24T11:16:11.3685646Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 176 2026-10-24T11:16:11.3685791Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 368 2026-10-24T11:16:11.3685929Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T11:16:11.3686060Z ##[endgroup] 2026-10-24T11:16:11.5073040Z ~/apps/server$ graphqlgen --check ⊘ cache disabled 2026-10-24T11:16:11.6626896Z 2026-10-24T11:16:11.6694151Z ##[group]Run vp check 2026-10-24T11:16:11.6694336Z vp check 2026-10-24T11:16:11.6710013Z shell: /usr/bin/bash -e {0} 2026-10-24T11:16:11.6710143Z env: 2026-10-24T11:16:11.6710253Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 176 2026-10-24T11:16:11.6710398Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 368 2026-10-24T11:16:11.6710536Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T11:16:11.6710667Z ##[endgroup] 2026-10-24T11:16:12.2057958Z pass: All 5700 files are correctly formatted (398ms, 8 threads) 2026-10-24T11:16:17.6611526Z warn: Lint warnings found 2026-10-24T11:16:17.6612414Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:16:17.6612759Z ╭─[apps/mobile/src/state/thread-order.ts:29:7] 2026-10-24T11:16:17.6612976Z 28 │ getPendingThreadOrder(); 2026-10-24T11:16:17.6613165Z 29 │ }, [nowMinute, snoozeWakeTick]); 2026-10-24T11:16:17.6613413Z ·  ────┬──── ───────┬────── 2026-10-24T11:16:17.6613739Z · │ ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T11:16:17.6614060Z · ╰── Unnecessary dependency `nowMinute` 2026-10-24T11:16:17.6614278Z 30 │ return pending; 2026-10-24T11:16:17.6614412Z ╰──── 2026-10-24T11:16:17.6614798Z  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-24T11:16:17.6615415Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.6615733Z 2026-10-24T11:16:17.6615940Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:16:17.6616283Z ╭─[apps/mobile/src/state/use-thread-outbox-drain.ts:1315:5] 2026-10-24T11:16:17.6616522Z 1314 │ queuedMessagesByThreadKey, 2026-10-24T11:16:17.6616684Z 1315 │ retryTick, 2026-10-24T11:16:17.6616839Z ·  ────┬──── 2026-10-24T11:16:17.6617079Z · ╰── Unnecessary dependency `retryTick` 2026-10-24T11:16:17.6617446Z 1316 │ restoreQueuedMessage, 2026-10-24T11:16:17.6617597Z ╰──── 2026-10-24T11:16:17.6617937Z  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-24T11:16:17.6618518Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.6618807Z 2026-10-24T11:16:17.6619081Z ⚠ eslint(no-unused-vars): Variable 'claudeCaps' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:16:17.6619447Z ╭─[packages/shared/src/model.test.ts:36:7] 2026-10-24T11:16:17.6619623Z 35 │ 2026-10-24T11:16:17.6619830Z 36 │ const claudeCaps: ModelCapabilities = createModelCapabilities({ 2026-10-24T11:16:17.6620056Z ·  ─────┬──── 2026-10-24T11:16:17.6620295Z · ╰── 'claudeCaps' is declared here 2026-10-24T11:16:17.6620511Z 37 │ optionDescriptors: [ 2026-10-24T11:16:17.6620737Z ╰──── 2026-10-24T11:16:17.6620899Z  help: Consider removing this declaration. 2026-10-24T11:16:17.6621020Z 2026-10-24T11:16:17.6621188Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T11:16:17.6621500Z ╭─[apps/web/src/components/CustomSnoozeDialog.tsx:140:58] 2026-10-24T11:16:17.6621780Z 139 │ {...(weekStartsOn === undefined ? {} : { weekStartsOn })} 2026-10-24T11:16:17.6622090Z 140 │ disabled={{ before: new Date(new Date().setHours(0, 0, 0, 0)) }} 2026-10-24T11:16:17.6622365Z ·  ─────┬──── 2026-10-24T11:16:17.6622841Z · ╰── Cannot call impure function 2026-10-24T11:16:17.6623164Z 141 │ onSelect={(selected) => { 2026-10-24T11:16:17.6623333Z ╰──── 2026-10-24T11:16:17.6623663Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T11:16:17.6624242Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T11:16:17.6624530Z 2026-10-24T11:16:17.6624728Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T11:16:17.6625066Z ╭─[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9] 2026-10-24T11:16:17.6625315Z 35 │ (VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-24T11:16:17.6636677Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-24T11:16:17.6636945Z ·  ───────────┬────────── 2026-10-24T11:16:17.6637259Z · ╰── Cannot access ref value during render 2026-10-24T11:16:17.6637557Z 123 │ const sessionRef = useRef(null); 2026-10-24T11:16:17.6637749Z ╰──── 2026-10-24T11:16:17.6638275Z  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-24T11:16:17.6639018Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.6639300Z 2026-10-24T11:16:17.6639447Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.6639760Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8] 2026-10-24T11:16:17.6639979Z 125 │ 2026-10-24T11:16:17.6640154Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T11:16:17.6640372Z ·  ─────────┬──────── 2026-10-24T11:16:17.6640631Z · ╰── Cannot access ref value during render 2026-10-24T11:16:17.6640887Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T11:16:17.6641058Z ╰──── 2026-10-24T11:16:17.6641580Z  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-24T11:16:17.6642592Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.6642921Z 2026-10-24T11:16:17.6643372Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.6661234Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7] 2026-10-24T11:16:17.6661595Z 125 │ 2026-10-24T11:16:17.6661862Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T11:16:17.6662235Z ·  ─────────┬───────── 2026-10-24T11:16:17.6662636Z · ╰── Cannot access ref value during render 2026-10-24T11:16:17.6663043Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T11:16:17.6663305Z ╰──── 2026-10-24T11:16:17.6664133Z  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-24T11:16:17.6665281Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.6665730Z 2026-10-24T11:16:17.6665962Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.6666451Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31] 2026-10-24T11:16:17.6666794Z 125 │ 2026-10-24T11:16:17.6667046Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T11:16:17.6667412Z ·  ─────────┬───────── 2026-10-24T11:16:17.6667858Z · ╰── Cannot access ref value during render 2026-10-24T11:16:17.6668268Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T11:16:17.6668525Z ╰──── 2026-10-24T11:16:17.6669354Z  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-24T11:16:17.6670482Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.6670918Z 2026-10-24T11:16:17.6671142Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.6671613Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30] 2026-10-24T11:16:17.6671950Z 125 │ 2026-10-24T11:16:17.6672222Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T11:16:17.6672679Z ·  ──────────┬───────── 2026-10-24T11:16:17.6673142Z · ╰── Cannot access ref value during render 2026-10-24T11:16:17.6673560Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T11:16:17.6673821Z ╰──── 2026-10-24T11:16:17.6674629Z  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-24T11:16:17.6675736Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.6676168Z 2026-10-24T11:16:17.6676384Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.6677080Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46] 2026-10-24T11:16:17.6677564Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T11:16:17.6678061Z 127 │ ╭─▶ const recorder = createLazyVoiceRecorder({ 2026-10-24T11:16:17.6678629Z 128 │ │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-24T11:16:17.6679101Z 129 │ │ onStatus: (status: RecordingStatus) => { 2026-10-24T11:16:17.6679560Z 130 │ │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-24T11:16:17.6680000Z 131 │ │ isFinished: status.isFinished, 2026-10-24T11:16:17.6680476Z 132 │ │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-24T11:16:17.6680927Z 133 │ │ error: status.error, 2026-10-24T11:16:17.6681266Z 134 │ │ url: status.url, 2026-10-24T11:16:17.6681568Z 135 │ │ }); 2026-10-24T11:16:17.6681835Z 136 │ │ }, 2026-10-24T11:16:17.6682351Z 137 │ │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-24T11:16:17.6682823Z 138 │ │ selectInput: (inputs) => { 2026-10-24T11:16:17.6683260Z 139 │ │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-24T11:16:17.6683738Z 140 │ │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-24T11:16:17.6684234Z 141 │ │ const known = microphoneOrder(preferences.value.microphones); 2026-10-24T11:16:17.6684725Z 142 │ │ const order = rememberMicrophones(known, inputs); 2026-10-24T11:16:17.6685117Z 143 │ │ if (order !== known) { 2026-10-24T11:16:17.6685518Z 144 │ │ registry.set(updateMobilePreferencesAtom, { 2026-10-24T11:16:17.6685925Z 145 │ │ transform: (current) => ({ 2026-10-24T11:16:17.6686447Z 146 │ │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-24T11:16:17.6686891Z 147 │ │ }), 2026-10-24T11:16:17.6687171Z 148 │ │ }); 2026-10-24T11:16:17.6687434Z 149 │ │ } 2026-10-24T11:16:17.6687804Z 150 │ │ return preferredMicrophoneInput(inputs, order); 2026-10-24T11:16:17.6688152Z 151 │ │ }, 2026-10-24T11:16:17.6688504Z 152 │ ├─▶ }); 2026-10-24T11:16:17.6689104Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T11:16:17.6689595Z 153 │ recorderRef.current = recorder; 2026-10-24T11:16:17.6689837Z ╰──── 2026-10-24T11:16:17.6690641Z  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-24T11:16:17.6691741Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.6692205Z 2026-10-24T11:16:17.6692522Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.6693050Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16] 2026-10-24T11:16:17.6693400Z 152 │ }); 2026-10-24T11:16:17.6693625Z 153 │ recorderRef.current = recorder; 2026-10-24T11:16:17.6693985Z ·  ─────┬─────────┬─── 2026-10-24T11:16:17.6694526Z · │ ╰── Cannot update ref value during render 2026-10-24T11:16:17.6694985Z · ╰── This value is a ref 2026-10-24T11:16:17.6695336Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T11:16:17.6695601Z ╰──── 2026-10-24T11:16:17.6696424Z  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-24T11:16:17.6697541Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.6697973Z 2026-10-24T11:16:17.6698201Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.6698687Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48] 2026-10-24T11:16:17.6699073Z 153 │ recorderRef.current = recorder; 2026-10-24T11:16:17.6699542Z 154 │ ╭─▶ sessionRef.current = new VoiceInputSession({ 2026-10-24T11:16:17.6699971Z 155 │ │ recorder, 2026-10-24T11:16:17.6700334Z 156 │ │ getTranscriber: getLocalVoiceTranscriber, 2026-10-24T11:16:17.6700812Z 157 │ │ requestPermission: async () => { 2026-10-24T11:16:17.6701265Z 158 │ │ const permission = await requestRecordingPermissionsAsync(); 2026-10-24T11:16:17.6701832Z 159 │ │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-24T11:16:17.6702270Z 160 │ │ }, 2026-10-24T11:16:17.6702642Z 161 │ │ configureRecording: configureVoiceRecordingAudio, 2026-10-24T11:16:17.6703099Z 162 │ │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-24T11:16:17.6703544Z 163 │ │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-24T11:16:17.6704147Z 164 │ │ onStateChange: (nextState) => 2026-10-24T11:16:17.6704543Z 165 │ │ setState({ 2026-10-24T11:16:17.6704860Z 166 │ │ state: nextState, 2026-10-24T11:16:17.6723597Z 167 │ │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-24T11:16:17.6724056Z 168 │ │ label: sessionRef.current?.label ?? null, 2026-10-24T11:16:17.6724401Z 169 │ │ }), 2026-10-24T11:16:17.6724758Z 170 │ ├─▶ }); 2026-10-24T11:16:17.6725296Z · ╰──── Cannot access ref value during render 2026-10-24T11:16:17.6725691Z 171 │ } 2026-10-24T11:16:17.6725871Z ╰──── 2026-10-24T11:16:17.6726691Z  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-24T11:16:17.6727801Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.6728237Z 2026-10-24T11:16:17.6728466Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.6728943Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15] 2026-10-24T11:16:17.6729330Z 153 │ recorderRef.current = recorder; 2026-10-24T11:16:17.6729646Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T11:16:17.6730003Z ·  ─────┬────────┬─── 2026-10-24T11:16:17.6730490Z · │ ╰── Cannot update ref value during render 2026-10-24T11:16:17.6730963Z · ╰── This value is a ref 2026-10-24T11:16:17.6731255Z 155 │ recorder, 2026-10-24T11:16:17.6731455Z ╰──── 2026-10-24T11:16:17.6732278Z  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-24T11:16:17.6733385Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.6733820Z 2026-10-24T11:16:17.6734044Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.6734528Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7] 2026-10-24T11:16:17.6734919Z 184 │ return () => subscription.remove(); 2026-10-24T11:16:17.6735183Z 185 │ }, [controller]); 2026-10-24T11:16:17.6735426Z ·  ─────┬──── 2026-10-24T11:16:17.6735799Z · ╰── Cannot access ref value during render 2026-10-24T11:16:17.6736116Z 186 │ 2026-10-24T11:16:17.6736286Z ╰──── 2026-10-24T11:16:17.6737086Z  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-24T11:16:17.6738311Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.6738780Z 2026-10-24T11:16:17.6739010Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.6739493Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6] 2026-10-24T11:16:17.6739878Z 184 │ return () => subscription.remove(); 2026-10-24T11:16:17.6740140Z 185 │ }, [controller]); 2026-10-24T11:16:17.6740384Z ·  ──────┬───── 2026-10-24T11:16:17.6741369Z · ╰── Cannot access ref value during render 2026-10-24T11:16:17.6741691Z 186 │ 2026-10-24T11:16:17.6741859Z ╰──── 2026-10-24T11:16:17.6742591Z  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-24T11:16:17.6743298Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.6743573Z 2026-10-24T11:16:17.6743723Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.6744031Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6] 2026-10-24T11:16:17.6744255Z 191 │ }, 2026-10-24T11:16:17.6744393Z 192 │ [controller, recorder], 2026-10-24T11:16:17.6744566Z ·  ─────┬──── 2026-10-24T11:16:17.6744808Z · ╰── Cannot access ref value during render 2026-10-24T11:16:17.6745016Z 193 │ ); 2026-10-24T11:16:17.6745135Z ╰──── 2026-10-24T11:16:17.6745651Z  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-24T11:16:17.6746355Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.6746632Z 2026-10-24T11:16:17.6746780Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.6747094Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20] 2026-10-24T11:16:17.6747359Z 174 │ const controller = session.controller; 2026-10-24T11:16:17.6747556Z 175 │ const recorder = recorderRef.current; 2026-10-24T11:16:17.6747777Z ·  ─────────┬───────── 2026-10-24T11:16:17.6748066Z · ╰── Cannot access ref value during render 2026-10-24T11:16:17.6748284Z 176 │ 2026-10-24T11:16:17.6748397Z ╰──── 2026-10-24T11:16:17.6748910Z  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-24T11:16:17.6749615Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.6749893Z 2026-10-24T11:16:17.6750042Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.6750449Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5] 2026-10-24T11:16:17.6750717Z 191 │ }, 2026-10-24T11:16:17.6750857Z 192 │ [controller, recorder], 2026-10-24T11:16:17.6751039Z ·  ───────────┬────────── 2026-10-24T11:16:17.6751299Z · ╰── Cannot access ref value during render 2026-10-24T11:16:17.6751507Z 193 │ ); 2026-10-24T11:16:17.6751625Z ╰──── 2026-10-24T11:16:17.6752183Z  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-24T11:16:17.6752891Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.6753165Z 2026-10-24T11:16:17.6753315Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.6753634Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20] 2026-10-24T11:16:17.6753893Z 245 │ return () => clearInterval(intervalId); 2026-10-24T11:16:17.6754119Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-24T11:16:17.6754335Z ·  ─────┬──── 2026-10-24T11:16:17.6754604Z · ╰── Cannot access ref value during render 2026-10-24T11:16:17.6754813Z 247 │ 2026-10-24T11:16:17.6754930Z ╰──── 2026-10-24T11:16:17.6755444Z  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-24T11:16:17.6756152Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.6756429Z 2026-10-24T11:16:17.6756572Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.6756883Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6] 2026-10-24T11:16:17.6757139Z 245 │ return () => clearInterval(intervalId); 2026-10-24T11:16:17.6757361Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-24T11:16:17.6757630Z ·  ────────────────────────┬─────────────────────── 2026-10-24T11:16:17.6757941Z · ╰── Cannot access ref value during render 2026-10-24T11:16:17.6758154Z 247 │ 2026-10-24T11:16:17.6758274Z ╰──── 2026-10-24T11:16:17.6758790Z  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-24T11:16:17.6759494Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.6759768Z 2026-10-24T11:16:17.6759915Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.6760231Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5] 2026-10-24T11:16:17.6760467Z 260 │ setOwnerFocused, 2026-10-24T11:16:17.6760619Z 261 │ session, 2026-10-24T11:16:17.6760768Z ·  ───┬─── 2026-10-24T11:16:17.6761071Z · ╰── Cannot access ref value during render 2026-10-24T11:16:17.6761322Z 262 │ stop, 2026-10-24T11:16:17.6761444Z ╰──── 2026-10-24T11:16:17.6761959Z  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-24T11:16:17.6762707Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.6762982Z 2026-10-24T11:16:17.6763134Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.6763453Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10] 2026-10-24T11:16:17.6763676Z 250 │ 2026-10-24T11:16:17.6763888Z 251 │ ╭─▶ return { 2026-10-24T11:16:17.6764256Z 252 │ │ isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null, 2026-10-24T11:16:17.6764547Z 253 │ │ state, 2026-10-24T11:16:17.6764740Z 254 │ │ audioLevels, 2026-10-24T11:16:17.6764941Z 255 │ │ elapsedSeconds, 2026-10-24T11:16:17.6765188Z 256 │ │ isBusy: voiceInputBlocksSubmission(state), 2026-10-24T11:16:17.6765420Z 257 │ │ ownerKey, 2026-10-24T11:16:17.6765601Z 258 │ │ label, 2026-10-24T11:16:17.6765790Z 259 │ │ focusedOwners, 2026-10-24T11:16:17.6766004Z 260 │ │ setOwnerFocused, 2026-10-24T11:16:17.6766202Z 261 │ │ session, 2026-10-24T11:16:17.6766381Z 262 │ │ stop, 2026-10-24T11:16:17.6766561Z 263 │ │ cancel, 2026-10-24T11:16:17.6766792Z 264 │ ├─▶ }; 2026-10-24T11:16:17.6767150Z · ╰──── Cannot access ref value during render 2026-10-24T11:16:17.6767411Z 265 │ } 2026-10-24T11:16:17.6767533Z ╰──── 2026-10-24T11:16:17.6768050Z  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-24T11:16:17.6768765Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.6769043Z 2026-10-24T11:16:17.6769207Z ⚠ react(immutability): This value cannot be modified 2026-10-24T11:16:17.6769529Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-24T11:16:17.6769862Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-24T11:16:17.6770157Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-24T11:16:17.6770379Z ·  ─────┬───── 2026-10-24T11:16:17.6770628Z · ╰── `audioLevels` originates here 2026-10-24T11:16:17.6770899Z 123 │ const sessionRef = useRef(null); 2026-10-24T11:16:17.6771246Z 124 │ const recorderRef = useRef | null>(null); 2026-10-24T11:16:17.6771491Z 125 │ 2026-10-24T11:16:17.6771667Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T11:16:17.6771889Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T11:16:17.6772188Z 128 │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-24T11:16:17.6772433Z 129 │ onStatus: (status: RecordingStatus) => { 2026-10-24T11:16:17.6772674Z 130 │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-24T11:16:17.6772898Z 131 │ isFinished: status.isFinished, 2026-10-24T11:16:17.6773148Z 132 │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-24T11:16:17.6773376Z 133 │ error: status.error, 2026-10-24T11:16:17.6773540Z 134 │ url: status.url, 2026-10-24T11:16:17.6773697Z 135 │ }); 2026-10-24T11:16:17.6773828Z 136 │ }, 2026-10-24T11:16:17.6774064Z 137 │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-24T11:16:17.6774317Z 138 │ selectInput: (inputs) => { 2026-10-24T11:16:17.6774543Z 139 │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-24T11:16:17.6774794Z 140 │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-24T11:16:17.6775068Z 141 │ const known = microphoneOrder(preferences.value.microphones); 2026-10-24T11:16:17.6775323Z 142 │ const order = rememberMicrophones(known, inputs); 2026-10-24T11:16:17.6775522Z 143 │ if (order !== known) { 2026-10-24T11:16:17.6775721Z 144 │ registry.set(updateMobilePreferencesAtom, { 2026-10-24T11:16:17.6775928Z 145 │ transform: (current) => ({ 2026-10-24T11:16:17.6776209Z 146 │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-24T11:16:17.6776449Z 147 │ }), 2026-10-24T11:16:17.6776589Z 148 │ }); 2026-10-24T11:16:17.6776720Z 149 │ } 2026-10-24T11:16:17.6776902Z 150 │ return preferredMicrophoneInput(inputs, order); 2026-10-24T11:16:17.6777082Z 151 │ }, 2026-10-24T11:16:17.6777206Z 152 │ }); 2026-10-24T11:16:17.6777350Z 153 │ recorderRef.current = recorder; 2026-10-24T11:16:17.6777557Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T11:16:17.6777737Z 155 │ recorder, 2026-10-24T11:16:17.6777913Z 156 │ getTranscriber: getLocalVoiceTranscriber, 2026-10-24T11:16:17.6778117Z 157 │ requestPermission: async () => { 2026-10-24T11:16:17.6778352Z 158 │ const permission = await requestRecordingPermissionsAsync(); 2026-10-24T11:16:17.6778662Z 159 │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-24T11:16:17.6778887Z 160 │ }, 2026-10-24T11:16:17.6779067Z 161 │ configureRecording: configureVoiceRecordingAudio, 2026-10-24T11:16:17.6779298Z 162 │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-24T11:16:17.6779526Z 163 │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-24T11:16:17.6779729Z 164 │ onStateChange: (nextState) => 2026-10-24T11:16:17.6779898Z 165 │ setState({ 2026-10-24T11:16:17.6780050Z 166 │ state: nextState, 2026-10-24T11:16:17.6780245Z 167 │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-24T11:16:17.6780472Z 168 │ label: sessionRef.current?.label ?? null, 2026-10-24T11:16:17.6780828Z 169 │ }), 2026-10-24T11:16:17.6780962Z 170 │ }); 2026-10-24T11:16:17.6781082Z 171 │ } 2026-10-24T11:16:17.6781323Z 172 │ 2026-10-24T11:16:17.6781515Z 173 │ const session = sessionRef.current; 2026-10-24T11:16:17.6781709Z 174 │ const controller = session.controller; 2026-10-24T11:16:17.6781900Z 175 │ const recorder = recorderRef.current; 2026-10-24T11:16:17.6782055Z 176 │ 2026-10-24T11:16:17.6782220Z 177 │ useEffect(() => { 2026-10-24T11:16:17.6782458Z 178 │ const subscription = AppState.addEventListener("change", (nextState) => { 2026-10-24T11:16:17.6782765Z 179 │ // iOS reports `inactive` while its permission dialog is open. Only the 2026-10-24T11:16:17.6783056Z 180 │ // real background state cancels preparation; recorder status handles 2026-10-24T11:16:17.6783318Z 181 │ // calls and route interruptions during capture. 2026-10-24T11:16:17.6783578Z 182 │ if (nextState === "background") controller.appMovedToBackground(); 2026-10-24T11:16:17.6783785Z 183 │ }); 2026-10-24T11:16:17.6783997Z 184 │ return () => subscription.remove(); 2026-10-24T11:16:17.6784174Z 185 │ }, [controller]); 2026-10-24T11:16:17.6784309Z 186 │ 2026-10-24T11:16:17.6784429Z 187 │ useEffect( 2026-10-24T11:16:17.6784567Z 188 │ () => () => { 2026-10-24T11:16:17.6784721Z 189 │ controller.dispose(); 2026-10-24T11:16:17.6784889Z 190 │ recorder.release(); 2026-10-24T11:16:17.6785032Z 191 │ }, 2026-10-24T11:16:17.6785170Z 192 │ [controller, recorder], 2026-10-24T11:16:17.6785313Z 193 │ ); 2026-10-24T11:16:17.6785430Z 194 │ 2026-10-24T11:16:17.6785551Z 195 │ useEffect(() => { 2026-10-24T11:16:17.6785727Z 196 │ if (state.phase !== "recording") return; 2026-10-24T11:16:17.6785895Z 197 │ 2026-10-24T11:16:17.6786102Z 198 │ const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`; 2026-10-24T11:16:17.6786378Z 199 │ const activation = activateKeepAwakeAsync(tag); 2026-10-24T11:16:17.6786585Z 200 │ void activation.catch(() => {}); 2026-10-24T11:16:17.6786753Z 201 │ return () => { 2026-10-24T11:16:17.6786986Z 202 │ // Release after activation settles, even if the recording ends immediately. 2026-10-24T11:16:17.6787288Z 203 │ void activation.then(() => deactivateKeepAwake(tag)).catch(() => {}); 2026-10-24T11:16:17.6787491Z 204 │ }; 2026-10-24T11:16:17.6787637Z 205 │ }, [keepAwakeId, state.phase]); 2026-10-24T11:16:17.6787791Z 206 │ 2026-10-24T11:16:17.6787914Z 207 │ useEffect(() => { 2026-10-24T11:16:17.6788136Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-24T11:16:17.6788336Z 209 │ 2026-10-24T11:16:17.6788523Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-24T11:16:17.6788886Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-24T11:16:17.6789193Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-24T11:16:17.6789395Z ·  ─────┬───── 2026-10-24T11:16:17.6789644Z · ╰── `audioLevels` cannot be modified 2026-10-24T11:16:17.6789854Z 213 │ } 2026-10-24T11:16:17.6789971Z ╰──── 2026-10-24T11:16:17.6790299Z  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-24T11:16:17.6790867Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:16:17.6791161Z 2026-10-24T11:16:17.6791377Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T11:16:17.6791748Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-24T11:16:17.6791968Z 206 │ 2026-10-24T11:16:17.6792135Z 207 │ useEffect(() => { 2026-10-24T11:16:17.6792302Z ·  ───┬─── 2026-10-24T11:16:17.6792629Z · ╰── This function may (indirectly) reassign or modify `audioLevels` after render 2026-10-24T11:16:17.6792989Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-24T11:16:17.6793189Z 209 │ 2026-10-24T11:16:17.6793375Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-24T11:16:17.6793667Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-24T11:16:17.6793941Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-24T11:16:17.6794146Z ·  ─────┬───── 2026-10-24T11:16:17.6794385Z · ╰── This modifies `audioLevels` 2026-10-24T11:16:17.6794584Z 213 │ } 2026-10-24T11:16:17.6794702Z ╰──── 2026-10-24T11:16:17.6795098Z  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-24T11:16:17.6795719Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:16:17.6796007Z 2026-10-24T11:16:17.6796159Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.6796489Z ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14] 2026-10-24T11:16:17.6796748Z 26 │ const latestInput = useRef(input); 2026-10-24T11:16:17.6796929Z 27 │ latestInput.current = input; 2026-10-24T11:16:17.6797152Z ·  ─────┬─────────┬─── 2026-10-24T11:16:17.6797471Z · │ ╰── Cannot update ref value during render 2026-10-24T11:16:17.6797780Z · ╰── This value is a ref 2026-10-24T11:16:17.6797983Z 28 │ const mounted = useRef(true); 2026-10-24T11:16:17.6798135Z ╰──── 2026-10-24T11:16:17.6798657Z  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-24T11:16:17.6799430Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.6799738Z 2026-10-24T11:16:17.6799900Z ⚠ react(immutability): This value cannot be modified 2026-10-24T11:16:17.6800232Z ╭─[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5] 2026-10-24T11:16:17.6800509Z 65 │ const [expanded, setExpanded] = useState(false); 2026-10-24T11:16:17.6800716Z 66 │ const progress = useSharedValue(0); 2026-10-24T11:16:17.6800895Z ·  ────┬─── 2026-10-24T11:16:17.6801128Z · ╰── `progress` originates here 2026-10-24T11:16:17.6801339Z 67 │ useEffect(() => { 2026-10-24T11:16:17.6801550Z 68 │ progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING); 2026-10-24T11:16:17.6801760Z ·  ────┬─── 2026-10-24T11:16:17.6801996Z · ╰── `progress` cannot be modified 2026-10-24T11:16:17.6802256Z 69 │ }, [expanded, progress]); 2026-10-24T11:16:17.6802403Z ╰──── 2026-10-24T11:16:17.6802720Z  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-24T11:16:17.6803275Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:16:17.6803564Z 2026-10-24T11:16:17.6803764Z ⚠ eslint(no-unused-vars): Identifier 'Arr' is imported but never used. 2026-10-24T11:16:17.6804095Z ╭─[packages/client-runtime/src/state/threadSort.ts:4:13] 2026-10-24T11:16:17.6804365Z 3 │ import type { EnvironmentThreadShell } from "./models.ts"; 2026-10-24T11:16:17.6804581Z 4 │ import * as Arr from "effect/Array"; 2026-10-24T11:16:17.6804759Z ·  ─┬─ 2026-10-24T11:16:17.6804978Z · ╰── 'Arr' is imported here 2026-10-24T11:16:17.6805201Z 5 │ import * as Order from "effect/Order"; 2026-10-24T11:16:17.6805355Z ╰──── 2026-10-24T11:16:17.6805513Z  help: Consider removing this import. 2026-10-24T11:16:17.6805629Z 2026-10-24T11:16:17.6805825Z ⚠ eslint(no-unused-vars): Identifier 'Order' is imported but never used. 2026-10-24T11:16:17.6806153Z ╭─[packages/client-runtime/src/state/threadSort.ts:5:13] 2026-10-24T11:16:17.6806377Z 4 │ import * as Arr from "effect/Array"; 2026-10-24T11:16:17.6806562Z 5 │ import * as Order from "effect/Order"; 2026-10-24T11:16:17.6806739Z ·  ──┬── 2026-10-24T11:16:17.6806975Z · ╰── 'Order' is imported here 2026-10-24T11:16:17.6807173Z 6 │ 2026-10-24T11:16:17.6807284Z ╰──── 2026-10-24T11:16:17.6807439Z  help: Consider removing this import. 2026-10-24T11:16:17.6807554Z 2026-10-24T11:16:17.6807713Z ⚠ react(immutability): This value cannot be modified 2026-10-24T11:16:17.6808049Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5] 2026-10-24T11:16:17.6808280Z 90 │ }) { 2026-10-24T11:16:17.6808464Z 91 │ const rotation = useSharedValue(props.hidden ? 1 : 0); 2026-10-24T11:16:17.6808668Z ·  ────┬─── 2026-10-24T11:16:17.6808902Z · ╰── `rotation` originates here 2026-10-24T11:16:17.6809118Z 92 │ useLayoutEffect(() => { 2026-10-24T11:16:17.6809414Z 93 │ rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING); 2026-10-24T11:16:17.6809671Z ·  ────┬─── 2026-10-24T11:16:17.6809905Z · ╰── `rotation` cannot be modified 2026-10-24T11:16:17.6810127Z 94 │ }, [props.hidden, rotation]); 2026-10-24T11:16:17.6810277Z ╰──── 2026-10-24T11:16:17.6810602Z  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-24T11:16:17.6811159Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:16:17.6811448Z 2026-10-24T11:16:17.6811612Z ⚠ react(immutability): This value cannot be modified 2026-10-24T11:16:17.6811951Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:269:5] 2026-10-24T11:16:17.6812263Z 266 │ const variant = props.variant ?? "plain"; 2026-10-24T11:16:17.6812511Z 267 │ const loadingVisibility = useSharedValue(props.loading ? 1 : 0); 2026-10-24T11:16:17.6812752Z ·  ────────┬──────── 2026-10-24T11:16:17.6813013Z · ╰── `loadingVisibility` originates here 2026-10-24T11:16:17.6813248Z 268 │ useLayoutEffect(() => { 2026-10-24T11:16:17.6813496Z 269 │ loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING); 2026-10-24T11:16:17.6813752Z ·  ────────┬──────── 2026-10-24T11:16:17.6814008Z · ╰── `loadingVisibility` cannot be modified 2026-10-24T11:16:17.6814259Z 270 │ }, [loadingVisibility, props.loading]); 2026-10-24T11:16:17.6814427Z ╰──── 2026-10-24T11:16:17.6814751Z  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-24T11:16:17.6815302Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:16:17.6815590Z 2026-10-24T11:16:17.6815752Z ⚠ react(immutability): This value cannot be modified 2026-10-24T11:16:17.6816085Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:328:5] 2026-10-24T11:16:17.6816316Z 325 │ }) { 2026-10-24T11:16:17.6816542Z 326 │ const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0); 2026-10-24T11:16:17.6816806Z ·  ─────────┬───────── 2026-10-24T11:16:17.6817075Z · ╰── `recordingVisibility` originates here 2026-10-24T11:16:17.6817306Z 327 │ useLayoutEffect(() => { 2026-10-24T11:16:17.6817588Z 328 │ recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING); 2026-10-24T11:16:17.6817865Z ·  ─────────┬───────── 2026-10-24T11:16:17.6818128Z · ╰── `recordingVisibility` cannot be modified 2026-10-24T11:16:17.6818378Z 329 │ }, [props.phase, recordingVisibility]); 2026-10-24T11:16:17.6818543Z ╰──── 2026-10-24T11:16:17.6818860Z  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-24T11:16:17.6819479Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:16:17.6819798Z 2026-10-24T11:16:17.6820060Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:16:17.6820499Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:107:5] 2026-10-24T11:16:17.6820792Z 104 │ 2026-10-24T11:16:17.6820925Z 105 │ useEffect(() => { 2026-10-24T11:16:17.6821082Z ·  ────┬──── 2026-10-24T11:16:17.6821312Z · ╰── This is the containing effect 2026-10-24T11:16:17.6821533Z 106 │ clearReviewCommentTarget(); 2026-10-24T11:16:17.6821735Z 107 │ setPendingNativeCommentSelection(null); 2026-10-24T11:16:17.6821967Z ·  ────────────────┬─────────────── 2026-10-24T11:16:17.6822304Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.6822558Z 108 │ }, [selectedSection?.id]); 2026-10-24T11:16:17.6822703Z ╰──── 2026-10-24T11:16:17.6823357Z  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-24T11:16:17.6824210Z  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-24T11:16:17.6824508Z 2026-10-24T11:16:17.6824771Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:16:17.6825211Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7] 2026-10-24T11:16:17.6825456Z 109 │ 2026-10-24T11:16:17.6825585Z 110 │ useEffect(() => { 2026-10-24T11:16:17.6825741Z ·  ────┬──── 2026-10-24T11:16:17.6825967Z · ╰── This is the containing effect 2026-10-24T11:16:17.6826197Z 111 │ if (activeCommentTarget === null) { 2026-10-24T11:16:17.6826402Z 112 │ setPendingNativeCommentSelection(null); 2026-10-24T11:16:17.6826642Z ·  ────────────────┬─────────────── 2026-10-24T11:16:17.6826947Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.6827187Z 113 │ } 2026-10-24T11:16:17.6827306Z ╰──── 2026-10-24T11:16:17.6827957Z  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-24T11:16:17.6828797Z  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-24T11:16:17.6829095Z 2026-10-24T11:16:17.6829301Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:16:17.6829688Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7] 2026-10-24T11:16:17.6829975Z 107 │ setPendingNativeCommentSelection(null); 2026-10-24T11:16:17.6830161Z 108 │ }, [selectedSection?.id]); 2026-10-24T11:16:17.6830420Z ·  ─────────┬───────── 2026-10-24T11:16:17.6830729Z · ╰── Unnecessary dependency `selectedSection?.id` 2026-10-24T11:16:17.6830950Z 109 │ 2026-10-24T11:16:17.6831060Z ╰──── 2026-10-24T11:16:17.6831407Z  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-24T11:16:17.6831986Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.6832314Z 2026-10-24T11:16:17.6832573Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:16:17.6832991Z ╭─[apps/mobile/src/features/review/ReviewCommentComposerSheet.tsx:103:7] 2026-10-24T11:16:17.6833222Z 100 │ 2026-10-24T11:16:17.6833348Z 101 │ useEffect(() => { 2026-10-24T11:16:17.6833505Z ·  ────┬──── 2026-10-24T11:16:17.6833729Z · ╰── This is the containing effect 2026-10-24T11:16:17.6833974Z 102 │ if (!target || selectedLines.length === 0) { 2026-10-24T11:16:17.6834179Z 103 │ setHighlightedLinesById({}); 2026-10-24T11:16:17.6834380Z ·  ───────────┬─────────── 2026-10-24T11:16:17.6834663Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.6834900Z 104 │ return; 2026-10-24T11:16:17.6835030Z ╰──── 2026-10-24T11:16:17.6835680Z  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-24T11:16:17.6836526Z  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-24T11:16:17.6836825Z 2026-10-24T11:16:17.6837013Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T11:16:17.6837307Z ╭─[packages/shared/src/qrCode.ts:458:44] 2026-10-24T11:16:17.6837492Z 457 │ ): Array { 2026-10-24T11:16:17.6837680Z 458 │ let result: Array = divisor.map((_) => 0); 2026-10-24T11:16:17.6837903Z ·  ┬ 2026-10-24T11:16:17.6838226Z · ╰── '_' is declared here 2026-10-24T11:16:17.6838476Z 459 │ for (const b of data) { 2026-10-24T11:16:17.6838619Z ╰──── 2026-10-24T11:16:17.6838777Z  help: Consider removing this parameter. 2026-10-24T11:16:17.6838895Z 2026-10-24T11:16:17.6839154Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:16:17.6839575Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:60:5] 2026-10-24T11:16:17.6839807Z 55 │ 2026-10-24T11:16:17.6839930Z 56 │ useEffect(() => { 2026-10-24T11:16:17.6840084Z ·  ────┬──── 2026-10-24T11:16:17.6840304Z · ╰── This is the containing effect 2026-10-24T11:16:17.6840526Z 57 │ scheduler.reset(); 2026-10-24T11:16:17.6840714Z 58 │ highlightedRowIdsRef.current = new Set(); 2026-10-24T11:16:17.6840915Z 59 │ visibleChunkIndexRef.current = 0; 2026-10-24T11:16:17.6841142Z 60 │ setVisibleRange({ firstRowIndex: 0, lastRowIndex: 80 }); 2026-10-24T11:16:17.6841357Z ·  ───────┬─────── 2026-10-24T11:16:17.6841633Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.6841918Z 61 │ setTokensPatchJson(createEmptyTokenPatch(resetKey)); 2026-10-24T11:16:17.6842113Z ╰──── 2026-10-24T11:16:17.6842796Z  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-24T11:16:17.6843642Z  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-24T11:16:17.6843940Z 2026-10-24T11:16:17.6844144Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:16:17.6844519Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:63:7] 2026-10-24T11:16:17.6844778Z 62 │ return () => scheduler.cancel(); 2026-10-24T11:16:17.6844984Z 63 │ }, [enabled, resetKey, rows.length, scheduler]); 2026-10-24T11:16:17.6845234Z ·  ───┬─── ─────┬───── 2026-10-24T11:16:17.6845577Z · │ ╰── Unnecessary dependency `rows.length` 2026-10-24T11:16:17.6845916Z · ╰── Unnecessary dependency `enabled` 2026-10-24T11:16:17.6846121Z 64 │ 2026-10-24T11:16:17.6846232Z ╰──── 2026-10-24T11:16:17.6846579Z  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-24T11:16:17.6847157Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.6847452Z 2026-10-24T11:16:17.6847654Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:16:17.6847989Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:454:7] 2026-10-24T11:16:17.6848223Z 453 │ showAuxiliaryPane("inspector"); 2026-10-24T11:16:17.6848494Z 454 │ }, [environmentId, showAuxiliaryPane, threadId]); 2026-10-24T11:16:17.6848815Z ·  ──────┬────── ────┬─── 2026-10-24T11:16:17.6849180Z · │ ╰── Unnecessary dependency `threadId` 2026-10-24T11:16:17.6849526Z · ╰── Unnecessary dependency `environmentId` 2026-10-24T11:16:17.6849741Z 455 │ const { 2026-10-24T11:16:17.6849865Z ╰──── 2026-10-24T11:16:17.6850208Z  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-24T11:16:17.6850795Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.6851086Z 2026-10-24T11:16:17.6851275Z ⚠ react(static-components): Cannot create components during render 2026-10-24T11:16:17.6851599Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:725:20] 2026-10-24T11:16:17.6851812Z 492 │ // same check. 2026-10-24T11:16:17.6852025Z 493 │ const NativeReviewDiffView = resolveNativeReviewDiffView(); 2026-10-24T11:16:17.6852335Z ·  ─────────────┬───────────── 2026-10-24T11:16:17.6852662Z · ╰── The component is created during render here 2026-10-24T11:16:17.6852993Z 494 │ const nativeReviewDiffViewRef = useRef(null); 2026-10-24T11:16:17.6853279Z 495 │ const showcasedReviewDrawRef = useRef(null); 2026-10-24T11:16:17.6853555Z 496 │ const [isPullRefreshing, setIsPullRefreshing] = useState(false); 2026-10-24T11:16:17.6853799Z 497 │ const handlePullToRefresh = async () => { 2026-10-24T11:16:17.6853989Z 498 │ setIsPullRefreshing(true); 2026-10-24T11:16:17.6854168Z 499 │ await refreshSelectedSection(); 2026-10-24T11:16:17.6854350Z 500 │ setIsPullRefreshing(false); 2026-10-24T11:16:17.6854500Z 501 │ }; 2026-10-24T11:16:17.6854712Z 502 │ const reviewFileNavigatorRef = useRef(null); 2026-10-24T11:16:17.6855011Z 503 │ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : []; 2026-10-24T11:16:17.6855278Z 504 │ const fileVisibility = useReviewFileVisibility({ 2026-10-24T11:16:17.6855490Z 505 │ threadKey: reviewCache.threadKey, 2026-10-24T11:16:17.6855692Z 506 │ sectionId: selectedSection?.id ?? null, 2026-10-24T11:16:17.6855872Z 507 │ files: reviewFiles, 2026-10-24T11:16:17.6856066Z 508 │ cachedExpandedFileIds: selectedSection?.id 2026-10-24T11:16:17.6856324Z 509 │ ? reviewCache.expandedFileIdsBySection[selectedSection.id] 2026-10-24T11:16:17.6856532Z 510 │ : undefined, 2026-10-24T11:16:17.6856711Z 511 │ cachedViewedFileIds: selectedSection?.id 2026-10-24T11:16:17.6856948Z 512 │ ? reviewCache.viewedFileIdsBySection[selectedSection.id] 2026-10-24T11:16:17.6857154Z 513 │ : undefined, 2026-10-24T11:16:17.6857288Z 514 │ }); 2026-10-24T11:16:17.6857546Z 515 │ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility; 2026-10-24T11:16:17.6857875Z 516 │ const commentSelection = useReviewCommentSelectionController({ 2026-10-24T11:16:17.6858085Z 517 │ environmentId, 2026-10-24T11:16:17.6858229Z 518 │ threadId, 2026-10-24T11:16:17.6858371Z 519 │ selectedSection, 2026-10-24T11:16:17.6858588Z 520 │ nativeReviewDiffData, 2026-10-24T11:16:17.6858768Z 521 │ }); 2026-10-24T11:16:17.6858941Z 522 │ const nativeBridge = useNativeReviewDiffBridge({ 2026-10-24T11:16:17.6859147Z 523 │ threadKey: reviewCache.threadKey, 2026-10-24T11:16:17.6859346Z 524 │ sectionId: selectedSection?.id ?? null, 2026-10-24T11:16:17.6859536Z 525 │ diff: selectedSection?.diff, 2026-10-24T11:16:17.6859715Z 526 │ data: nativeReviewDiffData, 2026-10-24T11:16:17.6859882Z 527 │ collapsedFileIds, 2026-10-24T11:16:17.6860030Z 528 │ viewedFileIds, 2026-10-24T11:16:17.6860222Z 529 │ selectedRowIds: commentSelection.selectedRowIds, 2026-10-24T11:16:17.6860447Z 530 │ canHighlight: parsedDiff.kind === "files", 2026-10-24T11:16:17.6860620Z 531 │ }); 2026-10-24T11:16:17.6860824Z 532 │ const showcaseReviewKey = 2026-10-24T11:16:17.6861058Z 533 │ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection 2026-10-24T11:16:17.6861416Z 534 │ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}` 2026-10-24T11:16:17.6861686Z 535 │ : null; 2026-10-24T11:16:17.6861928Z 536 │ const handleNativeDebug = (event: NativeSyntheticEvent>) => { 2026-10-24T11:16:17.6862225Z 537 │ nativeBridge.onDebug(event); 2026-10-24T11:16:17.6862382Z 538 │ if ( 2026-10-24T11:16:17.6862532Z 539 │ showcaseReviewKey === null || 2026-10-24T11:16:17.6862760Z 540 │ showcasedReviewDrawRef.current === showcaseReviewKey || 2026-10-24T11:16:17.6863008Z 541 │ !isNativeReviewDiffDrawEvent(event.nativeEvent) 2026-10-24T11:16:17.6863191Z 542 │ ) { 2026-10-24T11:16:17.6863316Z 543 │ return; 2026-10-24T11:16:17.6863449Z 544 │ } 2026-10-24T11:16:17.6863632Z 545 │ showcasedReviewDrawRef.current = showcaseReviewKey; 2026-10-24T11:16:17.6863932Z 546 │ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId }); 2026-10-24T11:16:17.6864159Z 547 │ }; 2026-10-24T11:16:17.6864280Z 548 │ 2026-10-24T11:16:17.6864463Z 549 │ const handleSelectFile = async (fileId: string | null) => { 2026-10-24T11:16:17.6864681Z 550 │ loadVisibleFile(fileId, true); 2026-10-24T11:16:17.6864875Z 551 │ commentSelection.clearSelection(); 2026-10-24T11:16:17.6865105Z 552 │ if (fileId !== null && collapsedFileIds.includes(fileId)) { 2026-10-24T11:16:17.6865324Z 553 │ toggleExpandedFile(fileId); 2026-10-24T11:16:17.6865479Z 554 │ } 2026-10-24T11:16:17.6865660Z 555 │ const nativeView = nativeReviewDiffViewRef.current; 2026-10-24T11:16:17.6865862Z 556 │ if (!nativeView) return; 2026-10-24T11:16:17.6866053Z 557 │ const result = await settlePromise(() => 2026-10-24T11:16:17.6866345Z 558 │ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true), 2026-10-24T11:16:17.6866586Z 559 │ ); 2026-10-24T11:16:17.6866743Z 560 │ if (AsyncResult.isFailure(result)) { 2026-10-24T11:16:17.6867034Z 561 │ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result)); 2026-10-24T11:16:17.6867276Z 562 │ } 2026-10-24T11:16:17.6867394Z 563 │ }; 2026-10-24T11:16:17.6867542Z 564 │ const handleVisibleFileChange = ( 2026-10-24T11:16:17.6867782Z 565 │ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>, 2026-10-24T11:16:17.6867990Z 566 │ ) => { 2026-10-24T11:16:17.6868170Z 567 │ loadVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-24T11:16:17.6868466Z 568 │ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-24T11:16:17.6868779Z 569 │ }; 2026-10-24T11:16:17.6868960Z 570 │ const renderInspector = () => ( 2026-10-24T11:16:17.6869135Z 571 │ void handleSelectFile(fileId)} 2026-10-24T11:16:17.6870302Z 577 │ /> 2026-10-24T11:16:17.6870422Z 578 │ ); 2026-10-24T11:16:17.6870537Z 579 │ 2026-10-24T11:16:17.6870786Z 580 │ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => { 2026-10-24T11:16:17.6871066Z 581 │ const { fileId } = event.nativeEvent; 2026-10-24T11:16:17.6871250Z 582 │ if (fileId) { 2026-10-24T11:16:17.6871413Z 583 │ loadVisibleFile(fileId, true); 2026-10-24T11:16:17.6871598Z 584 │ toggleExpandedFile(fileId); 2026-10-24T11:16:17.6871753Z 585 │ } 2026-10-24T11:16:17.6871872Z 586 │ }; 2026-10-24T11:16:17.6871986Z 587 │ 2026-10-24T11:16:17.6872173Z 588 │ const handleNativeToggleViewedFile = ( 2026-10-24T11:16:17.6872405Z 589 │ event: NativeSyntheticEvent<{ readonly fileId?: string }>, 2026-10-24T11:16:17.6872596Z 590 │ ) => { 2026-10-24T11:16:17.6872752Z 591 │ const { fileId } = event.nativeEvent; 2026-10-24T11:16:17.6872919Z 592 │ if (fileId) { 2026-10-24T11:16:17.6873080Z 593 │ toggleViewedFile(fileId); 2026-10-24T11:16:17.6873231Z 594 │ } 2026-10-24T11:16:17.6873350Z 595 │ }; 2026-10-24T11:16:17.6873463Z 596 │ 2026-10-24T11:16:17.6873595Z 597 │ const parsedDiffNotice = 2026-10-24T11:16:17.6873856Z 598 │ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null; 2026-10-24T11:16:17.6874149Z 599 │ const hasCachedSelectedDiff = selectedSection?.diff != null; 2026-10-24T11:16:17.6874451Z 600 │ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null); 2026-10-24T11:16:17.6874741Z 601 │ const sectionMenu = buildReviewSectionMenu(reviewSections); 2026-10-24T11:16:17.6875043Z 602 │ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({ 2026-10-24T11:16:17.6875321Z 603 │ hasEnvironmentPresentation: environment.isReady, 2026-10-24T11:16:17.6875552Z 604 │ isEnvironmentConnected: isEnvironmentReady, 2026-10-24T11:16:17.6875742Z 605 │ hasCachedSelectedDiff, 2026-10-24T11:16:17.6875902Z 606 │ hasAnyCachedDiff, 2026-10-24T11:16:17.6876041Z 607 │ }); 2026-10-24T11:16:17.6876203Z 608 │ const handleRetryEnvironment = () => { 2026-10-24T11:16:17.6876403Z 609 │ void retryEnvironment(environmentId); 2026-10-24T11:16:17.6876563Z 610 │ }; 2026-10-24T11:16:17.6876713Z 611 │ const handleReturnToThread = () => { 2026-10-24T11:16:17.6876895Z 612 │ if (navigation.canGoBack()) { 2026-10-24T11:16:17.6877070Z 613 │ navigation.goBack(); 2026-10-24T11:16:17.6877221Z 614 │ return; 2026-10-24T11:16:17.6877351Z 615 │ } 2026-10-24T11:16:17.6877499Z 616 │ navigation.navigate("Thread", { 2026-10-24T11:16:17.6877693Z 617 │ environmentId: String(environmentId), 2026-10-24T11:16:17.6877883Z 618 │ threadId: String(threadId), 2026-10-24T11:16:17.6878036Z 619 │ }); 2026-10-24T11:16:17.6878162Z 620 │ }; 2026-10-24T11:16:17.6878302Z 621 │ const androidHeaderSubtitle = [ 2026-10-24T11:16:17.6878475Z 622 │ selectedSection?.title, 2026-10-24T11:16:17.6878708Z 623 │ headerDiffSummary.additions, 2026-10-24T11:16:17.6878924Z 624 │ headerDiffSummary.deletions, 2026-10-24T11:16:17.6879076Z 625 │ ] 2026-10-24T11:16:17.6879245Z 626 │ .filter((part): part is string => Boolean(part)) 2026-10-24T11:16:17.6879431Z 627 │ .join(" · "); 2026-10-24T11:16:17.6879563Z 628 │ 2026-10-24T11:16:17.6879703Z 629 │ const showChangedFilesPane = 2026-10-24T11:16:17.6879874Z 630 │ !showConnectionNotice && 2026-10-24T11:16:17.6880045Z 631 │ selectedSection !== null && 2026-10-24T11:16:17.6880219Z 632 │ parsedDiff.kind === "files" && 2026-10-24T11:16:17.6880400Z 633 │ NativeReviewDiffView !== null; 2026-10-24T11:16:17.6880675Z 634 │ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined); 2026-10-24T11:16:17.6881030Z 635 │ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane; 2026-10-24T11:16:17.6881273Z 636 │ 2026-10-24T11:16:17.6881406Z 637 │ const listHeader = (() => { 2026-10-24T11:16:17.6881588Z 638 │ const children: ReactElement[] = []; 2026-10-24T11:16:17.6881746Z 639 │ 2026-10-24T11:16:17.6881870Z 640 │ if (error) { 2026-10-24T11:16:17.6882015Z 641 │ children.push( 2026-10-24T11:16:17.6882207Z 642 │ 2026-10-24T11:16:17.6883533Z 649 │ Review unavailable 2026-10-24T11:16:17.6891444Z 650 │ {error} 2026-10-24T11:16:17.6891714Z 651 │ , 2026-10-24T11:16:17.6891851Z 652 │ ); 2026-10-24T11:16:17.6891973Z 653 │ } 2026-10-24T11:16:17.6892136Z 654 │ 2026-10-24T11:16:17.6892271Z 655 │ if (parsedDiffNotice) { 2026-10-24T11:16:17.6892531Z 656 │ children.push(); 2026-10-24T11:16:17.6892755Z 657 │ } 2026-10-24T11:16:17.6892873Z 658 │ 2026-10-24T11:16:17.6893009Z 659 │ if (children.length === 0) { 2026-10-24T11:16:17.6893177Z 660 │ return null; 2026-10-24T11:16:17.6893314Z 661 │ } 2026-10-24T11:16:17.6893429Z 662 │ 2026-10-24T11:16:17.6893561Z 663 │ return <>{children}; 2026-10-24T11:16:17.6893706Z 664 │ })(); 2026-10-24T11:16:17.6893852Z 665 │ const headerSubtitle = [ 2026-10-24T11:16:17.6894025Z 666 │ headerDiffSummary.additions, 2026-10-24T11:16:17.6894205Z 667 │ headerDiffSummary.deletions, 2026-10-24T11:16:17.6894384Z 668 │ pendingReviewCommentCount > 0 2026-10-24T11:16:17.6894664Z 669 │ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}` 2026-10-24T11:16:17.6894906Z 670 │ : null, 2026-10-24T11:16:17.6895035Z 671 │ ] 2026-10-24T11:16:17.6895167Z 672 │ .filter(Boolean) 2026-10-24T11:16:17.6895317Z 673 │ .join(" · "); 2026-10-24T11:16:17.6895537Z 674 │ const headerTitleText = selectedSection?.title ?? "Review changes"; 2026-10-24T11:16:17.6895740Z 675 │ 2026-10-24T11:16:17.6895863Z 676 │ return ( 2026-10-24T11:16:17.6895991Z 677 │ <> 2026-10-24T11:16:17.6896125Z 678 │ 2026-10-24T11:16:17.6899258Z 694 │ 2026-10-24T11:16:17.6899385Z 695 │ 2026-10-24T11:16:17.6899598Z 696 │ 2026-10-24T11:16:17.6899817Z 697 │ {showConnectionNotice ? ( 2026-10-24T11:16:17.6900062Z 698 │ 2026-10-24T11:16:17.6900308Z 699 │ 2026-10-24T11:16:17.6902701Z 711 │ 2026-10-24T11:16:17.6902946Z 712 │ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? ( 2026-10-24T11:16:17.6903173Z 713 │ 2026-10-24T11:16:17.6904172Z 719 │ 2026-10-24T11:16:17.6904955Z 723 │ {listHeader} 2026-10-24T11:16:17.6905168Z 724 │ 2026-10-24T11:16:17.6905390Z 725 │ ( 2026-10-24T11:16:17.6908663Z 223 │ 2026-10-24T11:16:17.6908894Z ·  ─────────────── 2026-10-24T11:16:17.6909113Z 224 │ {lineIndex > 0 ? "\n" : ""} 2026-10-24T11:16:17.6909280Z ╰──── 2026-10-24T11:16:17.6909484Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T11:16:17.6909646Z 2026-10-24T11:16:17.6909844Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T11:16:17.6910186Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25] 2026-10-24T11:16:17.6910424Z 226 │ { 2026-10-24T11:16:17.6912771Z ·  ────┬──── 2026-10-24T11:16:17.6913002Z · ╰── This is the containing effect 2026-10-24T11:16:17.6913229Z 120 │ if (orientationSettled) return; 2026-10-24T11:16:17.6913448Z 121 │ const orientation = getNativeShowcaseOrientation(); 2026-10-24T11:16:17.6913709Z 122 │ if (orientation === null) { 2026-10-24T11:16:17.6913923Z 123 │ setOrientationSettled(true); 2026-10-24T11:16:17.6914121Z ·  ──────────┬────────── 2026-10-24T11:16:17.6914406Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.6914645Z 124 │ return; 2026-10-24T11:16:17.6914778Z ╰──── 2026-10-24T11:16:17.6915430Z  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-24T11:16:17.6916287Z  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-24T11:16:17.6916673Z 2026-10-24T11:16:17.6916932Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:16:17.6917360Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:304:7] 2026-10-24T11:16:17.6917590Z 292 │ 2026-10-24T11:16:17.6917720Z 293 │ useEffect(() => { 2026-10-24T11:16:17.6917878Z ·  ────┬──── 2026-10-24T11:16:17.6918104Z · ╰── This is the containing effect 2026-10-24T11:16:17.6918307Z 294 │ if ( 2026-10-24T11:16:17.6918447Z 295 │ scene === null || 2026-10-24T11:16:17.6918609Z 296 │ requestedScene === null || 2026-10-24T11:16:17.6918783Z 297 │ scene !== requestedScene || 2026-10-24T11:16:17.6918951Z 298 │ !hasFixture || 2026-10-24T11:16:17.6919112Z 299 │ !orientationSettled || 2026-10-24T11:16:17.6919278Z 300 │ !themeApplied || 2026-10-24T11:16:17.6919483Z 301 │ (scene === "agent-activity" && !agentActivityStaged) || 2026-10-24T11:16:17.6919753Z 302 │ !isShowcaseNativeContentReady({ scene, themeId, renderSignal }) 2026-10-24T11:16:17.6919958Z 303 │ ) { 2026-10-24T11:16:17.6920099Z 304 │ setReadyScene(null); 2026-10-24T11:16:17.6920270Z ·  ──────┬────── 2026-10-24T11:16:17.6920540Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.6920777Z 305 │ return; 2026-10-24T11:16:17.6920905Z ╰──── 2026-10-24T11:16:17.6921559Z  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-24T11:16:17.6922447Z  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-24T11:16:17.6922747Z 2026-10-24T11:16:17.6923023Z ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:16:17.6923458Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:128:9] 2026-10-24T11:16:17.6923705Z 127 │ let cancelled = false; 2026-10-24T11:16:17.6923889Z 128 │ let lastOutcome: string | null = null; 2026-10-24T11:16:17.6924079Z ·  ─────┬───── 2026-10-24T11:16:17.6924378Z · ╰── 'lastOutcome' is declared here 2026-10-24T11:16:17.6924745Z 129 │ void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), { 2026-10-24T11:16:17.6924978Z ╰──── 2026-10-24T11:16:17.6925142Z  help: Consider removing this declaration. 2026-10-24T11:16:17.6925267Z 2026-10-24T11:16:17.6925552Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T11:16:17.6925976Z ╭─[apps/web/src/components/settings/SettingInheritance.tsx:163:24] 2026-10-24T11:16:17.6926198Z 162 │ keys, 2026-10-24T11:16:17.6926339Z 163 │ overridingProjects = [], 2026-10-24T11:16:17.6926515Z ·  ── 2026-10-24T11:16:17.6926688Z 164 │ onClearOverrides, 2026-10-24T11:16:17.6926823Z ╰──── 2026-10-24T11:16:17.6927208Z  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-24T11:16:17.6927511Z 2026-10-24T11:16:17.6927714Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:16:17.6928077Z ╭─[apps/mobile/src/features/workspace/WorkspaceToolbar.ios.tsx:114:33] 2026-10-24T11:16:17.6928350Z 113 │ return () => cancelAnimationFrame(frame); 2026-10-24T11:16:17.6928567Z 114 │ }, [restoreSearch, tabActive, bottomSearch]); 2026-10-24T11:16:17.6928794Z ·  ──────┬───── 2026-10-24T11:16:17.6929092Z · ╰── Unnecessary dependency `bottomSearch` 2026-10-24T11:16:17.6929376Z 115 │ const composeButton = nativeToolbarCompose ? ( 2026-10-24T11:16:17.6929556Z ╰──── 2026-10-24T11:16:17.6929907Z  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-24T11:16:17.6930496Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.6930789Z 2026-10-24T11:16:17.6931165Z ⚠ 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-24T11:16:17.6931634Z ╭─[packages/shared/src/otelEnvironment.ts:146:14] 2026-10-24T11:16:17.6931831Z 145 │ name, 2026-10-24T11:16:17.6932052Z 146 │ (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()), 2026-10-24T11:16:17.6932364Z ·  ────────────────────────── 2026-10-24T11:16:17.6932611Z 147 │ `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`, 2026-10-24T11:16:17.6932797Z ╰──── 2026-10-24T11:16:17.6932859Z 2026-10-24T11:16:17.6933068Z ⚠ typescript(no-extraneous-class): Unexpected class with only a constructor. 2026-10-24T11:16:17.6933394Z ╭─[apps/desktop/src/preview/Manager.test.ts:158:18] 2026-10-24T11:16:17.6933632Z 157 │ BrowserWindow: browserWindowConstructor, 2026-10-24T11:16:17.6933918Z 158 │ ╭─▶ ClipboardItem: class { 2026-10-24T11:16:17.6934218Z 159 │ │ constructor(data: Record) { 2026-10-24T11:16:17.6934552Z 160 │ │ clipboardItemConstructor(data); 2026-10-24T11:16:17.6934844Z 161 │ │ } 2026-10-24T11:16:17.6935070Z 162 │ ╰─▶ }, 2026-10-24T11:16:17.6935273Z 163 │ clipboard: { 2026-10-24T11:16:17.6935412Z ╰──── 2026-10-24T11:16:17.6935636Z  help: Try replacing this class with a standalone function or deleting it entirely 2026-10-24T11:16:17.6935810Z 2026-10-24T11:16:17.6935962Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.6936275Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39] 2026-10-24T11:16:17.6936498Z 276 │ 2026-10-24T11:16:17.6936748Z 277 │ ╭─▶ return createElement(RawNativeView, { 2026-10-24T11:16:17.6937031Z 278 │ │ ...nativeProps, 2026-10-24T11:16:17.6937293Z 279 │ │ refreshEnabled: props.onPullToRefresh !== undefined, 2026-10-24T11:16:17.6937541Z 280 │ │ ref: nativeRef, 2026-10-24T11:16:17.6937784Z 281 │ ├─▶ }); 2026-10-24T11:16:17.6938173Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T11:16:17.6938456Z 282 │ } 2026-10-24T11:16:17.6938574Z ╰──── 2026-10-24T11:16:17.6939097Z  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-24T11:16:17.6939815Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.6940094Z 2026-10-24T11:16:17.6940285Z ⚠ react(static-components): Cannot create components during render 2026-10-24T11:16:17.6940649Z ╭─[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10] 2026-10-24T11:16:17.6940968Z 196 │ const { onInput, onResize } = props; 2026-10-24T11:16:17.6941223Z 197 │ const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView(); 2026-10-24T11:16:17.6941518Z ·  ────────────────┬─────────────── 2026-10-24T11:16:17.6941852Z · ╰── The component is created during render here 2026-10-24T11:16:17.6942204Z 198 │ const hasNativeSurface = Boolean(NativeTerminalSurfaceView); 2026-10-24T11:16:17.6942402Z 199 │ 2026-10-24T11:16:17.6942534Z 200 │ useEffect(() => { 2026-10-24T11:16:17.6942709Z 201 │ terminalDebugLog("native:surface", { 2026-10-24T11:16:17.6942906Z 202 │ terminalKey: props.terminalKey, 2026-10-24T11:16:17.6943087Z 203 │ native: hasNativeSurface, 2026-10-24T11:16:17.6943324Z 204 │ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(), 2026-10-24T11:16:17.6943555Z 205 │ bufferLen: props.buffer.length, 2026-10-24T11:16:17.6943739Z 206 │ isRunning: props.isRunning, 2026-10-24T11:16:17.6943894Z 207 │ }); 2026-10-24T11:16:17.6944125Z 208 │ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]); 2026-10-24T11:16:17.6944384Z 209 │ const handleNativeInput = useCallback( 2026-10-24T11:16:17.6944607Z 210 │ (event: NativeSyntheticEvent) => { 2026-10-24T11:16:17.6944918Z 211 │ if (!props.isRunning || props.readOnly) { 2026-10-24T11:16:17.6945144Z 212 │ return; 2026-10-24T11:16:17.6945280Z 213 │ } 2026-10-24T11:16:17.6945438Z 214 │ terminalDebugLog("native:onInput", { 2026-10-24T11:16:17.6945702Z 215 │ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)), 2026-10-24T11:16:17.6945921Z 216 │ }); 2026-10-24T11:16:17.6946081Z 217 │ onInput(event.nativeEvent.data); 2026-10-24T11:16:17.6946242Z 218 │ }, 2026-10-24T11:16:17.6946407Z 219 │ [onInput, props.isRunning, props.readOnly], 2026-10-24T11:16:17.6946584Z 220 │ ); 2026-10-24T11:16:17.6946737Z 221 │ const handleNativeResize = useCallback( 2026-10-24T11:16:17.6946963Z 222 │ (event: NativeSyntheticEvent) => { 2026-10-24T11:16:17.6947165Z 223 │ onResize({ 2026-10-24T11:16:17.6947337Z 224 │ cols: event.nativeEvent.cols, 2026-10-24T11:16:17.6947526Z 225 │ rows: event.nativeEvent.rows, 2026-10-24T11:16:17.6947686Z 226 │ }); 2026-10-24T11:16:17.6947810Z 227 │ }, 2026-10-24T11:16:17.6947935Z 228 │ [onResize], 2026-10-24T11:16:17.6948067Z 229 │ ); 2026-10-24T11:16:17.6948182Z 230 │ 2026-10-24T11:16:17.6948329Z 231 │ if (NativeTerminalSurfaceView) { 2026-10-24T11:16:17.6948492Z 232 │ return ( 2026-10-24T11:16:17.6948646Z 233 │ 2026-10-24T11:16:17.6948827Z 234 │ ({ key: input.targetKey, location: candidate })); 2026-10-24T11:16:17.6951002Z 113 │ useEffect(() => { 2026-10-24T11:16:17.6951080Z ·  ────┬──── 2026-10-24T11:16:17.6951220Z · ╰── This is the containing effect 2026-10-24T11:16:17.6951389Z 114 │ if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) { 2026-10-24T11:16:17.6951453Z 115 │ return; 2026-10-24T11:16:17.6951507Z 116 │ } 2026-10-24T11:16:17.6951628Z 117 │ setEntry({ key: input.targetKey, location: candidate }); 2026-10-24T11:16:17.6951705Z ·  ────┬─── 2026-10-24T11:16:17.6951878Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.6952000Z 118 │ }, [candidate, entry.key, entry.location, input.targetKey]); 2026-10-24T11:16:17.6952055Z ╰──── 2026-10-24T11:16:17.6952748Z  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-24T11:16:17.6953106Z  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-24T11:16:17.6953109Z 2026-10-24T11:16:17.6953347Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-24T11:16:17.6953512Z ╭─[apps/web/src/components/pullRequest/pullRequestList.logic.ts:265:9] 2026-10-24T11:16:17.6953577Z 264 │ ): boolean { 2026-10-24T11:16:17.6953730Z 265 │ const labels = entry.labels.map((label) => label.name.trim().toLowerCase()); 2026-10-24T11:16:17.6953938Z ·  ───────────────────────────────────────────────────────────────────── 2026-10-24T11:16:17.6954087Z 266 │ const holds = (label: string) => labels.includes(label.trim().toLowerCase()); 2026-10-24T11:16:17.6954142Z ╰──── 2026-10-24T11:16:17.6954221Z  help: Switch to `Set` 2026-10-24T11:16:17.6954223Z 2026-10-24T11:16:17.6954484Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:16:17.6954655Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:643:5] 2026-10-24T11:16:17.6954710Z 638 │ 2026-10-24T11:16:17.6954779Z 639 │ useEffect(() => { 2026-10-24T11:16:17.6954854Z ·  ────┬──── 2026-10-24T11:16:17.6954992Z · ╰── This is the containing effect 2026-10-24T11:16:17.6955114Z 640 │ if (pendingLaunchEntry.key === launchTargetKey) { 2026-10-24T11:16:17.6955182Z 641 │ return; 2026-10-24T11:16:17.6955242Z 642 │ } 2026-10-24T11:16:17.6955316Z 643 │ setPendingLaunchEntry({ 2026-10-24T11:16:17.6955411Z ·  ──────────┬────────── 2026-10-24T11:16:17.6955592Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.6955667Z 644 │ key: launchTargetKey, 2026-10-24T11:16:17.6955719Z ╰──── 2026-10-24T11:16:17.6956311Z  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-24T11:16:17.6956683Z  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-24T11:16:17.6956719Z 2026-10-24T11:16:17.6956978Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:16:17.6957150Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5] 2026-10-24T11:16:17.6957202Z 648 │ 2026-10-24T11:16:17.6957270Z 649 │ useEffect(() => { 2026-10-24T11:16:17.6957346Z ·  ────┬──── 2026-10-24T11:16:17.6957483Z · ╰── This is the containing effect 2026-10-24T11:16:17.6957598Z 650 │ if (initialAttachGridEntry.key === launchTargetKey) { 2026-10-24T11:16:17.6957661Z 651 │ return; 2026-10-24T11:16:17.6957719Z 652 │ } 2026-10-24T11:16:17.6957805Z 653 │ setInitialAttachGridEntry({ 2026-10-24T11:16:17.6957904Z ·  ────────────┬──────────── 2026-10-24T11:16:17.6958084Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.6958158Z 654 │ key: launchTargetKey, 2026-10-24T11:16:17.6958214Z ╰──── 2026-10-24T11:16:17.6958797Z  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-24T11:16:17.6959116Z  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-24T11:16:17.6959123Z 2026-10-24T11:16:17.6959382Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:16:17.6959554Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7] 2026-10-24T11:16:17.6959609Z 743 │ 2026-10-24T11:16:17.6959673Z 744 │ useEffect(() => { 2026-10-24T11:16:17.6959748Z ·  ────┬──── 2026-10-24T11:16:17.6959886Z · ╰── This is the containing effect 2026-10-24T11:16:17.6959990Z 745 │ if (!routeEnvironmentId || !routeThreadId) { 2026-10-24T11:16:17.6960059Z 746 │ setLastGridSize({ 2026-10-24T11:16:17.6960146Z ·  ───────┬─────── 2026-10-24T11:16:17.6960322Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.6960412Z 747 │ cols: DEFAULT_TERMINAL_COLS, 2026-10-24T11:16:17.6960468Z ╰──── 2026-10-24T11:16:17.6961056Z  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-24T11:16:17.6961374Z  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-24T11:16:17.6961376Z 2026-10-24T11:16:17.6961579Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:16:17.6961804Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24] 2026-10-24T11:16:17.6961892Z 537 │ }); 2026-10-24T11:16:17.6962020Z 538 │ }, [terminal.buffer, terminal.buffer.length, terminalKey]); 2026-10-24T11:16:17.6962148Z ·  ───────────┬────────── 2026-10-24T11:16:17.6962431Z · ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead 2026-10-24T11:16:17.6962593Z 539 │ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null; 2026-10-24T11:16:17.6962648Z ╰──── 2026-10-24T11:16:17.6962941Z  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-24T11:16:17.6963256Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.6963261Z 2026-10-24T11:16:17.6963461Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:16:17.6963634Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7] 2026-10-24T11:16:17.6963732Z 708 │ sentInitialInputKeyRef.current = null; 2026-10-24T11:16:17.6963801Z 709 │ }, [terminalKey]); 2026-10-24T11:16:17.6963880Z ·  ─────┬───── 2026-10-24T11:16:17.6964033Z · ╰── Unnecessary dependency `terminalKey` 2026-10-24T11:16:17.6964088Z 710 │ 2026-10-24T11:16:17.6964144Z ╰──── 2026-10-24T11:16:17.6964429Z  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-24T11:16:17.6964744Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.6964749Z 2026-10-24T11:16:17.6964950Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:16:17.6965121Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52] 2026-10-24T11:16:17.6965180Z 799 │ }; 2026-10-24T11:16:17.6965358Z 800 │ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]); 2026-10-24T11:16:17.6965558Z ·  ────────────┬──────────── ─────┬───── 2026-10-24T11:16:17.6965802Z · │ ╰── Unnecessary dependency `terminalKey` 2026-10-24T11:16:17.6966021Z · ╰── Unnecessary dependency `terminal.lifecycleVersion` 2026-10-24T11:16:17.6966076Z 801 │ 2026-10-24T11:16:17.6966130Z ╰──── 2026-10-24T11:16:17.6966419Z  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-24T11:16:17.6966725Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.6966728Z 2026-10-24T11:16:17.6966876Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.6967097Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24] 2026-10-24T11:16:17.6967184Z 792 │ } 2026-10-24T11:16:17.6967293Z 793 │ const pasteSession = pasteSessionRef.current; 2026-10-24T11:16:17.6967414Z ·  ───────────┬─────────── 2026-10-24T11:16:17.6967581Z · ╰── Cannot access ref value during render 2026-10-24T11:16:17.6967638Z 794 │ 2026-10-24T11:16:17.6967692Z ╰──── 2026-10-24T11:16:17.6968152Z  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-24T11:16:17.6968444Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.6968454Z 2026-10-24T11:16:17.6968648Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T11:16:17.6968812Z ╭─[apps/mobile/src/features/terminal/TerminalContextSheet.tsx:72:15] 2026-10-24T11:16:17.6968881Z 71 │ new Promise((resolve) => setImmediate(resolve))); 2026-10-24T11:16:17.6971030Z 143 │ ╰─▶ } 2026-10-24T11:16:17.6971120Z 144 │ return yield* Fiber.join(fiber); 2026-10-24T11:16:17.6971173Z ╰──── 2026-10-24T11:16:17.6971175Z 2026-10-24T11:16:17.6971401Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T11:16:17.6971526Z ╭─[packages/shared/src/serverSettings.ts:346:9] 2026-10-24T11:16:17.6971629Z 345 │ const entry: ProjectSettingsOverrides = { 2026-10-24T11:16:17.6971759Z 346 │ ...(entries.get(projectId) ?? currentEntries[projectId] ?? {}), 2026-10-24T11:16:17.6971941Z ·  ────────────────────────────────────────────────────────────── 2026-10-24T11:16:17.6972001Z 347 │ }; 2026-10-24T11:16:17.6972056Z ╰──── 2026-10-24T11:16:17.6972426Z  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-24T11:16:17.6972458Z 2026-10-24T11:16:17.6972682Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in Array.prototype.reduce() 2026-10-24T11:16:17.6972805Z ╭─[packages/shared/src/serverSettings.ts:448:24] 2026-10-24T11:16:17.6972876Z 447 │ const favorites = 2026-10-24T11:16:17.6972986Z 448 │ setModelFavorites?.reduce((current, change) => { 2026-10-24T11:16:17.6973079Z ·  ───┬── 2026-10-24T11:16:17.6973211Z · ╰── For this reduce 2026-10-24T11:16:17.6973295Z 449 │ const exists = current.some( 2026-10-24T11:16:17.6973469Z 450 │ (favorite) => favorite.provider === change.provider && favorite.model === change.model, 2026-10-24T11:16:17.6973535Z 451 │ ); 2026-10-24T11:16:17.6973613Z 452 │ return change.favorite 2026-10-24T11:16:17.6973678Z 453 │ ? exists 2026-10-24T11:16:17.6973741Z 454 │ ? current 2026-10-24T11:16:17.6973880Z 455 │ : [...current, { provider: change.provider, model: change.model }] 2026-10-24T11:16:17.6973968Z ·  ─────┬──── 2026-10-24T11:16:17.6974091Z · ╰── From this spread 2026-10-24T11:16:17.6974160Z 456 │ : current.filter( 2026-10-24T11:16:17.6974216Z ╰──── 2026-10-24T11:16:17.6974420Z  help: Consider using `Object.assign()` or `Array.prototype.push()` to mutate the accumulator instead. 2026-10-24T11:16:17.6974579Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T11:16:17.6974581Z 2026-10-24T11:16:17.6974775Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-24T11:16:17.6974899Z ╭─[packages/shared/src/serverSettings.ts:466:3] 2026-10-24T11:16:17.6974961Z 464 │ null; 2026-10-24T11:16:17.6975079Z 465 │ let nextModelPreferences = initialModelPreferences; 2026-10-24T11:16:17.6975171Z ·  ──────────┬───────── 2026-10-24T11:16:17.6975305Z · ╰── From this accumulator 2026-10-24T11:16:17.6975407Z 466 │ for (const change of setModelsHidden ?? []) { 2026-10-24T11:16:17.6975476Z ·  ─┬─ 2026-10-24T11:16:17.6975583Z · ╰── For this loop 2026-10-24T11:16:17.6975723Z 467 │ const preferences = nextModelPreferences?.[change.provider] ?? { 2026-10-24T11:16:17.6975794Z 468 │ hiddenModels: [], 2026-10-24T11:16:17.6975917Z 469 │ modelOrder: [], 2026-10-24T11:16:17.6976010Z 470 │ }; 2026-10-24T11:16:17.6976191Z 471 │ const hiddenModels = preferences.hiddenModels.filter((model) => model !== change.model); 2026-10-24T11:16:17.6976304Z 472 │ if (change.hidden) hiddenModels.push(change.model); 2026-10-24T11:16:17.6976381Z 473 │ nextModelPreferences = { 2026-10-24T11:16:17.6976457Z 474 │ ...nextModelPreferences, 2026-10-24T11:16:17.6976560Z ·  ───────────┬─────────── 2026-10-24T11:16:17.6976688Z · ╰── From this spread 2026-10-24T11:16:17.6976802Z 475 │ [change.provider]: { ...preferences, hiddenModels }, 2026-10-24T11:16:17.6976855Z ╰──── 2026-10-24T11:16:17.6977010Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-24T11:16:17.6977171Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T11:16:17.6977177Z 2026-10-24T11:16:17.6977439Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:16:17.6977581Z ╭─[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5] 2026-10-24T11:16:17.6977639Z 150 │ 2026-10-24T11:16:17.6977707Z 151 │ useEffect(() => { 2026-10-24T11:16:17.6977781Z ·  ────┬──── 2026-10-24T11:16:17.6977916Z · ╰── This is the containing effect 2026-10-24T11:16:17.6978002Z 152 │ if (!controlledSelectedPath) { 2026-10-24T11:16:17.6978066Z 153 │ return; 2026-10-24T11:16:17.6978123Z 154 │ } 2026-10-24T11:16:17.6978205Z 155 │ setExpandedPaths((current) => { 2026-10-24T11:16:17.6978296Z ·  ────────┬─────── 2026-10-24T11:16:17.6978477Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.6978605Z 156 │ const ancestors = ancestorPaths(controlledSelectedPath); 2026-10-24T11:16:17.6978657Z ╰──── 2026-10-24T11:16:17.6979245Z  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-24T11:16:17.6979569Z  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-24T11:16:17.6979571Z 2026-10-24T11:16:17.6979759Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T11:16:17.6979952Z ╭─[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:116:34] 2026-10-24T11:16:17.6980020Z 115 │ return [...commands]; 2026-10-24T11:16:17.6980156Z 116 │ }, [activeThreadRef, pathname, registrationVersion, navigation]); 2026-10-24T11:16:17.6980279Z ·  ─────────┬───────── 2026-10-24T11:16:17.6980470Z · ╰── Unnecessary dependency `registrationVersion` 2026-10-24T11:16:17.6980523Z 117 │ 2026-10-24T11:16:17.6980578Z ╰──── 2026-10-24T11:16:17.6980945Z  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-24T11:16:17.6981325Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.6981386Z 2026-10-24T11:16:17.6981628Z ⚠ unicorn(prefer-string-starts-ends-with): Prefer String#startsWith over a regex with a caret. 2026-10-24T11:16:17.6981754Z ╭─[apps/server/src/vcs/GitVcsDriverCore.ts:509:11] 2026-10-24T11:16:17.6981859Z 508 │ GIT_DIAGNOSTIC_LINE_PATTERN.test(line) || 2026-10-24T11:16:17.6981999Z 509 │ (!/^remote:/.test(line) && SSH_TRANSPORT_REFUSAL_PATTERN.test(line)), 2026-10-24T11:16:17.6982122Z ·  ─────────────── 2026-10-24T11:16:17.6982178Z 510 │ ) 2026-10-24T11:16:17.6982234Z ╰──── 2026-10-24T11:16:17.6982389Z  help: Replace `/^remote:/.test(line)` with `line.startsWith('remote:')`. 2026-10-24T11:16:17.6982397Z 2026-10-24T11:16:17.6982603Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:16:17.6982750Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7] 2026-10-24T11:16:17.6982849Z 256 │ return () => cancelAnimationFrame(frame); 2026-10-24T11:16:17.6982932Z 257 │ }, [props.path, targetIndex]); 2026-10-24T11:16:17.6983012Z ·  ─────┬──── 2026-10-24T11:16:17.6983161Z · ╰── Unnecessary dependency `props.path` 2026-10-24T11:16:17.6983217Z 258 │ 2026-10-24T11:16:17.6983270Z ╰──── 2026-10-24T11:16:17.6983562Z  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-24T11:16:17.6983873Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.6983881Z 2026-10-24T11:16:17.6984073Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T11:16:17.6984223Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23] 2026-10-24T11:16:17.6984297Z 292 │ 2026-10-24T11:16:17.6985407Z ·  ─────────── 2026-10-24T11:16:17.6985476Z 310 │ {body} 2026-10-24T11:16:17.6985530Z ╰──── 2026-10-24T11:16:17.6985674Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T11:16:17.6985677Z 2026-10-24T11:16:17.6985834Z ⚠ react(immutability): This value cannot be modified 2026-10-24T11:16:17.6985998Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:42:5] 2026-10-24T11:16:17.6986103Z 35 │ 2026-10-24T11:16:17.6986277Z 36 │ const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0); 2026-10-24T11:16:17.6986366Z ·  ────────┬──────── 2026-10-24T11:16:17.6986524Z · ╰── `inspectorProgress` originates here 2026-10-24T11:16:17.6986621Z 37 │ const { renderedInspectorWidth } = props; 2026-10-24T11:16:17.6986756Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-24T11:16:17.6986807Z 39 │ 2026-10-24T11:16:17.6986890Z 40 │ const onClosed = props.onClosed; 2026-10-24T11:16:17.6986959Z 41 │ useEffect(() => { 2026-10-24T11:16:17.6987050Z 42 │ inspectorProgress.value = withTiming( 2026-10-24T11:16:17.6987132Z ·  ────────┬──────── 2026-10-24T11:16:17.6987296Z · ╰── `inspectorProgress` cannot be modified 2026-10-24T11:16:17.6987378Z 43 │ inspectorVisible ? 1 : 0, 2026-10-24T11:16:17.6987435Z ╰──── 2026-10-24T11:16:17.6987696Z  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-24T11:16:17.6988000Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:16:17.6988003Z 2026-10-24T11:16:17.6988162Z ⚠ react(immutability): This value cannot be modified 2026-10-24T11:16:17.6988323Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:67:7] 2026-10-24T11:16:17.6988416Z 37 │ const { renderedInspectorWidth } = props; 2026-10-24T11:16:17.6988557Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-24T11:16:17.6988653Z ·  ──────────┬───────── 2026-10-24T11:16:17.6988811Z · ╰── `renderedContentWidth` originates here 2026-10-24T11:16:17.6988864Z 39 │ 2026-10-24T11:16:17.6988948Z 40 │ const onClosed = props.onClosed; 2026-10-24T11:16:17.6989015Z 41 │ useEffect(() => { 2026-10-24T11:16:17.6989105Z 42 │ inspectorProgress.value = withTiming( 2026-10-24T11:16:17.6989180Z 43 │ inspectorVisible ? 1 : 0, 2026-10-24T11:16:17.6989253Z 44 │ WORKSPACE_PANE_TIMING, 2026-10-24T11:16:17.6989320Z 45 │ (finished) => { 2026-10-24T11:16:17.6989459Z 46 │ if (finished === true && !inspectorVisible && onClosed !== undefined) { 2026-10-24T11:16:17.6989532Z 47 │ runOnJS(onClosed)(); 2026-10-24T11:16:17.6989592Z 48 │ } 2026-10-24T11:16:17.6989653Z 49 │ }, 2026-10-24T11:16:17.6989716Z 50 │ ); 2026-10-24T11:16:17.6989850Z 51 │ const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0; 2026-10-24T11:16:17.6989930Z 52 │ renderedInspectorWidth.set( 2026-10-24T11:16:17.6990074Z 53 │ resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING), 2026-10-24T11:16:17.6990130Z 54 │ ); 2026-10-24T11:16:17.6990184Z 55 │ }, [ 2026-10-24T11:16:17.6990253Z 56 │ inspectorProgress, 2026-10-24T11:16:17.6990320Z 57 │ inspectorVisible, 2026-10-24T11:16:17.6990382Z 58 │ inspectorWidth, 2026-10-24T11:16:17.6990444Z 59 │ onClosed, 2026-10-24T11:16:17.6990518Z 60 │ renderedInspectorWidth, 2026-10-24T11:16:17.6990580Z 61 │ resizing, 2026-10-24T11:16:17.6990634Z 62 │ ]); 2026-10-24T11:16:17.6990688Z 63 │ 2026-10-24T11:16:17.6990753Z 64 │ useEffect(() => { 2026-10-24T11:16:17.6990901Z 65 │ const targetWidth = inspectorWidth ?? 0; 2026-10-24T11:16:17.6991015Z 66 │ if (!inspectorVisible || resizing) { 2026-10-24T11:16:17.6991114Z 67 │ renderedContentWidth.value = targetWidth; 2026-10-24T11:16:17.6991207Z ·  ──────────┬───────── 2026-10-24T11:16:17.6991372Z · ╰── `renderedContentWidth` cannot be modified 2026-10-24T11:16:17.6991431Z 68 │ return; 2026-10-24T11:16:17.6991486Z ╰──── 2026-10-24T11:16:17.6991748Z  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-24T11:16:17.6992050Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:16:17.6992052Z 2026-10-24T11:16:17.6992384Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T11:16:17.6992557Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:473:19] 2026-10-24T11:16:17.6992618Z 472 │ onFilters, 2026-10-24T11:16:17.6992690Z 473 │ authorOptions = [], 2026-10-24T11:16:17.6992769Z ·  ── 2026-10-24T11:16:17.6992838Z 474 │ labelOptions = [], 2026-10-24T11:16:17.6992893Z ╰──── 2026-10-24T11:16:17.6993210Z  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-24T11:16:17.6993213Z 2026-10-24T11:16:17.6993497Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T11:16:17.6993666Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:474:18] 2026-10-24T11:16:17.6993735Z 473 │ authorOptions = [], 2026-10-24T11:16:17.6993802Z 474 │ labelOptions = [], 2026-10-24T11:16:17.6993881Z ·  ── 2026-10-24T11:16:17.6993945Z 475 │ optionScope, 2026-10-24T11:16:17.6993998Z ╰──── 2026-10-24T11:16:17.6994312Z  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-24T11:16:17.6994315Z 2026-10-24T11:16:17.6994516Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:16:17.6994676Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:155:7] 2026-10-24T11:16:17.6994739Z 154 │ } 2026-10-24T11:16:17.6994811Z 155 │ }, [wrappedRender]); 2026-10-24T11:16:17.6994893Z ·  ──────┬────── 2026-10-24T11:16:17.6995047Z · ╰── Unnecessary dependency `wrappedRender` 2026-10-24T11:16:17.6995103Z 156 │ 2026-10-24T11:16:17.6995156Z ╰──── 2026-10-24T11:16:17.6995447Z  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-24T11:16:17.6995754Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.6995756Z 2026-10-24T11:16:17.6996046Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T11:16:17.6996244Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:800:42] 2026-10-24T11:16:17.6996302Z 799 │ > 2026-10-24T11:16:17.6996430Z 800 │ 2026-10-24T11:16:17.6996558Z ·  ──────────────────── 2026-10-24T11:16:17.6996661Z 801 │ 2026-10-24T11:16:17.6996716Z ╰──── 2026-10-24T11:16:17.6996936Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T11:16:17.6997077Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T11:16:17.6997080Z 2026-10-24T11:16:17.6997442Z ⚠ 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-24T11:16:17.6997585Z ╭─[apps/server/src/vcs/GitVcsDriverCore.test.ts:1786:34] 2026-10-24T11:16:17.6997723Z 1785 │ const stat = branch.files!.find((file) => file.path === path)!; 2026-10-24T11:16:17.6997873Z 1786 │ const request = yield* Schema.decodeEffect(ReviewDiffPreviewInput)({ 2026-10-24T11:16:17.6997997Z ·  ─────────────────── 2026-10-24T11:16:17.6998064Z 1787 │ cwd, 2026-10-24T11:16:17.6998118Z ╰──── 2026-10-24T11:16:17.6998121Z 2026-10-24T11:16:17.6998287Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T11:16:17.6998427Z ╭─[apps/server/src/process/externalLauncher.test.ts:186:12] 2026-10-24T11:16:17.6998482Z 185 │ 2026-10-24T11:16:17.6998590Z 186 │ for (const {} of ["darwin", "linux"] as const) { 2026-10-24T11:16:17.6998665Z ·  ── 2026-10-24T11:16:17.6998722Z 187 │ } 2026-10-24T11:16:17.6998776Z ╰──── 2026-10-24T11:16:17.6999004Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T11:16:17.6999007Z 2026-10-24T11:16:17.6999171Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T11:16:17.6999310Z ╭─[apps/server/src/process/externalLauncher.test.ts:189:12] 2026-10-24T11:16:17.6999364Z 188 │ 2026-10-24T11:16:17.6999431Z 189 │ for (const {} of [ 2026-10-24T11:16:17.6999501Z ·  ── 2026-10-24T11:16:17.6999597Z 190 │ { kind: "browser", folderVerb: "none" }, 2026-10-24T11:16:17.6999651Z ╰──── 2026-10-24T11:16:17.6999924Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T11:16:17.6999955Z 2026-10-24T11:16:17.7000119Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T11:16:17.7000256Z ╭─[apps/server/src/process/externalLauncher.test.ts:311:12] 2026-10-24T11:16:17.7000313Z 310 │ 2026-10-24T11:16:17.7000440Z 311 │ for (const {} of ["rejected", "spawn-error", "stalled"] as const) { 2026-10-24T11:16:17.7000511Z ·  ── 2026-10-24T11:16:17.7000566Z 312 │ } 2026-10-24T11:16:17.7000619Z ╰──── 2026-10-24T11:16:17.7000841Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T11:16:17.7000843Z 2026-10-24T11:16:17.7001010Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T11:16:17.7001149Z ╭─[apps/server/src/process/externalLauncher.test.ts:314:12] 2026-10-24T11:16:17.7001205Z 313 │ 2026-10-24T11:16:17.7001271Z 314 │ for (const {} of [ 2026-10-24T11:16:17.7001340Z ·  ── 2026-10-24T11:16:17.7001396Z 315 │ { 2026-10-24T11:16:17.7001450Z ╰──── 2026-10-24T11:16:17.7001674Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T11:16:17.7001676Z 2026-10-24T11:16:17.7001888Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T11:16:17.7002033Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:773:7] 2026-10-24T11:16:17.7002180Z 772 │ if (settingsSheetPresentation.isActive) { 2026-10-24T11:16:17.7002315Z 773 │ settingsRoutePresentation.present(settingsRouteSession); 2026-10-24T11:16:17.7002416Z ·  ────────────┬──────────── 2026-10-24T11:16:17.7002593Z · ╰── Missing dependency `settingsRoutePresentation` 2026-10-24T11:16:17.7002651Z 774 │ } 2026-10-24T11:16:17.7002855Z 775 │ }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]); 2026-10-24T11:16:17.7002972Z ·  ────────────────┬──────────────── 2026-10-24T11:16:17.7003256Z · ╰── Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead 2026-10-24T11:16:17.7003312Z 776 │ 2026-10-24T11:16:17.7003365Z ╰──── 2026-10-24T11:16:17.7003792Z  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-24T11:16:17.7004102Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7004105Z 2026-10-24T11:16:17.7004264Z ⚠ react(immutability): This value cannot be modified 2026-10-24T11:16:17.7004406Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:391:5] 2026-10-24T11:16:17.7004574Z 387 │ typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0; 2026-10-24T11:16:17.7004714Z 388 │ const animatedBorderRadius = useSharedValue(targetBorderRadius); 2026-10-24T11:16:17.7004857Z ·  ──────────┬───────── 2026-10-24T11:16:17.7005050Z · ╰── `animatedBorderRadius` originates here 2026-10-24T11:16:17.7005210Z 389 │ const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android"; 2026-10-24T11:16:17.7005313Z 390 │ useLayoutEffect(() => { 2026-10-24T11:16:17.7005415Z 391 │ animatedBorderRadius.value = shouldAnimate 2026-10-24T11:16:17.7005507Z ·  ──────────┬───────── 2026-10-24T11:16:17.7005670Z · ╰── `animatedBorderRadius` cannot be modified 2026-10-24T11:16:17.7005761Z 392 │ ? withTiming(targetBorderRadius, { 2026-10-24T11:16:17.7005813Z ╰──── 2026-10-24T11:16:17.7006075Z  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-24T11:16:17.7006383Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:16:17.7006388Z 2026-10-24T11:16:17.7006594Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T11:16:17.7006731Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:231:6] 2026-10-24T11:16:17.7006898Z 227 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-24T11:16:17.7006989Z 228 │ nativeEventSnapshotsRef.current, 2026-10-24T11:16:17.7007086Z ·  ───────────┬─────────── 2026-10-24T11:16:17.7007553Z · ╰── 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-24T11:16:17.7007633Z 229 │ mostRecentEventCount, 2026-10-24T11:16:17.7007693Z 230 │ ); 2026-10-24T11:16:17.7007821Z 231 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-24T11:16:17.7007973Z ·  ──────────────────────────┬────────────────────────── 2026-10-24T11:16:17.7008176Z · ╰── This dependency list is missing values used by the callback 2026-10-24T11:16:17.7008264Z 232 │ const assumedValue = props.value; 2026-10-24T11:16:17.7008318Z ╰──── 2026-10-24T11:16:17.7008484Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T11:16:17.7008794Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7008800Z 2026-10-24T11:16:17.7009015Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T11:16:17.7009154Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:239:7] 2026-10-24T11:16:17.7009300Z 238 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-24T11:16:17.7009388Z 239 │ nativeEventSnapshotsRef.current, 2026-10-24T11:16:17.7009484Z ·  ───────────┬─────────── 2026-10-24T11:16:17.7009943Z · ╰── 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-24T11:16:17.7010019Z 240 │ controlledEventCount, 2026-10-24T11:16:17.7010136Z 241 │ assumedValue, 2026-10-24T11:16:17.7010223Z 242 │ ); 2026-10-24T11:16:17.7010383Z 243 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-24T11:16:17.7010524Z ·  ───────────┬────────── 2026-10-24T11:16:17.7010737Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-24T11:16:17.7010827Z 244 │ const acceptNativeEvent = useCallback( 2026-10-24T11:16:17.7010881Z ╰──── 2026-10-24T11:16:17.7011299Z  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-24T11:16:17.7011616Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7011621Z 2026-10-24T11:16:17.7011766Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.7011906Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29] 2026-10-24T11:16:17.7012032Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T11:16:17.7012161Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T11:16:17.7012321Z ·  ─────────────┬──────────── 2026-10-24T11:16:17.7012491Z · ╰── Cannot access ref value during render 2026-10-24T11:16:17.7012550Z 165 │ }); 2026-10-24T11:16:17.7012605Z ╰──── 2026-10-24T11:16:17.7013068Z  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-24T11:16:17.7013358Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.7013361Z 2026-10-24T11:16:17.7013508Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.7013648Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29] 2026-10-24T11:16:17.7013770Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T11:16:17.7013882Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T11:16:17.7014010Z ·  ─────────────┬──────────── 2026-10-24T11:16:17.7014224Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T11:16:17.7014283Z 165 │ }); 2026-10-24T11:16:17.7014335Z ╰──── 2026-10-24T11:16:17.7014795Z  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-24T11:16:17.7015083Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.7015086Z 2026-10-24T11:16:17.7015288Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.7015456Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:166:23] 2026-10-24T11:16:17.7015512Z 165 │ }); 2026-10-24T11:16:17.7015604Z 166 │ confirmedTokensRef.current = tokens; 2026-10-24T11:16:17.7015737Z ·  ─────────┬────────────┬─── 2026-10-24T11:16:17.7015935Z · │ ╰── Cannot update ref value during render 2026-10-24T11:16:17.7016053Z · ╰── This value is a ref 2026-10-24T11:16:17.7016130Z 167 │ return JSON.stringify( 2026-10-24T11:16:17.7016183Z ╰──── 2026-10-24T11:16:17.7016645Z  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-24T11:16:17.7016935Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.7016938Z 2026-10-24T11:16:17.7017085Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.7017222Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:208:5] 2026-10-24T11:16:17.7017297Z 207 │ mostRecentEventCount, 2026-10-24T11:16:17.7017387Z 208 │ nativeEventSnapshotsRef.current, 2026-10-24T11:16:17.7017499Z ·  ───────────────┬─────────────── 2026-10-24T11:16:17.7017692Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T11:16:17.7017749Z 209 │ ); 2026-10-24T11:16:17.7017809Z ╰──── 2026-10-24T11:16:17.7018261Z  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-24T11:16:17.7018548Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.7018551Z 2026-10-24T11:16:17.7018696Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.7018832Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:214:5] 2026-10-24T11:16:17.7018906Z 213 │ mostRecentEventCount, 2026-10-24T11:16:17.7018992Z 214 │ nativeEventSnapshotsRef.current, 2026-10-24T11:16:17.7019151Z ·  ───────────────┬─────────────── 2026-10-24T11:16:17.7019436Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T11:16:17.7019493Z 215 │ ); 2026-10-24T11:16:17.7019545Z ╰──── 2026-10-24T11:16:17.7019999Z  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-24T11:16:17.7020289Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.7020291Z 2026-10-24T11:16:17.7020480Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T11:16:17.7020622Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:199:6] 2026-10-24T11:16:17.7020814Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T11:16:17.7020931Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T11:16:17.7021046Z ·  ─────────┬──────── 2026-10-24T11:16:17.7021511Z · ╰── 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-24T11:16:17.7021568Z 165 │ }); 2026-10-24T11:16:17.7021661Z 166 │ confirmedTokensRef.current = tokens; 2026-10-24T11:16:17.7021735Z 167 │ return JSON.stringify( 2026-10-24T11:16:17.7021905Z 168 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-24T11:16:17.7021976Z 169 │ const record = 2026-10-24T11:16:17.7022062Z 170 │ token.type === "context" 2026-10-24T11:16:17.7022261Z 171 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-24T11:16:17.7022330Z 172 │ : undefined; 2026-10-24T11:16:17.7022437Z 173 │ const presentation = contextChipPresentation( 2026-10-24T11:16:17.7022550Z 174 │ token.type === "context" ? token.kind : token.type, 2026-10-24T11:16:17.7022616Z 175 │ record, 2026-10-24T11:16:17.7022677Z 176 │ ); 2026-10-24T11:16:17.7022761Z 177 │ const icon = contextChipIcon( 2026-10-24T11:16:17.7022833Z 178 │ presentation, 2026-10-24T11:16:17.7022978Z 179 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-24T11:16:17.7023046Z 180 │ ); 2026-10-24T11:16:17.7023112Z 181 │ return { 2026-10-24T11:16:17.7023184Z 182 │ type: token.type, 2026-10-24T11:16:17.7023262Z 183 │ source: token.source, 2026-10-24T11:16:17.7023334Z 184 │ start: token.start, 2026-10-24T11:16:17.7023404Z 185 │ end: token.end, 2026-10-24T11:16:17.7023555Z 186 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-24T11:16:17.7023619Z 187 │ label: 2026-10-24T11:16:17.7023698Z 188 │ token.type === "skill" 2026-10-24T11:16:17.7023808Z 189 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-24T11:16:17.7023894Z 190 │ : token.type === "context" 2026-10-24T11:16:17.7024130Z 191 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-24T11:16:17.7024277Z 192 │ : basename(token.value), 2026-10-24T11:16:17.7024459Z 193 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-24T11:16:17.7024554Z 194 │ iconUri: contextChipIconUri(icon), 2026-10-24T11:16:17.7024644Z 195 │ tintsIcon: icon.kind === "chip", 2026-10-24T11:16:17.7024702Z 196 │ }; 2026-10-24T11:16:17.7024764Z 197 │ }), 2026-10-24T11:16:17.7024822Z 198 │ ); 2026-10-24T11:16:17.7024956Z 199 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-24T11:16:17.7025130Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-24T11:16:17.7025341Z · ╰── This dependency list is missing values used by the callback 2026-10-24T11:16:17.7025490Z 200 │ // Every render resolves against the snapshot history, so a render whose 2026-10-24T11:16:17.7025549Z ╰──── 2026-10-24T11:16:17.7025751Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T11:16:17.7026066Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7026068Z 2026-10-24T11:16:17.7026259Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T11:16:17.7026399Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:261:5] 2026-10-24T11:16:17.7026531Z 253 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-24T11:16:17.7026634Z 254 │ nativeEventSnapshotsRef.current.push({ 2026-10-24T11:16:17.7026735Z ·  ───────────┬─────────── 2026-10-24T11:16:17.7027196Z · ╰── 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-24T11:16:17.7027292Z 255 │ eventCount: acknowledgedEventCount, 2026-10-24T11:16:17.7027354Z 256 │ value, 2026-10-24T11:16:17.7027436Z 257 │ selection: nextSelection, 2026-10-24T11:16:17.7027496Z 258 │ }); 2026-10-24T11:16:17.7027581Z 259 │ return acknowledgedEventCount; 2026-10-24T11:16:17.7027636Z 260 │ }, 2026-10-24T11:16:17.7027695Z 261 │ [], 2026-10-24T11:16:17.7027767Z ·  ─┬ 2026-10-24T11:16:17.7027955Z · ╰── This dependency list is missing values used by the callback 2026-10-24T11:16:17.7028016Z 262 │ ); 2026-10-24T11:16:17.7028075Z ╰──── 2026-10-24T11:16:17.7028280Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T11:16:17.7028589Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7028592Z 2026-10-24T11:16:17.7028820Z ⚠ eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used. 2026-10-24T11:16:17.7028952Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:15:8] 2026-10-24T11:16:17.7029024Z 14 │ threadSearchMatchKey, 2026-10-24T11:16:17.7029117Z 15 │ type EnvironmentThreadSearchMatch, 2026-10-24T11:16:17.7029226Z ·  ──────────────┬───────────── 2026-10-24T11:16:17.7029461Z · ╰── 'EnvironmentThreadSearchMatch' is imported here 2026-10-24T11:16:17.7029600Z 16 │ } from "@t3tools/client-runtime/state/thread-search"; 2026-10-24T11:16:17.7029655Z ╰──── 2026-10-24T11:16:17.7029753Z  help: Consider removing this import. 2026-10-24T11:16:17.7029759Z 2026-10-24T11:16:17.7029959Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:16:17.7030092Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:527:25] 2026-10-24T11:16:17.7030224Z 526 │ // range) the boundary string is identical and the chain would die. 2026-10-24T11:16:17.7030317Z 527 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-24T11:16:17.7030421Z ·  ───────┬────── 2026-10-24T11:16:17.7030598Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T11:16:17.7030742Z 528 │ const v2SearchQuery = props.searchQuery.trim().toLocaleLowerCase(); 2026-10-24T11:16:17.7030796Z ╰──── 2026-10-24T11:16:17.7031085Z  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-24T11:16:17.7031395Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7031397Z 2026-10-24T11:16:17.7031565Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T11:16:17.7031697Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:518:53] 2026-10-24T11:16:17.7031788Z 517 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-24T11:16:17.7031951Z 518 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-24T11:16:17.7032105Z ·  ─────┬──── 2026-10-24T11:16:17.7032277Z · ╰── Cannot call impure function 2026-10-24T11:16:17.7032360Z 519 │ const id = setTimeout(() => { 2026-10-24T11:16:17.7032414Z ╰──── 2026-10-24T11:16:17.7032695Z  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-24T11:16:17.7032989Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T11:16:17.7032991Z 2026-10-24T11:16:17.7033192Z ⚠ eslint(no-unused-vars): Identifier 'Image' is imported but never used. 2026-10-24T11:16:17.7033337Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:17:10] 2026-10-24T11:16:17.7033478Z 16 │ import type { NativeSyntheticEvent, ViewProps } from "react-native"; 2026-10-24T11:16:17.7033597Z 17 │ import { Image, Platform, StyleSheet } from "react-native"; 2026-10-24T11:16:17.7033674Z ·  ──┬── 2026-10-24T11:16:17.7033804Z · ╰── 'Image' is imported here 2026-10-24T11:16:17.7033861Z 18 │ 2026-10-24T11:16:17.7033916Z ╰──── 2026-10-24T11:16:17.7034017Z  help: Consider removing this import. 2026-10-24T11:16:17.7034319Z 2026-10-24T11:16:17.7034519Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T11:16:17.7034726Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:229:6] 2026-10-24T11:16:17.7034917Z 225 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-24T11:16:17.7035009Z 226 │ nativeEventSnapshotsRef.current, 2026-10-24T11:16:17.7035104Z ·  ───────────┬─────────── 2026-10-24T11:16:17.7035564Z · ╰── 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-24T11:16:17.7035638Z 227 │ mostRecentEventCount, 2026-10-24T11:16:17.7035698Z 228 │ ); 2026-10-24T11:16:17.7035824Z 229 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-24T11:16:17.7035977Z ·  ──────────────────────────┬────────────────────────── 2026-10-24T11:16:17.7036184Z · ╰── This dependency list is missing values used by the callback 2026-10-24T11:16:17.7036271Z 230 │ const assumedValue = props.value; 2026-10-24T11:16:17.7036325Z ╰──── 2026-10-24T11:16:17.7036489Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T11:16:17.7036796Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7036799Z 2026-10-24T11:16:17.7037012Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T11:16:17.7037157Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:237:7] 2026-10-24T11:16:17.7037307Z 236 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-24T11:16:17.7037397Z 237 │ nativeEventSnapshotsRef.current, 2026-10-24T11:16:17.7037492Z ·  ───────────┬─────────── 2026-10-24T11:16:17.7037948Z · ╰── 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-24T11:16:17.7038023Z 238 │ controlledEventCount, 2026-10-24T11:16:17.7038089Z 239 │ assumedValue, 2026-10-24T11:16:17.7038148Z 240 │ ); 2026-10-24T11:16:17.7038306Z 241 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-24T11:16:17.7038450Z ·  ───────────┬────────── 2026-10-24T11:16:17.7038707Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-24T11:16:17.7038827Z 242 │ const acceptNativeEvent = useCallback( 2026-10-24T11:16:17.7038881Z ╰──── 2026-10-24T11:16:17.7039297Z  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-24T11:16:17.7039603Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7039608Z 2026-10-24T11:16:17.7039751Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.7039905Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29] 2026-10-24T11:16:17.7040032Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T11:16:17.7040149Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T11:16:17.7040270Z ·  ─────────────┬──────────── 2026-10-24T11:16:17.7040442Z · ╰── Cannot access ref value during render 2026-10-24T11:16:17.7040501Z 163 │ }); 2026-10-24T11:16:17.7040556Z ╰──── 2026-10-24T11:16:17.7041011Z  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-24T11:16:17.7041305Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.7041311Z 2026-10-24T11:16:17.7041458Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.7041602Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29] 2026-10-24T11:16:17.7041725Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T11:16:17.7041835Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T11:16:17.7041958Z ·  ─────────────┬──────────── 2026-10-24T11:16:17.7042206Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T11:16:17.7042266Z 163 │ }); 2026-10-24T11:16:17.7042318Z ╰──── 2026-10-24T11:16:17.7042779Z  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-24T11:16:17.7043069Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.7043072Z 2026-10-24T11:16:17.7043218Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.7043363Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:164:23] 2026-10-24T11:16:17.7043418Z 163 │ }); 2026-10-24T11:16:17.7043511Z 164 │ confirmedTokensRef.current = tokens; 2026-10-24T11:16:17.7043696Z ·  ─────────┬────────────┬─── 2026-10-24T11:16:17.7043922Z · │ ╰── Cannot update ref value during render 2026-10-24T11:16:17.7044041Z · ╰── This value is a ref 2026-10-24T11:16:17.7044116Z 165 │ return JSON.stringify( 2026-10-24T11:16:17.7044171Z ╰──── 2026-10-24T11:16:17.7044627Z  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-24T11:16:17.7044911Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.7044914Z 2026-10-24T11:16:17.7045064Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.7045210Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:206:5] 2026-10-24T11:16:17.7045285Z 205 │ mostRecentEventCount, 2026-10-24T11:16:17.7045371Z 206 │ nativeEventSnapshotsRef.current, 2026-10-24T11:16:17.7045483Z ·  ───────────────┬─────────────── 2026-10-24T11:16:17.7045678Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T11:16:17.7045737Z 207 │ ); 2026-10-24T11:16:17.7045789Z ╰──── 2026-10-24T11:16:17.7046247Z  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-24T11:16:17.7046540Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.7046545Z 2026-10-24T11:16:17.7046691Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.7046834Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:212:5] 2026-10-24T11:16:17.7046902Z 211 │ mostRecentEventCount, 2026-10-24T11:16:17.7046994Z 212 │ nativeEventSnapshotsRef.current, 2026-10-24T11:16:17.7047104Z ·  ───────────────┬─────────────── 2026-10-24T11:16:17.7047298Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T11:16:17.7047353Z 213 │ ); 2026-10-24T11:16:17.7047408Z ╰──── 2026-10-24T11:16:17.7047869Z  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-24T11:16:17.7048158Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.7048161Z 2026-10-24T11:16:17.7048347Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T11:16:17.7048487Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:197:6] 2026-10-24T11:16:17.7048610Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T11:16:17.7048725Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T11:16:17.7048893Z ·  ─────────┬──────── 2026-10-24T11:16:17.7049389Z · ╰── 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-24T11:16:17.7049450Z 163 │ }); 2026-10-24T11:16:17.7086892Z 164 │ confirmedTokensRef.current = tokens; 2026-10-24T11:16:17.7087070Z 165 │ return JSON.stringify( 2026-10-24T11:16:17.7087253Z 166 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-24T11:16:17.7087322Z 167 │ const record = 2026-10-24T11:16:17.7087402Z 168 │ token.type === "context" 2026-10-24T11:16:17.7087568Z 169 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-24T11:16:17.7087648Z 170 │ : undefined; 2026-10-24T11:16:17.7087768Z 171 │ const presentation = contextChipPresentation( 2026-10-24T11:16:17.7087880Z 172 │ token.type === "context" ? token.kind : token.type, 2026-10-24T11:16:17.7087944Z 173 │ record, 2026-10-24T11:16:17.7088004Z 174 │ ); 2026-10-24T11:16:17.7088089Z 175 │ const icon = contextChipIcon( 2026-10-24T11:16:17.7088157Z 176 │ presentation, 2026-10-24T11:16:17.7088301Z 177 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-24T11:16:17.7088360Z 178 │ ); 2026-10-24T11:16:17.7088421Z 179 │ return { 2026-10-24T11:16:17.7088492Z 180 │ type: token.type, 2026-10-24T11:16:17.7088566Z 181 │ source: token.source, 2026-10-24T11:16:17.7088639Z 182 │ start: token.start, 2026-10-24T11:16:17.7088710Z 183 │ end: token.end, 2026-10-24T11:16:17.7088863Z 184 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-24T11:16:17.7088923Z 185 │ label: 2026-10-24T11:16:17.7089001Z 186 │ token.type === "skill" 2026-10-24T11:16:17.7089110Z 187 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-24T11:16:17.7089193Z 188 │ : token.type === "context" 2026-10-24T11:16:17.7089430Z 189 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-24T11:16:17.7089514Z 190 │ : basename(token.value), 2026-10-24T11:16:17.7089655Z 191 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-24T11:16:17.7089749Z 192 │ iconUri: contextChipIconUri(icon), 2026-10-24T11:16:17.7089842Z 193 │ tintsIcon: icon.kind === "chip", 2026-10-24T11:16:17.7089905Z 194 │ }; 2026-10-24T11:16:17.7089962Z 195 │ }), 2026-10-24T11:16:17.7090017Z 196 │ ); 2026-10-24T11:16:17.7090147Z 197 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-24T11:16:17.7090326Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-24T11:16:17.7090548Z · ╰── This dependency list is missing values used by the callback 2026-10-24T11:16:17.7090691Z 198 │ // Every render resolves against the snapshot history, so a render whose 2026-10-24T11:16:17.7090745Z ╰──── 2026-10-24T11:16:17.7090952Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T11:16:17.7091415Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7091468Z 2026-10-24T11:16:17.7091662Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T11:16:17.7091811Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:259:5] 2026-10-24T11:16:17.7091940Z 251 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-24T11:16:17.7092041Z 252 │ nativeEventSnapshotsRef.current.push({ 2026-10-24T11:16:17.7092200Z ·  ───────────┬─────────── 2026-10-24T11:16:17.7092673Z · ╰── 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-24T11:16:17.7092770Z 253 │ eventCount: acknowledgedEventCount, 2026-10-24T11:16:17.7092838Z 254 │ value, 2026-10-24T11:16:17.7092917Z 255 │ selection: nextSelection, 2026-10-24T11:16:17.7092975Z 256 │ }); 2026-10-24T11:16:17.7093057Z 257 │ return acknowledgedEventCount; 2026-10-24T11:16:17.7093113Z 258 │ }, 2026-10-24T11:16:17.7093169Z 259 │ [], 2026-10-24T11:16:17.7093237Z ·  ─┬ 2026-10-24T11:16:17.7093425Z · ╰── This dependency list is missing values used by the callback 2026-10-24T11:16:17.7093481Z 260 │ ); 2026-10-24T11:16:17.7093534Z ╰──── 2026-10-24T11:16:17.7093734Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T11:16:17.7094052Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7094058Z 2026-10-24T11:16:17.7094318Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:16:17.7094498Z ╭─[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:60:5] 2026-10-24T11:16:17.7094551Z 58 │ 2026-10-24T11:16:17.7094615Z 59 │ useEffect(() => { 2026-10-24T11:16:17.7094689Z ·  ────┬──── 2026-10-24T11:16:17.7094823Z · ╰── This is the containing effect 2026-10-24T11:16:17.7094904Z 60 │ setMountedModes((current) => { 2026-10-24T11:16:17.7094985Z ·  ───────┬─────── 2026-10-24T11:16:17.7095164Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.7095250Z 61 │ if (current.has(props.mode)) { 2026-10-24T11:16:17.7095303Z ╰──── 2026-10-24T11:16:17.7095895Z  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-24T11:16:17.7096217Z  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-24T11:16:17.7096220Z 2026-10-24T11:16:17.7096365Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.7096521Z ╭─[apps/mobile/src/features/home/thread-swipe-actions.tsx:494:27] 2026-10-24T11:16:17.7096630Z 493 │ > 2026-10-24T11:16:17.7096733Z 494 │ {props.children(close)} 2026-10-24T11:16:17.7096827Z ·  ──┬── 2026-10-24T11:16:17.7096990Z · ╰── Cannot access ref value during render 2026-10-24T11:16:17.7097068Z 495 │ 2026-10-24T11:16:17.7097118Z ╰──── 2026-10-24T11:16:17.7097578Z  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-24T11:16:17.7097867Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.7097874Z 2026-10-24T11:16:17.7098135Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:16:17.7098294Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:444:5] 2026-10-24T11:16:17.7098355Z 434 │ : null; 2026-10-24T11:16:17.7098421Z 435 │ useEffect(() => { 2026-10-24T11:16:17.7098494Z ·  ────┬──── 2026-10-24T11:16:17.7098629Z · ╰── This is the containing effect 2026-10-24T11:16:17.7098690Z 436 │ if ( 2026-10-24T11:16:17.7098766Z 437 │ props.active === false || 2026-10-24T11:16:17.7098841Z 438 │ activeDraftKey !== null || 2026-10-24T11:16:17.7098921Z 439 │ editingPendingTask !== null || 2026-10-24T11:16:17.7098995Z 440 │ selectedProject === null 2026-10-24T11:16:17.7099057Z 441 │ ) { 2026-10-24T11:16:17.7099121Z 442 │ return; 2026-10-24T11:16:17.7099173Z 443 │ } 2026-10-24T11:16:17.7099243Z 444 │ setActiveDraftKey( 2026-10-24T11:16:17.7099327Z ·  ────────┬──────── 2026-10-24T11:16:17.7099500Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.7099569Z 445 │ createNewTaskDraft({ 2026-10-24T11:16:17.7099622Z ╰──── 2026-10-24T11:16:17.7100209Z  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-24T11:16:17.7100570Z  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-24T11:16:17.7100597Z 2026-10-24T11:16:17.7100901Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T11:16:17.7101064Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1244:36] 2026-10-24T11:16:17.7101171Z 1243 │ 2026-10-24T11:16:17.7101366Z 1244 │ {props.children} 2026-10-24T11:16:17.7101482Z ·  ───────────── 2026-10-24T11:16:17.7101554Z 1245 │ 2026-10-24T11:16:17.7101609Z ╰──── 2026-10-24T11:16:17.7101835Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T11:16:17.7101976Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T11:16:17.7101979Z 2026-10-24T11:16:17.7102275Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:16:17.7102398Z ╭─[apps/server/src/serverRuntimeStartup.ts:728:7] 2026-10-24T11:16:17.7102451Z 727 │ 2026-10-24T11:16:17.7102532Z 728 │ const layer = layerWithOptions(); 2026-10-24T11:16:17.7102602Z ·  ──┬── 2026-10-24T11:16:17.7102730Z · ╰── 'layer' is declared here 2026-10-24T11:16:17.7102782Z ╰──── 2026-10-24T11:16:17.7102887Z  help: Consider removing this declaration. 2026-10-24T11:16:17.7102890Z 2026-10-24T11:16:17.7103083Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T11:16:17.7103242Z ╭─[apps/mobile/src/features/threads/ThreadQueueControl.tsx:602:27] 2026-10-24T11:16:17.7103413Z 601 │ const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success)); 2026-10-24T11:16:17.7103490Z 602 │ const gesture = Gesture.Pan() 2026-10-24T11:16:17.7103579Z ·  ─┬─ 2026-10-24T11:16:17.7103720Z · ╰── `Pan` may be a component 2026-10-24T11:16:17.7103794Z 603 │ .enabled(!props.disabled) 2026-10-24T11:16:17.7103846Z ╰──── 2026-10-24T11:16:17.7104117Z  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-24T11:16:17.7104560Z  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-24T11:16:17.7104565Z 2026-10-24T11:16:17.7105036Z ⚠ 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-24T11:16:17.7105221Z ╭─[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:521:13] 2026-10-24T11:16:17.7105291Z 520 │ })).delivery; 2026-10-24T11:16:17.7105497Z 521 │ ╭─▶ while (delivery.outcome === "accepted") { 2026-10-24T11:16:17.7105681Z 522 │ │ yield* Effect.yieldNow; 2026-10-24T11:16:17.7105870Z 523 │ │ delivery = (yield* service.getWebhookDelivery({ 2026-10-24T11:16:17.7105973Z 524 │ │ id: task.id, 2026-10-24T11:16:17.7106092Z 525 │ │ deliveryId: deliveryId!, 2026-10-24T11:16:17.7106189Z 526 │ │ })).delivery; 2026-10-24T11:16:17.7106329Z 527 │ ╰─▶ } 2026-10-24T11:16:17.7106447Z 528 │ assert.equal(delivery.outcome, "dispatch_failed"); 2026-10-24T11:16:17.7106498Z ╰──── 2026-10-24T11:16:17.7106501Z 2026-10-24T11:16:17.7106647Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.7106773Z ╭─[apps/mobile/src/components/ui/Menu.tsx:54:36] 2026-10-24T11:16:17.7106961Z 53 │ const child = children as ReactElement>; 2026-10-24T11:16:17.7107138Z 54 │ ╭─▶ children = cloneElement(child, { 2026-10-24T11:16:17.7107244Z 55 │ │ onTouchStart: (event) => { 2026-10-24T11:16:17.7107407Z 56 │ │ // Reset for a new touch, not onPressIn, which also fires when a 2026-10-24T11:16:17.7107566Z 57 │ │ // finger moves out of the row and back during the same gesture. 2026-10-24T11:16:17.7107694Z 58 │ │ menuPress.current.isPreparing = false; 2026-10-24T11:16:17.7107864Z 59 │ │ menuPress.current.suppressPress = menuPress.current.isOpen; 2026-10-24T11:16:17.7107981Z 60 │ │ pendingPress.current = null; 2026-10-24T11:16:17.7108105Z 61 │ │ child.props.onTouchStart?.(event); 2026-10-24T11:16:17.7108182Z 62 │ │ }, 2026-10-24T11:16:17.7108283Z 63 │ │ onPress: (event) => { 2026-10-24T11:16:17.7108454Z 64 │ │ // Accessibility clicks have no touch identifier and must not inherit 2026-10-24T11:16:17.7108591Z 65 │ │ // cancellation from a previous physical gesture. 2026-10-24T11:16:17.7108760Z 66 │ │ const isTouch = typeof event.nativeEvent.identifier === "number"; 2026-10-24T11:16:17.7108950Z 67 │ │ if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) { 2026-10-24T11:16:17.7109035Z 68 │ │ return; 2026-10-24T11:16:17.7109122Z 69 │ │ } 2026-10-24T11:16:17.7109267Z 70 │ │ if (isTouch && menuPress.current.isPreparing) { 2026-10-24T11:16:17.7109438Z 71 │ │ // A release can arrive between native menu preparation and display. 2026-10-24T11:16:17.7109604Z 72 │ │ // Let UIKit's display/cancel callback decide this press's outcome. 2026-10-24T11:16:17.7109704Z 73 │ │ event.persist(); 2026-10-24T11:16:17.7109863Z 74 │ │ pendingPress.current = () => child.props.onPress?.(event); 2026-10-24T11:16:17.7109949Z 75 │ │ return; 2026-10-24T11:16:17.7110025Z 76 │ │ } 2026-10-24T11:16:17.7110139Z 77 │ │ child.props.onPress?.(event); 2026-10-24T11:16:17.7110259Z 78 │ │ }, 2026-10-24T11:16:17.7110422Z 79 │ ├─▶ }); 2026-10-24T11:16:17.7110664Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T11:16:17.7110768Z 80 │ menuProps.onMenuInteractionStart = () => { 2026-10-24T11:16:17.7110821Z ╰──── 2026-10-24T11:16:17.7111286Z  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-24T11:16:17.7111573Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.7111581Z 2026-10-24T11:16:17.7111727Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.7111880Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:152:27] 2026-10-24T11:16:17.7112057Z 151 │ 2026-10-24T11:16:17.7112147Z 152 │ {props.children(open)} 2026-10-24T11:16:17.7112272Z ·  ──┬─ 2026-10-24T11:16:17.7112433Z · ╰── Cannot access ref value during render 2026-10-24T11:16:17.7112497Z 153 │ 2026-10-24T11:16:17.7112549Z ╰──── 2026-10-24T11:16:17.7113010Z  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-24T11:16:17.7113299Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.7113302Z 2026-10-24T11:16:17.7113499Z ⚠ react(memo-dependencies): Found missing/extra memoization dependencies 2026-10-24T11:16:17.7113649Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:140:9] 2026-10-24T11:16:17.7113731Z 139 │ if (action.id !== undefined) { 2026-10-24T11:16:17.7113807Z 140 │ props.onPressAction?.({ 2026-10-24T11:16:17.7113880Z ·  ──┬── 2026-10-24T11:16:17.7114013Z · ╰── Missing dependency `props` 2026-10-24T11:16:17.7114112Z 141 │ nativeEvent: { event: action.id }, 2026-10-24T11:16:17.7114258Z 142 │ } as Parameters>[0]); 2026-10-24T11:16:17.7114315Z 143 │ } 2026-10-24T11:16:17.7114372Z 144 │ }, 2026-10-24T11:16:17.7114453Z 145 │ [close, props.onPressAction], 2026-10-24T11:16:17.7114548Z ·  ─────────┬───────── 2026-10-24T11:16:17.7114766Z · ╰── Overly precise dependency `props.onPressAction`, use `props` instead 2026-10-24T11:16:17.7114823Z 146 │ ); 2026-10-24T11:16:17.7114875Z ╰──── 2026-10-24T11:16:17.7115342Z  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-24T11:16:17.7115698Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7115727Z 2026-10-24T11:16:17.7115884Z ⚠ react(immutability): This value cannot be modified 2026-10-24T11:16:17.7116031Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:174:5] 2026-10-24T11:16:17.7116174Z 170 │ const expandedAngle = props.collapsedDirection === "right" ? 90 : 180; 2026-10-24T11:16:17.7116308Z 171 │ const rotation = useSharedValue(props.expanded ? expandedAngle : 0); 2026-10-24T11:16:17.7116386Z ·  ────┬─── 2026-10-24T11:16:17.7116520Z · ╰── `rotation` originates here 2026-10-24T11:16:17.7116573Z 172 │ 2026-10-24T11:16:17.7116648Z 173 │ useLayoutEffect(() => { 2026-10-24T11:16:17.7116788Z 174 │ rotation.value = withTiming(props.expanded ? expandedAngle : 0, { 2026-10-24T11:16:17.7116862Z ·  ────┬─── 2026-10-24T11:16:17.7116999Z · ╰── `rotation` cannot be modified 2026-10-24T11:16:17.7117097Z 175 │ duration: THREAD_DISCLOSURE_TRANSITION_MS, 2026-10-24T11:16:17.7117149Z ╰──── 2026-10-24T11:16:17.7117409Z  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-24T11:16:17.7117709Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:16:17.7117712Z 2026-10-24T11:16:17.7117909Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T11:16:17.7118065Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:1246:23] 2026-10-24T11:16:17.7118132Z 1245 │ { 2026-10-24T11:16:17.7120327Z ·  ────┬──── 2026-10-24T11:16:17.7120485Z · ╰── This is the containing effect 2026-10-24T11:16:17.7120659Z 215 │ const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null; 2026-10-24T11:16:17.7120724Z 216 │ if (inserted) { 2026-10-24T11:16:17.7120799Z 217 │ setSelection((current) => 2026-10-24T11:16:17.7120879Z ·  ──────┬───── 2026-10-24T11:16:17.7121052Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.7121221Z 218 │ current.start === inserted.start && current.end === inserted.end ? current : inserted, 2026-10-24T11:16:17.7121271Z ╰──── 2026-10-24T11:16:17.7121867Z  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-24T11:16:17.7122231Z  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-24T11:16:17.7122234Z 2026-10-24T11:16:17.7122488Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:16:17.7122652Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:298:7] 2026-10-24T11:16:17.7122729Z 286 │ }, [hasWorkspaceSnapshot]); 2026-10-24T11:16:17.7122795Z 287 │ useEffect(() => { 2026-10-24T11:16:17.7122866Z ·  ────┬──── 2026-10-24T11:16:17.7123003Z · ╰── This is the containing effect 2026-10-24T11:16:17.7123151Z 288 │ if (!environmentId || !projectCwd || !selectedProviderInstanceId) return; 2026-10-24T11:16:17.7123301Z 289 │ const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`; 2026-10-24T11:16:17.7123372Z 290 │ const now = Date.now(); 2026-10-24T11:16:17.7123487Z 291 │ const lastRequest = workspaceRefreshKeyRef.current; 2026-10-24T11:16:17.7123543Z 292 │ if ( 2026-10-24T11:16:17.7123620Z 293 │ lastRequest?.key === key && 2026-10-24T11:16:17.7123757Z 294 │ now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS 2026-10-24T11:16:17.7123814Z 295 │ ) 2026-10-24T11:16:17.7123873Z 296 │ return; 2026-10-24T11:16:17.7124045Z 297 │ if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) { 2026-10-24T11:16:17.7124138Z 298 │ setWorkspaceRefreshRetry(null); 2026-10-24T11:16:17.7124237Z ·  ────────────┬─────────── 2026-10-24T11:16:17.7124416Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.7124478Z 299 │ return; 2026-10-24T11:16:17.7124530Z ╰──── 2026-10-24T11:16:17.7125123Z  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-24T11:16:17.7125440Z  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-24T11:16:17.7125442Z 2026-10-24T11:16:17.7125690Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:16:17.7125902Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:328:5] 2026-10-24T11:16:17.7125957Z 327 │ }, [ 2026-10-24T11:16:17.7126020Z 328 │ draftMessage, 2026-10-24T11:16:17.7126098Z ·  ──────┬───── 2026-10-24T11:16:17.7126246Z · ╰── Unnecessary dependency `draftMessage` 2026-10-24T11:16:17.7126313Z 329 │ environmentId, 2026-10-24T11:16:17.7126367Z ╰──── 2026-10-24T11:16:17.7126659Z  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-24T11:16:17.7126971Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7126977Z 2026-10-24T11:16:17.7127233Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:16:17.7127393Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:40:5] 2026-10-24T11:16:17.7127504Z 37 │ const [initialized, setInitialized] = useState(false); 2026-10-24T11:16:17.7127574Z 38 │ useLayoutEffect(() => { 2026-10-24T11:16:17.7127652Z ·  ───────┬─────── 2026-10-24T11:16:17.7127788Z · ╰── This is the containing effect 2026-10-24T11:16:17.7127852Z 39 │ reset(); 2026-10-24T11:16:17.7127921Z 40 │ setInitialized(true); 2026-10-24T11:16:17.7128001Z ·  ───────┬────── 2026-10-24T11:16:17.7128179Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.7128241Z 41 │ }, [reset]); 2026-10-24T11:16:17.7128295Z ╰──── 2026-10-24T11:16:17.7128880Z  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-24T11:16:17.7129198Z  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-24T11:16:17.7129200Z 2026-10-24T11:16:17.7129499Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:16:17.7129682Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:93:5] 2026-10-24T11:16:17.7129735Z 88 │ 2026-10-24T11:16:17.7129800Z 89 │ useEffect(() => { 2026-10-24T11:16:17.7129871Z ·  ────┬──── 2026-10-24T11:16:17.7130002Z · ╰── This is the containing effect 2026-10-24T11:16:17.7130159Z 90 │ if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return; 2026-10-24T11:16:17.7130263Z 91 │ const branchName = initialProjectRef.branch; 2026-10-24T11:16:17.7130330Z 92 │ let active = true; 2026-10-24T11:16:17.7130424Z 93 │ setPendingCheckouts((count) => count + 1); 2026-10-24T11:16:17.7130512Z ·  ─────────┬───────── 2026-10-24T11:16:17.7130693Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.7130849Z 94 │ // Serialize replacements: ignoring a stale result cannot undo its Git mutation. 2026-10-24T11:16:17.7130899Z ╰──── 2026-10-24T11:16:17.7131485Z  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-24T11:16:17.7131802Z  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-24T11:16:17.7131804Z 2026-10-24T11:16:17.7132132Z ⚠ eslint(no-unused-vars): Variable 'revokeActiveMcpThread' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:16:17.7132263Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:218:7] 2026-10-24T11:16:17.7132315Z 217 │ 2026-10-24T11:16:17.7132465Z 218 │ const revokeActiveMcpThread = (threadId: ThreadId): Effect.Effect => 2026-10-24T11:16:17.7132557Z ·  ──────────┬────────── 2026-10-24T11:16:17.7132715Z · ╰── 'revokeActiveMcpThread' is declared here 2026-10-24T11:16:17.7132899Z 219 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeThread(threadId) : Effect.void; 2026-10-24T11:16:17.7132952Z ╰──── 2026-10-24T11:16:17.7133055Z  help: Consider removing this declaration. 2026-10-24T11:16:17.7133058Z 2026-10-24T11:16:17.7133368Z ⚠ eslint(no-unused-vars): Variable 'revokeAllActiveMcpCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:16:17.7133496Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:221:7] 2026-10-24T11:16:17.7133548Z 220 │ 2026-10-24T11:16:17.7133681Z 221 │ const revokeAllActiveMcpCredentials = (): Effect.Effect => 2026-10-24T11:16:17.7133797Z ·  ──────────────┬────────────── 2026-10-24T11:16:17.7133975Z · ╰── 'revokeAllActiveMcpCredentials' is declared here 2026-10-24T11:16:17.7134137Z 222 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void; 2026-10-24T11:16:17.7134189Z ╰──── 2026-10-24T11:16:17.7134293Z  help: Consider removing this declaration. 2026-10-24T11:16:17.7134295Z 2026-10-24T11:16:17.7134538Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T11:16:17.7134741Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:290:50] 2026-10-24T11:16:17.7134831Z 289 │ return ( 2026-10-24T11:16:17.7134965Z 290 │ 2026-10-24T11:16:17.7135087Z ·  ───────────── 2026-10-24T11:16:17.7135156Z 291 │ {props.children} 2026-10-24T11:16:17.7135208Z ╰──── 2026-10-24T11:16:17.7135430Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T11:16:17.7135569Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T11:16:17.7135571Z 2026-10-24T11:16:17.7135807Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T11:16:17.7135966Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:654:44] 2026-10-24T11:16:17.7136026Z 653 │ return ( 2026-10-24T11:16:17.7136148Z 654 │ 2026-10-24T11:16:17.7136264Z ·  ───────────── 2026-10-24T11:16:17.7136334Z 655 │ {props.children} 2026-10-24T11:16:17.7136386Z ╰──── 2026-10-24T11:16:17.7136603Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T11:16:17.7136736Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T11:16:17.7136739Z 2026-10-24T11:16:17.7136974Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T11:16:17.7137139Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1462:55] 2026-10-24T11:16:17.7137203Z 1461 │ return ( 2026-10-24T11:16:17.7137363Z 1462 │ 2026-10-24T11:16:17.7137498Z ·  ──────────────────── 2026-10-24T11:16:17.7137597Z 1463 │ { 2026-10-24T11:16:17.7138601Z ·  ────┬──── 2026-10-24T11:16:17.7138734Z · ╰── This is the containing effect 2026-10-24T11:16:17.7138804Z 57 │ setDecodedSize(null); 2026-10-24T11:16:17.7138881Z ·  ───────┬────── 2026-10-24T11:16:17.7139053Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.7139122Z 58 │ }, [props.sourceKey]); 2026-10-24T11:16:17.7139174Z ╰──── 2026-10-24T11:16:17.7139809Z  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-24T11:16:17.7140152Z  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-24T11:16:17.7140154Z 2026-10-24T11:16:17.7140407Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:16:17.7140558Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5] 2026-10-24T11:16:17.7140610Z 59 │ 2026-10-24T11:16:17.7140685Z 60 │ useEffect(() => { 2026-10-24T11:16:17.7140801Z ·  ────┬──── 2026-10-24T11:16:17.7140936Z · ╰── This is the containing effect 2026-10-24T11:16:17.7141006Z 61 │ setFailedUri(null); 2026-10-24T11:16:17.7141080Z ·  ──────┬───── 2026-10-24T11:16:17.7141248Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.7141315Z 62 │ }, [props.uri]); 2026-10-24T11:16:17.7141366Z ╰──── 2026-10-24T11:16:17.7141952Z  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-24T11:16:17.7142299Z  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-24T11:16:17.7142304Z 2026-10-24T11:16:17.7142518Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-24T11:16:17.7142668Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10] 2026-10-24T11:16:17.7142794Z 6 │ import { parse, SvgAst, type JsxAST } from "react-native-svg"; 2026-10-24T11:16:17.7142971Z 7 │ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native"; 2026-10-24T11:16:17.7143063Z ·  ────────┬──────── 2026-10-24T11:16:17.7143217Z · ╰── 'ActivityIndicator' is imported here 2026-10-24T11:16:17.7143268Z 8 │ 2026-10-24T11:16:17.7143318Z ╰──── 2026-10-24T11:16:17.7143416Z  help: Consider removing this import. 2026-10-24T11:16:17.7143419Z 2026-10-24T11:16:17.7143626Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:16:17.7143780Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7] 2026-10-24T11:16:17.7143846Z 57 │ setDecodedSize(null); 2026-10-24T11:16:17.7143913Z 58 │ }, [props.sourceKey]); 2026-10-24T11:16:17.7143996Z ·  ───────┬─────── 2026-10-24T11:16:17.7144154Z · ╰── Unnecessary dependency `props.sourceKey` 2026-10-24T11:16:17.7144206Z 59 │ 2026-10-24T11:16:17.7144259Z ╰──── 2026-10-24T11:16:17.7144550Z  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-24T11:16:17.7144926Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7144963Z 2026-10-24T11:16:17.7145163Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:16:17.7145314Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7] 2026-10-24T11:16:17.7145380Z 61 │ setFailedUri(null); 2026-10-24T11:16:17.7145443Z 62 │ }, [props.uri]); 2026-10-24T11:16:17.7145516Z ·  ────┬──── 2026-10-24T11:16:17.7145659Z · ╰── Unnecessary dependency `props.uri` 2026-10-24T11:16:17.7145711Z 63 │ 2026-10-24T11:16:17.7145764Z ╰──── 2026-10-24T11:16:17.7146056Z  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-24T11:16:17.7146365Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7146368Z 2026-10-24T11:16:17.7146622Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:16:17.7146784Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:279:5] 2026-10-24T11:16:17.7146904Z 277 │ const [snoozeWakeTick, bumpSnoozeWakeTick] = useState(0); 2026-10-24T11:16:17.7146972Z 278 │ useEffect(() => { 2026-10-24T11:16:17.7147045Z ·  ────┬──── 2026-10-24T11:16:17.7147180Z · ╰── This is the containing effect 2026-10-24T11:16:17.7147266Z 279 │ setNow(new Date().toISOString()); 2026-10-24T11:16:17.7147338Z ·  ───┬── 2026-10-24T11:16:17.7147511Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.7147647Z 280 │ const id = setInterval(() => setNow(new Date().toISOString()), 60_000); 2026-10-24T11:16:17.7147698Z ╰──── 2026-10-24T11:16:17.7148281Z  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-24T11:16:17.7148598Z  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-24T11:16:17.7148601Z 2026-10-24T11:16:17.7148829Z ⚠ eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used. 2026-10-24T11:16:17.7148989Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:13:8] 2026-10-24T11:16:17.7149057Z 12 │ threadSearchMatchKey, 2026-10-24T11:16:17.7149141Z 13 │ type EnvironmentThreadSearchMatch, 2026-10-24T11:16:17.7149251Z ·  ──────────────┬───────────── 2026-10-24T11:16:17.7149428Z · ╰── 'EnvironmentThreadSearchMatch' is imported here 2026-10-24T11:16:17.7149539Z 14 │ } from "@t3tools/client-runtime/state/thread-search"; 2026-10-24T11:16:17.7149590Z ╰──── 2026-10-24T11:16:17.7149689Z  help: Consider removing this import. 2026-10-24T11:16:17.7149691Z 2026-10-24T11:16:17.7149934Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:16:17.7150126Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:359:25] 2026-10-24T11:16:17.7150257Z 358 │ // range) the boundary string is identical and the chain would die. 2026-10-24T11:16:17.7150347Z 359 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-24T11:16:17.7150452Z ·  ───────┬────── 2026-10-24T11:16:17.7150621Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T11:16:17.7150734Z 360 │ const listItems = ((): readonly SidebarListItem[] => { 2026-10-24T11:16:17.7150788Z ╰──── 2026-10-24T11:16:17.7151077Z  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-24T11:16:17.7151390Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7151396Z 2026-10-24T11:16:17.7151564Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T11:16:17.7151724Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:350:53] 2026-10-24T11:16:17.7151810Z 349 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-24T11:16:17.7151965Z 350 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-24T11:16:17.7152122Z ·  ─────┬──── 2026-10-24T11:16:17.7152291Z · ╰── Cannot call impure function 2026-10-24T11:16:17.7152376Z 351 │ const id = setTimeout(() => { 2026-10-24T11:16:17.7152431Z ╰──── 2026-10-24T11:16:17.7152711Z  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-24T11:16:17.7153000Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T11:16:17.7153006Z 2026-10-24T11:16:17.7153159Z ⚠ react(immutability): This value cannot be modified 2026-10-24T11:16:17.7153315Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-24T11:16:17.7153368Z  86 │ 2026-10-24T11:16:17.7153462Z  87 │ const cardCoverage = props.cardCoverage; 2026-10-24T11:16:17.7153542Z ·  ──────┬───── 2026-10-24T11:16:17.7153725Z · ╰── `cardCoverage` originates here 2026-10-24T11:16:17.7153837Z  88 │ const barHeightRef = useRef(0); 2026-10-24T11:16:17.7153916Z  89 │ const cardHeightRef = useRef(0); 2026-10-24T11:16:17.7154002Z  90 │ const cardHeight = useSharedValue(0); 2026-10-24T11:16:17.7154092Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-24T11:16:17.7154160Z  92 │ if (!cardCoverage) { 2026-10-24T11:16:17.7154220Z  93 │ return; 2026-10-24T11:16:17.7154275Z  94 │ } 2026-10-24T11:16:17.7154425Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T11:16:17.7154511Z  96 │ if (coverage === cardCoverage.value) { 2026-10-24T11:16:17.7154569Z  97 │ return; 2026-10-24T11:16:17.7154624Z  98 │ } 2026-10-24T11:16:17.7154705Z  99 │ if (cardCoverage.value === 0) { 2026-10-24T11:16:17.7154792Z 100 │ cardCoverage.value = coverage; 2026-10-24T11:16:17.7154873Z ·  ──────┬───── 2026-10-24T11:16:17.7155016Z · ╰── `cardCoverage` cannot be modified 2026-10-24T11:16:17.7155076Z 101 │ return; 2026-10-24T11:16:17.7155129Z ╰──── 2026-10-24T11:16:17.7155419Z  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-24T11:16:17.7155719Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:16:17.7155722Z 2026-10-24T11:16:17.7155877Z ⚠ react(immutability): This value cannot be modified 2026-10-24T11:16:17.7156037Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7] 2026-10-24T11:16:17.7156118Z  89 │ const cardHeightRef = useRef(0); 2026-10-24T11:16:17.7156202Z  90 │ const cardHeight = useSharedValue(0); 2026-10-24T11:16:17.7156280Z ·  ─────┬──── 2026-10-24T11:16:17.7156418Z · ╰── `cardHeight` originates here 2026-10-24T11:16:17.7156509Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-24T11:16:17.7156575Z  92 │ if (!cardCoverage) { 2026-10-24T11:16:17.7156633Z  93 │ return; 2026-10-24T11:16:17.7156686Z  94 │ } 2026-10-24T11:16:17.7156834Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T11:16:17.7156919Z  96 │ if (coverage === cardCoverage.value) { 2026-10-24T11:16:17.7156977Z  97 │ return; 2026-10-24T11:16:17.7157031Z  98 │ } 2026-10-24T11:16:17.7157115Z  99 │ if (cardCoverage.value === 0) { 2026-10-24T11:16:17.7157201Z 100 │ cardCoverage.value = coverage; 2026-10-24T11:16:17.7157259Z 101 │ return; 2026-10-24T11:16:17.7157314Z 102 │ } 2026-10-24T11:16:17.7157413Z 103 │ cardCoverage.value = withTiming(coverage, { 2026-10-24T11:16:17.7157510Z 104 │ duration: USER_INPUT_TOGGLE_DURATION_MS, 2026-10-24T11:16:17.7157595Z 105 │ easing: Easing.out(Easing.cubic), 2026-10-24T11:16:17.7157651Z 106 │ }); 2026-10-24T11:16:17.7157716Z 107 │ }, [cardCoverage]); 2026-10-24T11:16:17.7157801Z 108 │ const handleBarLayout = useCallback( 2026-10-24T11:16:17.7157881Z 109 │ (event: LayoutChangeEvent) => { 2026-10-24T11:16:17.7158006Z 110 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T11:16:17.7158072Z 111 │ notifyCoverage(); 2026-10-24T11:16:17.7158131Z 112 │ }, 2026-10-24T11:16:17.7158246Z 113 │ [notifyCoverage], 2026-10-24T11:16:17.7158328Z 114 │ ); 2026-10-24T11:16:17.7158414Z 115 │ const handleCardLayout = useCallback( 2026-10-24T11:16:17.7158494Z 116 │ (event: LayoutChangeEvent) => { 2026-10-24T11:16:17.7158620Z 117 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T11:16:17.7158730Z 118 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-24T11:16:17.7158809Z ·  ─────┬──── 2026-10-24T11:16:17.7158949Z · ╰── `cardHeight` cannot be modified 2026-10-24T11:16:17.7159015Z 119 │ notifyCoverage(); 2026-10-24T11:16:17.7159067Z ╰──── 2026-10-24T11:16:17.7159334Z  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-24T11:16:17.7159640Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:16:17.7159645Z 2026-10-24T11:16:17.7159844Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T11:16:17.7160000Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-24T11:16:17.7160085Z  90 │ const cardHeight = useSharedValue(0); 2026-10-24T11:16:17.7160176Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-24T11:16:17.7160283Z ·  ───┬─── 2026-10-24T11:16:17.7160521Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-24T11:16:17.7160591Z  92 │ if (!cardCoverage) { 2026-10-24T11:16:17.7160655Z  93 │ return; 2026-10-24T11:16:17.7160710Z  94 │ } 2026-10-24T11:16:17.7160858Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T11:16:17.7160942Z  96 │ if (coverage === cardCoverage.value) { 2026-10-24T11:16:17.7161001Z  97 │ return; 2026-10-24T11:16:17.7161055Z  98 │ } 2026-10-24T11:16:17.7161134Z  99 │ if (cardCoverage.value === 0) { 2026-10-24T11:16:17.7161213Z 100 │ cardCoverage.value = coverage; 2026-10-24T11:16:17.7161291Z ·  ──────┬───── 2026-10-24T11:16:17.7161428Z · ╰── This modifies `cardCoverage` 2026-10-24T11:16:17.7161485Z 101 │ return; 2026-10-24T11:16:17.7161538Z ╰──── 2026-10-24T11:16:17.7161882Z  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-24T11:16:17.7162218Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:16:17.7162221Z 2026-10-24T11:16:17.7162420Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T11:16:17.7162573Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-24T11:16:17.7162654Z  99 │ if (cardCoverage.value === 0) { 2026-10-24T11:16:17.7162735Z 100 │ cardCoverage.value = coverage; 2026-10-24T11:16:17.7162814Z ·  ──────┬───── 2026-10-24T11:16:17.7162949Z · ╰── This modifies `cardCoverage` 2026-10-24T11:16:17.7163068Z 101 │ return; 2026-10-24T11:16:17.7163148Z 102 │ } 2026-10-24T11:16:17.7163248Z 103 │ cardCoverage.value = withTiming(coverage, { 2026-10-24T11:16:17.7163343Z 104 │ duration: USER_INPUT_TOGGLE_DURATION_MS, 2026-10-24T11:16:17.7163427Z 105 │ easing: Easing.out(Easing.cubic), 2026-10-24T11:16:17.7163482Z 106 │ }); 2026-10-24T11:16:17.7163548Z 107 │ }, [cardCoverage]); 2026-10-24T11:16:17.7163631Z 108 │ const handleBarLayout = useCallback( 2026-10-24T11:16:17.7163711Z 109 │ (event: LayoutChangeEvent) => { 2026-10-24T11:16:17.7163822Z ·  ───────────────┬─────────────── 2026-10-24T11:16:17.7164047Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-24T11:16:17.7164170Z 110 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T11:16:17.7164226Z ╰──── 2026-10-24T11:16:17.7164560Z  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-24T11:16:17.7164860Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:16:17.7164863Z 2026-10-24T11:16:17.7165061Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T11:16:17.7165218Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7] 2026-10-24T11:16:17.7165304Z 115 │ const handleCardLayout = useCallback( 2026-10-24T11:16:17.7165385Z 116 │ (event: LayoutChangeEvent) => { 2026-10-24T11:16:17.7165495Z ·  ───────────────┬─────────────── 2026-10-24T11:16:17.7165718Z · ╰── This function may (indirectly) reassign or modify `cardHeight` after render 2026-10-24T11:16:17.7165845Z 117 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T11:16:17.7165959Z 118 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-24T11:16:17.7166036Z ·  ─────┬──── 2026-10-24T11:16:17.7166167Z · ╰── This modifies `cardHeight` 2026-10-24T11:16:17.7166235Z 119 │ notifyCoverage(); 2026-10-24T11:16:17.7166286Z ╰──── 2026-10-24T11:16:17.7166616Z  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-24T11:16:17.7166917Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:16:17.7166922Z 2026-10-24T11:16:17.7167120Z ⚠ eslint(no-unsafe-optional-chaining): Unsafe usage of optional chaining 2026-10-24T11:16:17.7167287Z ╭─[apps/server/src/orchestration-v2/ThreadLaunchService.test.ts:1783:8] 2026-10-24T11:16:17.7167353Z 1782 │ assert.equal( 2026-10-24T11:16:17.7167498Z 1783 │ (stored.context?.records[0] as { attachmentId: string }).attachmentId, 2026-10-24T11:16:17.7167606Z ·  ────────────────────────── 2026-10-24T11:16:17.7167687Z 1784 │ stored.attachments[0]?.id, 2026-10-24T11:16:17.7167742Z ╰──── 2026-10-24T11:16:17.7167910Z  help: If this short-circuits with 'undefined' the evaluation will throw TypeError 2026-10-24T11:16:17.7167913Z 2026-10-24T11:16:17.7168114Z ⚠ react(immutability): This value cannot be modified 2026-10-24T11:16:17.7168305Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:111:5] 2026-10-24T11:16:17.7168359Z 107 │ ); 2026-10-24T11:16:17.7168511Z 108 │ const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0); 2026-10-24T11:16:17.7168600Z ·  ─────────┬──────── 2026-10-24T11:16:17.7168754Z · ╰── `separationProgress` originates here 2026-10-24T11:16:17.7168808Z 109 │ 2026-10-24T11:16:17.7168873Z 110 │ useEffect(() => { 2026-10-24T11:16:17.7169046Z 111 │ separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING); 2026-10-24T11:16:17.7169132Z ·  ─────────┬──────── 2026-10-24T11:16:17.7169293Z · ╰── `separationProgress` cannot be modified 2026-10-24T11:16:17.7169404Z 112 │ }, [props.showScrollToEnd, separationProgress]); 2026-10-24T11:16:17.7169457Z ╰──── 2026-10-24T11:16:17.7169721Z  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-24T11:16:17.7170021Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:16:17.7170023Z 2026-10-24T11:16:17.7170179Z ⚠ react(immutability): This value cannot be modified 2026-10-24T11:16:17.7170339Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-24T11:16:17.7170452Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-24T11:16:17.7170575Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-24T11:16:17.7170657Z ·  ──────┬───── 2026-10-24T11:16:17.7170794Z · ╰── `capsuleWidth` originates here 2026-10-24T11:16:17.7170908Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T11:16:17.7171024Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T11:16:17.7171128Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T11:16:17.7171222Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T11:16:17.7171286Z 134 │ return; 2026-10-24T11:16:17.7171341Z 135 │ } 2026-10-24T11:16:17.7171446Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T11:16:17.7171531Z 137 │ measuredWidthRef.current = width; 2026-10-24T11:16:17.7171679Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T11:16:17.7171760Z ·  ──────┬───── 2026-10-24T11:16:17.7171902Z · ╰── `capsuleWidth` cannot be modified 2026-10-24T11:16:17.7171956Z 139 │ }; 2026-10-24T11:16:17.7172010Z ╰──── 2026-10-24T11:16:17.7172310Z  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-24T11:16:17.7172611Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:16:17.7172613Z 2026-10-24T11:16:17.7172767Z ⚠ react(immutability): This value cannot be modified 2026-10-24T11:16:17.7172977Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-24T11:16:17.7173115Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-24T11:16:17.7173231Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-24T11:16:17.7173310Z ·  ──────┬───── 2026-10-24T11:16:17.7173448Z · ╰── `capsuleWidth` originates here 2026-10-24T11:16:17.7173559Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T11:16:17.7173674Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T11:16:17.7173776Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T11:16:17.7173872Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T11:16:17.7173933Z 134 │ return; 2026-10-24T11:16:17.7173986Z 135 │ } 2026-10-24T11:16:17.7174094Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T11:16:17.7174183Z 137 │ measuredWidthRef.current = width; 2026-10-24T11:16:17.7174324Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T11:16:17.7174379Z 139 │ }; 2026-10-24T11:16:17.7174468Z 140 │ const hasStatus = props.status !== null; 2026-10-24T11:16:17.7174601Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-24T11:16:17.7174667Z 142 │ useEffect(() => { 2026-10-24T11:16:17.7174734Z 143 │ if (!hasStatus) { 2026-10-24T11:16:17.7174819Z 144 │ measuredWidthRef.current = null; 2026-10-24T11:16:17.7174900Z 145 │ capsuleWidth.value = null; 2026-10-24T11:16:17.7174977Z ·  ──────┬───── 2026-10-24T11:16:17.7175120Z · ╰── `capsuleWidth` cannot be modified 2026-10-24T11:16:17.7175179Z 146 │ } 2026-10-24T11:16:17.7175234Z ╰──── 2026-10-24T11:16:17.7175491Z  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-24T11:16:17.7175791Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:16:17.7175793Z 2026-10-24T11:16:17.7175992Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T11:16:17.7176153Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-24T11:16:17.7176285Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-24T11:16:17.7176352Z 142 │ useEffect(() => { 2026-10-24T11:16:17.7176429Z ·  ───┬─── 2026-10-24T11:16:17.7176698Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-24T11:16:17.7176799Z 143 │ if (!hasStatus) { 2026-10-24T11:16:17.7176886Z 144 │ measuredWidthRef.current = null; 2026-10-24T11:16:17.7176966Z 145 │ capsuleWidth.value = null; 2026-10-24T11:16:17.7177041Z ·  ──────┬───── 2026-10-24T11:16:17.7177181Z · ╰── This modifies `capsuleWidth` 2026-10-24T11:16:17.7177236Z 146 │ } 2026-10-24T11:16:17.7177286Z ╰──── 2026-10-24T11:16:17.7177620Z  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-24T11:16:17.7177925Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:16:17.7177931Z 2026-10-24T11:16:17.7178130Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T11:16:17.7178298Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-24T11:16:17.7178409Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T11:16:17.7178527Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T11:16:17.7178655Z ·  ───────────────┬─────────────── 2026-10-24T11:16:17.7178895Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-24T11:16:17.7179004Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T11:16:17.7179105Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T11:16:17.7179166Z 134 │ return; 2026-10-24T11:16:17.7179221Z 135 │ } 2026-10-24T11:16:17.7179324Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T11:16:17.7179410Z 137 │ measuredWidthRef.current = width; 2026-10-24T11:16:17.7179553Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T11:16:17.7179632Z ·  ──────┬───── 2026-10-24T11:16:17.7179766Z · ╰── This modifies `capsuleWidth` 2026-10-24T11:16:17.7179820Z 139 │ }; 2026-10-24T11:16:17.7179873Z ╰──── 2026-10-24T11:16:17.7180212Z  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-24T11:16:17.7180514Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:16:17.7180519Z 2026-10-24T11:16:17.7180744Z ⚠ eslint(no-empty-pattern): Empty array binding pattern 2026-10-24T11:16:17.7180903Z ╭─[apps/server/src/pullRequest/PullRequestService.test.ts:1526:12] 2026-10-24T11:16:17.7180959Z 1525 │ 2026-10-24T11:16:17.7181025Z 1526 │ for (const [] of [ 2026-10-24T11:16:17.7181097Z ·  ── 2026-10-24T11:16:17.7181170Z 1527 │ ["github", "github.com"], 2026-10-24T11:16:17.7181223Z ╰──── 2026-10-24T11:16:17.7181559Z  help: Passing non-iterable values (null, undefined, numbers, booleans, etc.) will result in a runtime error because these values are not iterable. 2026-10-24T11:16:17.7181598Z 2026-10-24T11:16:17.7181865Z ⚠ eslint(no-unused-vars): Variable 'layerDaemon' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:16:17.7182003Z ╭─[apps/server/src/orchestration-v2/EffectWorker.ts:914:7] 2026-10-24T11:16:17.7182059Z 913 │ 2026-10-24T11:16:17.7182279Z 914 │ const layerDaemon: Layer.Layer = Layer.effectDiscard( 2026-10-24T11:16:17.7182356Z ·  ─────┬───── 2026-10-24T11:16:17.7182493Z · ╰── 'layerDaemon' is declared here 2026-10-24T11:16:17.7182578Z 915 │ runDaemon.pipe(Effect.forkScoped), 2026-10-24T11:16:17.7182630Z ╰──── 2026-10-24T11:16:17.7182734Z  help: Consider removing this declaration. 2026-10-24T11:16:17.7182737Z 2026-10-24T11:16:17.7182911Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T11:16:17.7183037Z ╭─[apps/server/src/processRunner.test.ts:266:14] 2026-10-24T11:16:17.7183090Z 265 │ 2026-10-24T11:16:17.7183196Z 266 │ for (const {} of ["timeout", "success"] as const) { 2026-10-24T11:16:17.7183268Z ·  ── 2026-10-24T11:16:17.7183327Z 267 │ } 2026-10-24T11:16:17.7183378Z ╰──── 2026-10-24T11:16:17.7183609Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T11:16:17.7183611Z 2026-10-24T11:16:17.7183828Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T11:16:17.7183999Z ╭─[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:249:7] 2026-10-24T11:16:17.7184084Z 248 │ mountedRef.current = false; 2026-10-24T11:16:17.7184161Z 249 │ flow.setBranchQuery(""); 2026-10-24T11:16:17.7184228Z ·  ──┬─ 2026-10-24T11:16:17.7184355Z · ╰── Missing dependency `flow` 2026-10-24T11:16:17.7184412Z 250 │ }; 2026-10-24T11:16:17.7184482Z 251 │ }, [flow.setBranchQuery]); 2026-10-24T11:16:17.7184571Z ·  ─────────┬───────── 2026-10-24T11:16:17.7184778Z · ╰── Overly precise dependency `flow.setBranchQuery`, use `flow` instead 2026-10-24T11:16:17.7184832Z 252 │ 2026-10-24T11:16:17.7184882Z ╰──── 2026-10-24T11:16:17.7185304Z  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-24T11:16:17.7185617Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7185620Z 2026-10-24T11:16:17.7185843Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T11:16:17.7185968Z ╭─[apps/server/src/terminal/Manager.test.ts:731:31] 2026-10-24T11:16:17.7186024Z 730 │ ); 2026-10-24T11:16:17.7186198Z 731 │ const snapshot = events.filter((event) => event.type === "snapshot").at(-1)?.snapshot; 2026-10-24T11:16:17.7186298Z ·  ────── 2026-10-24T11:16:17.7186415Z 732 │ expect(snapshot?.history).toBe("aa😀\rEND"); 2026-10-24T11:16:17.7186466Z ╰──── 2026-10-24T11:16:17.7186690Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T11:16:17.7186721Z 2026-10-24T11:16:17.7187190Z ⚠ 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-24T11:16:17.7187373Z ╭─[apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts:223:5] 2026-10-24T11:16:17.7187445Z 222 │ let idlePasses = 0; 2026-10-24T11:16:17.7187593Z 223 │ ╭─▶ for (;;) { 2026-10-24T11:16:17.7187734Z 224 │ │ yield* Effect.promise(() => Promise.resolve()); 2026-10-24T11:16:17.7187885Z 225 │ │ const pending = backgroundRuntime.pending.shift(); 2026-10-24T11:16:17.7187984Z 226 │ │ if (!pending) { 2026-10-24T11:16:17.7188076Z 227 │ │ idlePasses++; 2026-10-24T11:16:17.7188183Z 228 │ │ if (idlePasses >= 3) { 2026-10-24T11:16:17.7188269Z 229 │ │ return; 2026-10-24T11:16:17.7188348Z 230 │ │ } 2026-10-24T11:16:17.7188434Z 231 │ │ continue; 2026-10-24T11:16:17.7188510Z 232 │ │ } 2026-10-24T11:16:17.7188604Z 233 │ │ idlePasses = 0; 2026-10-24T11:16:17.7188720Z 234 │ │ const exit = yield* Effect.exit( 2026-10-24T11:16:17.7188933Z 235 │ │ pending.operation as Effect.Effect, 2026-10-24T11:16:17.7189017Z 236 │ │ ); 2026-10-24T11:16:17.7189128Z 237 │ │ yield* Effect.sync(() => { 2026-10-24T11:16:17.7189232Z 238 │ │ pending.resolve(exit); 2026-10-24T11:16:17.7189309Z 239 │ │ }); 2026-10-24T11:16:17.7189441Z 240 │ ╰─▶ } 2026-10-24T11:16:17.7189500Z 241 │ }, 2026-10-24T11:16:17.7189551Z ╰──── 2026-10-24T11:16:17.7189555Z 2026-10-24T11:16:17.7189784Z ⚠ eslint(no-unused-vars): Function 'resolveThreadWorkspaceCwd' is declared but never used. 2026-10-24T11:16:17.7189908Z ╭─[apps/server/src/checkpointing/Utils.ts:12:10] 2026-10-24T11:16:17.7189962Z 11 │ 2026-10-24T11:16:17.7190059Z 12 │ function resolveThreadWorkspaceCwd(input: { 2026-10-24T11:16:17.7190168Z ·  ────────────┬──────────── 2026-10-24T11:16:17.7190345Z · ╰── 'resolveThreadWorkspaceCwd' is declared here 2026-10-24T11:16:17.7190413Z 13 │ readonly thread: { 2026-10-24T11:16:17.7190467Z ╰──── 2026-10-24T11:16:17.7190571Z  help: Consider removing this declaration. 2026-10-24T11:16:17.7190574Z 2026-10-24T11:16:17.7190760Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T11:16:17.7190876Z ╭─[apps/mobile/src/lib/useHoverGesture.ts:8:15] 2026-10-24T11:16:17.7190934Z 7 │ () => 2026-10-24T11:16:17.7191000Z 8 │ Gesture.Hover() 2026-10-24T11:16:17.7191078Z ·  ──┬── 2026-10-24T11:16:17.7191218Z · ╰── `Hover` may be a component 2026-10-24T11:16:17.7191338Z 9 │ .manualActivation(true) 2026-10-24T11:16:17.7191417Z ╰──── 2026-10-24T11:16:17.7191694Z  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-24T11:16:17.7192150Z  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-24T11:16:17.7192153Z 2026-10-24T11:16:17.7192364Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T11:16:17.7192523Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:100:85] 2026-10-24T11:16:17.7192624Z  99 │ const startEditor = startScheduledTaskEditor; 2026-10-24T11:16:17.7192811Z 100 │ const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]); 2026-10-24T11:16:17.7192960Z ·  ─────┬───── 2026-10-24T11:16:17.7193163Z · ╰── Unnecessary dependency `startEditor` 2026-10-24T11:16:17.7193242Z 101 │ const readEditor = useCallback( 2026-10-24T11:16:17.7193295Z ╰──── 2026-10-24T11:16:17.7193608Z  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-24T11:16:17.7193920Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7193925Z 2026-10-24T11:16:17.7194104Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T11:16:17.7194264Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:121:7] 2026-10-24T11:16:17.7194329Z 120 │ setEditor, 2026-10-24T11:16:17.7194395Z 121 │ startEditor, 2026-10-24T11:16:17.7194472Z ·  ─────┬───── 2026-10-24T11:16:17.7194621Z · ╰── Unnecessary dependency `startEditor` 2026-10-24T11:16:17.7194685Z 122 │ hasChanges, 2026-10-24T11:16:17.7194735Z ╰──── 2026-10-24T11:16:17.7195045Z  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-24T11:16:17.7195357Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7195363Z 2026-10-24T11:16:17.7195529Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T11:16:17.7195721Z ╭─[packages/provider-opencode/src/server/OpenCodeRuntime.environment.test.ts:53:14] 2026-10-24T11:16:17.7195772Z 52 │ 2026-10-24T11:16:17.7195836Z 53 │ for (const {} of [ 2026-10-24T11:16:17.7195910Z ·  ── 2026-10-24T11:16:17.7195976Z 54 │ { healthy: true }, 2026-10-24T11:16:17.7196029Z ╰──── 2026-10-24T11:16:17.7196254Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T11:16:17.7196257Z 2026-10-24T11:16:17.7196525Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T11:16:17.7196678Z ╭─[apps/mobile/src/lib/markdownDocument.ts:259:28] 2026-10-24T11:16:17.7196781Z 258 │ visit(parser.parse(markdown), false, false); 2026-10-24T11:16:17.7196866Z 259 │ for (const edit of edits.reverse()) 2026-10-24T11:16:17.7196964Z ·  ─────── 2026-10-24T11:16:17.7197129Z 260 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-24T11:16:17.7197183Z ╰──── 2026-10-24T11:16:17.7197442Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T11:16:17.7197445Z 2026-10-24T11:16:17.7197657Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T11:16:17.7197781Z ╭─[apps/mobile/src/lib/markdownDocument.ts:290:28] 2026-10-24T11:16:17.7197862Z 289 │ visit(parser.parse(markdown)); 2026-10-24T11:16:17.7197944Z 290 │ for (const edit of edits.reverse()) 2026-10-24T11:16:17.7198039Z ·  ─────── 2026-10-24T11:16:17.7198200Z 291 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-24T11:16:17.7198251Z ╰──── 2026-10-24T11:16:17.7198505Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T11:16:17.7198510Z 2026-10-24T11:16:17.7198713Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T11:16:17.7198839Z ╭─[apps/mobile/src/lib/markdownDocument.ts:344:38] 2026-10-24T11:16:17.7198921Z 343 │ visit(parser.parse(markdown)); 2026-10-24T11:16:17.7199026Z 344 │ for (const lineStart of lineStarts.reverse()) { 2026-10-24T11:16:17.7199127Z ·  ─────── 2026-10-24T11:16:17.7199290Z 345 │ // The header row may be a lazy line without its container markers (`>` or list indent), 2026-10-24T11:16:17.7199341Z ╰──── 2026-10-24T11:16:17.7199594Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T11:16:17.7199596Z 2026-10-24T11:16:17.7199848Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:16:17.7199991Z ╭─[packages/provider-opencode/src/server/adapter.ts:3755:7] 2026-10-24T11:16:17.7200099Z 3754 │ 2026-10-24T11:16:17.7200328Z 3755 │ const layer: Layer.Layer = 2026-10-24T11:16:17.7200399Z ·  ──┬── 2026-10-24T11:16:17.7200529Z · ╰── 'layer' is declared here 2026-10-24T11:16:17.7200594Z 3756 │ Layer.effect( 2026-10-24T11:16:17.7200646Z ╰──── 2026-10-24T11:16:17.7200748Z  help: Consider removing this declaration. 2026-10-24T11:16:17.7200750Z 2026-10-24T11:16:17.7200956Z ⚠ eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used. 2026-10-24T11:16:17.7201061Z ╭─[infra/relay/src/http/Api.ts:69:13] 2026-10-24T11:16:17.7201203Z 68 │ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts"; 2026-10-24T11:16:17.7201322Z 69 │ import * as HookForwarder from "../hooks/HookForwarder.ts"; 2026-10-24T11:16:17.7201412Z ·  ──────┬────── 2026-10-24T11:16:17.7201565Z · ╰── 'HookForwarder' is imported here 2026-10-24T11:16:17.7201670Z 70 │ import * as HeldHooks from "../hooks/HeldHooks.ts"; 2026-10-24T11:16:17.7201720Z ╰──── 2026-10-24T11:16:17.7201819Z  help: Consider removing this import. 2026-10-24T11:16:17.7201821Z 2026-10-24T11:16:17.7201986Z ⚠ eslint(no-control-regex): Unexpected control character 2026-10-24T11:16:17.7202220Z ╭─[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46] 2026-10-24T11:16:17.7202362Z 219 │ 2026-10-24T11:16:17.7202504Z 220 │ {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")} 2026-10-24T11:16:17.7202615Z ·  ──┬─ 2026-10-24T11:16:17.7202783Z · ╰── 'U+001B' is a control character. 2026-10-24T11:16:17.7202847Z 221 │ 2026-10-24T11:16:17.7202899Z ╰──── 2026-10-24T11:16:17.7203129Z  help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression. 2026-10-24T11:16:17.7203132Z 2026-10-24T11:16:17.7203356Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T11:16:17.7203500Z ╭─[packages/client-runtime/src/operations/projects.ts:228:51] 2026-10-24T11:16:17.7203562Z 227 │ ): string { 2026-10-24T11:16:17.7203720Z 228 │ const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? ""; 2026-10-24T11:16:17.7203836Z ·  ────── 2026-10-24T11:16:17.7203966Z 229 │ return target.owner ? `${target.owner}/${folderName}` : folderName; 2026-10-24T11:16:17.7204015Z ╰──── 2026-10-24T11:16:17.7204184Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T11:16:17.7204187Z 2026-10-24T11:16:17.7204419Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-24T11:16:17.7204556Z ╭─[apps/web/src/components/chat/useComposerSend.ts:985:13] 2026-10-24T11:16:17.7204679Z 984 │ const changedBeforeDecline = draftChangedSinceSend(); 2026-10-24T11:16:17.7204975Z 985 │ ╭─▶ const pendingIdsBeforeDecline = pendingApprovalsRef.current.map( 2026-10-24T11:16:17.7205126Z 986 │ │ (approval) => approval.requestId, 2026-10-24T11:16:17.7205261Z 987 │ ╰─▶ ); 2026-10-24T11:16:17.7205399Z 988 │ const approvalResponding = approvalsToDecline.some((approval) => 2026-10-24T11:16:17.7205450Z ╰──── 2026-10-24T11:16:17.7205527Z  help: Switch to `Set` 2026-10-24T11:16:17.7205530Z 2026-10-24T11:16:17.7205730Z ⚠ eslint(no-unused-vars): Identifier 'Duration' is imported but never used. 2026-10-24T11:16:17.7205865Z ╭─[packages/provider-pi/src/server/adapter.test.ts:24:13] 2026-10-24T11:16:17.7205960Z 23 │ import * as Deferred from "effect/Deferred"; 2026-10-24T11:16:17.7206053Z 24 │ import * as Duration from "effect/Duration"; 2026-10-24T11:16:17.7206141Z ·  ────┬─── 2026-10-24T11:16:17.7206287Z · ╰── 'Duration' is imported here 2026-10-24T11:16:17.7206373Z 25 │ import * as Effect from "effect/Effect"; 2026-10-24T11:16:17.7206431Z ╰──── 2026-10-24T11:16:17.7206531Z  help: Consider removing this import. 2026-10-24T11:16:17.7206534Z 2026-10-24T11:16:17.7206794Z ⚠ eslint(no-unused-vars): Function 'promptResponseHasMissingXAiStopReason' is declared but never used. 2026-10-24T11:16:17.7206945Z ╭─[packages/provider-grok/src/server/xaiAcpExtension.ts:1620:10] 2026-10-24T11:16:17.7207003Z 1619 │ 2026-10-24T11:16:17.7207214Z 1620 │ function promptResponseHasMissingXAiStopReason(response: EffectAcpSchema.PromptResponse): boolean { 2026-10-24T11:16:17.7207341Z ·  ──────────────────┬────────────────── 2026-10-24T11:16:17.7207547Z · ╰── 'promptResponseHasMissingXAiStopReason' is declared here 2026-10-24T11:16:17.7207633Z 1621 │ const meta = response._meta; 2026-10-24T11:16:17.7207691Z ╰──── 2026-10-24T11:16:17.7207798Z  help: Consider removing this declaration. 2026-10-24T11:16:17.7207801Z 2026-10-24T11:16:17.7208056Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:16:17.7208191Z ╭─[packages/provider-grok/src/server/adapter.ts:408:7] 2026-10-24T11:16:17.7208248Z 407 │ 2026-10-24T11:16:17.7208323Z 408 │ const layer: Layer.Layer< 2026-10-24T11:16:17.7208392Z ·  ──┬── 2026-10-24T11:16:17.7208524Z · ╰── 'layer' is declared here 2026-10-24T11:16:17.7208624Z 409 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T11:16:17.7208684Z ╰──── 2026-10-24T11:16:17.7208785Z  help: Consider removing this declaration. 2026-10-24T11:16:17.7208787Z 2026-10-24T11:16:17.7209042Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:16:17.7209175Z ╭─[packages/provider-pi/src/server/adapter.ts:3405:7] 2026-10-24T11:16:17.7209234Z 3404 │ 2026-10-24T11:16:17.7209424Z 3405 │ const layer: Layer.Layer = 2026-10-24T11:16:17.7209499Z ·  ──┬── 2026-10-24T11:16:17.7209630Z · ╰── 'layer' is declared here 2026-10-24T11:16:17.7209699Z 3406 │ Layer.effect( 2026-10-24T11:16:17.7209753Z ╰──── 2026-10-24T11:16:17.7209908Z  help: Consider removing this declaration. 2026-10-24T11:16:17.7209939Z 2026-10-24T11:16:17.7210218Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-24T11:16:17.7210349Z ╭─[packages/provider-cursor/src/server/auth.ts:249:20] 2026-10-24T11:16:17.7210411Z 248 │ }, 2026-10-24T11:16:17.7210495Z 249 │ (effect, flow, stopSessions) => 2026-10-24T11:16:17.7210593Z ·  ──────┬───── 2026-10-24T11:16:17.7210747Z · ╰── 'stopSessions' is declared here 2026-10-24T11:16:17.7210817Z 250 │ effect.pipe( 2026-10-24T11:16:17.7210869Z ╰──── 2026-10-24T11:16:17.7210976Z  help: Consider removing this parameter. 2026-10-24T11:16:17.7210984Z 2026-10-24T11:16:17.7211284Z ⚠ eslint(no-unused-vars): Variable 'layerFromProviderAdapter' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:16:17.7211448Z ╭─[apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts:346:7] 2026-10-24T11:16:17.7211502Z 345 │ 2026-10-24T11:16:17.7211607Z 346 │ const layerFromProviderAdapter: Layer.Layer< 2026-10-24T11:16:17.7211704Z ·  ────────────┬─────────── 2026-10-24T11:16:17.7211911Z · ╰── 'layerFromProviderAdapter' is declared here 2026-10-24T11:16:17.7212005Z 347 │ ProviderAdapterRegistryV2, 2026-10-24T11:16:17.7212196Z ╰──── 2026-10-24T11:16:17.7212336Z  help: Consider removing this declaration. 2026-10-24T11:16:17.7212339Z 2026-10-24T11:16:17.7212556Z ⚠ eslint(no-unused-vars): Type 'EnvironmentId' is imported but never used. 2026-10-24T11:16:17.7212732Z ╭─[packages/client-runtime/src/state/sharedSettings.ts:2:3] 2026-10-24T11:16:17.7212819Z 1 │ import type { 2026-10-24T11:16:17.7213021Z 2 │ EnvironmentId, 2026-10-24T11:16:17.7213112Z ·  ──────┬────── 2026-10-24T11:16:17.7213286Z · ╰── 'EnvironmentId' is imported here 2026-10-24T11:16:17.7213402Z 3 │ ExecutionEnvironmentCapabilities, 2026-10-24T11:16:17.7213487Z ╰──── 2026-10-24T11:16:17.7213607Z  help: Consider removing this import. 2026-10-24T11:16:17.7213628Z 2026-10-24T11:16:17.7214116Z ⚠ 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-24T11:16:17.7214297Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:169:7] 2026-10-24T11:16:17.7214383Z 168 │ }); 2026-10-24T11:16:17.7214636Z 169 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T11:16:17.7214844Z 170 │ │ if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break; 2026-10-24T11:16:17.7214988Z 171 │ │ yield* Effect.yieldNow; 2026-10-24T11:16:17.7215152Z 172 │ ╰─▶ } 2026-10-24T11:16:17.7215240Z 173 │ 2026-10-24T11:16:17.7215315Z ╰──── 2026-10-24T11:16:17.7215338Z 2026-10-24T11:16:17.7215866Z ⚠ 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-24T11:16:17.7216152Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:178:7] 2026-10-24T11:16:17.7216286Z 177 │ yield* Deferred.succeed(releaseSave, undefined); 2026-10-24T11:16:17.7216538Z 178 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T11:16:17.7216687Z 179 │ │ if ((yield* Ref.get(saved)).length > 0) break; 2026-10-24T11:16:17.7216824Z 180 │ │ yield* Effect.yieldNow; 2026-10-24T11:16:17.7216987Z 181 │ ╰─▶ } 2026-10-24T11:16:17.7217078Z 182 │ 2026-10-24T11:16:17.7217151Z ╰──── 2026-10-24T11:16:17.7217177Z 2026-10-24T11:16:17.7217649Z ⚠ 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-24T11:16:17.7217825Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7] 2026-10-24T11:16:17.7217977Z 306 │ yield* Deferred.succeed(releaseUnenrichedSave, undefined); 2026-10-24T11:16:17.7218222Z 307 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T11:16:17.7218359Z 308 │ │ const values = yield* Ref.get(saved); 2026-10-24T11:16:17.7218583Z 309 │ │ if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) { 2026-10-24T11:16:17.7218709Z 310 │ │ break; 2026-10-24T11:16:17.7218822Z 311 │ │ } 2026-10-24T11:16:17.7218947Z 312 │ │ yield* Effect.yieldNow; 2026-10-24T11:16:17.7219109Z 313 │ ╰─▶ } 2026-10-24T11:16:17.7219273Z 314 │ 2026-10-24T11:16:17.7219353Z ╰──── 2026-10-24T11:16:17.7219356Z 2026-10-24T11:16:17.7219689Z ⚠ eslint(no-unused-vars): Variable 'legacyCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:16:17.7219860Z ╭─[packages/provider-cursor/src/server/credentialStore.test.ts:15:7] 2026-10-24T11:16:17.7219944Z 14 │ 2026-10-24T11:16:17.7220048Z 15 │ const legacyCredentials = { 2026-10-24T11:16:17.7220166Z ·  ────────┬──────── 2026-10-24T11:16:17.7220344Z · ╰── 'legacyCredentials' is declared here 2026-10-24T11:16:17.7220444Z 16 │ version: 1 as const, 2026-10-24T11:16:17.7220531Z ╰──── 2026-10-24T11:16:17.7220716Z  help: Consider removing this declaration. 2026-10-24T11:16:17.7220718Z 2026-10-24T11:16:17.7221163Z ⚠ 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-24T11:16:17.7221348Z ╭─[apps/server/src/provider/acp/AntigravityProtocol.ts:263:20] 2026-10-24T11:16:17.7221462Z 262 │ ...(update._meta !== undefined 2026-10-24T11:16:17.7221661Z 263 │ ? { _meta: Schema.is(Schema.Record(Schema.String, Schema.Json))(meta) ? meta : null } 2026-10-24T11:16:17.7221851Z ·  ───────── 2026-10-24T11:16:17.7221975Z 264 │ : {}), 2026-10-24T11:16:17.7222168Z ╰──── 2026-10-24T11:16:17.7222170Z 2026-10-24T11:16:17.7222382Z ⚠ eslint(no-unused-vars): Type 'Scope' is imported but never used. 2026-10-24T11:16:17.7222541Z ╭─[apps/server/src/provider/ProviderAuthService.ts:15:18] 2026-10-24T11:16:17.7222651Z 14 │ import * as Layer from "effect/Layer"; 2026-10-24T11:16:17.7222783Z 15 │ import type * as Scope from "effect/Scope"; 2026-10-24T11:16:17.7222894Z ·  ──┬── 2026-10-24T11:16:17.7223058Z · ╰── 'Scope' is imported here 2026-10-24T11:16:17.7223151Z 16 │ import * as Stream from "effect/Stream"; 2026-10-24T11:16:17.7223259Z ╰──── 2026-10-24T11:16:17.7223393Z  help: Consider removing this import. 2026-10-24T11:16:17.7223398Z 2026-10-24T11:16:17.7223647Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T11:16:17.7223788Z ╭─[scripts/lib/cli-external-packages.test.ts:114:11] 2026-10-24T11:16:17.7223893Z 113 │ const declared = { 2026-10-24T11:16:17.7224028Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-24T11:16:17.7224174Z ·  ──────────────────────────────── 2026-10-24T11:16:17.7224291Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T11:16:17.7224364Z ╰──── 2026-10-24T11:16:17.7224681Z  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-24T11:16:17.7224684Z 2026-10-24T11:16:17.7225016Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T11:16:17.7225178Z ╭─[scripts/lib/cli-external-packages.test.ts:115:11] 2026-10-24T11:16:17.7225287Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-24T11:16:17.7225430Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T11:16:17.7225595Z ·  ──────────────────────────────────────── 2026-10-24T11:16:17.7225722Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-24T11:16:17.7225788Z ╰──── 2026-10-24T11:16:17.7226075Z  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-24T11:16:17.7226078Z 2026-10-24T11:16:17.7226341Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T11:16:17.7226549Z ╭─[scripts/lib/cli-external-packages.test.ts:116:11] 2026-10-24T11:16:17.7226698Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T11:16:17.7226823Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-24T11:16:17.7226982Z ·  ──────────────────────────────────── 2026-10-24T11:16:17.7227080Z 117 │ }; 2026-10-24T11:16:17.7227145Z ╰──── 2026-10-24T11:16:17.7227436Z  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-24T11:16:17.7227439Z 2026-10-24T11:16:17.7227916Z ⚠ 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-24T11:16:17.7228178Z ╭─[packages/effect-acp/src/protocol.test.ts:500:31] 2026-10-24T11:16:17.7228267Z 499 │ 2026-10-24T11:16:17.7228396Z 500 │ const response = yield* Schema.decodeUnknownEffect( 2026-10-24T11:16:17.7228548Z ·  ────────────────────────── 2026-10-24T11:16:17.7228702Z 501 │ Schema.fromJsonString(JsonRpcErrorResponse), 2026-10-24T11:16:17.7228792Z ╰──── 2026-10-24T11:16:17.7228795Z 2026-10-24T11:16:17.7229269Z ⚠ 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-24T11:16:17.7229455Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1680:7] 2026-10-24T11:16:17.7229576Z 1679 │ yield* harness.replaceSession; 2026-10-24T11:16:17.7229840Z 1680 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T11:16:17.7230025Z 1681 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) { 2026-10-24T11:16:17.7230127Z 1682 │ │ break; 2026-10-24T11:16:17.7230238Z 1683 │ │ } 2026-10-24T11:16:17.7230378Z 1684 │ │ yield* Effect.yieldNow; 2026-10-24T11:16:17.7230556Z 1685 │ ╰─▶ } 2026-10-24T11:16:17.7230644Z 1686 │ yield* Queue.offer( 2026-10-24T11:16:17.7230729Z ╰──── 2026-10-24T11:16:17.7230732Z 2026-10-24T11:16:17.7231294Z ⚠ 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-24T11:16:17.7231501Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1789:7] 2026-10-24T11:16:17.7231618Z 1788 │ yield* harness.replaceSession; 2026-10-24T11:16:17.7231846Z 1789 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T11:16:17.7232038Z 1790 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break; 2026-10-24T11:16:17.7232215Z 1791 │ │ yield* Effect.yieldNow; 2026-10-24T11:16:17.7232391Z 1792 │ ╰─▶ } 2026-10-24T11:16:17.7232587Z 1793 │ expect(yield* Ref.get(harness.subscriptionCount)).toBe(2); 2026-10-24T11:16:17.7232701Z ╰──── 2026-10-24T11:16:17.7232704Z 2026-10-24T11:16:17.7233188Z ⚠ 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-24T11:16:17.7233364Z ╭─[packages/effect-acp/src/errors.test.ts:129:28] 2026-10-24T11:16:17.7233486Z 128 │ const secret = "acp-summary-secret"; 2026-10-24T11:16:17.7233609Z 129 │ const cause = yield* Schema.decodeUnknownEffect( 2026-10-24T11:16:17.7233765Z ·  ────────────────────────── 2026-10-24T11:16:17.7233866Z 130 │ Schema.Struct({ 2026-10-24T11:16:17.7233957Z ╰──── 2026-10-24T11:16:17.7233960Z 2026-10-24T11:16:17.7234259Z ⚠ eslint(no-unused-vars): Variable 'layerUnavailable' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:16:17.7234523Z ╭─[apps/server/src/orchestration-v2/Orchestrator.ts:12380:7] 2026-10-24T11:16:17.7234601Z 12379 │ 2026-10-24T11:16:17.7234789Z 12380 │ const layerUnavailable: Layer.Layer = Layer.succeed( 2026-10-24T11:16:17.7234891Z ·  ────────┬─────── 2026-10-24T11:16:17.7235075Z · ╰── 'layerUnavailable' is declared here 2026-10-24T11:16:17.7235177Z 12381 │ OrchestratorV2, 2026-10-24T11:16:17.7235263Z ╰──── 2026-10-24T11:16:17.7235387Z  help: Consider removing this declaration. 2026-10-24T11:16:17.7235390Z 2026-10-24T11:16:17.7235604Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T11:16:17.7235817Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:555:70] 2026-10-24T11:16:17.7235925Z 554 │ assert.deepStrictEqual( 2026-10-24T11:16:17.7236138Z 555 │ (yield* Ref.get(fixture.syncCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-24T11:16:17.7236274Z ·  ┬ 2026-10-24T11:16:17.7236471Z · ╰── '_' is declared here 2026-10-24T11:16:17.7236564Z 556 │ [ 2026-10-24T11:16:17.7236650Z ╰──── 2026-10-24T11:16:17.7236772Z  help: Consider removing this parameter. 2026-10-24T11:16:17.7236775Z 2026-10-24T11:16:17.7236990Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T11:16:17.7237270Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:1155:70] 2026-10-24T11:16:17.7237376Z 1154 │ assert.deepStrictEqual( 2026-10-24T11:16:17.7237563Z 1155 │ (yield* Ref.get(fixture.linkCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-24T11:16:17.7237724Z ·  ┬ 2026-10-24T11:16:17.7237921Z · ╰── '_' is declared here 2026-10-24T11:16:17.7238014Z 1156 │ [ 2026-10-24T11:16:17.7238099Z ╰──── 2026-10-24T11:16:17.7238222Z  help: Consider removing this parameter. 2026-10-24T11:16:17.7238224Z 2026-10-24T11:16:17.7238686Z ⚠ 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-24T11:16:17.7238860Z ╭─[packages/effect-acp/src/client.ts:1269:11] 2026-10-24T11:16:17.7239033Z 1268 │ extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) => 2026-10-24T11:16:17.7239231Z 1269 │ Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe( 2026-10-24T11:16:17.7239380Z ·  ────────────────────────── 2026-10-24T11:16:17.7239557Z 1270 │ Effect.mapError(() => AcpError.AcpRequestError.invalidParams()), 2026-10-24T11:16:17.7239637Z ╰──── 2026-10-24T11:16:17.7239639Z 2026-10-24T11:16:17.7240005Z ⚠ 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-24T11:16:17.7240224Z ╭─[packages/effect-acp/src/schema.test.ts:18:12] 2026-10-24T11:16:17.7240424Z 17 │ const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } }; 2026-10-24T11:16:17.7240578Z 18 │ expect(Schema.is(V1.AvailableCommand)(command)).toBe(true); 2026-10-24T11:16:17.7240683Z ·  ───────── 2026-10-24T11:16:17.7240770Z 19 │ expect( 2026-10-24T11:16:17.7240861Z ╰──── 2026-10-24T11:16:17.7240864Z 2026-10-24T11:16:17.7241221Z ⚠ 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-24T11:16:17.7241372Z ╭─[packages/effect-acp/src/schema.test.ts:20:7] 2026-10-24T11:16:17.7241438Z 19 │ expect( 2026-10-24T11:16:17.7241653Z 20 │ Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }), 2026-10-24T11:16:17.7241761Z ·  ───────── 2026-10-24T11:16:17.7241856Z 21 │ ).toBe(true); 2026-10-24T11:16:17.7241924Z ╰──── 2026-10-24T11:16:17.7241927Z 2026-10-24T11:16:17.7242459Z ⚠ 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-24T11:16:17.7242665Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7] 2026-10-24T11:16:17.7242796Z 565 │ let afterSequence = created[0]!.sequence; 2026-10-24T11:16:17.7243033Z 566 │ ╭─▶ for (let index = 1; index <= 32; index += 1) { 2026-10-24T11:16:17.7243143Z 567 │ │ const nextEvent = { 2026-10-24T11:16:17.7243430Z 568 │ │ id: EventId.make(`event:foundation-stream-race:${index}`), 2026-10-24T11:16:17.7243600Z 569 │ │ type: "thread.metadata-updated" as const, 2026-10-24T11:16:17.7243728Z 570 │ │ threadId, 2026-10-24T11:16:17.7243847Z 571 │ │ providerInstanceId, 2026-10-24T11:16:17.7243986Z 572 │ │ occurredAt: now, 2026-10-24T11:16:17.7244171Z 573 │ │ payload: { ...thread, title: `Race update ${index}` }, 2026-10-24T11:16:17.7244331Z 574 │ │ } satisfies OrchestrationV2DomainEvent; 2026-10-24T11:16:17.7244461Z 575 │ │ const reader = yield* eventSink 2026-10-24T11:16:17.7244607Z 576 │ │ .stream({ threadId, afterSequence }) 2026-10-24T11:16:17.7244844Z 577 │ │ .pipe(Stream.runHead, Effect.forkChild); 2026-10-24T11:16:17.7245016Z 578 │ │ yield* Effect.yieldNow; 2026-10-24T11:16:17.7245211Z 579 │ │ const written = yield* eventSink.write({ events: [nextEvent] }); 2026-10-24T11:16:17.7245355Z 580 │ │ const received = yield* Fiber.join(reader); 2026-10-24T11:16:17.7245506Z 581 │ │ if (Option.isNone(received)) { 2026-10-24T11:16:17.7245751Z 582 │ │ return yield* Effect.die("The event stream ended before delivering the live event."); 2026-10-24T11:16:17.7245861Z 583 │ │ } 2026-10-24T11:16:17.7246035Z 584 │ │ assert.equal(received.value.sequence, written[0]?.sequence); 2026-10-24T11:16:17.7246287Z 585 │ │ assert.equal(received.value.event.id, nextEvent.id); 2026-10-24T11:16:17.7246469Z 586 │ │ afterSequence = received.value.sequence; 2026-10-24T11:16:17.7246630Z 587 │ ╰─▶ } 2026-10-24T11:16:17.7246703Z 588 │ }), 2026-10-24T11:16:17.7246786Z ╰──── 2026-10-24T11:16:17.7246788Z 2026-10-24T11:16:17.7247274Z ⚠ 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-24T11:16:17.7247488Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:2327:9] 2026-10-24T11:16:17.7247598Z 2326 │ let settled = false; 2026-10-24T11:16:17.7247780Z 2327 │ ╭─▶ while (!settled) { 2026-10-24T11:16:17.7247966Z 2328 │ │ settled = (yield* outbox.listByCommandId(commandId)).every( 2026-10-24T11:16:17.7248153Z 2329 │ │ (effect) => effect.status === "succeeded", 2026-10-24T11:16:17.7248265Z 2330 │ │ ); 2026-10-24T11:16:17.7248404Z 2331 │ │ if (!settled) yield* Effect.yieldNow; 2026-10-24T11:16:17.7248572Z 2332 │ ╰─▶ } 2026-10-24T11:16:17.7248725Z 2333 │ }).pipe(Effect.provide(layerWorker), Effect.scoped); 2026-10-24T11:16:17.7248818Z ╰──── 2026-10-24T11:16:17.7248821Z 2026-10-24T11:16:17.7249298Z ⚠ 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-24T11:16:17.7249444Z ╭─[apps/server/src/assets/AssetAccess.test.ts:1043:32] 2026-10-24T11:16:17.7249683Z 1042 │ expect(error._tag).toBe("AssetGitHubMediaUrlValidationError"); 2026-10-24T11:16:17.7249917Z 1043 │ const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(AssetAccessError))(error); 2026-10-24T11:16:17.7250063Z ·  ─────────────────── 2026-10-24T11:16:17.7250171Z 1044 │ expect(encoded).not.toContain(url); 2026-10-24T11:16:17.7250256Z ╰──── 2026-10-24T11:16:17.7250259Z 2026-10-24T11:16:17.7250552Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:16:17.7250806Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10578:7] 2026-10-24T11:16:17.7250940Z 10577 │ 2026-10-24T11:16:17.7251028Z 10578 │ const layer: Layer.Layer< 2026-10-24T11:16:17.7251122Z ·  ──┬── 2026-10-24T11:16:17.7251298Z · ╰── 'layer' is declared here 2026-10-24T11:16:17.7251426Z 10579 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T11:16:17.7251492Z ╰──── 2026-10-24T11:16:17.7251625Z  help: Consider removing this declaration. 2026-10-24T11:16:17.7251627Z 2026-10-24T11:16:17.7252145Z ⚠ 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-24T11:16:17.7252336Z ╭─[apps/server/src/background/HostPowerMonitor.test.ts:133:11] 2026-10-24T11:16:17.7252562Z 132 │ const monitor = yield* HostPowerMonitor.HostPowerMonitor; 2026-10-24T11:16:17.7252741Z 133 │ ╭─▶ for ( 2026-10-24T11:16:17.7252865Z 134 │ │ let attempt = 0; 2026-10-24T11:16:17.7253078Z 135 │ │ attempt < 100 && (yield* monitor.snapshot).onBattery !== "true"; 2026-10-24T11:16:17.7253210Z 136 │ │ attempt += 1 2026-10-24T11:16:17.7253306Z 137 │ │ ) { 2026-10-24T11:16:17.7253448Z 138 │ │ yield* Effect.yieldNow; 2026-10-24T11:16:17.7253615Z 139 │ ╰─▶ } 2026-10-24T11:16:17.7253786Z 140 │ expect((yield* monitor.snapshot).onBattery).toBe("true"); 2026-10-24T11:16:17.7253857Z ╰──── 2026-10-24T11:16:17.7253859Z 2026-10-24T11:16:17.7254118Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T11:16:17.7254302Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:1998:15] 2026-10-24T11:16:17.7257607Z 1997 │ assert.equal( 2026-10-24T11:16:17.7257775Z 1998 │ items.filter((item) => item.type === "assistant_message").at(-1)?.text, 2026-10-24T11:16:17.7257861Z ·  ────── 2026-10-24T11:16:17.7257938Z 1999 │ "authoritative answer", 2026-10-24T11:16:17.7257994Z ╰──── 2026-10-24T11:16:17.7258166Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T11:16:17.7258169Z 2026-10-24T11:16:17.7258708Z ⚠ 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-24T11:16:17.7258920Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:3951:7] 2026-10-24T11:16:17.7259101Z 3950 │ const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped); 2026-10-24T11:16:17.7259314Z 3951 │ ╭─▶ while (!responseLifecycle.includes("failed")) { 2026-10-24T11:16:17.7259426Z 3952 │ │ yield* Effect.yieldNow; 2026-10-24T11:16:17.7259564Z 3953 │ ╰─▶ } 2026-10-24T11:16:17.7259690Z 3954 │ const responseExit = yield* Fiber.join(responseFiber); 2026-10-24T11:16:17.7259747Z ╰──── 2026-10-24T11:16:17.7259750Z 2026-10-24T11:16:17.7260210Z ⚠ 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-24T11:16:17.7260382Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6062:9] 2026-10-24T11:16:17.7260470Z 6061 │ .pipe(Effect.forkScoped); 2026-10-24T11:16:17.7260726Z 6062 │ ╭─▶ while (promptGates.length < 1) { 2026-10-24T11:16:17.7260842Z 6063 │ │ yield* Effect.yieldNow; 2026-10-24T11:16:17.7260981Z 6064 │ ╰─▶ } 2026-10-24T11:16:17.7261156Z 6065 │ assert.isDefined(sessionUpdateHandler, "session update handler must be wired"); 2026-10-24T11:16:17.7261212Z ╰──── 2026-10-24T11:16:17.7261214Z 2026-10-24T11:16:17.7261670Z ⚠ 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-24T11:16:17.7261839Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6197:9] 2026-10-24T11:16:17.7261931Z 6196 │ .pipe(Effect.forkScoped); 2026-10-24T11:16:17.7262150Z 6197 │ ╭─▶ while (promptGates.length < 2) { 2026-10-24T11:16:17.7262263Z 6198 │ │ yield* Effect.yieldNow; 2026-10-24T11:16:17.7262405Z 6199 │ ╰─▶ } 2026-10-24T11:16:17.7262572Z 6200 │ if (sessionUpdateHandler === undefined || capturedMutation.current === null) { 2026-10-24T11:16:17.7262624Z ╰──── 2026-10-24T11:16:17.7262630Z 2026-10-24T11:16:17.7262961Z ⚠ eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:16:17.7263125Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1444:7] 2026-10-24T11:16:17.7263180Z 1443 │ 2026-10-24T11:16:17.7263297Z 1444 │ const layerCodexAppServerClientFactoryCommand = ( 2026-10-24T11:16:17.7263419Z ·  ───────────────────┬─────────────────── 2026-10-24T11:16:17.7263704Z · ╰── 'layerCodexAppServerClientFactoryCommand' is declared here 2026-10-24T11:16:17.7263865Z 1445 │ options: CodexClient.CodexAppServerClientOptions & { 2026-10-24T11:16:17.7263918Z ╰──── 2026-10-24T11:16:17.7264022Z  help: Consider removing this declaration. 2026-10-24T11:16:17.7264024Z 2026-10-24T11:16:17.7264284Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:16:17.7264447Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1680:7] 2026-10-24T11:16:17.7264503Z 1679 │ 2026-10-24T11:16:17.7264576Z 1680 │ const layer: Layer.Layer< 2026-10-24T11:16:17.7264653Z ·  ──┬── 2026-10-24T11:16:17.7264783Z · ╰── 'layer' is declared here 2026-10-24T11:16:17.7264884Z 1681 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T11:16:17.7264939Z ╰──── 2026-10-24T11:16:17.7265044Z  help: Consider removing this declaration. 2026-10-24T11:16:17.7265047Z 2026-10-24T11:16:17.7265508Z ⚠ 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-24T11:16:17.7265667Z ╭─[packages/client-runtime/src/connection/supervisor.test.ts:135:3] 2026-10-24T11:16:17.7265780Z 134 │ let lastState = yield* SubscriptionRef.get(state); 2026-10-24T11:16:17.7265997Z 135 │ ╭─▶ for (let iteration = 0; iteration < 100; iteration += 1) { 2026-10-24T11:16:17.7266137Z 136 │ │ lastState = yield* SubscriptionRef.get(state); 2026-10-24T11:16:17.7266252Z 137 │ │ if (predicate(lastState)) { 2026-10-24T11:16:17.7266356Z 138 │ │ return lastState; 2026-10-24T11:16:17.7266430Z 139 │ │ } 2026-10-24T11:16:17.7266533Z 140 │ │ yield* Effect.yieldNow; 2026-10-24T11:16:17.7266662Z 141 │ ╰─▶ } 2026-10-24T11:16:17.7266739Z 142 │ return yield* Effect.die( 2026-10-24T11:16:17.7266791Z ╰──── 2026-10-24T11:16:17.7266793Z 2026-10-24T11:16:17.7267250Z ⚠ 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-24T11:16:17.7267388Z ╭─[apps/server/src/usage/UsageService.test.ts:2615:7] 2026-10-24T11:16:17.7267489Z 2614 │ let orphanedAt: number | undefined; 2026-10-24T11:16:17.7267721Z 2615 │ ╭─▶ for (let interruptAt = 1; interruptAt <= 31; interruptAt += 1) { 2026-10-24T11:16:17.7267846Z 2616 │ │ const tasks: Array<() => void> = []; 2026-10-24T11:16:17.7267997Z 2617 │ │ const dispatcher: Scheduler.SchedulerDispatcher = { 2026-10-24T11:16:17.7268134Z 2618 │ │ scheduleTask: (task) => tasks.push(task), 2026-10-24T11:16:17.7268232Z 2619 │ │ flush: () => { 2026-10-24T11:16:17.7268360Z 2620 │ │ let task: (() => void) | undefined; 2026-10-24T11:16:17.7268564Z 2621 │ │ while ((task = tasks.shift()) !== undefined) task(); 2026-10-24T11:16:17.7268680Z 2622 │ │ }, 2026-10-24T11:16:17.7268760Z 2623 │ │ }; 2026-10-24T11:16:17.7268834Z 2624 │ │ 2026-10-24T11:16:17.7268999Z 2625 │ │ let requestFiber: Fiber.Fiber | undefined; 2026-10-24T11:16:17.7269108Z 2626 │ │ let requestChecks = 0; 2026-10-24T11:16:17.7269243Z 2627 │ │ const scheduler: Scheduler.Scheduler = { 2026-10-24T11:16:17.7269351Z 2628 │ │ executionMode: "async", 2026-10-24T11:16:17.7269476Z 2629 │ │ makeDispatcher: () => dispatcher, 2026-10-24T11:16:17.7269592Z 2630 │ │ shouldYield: (fiber) => { 2026-10-24T11:16:17.7269736Z 2631 │ │ if (fiber !== requestFiber) return false; 2026-10-24T11:16:17.7269846Z 2632 │ │ requestChecks += 1; 2026-10-24T11:16:17.7269994Z 2633 │ │ if (requestChecks !== interruptAt) return false; 2026-10-24T11:16:17.7270113Z 2634 │ │ fiber.interruptUnsafe(); 2026-10-24T11:16:17.7270213Z 2635 │ │ return true; 2026-10-24T11:16:17.7270295Z 2636 │ │ }, 2026-10-24T11:16:17.7270378Z 2637 │ │ }; 2026-10-24T11:16:17.7270450Z 2638 │ │ 2026-10-24T11:16:17.7270578Z 2639 │ │ const input: UsageSummaryInput = { 2026-10-24T11:16:17.7270671Z 2640 │ │ ...WINDOW, 2026-10-24T11:16:17.7270810Z 2641 │ │ sinceDay: UsageDay.make("2026-09-01"), 2026-10-24T11:16:17.7271012Z 2642 │ │ untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`), 2026-10-24T11:16:17.7271094Z 2643 │ │ }; 2026-10-24T11:16:17.7271206Z 2644 │ │ const first = yield* service 2026-10-24T11:16:17.7271314Z 2645 │ │ .readSummary(input) 2026-10-24T11:16:17.7271406Z 2646 │ │ .pipe( 2026-10-24T11:16:17.7271507Z 2647 │ │ Effect.exit, 2026-10-24T11:16:17.7271665Z 2648 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-24T11:16:17.7271772Z 2649 │ │ Effect.forkChild, 2026-10-24T11:16:17.7271856Z 2650 │ │ ); 2026-10-24T11:16:17.7271967Z 2651 │ │ requestFiber = first; 2026-10-24T11:16:17.7272086Z 2652 │ │ yield* Effect.yieldNow; 2026-10-24T11:16:17.7272239Z 2653 │ │ dispatcher.flush(); 2026-10-24T11:16:17.7272318Z 2654 │ │ 2026-10-24T11:16:17.7272474Z 2655 │ │ const second = yield* service.readSummary(input).pipe( 2026-10-24T11:16:17.7272572Z 2656 │ │ Effect.match({ 2026-10-24T11:16:17.7272700Z 2657 │ │ onFailure: (error) => error.reason, 2026-10-24T11:16:17.7272828Z 2658 │ │ onSuccess: () => "success" as const, 2026-10-24T11:16:17.7272915Z 2659 │ │ }), 2026-10-24T11:16:17.7273070Z 2660 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-24T11:16:17.7273224Z 2661 │ │ Effect.forkChild, 2026-10-24T11:16:17.7273339Z 2662 │ │ ); 2026-10-24T11:16:17.7273446Z 2663 │ │ yield* Effect.yieldNow; 2026-10-24T11:16:17.7273549Z 2664 │ │ dispatcher.flush(); 2026-10-24T11:16:17.7273681Z 2665 │ │ const secondExit = second.pollUnsafe(); 2026-10-24T11:16:17.7273800Z 2666 │ │ if (secondExit === undefined) { 2026-10-24T11:16:17.7273917Z 2667 │ │ second.interruptUnsafe(); 2026-10-24T11:16:17.7274029Z 2668 │ │ orphanedAt = interruptAt; 2026-10-24T11:16:17.7274119Z 2669 │ │ break; 2026-10-24T11:16:17.7274201Z 2670 │ │ } 2026-10-24T11:16:17.7274329Z 2671 │ │ if (Exit.isFailure(secondExit)) { 2026-10-24T11:16:17.7274490Z 2672 │ │ assert.fail("the matching request fiber was interrupted"); 2026-10-24T11:16:17.7274572Z 2673 │ │ } 2026-10-24T11:16:17.7274726Z 2674 │ │ assert.strictEqual(secondExit.value, "invalidWindow"); 2026-10-24T11:16:17.7274863Z 2675 │ ╰─▶ } 2026-10-24T11:16:17.7274918Z 2676 │ 2026-10-24T11:16:17.7274975Z ╰──── 2026-10-24T11:16:17.7274978Z 2026-10-24T11:16:17.7275244Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:16:17.7275365Z ╭─[apps/server/src/usage/UsageService.ts:169:7] 2026-10-24T11:16:17.7275416Z 168 │ 2026-10-24T11:16:17.7275505Z 169 │ const layerTest = Layer.succeed( 2026-10-24T11:16:17.7275586Z ·  ────┬──── 2026-10-24T11:16:17.7275723Z · ╰── 'layerTest' is declared here 2026-10-24T11:16:17.7275787Z 170 │ UsageService, 2026-10-24T11:16:17.7275844Z ╰──── 2026-10-24T11:16:17.7275950Z  help: Consider removing this declaration. 2026-10-24T11:16:17.7275952Z 2026-10-24T11:16:17.7276207Z ⚠ eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used. 2026-10-24T11:16:17.7276384Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:960:10] 2026-10-24T11:16:17.7276439Z 959 │ 2026-10-24T11:16:17.7276551Z 960 │ function layerClaudeAgentSdkReplayQueryRunner( 2026-10-24T11:16:17.7276679Z ·  ──────────────────┬───────────────── 2026-10-24T11:16:17.7276881Z · ╰── 'layerClaudeAgentSdkReplayQueryRunner' is declared here 2026-10-24T11:16:17.7276987Z 961 │ transcript: ClaudeAgentSdkReplayTranscript, 2026-10-24T11:16:17.7277040Z ╰──── 2026-10-24T11:16:17.7277142Z  help: Consider removing this declaration. 2026-10-24T11:16:17.7277145Z 2026-10-24T11:16:17.7277334Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T11:16:17.7277470Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:121:27] 2026-10-24T11:16:17.7277634Z 120 │ const scope = makeScope(options.capabilities ?? new Set(["preview", "worktree"])); 2026-10-24T11:16:17.7277725Z 121 │ const dispatch = vi.fn((_: unknown) => 2026-10-24T11:16:17.7277811Z ·  ┬ 2026-10-24T11:16:17.7277994Z · ╰── '_' is declared here 2026-10-24T11:16:17.7278128Z 122 │ (options.dispatchGate ?? Effect.void).pipe( 2026-10-24T11:16:17.7278183Z ╰──── 2026-10-24T11:16:17.7278287Z  help: Consider removing this parameter. 2026-10-24T11:16:17.7278290Z 2026-10-24T11:16:17.7278475Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T11:16:17.7278613Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:134:39] 2026-10-24T11:16:17.7278670Z 133 │ ); 2026-10-24T11:16:17.7278779Z 134 │ const listLocalBranchNames = vi.fn((_: string) => 2026-10-24T11:16:17.7278875Z ·  ┬ 2026-10-24T11:16:17.7279028Z · ╰── '_' is declared here 2026-10-24T11:16:17.7279106Z 135 │ Effect.succeed( 2026-10-24T11:16:17.7279161Z ╰──── 2026-10-24T11:16:17.7279261Z  help: Consider removing this parameter. 2026-10-24T11:16:17.7279264Z 2026-10-24T11:16:17.7279448Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T11:16:17.7279586Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:178:31] 2026-10-24T11:16:17.7279644Z 177 │ }); 2026-10-24T11:16:17.7279741Z 178 │ const sendToThread = vi.fn((_: unknown) => { 2026-10-24T11:16:17.7279832Z ·  ┬ 2026-10-24T11:16:17.7279970Z · ╰── '_' is declared here 2026-10-24T11:16:17.7280072Z 179 │ switch (options.continuation ?? "queued") { 2026-10-24T11:16:17.7280123Z ╰──── 2026-10-24T11:16:17.7280229Z  help: Consider removing this parameter. 2026-10-24T11:16:17.7280234Z 2026-10-24T11:16:17.7280417Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T11:16:17.7280550Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:203:33] 2026-10-24T11:16:17.7280605Z 202 │ ); 2026-10-24T11:16:17.7280706Z 203 │ const removeWorktree = vi.fn((_: unknown) => 2026-10-24T11:16:17.7280797Z ·  ┬ 2026-10-24T11:16:17.7280935Z · ╰── '_' is declared here 2026-10-24T11:16:17.7281015Z 204 │ options.removeWorktreeFails 2026-10-24T11:16:17.7281068Z ╰──── 2026-10-24T11:16:17.7281169Z  help: Consider removing this parameter. 2026-10-24T11:16:17.7281171Z 2026-10-24T11:16:17.7281361Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T11:16:17.7281496Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:208:36] 2026-10-24T11:16:17.7281553Z 207 │ ); 2026-10-24T11:16:17.7281655Z 208 │ const deleteLocalBranch = vi.fn((_: unknown) => 2026-10-24T11:16:17.7281752Z ·  ┬ 2026-10-24T11:16:17.7281890Z · ╰── '_' is declared here 2026-10-24T11:16:17.7281976Z 209 │ options.deleteLocalBranchFails 2026-10-24T11:16:17.7282029Z ╰──── 2026-10-24T11:16:17.7282158Z  help: Consider removing this parameter. 2026-10-24T11:16:17.7282161Z 2026-10-24T11:16:17.7282341Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T11:16:17.7282531Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:213:42] 2026-10-24T11:16:17.7282621Z 212 │ ); 2026-10-24T11:16:17.7282735Z 213 │ const fetchWorktreeBaseCommit = vi.fn((_: unknown) => 2026-10-24T11:16:17.7282833Z ·  ┬ 2026-10-24T11:16:17.7282980Z · ╰── '_' is declared here 2026-10-24T11:16:17.7283066Z 214 │ options.fetchWorktreeBaseFails 2026-10-24T11:16:17.7283121Z ╰──── 2026-10-24T11:16:17.7283221Z  help: Consider removing this parameter. 2026-10-24T11:16:17.7283223Z 2026-10-24T11:16:17.7283406Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T11:16:17.7283542Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:254:30] 2026-10-24T11:16:17.7283603Z 253 │ ); 2026-10-24T11:16:17.7283698Z 254 │ const localStatus = vi.fn((_: unknown) => 2026-10-24T11:16:17.7283789Z ·  ┬ 2026-10-24T11:16:17.7283927Z · ╰── '_' is declared here 2026-10-24T11:16:17.7283998Z 255 │ Effect.succeed({ 2026-10-24T11:16:17.7284048Z ╰──── 2026-10-24T11:16:17.7284149Z  help: Consider removing this parameter. 2026-10-24T11:16:17.7284152Z 2026-10-24T11:16:17.7284335Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T11:16:17.7284469Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:264:32] 2026-10-24T11:16:17.7284524Z 263 │ ); 2026-10-24T11:16:17.7284673Z 264 │ const refreshStatus = vi.fn((_: string) => Effect.die("refreshStatus stub")); 2026-10-24T11:16:17.7284770Z ·  ┬ 2026-10-24T11:16:17.7284910Z · ╰── '_' is declared here 2026-10-24T11:16:17.7285064Z 265 │ const runForThread = vi.fn((input: { readonly worktreePath: string }) => { 2026-10-24T11:16:17.7285116Z ╰──── 2026-10-24T11:16:17.7285218Z  help: Consider removing this parameter. 2026-10-24T11:16:17.7285220Z 2026-10-24T11:16:17.7285426Z ⚠ eslint(no-unused-vars): Function 'nonEmptyString' is declared but never used. 2026-10-24T11:16:17.7285575Z ╭─[packages/client-runtime/src/work-log/presentation.ts:234:10] 2026-10-24T11:16:17.7285628Z 233 │ 2026-10-24T11:16:17.7285745Z 234 │ function nonEmptyString(value: unknown): string | null { 2026-10-24T11:16:17.7285834Z ·  ───────┬────── 2026-10-24T11:16:17.7286115Z · ╰── 'nonEmptyString' is declared here 2026-10-24T11:16:17.7286287Z 235 │ return typeof value === "string" && value.trim().length > 0 ? value : null; 2026-10-24T11:16:17.7286342Z ╰──── 2026-10-24T11:16:17.7286447Z  help: Consider removing this declaration. 2026-10-24T11:16:17.7286449Z 2026-10-24T11:16:17.7286630Z ⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`. 2026-10-24T11:16:17.7286751Z ╭─[apps/web/src/terminal/ghostty/core.ts:194:19] 2026-10-24T11:16:17.7286880Z 193 │ const count = Math.min(CHUNK_SIZE, graphemeLength - start); 2026-10-24T11:16:17.7286974Z 194 │ const codes = new Array(count); 2026-10-24T11:16:17.7287087Z ·  ──────────────────────── 2026-10-24T11:16:17.7287190Z 195 │ for (let index = 0; index < count; index += 1) { 2026-10-24T11:16:17.7287250Z ╰──── 2026-10-24T11:16:17.7287671Z  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-24T11:16:17.7287673Z 2026-10-24T11:16:17.7287904Z ⚠ eslint(no-unused-vars): Function 'assertUserMessagesExclude' is declared but never used. 2026-10-24T11:16:17.7288071Z ╭─[apps/server/src/orchestration-v2/testkit/fixtures/shared.ts:1398:10] 2026-10-24T11:16:17.7288125Z 1397 │ 2026-10-24T11:16:17.7288215Z 1398 │ function assertUserMessagesExclude( 2026-10-24T11:16:17.7288323Z ·  ────────────┬──────────── 2026-10-24T11:16:17.7288502Z · ╰── 'assertUserMessagesExclude' is declared here 2026-10-24T11:16:17.7288612Z 1399 │ projection: OrchestrationV2ThreadProjection, 2026-10-24T11:16:17.7288668Z ╰──── 2026-10-24T11:16:17.7288774Z  help: Consider removing this declaration. 2026-10-24T11:16:17.7288776Z 2026-10-24T11:16:17.7289223Z ⚠ 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-24T11:16:17.7289348Z ╭─[apps/server/src/serverSettings.test.ts:1741:32] 2026-10-24T11:16:17.7289520Z 1740 │ const model = createModelSelection(ProviderInstanceId.make("codex"), "gpt-5.5"); 2026-10-24T11:16:17.7289708Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-24T11:16:17.7289832Z ·  ─────────────────── 2026-10-24T11:16:17.7289942Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-24T11:16:17.7289996Z ╰──── 2026-10-24T11:16:17.7289999Z 2026-10-24T11:16:17.7290437Z ⚠ 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-24T11:16:17.7290560Z ╭─[apps/server/src/serverSettings.test.ts:1742:34] 2026-10-24T11:16:17.7290742Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-24T11:16:17.7290846Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-24T11:16:17.7290969Z ·  ─────────────────── 2026-10-24T11:16:17.7291136Z 1743 │ Schema.fromJsonString(Schema.Array(ProjectScript)), 2026-10-24T11:16:17.7291218Z ╰──── 2026-10-24T11:16:17.7291221Z 2026-10-24T11:16:17.7291426Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-24T11:16:17.7291533Z ╭─[packages/contracts/src/rpc.ts:297:8] 2026-10-24T11:16:17.7291605Z 296 │ } from "./device.ts"; 2026-10-24T11:16:17.7291700Z 297 │ import {} from "./previewAutomation.ts"; 2026-10-24T11:16:17.7291769Z ·  ── 2026-10-24T11:16:17.7291833Z 298 │ import { 2026-10-24T11:16:17.7291887Z ╰──── 2026-10-24T11:16:17.7291972Z  help: Remove empty braces 2026-10-24T11:16:17.7291975Z 2026-10-24T11:16:17.7292370Z ⚠ 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-24T11:16:17.7292490Z ╭─[packages/contracts/src/auth.test.ts:17:12] 2026-10-24T11:16:17.7292651Z 16 │ it("decodes legacy review credentials without offering them in new grants", () => { 2026-10-24T11:16:17.7292821Z 17 │ expect(Schema.decodeUnknownSync(AuthEnvironmentScopes)(["review:write"])).toEqual([ 2026-10-24T11:16:17.7292927Z ·  ──────────────────────── 2026-10-24T11:16:17.7292997Z 18 │ "review:write", 2026-10-24T11:16:17.7293051Z ╰──── 2026-10-24T11:16:17.7293053Z 2026-10-24T11:16:17.7293411Z ⚠ 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-24T11:16:17.7293524Z ╭─[packages/contracts/src/auth.test.ts:20:18] 2026-10-24T11:16:17.7293586Z 19 │ ]); 2026-10-24T11:16:17.7293754Z 20 │ expect(() => Schema.decodeUnknownSync(AuthGrantScopes)(["review:write"])).toThrow(); 2026-10-24T11:16:17.7293865Z ·  ──────────────────────── 2026-10-24T11:16:17.7293999Z 21 │ expect(AuthStandardClientScopes).not.toContain("review:write"); 2026-10-24T11:16:17.7294049Z ╰──── 2026-10-24T11:16:17.7294052Z 2026-10-24T11:16:17.7294406Z ⚠ 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-24T11:16:17.7294520Z ╭─[packages/contracts/src/auth.test.ts:58:21] 2026-10-24T11:16:17.7294690Z 57 │ it("ignores unknown response permissions without falling back to broader scopes", () => { 2026-10-24T11:16:17.7294813Z 58 │ const session = Schema.decodeUnknownSync(AuthSessionState)({ 2026-10-24T11:16:17.7294929Z ·  ──────────────────────── 2026-10-24T11:16:17.7295003Z 59 │ authenticated: true, 2026-10-24T11:16:17.7295056Z ╰──── 2026-10-24T11:16:17.7295058Z 2026-10-24T11:16:17.7295211Z ⚠ eslint(no-new): Do not use 'new' for side effects. 2026-10-24T11:16:17.7295341Z ╭─[apps/server/src/mcp/McpToolAccess.test.ts:168:3] 2026-10-24T11:16:17.7295458Z 167 │ // @ts-expect-error a declaration constructed directly 2026-10-24T11:16:17.7295555Z 168 │ new McpToolAccess.Declaration(unchecked); 2026-10-24T11:16:17.7295654Z ·  ───────────────────────────── 2026-10-24T11:16:17.7295781Z 169 │ // @ts-expect-error a handlers layer built outside McpToolAccess 2026-10-24T11:16:17.7295835Z ╰──── 2026-10-24T11:16:17.7296046Z  help: Assign the result of 'new' to a variable or compare it to a reference. 2026-10-24T11:16:17.7296086Z 2026-10-24T11:16:17.7296284Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T11:16:17.7296417Z ╭─[packages/client-runtime/src/state/filesystem.ts:3:8] 2026-10-24T11:16:17.7296489Z 2 │ AuthFilesystemReadScope, 2026-10-24T11:16:17.7296558Z 3 │ type AuthSessionState, 2026-10-24T11:16:17.7296641Z ·  ────────┬─────── 2026-10-24T11:16:17.7296790Z · ╰── 'AuthSessionState' is imported here 2026-10-24T11:16:17.7296865Z 4 │ type FilesystemBrowseEntry, 2026-10-24T11:16:17.7296917Z ╰──── 2026-10-24T11:16:17.7297013Z  help: Consider removing this import. 2026-10-24T11:16:17.7297016Z 2026-10-24T11:16:17.7297471Z ⚠ 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-24T11:16:17.7297600Z ╭─[packages/contracts/src/baseSchemas.test.ts:39:9] 2026-10-24T11:16:17.7297668Z 38 │ JSON.stringify( 2026-10-24T11:16:17.7297786Z 39 │ Schema.encodeUnknownSync(Schema.toCodecJson(Named))([ 2026-10-24T11:16:17.7297883Z ·  ──────────────────────── 2026-10-24T11:16:17.7297951Z 40 │ { name: "a" }, 2026-10-24T11:16:17.7298002Z ╰──── 2026-10-24T11:16:17.7298005Z 2026-10-24T11:16:17.7298191Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-24T11:16:17.7298313Z ╭─[packages/client-runtime/src/state/shell.ts:189:5] 2026-10-24T11:16:17.7298430Z 186 │ let waiting = yield* Ref.get(awaitingCompletion); 2026-10-24T11:16:17.7298500Z 187 │ let next = initial; 2026-10-24T11:16:17.7298571Z ·  ──┬─ 2026-10-24T11:16:17.7298693Z · ╰── From this accumulator 2026-10-24T11:16:17.7298775Z 188 │ let receivedSnapshot = false; 2026-10-24T11:16:17.7298852Z 189 │ for (const item of items) { 2026-10-24T11:16:17.7298922Z ·  ─┬─ 2026-10-24T11:16:17.7299029Z · ╰── For this loop 2026-10-24T11:16:17.7299118Z 190 │ if (item.kind === "synchronized") { 2026-10-24T11:16:17.7299184Z 191 │ waiting = false; 2026-10-24T11:16:17.7299275Z 192 │ if (Option.isSome(next.snapshot)) { 2026-10-24T11:16:17.7299391Z 193 │ next = { ...next, status: "live", error: Option.none() }; 2026-10-24T11:16:17.7299484Z ·  ───┬─── 2026-10-24T11:16:17.7299618Z · ╰── From this spread 2026-10-24T11:16:17.7299679Z 194 │ } 2026-10-24T11:16:17.7299731Z ╰──── 2026-10-24T11:16:17.7299886Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-24T11:16:17.7300040Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T11:16:17.7300043Z 2026-10-24T11:16:17.7300503Z ⚠ 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-24T11:16:17.7300768Z ╭─[packages/client-runtime/src/rpc/client.test.ts:131:9] 2026-10-24T11:16:17.7300833Z 130 │ ) { 2026-10-24T11:16:17.7301123Z 131 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T11:16:17.7301288Z 132 │ │ if (subscriptions.length >= count) { 2026-10-24T11:16:17.7301378Z 133 │ │ return; 2026-10-24T11:16:17.7301458Z 134 │ │ } 2026-10-24T11:16:17.7301567Z 135 │ │ yield* Effect.yieldNow; 2026-10-24T11:16:17.7301704Z 136 │ ╰─▶ } 2026-10-24T11:16:17.7301867Z 137 │ return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`)); 2026-10-24T11:16:17.7301921Z ╰──── 2026-10-24T11:16:17.7301923Z 2026-10-24T11:16:17.7302429Z ⚠ 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-24T11:16:17.7302562Z ╭─[packages/client-runtime/src/rpc/client.test.ts:252:7] 2026-10-24T11:16:17.7302724Z 251 │ yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient))); 2026-10-24T11:16:17.7302978Z 252 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) { 2026-10-24T11:16:17.7303084Z 253 │ │ yield* Effect.yieldNow; 2026-10-24T11:16:17.7303217Z 254 │ ╰─▶ } 2026-10-24T11:16:17.7303339Z 255 │ yield* SubscriptionRef.set(activeSession, Option.none()); 2026-10-24T11:16:17.7303389Z ╰──── 2026-10-24T11:16:17.7303392Z 2026-10-24T11:16:17.7303851Z ⚠ 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-24T11:16:17.7303985Z ╭─[packages/client-runtime/src/rpc/client.test.ts:258:7] 2026-10-24T11:16:17.7304039Z 257 │ 2026-10-24T11:16:17.7304291Z 258 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-24T11:16:17.7304394Z 259 │ │ yield* Effect.yieldNow; 2026-10-24T11:16:17.7304525Z 260 │ ╰─▶ } 2026-10-24T11:16:17.7304630Z 261 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-24T11:16:17.7304687Z ╰──── 2026-10-24T11:16:17.7304693Z 2026-10-24T11:16:17.7305146Z ⚠ 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-24T11:16:17.7305276Z ╭─[packages/client-runtime/src/rpc/client.test.ts:322:7] 2026-10-24T11:16:17.7305335Z 321 │ ); 2026-10-24T11:16:17.7305590Z 322 │ ╭─▶ for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) { 2026-10-24T11:16:17.7305692Z 323 │ │ yield* Effect.yieldNow; 2026-10-24T11:16:17.7305823Z 324 │ ╰─▶ } 2026-10-24T11:16:17.7305877Z 325 │ 2026-10-24T11:16:17.7305979Z ╰──── 2026-10-24T11:16:17.7306011Z 2026-10-24T11:16:17.7306461Z ⚠ 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-24T11:16:17.7306591Z ╭─[packages/client-runtime/src/rpc/client.test.ts:330:7] 2026-10-24T11:16:17.7306754Z 329 │ yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient))); 2026-10-24T11:16:17.7307005Z 330 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-24T11:16:17.7307108Z 331 │ │ yield* Effect.yieldNow; 2026-10-24T11:16:17.7307242Z 332 │ ╰─▶ } 2026-10-24T11:16:17.7307350Z 333 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-24T11:16:17.7307402Z ╰──── 2026-10-24T11:16:17.7307404Z 2026-10-24T11:16:17.7307858Z ⚠ 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-24T11:16:17.7307993Z ╭─[packages/client-runtime/src/rpc/session.test.ts:226:3] 2026-10-24T11:16:17.7308054Z 225 │ ) { 2026-10-24T11:16:17.7308260Z 226 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T11:16:17.7308370Z 227 │ │ const socket = sockets[index]; 2026-10-24T11:16:17.7308464Z 228 │ │ if (socket) { 2026-10-24T11:16:17.7308558Z 229 │ │ return socket; 2026-10-24T11:16:17.7308632Z 230 │ │ } 2026-10-24T11:16:17.7308735Z 231 │ │ yield* Effect.yieldNow; 2026-10-24T11:16:17.7308865Z 232 │ ╰─▶ } 2026-10-24T11:16:17.7309036Z 233 │ return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket.")); 2026-10-24T11:16:17.7309089Z ╰──── 2026-10-24T11:16:17.7309091Z 2026-10-24T11:16:17.7309542Z ⚠ 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-24T11:16:17.7309675Z ╭─[packages/client-runtime/src/rpc/session.test.ts:240:3] 2026-10-24T11:16:17.7309777Z 239 │ ) { 2026-10-24T11:16:17.7310011Z 240 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T11:16:17.7310225Z 241 │ │ const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index]; 2026-10-24T11:16:17.7310316Z 242 │ │ if (request) { 2026-10-24T11:16:17.7310409Z 243 │ │ return request; 2026-10-24T11:16:17.7310484Z 244 │ │ } 2026-10-24T11:16:17.7310584Z 245 │ │ yield* Effect.yieldNow; 2026-10-24T11:16:17.7310711Z 246 │ ╰─▶ } 2026-10-24T11:16:17.7310878Z 247 │ return yield* Effect.die(new Error("Expected the RPC protocol to send a request.")); 2026-10-24T11:16:17.7310933Z ╰──── 2026-10-24T11:16:17.7310938Z 2026-10-24T11:16:17.7311198Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:16:17.7311348Z ╭─[apps/mobile/src/features/threads/use-worktree-setup.ts:30:40] 2026-10-24T11:16:17.7311508Z 28 │ const snapshot = resolveWorktreeSetupSnapshot(input.threadId, query.data, live); 2026-10-24T11:16:17.7311572Z 29 │ useEffect(() => { 2026-10-24T11:16:17.7311645Z ·  ────┬──── 2026-10-24T11:16:17.7311777Z · ╰── This is the containing effect 2026-10-24T11:16:17.7311901Z 30 │ if (snapshot && snapshot !== live) setHeld({ key, snapshot }); 2026-10-24T11:16:17.7312006Z ·  ───┬─── 2026-10-24T11:16:17.7312236Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.7312310Z 31 │ }, [key, live, snapshot]); 2026-10-24T11:16:17.7312362Z ╰──── 2026-10-24T11:16:17.7312958Z  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-24T11:16:17.7313282Z  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-24T11:16:17.7313285Z 2026-10-24T11:16:17.7313482Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T11:16:17.7313651Z ╭─[apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx:814:17] 2026-10-24T11:16:17.7313718Z 813 │
({ thread, now: Date.now() })); 2026-10-24T11:16:17.7315096Z 698 │ if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() }); 2026-10-24T11:16:17.7315231Z ·  ─────┬──── 2026-10-24T11:16:17.7315415Z · ╰── Cannot call impure function 2026-10-24T11:16:17.7315548Z 699 │ const snoozeGateNow = new Date(snoozeGateClock.now).toISOString(); 2026-10-24T11:16:17.7315599Z ╰──── 2026-10-24T11:16:17.7315879Z  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-24T11:16:17.7316177Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T11:16:17.7316182Z 2026-10-24T11:16:17.7316348Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T11:16:17.7316505Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:719:71] 2026-10-24T11:16:17.7316583Z 718 │ const snoozePresets = useMemo( 2026-10-24T11:16:17.7316760Z 719 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-24T11:16:17.7316892Z ·  ─────┬──── 2026-10-24T11:16:17.7317072Z · ╰── Cannot call impure function 2026-10-24T11:16:17.7317195Z 720 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-24T11:16:17.7317248Z ╰──── 2026-10-24T11:16:17.7317519Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T11:16:17.7317807Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T11:16:17.7317810Z 2026-10-24T11:16:17.7317989Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T11:16:17.7318142Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:720:6] 2026-10-24T11:16:17.7318319Z 719 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-24T11:16:17.7318438Z 720 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-24T11:16:17.7318535Z ·  ────────────┬─────────── 2026-10-24T11:16:17.7318712Z · ╰── Unnecessary dependency `props.snoozePresetMinute` 2026-10-24T11:16:17.7318768Z 721 │ ); 2026-10-24T11:16:17.7318823Z ╰──── 2026-10-24T11:16:17.7319130Z  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-24T11:16:17.7319440Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7319443Z 2026-10-24T11:16:17.7319620Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T11:16:17.7319821Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:766:7] 2026-10-24T11:16:17.7319919Z 765 │ thread.pinnedAt, 2026-10-24T11:16:17.7319982Z 766 │ variant, 2026-10-24T11:16:17.7320055Z ·  ───┬─── 2026-10-24T11:16:17.7320196Z · ╰── Unnecessary dependency `variant` 2026-10-24T11:16:17.7320250Z 767 │ ], 2026-10-24T11:16:17.7320302Z ╰──── 2026-10-24T11:16:17.7320607Z  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-24T11:16:17.7320914Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7320916Z 2026-10-24T11:16:17.7321114Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T11:16:17.7321275Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1216:21] 2026-10-24T11:16:17.7321403Z 1215 │ {providerDrivers.slice(0, -1).map((driver, index) => ( 2026-10-24T11:16:17.7321533Z 1216 │ 2026-10-24T11:16:17.7321652Z ·  ────────────────────────── 2026-10-24T11:16:17.7321765Z 1217 │ 2026-10-24T11:16:17.7321818Z ╰──── 2026-10-24T11:16:17.7321962Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T11:16:17.7321964Z 2026-10-24T11:16:17.7322142Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T11:16:17.7322323Z ╭─[apps/server/src/provider/Drivers/CodexDriver.test.ts:466:14] 2026-10-24T11:16:17.7322379Z 465 │ 2026-10-24T11:16:17.7322484Z 466 │ for (const {} of ["direct", "wrapper"] as const) { 2026-10-24T11:16:17.7322558Z ·  ── 2026-10-24T11:16:17.7322612Z 467 │ } 2026-10-24T11:16:17.7322663Z ╰──── 2026-10-24T11:16:17.7322889Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T11:16:17.7322891Z 2026-10-24T11:16:17.7323151Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:16:17.7323304Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:406:5] 2026-10-24T11:16:17.7323356Z 404 │ 2026-10-24T11:16:17.7323421Z 405 │ useEffect(() => { 2026-10-24T11:16:17.7323500Z ·  ────┬──── 2026-10-24T11:16:17.7323636Z · ╰── This is the containing effect 2026-10-24T11:16:17.7323727Z 406 │ setInspectorSelection((current) => { 2026-10-24T11:16:17.7323815Z ·  ──────────┬────────── 2026-10-24T11:16:17.7323990Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.7324091Z 407 │ if (props.renderInspector === undefined) { 2026-10-24T11:16:17.7324144Z ╰──── 2026-10-24T11:16:17.7324727Z  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-24T11:16:17.7325093Z  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-24T11:16:17.7325123Z 2026-10-24T11:16:17.7325338Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T11:16:17.7325489Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:534:24] 2026-10-24T11:16:17.7325648Z 533 │ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top; 2026-10-24T11:16:17.7325817Z 534 │ ╭─▶ const GitInspector = () => ( 2026-10-24T11:16:17.7325915Z 535 │ │ 2026-10-24T11:16:17.7326539Z 540 │ ╰─▶ ); 2026-10-24T11:16:17.7326619Z 541 │ const FilesInspector = () => 2026-10-24T11:16:17.7326668Z ╰──── 2026-10-24T11:16:17.7326887Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-24T11:16:17.7326889Z 2026-10-24T11:16:17.7327098Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T11:16:17.7327249Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:541:26] 2026-10-24T11:16:17.7327310Z 540 │ ); 2026-10-24T11:16:17.7327480Z 541 │ ╭─▶ const FilesInspector = () => 2026-10-24T11:16:17.7327631Z 542 │ │ selectedThread !== null && selectedThreadCwd !== null ? ( 2026-10-24T11:16:17.7327738Z 543 │ │ 2026-10-24T11:16:17.7328711Z 551 │ ╰─▶ ) : null; 2026-10-24T11:16:17.7328863Z 552 │ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset); 2026-10-24T11:16:17.7328914Z ╰──── 2026-10-24T11:16:17.7329131Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-24T11:16:17.7329134Z 2026-10-24T11:16:17.7329411Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-24T11:16:17.7329537Z ╭─[apps/server/src/provider/AntigravityAuth.ts:285:20] 2026-10-24T11:16:17.7329591Z 284 │ }, 2026-10-24T11:16:17.7329722Z 285 │ (effect, flow, stopSessions) => 2026-10-24T11:16:17.7329845Z ·  ──────┬───── 2026-10-24T11:16:17.7329996Z · ╰── 'stopSessions' is declared here 2026-10-24T11:16:17.7330059Z 286 │ effect.pipe( 2026-10-24T11:16:17.7330111Z ╰──── 2026-10-24T11:16:17.7330212Z  help: Consider removing this parameter. 2026-10-24T11:16:17.7330215Z 2026-10-24T11:16:17.7330407Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T11:16:17.7330576Z ╭─[apps/web/src/components/pullRequest/PullRequestChecksPopover.tsx:88:15] 2026-10-24T11:16:17.7330639Z 87 │
  • { 2026-10-24T11:16:17.7331877Z ·  ────┬──── 2026-10-24T11:16:17.7332015Z · ╰── This is the containing effect 2026-10-24T11:16:17.7332116Z 357 │ if (!isReturningToProjectPicker) { 2026-10-24T11:16:17.7332205Z 358 │ return; 2026-10-24T11:16:17.7332260Z 359 │ } 2026-10-24T11:16:17.7332356Z 360 │ if (requestedInitialProjectAvailable) { 2026-10-24T11:16:17.7332449Z 361 │ setIsReturningToProjectPicker(false); 2026-10-24T11:16:17.7332557Z ·  ──────────────┬────────────── 2026-10-24T11:16:17.7332738Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.7332798Z 362 │ return; 2026-10-24T11:16:17.7332857Z ╰──── 2026-10-24T11:16:17.7333499Z  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-24T11:16:17.7333849Z  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-24T11:16:17.7333851Z 2026-10-24T11:16:17.7334106Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:16:17.7334254Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:504:9] 2026-10-24T11:16:17.7334306Z 447 │ 2026-10-24T11:16:17.7334370Z 448 │ useEffect(() => { 2026-10-24T11:16:17.7334440Z ·  ────┬──── 2026-10-24T11:16:17.7334570Z · ╰── This is the containing effect 2026-10-24T11:16:17.7334676Z 449 │ if (props.pendingTaskId || props.draftId) { 2026-10-24T11:16:17.7334741Z 450 │ return; 2026-10-24T11:16:17.7334796Z 451 │ } 2026-10-24T11:16:17.7334935Z 452 │ if (lastInitialProjectRefRef.current !== props.initialProjectRef) { 2026-10-24T11:16:17.7335069Z 453 │ lastInitialProjectRefRef.current = props.initialProjectRef; 2026-10-24T11:16:17.7335178Z 454 │ appliedInitialProjectKeyRef.current = null; 2026-10-24T11:16:17.7335232Z 455 │ } 2026-10-24T11:16:17.7335370Z 456 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-24T11:16:17.7335498Z 457 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-24T11:16:17.7335602Z 458 │ if (initialEnvironmentId && initialProjectId) { 2026-10-24T11:16:17.7335673Z 459 │ const directProject = 2026-10-24T11:16:17.7335738Z 460 │ projects.find( 2026-10-24T11:16:17.7335810Z 461 │ (project) => 2026-10-24T11:16:17.7335988Z 462 │ project.environmentId === initialEnvironmentId && project.id === initialProjectId, 2026-10-24T11:16:17.7336050Z 463 │ ) ?? null; 2026-10-24T11:16:17.7336099Z 464 │ 2026-10-24T11:16:17.7336168Z 465 │ if (directProject) { 2026-10-24T11:16:17.7336305Z 466 │ // Apply the route's project once. Re-applying on every change would 2026-10-24T11:16:17.7336444Z 467 │ // instantly revert environment/project switches made in the picker. 2026-10-24T11:16:17.7336603Z 468 │ const directProjectKey = `${directProject.environmentId}:${directProject.id}`; 2026-10-24T11:16:17.7336738Z 469 │ if (appliedInitialProjectKeyRef.current === directProjectKey) { 2026-10-24T11:16:17.7336802Z 470 │ return; 2026-10-24T11:16:17.7336862Z 471 │ } 2026-10-24T11:16:17.7336964Z 472 │ if (props.initialProjectRef?.branch) { 2026-10-24T11:16:17.7337029Z 473 │ if ( 2026-10-24T11:16:17.7337171Z 474 │ selectedProject?.environmentId !== directProject.environmentId || 2026-10-24T11:16:17.7337271Z 475 │ selectedProject.id !== directProject.id 2026-10-24T11:16:17.7337329Z 476 │ ) { 2026-10-24T11:16:17.7337415Z 477 │ setProject(directProject); 2026-10-24T11:16:17.7337479Z 478 │ return; 2026-10-24T11:16:17.7337538Z 479 │ } 2026-10-24T11:16:17.7337619Z 480 │ if (!flow.draftKey) return; 2026-10-24T11:16:17.7337757Z 481 │ // The route completes checkout before mounting this composer. Local 2026-10-24T11:16:17.7337900Z 482 │ // mode reuses an existing worktree; worktree mode would create another. 2026-10-24T11:16:17.7338009Z 483 │ updateComposerDraftSettings(flow.draftKey, { 2026-10-24T11:16:17.7338136Z 484 │ workspaceSelection: { 2026-10-24T11:16:17.7338233Z 485 │ mode: "local", 2026-10-24T11:16:17.7338339Z 486 │ branch: props.initialProjectRef.branch, 2026-10-24T11:16:17.7338472Z 487 │ worktreePath: props.initialProjectRef.worktreePath ?? null, 2026-10-24T11:16:17.7338552Z 488 │ startFromOrigin: false, 2026-10-24T11:16:17.7338612Z 489 │ }, 2026-10-24T11:16:17.7338670Z 490 │ }); 2026-10-24T11:16:17.7338727Z 491 │ } 2026-10-24T11:16:17.7338853Z 492 │ appliedInitialProjectKeyRef.current = directProjectKey; 2026-10-24T11:16:17.7338914Z 493 │ if ( 2026-10-24T11:16:17.7339055Z 494 │ selectedProject?.environmentId === directProject.environmentId && 2026-10-24T11:16:17.7339151Z 495 │ selectedProject.id === directProject.id 2026-10-24T11:16:17.7339210Z 496 │ ) { 2026-10-24T11:16:17.7339280Z 497 │ return; 2026-10-24T11:16:17.7339338Z 498 │ } 2026-10-24T11:16:17.7339417Z 499 │ setProject(directProject); 2026-10-24T11:16:17.7339478Z 500 │ return; 2026-10-24T11:16:17.7339535Z 501 │ } 2026-10-24T11:16:17.7339588Z 502 │ 2026-10-24T11:16:17.7339664Z 503 │ if (projects.length > 0) { 2026-10-24T11:16:17.7339760Z 504 │ setIsReturningToProjectPicker(true); 2026-10-24T11:16:17.7339873Z ·  ──────────────┬────────────── 2026-10-24T11:16:17.7340057Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.7340110Z 505 │ } 2026-10-24T11:16:17.7340162Z ╰──── 2026-10-24T11:16:17.7340813Z  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-24T11:16:17.7341139Z  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-24T11:16:17.7341142Z 2026-10-24T11:16:17.7341400Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:16:17.7341553Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:604:5] 2026-10-24T11:16:17.7341607Z 545 │ 2026-10-24T11:16:17.7341673Z 546 │ useEffect(() => { 2026-10-24T11:16:17.7341745Z ·  ────┬──── 2026-10-24T11:16:17.7341878Z · ╰── This is the containing effect 2026-10-24T11:16:17.7341975Z 547 │ const shareId = props.incomingShareId; 2026-10-24T11:16:17.7342055Z 548 │ const draftKey = flow.draftKey; 2026-10-24T11:16:17.7342180Z 549 │ const destinationProject = selectedProject; 2026-10-24T11:16:17.7342319Z 550 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-24T11:16:17.7342447Z 551 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-24T11:16:17.7342536Z 552 │ const selectedProjectMatchesRoute = 2026-10-24T11:16:17.7342612Z 553 │ !initialEnvironmentId || 2026-10-24T11:16:17.7342681Z 554 │ !initialProjectId || 2026-10-24T11:16:17.7342810Z 555 │ (destinationProject?.environmentId === initialEnvironmentId && 2026-10-24T11:16:17.7342917Z 556 │ destinationProject.id === initialProjectId); 2026-10-24T11:16:17.7342973Z 557 │ if ( 2026-10-24T11:16:17.7343100Z 558 │ !shareId || 2026-10-24T11:16:17.7343205Z 559 │ !draftKey || 2026-10-24T11:16:17.7343277Z 560 │ !destinationProject || 2026-10-24T11:16:17.7343361Z 561 │ !selectedProjectMatchesRoute || 2026-10-24T11:16:17.7343453Z 562 │ cancelledIncomingShareId === shareId 2026-10-24T11:16:17.7343509Z 563 │ ) { 2026-10-24T11:16:17.7343569Z 564 │ return; 2026-10-24T11:16:17.7343622Z 565 │ } 2026-10-24T11:16:17.7343718Z 566 │ const importKey = `${shareId}:${draftKey}`; 2026-10-24T11:16:17.7343777Z 567 │ if ( 2026-10-24T11:16:17.7343886Z 568 │ startedShareImportKeyRef.current === importKey || 2026-10-24T11:16:17.7343994Z 569 │ cancellingShareImportKeyRef.current === importKey 2026-10-24T11:16:17.7344049Z 570 │ ) { 2026-10-24T11:16:17.7344108Z 571 │ return; 2026-10-24T11:16:17.7344168Z 572 │ } 2026-10-24T11:16:17.7344222Z 573 │ 2026-10-24T11:16:17.7344290Z 574 │ if (!incomingShare) { 2026-10-24T11:16:17.7344482Z 575 │ if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) { 2026-10-24T11:16:17.7344610Z 576 │ alertedUnavailableIncomingShareIdRef.current = shareId; 2026-10-24T11:16:17.7344674Z 577 │ Dialog.alert( 2026-10-24T11:16:17.7344758Z 578 │ "Shared content unavailable", 2026-10-24T11:16:17.7344931Z 579 │ "The shared content is no longer in the inbox. You can continue editing this task draft.", 2026-10-24T11:16:17.7344988Z 580 │ ); 2026-10-24T11:16:17.7345043Z 581 │ } 2026-10-24T11:16:17.7345102Z 582 │ return; 2026-10-24T11:16:17.7345153Z 583 │ } 2026-10-24T11:16:17.7345203Z 584 │ 2026-10-24T11:16:17.7345258Z 585 │ if ( 2026-10-24T11:16:17.7345423Z 586 │ incomingShare.attachments.some((attachment) => attachment.type === "file") && 2026-10-24T11:16:17.7345527Z 587 │ selectedEnvironmentServerConfig === null 2026-10-24T11:16:17.7345580Z 588 │ ) { 2026-10-24T11:16:17.7345639Z 589 │ return; 2026-10-24T11:16:17.7345693Z 590 │ } 2026-10-24T11:16:17.7345744Z 591 │ 2026-10-24T11:16:17.7345878Z 592 │ if (alertedUnavailableIncomingShareIdRef.current === shareId) { 2026-10-24T11:16:17.7345998Z 593 │ alertedUnavailableIncomingShareIdRef.current = null; 2026-10-24T11:16:17.7346052Z 594 │ } 2026-10-24T11:16:17.7346155Z 595 │ startedShareImportKeyRef.current = importKey; 2026-10-24T11:16:17.7346223Z 596 │ const draftBackup = 2026-10-24T11:16:17.7346408Z 597 │ shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey); 2026-10-24T11:16:17.7346550Z 598 │ shareImportDraftBackupRef.current.set(importKey, draftBackup); 2026-10-24T11:16:17.7346643Z 599 │ const importToken = Symbol(importKey); 2026-10-24T11:16:17.7346718Z 600 │ let didReserveShare = false; 2026-10-24T11:16:17.7346795Z 601 │ let didConsumeShare = false; 2026-10-24T11:16:17.7346875Z 602 │ let needsDraftRestore = false; 2026-10-24T11:16:17.7346983Z 603 │ activeShareImportTokenRef.current = importToken; 2026-10-24T11:16:17.7347067Z 604 │ setImportingShareKey(importKey); 2026-10-24T11:16:17.7347153Z ·  ──────────┬───────── 2026-10-24T11:16:17.7347328Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.7347393Z 605 │ void (async () => { 2026-10-24T11:16:17.7347445Z ╰──── 2026-10-24T11:16:17.7348086Z  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-24T11:16:17.7348435Z  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-24T11:16:17.7348438Z 2026-10-24T11:16:17.7348639Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:16:17.7348788Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:524:5] 2026-10-24T11:16:17.7348865Z 523 │ props.initialProjectRef, 2026-10-24T11:16:17.7348938Z 524 │ props.incomingShareId, 2026-10-24T11:16:17.7349026Z ·  ──────────┬────────── 2026-10-24T11:16:17.7349203Z · ╰── Unnecessary dependency `props.incomingShareId` 2026-10-24T11:16:17.7349276Z 525 │ props.pendingTaskId, 2026-10-24T11:16:17.7349327Z ╰──── 2026-10-24T11:16:17.7349616Z  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-24T11:16:17.7349924Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7349927Z 2026-10-24T11:16:17.7350137Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T11:16:17.7350286Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:543:5] 2026-10-24T11:16:17.7350403Z 542 │ loadedBranchesProjectKeyRef.current = projectKey; 2026-10-24T11:16:17.7350473Z 543 │ flow.loadBranches(); 2026-10-24T11:16:17.7350540Z ·  ──┬─ 2026-10-24T11:16:17.7350672Z · ╰── Missing dependency `flow` 2026-10-24T11:16:17.7350766Z 544 │ }, [flow.loadBranches, selectedProject]); 2026-10-24T11:16:17.7350850Z ·  ────────┬──────── 2026-10-24T11:16:17.7351047Z · ╰── Overly precise dependency `flow.loadBranches`, use `flow` instead 2026-10-24T11:16:17.7351098Z 545 │ 2026-10-24T11:16:17.7351150Z ╰──── 2026-10-24T11:16:17.7351562Z  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-24T11:16:17.7351874Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7351882Z 2026-10-24T11:16:17.7352089Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:16:17.7352267Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:766:5] 2026-10-24T11:16:17.7352331Z 765 │ flow.draftKey, 2026-10-24T11:16:17.7352406Z 766 │ hasImportedIncomingShare, 2026-10-24T11:16:17.7352497Z ·  ────────────┬─────────── 2026-10-24T11:16:17.7352673Z · ╰── Unnecessary dependency `hasImportedIncomingShare` 2026-10-24T11:16:17.7352737Z 767 │ incomingShare, 2026-10-24T11:16:17.7352817Z 768 │ isIncomingShareInboxLoading, 2026-10-24T11:16:17.7352965Z ·  ─────────────┬───────────── 2026-10-24T11:16:17.7353178Z · ╰── Unnecessary dependency `isIncomingShareInboxLoading` 2026-10-24T11:16:17.7353258Z 769 │ isIncomingShareUnavailable, 2026-10-24T11:16:17.7353330Z 770 │ props.incomingShareId, 2026-10-24T11:16:17.7353422Z 771 │ props.initialProjectRef?.environmentId, 2026-10-24T11:16:17.7353511Z 772 │ props.initialProjectRef?.projectId, 2026-10-24T11:16:17.7353585Z 773 │ releaseShareReservation, 2026-10-24T11:16:17.7353649Z 774 │ reserveShare, 2026-10-24T11:16:17.7353733Z 775 │ selectedEnvironmentServerConfig, 2026-10-24T11:16:17.7353800Z 776 │ selectedProject, 2026-10-24T11:16:17.7353868Z 777 │ shareImportAttempt, 2026-10-24T11:16:17.7353953Z ·  ─────────┬──────── 2026-10-24T11:16:17.7354126Z · ╰── Unnecessary dependency `shareImportAttempt` 2026-10-24T11:16:17.7354184Z 778 │ ]); 2026-10-24T11:16:17.7354236Z ╰──── 2026-10-24T11:16:17.7354523Z  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-24T11:16:17.7354828Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7354831Z 2026-10-24T11:16:17.7355075Z ⚠ eslint(no-unused-vars): Function 'normalizeTerminalContextSelection' is declared but never used. 2026-10-24T11:16:17.7355187Z ╭─[apps/web/src/lib/terminalContext.ts:56:10] 2026-10-24T11:16:17.7355238Z 55 │ 2026-10-24T11:16:17.7355339Z 56 │ function normalizeTerminalContextSelection( 2026-10-24T11:16:17.7355456Z ·  ────────────────┬──────────────── 2026-10-24T11:16:17.7355648Z · ╰── 'normalizeTerminalContextSelection' is declared here 2026-10-24T11:16:17.7355735Z 57 │ selection: TerminalContextSelection, 2026-10-24T11:16:17.7355786Z ╰──── 2026-10-24T11:16:17.7355892Z  help: Consider removing this declaration. 2026-10-24T11:16:17.7355895Z 2026-10-24T11:16:17.7356346Z ⚠ 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-24T11:16:17.7356483Z ╭─[packages/contracts/src/composerContext.test.ts:181:18] 2026-10-24T11:16:17.7356665Z 180 │ it("sends a message without the records the wire cannot carry", () => { 2026-10-24T11:16:17.7356952Z 181 │ const wire = Schema.encodeUnknownSync(Schema.toCodecJson(OrchestrationMessageContext))({ 2026-10-24T11:16:17.7357061Z ·  ──────────────────────── 2026-10-24T11:16:17.7357126Z 182 │ version: 1, 2026-10-24T11:16:17.7357179Z ╰──── 2026-10-24T11:16:17.7357184Z 2026-10-24T11:16:17.7357437Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:16:17.7357599Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-24T11:16:17.7357662Z 259 │ .join("|"); 2026-10-24T11:16:17.7357726Z 260 │ useEffect(() => { 2026-10-24T11:16:17.7357797Z ·  ────┬──── 2026-10-24T11:16:17.7357936Z · ╰── This is the containing effect 2026-10-24T11:16:17.7358000Z 261 │ stop(); 2026-10-24T11:16:17.7358066Z ·  ──┬─ 2026-10-24T11:16:17.7358233Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.7358297Z 262 │ }, [orderVersion]); 2026-10-24T11:16:17.7358348Z ╰──── 2026-10-24T11:16:17.7358934Z  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-24T11:16:17.7359251Z  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-24T11:16:17.7359257Z 2026-10-24T11:16:17.7359471Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T11:16:17.7359630Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-24T11:16:17.7359694Z 260 │ useEffect(() => { 2026-10-24T11:16:17.7359752Z 261 │ stop(); 2026-10-24T11:16:17.7359820Z ·  ──┬─ 2026-10-24T11:16:17.7359946Z · ╰── Missing dependency `stop` 2026-10-24T11:16:17.7360011Z 262 │ }, [orderVersion]); 2026-10-24T11:16:17.7360089Z ·  ──────┬───── 2026-10-24T11:16:17.7360239Z · ╰── Unnecessary dependency `orderVersion` 2026-10-24T11:16:17.7360301Z 263 │ useEffect( 2026-10-24T11:16:17.7360352Z ╰──── 2026-10-24T11:16:17.7360768Z  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-24T11:16:17.7361076Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7361078Z 2026-10-24T11:16:17.7361224Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.7361381Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9] 2026-10-24T11:16:17.7361457Z 95 │ const latest = useRef(props); 2026-10-24T11:16:17.7361524Z 96 │ latest.current = props; 2026-10-24T11:16:17.7361630Z ·  ───┬──────┬─── 2026-10-24T11:16:17.7361862Z · │ ╰── Cannot update ref value during render 2026-10-24T11:16:17.7362005Z · ╰── This value is a ref 2026-10-24T11:16:17.7362083Z 97 │ const gesture = useMemo( 2026-10-24T11:16:17.7362134Z ╰──── 2026-10-24T11:16:17.7362625Z  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-24T11:16:17.7362914Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.7362917Z 2026-10-24T11:16:17.7363060Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.7363222Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18] 2026-10-24T11:16:17.7363291Z 103 │ .runOnJS(true) 2026-10-24T11:16:17.7363393Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T11:16:17.7363512Z ·  ───────────────┬────────────── 2026-10-24T11:16:17.7363710Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T11:16:17.7363843Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T11:16:17.7363894Z ╰──── 2026-10-24T11:16:17.7364358Z  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-24T11:16:17.7364644Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.7364649Z 2026-10-24T11:16:17.7364791Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.7364950Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19] 2026-10-24T11:16:17.7365047Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T11:16:17.7365178Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T11:16:17.7365328Z ·  ──────────────────────────┬───────────────────────── 2026-10-24T11:16:17.7365545Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T11:16:17.7365676Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T11:16:17.7365730Z ╰──── 2026-10-24T11:16:17.7366183Z  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-24T11:16:17.7366470Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.7366473Z 2026-10-24T11:16:17.7366615Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.7366773Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16] 2026-10-24T11:16:17.7366945Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T11:16:17.7367099Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T11:16:17.7367250Z ·  ──────────────────────────┬───────────────────────── 2026-10-24T11:16:17.7367456Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T11:16:17.7367579Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T11:16:17.7367629Z ╰──── 2026-10-24T11:16:17.7368088Z  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-24T11:16:17.7368381Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.7368386Z 2026-10-24T11:16:17.7368529Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.7368685Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21] 2026-10-24T11:16:17.7368804Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T11:16:17.7368926Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T11:16:17.7369071Z ·  ───────────────────────┬────────────────────── 2026-10-24T11:16:17.7369279Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T11:16:17.7369346Z 108 │ [props.disabled], 2026-10-24T11:16:17.7369403Z ╰──── 2026-10-24T11:16:17.7369860Z  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-24T11:16:17.7370146Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.7370148Z 2026-10-24T11:16:17.7370290Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.7370446Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:249:9] 2026-10-24T11:16:17.7370560Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-24T11:16:17.7370668Z 249 │ latest.current = { rows, planners, moveThread }; 2026-10-24T11:16:17.7370775Z ·  ───┬──────┬─── 2026-10-24T11:16:17.7370958Z · │ ╰── Cannot update ref value during render 2026-10-24T11:16:17.7371075Z · ╰── This value is a ref 2026-10-24T11:16:17.7371128Z 250 │ 2026-10-24T11:16:17.7371179Z ╰──── 2026-10-24T11:16:17.7371631Z  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-24T11:16:17.7371917Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.7371919Z 2026-10-24T11:16:17.7372117Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.7372413Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:247:22] 2026-10-24T11:16:17.7372536Z 246 │ const [preview, setPreview] = useState(null); 2026-10-24T11:16:17.7372648Z 247 │ const translateY = useRef(new Animated.Value(0)).current; 2026-10-24T11:16:17.7372777Z ·  ──────────────────┬────────────────── 2026-10-24T11:16:17.7372946Z · ╰── Cannot access ref value during render 2026-10-24T11:16:17.7373055Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-24T11:16:17.7373105Z ╰──── 2026-10-24T11:16:17.7373566Z  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-24T11:16:17.7373853Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.7373855Z 2026-10-24T11:16:17.7374023Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T11:16:17.7374183Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:324:16] 2026-10-24T11:16:17.7374246Z 323 │ update(0); 2026-10-24T11:16:17.7374327Z 324 │ let last = performance.now(); 2026-10-24T11:16:17.7374424Z ·  ────────┬──────── 2026-10-24T11:16:17.7374571Z · ╰── Cannot call impure function 2026-10-24T11:16:17.7374640Z 325 │ const tick = () => { 2026-10-24T11:16:17.7374692Z ╰──── 2026-10-24T11:16:17.7374988Z  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-24T11:16:17.7375279Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T11:16:17.7375281Z 2026-10-24T11:16:17.7375465Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T11:16:17.7375621Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15] 2026-10-24T11:16:17.7375682Z  98 │ () => 2026-10-24T11:16:17.7375748Z  99 │ Gesture.Pan() 2026-10-24T11:16:17.7375873Z ·  ─┬─ 2026-10-24T11:16:17.7376033Z · ╰── `Pan` may be a component 2026-10-24T11:16:17.7376114Z 100 │ .enabled(!props.disabled) 2026-10-24T11:16:17.7376165Z ╰──── 2026-10-24T11:16:17.7376432Z  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-24T11:16:17.7376872Z  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-24T11:16:17.7376875Z 2026-10-24T11:16:17.7377063Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T11:16:17.7377226Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5] 2026-10-24T11:16:17.7377293Z 103 │ .runOnJS(true) 2026-10-24T11:16:17.7377389Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T11:16:17.7377477Z ·  ───┬── 2026-10-24T11:16:17.7377906Z · ╰── 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-24T11:16:17.7378038Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T11:16:17.7378158Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T11:16:17.7378280Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T11:16:17.7378347Z 108 │ [props.disabled], 2026-10-24T11:16:17.7378436Z ·  ────────┬─────── 2026-10-24T11:16:17.7378625Z · ╰── This dependency list is missing values used by the callback 2026-10-24T11:16:17.7378682Z 109 │ ); 2026-10-24T11:16:17.7378733Z ╰──── 2026-10-24T11:16:17.7378935Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T11:16:17.7379241Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7379246Z 2026-10-24T11:16:17.7379454Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T11:16:17.7379584Z ╭─[apps/web/src/lib/composerContextReferences.ts:90:40] 2026-10-24T11:16:17.7379661Z 89 │ let cursor = prompt.length; 2026-10-24T11:16:17.7379770Z 90 │ for (const occurrence of occurrences.reverse()) { 2026-10-24T11:16:17.7379872Z ·  ─────── 2026-10-24T11:16:17.7379952Z 91 │ let { start, end } = occurrence; 2026-10-24T11:16:17.7380003Z ╰──── 2026-10-24T11:16:17.7380260Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T11:16:17.7380262Z 2026-10-24T11:16:17.7380516Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:16:17.7380699Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2145:5] 2026-10-24T11:16:17.7380755Z 2143 │ ); 2026-10-24T11:16:17.7380823Z 2144 │ useEffect(() => { 2026-10-24T11:16:17.7380958Z ·  ────┬──── 2026-10-24T11:16:17.7381129Z · ╰── This is the containing effect 2026-10-24T11:16:17.7381203Z 2145 │ setExpandedVideo(null); 2026-10-24T11:16:17.7381285Z ·  ────────┬─────── 2026-10-24T11:16:17.7381456Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.7381529Z 2146 │ setExpandedFile(null); 2026-10-24T11:16:17.7381580Z ╰──── 2026-10-24T11:16:17.7382219Z  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-24T11:16:17.7382543Z  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-24T11:16:17.7382548Z 2026-10-24T11:16:17.7382800Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:16:17.7382936Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2646:9] 2026-10-24T11:16:17.7383073Z 2637 │ const stopFollowingEnd = useEffectEvent(() => setEndFollow(false)); 2026-10-24T11:16:17.7383138Z 2638 │ useEffect(() => { 2026-10-24T11:16:17.7383209Z ·  ────┬──── 2026-10-24T11:16:17.7383342Z · ╰── This is the containing effect 2026-10-24T11:16:17.7383469Z 2639 │ if (!jumpToMessageId || loadedListKey !== listMountKey) return; 2026-10-24T11:16:17.7383570Z 2640 │ const index = presentedFeed.findIndex( 2026-10-24T11:16:17.7383705Z 2641 │ (entry) => entry.type === "message" && entry.id === jumpToMessageId, 2026-10-24T11:16:17.7383762Z 2642 │ ); 2026-10-24T11:16:17.7383832Z 2643 │ if (index === -1) { 2026-10-24T11:16:17.7383958Z 2644 │ const runId = messageFoldRunId(props.feed, jumpToMessageId); 2026-10-24T11:16:17.7384058Z 2645 │ if (runId && !expandedTurnIds.has(runId)) { 2026-10-24T11:16:17.7384153Z 2646 │ setInteractionState((current) => ({ 2026-10-24T11:16:17.7384243Z ·  ─────────┬───────── 2026-10-24T11:16:17.7384421Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.7384485Z 2647 │ ...current, 2026-10-24T11:16:17.7384538Z ╰──── 2026-10-24T11:16:17.7385130Z  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-24T11:16:17.7385451Z  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-24T11:16:17.7385453Z 2026-10-24T11:16:17.7385679Z ⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used. 2026-10-24T11:16:17.7385808Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:66:10] 2026-10-24T11:16:17.7385945Z 65 │ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets"; 2026-10-24T11:16:17.7386135Z 66 │ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks"; 2026-10-24T11:16:17.7386270Z ·  ───────────┬─────────── 2026-10-24T11:16:17.7386437Z · ╰── 'isMarkdownFileLinkLabel' is imported here 2026-10-24T11:16:17.7386595Z 67 │ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments"; 2026-10-24T11:16:17.7386648Z ╰──── 2026-10-24T11:16:17.7386744Z  help: Consider removing this import. 2026-10-24T11:16:17.7386747Z 2026-10-24T11:16:17.7386952Z ⚠ eslint(no-unused-vars): Identifier 'createContext' is imported but never used. 2026-10-24T11:16:17.7387083Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:92:3] 2026-10-24T11:16:17.7387140Z 91 │ import { 2026-10-24T11:16:17.7387204Z 92 │ createContext, 2026-10-24T11:16:17.7387279Z ·  ──────┬────── 2026-10-24T11:16:17.7387423Z · ╰── 'createContext' is imported here 2026-10-24T11:16:17.7387482Z 93 │ memo, 2026-10-24T11:16:17.7387532Z ╰──── 2026-10-24T11:16:17.7387627Z  help: Consider removing this import. 2026-10-24T11:16:17.7387629Z 2026-10-24T11:16:17.7387839Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-24T11:16:17.7387972Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:108:3] 2026-10-24T11:16:17.7388031Z 107 │ import { 2026-10-24T11:16:17.7388100Z 108 │ ActivityIndicator, 2026-10-24T11:16:17.7388183Z ·  ────────┬──────── 2026-10-24T11:16:17.7388331Z · ╰── 'ActivityIndicator' is imported here 2026-10-24T11:16:17.7388388Z 109 │ Image, 2026-10-24T11:16:17.7388437Z ╰──── 2026-10-24T11:16:17.7388538Z  help: Consider removing this import. 2026-10-24T11:16:17.7388543Z 2026-10-24T11:16:17.7388741Z ⚠ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used. 2026-10-24T11:16:17.7388874Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:115:3] 2026-10-24T11:16:17.7388933Z 114 │ Pressable, 2026-10-24T11:16:17.7388996Z 115 │ ScrollView, 2026-10-24T11:16:17.7389070Z ·  ─────┬──── 2026-10-24T11:16:17.7389202Z · ╰── 'ScrollView' is imported here 2026-10-24T11:16:17.7389262Z 116 │ StyleSheet, 2026-10-24T11:16:17.7389313Z ╰──── 2026-10-24T11:16:17.7389409Z  help: Consider removing this import. 2026-10-24T11:16:17.7389412Z 2026-10-24T11:16:17.7389614Z ⚠ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used. 2026-10-24T11:16:17.7389747Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:117:11] 2026-10-24T11:16:17.7389808Z 116 │ StyleSheet, 2026-10-24T11:16:17.7389875Z 117 │ Text as NativeText, 2026-10-24T11:16:17.7389955Z ·  ─────┬──── 2026-10-24T11:16:17.7390091Z · ╰── 'NativeText' is imported here 2026-10-24T11:16:17.7390157Z 118 │ type ColorValue, 2026-10-24T11:16:17.7390208Z ╰──── 2026-10-24T11:16:17.7390303Z  help: Consider removing this import. 2026-10-24T11:16:17.7390305Z 2026-10-24T11:16:17.7390516Z ⚠ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used. 2026-10-24T11:16:17.7390648Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:140:10] 2026-10-24T11:16:17.7390839Z 139 │ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic"; 2026-10-24T11:16:17.7390995Z 140 │ import { tryOpenExternalUrl } from "../../lib/openExternalUrl"; 2026-10-24T11:16:17.7391083Z ·  ─────────┬──────── 2026-10-24T11:16:17.7391237Z · ╰── 'tryOpenExternalUrl' is imported here 2026-10-24T11:16:17.7391384Z 141 │ import { downloadAndShareAttachment } from "../../lib/attachmentDownload"; 2026-10-24T11:16:17.7391435Z ╰──── 2026-10-24T11:16:17.7391528Z  help: Consider removing this import. 2026-10-24T11:16:17.7391532Z 2026-10-24T11:16:17.7391747Z ⚠ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used. 2026-10-24T11:16:17.7391881Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:143:10] 2026-10-24T11:16:17.7392018Z 142 │ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks"; 2026-10-24T11:16:17.7392162Z 143 │ import { faviconUrlForOrigin } from "@t3tools/shared/favicon"; 2026-10-24T11:16:17.7392289Z ·  ─────────┬───────── 2026-10-24T11:16:17.7392449Z · ╰── 'faviconUrlForOrigin' is imported here 2026-10-24T11:16:17.7392508Z 144 │ import { 2026-10-24T11:16:17.7392558Z ╰──── 2026-10-24T11:16:17.7392650Z  help: Consider removing this import. 2026-10-24T11:16:17.7392652Z 2026-10-24T11:16:17.7392863Z ⚠ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used. 2026-10-24T11:16:17.7392995Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:157:10] 2026-10-24T11:16:17.7393145Z 156 │ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile"; 2026-10-24T11:16:17.7393279Z 157 │ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer"; 2026-10-24T11:16:17.7393366Z ·  ────────┬─────── 2026-10-24T11:16:17.7393517Z · ╰── 'MediaVideoPlayer' is imported here 2026-10-24T11:16:17.7393655Z 158 │ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia"; 2026-10-24T11:16:17.7393705Z ╰──── 2026-10-24T11:16:17.7393799Z  help: Consider removing this import. 2026-10-24T11:16:17.7393802Z 2026-10-24T11:16:17.7394020Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used. 2026-10-24T11:16:17.7394150Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:161:3] 2026-10-24T11:16:17.7394229Z 160 │ attachmentVideoPreviewSource, 2026-10-24T11:16:17.7394306Z 161 │ mediaVideoPreviewUri, 2026-10-24T11:16:17.7394394Z ·  ──────────┬───────── 2026-10-24T11:16:17.7394547Z · ╰── 'mediaVideoPreviewUri' is imported here 2026-10-24T11:16:17.7394616Z 162 │ mediaVideoThumbnailKey, 2026-10-24T11:16:17.7394668Z ╰──── 2026-10-24T11:16:17.7394762Z  help: Consider removing this import. 2026-10-24T11:16:17.7394764Z 2026-10-24T11:16:17.7394983Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used. 2026-10-24T11:16:17.7395112Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:162:3] 2026-10-24T11:16:17.7395182Z 161 │ mediaVideoPreviewUri, 2026-10-24T11:16:17.7395251Z 162 │ mediaVideoThumbnailKey, 2026-10-24T11:16:17.7395339Z ·  ───────────┬────────── 2026-10-24T11:16:17.7395550Z · ╰── 'mediaVideoThumbnailKey' is imported here 2026-10-24T11:16:17.7395662Z 163 │ type MediaVideoPreviewSource, 2026-10-24T11:16:17.7395713Z ╰──── 2026-10-24T11:16:17.7395807Z  help: Consider removing this import. 2026-10-24T11:16:17.7395809Z 2026-10-24T11:16:17.7396019Z ⚠ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used. 2026-10-24T11:16:17.7396147Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:163:8] 2026-10-24T11:16:17.7396219Z 162 │ mediaVideoThumbnailKey, 2026-10-24T11:16:17.7396299Z 163 │ type MediaVideoPreviewSource, 2026-10-24T11:16:17.7396394Z ·  ───────────┬─────────── 2026-10-24T11:16:17.7396554Z · ╰── 'MediaVideoPreviewSource' is imported here 2026-10-24T11:16:17.7396644Z 164 │ } from "../../lib/videoPreviewSource"; 2026-10-24T11:16:17.7396699Z ╰──── 2026-10-24T11:16:17.7396790Z  help: Consider removing this import. 2026-10-24T11:16:17.7396794Z 2026-10-24T11:16:17.7396990Z ⚠ eslint(no-unused-vars): Type 'ReviewDiffTheme' is imported but never used. 2026-10-24T11:16:17.7397122Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:171:15] 2026-10-24T11:16:17.7397296Z 170 │ import { parseReviewCommentMessageSegments } from "../review/reviewCommentSelection"; 2026-10-24T11:16:17.7397434Z 171 │ import type { ReviewDiffTheme } from "../review/shikiReviewHighlighter"; 2026-10-24T11:16:17.7397523Z ·  ───────┬─────── 2026-10-24T11:16:17.7397676Z · ╰── 'ReviewDiffTheme' is imported here 2026-10-24T11:16:17.7397740Z 172 │ import { 2026-10-24T11:16:17.7397793Z ╰──── 2026-10-24T11:16:17.7397884Z  help: Consider removing this import. 2026-10-24T11:16:17.7397887Z 2026-10-24T11:16:17.7398118Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used. 2026-10-24T11:16:17.7398249Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:186:3] 2026-10-24T11:16:17.7398307Z 185 │ import { 2026-10-24T11:16:17.7398379Z 186 │ resolveMarkdownFontSizes, 2026-10-24T11:16:17.7398469Z ·  ────────────┬─────────── 2026-10-24T11:16:17.7398630Z · ╰── 'resolveMarkdownFontSizes' is imported here 2026-10-24T11:16:17.7398716Z 187 │ resolveNativeMarkdownTypography, 2026-10-24T11:16:17.7398766Z ╰──── 2026-10-24T11:16:17.7398861Z  help: Consider removing this import. 2026-10-24T11:16:17.7398913Z 2026-10-24T11:16:17.7399166Z ⚠ eslint(no-unused-vars): Identifier 'markdownLinkIconSource' is imported but never used. 2026-10-24T11:16:17.7399297Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:191:10] 2026-10-24T11:16:17.7399427Z 190 │ import { PierreEntryIcon } from "../../components/PierreEntryIcon"; 2026-10-24T11:16:17.7399561Z 191 │ import { markdownLinkIconSource } from "../../lib/markdownLinkIcons"; 2026-10-24T11:16:17.7399657Z ·  ───────────┬────────── 2026-10-24T11:16:17.7399820Z · ╰── 'markdownLinkIconSource' is imported here 2026-10-24T11:16:17.7399875Z 192 │ import { 2026-10-24T11:16:17.7399926Z ╰──── 2026-10-24T11:16:17.7400019Z  help: Consider removing this import. 2026-10-24T11:16:17.7400021Z 2026-10-24T11:16:17.7400281Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used. 2026-10-24T11:16:17.7400413Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:194:3] 2026-10-24T11:16:17.7400492Z 193 │ normalizeNativeMarkdownUrl, 2026-10-24T11:16:17.7400585Z 194 │ resolveMarkdownInlineCodePresentation, 2026-10-24T11:16:17.7400700Z ·  ──────────────────┬────────────────── 2026-10-24T11:16:17.7400894Z · ╰── 'resolveMarkdownInlineCodePresentation' is imported here 2026-10-24T11:16:17.7400967Z 195 │ resolveMarkdownLinkIcon, 2026-10-24T11:16:17.7401018Z ╰──── 2026-10-24T11:16:17.7401111Z  help: Consider removing this import. 2026-10-24T11:16:17.7401113Z 2026-10-24T11:16:17.7401341Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownLinkIcon' is imported but never used. 2026-10-24T11:16:17.7401473Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:195:3] 2026-10-24T11:16:17.7401567Z 194 │ resolveMarkdownInlineCodePresentation, 2026-10-24T11:16:17.7401639Z 195 │ resolveMarkdownLinkIcon, 2026-10-24T11:16:17.7401730Z ·  ───────────┬─────────── 2026-10-24T11:16:17.7401887Z · ╰── 'resolveMarkdownLinkIcon' is imported here 2026-10-24T11:16:17.7401975Z 196 │ resolveMarkdownLinkPresentation, 2026-10-24T11:16:17.7402026Z ╰──── 2026-10-24T11:16:17.7402129Z  help: Consider removing this import. 2026-10-24T11:16:17.7402132Z 2026-10-24T11:16:17.7402382Z ⚠ eslint(no-unused-vars): Identifier 'useMarkdownCodeHighlight' is imported but never used. 2026-10-24T11:16:17.7402520Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:235:10] 2026-10-24T11:16:17.7402626Z 234 │ import { ThreadMcpApp } from "./McpAppWebView"; 2026-10-24T11:16:17.7402770Z 235 │ import { useMarkdownCodeHighlight } from "./markdownCodeHighlightState"; 2026-10-24T11:16:17.7402870Z ·  ────────────┬─────────── 2026-10-24T11:16:17.7403039Z · ╰── 'useMarkdownCodeHighlight' is imported here 2026-10-24T11:16:17.7403098Z 236 │ import { 2026-10-24T11:16:17.7403150Z ╰──── 2026-10-24T11:16:17.7403243Z  help: Consider removing this import. 2026-10-24T11:16:17.7403246Z 2026-10-24T11:16:17.7403455Z ⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used. 2026-10-24T11:16:17.7403586Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:239:3] 2026-10-24T11:16:17.7403704Z 238 │ useAssetUrl, 2026-10-24T11:16:17.7403800Z 239 │ useAssetUrlState, 2026-10-24T11:16:17.7403881Z ·  ────────┬─────── 2026-10-24T11:16:17.7404025Z · ╰── 'useAssetUrlState' is imported here 2026-10-24T11:16:17.7404092Z 240 │ useRefreshAssetUrl, 2026-10-24T11:16:17.7404141Z ╰──── 2026-10-24T11:16:17.7404235Z  help: Consider removing this import. 2026-10-24T11:16:17.7404237Z 2026-10-24T11:16:17.7404436Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:16:17.7404573Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2147:7] 2026-10-24T11:16:17.7404645Z 2146 │ setExpandedFile(null); 2026-10-24T11:16:17.7404803Z 2147 │ }, [props.environmentId, props.threadId, props.contentPresentation.kind]); 2026-10-24T11:16:17.7405057Z ·  ─────────┬───────── ───────┬────── ───────────────┬────────────── 2026-10-24T11:16:17.7405358Z · │ │ ╰── Unnecessary dependency `props.contentPresentation.kind` 2026-10-24T11:16:17.7405561Z · │ ╰── Unnecessary dependency `props.threadId` 2026-10-24T11:16:17.7405725Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-24T11:16:17.7405866Z 2148 │ const horizontalPadding = props.layoutVariant === "split" ? 20 : 16; 2026-10-24T11:16:17.7405918Z ╰──── 2026-10-24T11:16:17.7406217Z  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-24T11:16:17.7406528Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7406530Z 2026-10-24T11:16:17.7406731Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:16:17.7406866Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2615:7] 2026-10-24T11:16:17.7406962Z 2614 │ reportHeaderMaterialVisibility(false); 2026-10-24T11:16:17.7407075Z 2615 │ }, [feedThreadKey, reportHeaderMaterialVisibility]); 2026-10-24T11:16:17.7407158Z ·  ──────┬────── 2026-10-24T11:16:17.7407310Z · ╰── Unnecessary dependency `feedThreadKey` 2026-10-24T11:16:17.7407370Z 2616 │ 2026-10-24T11:16:17.7407423Z ╰──── 2026-10-24T11:16:17.7407710Z  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-24T11:16:17.7408017Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7408019Z 2026-10-24T11:16:17.7408218Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:16:17.7408355Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2631:7] 2026-10-24T11:16:17.7408410Z 2630 │ } 2026-10-24T11:16:17.7408541Z 2631 │ }, [listMountKey, props.contentInsetEndAdjustment, listRef]); 2026-10-24T11:16:17.7408620Z ·  ──────┬───── 2026-10-24T11:16:17.7408818Z · ╰── Unnecessary dependency `listMountKey` 2026-10-24T11:16:17.7408987Z 2632 │ // Opening at a message: its run unfolds, the list stops following the end 2026-10-24T11:16:17.7409040Z ╰──── 2026-10-24T11:16:17.7409325Z  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-24T11:16:17.7409628Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7409630Z 2026-10-24T11:16:17.7409828Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:16:17.7409965Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2827:7] 2026-10-24T11:16:17.7410024Z 2826 │ } 2026-10-24T11:16:17.7410207Z 2827 │ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]); 2026-10-24T11:16:17.7410422Z ·  ───────┬─────── ─────────┬──────── ────────┬─────── 2026-10-24T11:16:17.7410675Z · │ │ ╰── Unnecessary dependency `expandedWorkRows` 2026-10-24T11:16:17.7410883Z · │ ╰── Unnecessary dependency `expandedWorkGroups` 2026-10-24T11:16:17.7411039Z · ╰── Unnecessary dependency `expandedTurnIds` 2026-10-24T11:16:17.7411092Z 2828 │ 2026-10-24T11:16:17.7411142Z ╰──── 2026-10-24T11:16:17.7411438Z  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-24T11:16:17.7411746Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7411748Z 2026-10-24T11:16:17.7411928Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T11:16:17.7412061Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:619:9] 2026-10-24T11:16:17.7412146Z 618 │ }; 2026-10-24T11:16:17.7412261Z 619 │ }, [props.environmentId, attachment.id, httpBaseUrl]), 2026-10-24T11:16:17.7412464Z ·  ─────────┬───────── ──────┬────── ─────┬───── 2026-10-24T11:16:17.7412751Z · │ │ ╰── Unnecessary dependency `httpBaseUrl` 2026-10-24T11:16:17.7412976Z · │ ╰── Unnecessary dependency `attachment.id` 2026-10-24T11:16:17.7413142Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-24T11:16:17.7413199Z 620 │ ); 2026-10-24T11:16:17.7413253Z ╰──── 2026-10-24T11:16:17.7413559Z  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-24T11:16:17.7413869Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7413874Z 2026-10-24T11:16:17.7414074Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-24T11:16:17.7414199Z ╭─[apps/web/src/contextMenuFallback.test.ts:38:9] 2026-10-24T11:16:17.7414265Z 37 │ get isConnected() { 2026-10-24T11:16:17.7414356Z 38 │ let current: FakeElement | null = this; 2026-10-24T11:16:17.7414431Z ·  ─────── 2026-10-24T11:16:17.7414504Z 39 │ while (current?.parent) { 2026-10-24T11:16:17.7414558Z ╰──── 2026-10-24T11:16:17.7414825Z  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-24T11:16:17.7414827Z 2026-10-24T11:16:17.7415034Z ⚠ eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used. 2026-10-24T11:16:17.7415131Z ╭─[apps/web/src/types.ts:22:3] 2026-10-24T11:16:17.7415203Z 21 │ EnvironmentThreadShell, 2026-10-24T11:16:17.7415266Z 22 │ ThreadRunSummary, 2026-10-24T11:16:17.7415345Z ·  ────────┬─────── 2026-10-24T11:16:17.7416961Z · ╰── 'ThreadRunSummary' is imported here 2026-10-24T11:16:17.7417041Z 23 │ ThreadRuntimeSummary, 2026-10-24T11:16:17.7417092Z ╰──── 2026-10-24T11:16:17.7417189Z  help: Consider removing this import. 2026-10-24T11:16:17.7417192Z 2026-10-24T11:16:17.7417658Z ⚠ 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-24T11:16:17.7417800Z ╭─[apps/server/src/project/ProjectService.test.ts:94:3] 2026-10-24T11:16:17.7417857Z 93 │ ) { 2026-10-24T11:16:17.7418062Z 94 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T11:16:17.7418238Z 95 │ │ const project = Option.getOrThrow(yield* service.getById(projectId)); 2026-10-24T11:16:17.7418361Z 96 │ │ if (predicate(project)) return project; 2026-10-24T11:16:17.7418461Z 97 │ │ yield* Effect.yieldNow; 2026-10-24T11:16:17.7418586Z 98 │ ╰─▶ } 2026-10-24T11:16:17.7418736Z 99 │ return yield* Effect.die(`Project ${projectId} was not enriched in time.`); 2026-10-24T11:16:17.7418787Z ╰──── 2026-10-24T11:16:17.7418790Z 2026-10-24T11:16:17.7419032Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T11:16:17.7419218Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:372:47] 2026-10-24T11:16:17.7419348Z 371 │ const { open, onOpenChange, onSnooze, timestampFormat } = props; 2026-10-24T11:16:17.7419500Z 372 │ const presets = open ? resolveSnoozePresets(new Date(), timestampFormat) : []; 2026-10-24T11:16:17.7419617Z ·  ─────┬──── 2026-10-24T11:16:17.7419777Z · ╰── Cannot call impure function 2026-10-24T11:16:17.7419836Z 373 │ return ( 2026-10-24T11:16:17.7419888Z ╰──── 2026-10-24T11:16:17.7420163Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T11:16:17.7420461Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T11:16:17.7420466Z 2026-10-24T11:16:17.7420858Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T11:16:17.7421005Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:853:39] 2026-10-24T11:16:17.7421098Z 852 │ if (snoozeGateClock.thread !== thread) { 2026-10-24T11:16:17.7421225Z 853 │ setSnoozeGateClock({ thread, now: new Date().toISOString() }); 2026-10-24T11:16:17.7421334Z ·  ─────┬──── 2026-10-24T11:16:17.7421492Z · ╰── Cannot call impure function 2026-10-24T11:16:17.7421546Z 854 │ } 2026-10-24T11:16:17.7421597Z ╰──── 2026-10-24T11:16:17.7421871Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T11:16:17.7422198Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T11:16:17.7422201Z 2026-10-24T11:16:17.7422533Z ⚠ 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-24T11:16:17.7422675Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:50:18] 2026-10-24T11:16:17.7422834Z 49 │ for (const tool of ["sendMessage", "followupTask", "interruptAgent", "listAgents"]) { 2026-10-24T11:16:17.7423008Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-24T11:16:17.7423098Z ·  ───────── 2026-10-24T11:16:17.7423277Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-24T11:16:17.7423327Z ╰──── 2026-10-24T11:16:17.7423330Z 2026-10-24T11:16:17.7423655Z ⚠ 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-24T11:16:17.7423798Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:51:18] 2026-10-24T11:16:17.7423965Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-24T11:16:17.7424139Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-24T11:16:17.7424291Z ·  ───────── 2026-10-24T11:16:17.7424381Z 52 │ } 2026-10-24T11:16:17.7424432Z ╰──── 2026-10-24T11:16:17.7424435Z 2026-10-24T11:16:17.7424761Z ⚠ 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-24T11:16:17.7424899Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:55:5] 2026-10-24T11:16:17.7424963Z 54 │ assert.equal( 2026-10-24T11:16:17.7425133Z 55 │ Schema.is(CodexSchema.ServerNotification__CollabAgentToolCallStatus)("interrupted"), 2026-10-24T11:16:17.7425207Z ·  ───────── 2026-10-24T11:16:17.7425263Z 56 │ true, 2026-10-24T11:16:17.7425313Z ╰──── 2026-10-24T11:16:17.7425316Z 2026-10-24T11:16:17.7425649Z ⚠ 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-24T11:16:17.7425791Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:59:5] 2026-10-24T11:16:17.7425857Z 58 │ assert.equal( 2026-10-24T11:16:17.7426036Z 59 │ Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentToolCallStatus)("interrupted"), 2026-10-24T11:16:17.7426107Z ·  ───────── 2026-10-24T11:16:17.7426163Z 60 │ true, 2026-10-24T11:16:17.7426212Z ╰──── 2026-10-24T11:16:17.7426214Z 2026-10-24T11:16:17.7426536Z ⚠ 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-24T11:16:17.7426684Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:103:16] 2026-10-24T11:16:17.7426737Z 102 │ 2026-10-24T11:16:17.7426907Z 103 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse)(resumeResponse), true); 2026-10-24T11:16:17.7426995Z ·  ───────── 2026-10-24T11:16:17.7427049Z 104 │ }); 2026-10-24T11:16:17.7427100Z ╰──── 2026-10-24T11:16:17.7427102Z 2026-10-24T11:16:17.7427359Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:16:17.7427510Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:568:5] 2026-10-24T11:16:17.7427568Z 566 │ }, []); 2026-10-24T11:16:17.7427635Z 567 │ useEffect(() => { 2026-10-24T11:16:17.7427707Z ·  ────┬──── 2026-10-24T11:16:17.7427838Z · ╰── This is the containing effect 2026-10-24T11:16:17.7427923Z 568 │ setKeyboardStateSuspect(false); 2026-10-24T11:16:17.7428020Z ·  ───────────┬─────────── 2026-10-24T11:16:17.7428197Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.7428295Z 569 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-24T11:16:17.7428345Z ╰──── 2026-10-24T11:16:17.7428936Z  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-24T11:16:17.7429255Z  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-24T11:16:17.7429258Z 2026-10-24T11:16:17.7429566Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:16:17.7429743Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:966:7] 2026-10-24T11:16:17.7429899Z 963 │ const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0); 2026-10-24T11:16:17.7429964Z 964 │ useEffect(() => { 2026-10-24T11:16:17.7430036Z ·  ────┬──── 2026-10-24T11:16:17.7430166Z · ╰── This is the containing effect 2026-10-24T11:16:17.7430324Z 965 │ if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) { 2026-10-24T11:16:17.7430436Z 966 │ setLastKnownKeyboardHeight(liveKeyboardHeight); 2026-10-24T11:16:17.7430533Z ·  ─────────────┬──────────── 2026-10-24T11:16:17.7430713Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.7430772Z 967 │ } 2026-10-24T11:16:17.7430825Z ╰──── 2026-10-24T11:16:17.7431407Z  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-24T11:16:17.7431720Z  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-24T11:16:17.7431723Z 2026-10-24T11:16:17.7431979Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:16:17.7432148Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1213:5] 2026-10-24T11:16:17.7432234Z 1211 │ 2026-10-24T11:16:17.7432300Z 1212 │ useEffect(() => { 2026-10-24T11:16:17.7432371Z ·  ────┬──── 2026-10-24T11:16:17.7432504Z · ╰── This is the containing effect 2026-10-24T11:16:17.7432582Z 1213 │ setAnchorMessageId(null); 2026-10-24T11:16:17.7432667Z ·  ─────────┬──────── 2026-10-24T11:16:17.7432840Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.7432920Z 1214 │ setSubmittedMessageId(null); 2026-10-24T11:16:17.7432970Z ╰──── 2026-10-24T11:16:17.7433559Z  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-24T11:16:17.7433874Z  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-24T11:16:17.7433878Z 2026-10-24T11:16:17.7434077Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:16:17.7434227Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:569:7] 2026-10-24T11:16:17.7434311Z 568 │ setKeyboardStateSuspect(false); 2026-10-24T11:16:17.7434409Z 569 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-24T11:16:17.7434566Z ·  ────────┬──────── ─────────┬──────── 2026-10-24T11:16:17.7434909Z · │ ╰── Unnecessary dependency `liveKeyboardHeight` 2026-10-24T11:16:17.7435115Z · ╰── Unnecessary dependency `isKeyboardVisible` 2026-10-24T11:16:17.7435241Z 570 │ const handleOwnedInputFocusChange = (focused: boolean) => { 2026-10-24T11:16:17.7435291Z ╰──── 2026-10-24T11:16:17.7435580Z  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-24T11:16:17.7435886Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7435888Z 2026-10-24T11:16:17.7436093Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:16:17.7436250Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1161:7] 2026-10-24T11:16:17.7436335Z 1160 │ userInputInsetProgress.set(1); 2026-10-24T11:16:17.7436496Z 1161 │ }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]); 2026-10-24T11:16:17.7436593Z ·  ────────────┬─────────── 2026-10-24T11:16:17.7436772Z · ╰── Unnecessary dependency `activeUserInputRequestId` 2026-10-24T11:16:17.7436877Z 1162 │ const showContent = props.showContent ?? true; 2026-10-24T11:16:17.7436928Z ╰──── 2026-10-24T11:16:17.7437213Z  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-24T11:16:17.7437526Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7437532Z 2026-10-24T11:16:17.7437726Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:16:17.7437880Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1219:15] 2026-10-24T11:16:17.7437949Z 1218 │ freeze.set(false); 2026-10-24T11:16:17.7438030Z 1219 │ }, [freeze, selectedThreadKey]); 2026-10-24T11:16:17.7438124Z ·  ────────┬──────── 2026-10-24T11:16:17.7438290Z · ╰── Unnecessary dependency `selectedThreadKey` 2026-10-24T11:16:17.7438345Z 1220 │ 2026-10-24T11:16:17.7438398Z ╰──── 2026-10-24T11:16:17.7438732Z  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-24T11:16:17.7439080Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7439082Z 2026-10-24T11:16:17.7439237Z ⚠ react(immutability): This value cannot be modified 2026-10-24T11:16:17.7439389Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1049:5] 2026-10-24T11:16:17.7439500Z 1044 │ const composerPopoverHeight = useSharedValue(0); 2026-10-24T11:16:17.7439606Z 1045 │ const floatingControlCoverage = useSharedValue( 2026-10-24T11:16:17.7439703Z ·  ───────────┬─────────── 2026-10-24T11:16:17.7439871Z · ╰── `floatingControlCoverage` originates here 2026-10-24T11:16:17.7440001Z 1046 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-24T11:16:17.7440055Z 1047 │ ); 2026-10-24T11:16:17.7440122Z 1048 │ useEffect(() => { 2026-10-24T11:16:17.7440226Z 1049 │ floatingControlCoverage.value = withTiming( 2026-10-24T11:16:17.7440317Z ·  ───────────┬─────────── 2026-10-24T11:16:17.7440480Z · ╰── `floatingControlCoverage` cannot be modified 2026-10-24T11:16:17.7440612Z 1050 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-24T11:16:17.7440663Z ╰──── 2026-10-24T11:16:17.7440924Z  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-24T11:16:17.7441228Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:16:17.7441236Z 2026-10-24T11:16:17.7441390Z ⚠ react(immutability): This value cannot be modified 2026-10-24T11:16:17.7441540Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1067:7] 2026-10-24T11:16:17.7441724Z 1057 │ const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null; 2026-10-24T11:16:17.7441848Z 1058 │ const combinedContentInsetEndAdjustment = useSharedValue( 2026-10-24T11:16:17.7441963Z ·  ────────────────┬──────────────── 2026-10-24T11:16:17.7442183Z · ╰── `combinedContentInsetEndAdjustment` originates here 2026-10-24T11:16:17.7442313Z 1059 │ Math.max(0, estimatedOverlayHeight - nativeInsetOvercount), 2026-10-24T11:16:17.7442374Z 1060 │ ); 2026-10-24T11:16:17.7442444Z 1061 │ useAnimatedReaction( 2026-10-24T11:16:17.7442504Z 1062 │ () => 2026-10-24T11:16:17.7442596Z 1063 │ contentInsetEndAdjustment.value + 2026-10-24T11:16:17.7442683Z 1064 │ floatingControlCoverage.value + 2026-10-24T11:16:17.7442875Z 1065 │ (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0), 2026-10-24T11:16:17.7442940Z 1066 │ (value) => { 2026-10-24T11:16:17.7443054Z 1067 │ combinedContentInsetEndAdjustment.value = value; 2026-10-24T11:16:17.7443169Z ·  ────────────────┬──────────────── 2026-10-24T11:16:17.7443359Z · ╰── `combinedContentInsetEndAdjustment` cannot be modified 2026-10-24T11:16:17.7443417Z 1068 │ }, 2026-10-24T11:16:17.7443469Z ╰──── 2026-10-24T11:16:17.7443777Z  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-24T11:16:17.7444108Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:16:17.7444110Z 2026-10-24T11:16:17.7444573Z ⚠ 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-24T11:16:17.7444730Z ╭─[apps/server/src/project/ProjectEnrichmentService.test.ts:28:3] 2026-10-24T11:16:17.7444787Z 27 │ ) { 2026-10-24T11:16:17.7444997Z 28 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T11:16:17.7445145Z 29 │ │ const available = yield* service.peek(workspaceRoot); 2026-10-24T11:16:17.7445273Z 30 │ │ if (predicate(available)) return available; 2026-10-24T11:16:17.7445373Z 31 │ │ yield* Effect.yieldNow; 2026-10-24T11:16:17.7445497Z 32 │ ╰─▶ } 2026-10-24T11:16:17.7445670Z 33 │ return yield* Effect.die(`Project metadata for ${workspaceRoot} was not resolved in time.`); 2026-10-24T11:16:17.7445722Z ╰──── 2026-10-24T11:16:17.7445724Z 2026-10-24T11:16:17.7445980Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:16:17.7446157Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:329:7] 2026-10-24T11:16:17.7446213Z 324 │ }; 2026-10-24T11:16:17.7446279Z 325 │ useEffect(() => { 2026-10-24T11:16:17.7446350Z ·  ────┬──── 2026-10-24T11:16:17.7446482Z · ╰── This is the containing effect 2026-10-24T11:16:17.7446578Z 326 │ if (!guidesEnabled && section === "guide") { 2026-10-24T11:16:17.7446673Z 327 │ requestedSection.current = "overview"; 2026-10-24T11:16:17.7446836Z 328 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-24T11:16:17.7446910Z 329 │ setSection("overview"); 2026-10-24T11:16:17.7446985Z ·  ─────┬──── 2026-10-24T11:16:17.7447157Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.7447212Z 330 │ } 2026-10-24T11:16:17.7447263Z ╰──── 2026-10-24T11:16:17.7447856Z  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-24T11:16:17.7448175Z  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-24T11:16:17.7448177Z 2026-10-24T11:16:17.7448380Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T11:16:17.7448550Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:331:6] 2026-10-24T11:16:17.7448647Z 326 │ if (!guidesEnabled && section === "guide") { 2026-10-24T11:16:17.7448785Z 327 │ requestedSection.current = "overview"; 2026-10-24T11:16:17.7448900Z ·  ────────┬─────── 2026-10-24T11:16:17.7449346Z · ╰── 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-24T11:16:17.7449506Z 328 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-24T11:16:17.7449666Z ·  ─────────┬───────── ──────┬────── 2026-10-24T11:16:17.7450163Z · │ ╰── 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-24T11:16:17.7450606Z · ╰── 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-24T11:16:17.7450679Z 329 │ setSection("overview"); 2026-10-24T11:16:17.7450734Z 330 │ } 2026-10-24T11:16:17.7450823Z 331 │ }, [guidesEnabled, section, insets.top]); 2026-10-24T11:16:17.7450940Z ·  ──────────────────┬───────────────── 2026-10-24T11:16:17.7451132Z · ╰── This dependency list is missing values used by the callback 2026-10-24T11:16:17.7451216Z 332 │ const tabContent = activityContent; 2026-10-24T11:16:17.7451266Z ╰──── 2026-10-24T11:16:17.7451438Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T11:16:17.7451749Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7451752Z 2026-10-24T11:16:17.7451954Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T11:16:17.7452135Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:868:6] 2026-10-24T11:16:17.7452222Z 851 │ if ( 2026-10-24T11:16:17.7452338Z 852 │ lastSelection.current.path === route.params.path && 2026-10-24T11:16:17.7452417Z ·  ──────┬────── 2026-10-24T11:16:17.7452852Z · ╰── 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-24T11:16:17.7452979Z 853 │ lastSelection.current.id === route.params.fileSelectionId 2026-10-24T11:16:17.7453033Z 854 │ ) 2026-10-24T11:16:17.7453095Z 855 │ return; 2026-10-24T11:16:17.7453268Z 856 │ lastSelection.current = { path: route.params.path, id: route.params.fileSelectionId }; 2026-10-24T11:16:17.7453403Z 857 │ if (route.params.focus) navigation.setParams({ focus: undefined }); 2026-10-24T11:16:17.7453488Z 858 │ setJumpPath(route.params.path); 2026-10-24T11:16:17.7453561Z 859 │ setSelectedRowId(null); 2026-10-24T11:16:17.7453638Z 860 │ jumpStarted.current = false; 2026-10-24T11:16:17.7453784Z 861 │ const file = data.files.find((entry) => entry.path === route.params.path); 2026-10-24T11:16:17.7453926Z 862 │ if (!file || !nativeView.current) return; 2026-10-24T11:16:17.7454044Z ·  ─────┬──── 2026-10-24T11:16:17.7454479Z · ╰── 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-24T11:16:17.7454605Z 863 │ setCollapsedIds((ids) => ids.filter((id) => id !== file.id)); 2026-10-24T11:16:17.7454684Z 864 │ jumpStarted.current = true; 2026-10-24T11:16:17.7454819Z 865 │ void nativeView.current.scrollToFile(file.id, false).catch(() => { 2026-10-24T11:16:17.7454899Z 866 │ jumpStarted.current = false; 2026-10-24T11:16:17.7454953Z 867 │ }); 2026-10-24T11:16:17.7455146Z 868 │ }, [route.params.path, route.params.fileSelectionId, route.params.focus, data.files, navigation]); 2026-10-24T11:16:17.7455377Z ·  ──────────────────────────────────────────────┬────────────────────────────────────────────── 2026-10-24T11:16:17.7455601Z · ╰── This dependency list is missing values used by the callback 2026-10-24T11:16:17.7455712Z 869 │ const appliedFilter = useRef(filter.hideTestFiles); 2026-10-24T11:16:17.7455762Z ╰──── 2026-10-24T11:16:17.7455926Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T11:16:17.7456231Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7456234Z 2026-10-24T11:16:17.7456491Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:16:17.7456666Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:79:5] 2026-10-24T11:16:17.7456722Z 76 │ 2026-10-24T11:16:17.7456787Z 77 │ useEffect(() => { 2026-10-24T11:16:17.7456859Z ·  ────┬──── 2026-10-24T11:16:17.7456988Z · ╰── This is the containing effect 2026-10-24T11:16:17.7457114Z 78 │ const { host, code } = parsePairingUrl(connectionPairingUrl); 2026-10-24T11:16:17.7457182Z 79 │ setHostInput(host); 2026-10-24T11:16:17.7457258Z ·  ──────┬───── 2026-10-24T11:16:17.7457423Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.7457489Z 80 │ setCodeInput(code); 2026-10-24T11:16:17.7457540Z ╰──── 2026-10-24T11:16:17.7458177Z  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-24T11:16:17.7458519Z  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-24T11:16:17.7458522Z 2026-10-24T11:16:17.7458774Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:16:17.7458945Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:89:5] 2026-10-24T11:16:17.7458996Z 82 │ 2026-10-24T11:16:17.7459059Z 83 │ useEffect(() => { 2026-10-24T11:16:17.7459130Z ·  ────┬──── 2026-10-24T11:16:17.7459264Z · ╰── This is the containing effect 2026-10-24T11:16:17.7459352Z 84 │ if (routePairingUrl.length === 0) { 2026-10-24T11:16:17.7459415Z 85 │ return; 2026-10-24T11:16:17.7459470Z 86 │ } 2026-10-24T11:16:17.7459523Z 87 │ 2026-10-24T11:16:17.7459637Z 88 │ const { host, code } = parsePairingUrl(routePairingUrl); 2026-10-24T11:16:17.7459702Z 89 │ setHostInput(host); 2026-10-24T11:16:17.7459775Z ·  ──────┬───── 2026-10-24T11:16:17.7459941Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.7460005Z 90 │ setCodeInput(code); 2026-10-24T11:16:17.7460055Z ╰──── 2026-10-24T11:16:17.7460693Z  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-24T11:16:17.7461011Z  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-24T11:16:17.7461013Z 2026-10-24T11:16:17.7461267Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:16:17.7461435Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:95:7] 2026-10-24T11:16:17.7461487Z 92 │ 2026-10-24T11:16:17.7461547Z 93 │ useEffect(() => { 2026-10-24T11:16:17.7461617Z ·  ────┬──── 2026-10-24T11:16:17.7461750Z · ╰── This is the containing effect 2026-10-24T11:16:17.7461835Z 94 │ if (pairingConnectionError) { 2026-10-24T11:16:17.7461909Z 95 │ setIsSubmitting(false); 2026-10-24T11:16:17.7461991Z ·  ───────┬─────── 2026-10-24T11:16:17.7462194Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.7462248Z 96 │ } 2026-10-24T11:16:17.7462301Z ╰──── 2026-10-24T11:16:17.7462885Z  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-24T11:16:17.7463263Z  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-24T11:16:17.7463302Z 2026-10-24T11:16:17.7463493Z ⚠ eslint(require-yield): This generator function does not have `yield` 2026-10-24T11:16:17.7463640Z ╭─[packages/provider-acp/src/server/mcpOverAcpBridge.ts:81:78] 2026-10-24T11:16:17.7463699Z  80 │ 2026-10-24T11:16:17.7463973Z  81 │ ╭─▶ export const makeAcpMcpOverAcpBridge = Effect.fn("AcpMcpOverAcpBridge.make")(function* ( 2026-10-24T11:16:17.7464095Z  82 │ │ options: AcpMcpOverAcpBridgeOptions, 2026-10-24T11:16:17.7464217Z  83 │ │ ): Effect.fn.Return { 2026-10-24T11:16:17.7464385Z  84 │ │ const fetchImplementation = options.fetchImplementation ?? fetch; 2026-10-24T11:16:17.7464524Z  85 │ │ const connections = new Map(); 2026-10-24T11:16:17.7464596Z  86 │ │ 2026-10-24T11:16:17.7464811Z  87 │ │ const connectionFor = (connectionId: string): Effect.Effect => 2026-10-24T11:16:17.7464910Z  88 │ │ Effect.suspend(() => { 2026-10-24T11:16:17.7465047Z  89 │ │ const connection = connections.get(connectionId); 2026-10-24T11:16:17.7465159Z  90 │ │ return connection === undefined 2026-10-24T11:16:17.7465372Z  91 │ │ ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`)) 2026-10-24T11:16:17.7465481Z  92 │ │ : Effect.succeed(connection); 2026-10-24T11:16:17.7465563Z  93 │ │ }); 2026-10-24T11:16:17.7465635Z  94 │ │ 2026-10-24T11:16:17.7465722Z  95 │ │ const send = ( 2026-10-24T11:16:17.7465820Z  96 │ │ connection: Connection, 2026-10-24T11:16:17.7465915Z  97 │ │ message: unknown, 2026-10-24T11:16:17.7466074Z  98 │ │ ): Effect.Effect, AcpMcpOverAcpError> => 2026-10-24T11:16:17.7466192Z  99 │ │ connection.mutex.withPermits(1)( 2026-10-24T11:16:17.7466297Z 100 │ │ Effect.gen(function* () { 2026-10-24T11:16:17.7466419Z 101 │ │ const body = JSON.stringify(message); 2026-10-24T11:16:17.7466560Z 102 │ │ if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) { 2026-10-24T11:16:17.7466778Z 103 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB.")); 2026-10-24T11:16:17.7466856Z 104 │ │ } 2026-10-24T11:16:17.7466990Z 105 │ │ const response = yield* Effect.tryPromise({ 2026-10-24T11:16:17.7467089Z 106 │ │ try: (signal) => 2026-10-24T11:16:17.7467222Z 107 │ │ fetchImplementation(options.endpoint, { 2026-10-24T11:16:17.7467324Z 108 │ │ method: "POST", 2026-10-24T11:16:17.7467418Z 109 │ │ signal, 2026-10-24T11:16:17.7467516Z 110 │ │ headers: { 2026-10-24T11:16:17.7467645Z 111 │ │ "content-type": "application/json", 2026-10-24T11:16:17.7467835Z 112 │ │ accept: "application/json, text/event-stream", 2026-10-24T11:16:17.7467997Z 113 │ │ authorization: options.authorization, 2026-10-24T11:16:17.7468122Z 114 │ │ ...(connection.sessionId === null 2026-10-24T11:16:17.7468216Z 115 │ │ ? {} 2026-10-24T11:16:17.7468357Z 116 │ │ : { "mcp-session-id": connection.sessionId }), 2026-10-24T11:16:17.7468491Z 117 │ │ ...(connection.protocolVersion === null 2026-10-24T11:16:17.7468582Z 118 │ │ ? {} 2026-10-24T11:16:17.7468747Z 119 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-24T11:16:17.7468832Z 120 │ │ }, 2026-10-24T11:16:17.7468925Z 121 │ │ body, 2026-10-24T11:16:17.7469012Z 122 │ │ }), 2026-10-24T11:16:17.7469114Z 123 │ │ catch: bridgeError, 2026-10-24T11:16:17.7469194Z 124 │ │ }); 2026-10-24T11:16:17.7469405Z 125 │ │ connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId; 2026-10-24T11:16:17.7469506Z 126 │ │ if (!response.ok) { 2026-10-24T11:16:17.7469612Z 127 │ │ yield* Effect.promise( 2026-10-24T11:16:17.7469795Z 128 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-24T11:16:17.7469876Z 129 │ │ ); 2026-10-24T11:16:17.7469987Z 130 │ │ return yield* Effect.fail( 2026-10-24T11:16:17.7470201Z 131 │ │ new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`), 2026-10-24T11:16:17.7470285Z 132 │ │ ); 2026-10-24T11:16:17.7470360Z 133 │ │ } 2026-10-24T11:16:17.7470576Z 134 │ │ const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))]; 2026-10-24T11:16:17.7470698Z 135 │ │ for (const payload of payloads) { 2026-10-24T11:16:17.7470910Z 136 │ │ connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion; 2026-10-24T11:16:17.7470985Z 137 │ │ } 2026-10-24T11:16:17.7471084Z 138 │ │ return payloads; 2026-10-24T11:16:17.7471212Z 139 │ │ }).pipe(Effect.mapError(bridgeError)), 2026-10-24T11:16:17.7471291Z 140 │ │ ); 2026-10-24T11:16:17.7471359Z 141 │ │ 2026-10-24T11:16:17.7471534Z 142 │ │ const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* ( 2026-10-24T11:16:17.7471660Z 143 │ │ request: AcpSchema.DisconnectMcpRequest, 2026-10-24T11:16:17.7471844Z 144 │ │ ): Effect.fn.Return { 2026-10-24T11:16:17.7472005Z 145 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T11:16:17.7472143Z 146 │ │ connections.delete(request.connectionId); 2026-10-24T11:16:17.7472293Z 147 │ │ const sessionId = connection.sessionId; 2026-10-24T11:16:17.7472443Z 148 │ │ if (sessionId !== null) { 2026-10-24T11:16:17.7472600Z 149 │ │ const response = yield* Effect.tryPromise({ 2026-10-24T11:16:17.7472696Z 150 │ │ try: (signal) => 2026-10-24T11:16:17.7472825Z 151 │ │ fetchImplementation(options.endpoint, { 2026-10-24T11:16:17.7472924Z 152 │ │ method: "DELETE", 2026-10-24T11:16:17.7473012Z 153 │ │ signal, 2026-10-24T11:16:17.7473106Z 154 │ │ headers: { 2026-10-24T11:16:17.7473237Z 155 │ │ authorization: options.authorization, 2026-10-24T11:16:17.7473356Z 156 │ │ "mcp-session-id": sessionId, 2026-10-24T11:16:17.7473490Z 157 │ │ ...(connection.protocolVersion === null 2026-10-24T11:16:17.7473584Z 158 │ │ ? {} 2026-10-24T11:16:17.7473750Z 159 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-24T11:16:17.7473833Z 160 │ │ }, 2026-10-24T11:16:17.7473916Z 161 │ │ }), 2026-10-24T11:16:17.7474014Z 162 │ │ catch: bridgeError, 2026-10-24T11:16:17.7474092Z 163 │ │ }); 2026-10-24T11:16:17.7474226Z 164 │ │ if (!response.ok && response.status !== 404) { 2026-10-24T11:16:17.7474338Z 165 │ │ return yield* Effect.fail( 2026-10-24T11:16:17.7474446Z 166 │ │ new AcpMcpOverAcpError( 2026-10-24T11:16:17.7474637Z 167 │ │ `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`, 2026-10-24T11:16:17.7474721Z 168 │ │ ), 2026-10-24T11:16:17.7474800Z 169 │ │ ); 2026-10-24T11:16:17.7474873Z 170 │ │ } 2026-10-24T11:16:17.7474978Z 171 │ │ yield* Effect.promise( 2026-10-24T11:16:17.7475156Z 172 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-24T11:16:17.7475232Z 173 │ │ ); 2026-10-24T11:16:17.7475305Z 174 │ │ } 2026-10-24T11:16:17.7475388Z 175 │ │ return {}; 2026-10-24T11:16:17.7475461Z 176 │ │ }); 2026-10-24T11:16:17.7475529Z 177 │ │ 2026-10-24T11:16:17.7475605Z 178 │ │ return { 2026-10-24T11:16:17.7475782Z 179 │ │ connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) { 2026-10-24T11:16:17.7475906Z 180 │ │ if (request.serverId !== "t3-code") { 2026-10-24T11:16:17.7476014Z 181 │ │ return yield* Effect.fail( 2026-10-24T11:16:17.7476197Z 182 │ │ new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`), 2026-10-24T11:16:17.7476275Z 183 │ │ ); 2026-10-24T11:16:17.7476349Z 184 │ │ } 2026-10-24T11:16:17.7476477Z 185 │ │ if (connections.size >= MAX_CONNECTIONS) { 2026-10-24T11:16:17.7476684Z 186 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections.")); 2026-10-24T11:16:17.7476758Z 187 │ │ } 2026-10-24T11:16:17.7476976Z 188 │ │ const connectionId = yield* options.allocateConnectionId; 2026-10-24T11:16:17.7477120Z 189 │ │ connections.set(connectionId, { 2026-10-24T11:16:17.7477238Z 190 │ │ mutex: yield* Semaphore.make(1), 2026-10-24T11:16:17.7477337Z 191 │ │ sessionId: null, 2026-10-24T11:16:17.7477442Z 192 │ │ protocolVersion: null, 2026-10-24T11:16:17.7477542Z 193 │ │ nextRequestId: 0, 2026-10-24T11:16:17.7477619Z 194 │ │ }); 2026-10-24T11:16:17.7477723Z 195 │ │ return { connectionId }; 2026-10-24T11:16:17.7477796Z 196 │ │ }), 2026-10-24T11:16:17.7477972Z 197 │ │ message: Effect.fn("mcpOverAcpBridge.message")(function* (request) { 2026-10-24T11:16:17.7478134Z 198 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T11:16:17.7478257Z 199 │ │ const id = ++connection.nextRequestId; 2026-10-24T11:16:17.7478383Z 200 │ │ const payloads = yield* send(connection, { 2026-10-24T11:16:17.7478480Z 201 │ │ jsonrpc: "2.0", 2026-10-24T11:16:17.7478560Z 202 │ │ id, 2026-10-24T11:16:17.7478665Z 203 │ │ method: request.method, 2026-10-24T11:16:17.7478825Z 204 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-24T11:16:17.7478901Z 205 │ │ }); 2026-10-24T11:16:17.7479095Z 206 │ │ const response = payloads.find((payload) => asEnvelope(payload)?.id === id); 2026-10-24T11:16:17.7479224Z 207 │ │ const envelope = asEnvelope(response); 2026-10-24T11:16:17.7479326Z 208 │ │ if (envelope === null) { 2026-10-24T11:16:17.7479433Z 209 │ │ return yield* Effect.fail( 2026-10-24T11:16:17.7479618Z 210 │ │ new AcpMcpOverAcpError("MCP server did not return a matching response."), 2026-10-24T11:16:17.7479696Z 211 │ │ ); 2026-10-24T11:16:17.7479771Z 212 │ │ } 2026-10-24T11:16:17.7479890Z 213 │ │ if (envelope.error !== undefined) { 2026-10-24T11:16:17.7480083Z 214 │ │ return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error))); 2026-10-24T11:16:17.7480160Z 215 │ │ } 2026-10-24T11:16:17.7480334Z 216 │ │ return (envelope.result ?? null) as AcpSchema.MessageMcpResponse; 2026-10-24T11:16:17.7480411Z 217 │ │ }), 2026-10-24T11:16:17.7480604Z 218 │ │ notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) { 2026-10-24T11:16:17.7480763Z 219 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T11:16:17.7480867Z 220 │ │ yield* send(connection, { 2026-10-24T11:16:17.7480964Z 221 │ │ jsonrpc: "2.0", 2026-10-24T11:16:17.7481067Z 222 │ │ method: request.method, 2026-10-24T11:16:17.7481222Z 223 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-24T11:16:17.7481300Z 224 │ │ }); 2026-10-24T11:16:17.7481437Z 225 │ │ }), 2026-10-24T11:16:17.7481552Z 226 │ │ disconnect, 2026-10-24T11:16:17.7481658Z 227 │ │ dispose: Effect.suspend(() => 2026-10-24T11:16:17.7481752Z 228 │ │ Effect.forEach( 2026-10-24T11:16:17.7481855Z 229 │ │ [...connections.keys()], 2026-10-24T11:16:17.7482025Z 230 │ │ (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore), 2026-10-24T11:16:17.7482134Z 231 │ │ { discard: true }, 2026-10-24T11:16:17.7482241Z 232 │ │ ), 2026-10-24T11:16:17.7482317Z 233 │ │ ), 2026-10-24T11:16:17.7482390Z 234 │ │ }; 2026-10-24T11:16:17.7482523Z 235 │ ╰─▶ }); 2026-10-24T11:16:17.7482578Z ╰──── 2026-10-24T11:16:17.7482826Z  help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed. 2026-10-24T11:16:17.7482829Z 2026-10-24T11:16:17.7483037Z ⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used. 2026-10-24T11:16:17.7483174Z ╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10] 2026-10-24T11:16:17.7483228Z 21 │ 2026-10-24T11:16:17.7483384Z 22 │ function summarizePayload(payload: unknown): Readonly> { 2026-10-24T11:16:17.7483470Z ·  ────────┬─────── 2026-10-24T11:16:17.7483620Z · ╰── 'summarizePayload' is declared here 2026-10-24T11:16:17.7483730Z 23 │ if (payload === null) return { valueType: "null" }; 2026-10-24T11:16:17.7483783Z ╰──── 2026-10-24T11:16:17.7483887Z  help: Consider removing this declaration. 2026-10-24T11:16:17.7483889Z 2026-10-24T11:16:17.7484043Z ⚠ react(immutability): This value cannot be modified 2026-10-24T11:16:17.7484200Z ╭─[apps/mobile/src/features/connection/ConnectionStatusDot.tsx:58:7] 2026-10-24T11:16:17.7484294Z 53 │ function usePulseAnimation(pulse: boolean) { 2026-10-24T11:16:17.7484384Z 54 │ const pulseProgress = useSharedValue(0); 2026-10-24T11:16:17.7484463Z ·  ──────┬────── 2026-10-24T11:16:17.7484604Z · ╰── `pulseProgress` originates here 2026-10-24T11:16:17.7484657Z 55 │ 2026-10-24T11:16:17.7484723Z 56 │ useEffect(() => { 2026-10-24T11:16:17.7484784Z 57 │ if (pulse) { 2026-10-24T11:16:17.7484918Z 58 │ pulseProgress.value = withRepeat( 2026-10-24T11:16:17.7485024Z ·  ──────┬────── 2026-10-24T11:16:17.7485170Z · ╰── `pulseProgress` cannot be modified 2026-10-24T11:16:17.7485236Z 59 │ withTiming(1, { 2026-10-24T11:16:17.7485287Z ╰──── 2026-10-24T11:16:17.7485550Z  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-24T11:16:17.7485851Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:16:17.7485853Z 2026-10-24T11:16:17.7486115Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:16:17.7486252Z ╭─[apps/server/src/telemetry/AnalyticsService.ts:340:7] 2026-10-24T11:16:17.7486313Z 339 │ 2026-10-24T11:16:17.7486413Z 340 │ const layerTest = AnalyticsService.layerTest; 2026-10-24T11:16:17.7486485Z ·  ────┬──── 2026-10-24T11:16:17.7486619Z · ╰── 'layerTest' is declared here 2026-10-24T11:16:17.7486671Z ╰──── 2026-10-24T11:16:17.7486772Z  help: Consider removing this declaration. 2026-10-24T11:16:17.7486775Z 2026-10-24T11:16:17.7487030Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:16:17.7487213Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:119:10] 2026-10-24T11:16:17.7487266Z 117 │ 2026-10-24T11:16:17.7487331Z 118 │ useEffect(() => { 2026-10-24T11:16:17.7487407Z ·  ────┬──── 2026-10-24T11:16:17.7487541Z · ╰── This is the containing effect 2026-10-24T11:16:17.7487621Z 119 │ void refreshNotifications(); 2026-10-24T11:16:17.7487713Z ·  ──────────┬───────── 2026-10-24T11:16:17.7487890Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.7488030Z 120 │ const subscription = AppState.addEventListener("change", (state) => { 2026-10-24T11:16:17.7488082Z ╰──── 2026-10-24T11:16:17.7488679Z  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-24T11:16:17.7488999Z  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-24T11:16:17.7489001Z 2026-10-24T11:16:17.7489258Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:16:17.7489440Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7] 2026-10-24T11:16:17.7489492Z 125 │ 2026-10-24T11:16:17.7489555Z 126 │ useEffect(() => { 2026-10-24T11:16:17.7489626Z ·  ────┬──── 2026-10-24T11:16:17.7489756Z · ╰── This is the containing effect 2026-10-24T11:16:17.7489822Z 127 │ if (!isLoaded) { 2026-10-24T11:16:17.7489960Z 128 │ setLiveActivityStatus("checking"); 2026-10-24T11:16:17.7490082Z ·  ──────────┬────────── 2026-10-24T11:16:17.7490252Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.7490314Z 129 │ return; 2026-10-24T11:16:17.7490365Z ╰──── 2026-10-24T11:16:17.7490949Z  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-24T11:16:17.7491262Z  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-24T11:16:17.7491264Z 2026-10-24T11:16:17.7491499Z ⚠ eslint(no-unneeded-ternary): Unnecessary use of boolean literals in conditional expression 2026-10-24T11:16:17.7491629Z ╭─[packages/shared/src/serverSettings.test.ts:35:7] 2026-10-24T11:16:17.7491808Z 34 │ const fallback = fallbackTextGenerationModelSelection(providerInstances, (instanceId) => 2026-10-24T11:16:17.7491902Z 35 │ instanceId === configured ? true : false, 2026-10-24T11:16:17.7492021Z ·  ──────────────────────────────────────── 2026-10-24T11:16:17.7492086Z 36 │ ); 2026-10-24T11:16:17.7492137Z ╰──── 2026-10-24T11:16:17.7492254Z  help: Remove this ternary operator 2026-10-24T11:16:17.7492258Z 2026-10-24T11:16:17.7492465Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T11:16:17.7492608Z ╭─[packages/shared/src/composerContextLegacySend.ts:19:45] 2026-10-24T11:16:17.7492734Z 18 │ const occurrences = collectComposerContextReferences(text); 2026-10-24T11:16:17.7492843Z 19 │ for (const occurrence of [...occurrences].reverse()) { 2026-10-24T11:16:17.7492950Z ·  ─────── 2026-10-24T11:16:17.7493058Z 20 │ const record = recordsById.get(occurrence.contextId); 2026-10-24T11:16:17.7493110Z ╰──── 2026-10-24T11:16:17.7493368Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T11:16:17.7493371Z 2026-10-24T11:16:17.7493562Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T11:16:17.7493708Z ╭─[apps/mobile/src/components/ComposerContextSheet.tsx:267:25] 2026-10-24T11:16:17.7493820Z 266 │ {record.elements?.map((element, index) => ( 2026-10-24T11:16:17.7493988Z 267 │ 2026-10-24T11:16:17.7494149Z ·  ─────────────────────────────────────────────────────── 2026-10-24T11:16:17.7494225Z 268 │ { 2026-10-24T11:16:17.7498440Z ·  ────┬──── 2026-10-24T11:16:17.7498576Z · ╰── This is the containing effect 2026-10-24T11:16:17.7498671Z 59 │ const controller = new AbortController(); 2026-10-24T11:16:17.7498742Z 60 │ setLoadState("pending"); 2026-10-24T11:16:17.7498818Z ·  ──────┬───── 2026-10-24T11:16:17.7498985Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.7499139Z 61 │ // A renewed signature is used on Retry, not as a reason to reset the native player. 2026-10-24T11:16:17.7499191Z ╰──── 2026-10-24T11:16:17.7499779Z  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-24T11:16:17.7500149Z  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-24T11:16:17.7500179Z 2026-10-24T11:16:17.7500379Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:16:17.7500511Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:71:7] 2026-10-24T11:16:17.7500593Z 70 │ return () => controller.abort(); 2026-10-24T11:16:17.7500698Z 71 │ }, [player, props.playRequested, attempt]); 2026-10-24T11:16:17.7501079Z ·  ───┬── ─────────┬───────── ───┬─── 2026-10-24T11:16:17.7501314Z · │ │ ╰── Unnecessary dependency `attempt` 2026-10-24T11:16:17.7501518Z · │ ╰── Unnecessary dependency `props.playRequested` 2026-10-24T11:16:17.7501658Z · ╰── Unnecessary dependency `player_0` 2026-10-24T11:16:17.7501711Z 72 │ 2026-10-24T11:16:17.7501764Z ╰──── 2026-10-24T11:16:17.7502052Z  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-24T11:16:17.7502394Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7502397Z 2026-10-24T11:16:17.7502659Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:16:17.7502810Z ╭─[apps/mobile/src/components/VideoPreviewModal.ios.tsx:63:55] 2026-10-24T11:16:17.7502868Z 61 │ }, []); 2026-10-24T11:16:17.7502931Z 62 │ useEffect(() => { 2026-10-24T11:16:17.7503002Z ·  ────┬──── 2026-10-24T11:16:17.7503130Z · ╰── This is the containing effect 2026-10-24T11:16:17.7503277Z 63 │ if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl); 2026-10-24T11:16:17.7503400Z ·  ───────┬────── 2026-10-24T11:16:17.7503605Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.7503685Z 64 │ }, [playbackUrl, resolvedUrl]); 2026-10-24T11:16:17.7503737Z ╰──── 2026-10-24T11:16:17.7504457Z  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-24T11:16:17.7504814Z  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-24T11:16:17.7504817Z 2026-10-24T11:16:17.7504985Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T11:16:17.7505107Z ╭─[apps/web/src/hooks/useThreadActions.ts:821:56] 2026-10-24T11:16:17.7505210Z 820 │ const resolved = resolveThreadTarget(target); 2026-10-24T11:16:17.7505367Z 821 │ if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) { 2026-10-24T11:16:17.7505493Z ·  ─────┬──── 2026-10-24T11:16:17.7505661Z · ╰── Cannot call impure function 2026-10-24T11:16:17.7505742Z 822 │ return AsyncResult.failure( 2026-10-24T11:16:17.7505794Z ╰──── 2026-10-24T11:16:17.7506068Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T11:16:17.7506359Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T11:16:17.7506362Z 2026-10-24T11:16:17.7506534Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T11:16:17.7506656Z ╭─[apps/web/src/hooks/useThreadActions.ts:709:46] 2026-10-24T11:16:17.7506727Z 708 │ const wokeAt = resolved 2026-10-24T11:16:17.7506863Z 709 │ ? threadWokeAt(resolved.thread, { now: new Date().toISOString() }) 2026-10-24T11:16:17.7506975Z ·  ─────┬──── 2026-10-24T11:16:17.7507133Z · ╰── Cannot call impure function 2026-10-24T11:16:17.7507196Z 710 │ : null; 2026-10-24T11:16:17.7507246Z ╰──── 2026-10-24T11:16:17.7507517Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T11:16:17.7507811Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T11:16:17.7507816Z 2026-10-24T11:16:17.7507959Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.7508080Z ╭─[apps/mobile/src/native/StackHeader.tsx:185:9] 2026-10-24T11:16:17.7508145Z 184 │ "options", 2026-10-24T11:16:17.7508239Z 185 │ latestOptionFunctionsRef.current, 2026-10-24T11:16:17.7508350Z ·  ────────────────┬─────────────── 2026-10-24T11:16:17.7508546Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T11:16:17.7508642Z 186 │ optionFunctionWrappersRef.current, 2026-10-24T11:16:17.7508694Z ╰──── 2026-10-24T11:16:17.7509278Z  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-24T11:16:17.7509600Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.7509603Z 2026-10-24T11:16:17.7509747Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:16:17.7509867Z ╭─[apps/mobile/src/native/StackHeader.tsx:186:9] 2026-10-24T11:16:17.7509959Z 185 │ latestOptionFunctionsRef.current, 2026-10-24T11:16:17.7510051Z 186 │ optionFunctionWrappersRef.current, 2026-10-24T11:16:17.7510166Z ·  ────────────────┬──────────────── 2026-10-24T11:16:17.7510363Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T11:16:17.7510456Z 187 │ ) as NativeStackNavigationOptions) 2026-10-24T11:16:17.7510505Z ╰──── 2026-10-24T11:16:17.7510964Z  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-24T11:16:17.7511249Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:16:17.7511252Z 2026-10-24T11:16:17.7511419Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T11:16:17.7511570Z ╭─[apps/web/src/components/CommandPaletteThreadItems.tsx:152:58] 2026-10-24T11:16:17.7511752Z 151 │ if (threadSearchQuery.trim().length > 0 && !threadSearchQuery.startsWith(">") && !isOpen) { 2026-10-24T11:16:17.7511887Z 152 │ claimThreadOpen(thread.environmentId, thread.id, Date.now()); 2026-10-24T11:16:17.7512008Z ·  ─────┬──── 2026-10-24T11:16:17.7512218Z · ╰── Cannot call impure function 2026-10-24T11:16:17.7512273Z 153 │ } 2026-10-24T11:16:17.7512325Z ╰──── 2026-10-24T11:16:17.7512604Z  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-24T11:16:17.7512898Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T11:16:17.7512903Z 2026-10-24T11:16:17.7513114Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T11:16:17.7513222Z ╭─[apps/mobile/src/Stack.tsx:1079:21] 2026-10-24T11:16:17.7513288Z 1078 │ } 2026-10-24T11:16:17.7513561Z ·  ───────────────────────────────────────────── 2026-10-24T11:16:17.7513646Z 1080 │ screenOptions={({ route }) => 2026-10-24T11:16:17.7513698Z ╰──── 2026-10-24T11:16:17.7514056Z  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-24T11:16:17.7514059Z 2026-10-24T11:16:17.7514366Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:16:17.7514527Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:68:5] 2026-10-24T11:16:17.7514631Z 66 │ const { id: attachmentId, fileUri } = attachment; 2026-10-24T11:16:17.7514696Z 67 │ useEffect(() => { 2026-10-24T11:16:17.7514767Z ·  ────┬──── 2026-10-24T11:16:17.7514898Z · ╰── This is the containing effect 2026-10-24T11:16:17.7514961Z 68 │ setUri(null); 2026-10-24T11:16:17.7515030Z ·  ───┬── 2026-10-24T11:16:17.7515197Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.7515258Z 69 │ setError(null); 2026-10-24T11:16:17.7515310Z ╰──── 2026-10-24T11:16:17.7515903Z  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-24T11:16:17.7516224Z  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-24T11:16:17.7516226Z 2026-10-24T11:16:17.7516428Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:16:17.7516561Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:91:7] 2026-10-24T11:16:17.7516616Z 90 │ }; 2026-10-24T11:16:17.7516691Z 91 │ }, [attachmentId, fileUri]); 2026-10-24T11:16:17.7516813Z ·  ──────┬───── ───┬─── 2026-10-24T11:16:17.7516996Z · │ ╰── Unnecessary dependency `fileUri` 2026-10-24T11:16:17.7517146Z · ╰── Unnecessary dependency `attachmentId` 2026-10-24T11:16:17.7517281Z 92 │ const mimeType = videoMimeType(attachment) ?? attachment.mimeType; 2026-10-24T11:16:17.7517335Z ╰──── 2026-10-24T11:16:17.7517620Z  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-24T11:16:17.7517925Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7517928Z 2026-10-24T11:16:17.7518143Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T11:16:17.7518283Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:213:34] 2026-10-24T11:16:17.7518349Z 212 │ useEffect(() => { 2026-10-24T11:16:17.7518462Z 213 │ if (!isFocused && hasSource) props.onRequestClose(); 2026-10-24T11:16:17.7518562Z ·  ──┬── 2026-10-24T11:16:17.7518712Z · ╰── Missing dependency `props` 2026-10-24T11:16:17.7518818Z 214 │ }, [isFocused, hasSource, props.onRequestClose]); 2026-10-24T11:16:17.7518931Z ·  ──────────┬───────── 2026-10-24T11:16:17.7519210Z · ╰── Overly precise dependency `props.onRequestClose`, use `props` instead 2026-10-24T11:16:17.7519310Z 215 │ const { source } = props; 2026-10-24T11:16:17.7519361Z ╰──── 2026-10-24T11:16:17.7519773Z  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-24T11:16:17.7520080Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7520083Z 2026-10-24T11:16:17.7520281Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:16:17.7520411Z ╭─[apps/mobile/src/components/ComposerEditor.tsx:82:6] 2026-10-24T11:16:17.7520466Z 81 │ }, 2026-10-24T11:16:17.7520532Z 82 │ [draftKey], 2026-10-24T11:16:17.7520606Z ·  ────┬─── 2026-10-24T11:16:17.7520747Z · ╰── Unnecessary dependency `draftKey` 2026-10-24T11:16:17.7520800Z 83 │ ); 2026-10-24T11:16:17.7520850Z ╰──── 2026-10-24T11:16:17.7521135Z  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-24T11:16:17.7521439Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:16:17.7521442Z 2026-10-24T11:16:17.7521695Z ⚠ unicorn(prefer-add-event-listener): Prefer `addEventListener()` over their `on`-function counterparts. 2026-10-24T11:16:17.7521840Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:12:14] 2026-10-24T11:16:17.7521996Z 11 │ addEventListener(_type: string, listener: (event: { data: string }) => void) { 2026-10-24T11:16:17.7522103Z 12 │ this.onmessage = listener; 2026-10-24T11:16:17.7522184Z ·  ───────── 2026-10-24T11:16:17.7522238Z 13 │ } 2026-10-24T11:16:17.7522294Z ╰──── 2026-10-24T11:16:17.7522607Z  help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on` replaces any previously registered handler. 2026-10-24T11:16:17.7522610Z 2026-10-24T11:16:17.7522810Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-24T11:16:17.7522947Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:16:9] 2026-10-24T11:16:17.7523014Z 15 │ constructor() { 2026-10-24T11:16:17.7523084Z 16 │ source = this; 2026-10-24T11:16:17.7523158Z ·  ────── 2026-10-24T11:16:17.7523211Z 17 │ } 2026-10-24T11:16:17.7523263Z ╰──── 2026-10-24T11:16:17.7523535Z  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-24T11:16:17.7523537Z 2026-10-24T11:16:17.7523792Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:16:17.7523921Z ╭─[apps/mobile/src/state/use-vcs-action-state.ts:86:5] 2026-10-24T11:16:17.7524026Z 83 │ const [nowMs, setNowMs] = useState(() => Date.now()); 2026-10-24T11:16:17.7524089Z 84 │ useEffect(() => { 2026-10-24T11:16:17.7524160Z ·  ────┬──── 2026-10-24T11:16:17.7524343Z · ╰── This is the containing effect 2026-10-24T11:16:17.7524461Z 85 │ if (!actionState.isRunning) return; 2026-10-24T11:16:17.7524528Z 86 │ setNowMs(Date.now()); 2026-10-24T11:16:17.7524598Z ·  ────┬─── 2026-10-24T11:16:17.7524763Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.7524888Z 87 │ const interval = setInterval(() => setNowMs(Date.now()), 1000); 2026-10-24T11:16:17.7524940Z ╰──── 2026-10-24T11:16:17.7525527Z  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-24T11:16:17.7525848Z  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-24T11:16:17.7525852Z 2026-10-24T11:16:17.7526016Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T11:16:17.7526134Z ╭─[apps/web/src/components/Sidebar.tsx:1136:11] 2026-10-24T11:16:17.7526235Z 1135 │ foldSearchQuery(threadSearchQuery), 2026-10-24T11:16:17.7526302Z 1136 │ Date.now(), 2026-10-24T11:16:17.7526381Z ·  ─────┬──── 2026-10-24T11:16:17.7526519Z · ╰── Cannot call impure function 2026-10-24T11:16:17.7526657Z 1137 │ // A list filter, as on mobile: a pick would move rows unexplained. 2026-10-24T11:16:17.7526710Z ╰──── 2026-10-24T11:16:17.7526993Z  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-24T11:16:17.7527288Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T11:16:17.7527291Z 2026-10-24T11:16:17.7527548Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:16:17.7527682Z ╭─[apps/mobile/src/components/ProjectFavicon.tsx:172:5] 2026-10-24T11:16:17.7527871Z 167 │ const [activeFaviconRequest, setActiveFaviconRequest] = useState(null); 2026-10-24T11:16:17.7527940Z 168 │ useLayoutEffect(() => { 2026-10-24T11:16:17.7528020Z ·  ───────┬─────── 2026-10-24T11:16:17.7528206Z · ╰── This is the containing effect 2026-10-24T11:16:17.7528322Z 169 │ if (faviconRequest === null) return; 2026-10-24T11:16:17.7528373Z 170 │ 2026-10-24T11:16:17.7528503Z 171 │ const endRequest = beginProjectFaviconRequest(faviconRequest); 2026-10-24T11:16:17.7528598Z 172 │ setActiveFaviconRequest(faviconRequest); 2026-10-24T11:16:17.7528691Z ·  ───────────┬─────────── 2026-10-24T11:16:17.7528863Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:16:17.7528932Z 173 │ return endRequest; 2026-10-24T11:16:17.7528984Z ╰──── 2026-10-24T11:16:17.7529573Z  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-24T11:16:17.7529893Z  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-24T11:16:17.7529896Z 2026-10-24T11:16:17.7530149Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:16:17.7530314Z ╭─[apps/server/src/orchestration-v2/ThreadPullRequestService.ts:413:7] 2026-10-24T11:16:17.7530366Z 412 │ 2026-10-24T11:16:17.7530492Z 413 │ const layer = Layer.effect(ThreadPullRequestServiceV2, make); 2026-10-24T11:16:17.7530561Z ·  ──┬── 2026-10-24T11:16:17.7530693Z · ╰── 'layer' is declared here 2026-10-24T11:16:17.7530747Z ╰──── 2026-10-24T11:16:17.7530850Z  help: Consider removing this declaration. 2026-10-24T11:16:17.7530853Z 2026-10-24T11:16:17.7531072Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T11:16:17.7531207Z ╭─[apps/mobile/src/state/use-composer-drafts.ts:1022:15] 2026-10-24T11:16:17.7531274Z 1021 │ instanceId, 2026-10-24T11:16:17.7531417Z 1022 │ { ...(persisted.modelOptionMemory[instanceId] ?? {}), ...models }, 2026-10-24T11:16:17.7531561Z ·  ────────────────────────────────────────────────── 2026-10-24T11:16:17.7531625Z 1023 │ ]), 2026-10-24T11:16:17.7531677Z ╰──── 2026-10-24T11:16:17.7531950Z  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-24T11:16:17.7531955Z 2026-10-24T11:16:17.7532254Z ⚠ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:16:17.7532398Z ╭─[apps/web/src/components/preview/PreviewPanelShell.tsx:61:9] 2026-10-24T11:16:17.7532451Z 60 │ ) { 2026-10-24T11:16:17.7532620Z 61 │ const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded"; 2026-10-24T11:16:17.7532702Z ·  ──────┬────── 2026-10-24T11:16:17.7532841Z · ╰── 'useDragRegion' is declared here 2026-10-24T11:16:17.7532932Z 62 │ const isInline = props.mode === "inline"; 2026-10-24T11:16:17.7532983Z ╰──── 2026-10-24T11:16:17.7533085Z  help: Consider removing this declaration. 2026-10-24T11:16:17.7533137Z 2026-10-24T11:16:17.7533363Z ⚠ eslint(no-unused-vars): Identifier 'identity' is imported but never used. 2026-10-24T11:16:17.7533466Z ╭─[apps/server/src/auth/http.ts:28:10] 2026-10-24T11:16:17.7533555Z 27 │ import * as Schema from "effect/Schema"; 2026-10-24T11:16:17.7533645Z 28 │ import { identity } from "effect/Function"; 2026-10-24T11:16:17.7533719Z ·  ────┬─── 2026-10-24T11:16:17.7533855Z · ╰── 'identity' is imported here 2026-10-24T11:16:17.7533941Z 29 │ import * as Layer from "effect/Layer"; 2026-10-24T11:16:17.7533994Z ╰──── 2026-10-24T11:16:17.7534089Z  help: Consider removing this import. 2026-10-24T11:16:17.7534092Z 2026-10-24T11:16:17.7534302Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-24T11:16:17.7534472Z ╭─[apps/server/src/sourceControl/SourceControlProviderRegistry.ts:15:13] 2026-10-24T11:16:17.7534545Z 14 │ } from "@t3tools/contracts"; 2026-10-24T11:16:17.7534632Z 15 │ import type {} from "@t3tools/contracts"; 2026-10-24T11:16:17.7534702Z ·  ── 2026-10-24T11:16:17.7534878Z 16 │ import { detectSourceControlProviderFromRemoteUrl } from "@t3tools/shared/sourceControl"; 2026-10-24T11:16:17.7534928Z ╰──── 2026-10-24T11:16:17.7535008Z  help: Remove empty braces 2026-10-24T11:16:17.7535011Z 2026-10-24T11:16:17.7535203Z ⚠ eslint(no-unused-vars): Identifier 'Fiber' is imported but never used. 2026-10-24T11:16:17.7535295Z ╭─[apps/server/src/ws.ts:10:13] 2026-10-24T11:16:17.7535382Z  9 │ import * as Effect from "effect/Effect"; 2026-10-24T11:16:17.7535469Z 10 │ import * as Fiber from "effect/Fiber"; 2026-10-24T11:16:17.7535546Z ·  ──┬── 2026-10-24T11:16:17.7535677Z · ╰── 'Fiber' is imported here 2026-10-24T11:16:17.7535776Z 11 │ import * as FileSystem from "effect/FileSystem"; 2026-10-24T11:16:17.7535826Z ╰──── 2026-10-24T11:16:17.7535921Z  help: Consider removing this import. 2026-10-24T11:16:17.7535924Z 2026-10-24T11:16:17.7536117Z ⚠ eslint(no-unused-vars): Identifier 'Schedule' is imported but never used. 2026-10-24T11:16:17.7536210Z ╭─[apps/server/src/ws.ts:17:13] 2026-10-24T11:16:17.7536287Z 16 │ import * as Ref from "effect/Ref"; 2026-10-24T11:16:17.7536377Z 17 │ import * as Schedule from "effect/Schedule"; 2026-10-24T11:16:17.7536456Z ·  ────┬─── 2026-10-24T11:16:17.7536595Z · ╰── 'Schedule' is imported here 2026-10-24T11:16:17.7536681Z 18 │ import * as Schema from "effect/Schema"; 2026-10-24T11:16:17.7536732Z ╰──── 2026-10-24T11:16:17.7536828Z  help: Consider removing this import. 2026-10-24T11:16:17.7536830Z 2026-10-24T11:16:17.7537124Z ⚠ eslint(no-unused-vars): Variable 'projectSetupScriptRunner' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:16:17.7537222Z ╭─[apps/server/src/ws.ts:1285:13] 2026-10-24T11:16:17.7537377Z 1284 │ const usageLimitSources = yield* UsageLimitSources.UsageLimitSources; 2026-10-24T11:16:17.7537571Z 1285 │ const projectSetupScriptRunner = yield* ProjectSetupScriptRunner.ProjectSetupScriptRunner; 2026-10-24T11:16:17.7537676Z ·  ────────────┬─────────── 2026-10-24T11:16:17.7537897Z · ╰── 'projectSetupScriptRunner' is declared here 2026-10-24T11:16:17.7538095Z 1286 │ const worktreeSetupTracker = yield* WorktreeSetupTracker.WorktreeSetupTracker; 2026-10-24T11:16:17.7538150Z ╰──── 2026-10-24T11:16:17.7538252Z  help: Consider removing this declaration. 2026-10-24T11:16:17.7538255Z 2026-10-24T11:16:17.7538615Z ⚠ 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-24T11:16:17.7538740Z ╭─[apps/server/src/auth/RpcAuthorization.ts:237:17] 2026-10-24T11:16:17.7538876Z 236 │ const requiredScopesForSettingsUpdate = (payload: unknown) => { 2026-10-24T11:16:17.7539005Z 237 │ const input = Schema.decodeUnknownSync(SettingsUpdate)(payload); 2026-10-24T11:16:17.7539118Z ·  ──────────────────────── 2026-10-24T11:16:17.7539256Z 238 │ const scopes = requiredScopesForServerSettingsPatch(input.patch); 2026-10-24T11:16:17.7539306Z ╰──── 2026-10-24T11:16:17.7539308Z 2026-10-24T11:16:17.7539668Z ⚠ 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-24T11:16:17.7539790Z ╭─[apps/server/src/auth/RpcAuthorization.ts:256:26] 2026-10-24T11:16:17.7539888Z 255 │ if (method === WS_METHODS.assetsCreateUrl) { 2026-10-24T11:16:17.7540043Z 256 │ const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload); 2026-10-24T11:16:17.7540157Z ·  ──────────────────────── 2026-10-24T11:16:17.7540220Z 257 │ return [ 2026-10-24T11:16:17.7540276Z ╰──── 2026-10-24T11:16:17.7540284Z 2026-10-24T11:16:17.7540450Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T11:16:17.7540595Z ╭─[apps/web/src/components/chat/useThreadLifecycle.tsx:178:58] 2026-10-24T11:16:17.7540752Z 177 │ if (snoozeClockState.shell !== activeThreadShell) { 2026-10-24T11:16:17.7540915Z 178 │ setSnoozeClockState({ shell: activeThreadShell, now: new Date().toISOString() }); 2026-10-24T11:16:17.7541034Z ·  ─────┬──── 2026-10-24T11:16:17.7541207Z · ╰── Cannot call impure function 2026-10-24T11:16:17.7541263Z 179 │ } 2026-10-24T11:16:17.7541314Z ╰──── 2026-10-24T11:16:17.7541590Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T11:16:17.7541882Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T11:16:17.7541885Z 2026-10-24T11:16:17.7541967Z Found 0 errors and 367 warnings in 5430 files (5.4s, 8 threads) 2026-10-24T11:16:17.7953181Z Post job cleanup. 2026-10-24T11:16:17.8561174Z Cache hit occurred on the primary key electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309, not saving cache. 2026-10-24T11:16:17.8629950Z Post job cleanup. 2026-10-24T11:16:17.8641936Z ##[start-action display=Cache full pnpm store;id=__d04f6a03-a4ed-4fb8-ac3c-e47a36551aeb.__actions_cache] 2026-10-24T11:16:17.8976236Z Post job cleanup. 2026-10-24T11:16:17.9569880Z Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-8600a8d4a7fcc9519d421cef0c77201c793c5d8afbbef2897636b5b9305a9b7d, not saving cache. 2026-10-24T11:16:17.9597987Z ##[end-action id=__d04f6a03-a4ed-4fb8-ac3c-e47a36551aeb.__actions_cache;outcome=success;conclusion=success;duration_ms=95] 2026-10-24T11:16:17.9599639Z ##[start-action display=Cache Vite+;id=__d04f6a03-a4ed-4fb8-ac3c-e47a36551aeb.vp_cache] 2026-10-24T11:16:17.9619646Z Post job cleanup. 2026-10-24T11:16:18.0290496Z Cache hit occurred on the primary key vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0, not saving cache. 2026-10-24T11:16:18.0320692Z ##[end-action id=__d04f6a03-a4ed-4fb8-ac3c-e47a36551aeb.vp_cache;outcome=success;conclusion=success;duration_ms=72] 2026-10-24T11:16:18.0361030Z Post job cleanup. 2026-10-24T11:16:18.0776344Z [command]/usr/local/bin/git version 2026-10-24T11:16:18.0803489Z git version 2.55.0 2026-10-24T11:16:18.0819202Z Temporarily overriding HOME='/home/runner/_work/_temp/b30a242c-0806-472c-b4ca-9b5741ebaf05' before making global git config changes 2026-10-24T11:16:18.0819795Z Adding repository directory to the temporary git global config as a safe directory 2026-10-24T11:16:18.0821986Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-24T11:16:18.0841459Z Removing SSH command configuration 2026-10-24T11:16:18.0844323Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-24T11:16:18.0864475Z [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-24T11:16:18.0974929Z fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules 2026-10-24T11:16:18.0997094Z ##[warning]The process '/usr/local/bin/git' failed with exit code 128 2026-10-24T11:16:18.1030229Z A job completed hook has been configured by the self-hosted runner administrator 2026-10-24T11:16:18.1051454Z ##[group]Run '/job_completed.sh' 2026-10-24T11:16:18.1062232Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T11:16:18.1062423Z env: 2026-10-24T11:16:18.1062536Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 176 2026-10-24T11:16:18.1062681Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 368 2026-10-24T11:16:18.1062820Z BLACKSMITH_CHECK_RUN_ID: 120858150836 2026-10-24T11:16:18.1062960Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-24T11:16:18.1063097Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-24T11:16:18.1063227Z ##[endgroup] 2026-10-24T11:16:18.1138448Z Docker container cache not activated, skipping hash computation. 2026-10-24T11:16:18.1397521Z No active SSH sessions detected. Proceeding with shutdown immediately. 2026-10-24T11:16:18.1439048Z Cleaning up orphan processes