2026-10-23T11:11:17.1163222Z Current runner version: '2.337.0' 2026-10-23T11:11:17.1166396Z Runner name: 'blacksmith-8vcpu-ubuntu-2404-emy6xfgytjhr2nsj' 2026-10-23T11:11:17.1167039Z Runner group name: 'blacksmith scale sets - blacksmith-8vcpu-ubuntu-2404' 2026-10-23T11:11:17.1167749Z Machine name: 'ip-172-31-73-130' 2026-10-23T11:11:17.1169478Z ##[group]GITHUB_TOKEN Permissions 2026-10-23T11:11:17.1170753Z Contents: read 2026-10-23T11:11:17.1171165Z Metadata: read 2026-10-23T11:11:17.1171553Z ##[endgroup] 2026-10-23T11:11:17.1172762Z Secret source: Actions 2026-10-23T11:11:17.1173378Z Cache mode: write 2026-10-23T11:11:17.1173812Z Prepare workflow directory 2026-10-23T11:11:17.1348782Z Prepare all required actions 2026-10-23T11:11:17.1377324Z Getting action download info 2026-10-23T11:11:17.2691460Z Download action repository 'actions/checkout@v6' (SHA:d23441a48e516b6c34aea4fa41551a30e30af803) 2026-10-23T11:11:17.3005113Z Download action repository 'actions/cache@v6' (SHA:55cc8345863c7cc4c66a329aec7e433d2d1c52a9) 2026-10-23T11:11:17.4115151Z Setting BLACKSMITH_ACTIONS_RESULTS_URL to https://results-receiver.actions.githubusercontent.com/ 2026-10-23T11:11:17.4151071Z Complete job name: Lint 2026-10-23T11:11:17.4452856Z A job started hook has been configured by the self-hosted runner administrator 2026-10-23T11:11:17.4507167Z ##[group]Run '/setup.sh' 2026-10-23T11:11:17.4514304Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T11:11:17.4514701Z env: 2026-10-23T11:11:17.4514921Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 278 2026-10-23T11:11:17.4515211Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 438 2026-10-23T11:11:17.4515575Z BLACKSMITH_CHECK_RUN_ID: 120383083005 2026-10-23T11:11:17.4515860Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-23T11:11:17.4516128Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-23T11:11:17.4516388Z ##[endgroup] 2026-10-23T11:11:17.4715291Z Logging daemon started (blacksmithd for logs) 2026-10-23T11:11:17.4822761Z Results daemon started (blacksmithd for results) 2026-10-23T11:11:17.4955215Z Background adoption and SSH setup started (PID: 3144) 2026-10-23T11:11:17.4956408Z 2026-10-23T11:11:17.4956751Z ---------------------------------------- 2026-10-23T11:11:17.4957266Z View this job: https://app.blacksmith.sh/pingdotgg/runs/39944310734/jobs/120383083005 2026-10-23T11:11:17.4957664Z SSH Access (using your GitHub SSH key): 2026-10-23T11:11:17.4958089Z ssh -p 64000 runner@blacksmith-8vcpu-ubuntu-2404-emy6xfgytjhr2nsj.vm.blacksmith.sh 2026-10-23T11:11:17.4958391Z 2026-10-23T11:11:17.4958494Z No GitHub SSH key? Add one at: 2026-10-23T11:11:17.4958970Z https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account 2026-10-23T11:11:17.4959399Z 2026-10-23T11:11:17.4959497Z ---------------------------------------- 2026-10-23T11:11:17.4959665Z 2026-10-23T11:11:17.4959799Z VM ID: blacksmith-8vcpu-ubuntu-2404-emy6xfgytjhr2nsj 2026-10-23T11:11:17.4960105Z Host: production-152.236.30.36-x8664 2026-10-23T11:11:17.4960360Z Host Agent PID: 3034678 2026-10-23T11:11:17.4960588Z Host Agent Git SHA: af74fd76b 2026-10-23T11:11:17.4960843Z Host CPU Manufacturer: AuthenticAMD 2026-10-23T11:11:17.4961116Z Blacksmith Host Generation: gen 2 2026-10-23T11:11:17.4961395Z Petname: production-teaching-meerkat-abf7154b 2026-10-23T11:11:17.4961680Z Region: us-east 2026-10-23T11:11:17.4961903Z Rootfs Version: ubuntu24-full-x64-081926 2026-10-23T11:11:17.4967020Z OS Version: Ubuntu 24.04.4 LTS 2026-10-23T11:11:17.4967297Z 2026-10-23T11:11:17.4967473Z Enabling Blacksmith transparent cache 2026-10-23T11:11:17.5167456Z ##[group]Run actions/checkout@v6 2026-10-23T11:11:17.5167734Z with: 2026-10-23T11:11:17.5168047Z sparse-checkout: /* !/.repos/ !/apps/mobile/modules/t3-terminal/Vendor/**/*.a 2026-10-23T11:11:17.5168435Z sparse-checkout-cone-mode: false 2026-10-23T11:11:17.5168698Z repository: pingdotgg/t3code 2026-10-23T11:11:17.5170569Z token: *** 2026-10-23T11:11:17.5170770Z ssh-strict: true 2026-10-23T11:11:17.5170982Z ssh-user: git 2026-10-23T11:11:17.5171198Z persist-credentials: true 2026-10-23T11:11:17.5171578Z clean: true 2026-10-23T11:11:17.5171777Z fetch-depth: 1 2026-10-23T11:11:17.5171985Z fetch-tags: false 2026-10-23T11:11:17.5172203Z show-progress: true 2026-10-23T11:11:17.5172416Z lfs: false 2026-10-23T11:11:17.5172616Z submodules: false 2026-10-23T11:11:17.5172833Z set-safe-directory: true 2026-10-23T11:11:17.5173081Z allow-unsafe-pr-checkout: false 2026-10-23T11:11:17.5173325Z env: 2026-10-23T11:11:17.5173553Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 278 2026-10-23T11:11:17.5173834Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 438 2026-10-23T11:11:17.5174104Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T11:11:17.5174357Z ##[endgroup] 2026-10-23T11:11:17.6081913Z Syncing repository: pingdotgg/t3code 2026-10-23T11:11:17.6082780Z ##[group]Getting Git version info 2026-10-23T11:11:17.6083109Z Working directory is '/home/runner/_work/t3code/t3code' 2026-10-23T11:11:17.6083564Z [command]/usr/local/bin/git version 2026-10-23T11:11:17.6158045Z git version 2.55.0 2026-10-23T11:11:17.6170914Z ##[endgroup] 2026-10-23T11:11:17.6178335Z Temporarily overriding HOME='/home/runner/_work/_temp/5f66587b-6519-4594-acac-8c31ce3c0f58' before making global git config changes 2026-10-23T11:11:17.6178977Z Adding repository directory to the temporary git global config as a safe directory 2026-10-23T11:11:17.6182024Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-23T11:11:17.6211011Z Deleting the contents of '/home/runner/_work/t3code/t3code' 2026-10-23T11:11:17.6212594Z ##[group]Determining repository object format 2026-10-23T11:11:17.6213577Z ##[endgroup] 2026-10-23T11:11:17.6213923Z ##[group]Initializing the repository 2026-10-23T11:11:17.6215711Z [command]/usr/local/bin/git init /home/runner/_work/t3code/t3code 2026-10-23T11:11:17.6247185Z hint: Using 'master' as the name for the initial branch. This default branch name 2026-10-23T11:11:17.6247659Z hint: will change to "main" in Git 3.0. To configure the initial branch name 2026-10-23T11:11:17.6248110Z hint: to use in all of your new repositories, which will suppress this warning, 2026-10-23T11:11:17.6248468Z hint: call: 2026-10-23T11:11:17.6248662Z hint: 2026-10-23T11:11:17.6248925Z hint: git config --global init.defaultBranch 2026-10-23T11:11:17.6249274Z hint: 2026-10-23T11:11:17.6249552Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and 2026-10-23T11:11:17.6250000Z hint: 'development'. The just-created branch can be renamed via this command: 2026-10-23T11:11:17.6250353Z hint: 2026-10-23T11:11:17.6250556Z hint: git branch -m 2026-10-23T11:11:17.6250780Z hint: 2026-10-23T11:11:17.6251089Z hint: Disable this message with "git config set advice.defaultBranchName false" 2026-10-23T11:11:17.6251551Z Initialized empty Git repository in /home/runner/_work/t3code/t3code/.git/ 2026-10-23T11:11:17.6252618Z [command]/usr/local/bin/git remote add origin https://github.com/pingdotgg/t3code 2026-10-23T11:11:17.6277366Z ##[endgroup] 2026-10-23T11:11:17.6277744Z ##[group]Disabling automatic garbage collection 2026-10-23T11:11:17.6279484Z [command]/usr/local/bin/git config --local gc.auto 0 2026-10-23T11:11:17.6297236Z ##[endgroup] 2026-10-23T11:11:17.6297614Z ##[group]Setting up auth 2026-10-23T11:11:17.6298023Z Removing SSH command configuration 2026-10-23T11:11:17.6301284Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-23T11:11:17.6321478Z [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-23T11:11:17.6442837Z Removing HTTP extra header 2026-10-23T11:11:17.6445870Z [command]/usr/local/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader 2026-10-23T11:11:17.6468335Z [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-23T11:11:17.6561346Z Removing includeIf entries pointing to credentials config files 2026-10-23T11:11:17.6564618Z [command]/usr/local/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: 2026-10-23T11:11:17.6584613Z [command]/usr/local/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url 2026-10-23T11:11:17.6683608Z [command]/usr/local/bin/git config --file /home/runner/_work/_temp/git-credentials-b212dd23-59ac-4390-8b0a-a215ffa35aee.config http.https://github.com/.extraheader AUTHORIZATION: basic *** 2026-10-23T11:11:17.6727819Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git.path /home/runner/_work/_temp/git-credentials-b212dd23-59ac-4390-8b0a-a215ffa35aee.config 2026-10-23T11:11:17.6745540Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git/worktrees/*.path /home/runner/_work/_temp/git-credentials-b212dd23-59ac-4390-8b0a-a215ffa35aee.config 2026-10-23T11:11:17.6768098Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-b212dd23-59ac-4390-8b0a-a215ffa35aee.config 2026-10-23T11:11:17.6788242Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-b212dd23-59ac-4390-8b0a-a215ffa35aee.config 2026-10-23T11:11:17.6807536Z ##[endgroup] 2026-10-23T11:11:17.6807884Z ##[group]Fetching the repository 2026-10-23T11:11:17.6812609Z [command]/usr/local/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --filter=blob:none --depth=1 origin +24c063ae804b38e4a900ae54fda55865293a333a:refs/remotes/origin/main 2026-10-23T11:11:17.9863129Z From https://github.com/pingdotgg/t3code 2026-10-23T11:11:17.9864318Z * [new ref] 24c063ae804b38e4a900ae54fda55865293a333a -> origin/main 2026-10-23T11:11:17.9888946Z [command]/usr/local/bin/git branch --list --remote origin/main 2026-10-23T11:11:17.9909393Z origin/main 2026-10-23T11:11:17.9913632Z [command]/usr/local/bin/git rev-parse refs/remotes/origin/main 2026-10-23T11:11:17.9929064Z 24c063ae804b38e4a900ae54fda55865293a333a 2026-10-23T11:11:17.9931083Z ##[endgroup] 2026-10-23T11:11:17.9931795Z ##[group]Determining the checkout info 2026-10-23T11:11:17.9932617Z ##[endgroup] 2026-10-23T11:11:17.9933365Z ##[group]Setting up sparse checkout 2026-10-23T11:11:17.9934074Z [command]/usr/local/bin/git config core.sparseCheckout true 2026-10-23T11:11:17.9952275Z [command]/usr/local/bin/git rev-parse --git-path info/sparse-checkout 2026-10-23T11:11:17.9967763Z .git/info/sparse-checkout 2026-10-23T11:11:17.9971136Z ##[endgroup] 2026-10-23T11:11:17.9972064Z ##[group]Checking out the ref 2026-10-23T11:11:17.9973412Z [command]/usr/local/bin/git checkout --progress --force -B main refs/remotes/origin/main 2026-10-23T11:11:24.7621868Z Updating files: 0% (1/6304) 2026-10-23T11:11:24.7651427Z Updating files: 1% (64/6304) 2026-10-23T11:11:24.7669214Z Updating files: 2% (127/6304) 2026-10-23T11:11:24.7691356Z Updating files: 3% (190/6304) 2026-10-23T11:11:24.7711624Z Updating files: 4% (253/6304) 2026-10-23T11:11:24.7741475Z Updating files: 5% (316/6304) 2026-10-23T11:11:24.7760933Z Updating files: 6% (379/6304) 2026-10-23T11:11:24.7817291Z Updating files: 7% (442/6304) 2026-10-23T11:11:24.7854948Z Updating files: 8% (505/6304) 2026-10-23T11:11:24.7879243Z Updating files: 9% (568/6304) 2026-10-23T11:11:24.8171463Z Updating files: 10% (631/6304) 2026-10-23T11:11:24.8192248Z Updating files: 11% (694/6304) 2026-10-23T11:11:24.8202980Z Updating files: 12% (757/6304) 2026-10-23T11:11:24.8216500Z Updating files: 13% (820/6304) 2026-10-23T11:11:24.8232076Z Updating files: 14% (883/6304) 2026-10-23T11:11:24.8249142Z Updating files: 15% (946/6304) 2026-10-23T11:11:24.8267345Z Updating files: 16% (1009/6304) 2026-10-23T11:11:24.8282369Z Updating files: 17% (1072/6304) 2026-10-23T11:11:24.8300187Z Updating files: 18% (1135/6304) 2026-10-23T11:11:24.8314574Z Updating files: 19% (1198/6304) 2026-10-23T11:11:24.8336295Z Updating files: 20% (1261/6304) 2026-10-23T11:11:24.8354041Z Updating files: 21% (1324/6304) 2026-10-23T11:11:24.8372073Z Updating files: 22% (1387/6304) 2026-10-23T11:11:24.8384789Z Updating files: 23% (1450/6304) 2026-10-23T11:11:24.8397490Z Updating files: 24% (1513/6304) 2026-10-23T11:11:24.8412513Z Updating files: 25% (1576/6304) 2026-10-23T11:11:24.8425411Z Updating files: 26% (1640/6304) 2026-10-23T11:11:24.8438822Z Updating files: 27% (1703/6304) 2026-10-23T11:11:24.8457351Z Updating files: 28% (1766/6304) 2026-10-23T11:11:24.8489970Z Updating files: 29% (1829/6304) 2026-10-23T11:11:24.8508350Z Updating files: 30% (1892/6304) 2026-10-23T11:11:24.8531641Z Updating files: 31% (1955/6304) 2026-10-23T11:11:24.8560072Z Updating files: 32% (2018/6304) 2026-10-23T11:11:24.8587849Z Updating files: 33% (2081/6304) 2026-10-23T11:11:24.8654426Z Updating files: 34% (2144/6304) 2026-10-23T11:11:24.8709995Z Updating files: 35% (2207/6304) 2026-10-23T11:11:24.8739758Z Updating files: 36% (2270/6304) 2026-10-23T11:11:24.8774025Z Updating files: 37% (2333/6304) 2026-10-23T11:11:24.8816102Z Updating files: 38% (2396/6304) 2026-10-23T11:11:24.8841169Z Updating files: 39% (2459/6304) 2026-10-23T11:11:24.8871251Z Updating files: 40% (2522/6304) 2026-10-23T11:11:24.8901796Z Updating files: 41% (2585/6304) 2026-10-23T11:11:24.8917952Z Updating files: 42% (2648/6304) 2026-10-23T11:11:24.8928872Z Updating files: 43% (2711/6304) 2026-10-23T11:11:24.8947996Z Updating files: 44% (2774/6304) 2026-10-23T11:11:24.8977115Z Updating files: 45% (2837/6304) 2026-10-23T11:11:24.8999730Z Updating files: 46% (2900/6304) 2026-10-23T11:11:24.9026743Z Updating files: 47% (2963/6304) 2026-10-23T11:11:24.9053534Z Updating files: 48% (3026/6304) 2026-10-23T11:11:24.9083319Z Updating files: 49% (3089/6304) 2026-10-23T11:11:24.9120581Z Updating files: 50% (3152/6304) 2026-10-23T11:11:24.9135791Z Updating files: 51% (3216/6304) 2026-10-23T11:11:24.9168884Z Updating files: 52% (3279/6304) 2026-10-23T11:11:24.9194348Z Updating files: 53% (3342/6304) 2026-10-23T11:11:24.9216296Z Updating files: 54% (3405/6304) 2026-10-23T11:11:24.9241977Z Updating files: 55% (3468/6304) 2026-10-23T11:11:24.9263151Z Updating files: 56% (3531/6304) 2026-10-23T11:11:24.9285250Z Updating files: 57% (3594/6304) 2026-10-23T11:11:24.9303459Z Updating files: 58% (3657/6304) 2026-10-23T11:11:24.9667925Z Updating files: 59% (3720/6304) 2026-10-23T11:11:24.9680856Z Updating files: 60% (3783/6304) 2026-10-23T11:11:24.9696621Z Updating files: 61% (3846/6304) 2026-10-23T11:11:24.9714240Z Updating files: 62% (3909/6304) 2026-10-23T11:11:24.9736012Z Updating files: 63% (3972/6304) 2026-10-23T11:11:24.9762372Z Updating files: 64% (4035/6304) 2026-10-23T11:11:24.9782438Z Updating files: 65% (4098/6304) 2026-10-23T11:11:24.9797848Z Updating files: 66% (4161/6304) 2026-10-23T11:11:24.9822068Z Updating files: 67% (4224/6304) 2026-10-23T11:11:24.9834334Z Updating files: 68% (4287/6304) 2026-10-23T11:11:24.9852850Z Updating files: 69% (4350/6304) 2026-10-23T11:11:24.9864488Z Updating files: 70% (4413/6304) 2026-10-23T11:11:24.9880268Z Updating files: 71% (4476/6304) 2026-10-23T11:11:24.9897409Z Updating files: 72% (4539/6304) 2026-10-23T11:11:24.9921613Z Updating files: 73% (4602/6304) 2026-10-23T11:11:25.0174980Z Updating files: 74% (4665/6304) 2026-10-23T11:11:25.0215274Z Updating files: 75% (4728/6304) 2026-10-23T11:11:25.0358262Z Updating files: 75% (4733/6304) 2026-10-23T11:11:25.0379857Z Updating files: 76% (4792/6304) 2026-10-23T11:11:25.0399096Z Updating files: 77% (4855/6304) 2026-10-23T11:11:25.0423869Z Updating files: 78% (4918/6304) 2026-10-23T11:11:25.0443683Z Updating files: 79% (4981/6304) 2026-10-23T11:11:25.0461247Z Updating files: 80% (5044/6304) 2026-10-23T11:11:25.0478782Z Updating files: 81% (5107/6304) 2026-10-23T11:11:25.0497318Z Updating files: 82% (5170/6304) 2026-10-23T11:11:25.0513158Z Updating files: 83% (5233/6304) 2026-10-23T11:11:25.0534882Z Updating files: 84% (5296/6304) 2026-10-23T11:11:25.0553362Z Updating files: 85% (5359/6304) 2026-10-23T11:11:25.0574453Z Updating files: 86% (5422/6304) 2026-10-23T11:11:25.0642055Z Updating files: 87% (5485/6304) 2026-10-23T11:11:25.0673582Z Updating files: 88% (5548/6304) 2026-10-23T11:11:25.0690477Z Updating files: 89% (5611/6304) 2026-10-23T11:11:25.0719563Z Updating files: 90% (5674/6304) 2026-10-23T11:11:25.0758637Z Updating files: 91% (5737/6304) 2026-10-23T11:11:25.0775338Z Updating files: 92% (5800/6304) 2026-10-23T11:11:25.0792957Z Updating files: 93% (5863/6304) 2026-10-23T11:11:25.0814805Z Updating files: 94% (5926/6304) 2026-10-23T11:11:25.0839922Z Updating files: 95% (5989/6304) 2026-10-23T11:11:25.0897059Z Updating files: 96% (6052/6304) 2026-10-23T11:11:25.0927414Z Updating files: 97% (6115/6304) 2026-10-23T11:11:25.0981551Z Updating files: 98% (6178/6304) 2026-10-23T11:11:25.1005453Z Updating files: 99% (6241/6304) 2026-10-23T11:11:25.1005716Z Updating files: 100% (6304/6304) 2026-10-23T11:11:25.1005890Z Updating files: 100% (6304/6304), done. 2026-10-23T11:11:25.1165435Z Switched to a new branch 'main' 2026-10-23T11:11:25.1166193Z branch 'main' set up to track 'origin/main'. 2026-10-23T11:11:25.1179952Z ##[endgroup] 2026-10-23T11:11:25.1213282Z [command]/usr/local/bin/git log -1 --format=%H 2026-10-23T11:11:25.1232988Z 24c063ae804b38e4a900ae54fda55865293a333a 2026-10-23T11:11:25.1309264Z ##[group]Run files="$(git ls-files .github/pr-assets)" 2026-10-23T11:11:25.1309547Z files="$(git ls-files .github/pr-assets)" 2026-10-23T11:11:25.1309755Z if test -n "$files"; then 2026-10-23T11:11:25.1310005Z  printf 'PR evidence must be uploaded to GitHub, not committed:\n%s\n' "$files" >&2 2026-10-23T11:11:25.1310238Z  exit 1 2026-10-23T11:11:25.1310366Z fi 2026-10-23T11:11:25.1319195Z shell: /usr/bin/bash -e {0} 2026-10-23T11:11:25.1319356Z env: 2026-10-23T11:11:25.1319507Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 278 2026-10-23T11:11:25.1319677Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 438 2026-10-23T11:11:25.1319841Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T11:11:25.1319997Z ##[endgroup] 2026-10-23T11:11:25.1469663Z Prepare all required actions 2026-10-23T11:11:25.1470128Z Getting action download info 2026-10-23T11:11:25.2299246Z Download action repository 'voidzero-dev/setup-vp@v1' (SHA:250f29ce396baf5e8f24498e17c0dfdebabc26eb) 2026-10-23T11:11:25.3285245Z ##[group]Run ./.github/actions/setup-ci-deps 2026-10-23T11:11:25.3285443Z env: 2026-10-23T11:11:25.3285584Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 278 2026-10-23T11:11:25.3285753Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 438 2026-10-23T11:11:25.3285920Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T11:11:25.3286082Z ##[endgroup] 2026-10-23T11:11:25.3383661Z ##[start-action display=Resolve Vite+ version;id=__self.vp] 2026-10-23T11:11:25.3397574Z ##[group]Run echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-23T11:11:25.3398014Z echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-23T11:11:25.3398336Z echo "node=$(jq -r '.engines.node' package.json)" >> "$GITHUB_OUTPUT" 2026-10-23T11:11:25.3398599Z echo "pnpm=$(jq -r '.packageManager' package.json)" >> "$GITHUB_OUTPUT" 2026-10-23T11:11:25.3406938Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T11:11:25.3407126Z env: 2026-10-23T11:11:25.3407266Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 278 2026-10-23T11:11:25.3407436Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 438 2026-10-23T11:11:25.3407603Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T11:11:25.3407759Z ##[endgroup] 2026-10-23T11:11:25.3482523Z ##[end-action id=__self.vp;outcome=success;conclusion=success;duration_ms=9] 2026-10-23T11:11:25.3484539Z ##[start-action display=Cache Vite+;id=__self.vp_cache] 2026-10-23T11:11:25.3532119Z ##[group]Run actions/cache@v6 2026-10-23T11:11:25.3532423Z with: 2026-10-23T11:11:25.3532562Z path: ~/.vite-plus 2026-10-23T11:11:25.3532763Z key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-23T11:11:25.3532990Z enableCrossOsArchive: false 2026-10-23T11:11:25.3533154Z fail-on-cache-miss: false 2026-10-23T11:11:25.3533306Z lookup-only: false 2026-10-23T11:11:25.3533444Z save-always: false 2026-10-23T11:11:25.3533585Z env: 2026-10-23T11:11:25.3533724Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 278 2026-10-23T11:11:25.3533903Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 438 2026-10-23T11:11:25.3534076Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T11:11:25.3534242Z ##[endgroup] 2026-10-23T11:11:25.5497461Z Cache hit for: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-23T11:11:25.9674771Z Received 170349591 of 170349591 (100.0%), 415.5 MBs/sec 2026-10-23T11:11:25.9675447Z Cache Size: ~162 MB (170349591 B) 2026-10-23T11:11:25.9720351Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/85c33824-bb1e-49a9-a0ec-4dbaff41c3c1/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-23T11:11:26.5803688Z Cache restored successfully 2026-10-23T11:11:26.5945187Z Cache restored from key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-23T11:11:26.6003460Z ##[end-action id=__self.vp_cache;outcome=success;conclusion=success;duration_ms=1251] 2026-10-23T11:11:26.6005953Z ##[start-action display=Use cached Vite+;id=__self.__run] 2026-10-23T11:11:26.6024879Z ##[group]Run echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-23T11:11:26.6025124Z echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-23T11:11:26.6025298Z "$HOME/.vite-plus/bin/vp" env use "26.12.1" 2026-10-23T11:11:26.6033493Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T11:11:26.6033660Z env: 2026-10-23T11:11:26.6033775Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 278 2026-10-23T11:11:26.6033921Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 438 2026-10-23T11:11:26.6034070Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T11:11:26.6034214Z ##[endgroup] 2026-10-23T11:11:26.6067225Z Using Node.js v26.12.1 (resolved from 26.12.1) 2026-10-23T11:11:26.6074662Z ##[end-action id=__self.__run;outcome=success;conclusion=success;duration_ms=6] 2026-10-23T11:11:26.6076495Z ##[start-action display=Setup Vite+;id=__self.__voidzero-dev_setup-vp] 2026-10-23T11:11:26.6081265Z ##[end-action id=__self.__voidzero-dev_setup-vp;outcome=skipped;conclusion=skipped;duration_ms=0] 2026-10-23T11:11:26.6082708Z ##[start-action display=Resolve pnpm store path;id=__self.pnpm_store] 2026-10-23T11:11:26.6094421Z ##[group]Run store_path="$(vp pm cache dir)" 2026-10-23T11:11:26.6094689Z store_path="$(vp pm cache dir)" 2026-10-23T11:11:26.6094944Z echo "path=$store_path" >> "$GITHUB_OUTPUT" 2026-10-23T11:11:26.6103116Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T11:11:26.6103288Z env: 2026-10-23T11:11:26.6103406Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 278 2026-10-23T11:11:26.6103556Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 438 2026-10-23T11:11:26.6103695Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T11:11:26.6103835Z ##[endgroup] 2026-10-23T11:11:26.6229519Z ##[end-action id=__self.pnpm_store;outcome=success;conclusion=success;duration_ms=14] 2026-10-23T11:11:26.6231483Z ##[start-action display=Cache full pnpm store;id=__self.__actions_cache] 2026-10-23T11:11:26.6787088Z ##[group]Run actions/cache@v6 2026-10-23T11:11:26.6787316Z with: 2026-10-23T11:11:26.6787527Z path: /home/runner/.local/share/pnpm/store/v11 2026-10-23T11:11:26.6787943Z key: pnpm-full-v1-Linux-X64-2baa264059789b1dde4bbc8fdc5b8342f31f2fc8e6176e5c5e486efdd242b36c 2026-10-23T11:11:26.6788351Z restore-keys: pnpm-full-v1-Linux-X64- 2026-10-23T11:11:26.6788598Z enableCrossOsArchive: false 2026-10-23T11:11:26.6788817Z fail-on-cache-miss: false 2026-10-23T11:11:26.6789064Z lookup-only: false 2026-10-23T11:11:26.6789248Z save-always: false 2026-10-23T11:11:26.6789434Z env: 2026-10-23T11:11:26.6789609Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 278 2026-10-23T11:11:26.6790141Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 438 2026-10-23T11:11:26.6790366Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T11:11:26.6790604Z ##[endgroup] 2026-10-23T11:11:26.8812104Z Cache hit for: pnpm-full-v1-Linux-X64-2baa264059789b1dde4bbc8fdc5b8342f31f2fc8e6176e5c5e486efdd242b36c 2026-10-23T11:11:27.9071280Z Received 536870912 of 994615207 (54.0%), 511.5 MBs/sec 2026-10-23T11:11:28.7943555Z Received 994615207 of 994615207 (100.0%), 502.1 MBs/sec 2026-10-23T11:11:28.7945017Z Cache Size: ~949 MB (994615207 B) 2026-10-23T11:11:28.7978792Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/31fa6dec-cae9-40a0-a64b-c2b42b916933/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-23T11:11:34.4699780Z Cache restored successfully 2026-10-23T11:11:34.5239680Z Cache restored from key: pnpm-full-v1-Linux-X64-2baa264059789b1dde4bbc8fdc5b8342f31f2fc8e6176e5c5e486efdd242b36c 2026-10-23T11:11:34.5379935Z ##[end-action id=__self.__actions_cache;outcome=success;conclusion=success;duration_ms=7914] 2026-10-23T11:11:34.5383504Z ##[start-action display=Install dependencies;id=__self.__run_2] 2026-10-23T11:11:34.5398926Z ##[group]Run vp install 2026-10-23T11:11:34.5399103Z vp install 2026-10-23T11:11:34.5410584Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T11:11:34.5410782Z env: 2026-10-23T11:11:34.5410927Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 278 2026-10-23T11:11:34.5411099Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 438 2026-10-23T11:11:34.5411291Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T11:11:34.5411445Z ##[endgroup] 2026-10-23T11:11:34.5819437Z Scope: all 33 workspace projects 2026-10-23T11:11:34.7108846Z ? Verifying lockfile against supply-chain policies (2088 entries)... 2026-10-23T11:11:35.0765012Z Packages are hard linked from the content-addressable store to the virtual store. 2026-10-23T11:11:35.0788386Z Content-addressable store is at: /home/runner/.local/share/pnpm/store/v11 2026-10-23T11:11:35.0789091Z Virtual store is at: node_modules/.pnpm 2026-10-23T11:11:37.5100383Z ✓ Lockfile passes supply-chain policies (2088 entries in 2.8s) 2026-10-23T11:11:37.5100704Z Lockfile is up to date, resolution step is skipped 2026-10-23T11:11:37.5353666Z Packages: +1721 2026-10-23T11:11:37.5353956Z ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2026-10-23T11:11:37.6047754Z Progress: resolved 1721, reused 1718, downloaded 0, added 1721, done 2026-10-23T11:11:38.6226529Z . prepare$ vp config --no-agent 2026-10-23T11:11:38.7233489Z . prepare: Done 2026-10-23T11:11:38.7246902Z 2026-10-23T11:11:38.7247210Z devDependencies: 2026-10-23T11:11:38.7247387Z + @coderabbitai/config 1.1.0 2026-10-23T11:11:38.7247527Z + @shadcn/lint 0.1.5 2026-10-23T11:11:38.7247708Z + @types/node 24.12.4 2026-10-23T11:11:38.7247836Z + knip 6.34.0 2026-10-23T11:11:38.7247966Z + typescript <- @tsc-rs/typescript 0.8.0 2026-10-23T11:11:38.7248130Z + vite-plus 1.3.0 2026-10-23T11:11:38.7248198Z 2026-10-23T11:11:38.7263145Z Done in 4.2s using pnpm v12.14.0 2026-10-23T11:11:38.7418465Z ##[end-action id=__self.__run_2;outcome=success;conclusion=success;duration_ms=4203] 2026-10-23T11:11:38.7975579Z ##[group]Run actions/cache@v6 2026-10-23T11:11:38.7975768Z with: 2026-10-23T11:11:38.7975891Z path: ~/.cache/electron 2026-10-23T11:11:38.7976149Z key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-23T11:11:38.7976407Z enableCrossOsArchive: false 2026-10-23T11:11:38.7976552Z fail-on-cache-miss: false 2026-10-23T11:11:38.7976681Z lookup-only: false 2026-10-23T11:11:38.7976802Z save-always: false 2026-10-23T11:11:38.7976913Z env: 2026-10-23T11:11:38.7977029Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 278 2026-10-23T11:11:38.7977179Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 438 2026-10-23T11:11:38.7977340Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T11:11:38.7977482Z ##[endgroup] 2026-10-23T11:11:39.0080794Z Cache hit for: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-23T11:11:39.1834457Z Received 122906203 of 122906203 (100.0%), 737.2 MBs/sec 2026-10-23T11:11:39.1839871Z Cache Size: ~117 MB (122906203 B) 2026-10-23T11:11:39.1904370Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/d52292aa-f376-4f00-bea3-d791d47fd6a2/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-23T11:11:39.2777899Z Cache restored successfully 2026-10-23T11:11:39.2930680Z Cache restored from key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-23T11:11:39.3022818Z ##[group]Run vp run --filter @t3tools/desktop ensure:electron 2026-10-23T11:11:39.3023111Z vp run --filter @t3tools/desktop ensure:electron 2026-10-23T11:11:39.3033058Z shell: /usr/bin/bash -e {0} 2026-10-23T11:11:39.3033194Z env: 2026-10-23T11:11:39.3033519Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 278 2026-10-23T11:11:39.3033669Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 438 2026-10-23T11:11:39.3033809Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T11:11:39.3033947Z ##[endgroup] 2026-10-23T11:11:39.4838806Z ~/apps/desktop$ node scripts/ensure-electron-runtime.mjs ⊘ cache disabled 2026-10-23T11:11:40.0709206Z /home/runner/_work/t3code/t3code/node_modules/.pnpm/electron@44.9.3_supports-color@8.1.1/node_modules/electron/dist/electron 2026-10-23T11:11:40.0743232Z 2026-10-23T11:11:40.0882662Z ##[group]Run vp run knip:check 2026-10-23T11:11:40.0882984Z vp run knip:check 2026-10-23T11:11:40.0895746Z shell: /usr/bin/bash -e {0} 2026-10-23T11:11:40.0895887Z env: 2026-10-23T11:11:40.0896011Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 278 2026-10-23T11:11:40.0896196Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 438 2026-10-23T11:11:40.0896388Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T11:11:40.0896533Z ##[endgroup] 2026-10-23T11:11:40.2749820Z $ knip --include files,dependencies --no-config-hints ⊘ cache disabled 2026-10-23T11:11:44.1949089Z 2026-10-23T11:11:44.1951847Z $ 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-23T11:12:11.8878839Z 2026-10-23T11:12:11.8879960Z --- 2026-10-23T11:12:11.8880224Z vp run: 2/2 successful. (Run `vp run --last-details` for full details) 2026-10-23T11:12:11.8943820Z ##[group]Run vp run --filter @t3tools/source-control-github generate --check 2026-10-23T11:12:11.8944150Z vp run --filter @t3tools/source-control-github generate --check 2026-10-23T11:12:11.8952220Z shell: /usr/bin/bash -e {0} 2026-10-23T11:12:11.8952346Z env: 2026-10-23T11:12:11.8952456Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 278 2026-10-23T11:12:11.8952600Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 438 2026-10-23T11:12:11.8952740Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T11:12:11.8952876Z ##[endgroup] 2026-10-23T11:12:12.0381092Z ~/packages/source-control-github$ graphqlgen --check ⊘ cache disabled 2026-10-23T11:12:12.2237214Z 2026-10-23T11:12:12.2305810Z ##[group]Run vp run --filter t3 generate --check 2026-10-23T11:12:12.2318031Z vp run --filter t3 generate --check 2026-10-23T11:12:12.2325730Z shell: /usr/bin/bash -e {0} 2026-10-23T11:12:12.2325865Z env: 2026-10-23T11:12:12.2326017Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 278 2026-10-23T11:12:12.2326162Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 438 2026-10-23T11:12:12.2326300Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T11:12:12.2326433Z ##[endgroup] 2026-10-23T11:12:12.3732906Z ~/apps/server$ graphqlgen --check ⊘ cache disabled 2026-10-23T11:12:12.5179553Z 2026-10-23T11:12:12.5246197Z ##[group]Run vp check 2026-10-23T11:12:12.5246416Z vp check 2026-10-23T11:12:12.5255380Z shell: /usr/bin/bash -e {0} 2026-10-23T11:12:12.5255515Z env: 2026-10-23T11:12:12.5255626Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 278 2026-10-23T11:12:12.5255775Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 438 2026-10-23T11:12:12.5255916Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T11:12:12.5256057Z ##[endgroup] 2026-10-23T11:12:13.0586056Z pass: All 5661 files are correctly formatted (397ms, 8 threads) 2026-10-23T11:12:18.2209834Z warn: Lint warnings found 2026-10-23T11:12:18.2211169Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-23T11:12:18.2211723Z ╭─[packages/shared/src/serverSettings.ts:346:9] 2026-10-23T11:12:18.2212107Z 345 │ const entry: ProjectSettingsOverrides = { 2026-10-23T11:12:18.2212484Z 346 │ ...(entries.get(projectId) ?? currentEntries[projectId] ?? {}), 2026-10-23T11:12:18.2212965Z ·  ────────────────────────────────────────────────────────────── 2026-10-23T11:12:18.2213271Z 347 │ }; 2026-10-23T11:12:18.2213468Z ╰──── 2026-10-23T11:12:18.2213812Z  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-23T11:12:18.2214238Z 2026-10-23T11:12:18.2214647Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in Array.prototype.reduce() 2026-10-23T11:12:18.2215207Z ╭─[packages/shared/src/serverSettings.ts:448:24] 2026-10-23T11:12:18.2215530Z 447 │ const favorites = 2026-10-23T11:12:18.2215840Z 448 │ setModelFavorites?.reduce((current, change) => { 2026-10-23T11:12:18.2216182Z ·  ───┬── 2026-10-23T11:12:18.2216572Z · ╰── For this reduce 2026-10-23T11:12:18.2216895Z 449 │ const exists = current.some( 2026-10-23T11:12:18.2217185Z 450 │ (favorite) => favorite.provider === change.provider && favorite.model === change.model, 2026-10-23T11:12:18.2217419Z 451 │ ); 2026-10-23T11:12:18.2217591Z 452 │ return change.favorite 2026-10-23T11:12:18.2217875Z 453 │ ? exists 2026-10-23T11:12:18.2218100Z 454 │ ? current 2026-10-23T11:12:18.2218458Z 455 │ : [...current, { provider: change.provider, model: change.model }] 2026-10-23T11:12:18.2218833Z ·  ─────┬──── 2026-10-23T11:12:18.2219174Z · ╰── From this spread 2026-10-23T11:12:18.2219489Z 456 │ : current.filter( 2026-10-23T11:12:18.2219710Z ╰──── 2026-10-23T11:12:18.2220131Z  help: Consider using `Object.assign()` or `Array.prototype.push()` to mutate the accumulator instead. 2026-10-23T11:12:18.2220712Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-23T11:12:18.2220984Z 2026-10-23T11:12:18.2221288Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-23T11:12:18.2221776Z ╭─[packages/shared/src/serverSettings.ts:466:3] 2026-10-23T11:12:18.2222090Z 464 │ null; 2026-10-23T11:12:18.2222384Z 465 │ let nextModelPreferences = initialModelPreferences; 2026-10-23T11:12:18.2222734Z ·  ──────────┬───────── 2026-10-23T11:12:18.2223093Z · ╰── From this accumulator 2026-10-23T11:12:18.2223472Z 466 │ for (const change of setModelsHidden ?? []) { 2026-10-23T11:12:18.2223758Z ·  ─┬─ 2026-10-23T11:12:18.2224045Z · ╰── For this loop 2026-10-23T11:12:18.2224444Z 467 │ const preferences = nextModelPreferences?.[change.provider] ?? { 2026-10-23T11:12:18.2224783Z 468 │ hiddenModels: [], 2026-10-23T11:12:18.2225031Z 469 │ modelOrder: [], 2026-10-23T11:12:18.2225251Z 470 │ }; 2026-10-23T11:12:18.2225647Z 471 │ const hiddenModels = preferences.hiddenModels.filter((model) => model !== change.model); 2026-10-23T11:12:18.2226343Z 472 │ if (change.hidden) hiddenModels.push(change.model); 2026-10-23T11:12:18.2226726Z 473 │ nextModelPreferences = { 2026-10-23T11:12:18.2226999Z 474 │ ...nextModelPreferences, 2026-10-23T11:12:18.2227302Z ·  ───────────┬─────────── 2026-10-23T11:12:18.2227674Z · ╰── From this spread 2026-10-23T11:12:18.2228081Z 475 │ [change.provider]: { ...preferences, hiddenModels }, 2026-10-23T11:12:18.2228373Z ╰──── 2026-10-23T11:12:18.2228712Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-23T11:12:18.2229237Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-23T11:12:18.2229506Z 2026-10-23T11:12:18.2230274Z ⚠ 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-23T11:12:18.2230897Z ╭─[packages/effect-acp/src/protocol.test.ts:500:31] 2026-10-23T11:12:18.2231087Z 499 │ 2026-10-23T11:12:18.2231266Z 500 │ const response = yield* Schema.decodeUnknownEffect( 2026-10-23T11:12:18.2231516Z ·  ────────────────────────── 2026-10-23T11:12:18.2231751Z 501 │ Schema.fromJsonString(JsonRpcErrorResponse), 2026-10-23T11:12:18.2231928Z ╰──── 2026-10-23T11:12:18.2231986Z 2026-10-23T11:12:18.2232218Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-23T11:12:18.2232560Z ╭─[packages/shared/src/composerContextLegacySend.ts:19:45] 2026-10-23T11:12:18.2232840Z 18 │ const occurrences = collectComposerContextReferences(text); 2026-10-23T11:12:18.2233086Z 19 │ for (const occurrence of [...occurrences].reverse()) { 2026-10-23T11:12:18.2233324Z ·  ─────── 2026-10-23T11:12:18.2233548Z 20 │ const record = recordsById.get(occurrence.contextId); 2026-10-23T11:12:18.2233726Z ╰──── 2026-10-23T11:12:18.2234046Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-23T11:12:18.2234293Z 2026-10-23T11:12:18.2234751Z ⚠ 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-23T11:12:18.2235282Z ╭─[packages/effect-acp/src/errors.test.ts:129:28] 2026-10-23T11:12:18.2235626Z 128 │ const secret = "acp-summary-secret"; 2026-10-23T11:12:18.2235845Z 129 │ const cause = yield* Schema.decodeUnknownEffect( 2026-10-23T11:12:18.2236091Z ·  ────────────────────────── 2026-10-23T11:12:18.2236280Z 130 │ Schema.Struct({ 2026-10-23T11:12:18.2236424Z ╰──── 2026-10-23T11:12:18.2236477Z 2026-10-23T11:12:18.2236808Z ⚠ 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-23T11:12:18.2237239Z ╭─[packages/effect-acp/src/schema.test.ts:18:12] 2026-10-23T11:12:18.2237526Z 17 │ const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } }; 2026-10-23T11:12:18.2238069Z 18 │ expect(Schema.is(V1.AvailableCommand)(command)).toBe(true); 2026-10-23T11:12:18.2238334Z ·  ───────── 2026-10-23T11:12:18.2238489Z 19 │ expect( 2026-10-23T11:12:18.2238620Z ╰──── 2026-10-23T11:12:18.2238678Z 2026-10-23T11:12:18.2239001Z ⚠ 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-23T11:12:18.2239414Z ╭─[packages/effect-acp/src/schema.test.ts:20:7] 2026-10-23T11:12:18.2239599Z 19 │ expect( 2026-10-23T11:12:18.2239839Z 20 │ Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }), 2026-10-23T11:12:18.2240078Z ·  ───────── 2026-10-23T11:12:18.2240234Z 21 │ ).toBe(true); 2026-10-23T11:12:18.2240364Z ╰──── 2026-10-23T11:12:18.2240422Z 2026-10-23T11:12:18.2240613Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T11:12:18.2240900Z ╭─[packages/shared/src/qrCode.ts:458:44] 2026-10-23T11:12:18.2241089Z 457 │ ): Array { 2026-10-23T11:12:18.2241277Z 458 │ let result: Array = divisor.map((_) => 0); 2026-10-23T11:12:18.2241495Z ·  ┬ 2026-10-23T11:12:18.2241750Z · ╰── '_' is declared here 2026-10-23T11:12:18.2241960Z 459 │ for (const b of data) { 2026-10-23T11:12:18.2242105Z ╰──── 2026-10-23T11:12:18.2242263Z  help: Consider removing this parameter. 2026-10-23T11:12:18.2242386Z 2026-10-23T11:12:18.2242632Z ⚠ eslint(no-unused-vars): Function 'normalizeTerminalContextSelection' is declared but never used. 2026-10-23T11:12:18.2242980Z ╭─[apps/web/src/lib/terminalContext.ts:56:10] 2026-10-23T11:12:18.2243162Z 55 │ 2026-10-23T11:12:18.2243321Z 56 │ function normalizeTerminalContextSelection( 2026-10-23T11:12:18.2243550Z ·  ────────────────┬──────────────── 2026-10-23T11:12:18.2243851Z · ╰── 'normalizeTerminalContextSelection' is declared here 2026-10-23T11:12:18.2244121Z 57 │ selection: TerminalContextSelection, 2026-10-23T11:12:18.2244279Z ╰──── 2026-10-23T11:12:18.2244440Z  help: Consider removing this declaration. 2026-10-23T11:12:18.2244557Z 2026-10-23T11:12:18.2244928Z ⚠ 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-23T11:12:18.2245384Z ╭─[packages/effect-acp/src/client.ts:1269:11] 2026-10-23T11:12:18.2245661Z 1268 │ extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) => 2026-10-23T11:12:18.2245994Z 1269 │ Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe( 2026-10-23T11:12:18.2246273Z ·  ────────────────────────── 2026-10-23T11:12:18.2246529Z 1270 │ Effect.mapError(() => AcpError.AcpRequestError.invalidParams()), 2026-10-23T11:12:18.2246735Z ╰──── 2026-10-23T11:12:18.2246793Z 2026-10-23T11:12:18.2247208Z ⚠ 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-23T11:12:18.2248107Z ╭─[apps/server/src/provider/acp/AntigravityProtocol.ts:263:20] 2026-10-23T11:12:18.2248596Z 262 │ ...(update._meta !== undefined 2026-10-23T11:12:18.2248879Z 263 │ ? { _meta: Schema.is(Schema.Record(Schema.String, Schema.Json))(meta) ? meta : null } 2026-10-23T11:12:18.2249154Z ·  ───────── 2026-10-23T11:12:18.2249327Z 264 │ : {}), 2026-10-23T11:12:18.2249456Z ╰──── 2026-10-23T11:12:18.2249519Z 2026-10-23T11:12:18.2249807Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T11:12:18.2250207Z ╭─[apps/mobile/src/components/VideoPreviewModal.ios.tsx:63:55] 2026-10-23T11:12:18.2250432Z 61 │ }, []); 2026-10-23T11:12:18.2250567Z 62 │ useEffect(() => { 2026-10-23T11:12:18.2250726Z ·  ────┬──── 2026-10-23T11:12:18.2250952Z · ╰── This is the containing effect 2026-10-23T11:12:18.2251245Z 63 │ if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl); 2026-10-23T11:12:18.2251522Z ·  ───────┬────── 2026-10-23T11:12:18.2251849Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2252112Z 64 │ }, [playbackUrl, resolvedUrl]); 2026-10-23T11:12:18.2252359Z ╰──── 2026-10-23T11:12:18.2253033Z  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-23T11:12:18.2253907Z  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-23T11:12:18.2254213Z 2026-10-23T11:12:18.2254473Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T11:12:18.2254848Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:60:5] 2026-10-23T11:12:18.2255049Z 57 │ 2026-10-23T11:12:18.2255176Z 58 │ useEffect(() => { 2026-10-23T11:12:18.2255329Z ·  ────┬──── 2026-10-23T11:12:18.2255539Z · ╰── This is the containing effect 2026-10-23T11:12:18.2255771Z 59 │ const controller = new AbortController(); 2026-10-23T11:12:18.2255954Z 60 │ setLoadState("pending"); 2026-10-23T11:12:18.2256184Z ·  ──────┬───── 2026-10-23T11:12:18.2256472Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2256788Z 61 │ // A renewed signature is used on Retry, not as a reason to reset the native player. 2026-10-23T11:12:18.2256999Z ╰──── 2026-10-23T11:12:18.2257690Z  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-23T11:12:18.2258547Z  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-23T11:12:18.2258852Z 2026-10-23T11:12:18.2259056Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T11:12:18.2259384Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:71:7] 2026-10-23T11:12:18.2259610Z 70 │ return () => controller.abort(); 2026-10-23T11:12:18.2259808Z 71 │ }, [player, props.playRequested, attempt]); 2026-10-23T11:12:18.2260091Z ·  ───┬── ─────────┬───────── ───┬─── 2026-10-23T11:12:18.2260474Z · │ │ ╰── Unnecessary dependency `attempt` 2026-10-23T11:12:18.2260872Z · │ ╰── Unnecessary dependency `props.playRequested` 2026-10-23T11:12:18.2261190Z · ╰── Unnecessary dependency `player_0` 2026-10-23T11:12:18.2261387Z 72 │ 2026-10-23T11:12:18.2261505Z ╰──── 2026-10-23T11:12:18.2261852Z  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-23T11:12:18.2262436Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2262728Z 2026-10-23T11:12:18.2263097Z ⚠ 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-23T11:12:18.2263552Z ╭─[packages/shared/src/otelEnvironment.ts:146:14] 2026-10-23T11:12:18.2263749Z 145 │ name, 2026-10-23T11:12:18.2263963Z 146 │ (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()), 2026-10-23T11:12:18.2264218Z ·  ────────────────────────── 2026-10-23T11:12:18.2264454Z 147 │ `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`, 2026-10-23T11:12:18.2264634Z ╰──── 2026-10-23T11:12:18.2264691Z 2026-10-23T11:12:18.2264898Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-23T11:12:18.2265199Z ╭─[packages/contracts/src/rpc.ts:295:8] 2026-10-23T11:12:18.2265381Z 294 │ } from "./device.ts"; 2026-10-23T11:12:18.2265554Z 295 │ import {} from "./previewAutomation.ts"; 2026-10-23T11:12:18.2265730Z ·  ── 2026-10-23T11:12:18.2265870Z 296 │ import { 2026-10-23T11:12:18.2265988Z ╰──── 2026-10-23T11:12:18.2266122Z  help: Remove empty braces 2026-10-23T11:12:18.2266223Z 2026-10-23T11:12:18.2266534Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T11:12:18.2266930Z ╭─[packages/provider-grok/src/server/adapter.ts:408:7] 2026-10-23T11:12:18.2267121Z 407 │ 2026-10-23T11:12:18.2267257Z 408 │ const layer: Layer.Layer< 2026-10-23T11:12:18.2267413Z ·  ──┬── 2026-10-23T11:12:18.2267635Z · ╰── 'layer' is declared here 2026-10-23T11:12:18.2267885Z 409 │ ProviderAdapter.ProviderAdapterV2, 2026-10-23T11:12:18.2268046Z ╰──── 2026-10-23T11:12:18.2268203Z  help: Consider removing this declaration. 2026-10-23T11:12:18.2268322Z 2026-10-23T11:12:18.2268489Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T11:12:18.2268804Z ╭─[apps/server/src/provider/Drivers/CodexDriver.test.ts:466:14] 2026-10-23T11:12:18.2269012Z 465 │ 2026-10-23T11:12:18.2269175Z 466 │ for (const {} of ["direct", "wrapper"] as const) { 2026-10-23T11:12:18.2269360Z ·  ── 2026-10-23T11:12:18.2269507Z 467 │ } 2026-10-23T11:12:18.2269620Z ╰──── 2026-10-23T11:12:18.2269908Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T11:12:18.2270128Z 2026-10-23T11:12:18.2270352Z ⚠ eslint(no-unneeded-ternary): Unnecessary use of boolean literals in conditional expression 2026-10-23T11:12:18.2270697Z ╭─[packages/shared/src/serverSettings.test.ts:35:7] 2026-10-23T11:12:18.2271007Z 34 │ const fallback = fallbackTextGenerationModelSelection(providerInstances, (instanceId) => 2026-10-23T11:12:18.2271296Z 35 │ instanceId === configured ? true : false, 2026-10-23T11:12:18.2271522Z ·  ──────────────────────────────────────── 2026-10-23T11:12:18.2271697Z 36 │ ); 2026-10-23T11:12:18.2271819Z ╰──── 2026-10-23T11:12:18.2271971Z  help: Remove this ternary operator 2026-10-23T11:12:18.2272080Z 2026-10-23T11:12:18.2272286Z ⚠ eslint(no-unused-vars): Function 'nonEmptyString' is declared but never used. 2026-10-23T11:12:18.2272633Z ╭─[packages/client-runtime/src/work-log/presentation.ts:234:10] 2026-10-23T11:12:18.2272838Z 233 │ 2026-10-23T11:12:18.2273013Z 234 │ function nonEmptyString(value: unknown): string | null { 2026-10-23T11:12:18.2273228Z ·  ───────┬────── 2026-10-23T11:12:18.2273468Z · ╰── 'nonEmptyString' is declared here 2026-10-23T11:12:18.2273761Z 235 │ return typeof value === "string" && value.trim().length > 0 ? value : null; 2026-10-23T11:12:18.2273964Z ╰──── 2026-10-23T11:12:18.2274126Z  help: Consider removing this declaration. 2026-10-23T11:12:18.2274246Z 2026-10-23T11:12:18.2274499Z ⚠ eslint(no-unused-vars): Function 'promptResponseHasMissingXAiStopReason' is declared but never used. 2026-10-23T11:12:18.2274891Z ╭─[packages/provider-grok/src/server/xaiAcpExtension.ts:1620:10] 2026-10-23T11:12:18.2275094Z 1619 │ 2026-10-23T11:12:18.2275367Z 1620 │ function promptResponseHasMissingXAiStopReason(response: EffectAcpSchema.PromptResponse): boolean { 2026-10-23T11:12:18.2276012Z ·  ──────────────────┬────────────────── 2026-10-23T11:12:18.2276434Z · ╰── 'promptResponseHasMissingXAiStopReason' is declared here 2026-10-23T11:12:18.2276762Z 1621 │ const meta = response._meta; 2026-10-23T11:12:18.2276913Z ╰──── 2026-10-23T11:12:18.2277070Z  help: Consider removing this declaration. 2026-10-23T11:12:18.2277193Z 2026-10-23T11:12:18.2277672Z ⚠ 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-23T11:12:18.2278208Z ╭─[packages/contracts/src/baseSchemas.test.ts:39:9] 2026-10-23T11:12:18.2278410Z 38 │ JSON.stringify( 2026-10-23T11:12:18.2278613Z 39 │ Schema.encodeUnknownSync(Schema.toCodecJson(Named))([ 2026-10-23T11:12:18.2278843Z ·  ──────────────────────── 2026-10-23T11:12:18.2279024Z 40 │ { name: "a" }, 2026-10-23T11:12:18.2279165Z ╰──── 2026-10-23T11:12:18.2279227Z 2026-10-23T11:12:18.2279439Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-23T11:12:18.2279748Z ╭─[apps/mobile/src/Stack.tsx:1044:21] 2026-10-23T11:12:18.2279929Z 1043 │ } 2026-10-23T11:12:18.2280425Z ·  ───────────────────────────────────────────── 2026-10-23T11:12:18.2280627Z 1045 │ screenListeners={{ 2026-10-23T11:12:18.2280771Z ╰──── 2026-10-23T11:12:18.2281184Z  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-23T11:12:18.2281513Z 2026-10-23T11:12:18.2281983Z ⚠ 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-23T11:12:18.2282518Z ╭─[packages/shared/src/atomicWrite.test.ts:139:5] 2026-10-23T11:12:18.2282734Z 138 │ Effect.gen(function* () { 2026-10-23T11:12:18.2283017Z 139 │ ╭─▶ while (fiber.pollUnsafe() === undefined) { 2026-10-23T11:12:18.2283335Z 140 │ │ yield* TestClock.adjust("100 millis"); 2026-10-23T11:12:18.2283787Z 141 │ │ // oxlint-disable-next-line t3code/no-real-time-wait-in-tests -- a macrotask boundary so the real stat I/O can finish; time moves only via TestClock 2026-10-23T11:12:18.2284277Z 142 │ │ yield* Effect.promise(() => new Promise((resolve) => setImmediate(resolve))); 2026-10-23T11:12:18.2284591Z 143 │ ╰─▶ } 2026-10-23T11:12:18.2284814Z 144 │ return yield* Fiber.join(fiber); 2026-10-23T11:12:18.2284969Z ╰──── 2026-10-23T11:12:18.2285026Z 2026-10-23T11:12:18.2285255Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-23T11:12:18.2285612Z ╭─[packages/client-runtime/src/operations/projects.ts:228:51] 2026-10-23T11:12:18.2285824Z 227 │ ): string { 2026-10-23T11:12:18.2286057Z 228 │ const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? ""; 2026-10-23T11:12:18.2286335Z ·  ────── 2026-10-23T11:12:18.2286649Z 229 │ return target.owner ? `${target.owner}/${folderName}` : folderName; 2026-10-23T11:12:18.2286878Z ╰──── 2026-10-23T11:12:18.2287104Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-23T11:12:18.2287284Z 2026-10-23T11:12:18.2287758Z ⚠ 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-23T11:12:18.2288299Z ╭─[packages/contracts/src/composerContext.test.ts:181:18] 2026-10-23T11:12:18.2288581Z 180 │ it("sends a message without the records the wire cannot carry", () => { 2026-10-23T11:12:18.2288905Z 181 │ const wire = Schema.encodeUnknownSync(Schema.toCodecJson(OrchestrationMessageContext))({ 2026-10-23T11:12:18.2289198Z ·  ──────────────────────── 2026-10-23T11:12:18.2289377Z 182 │ version: 1, 2026-10-23T11:12:18.2289506Z ╰──── 2026-10-23T11:12:18.2289564Z 2026-10-23T11:12:18.2289844Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-23T11:12:18.2290230Z ╭─[apps/server/src/provider/AntigravityAuth.ts:285:20] 2026-10-23T11:12:18.2290426Z 284 │ }, 2026-10-23T11:12:18.2290576Z 285 │ (effect, flow, stopSessions) => 2026-10-23T11:12:18.2290771Z ·  ──────┬───── 2026-10-23T11:12:18.2291021Z · ╰── 'stopSessions' is declared here 2026-10-23T11:12:18.2291235Z 286 │ effect.pipe( 2026-10-23T11:12:18.2291371Z ╰──── 2026-10-23T11:12:18.2291536Z  help: Consider removing this parameter. 2026-10-23T11:12:18.2291653Z 2026-10-23T11:12:18.2291853Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T11:12:18.2292189Z ╭─[apps/mobile/src/state/use-thread-outbox-drain.ts:1315:5] 2026-10-23T11:12:18.2292418Z 1314 │ queuedMessagesByThreadKey, 2026-10-23T11:12:18.2292583Z 1315 │ retryTick, 2026-10-23T11:12:18.2292732Z ·  ────┬──── 2026-10-23T11:12:18.2292957Z · ╰── Unnecessary dependency `retryTick` 2026-10-23T11:12:18.2293170Z 1316 │ restoreQueuedMessage, 2026-10-23T11:12:18.2293310Z ╰──── 2026-10-23T11:12:18.2293661Z  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-23T11:12:18.2294303Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2294631Z 2026-10-23T11:12:18.2294994Z ⚠ 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-23T11:12:18.2295443Z ╭─[packages/contracts/src/auth.test.ts:17:12] 2026-10-23T11:12:18.2295730Z 16 │ it("decodes legacy review credentials without offering them in new grants", () => { 2026-10-23T11:12:18.2296064Z 17 │ expect(Schema.decodeUnknownSync(AuthEnvironmentScopes)(["review:write"])).toEqual([ 2026-10-23T11:12:18.2296343Z ·  ──────────────────────── 2026-10-23T11:12:18.2296521Z 18 │ "review:write", 2026-10-23T11:12:18.2296662Z ╰──── 2026-10-23T11:12:18.2296724Z 2026-10-23T11:12:18.2297082Z ⚠ 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-23T11:12:18.2297526Z ╭─[packages/contracts/src/auth.test.ts:20:18] 2026-10-23T11:12:18.2297745Z 19 │ ]); 2026-10-23T11:12:18.2297982Z 20 │ expect(() => Schema.decodeUnknownSync(AuthGrantScopes)(["review:write"])).toThrow(); 2026-10-23T11:12:18.2298257Z ·  ──────────────────────── 2026-10-23T11:12:18.2298505Z 21 │ expect(AuthStandardClientScopes).not.toContain("review:write"); 2026-10-23T11:12:18.2298698Z ╰──── 2026-10-23T11:12:18.2298755Z 2026-10-23T11:12:18.2299119Z ⚠ 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-23T11:12:18.2299557Z ╭─[packages/contracts/src/auth.test.ts:58:21] 2026-10-23T11:12:18.2299848Z 57 │ it("ignores unknown response permissions without falling back to broader scopes", () => { 2026-10-23T11:12:18.2300144Z 58 │ const session = Schema.decodeUnknownSync(AuthSessionState)({ 2026-10-23T11:12:18.2300394Z ·  ──────────────────────── 2026-10-23T11:12:18.2300578Z 59 │ authenticated: true, 2026-10-23T11:12:18.2300718Z ╰──── 2026-10-23T11:12:18.2300771Z 2026-10-23T11:12:18.2301232Z ⚠ 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-23T11:12:18.2301804Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:169:7] 2026-10-23T11:12:18.2302023Z 168 │ }); 2026-10-23T11:12:18.2302302Z 169 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-23T11:12:18.2302682Z 170 │ │ if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break; 2026-10-23T11:12:18.2302982Z 171 │ │ yield* Effect.yieldNow; 2026-10-23T11:12:18.2303237Z 172 │ ╰─▶ } 2026-10-23T11:12:18.2303433Z 173 │ 2026-10-23T11:12:18.2303550Z ╰──── 2026-10-23T11:12:18.2303608Z 2026-10-23T11:12:18.2304158Z ⚠ 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-23T11:12:18.2304767Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:178:7] 2026-10-23T11:12:18.2305035Z 177 │ yield* Deferred.succeed(releaseSave, undefined); 2026-10-23T11:12:18.2305350Z 178 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-23T11:12:18.2305667Z 179 │ │ if ((yield* Ref.get(saved)).length > 0) break; 2026-10-23T11:12:18.2305917Z 180 │ │ yield* Effect.yieldNow; 2026-10-23T11:12:18.2306167Z 181 │ ╰─▶ } 2026-10-23T11:12:18.2306362Z 182 │ 2026-10-23T11:12:18.2306476Z ╰──── 2026-10-23T11:12:18.2306535Z 2026-10-23T11:12:18.2306996Z ⚠ 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-23T11:12:18.2307561Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7] 2026-10-23T11:12:18.2307871Z 306 │ yield* Deferred.succeed(releaseUnenrichedSave, undefined); 2026-10-23T11:12:18.2308203Z 307 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-23T11:12:18.2308512Z 308 │ │ const values = yield* Ref.get(saved); 2026-10-23T11:12:18.2308842Z 309 │ │ if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) { 2026-10-23T11:12:18.2309128Z 310 │ │ break; 2026-10-23T11:12:18.2309314Z 311 │ │ } 2026-10-23T11:12:18.2309521Z 312 │ │ yield* Effect.yieldNow; 2026-10-23T11:12:18.2309771Z 313 │ ╰─▶ } 2026-10-23T11:12:18.2309969Z 314 │ 2026-10-23T11:12:18.2310083Z ╰──── 2026-10-23T11:12:18.2310141Z 2026-10-23T11:12:18.2310399Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T11:12:18.2310772Z ╭─[apps/mobile/src/state/use-vcs-action-state.ts:86:5] 2026-10-23T11:12:18.2311020Z 83 │ const [nowMs, setNowMs] = useState(() => Date.now()); 2026-10-23T11:12:18.2311206Z 84 │ useEffect(() => { 2026-10-23T11:12:18.2311363Z ·  ────┬──── 2026-10-23T11:12:18.2311587Z · ╰── This is the containing effect 2026-10-23T11:12:18.2311811Z 85 │ if (!actionState.isRunning) return; 2026-10-23T11:12:18.2311985Z 86 │ setNowMs(Date.now()); 2026-10-23T11:12:18.2312141Z ·  ────┬─── 2026-10-23T11:12:18.2312397Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2312690Z 87 │ const interval = setInterval(() => setNowMs(Date.now()), 1000); 2026-10-23T11:12:18.2312878Z ╰──── 2026-10-23T11:12:18.2313523Z  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-23T11:12:18.2314445Z  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-23T11:12:18.2314800Z 2026-10-23T11:12:18.2315018Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-23T11:12:18.2315382Z ╭─[apps/mobile/src/state/use-composer-drafts.ts:1022:15] 2026-10-23T11:12:18.2316276Z 1021 │ instanceId, 2026-10-23T11:12:18.2316515Z 1022 │ { ...(persisted.modelOptionMemory[instanceId] ?? {}), ...models }, 2026-10-23T11:12:18.2316817Z ·  ────────────────────────────────────────────────── 2026-10-23T11:12:18.2317023Z 1023 │ ]), 2026-10-23T11:12:18.2317154Z ╰──── 2026-10-23T11:12:18.2317486Z  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-23T11:12:18.2317769Z 2026-10-23T11:12:18.2318039Z ⚠ eslint(no-unused-vars): Variable 'layerDaemon' is declared but never used. Unused variables should start with a '_'. 2026-10-23T11:12:18.2318435Z ╭─[apps/server/src/orchestration-v2/EffectWorker.ts:914:7] 2026-10-23T11:12:18.2318635Z 913 │ 2026-10-23T11:12:18.2318900Z 914 │ const layerDaemon: Layer.Layer = Layer.effectDiscard( 2026-10-23T11:12:18.2319180Z ·  ─────┬───── 2026-10-23T11:12:18.2319417Z · ╰── 'layerDaemon' is declared here 2026-10-23T11:12:18.2319645Z 915 │ runDaemon.pipe(Effect.forkScoped), 2026-10-23T11:12:18.2319803Z ╰──── 2026-10-23T11:12:18.2319963Z  help: Consider removing this declaration. 2026-10-23T11:12:18.2320083Z 2026-10-23T11:12:18.2320353Z ⚠ eslint(no-unused-vars): Variable 'claudeCaps' is declared but never used. Unused variables should start with a '_'. 2026-10-23T11:12:18.2320719Z ╭─[packages/shared/src/model.test.ts:36:7] 2026-10-23T11:12:18.2320891Z 35 │ 2026-10-23T11:12:18.2321083Z 36 │ const claudeCaps: ModelCapabilities = createModelCapabilities({ 2026-10-23T11:12:18.2321301Z ·  ─────┬──── 2026-10-23T11:12:18.2321532Z · ╰── 'claudeCaps' is declared here 2026-10-23T11:12:18.2321741Z 37 │ optionDescriptors: [ 2026-10-23T11:12:18.2321885Z ╰──── 2026-10-23T11:12:18.2322041Z  help: Consider removing this declaration. 2026-10-23T11:12:18.2322159Z 2026-10-23T11:12:18.2322397Z ⚠ unicorn(prefer-string-starts-ends-with): Prefer String#startsWith over a regex with a caret. 2026-10-23T11:12:18.2322764Z ╭─[apps/server/src/vcs/GitVcsDriverCore.ts:509:11] 2026-10-23T11:12:18.2323004Z 508 │ GIT_DIAGNOSTIC_LINE_PATTERN.test(line) || 2026-10-23T11:12:18.2323256Z 509 │ (!/^remote:/.test(line) && SSH_TRANSPORT_REFUSAL_PATTERN.test(line)), 2026-10-23T11:12:18.2323491Z ·  ─────────────── 2026-10-23T11:12:18.2323648Z 510 │ ) 2026-10-23T11:12:18.2323767Z ╰──── 2026-10-23T11:12:18.2323980Z  help: Replace `/^remote:/.test(line)` with `line.startsWith('remote:')`. 2026-10-23T11:12:18.2324144Z 2026-10-23T11:12:18.2324498Z ⚠ 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-23T11:12:18.2324961Z ╭─[apps/server/src/vcs/GitVcsDriverCore.test.ts:1786:34] 2026-10-23T11:12:18.2325352Z 1785 │ const stat = branch.files!.find((file) => file.path === path)!; 2026-10-23T11:12:18.2325702Z 1786 │ const request = yield* Schema.decodeEffect(ReviewDiffPreviewInput)({ 2026-10-23T11:12:18.2325979Z ·  ─────────────────── 2026-10-23T11:12:18.2326168Z 1787 │ cwd, 2026-10-23T11:12:18.2326300Z ╰──── 2026-10-23T11:12:18.2326359Z 2026-10-23T11:12:18.2326562Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T11:12:18.2326871Z ╭─[apps/mobile/src/state/thread-order.ts:29:7] 2026-10-23T11:12:18.2327073Z 28 │ getPendingThreadOrder(); 2026-10-23T11:12:18.2327245Z 29 │ }, [nowMinute, snoozeWakeTick]); 2026-10-23T11:12:18.2327526Z ·  ────┬──── ───────┬────── 2026-10-23T11:12:18.2327873Z · │ ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-23T11:12:18.2328205Z · ╰── Unnecessary dependency `nowMinute` 2026-10-23T11:12:18.2328414Z 30 │ return pending; 2026-10-23T11:12:18.2328548Z ╰──── 2026-10-23T11:12:18.2328893Z  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-23T11:12:18.2329484Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2345733Z 2026-10-23T11:12:18.2346000Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-23T11:12:18.2346368Z ╭─[apps/mobile/src/lib/markdownDocument.ts:138:28] 2026-10-23T11:12:18.2346594Z 137 │ visit(parser.parse(markdown)); 2026-10-23T11:12:18.2346782Z 138 │ for (const edit of edits.reverse()) 2026-10-23T11:12:18.2346981Z ·  ─────── 2026-10-23T11:12:18.2347257Z 139 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-23T11:12:18.2347480Z ╰──── 2026-10-23T11:12:18.2347824Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-23T11:12:18.2348070Z 2026-10-23T11:12:18.2348283Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-23T11:12:18.2348606Z ╭─[apps/mobile/src/lib/markdownDocument.ts:169:28] 2026-10-23T11:12:18.2348824Z 168 │ visit(parser.parse(markdown)); 2026-10-23T11:12:18.2349004Z 169 │ for (const edit of edits.reverse()) 2026-10-23T11:12:18.2349201Z ·  ─────── 2026-10-23T11:12:18.2349467Z 170 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-23T11:12:18.2349686Z ╰──── 2026-10-23T11:12:18.2349997Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-23T11:12:18.2350251Z 2026-10-23T11:12:18.2350462Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-23T11:12:18.2350783Z ╭─[apps/mobile/src/lib/markdownDocument.ts:223:38] 2026-10-23T11:12:18.2350995Z 222 │ visit(parser.parse(markdown)); 2026-10-23T11:12:18.2351290Z 223 │ for (const lineStart of lineStarts.reverse()) { 2026-10-23T11:12:18.2351556Z ·  ─────── 2026-10-23T11:12:18.2351836Z 224 │ // The header row may be a lazy line without its container markers (`>` or list indent), 2026-10-23T11:12:18.2352054Z ╰──── 2026-10-23T11:12:18.2352367Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-23T11:12:18.2352619Z 2026-10-23T11:12:18.2352811Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-23T11:12:18.2353115Z ╭─[apps/mobile/src/lib/useHoverGesture.ts:8:15] 2026-10-23T11:12:18.2353307Z 7 │ () => 2026-10-23T11:12:18.2353444Z 8 │ Gesture.Hover() 2026-10-23T11:12:18.2353606Z ·  ──┬── 2026-10-23T11:12:18.2353853Z · ╰── `Hover` may be a component 2026-10-23T11:12:18.2354074Z 9 │ .manualActivation(true) 2026-10-23T11:12:18.2354227Z ╰──── 2026-10-23T11:12:18.2354563Z  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-23T11:12:18.2355293Z  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-23T11:12:18.2355792Z 2026-10-23T11:12:18.2356029Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-23T11:12:18.2356430Z ╭─[apps/web/src/components/pullRequest/pullRequestList.logic.ts:187:9] 2026-10-23T11:12:18.2356668Z 186 │ ): boolean { 2026-10-23T11:12:18.2356902Z 187 │ const labels = entry.labels.map((label) => label.name.trim().toLowerCase()); 2026-10-23T11:12:18.2357240Z ·  ───────────────────────────────────────────────────────────────────── 2026-10-23T11:12:18.2357555Z 188 │ const holds = (label: string) => labels.includes(label.trim().toLowerCase()); 2026-10-23T11:12:18.2357784Z ╰──── 2026-10-23T11:12:18.2357925Z  help: Switch to `Set` 2026-10-23T11:12:18.2358021Z 2026-10-23T11:12:18.2358216Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-23T11:12:18.2358531Z ╭─[packages/client-runtime/src/state/shell.ts:189:5] 2026-10-23T11:12:18.2358779Z 186 │ let waiting = yield* Ref.get(awaitingCompletion); 2026-10-23T11:12:18.2359056Z 187 │ let next = initial; 2026-10-23T11:12:18.2359257Z ·  ──┬─ 2026-10-23T11:12:18.2359470Z · ╰── From this accumulator 2026-10-23T11:12:18.2359682Z 188 │ let receivedSnapshot = false; 2026-10-23T11:12:18.2359856Z 189 │ for (const item of items) { 2026-10-23T11:12:18.2360023Z ·  ─┬─ 2026-10-23T11:12:18.2360212Z · ╰── For this loop 2026-10-23T11:12:18.2360421Z 190 │ if (item.kind === "synchronized") { 2026-10-23T11:12:18.2360598Z 191 │ waiting = false; 2026-10-23T11:12:18.2360779Z 192 │ if (Option.isSome(next.snapshot)) { 2026-10-23T11:12:18.2361010Z 193 │ next = { ...next, status: "live", error: Option.none() }; 2026-10-23T11:12:18.2361236Z ·  ───┬─── 2026-10-23T11:12:18.2361471Z · ╰── From this spread 2026-10-23T11:12:18.2361673Z 194 │ } 2026-10-23T11:12:18.2361796Z ╰──── 2026-10-23T11:12:18.2362007Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-23T11:12:18.2362327Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-23T11:12:18.2362494Z 2026-10-23T11:12:18.2362698Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-23T11:12:18.2363027Z ╭─[apps/web/src/contextMenuFallback.test.ts:38:9] 2026-10-23T11:12:18.2363228Z 37 │ get isConnected() { 2026-10-23T11:12:18.2363408Z 38 │ let current: FakeElement | null = this; 2026-10-23T11:12:18.2363588Z ·  ─────── 2026-10-23T11:12:18.2363756Z 39 │ while (current?.parent) { 2026-10-23T11:12:18.2363906Z ╰──── 2026-10-23T11:12:18.2364241Z  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-23T11:12:18.2364500Z 2026-10-23T11:12:18.2364723Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-23T11:12:18.2365079Z ╭─[apps/mobile/src/state/use-model-option-memory.ts:21:7] 2026-10-23T11:12:18.2365292Z 20 │ [instanceId]: { 2026-10-23T11:12:18.2365457Z 21 │ ...(state[instanceId] ?? {}), 2026-10-23T11:12:18.2365661Z ·  ──────────────────────────── 2026-10-23T11:12:18.2365840Z 22 │ [model]: options, 2026-10-23T11:12:18.2365981Z ╰──── 2026-10-23T11:12:18.2366305Z  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-23T11:12:18.2366567Z 2026-10-23T11:12:18.2366772Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-23T11:12:18.2367102Z ╭─[packages/client-runtime/src/state/usageAccess.ts:3:8] 2026-10-23T11:12:18.2367319Z 2 │ AuthDiagnosticsReadScope, 2026-10-23T11:12:18.2367484Z 3 │ type AuthSessionState, 2026-10-23T11:12:18.2367681Z ·  ────────┬─────── 2026-10-23T11:12:18.2367926Z · ╰── 'AuthSessionState' is imported here 2026-10-23T11:12:18.2368153Z 4 │ sessionGrantsScope, 2026-10-23T11:12:18.2368292Z ╰──── 2026-10-23T11:12:18.2368447Z  help: Consider removing this import. 2026-10-23T11:12:18.2368560Z 2026-10-23T11:12:18.2369096Z ⚠ 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-23T11:12:18.2369719Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1228:7] 2026-10-23T11:12:18.2369977Z 1227 │ yield* harness.replaceSession; 2026-10-23T11:12:18.2370304Z 1228 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T11:12:18.2370657Z 1229 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) { 2026-10-23T11:12:18.2370908Z 1230 │ │ break; 2026-10-23T11:12:18.2371097Z 1231 │ │ } 2026-10-23T11:12:18.2371305Z 1232 │ │ yield* Effect.yieldNow; 2026-10-23T11:12:18.2371568Z 1233 │ ╰─▶ } 2026-10-23T11:12:18.2371785Z 1234 │ yield* Queue.offer( 2026-10-23T11:12:18.2371938Z ╰──── 2026-10-23T11:12:18.2371998Z 2026-10-23T11:12:18.2372457Z ⚠ 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-23T11:12:18.2373029Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1337:7] 2026-10-23T11:12:18.2373279Z 1336 │ yield* harness.replaceSession; 2026-10-23T11:12:18.2373597Z 1337 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T11:12:18.2373959Z 1338 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break; 2026-10-23T11:12:18.2374242Z 1339 │ │ yield* Effect.yieldNow; 2026-10-23T11:12:18.2374496Z 1340 │ ╰─▶ } 2026-10-23T11:12:18.2374769Z 1341 │ expect(yield* Ref.get(harness.subscriptionCount)).toBe(2); 2026-10-23T11:12:18.2374962Z ╰──── 2026-10-23T11:12:18.2375023Z 2026-10-23T11:12:18.2375205Z ⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`. 2026-10-23T11:12:18.2375505Z ╭─[apps/web/src/terminal/ghostty/core.ts:194:19] 2026-10-23T11:12:18.2375763Z 193 │ const count = Math.min(CHUNK_SIZE, graphemeLength - start); 2026-10-23T11:12:18.2375993Z 194 │ const codes = new Array(count); 2026-10-23T11:12:18.2376217Z ·  ──────────────────────── 2026-10-23T11:12:18.2376447Z 195 │ for (let index = 0; index < count; index += 1) { 2026-10-23T11:12:18.2376626Z ╰──── 2026-10-23T11:12:18.2377099Z  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-23T11:12:18.2377476Z 2026-10-23T11:12:18.2377706Z ⚠ typescript(no-extraneous-class): Unexpected class with only a constructor. 2026-10-23T11:12:18.2378035Z ╭─[apps/desktop/src/preview/Manager.test.ts:158:18] 2026-10-23T11:12:18.2378278Z 157 │ BrowserWindow: browserWindowConstructor, 2026-10-23T11:12:18.2378555Z 158 │ ╭─▶ ClipboardItem: class { 2026-10-23T11:12:18.2378906Z 159 │ │ constructor(data: Record) { 2026-10-23T11:12:18.2379198Z 160 │ │ clipboardItemConstructor(data); 2026-10-23T11:12:18.2379404Z 161 │ │ } 2026-10-23T11:12:18.2379621Z 162 │ ╰─▶ }, 2026-10-23T11:12:18.2379820Z 163 │ clipboard: { 2026-10-23T11:12:18.2379956Z ╰──── 2026-10-23T11:12:18.2380180Z  help: Try replacing this class with a standalone function or deleting it entirely 2026-10-23T11:12:18.2380353Z 2026-10-23T11:12:18.2380551Z ⚠ eslint(no-unused-vars): Type 'EnvironmentId' is imported but never used. 2026-10-23T11:12:18.2380886Z ╭─[packages/client-runtime/src/state/sharedSettings.ts:2:3] 2026-10-23T11:12:18.2381100Z 1 │ import type { 2026-10-23T11:12:18.2381237Z 2 │ EnvironmentId, 2026-10-23T11:12:18.2381398Z ·  ──────┬────── 2026-10-23T11:12:18.2381630Z · ╰── 'EnvironmentId' is imported here 2026-10-23T11:12:18.2381859Z 3 │ ExecutionEnvironmentCapabilities, 2026-10-23T11:12:18.2382016Z ╰──── 2026-10-23T11:12:18.2382168Z  help: Consider removing this import. 2026-10-23T11:12:18.2382282Z 2026-10-23T11:12:18.2382428Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2382734Z ╭─[apps/mobile/src/features/home/thread-swipe-actions.tsx:494:27] 2026-10-23T11:12:18.2382949Z 493 │ > 2026-10-23T11:12:18.2383102Z 494 │ {props.children(close)} 2026-10-23T11:12:18.2383292Z ·  ──┬── 2026-10-23T11:12:18.2383561Z · ╰── Cannot access ref value during render 2026-10-23T11:12:18.2383802Z 495 │ 2026-10-23T11:12:18.2383949Z ╰──── 2026-10-23T11:12:18.2384474Z  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-23T11:12:18.2385192Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2385484Z 2026-10-23T11:12:18.2385675Z ⚠ eslint(no-unused-vars): Identifier 'Arr' is imported but never used. 2026-10-23T11:12:18.2386000Z ╭─[packages/client-runtime/src/state/threadSort.ts:4:13] 2026-10-23T11:12:18.2386267Z 3 │ import type { EnvironmentThreadShell } from "./models.ts"; 2026-10-23T11:12:18.2386481Z 4 │ import * as Arr from "effect/Array"; 2026-10-23T11:12:18.2386659Z ·  ─┬─ 2026-10-23T11:12:18.2386871Z · ╰── 'Arr' is imported here 2026-10-23T11:12:18.2387088Z 5 │ import * as Order from "effect/Order"; 2026-10-23T11:12:18.2387242Z ╰──── 2026-10-23T11:12:18.2387396Z  help: Consider removing this import. 2026-10-23T11:12:18.2387509Z 2026-10-23T11:12:18.2387732Z ⚠ eslint(no-unused-vars): Identifier 'Order' is imported but never used. 2026-10-23T11:12:18.2388059Z ╭─[packages/client-runtime/src/state/threadSort.ts:5:13] 2026-10-23T11:12:18.2388280Z 4 │ import * as Arr from "effect/Array"; 2026-10-23T11:12:18.2388463Z 5 │ import * as Order from "effect/Order"; 2026-10-23T11:12:18.2388694Z ·  ──┬── 2026-10-23T11:12:18.2388952Z · ╰── 'Order' is imported here 2026-10-23T11:12:18.2389140Z 6 │ 2026-10-23T11:12:18.2389248Z ╰──── 2026-10-23T11:12:18.2389400Z  help: Consider removing this import. 2026-10-23T11:12:18.2389514Z 2026-10-23T11:12:18.2389710Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T11:12:18.2390037Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:542:25] 2026-10-23T11:12:18.2390308Z 541 │ // range) the boundary string is identical and the chain would die. 2026-10-23T11:12:18.2390545Z 542 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-23T11:12:18.2390756Z ·  ───────┬────── 2026-10-23T11:12:18.2391043Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-23T11:12:18.2391346Z 543 │ const v2SearchQuery = props.searchQuery.trim().toLocaleLowerCase(); 2026-10-23T11:12:18.2391550Z ╰──── 2026-10-23T11:12:18.2391898Z  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-23T11:12:18.2392488Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2392792Z 2026-10-23T11:12:18.2392957Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T11:12:18.2393256Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:533:53] 2026-10-23T11:12:18.2393482Z 532 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-23T11:12:18.2393752Z 533 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-23T11:12:18.2394035Z ·  ─────┬──── 2026-10-23T11:12:18.2394328Z · ╰── Cannot call impure function 2026-10-23T11:12:18.2394566Z 534 │ const id = setTimeout(() => { 2026-10-23T11:12:18.2394717Z ╰──── 2026-10-23T11:12:18.2395056Z  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-23T11:12:18.2395692Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T11:12:18.2395968Z 2026-10-23T11:12:18.2396121Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2396435Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39] 2026-10-23T11:12:18.2396657Z 276 │ 2026-10-23T11:12:18.2396907Z 277 │ ╭─▶ return createElement(RawNativeView, { 2026-10-23T11:12:18.2397177Z 278 │ │ ...nativeProps, 2026-10-23T11:12:18.2397436Z 279 │ │ refreshEnabled: props.onPullToRefresh !== undefined, 2026-10-23T11:12:18.2397701Z 280 │ │ ref: nativeRef, 2026-10-23T11:12:18.2397943Z 281 │ ├─▶ }); 2026-10-23T11:12:18.2398318Z · ╰──── Passing a ref to a function may read its value during render 2026-10-23T11:12:18.2398667Z 282 │ } 2026-10-23T11:12:18.2398829Z ╰──── 2026-10-23T11:12:18.2399351Z  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-23T11:12:18.2400067Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2400346Z 2026-10-23T11:12:18.2400606Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T11:12:18.2400993Z ╭─[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5] 2026-10-23T11:12:18.2401194Z 150 │ 2026-10-23T11:12:18.2401324Z 151 │ useEffect(() => { 2026-10-23T11:12:18.2401483Z ·  ────┬──── 2026-10-23T11:12:18.2401704Z · ╰── This is the containing effect 2026-10-23T11:12:18.2401924Z 152 │ if (!controlledSelectedPath) { 2026-10-23T11:12:18.2402091Z 153 │ return; 2026-10-23T11:12:18.2402219Z 154 │ } 2026-10-23T11:12:18.2402369Z 155 │ setExpandedPaths((current) => { 2026-10-23T11:12:18.2402554Z ·  ────────┬─────── 2026-10-23T11:12:18.2402825Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2403118Z 156 │ const ancestors = ancestorPaths(controlledSelectedPath); 2026-10-23T11:12:18.2403306Z ╰──── 2026-10-23T11:12:18.2403968Z  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-23T11:12:18.2404833Z  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-23T11:12:18.2405135Z 2026-10-23T11:12:18.2405331Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T11:12:18.2405673Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:223:31] 2026-10-23T11:12:18.2405938Z 222 │ ? snippetTokens.map((line, lineIndex) => ( 2026-10-23T11:12:18.2406155Z 223 │ 2026-10-23T11:12:18.2406369Z ·  ─────────────── 2026-10-23T11:12:18.2406634Z 224 │ {lineIndex > 0 ? "\n" : ""} 2026-10-23T11:12:18.2406835Z ╰──── 2026-10-23T11:12:18.2407035Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-23T11:12:18.2407195Z 2026-10-23T11:12:18.2407389Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T11:12:18.2407758Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25] 2026-10-23T11:12:18.2407993Z 226 │ (null); 2026-10-23T11:12:18.2414671Z 495 │ const showcasedReviewDrawRef = useRef(null); 2026-10-23T11:12:18.2414940Z 496 │ const [isPullRefreshing, setIsPullRefreshing] = useState(false); 2026-10-23T11:12:18.2415176Z 497 │ const handlePullToRefresh = async () => { 2026-10-23T11:12:18.2415371Z 498 │ setIsPullRefreshing(true); 2026-10-23T11:12:18.2415552Z 499 │ await refreshSelectedSection(); 2026-10-23T11:12:18.2415736Z 500 │ setIsPullRefreshing(false); 2026-10-23T11:12:18.2415887Z 501 │ }; 2026-10-23T11:12:18.2416099Z 502 │ const reviewFileNavigatorRef = useRef(null); 2026-10-23T11:12:18.2416460Z 503 │ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : []; 2026-10-23T11:12:18.2416759Z 504 │ const fileVisibility = useReviewFileVisibility({ 2026-10-23T11:12:18.2416966Z 505 │ threadKey: reviewCache.threadKey, 2026-10-23T11:12:18.2417161Z 506 │ sectionId: selectedSection?.id ?? null, 2026-10-23T11:12:18.2417341Z 507 │ files: reviewFiles, 2026-10-23T11:12:18.2417529Z 508 │ cachedExpandedFileIds: selectedSection?.id 2026-10-23T11:12:18.2417838Z 509 │ ? reviewCache.expandedFileIdsBySection[selectedSection.id] 2026-10-23T11:12:18.2418043Z 510 │ : undefined, 2026-10-23T11:12:18.2418223Z 511 │ cachedViewedFileIds: selectedSection?.id 2026-10-23T11:12:18.2418460Z 512 │ ? reviewCache.viewedFileIdsBySection[selectedSection.id] 2026-10-23T11:12:18.2418664Z 513 │ : undefined, 2026-10-23T11:12:18.2418798Z 514 │ }); 2026-10-23T11:12:18.2419060Z 515 │ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility; 2026-10-23T11:12:18.2419391Z 516 │ const commentSelection = useReviewCommentSelectionController({ 2026-10-23T11:12:18.2419597Z 517 │ environmentId, 2026-10-23T11:12:18.2419741Z 518 │ threadId, 2026-10-23T11:12:18.2419883Z 519 │ selectedSection, 2026-10-23T11:12:18.2420039Z 520 │ nativeReviewDiffData, 2026-10-23T11:12:18.2420182Z 521 │ }); 2026-10-23T11:12:18.2420355Z 522 │ const nativeBridge = useNativeReviewDiffBridge({ 2026-10-23T11:12:18.2420560Z 523 │ threadKey: reviewCache.threadKey, 2026-10-23T11:12:18.2420757Z 524 │ sectionId: selectedSection?.id ?? null, 2026-10-23T11:12:18.2420942Z 525 │ diff: selectedSection?.diff, 2026-10-23T11:12:18.2421117Z 526 │ data: nativeReviewDiffData, 2026-10-23T11:12:18.2421285Z 527 │ collapsedFileIds, 2026-10-23T11:12:18.2421439Z 528 │ viewedFileIds, 2026-10-23T11:12:18.2421636Z 529 │ selectedRowIds: commentSelection.selectedRowIds, 2026-10-23T11:12:18.2421857Z 530 │ canHighlight: parsedDiff.kind === "files", 2026-10-23T11:12:18.2422027Z 531 │ }); 2026-10-23T11:12:18.2422164Z 532 │ const showcaseReviewKey = 2026-10-23T11:12:18.2422389Z 533 │ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection 2026-10-23T11:12:18.2422743Z 534 │ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}` 2026-10-23T11:12:18.2423012Z 535 │ : null; 2026-10-23T11:12:18.2423254Z 536 │ const handleNativeDebug = (event: NativeSyntheticEvent>) => { 2026-10-23T11:12:18.2423505Z 537 │ nativeBridge.onDebug(event); 2026-10-23T11:12:18.2423661Z 538 │ if ( 2026-10-23T11:12:18.2423813Z 539 │ showcaseReviewKey === null || 2026-10-23T11:12:18.2424045Z 540 │ showcasedReviewDrawRef.current === showcaseReviewKey || 2026-10-23T11:12:18.2424289Z 541 │ !isNativeReviewDiffDrawEvent(event.nativeEvent) 2026-10-23T11:12:18.2424473Z 542 │ ) { 2026-10-23T11:12:18.2424600Z 543 │ return; 2026-10-23T11:12:18.2424730Z 544 │ } 2026-10-23T11:12:18.2424907Z 545 │ showcasedReviewDrawRef.current = showcaseReviewKey; 2026-10-23T11:12:18.2425196Z 546 │ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId }); 2026-10-23T11:12:18.2425427Z 547 │ }; 2026-10-23T11:12:18.2425543Z 548 │ 2026-10-23T11:12:18.2425727Z 549 │ const handleSelectFile = async (fileId: string | null) => { 2026-10-23T11:12:18.2425941Z 550 │ loadVisibleFile(fileId, true); 2026-10-23T11:12:18.2426140Z 551 │ commentSelection.clearSelection(); 2026-10-23T11:12:18.2426443Z 552 │ if (fileId !== null && collapsedFileIds.includes(fileId)) { 2026-10-23T11:12:18.2426691Z 553 │ toggleExpandedFile(fileId); 2026-10-23T11:12:18.2426845Z 554 │ } 2026-10-23T11:12:18.2427020Z 555 │ const nativeView = nativeReviewDiffViewRef.current; 2026-10-23T11:12:18.2427222Z 556 │ if (!nativeView) return; 2026-10-23T11:12:18.2427406Z 557 │ const result = await settlePromise(() => 2026-10-23T11:12:18.2427718Z 558 │ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true), 2026-10-23T11:12:18.2427958Z 559 │ ); 2026-10-23T11:12:18.2428116Z 560 │ if (AsyncResult.isFailure(result)) { 2026-10-23T11:12:18.2428401Z 561 │ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result)); 2026-10-23T11:12:18.2428645Z 562 │ } 2026-10-23T11:12:18.2428764Z 563 │ }; 2026-10-23T11:12:18.2428916Z 564 │ const handleVisibleFileChange = ( 2026-10-23T11:12:18.2429156Z 565 │ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>, 2026-10-23T11:12:18.2429359Z 566 │ ) => { 2026-10-23T11:12:18.2429540Z 567 │ loadVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-23T11:12:18.2429835Z 568 │ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-23T11:12:18.2430069Z 569 │ }; 2026-10-23T11:12:18.2430208Z 570 │ const renderInspector = () => ( 2026-10-23T11:12:18.2430380Z 571 │ void handleSelectFile(fileId)} 2026-10-23T11:12:18.2431531Z 577 │ /> 2026-10-23T11:12:18.2431653Z 578 │ ); 2026-10-23T11:12:18.2431767Z 579 │ 2026-10-23T11:12:18.2432016Z 580 │ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => { 2026-10-23T11:12:18.2432293Z 581 │ const { fileId } = event.nativeEvent; 2026-10-23T11:12:18.2432464Z 582 │ if (fileId) { 2026-10-23T11:12:18.2432628Z 583 │ loadVisibleFile(fileId, true); 2026-10-23T11:12:18.2432812Z 584 │ toggleExpandedFile(fileId); 2026-10-23T11:12:18.2432965Z 585 │ } 2026-10-23T11:12:18.2433088Z 586 │ }; 2026-10-23T11:12:18.2433207Z 587 │ 2026-10-23T11:12:18.2433357Z 588 │ const handleNativeToggleViewedFile = ( 2026-10-23T11:12:18.2433588Z 589 │ event: NativeSyntheticEvent<{ readonly fileId?: string }>, 2026-10-23T11:12:18.2433778Z 590 │ ) => { 2026-10-23T11:12:18.2433937Z 591 │ const { fileId } = event.nativeEvent; 2026-10-23T11:12:18.2434105Z 592 │ if (fileId) { 2026-10-23T11:12:18.2434262Z 593 │ toggleViewedFile(fileId); 2026-10-23T11:12:18.2434412Z 594 │ } 2026-10-23T11:12:18.2434530Z 595 │ }; 2026-10-23T11:12:18.2434647Z 596 │ 2026-10-23T11:12:18.2434777Z 597 │ const parsedDiffNotice = 2026-10-23T11:12:18.2435035Z 598 │ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null; 2026-10-23T11:12:18.2435325Z 599 │ const hasCachedSelectedDiff = selectedSection?.diff != null; 2026-10-23T11:12:18.2435685Z 600 │ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null); 2026-10-23T11:12:18.2435973Z 601 │ const sectionMenu = buildReviewSectionMenu(reviewSections); 2026-10-23T11:12:18.2436274Z 602 │ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({ 2026-10-23T11:12:18.2436624Z 603 │ hasEnvironmentPresentation: environment.isReady, 2026-10-23T11:12:18.2436898Z 604 │ isEnvironmentConnected: isEnvironmentReady, 2026-10-23T11:12:18.2437087Z 605 │ hasCachedSelectedDiff, 2026-10-23T11:12:18.2437244Z 606 │ hasAnyCachedDiff, 2026-10-23T11:12:18.2437389Z 607 │ }); 2026-10-23T11:12:18.2437539Z 608 │ const handleRetryEnvironment = () => { 2026-10-23T11:12:18.2437906Z 609 │ void retryEnvironment(environmentId); 2026-10-23T11:12:18.2438228Z 610 │ }; 2026-10-23T11:12:18.2438397Z 611 │ const handleReturnToThread = () => { 2026-10-23T11:12:18.2438587Z 612 │ if (navigation.canGoBack()) { 2026-10-23T11:12:18.2438761Z 613 │ navigation.goBack(); 2026-10-23T11:12:18.2438914Z 614 │ return; 2026-10-23T11:12:18.2439043Z 615 │ } 2026-10-23T11:12:18.2439193Z 616 │ navigation.navigate("Thread", { 2026-10-23T11:12:18.2439404Z 617 │ environmentId: String(environmentId), 2026-10-23T11:12:18.2439599Z 618 │ threadId: String(threadId), 2026-10-23T11:12:18.2439749Z 619 │ }); 2026-10-23T11:12:18.2439870Z 620 │ }; 2026-10-23T11:12:18.2440010Z 621 │ const androidHeaderSubtitle = [ 2026-10-23T11:12:18.2440179Z 622 │ selectedSection?.title, 2026-10-23T11:12:18.2440354Z 623 │ headerDiffSummary.additions, 2026-10-23T11:12:18.2440531Z 624 │ headerDiffSummary.deletions, 2026-10-23T11:12:18.2440684Z 625 │ ] 2026-10-23T11:12:18.2440855Z 626 │ .filter((part): part is string => Boolean(part)) 2026-10-23T11:12:18.2441051Z 627 │ .join(" · "); 2026-10-23T11:12:18.2441185Z 628 │ 2026-10-23T11:12:18.2441322Z 629 │ const showChangedFilesPane = 2026-10-23T11:12:18.2441492Z 630 │ !showConnectionNotice && 2026-10-23T11:12:18.2441659Z 631 │ selectedSection !== null && 2026-10-23T11:12:18.2441844Z 632 │ parsedDiff.kind === "files" && 2026-10-23T11:12:18.2442024Z 633 │ NativeReviewDiffView !== null; 2026-10-23T11:12:18.2442295Z 634 │ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined); 2026-10-23T11:12:18.2442648Z 635 │ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane; 2026-10-23T11:12:18.2442887Z 636 │ 2026-10-23T11:12:18.2443018Z 637 │ const listHeader = (() => { 2026-10-23T11:12:18.2443200Z 638 │ const children: ReactElement[] = []; 2026-10-23T11:12:18.2443355Z 639 │ 2026-10-23T11:12:18.2443479Z 640 │ if (error) { 2026-10-23T11:12:18.2443622Z 641 │ children.push( 2026-10-23T11:12:18.2443765Z 642 │ 2026-10-23T11:12:18.2445080Z 649 │ Review unavailable 2026-10-23T11:12:18.2445399Z 650 │ {error} 2026-10-23T11:12:18.2445620Z 651 │ , 2026-10-23T11:12:18.2445755Z 652 │ ); 2026-10-23T11:12:18.2445874Z 653 │ } 2026-10-23T11:12:18.2445998Z 654 │ 2026-10-23T11:12:18.2446127Z 655 │ if (parsedDiffNotice) { 2026-10-23T11:12:18.2446389Z 656 │ children.push(); 2026-10-23T11:12:18.2446608Z 657 │ } 2026-10-23T11:12:18.2446891Z 658 │ 2026-10-23T11:12:18.2447072Z 659 │ if (children.length === 0) { 2026-10-23T11:12:18.2447233Z 660 │ return null; 2026-10-23T11:12:18.2447373Z 661 │ } 2026-10-23T11:12:18.2447489Z 662 │ 2026-10-23T11:12:18.2447634Z 663 │ return <>{children}; 2026-10-23T11:12:18.2447811Z 664 │ })(); 2026-10-23T11:12:18.2447952Z 665 │ const headerSubtitle = [ 2026-10-23T11:12:18.2448118Z 666 │ headerDiffSummary.additions, 2026-10-23T11:12:18.2448295Z 667 │ headerDiffSummary.deletions, 2026-10-23T11:12:18.2448477Z 668 │ pendingReviewCommentCount > 0 2026-10-23T11:12:18.2448748Z 669 │ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}` 2026-10-23T11:12:18.2448988Z 670 │ : null, 2026-10-23T11:12:18.2449118Z 671 │ ] 2026-10-23T11:12:18.2449245Z 672 │ .filter(Boolean) 2026-10-23T11:12:18.2449398Z 673 │ .join(" · "); 2026-10-23T11:12:18.2449620Z 674 │ const headerTitleText = selectedSection?.title ?? "Review changes"; 2026-10-23T11:12:18.2449819Z 675 │ 2026-10-23T11:12:18.2449937Z 676 │ return ( 2026-10-23T11:12:18.2450063Z 677 │ <> 2026-10-23T11:12:18.2450192Z 678 │ 2026-10-23T11:12:18.2453131Z 694 │ 2026-10-23T11:12:18.2453254Z 695 │ 2026-10-23T11:12:18.2453453Z 696 │ 2026-10-23T11:12:18.2453666Z 697 │ {showConnectionNotice ? ( 2026-10-23T11:12:18.2453904Z 698 │ 2026-10-23T11:12:18.2454153Z 699 │ 2026-10-23T11:12:18.2456443Z 711 │ 2026-10-23T11:12:18.2456715Z 712 │ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? ( 2026-10-23T11:12:18.2456937Z 713 │ 2026-10-23T11:12:18.2457925Z 719 │ 2026-10-23T11:12:18.2458684Z 723 │ {listHeader} 2026-10-23T11:12:18.2458892Z 724 │ 2026-10-23T11:12:18.2459107Z 725 │ { 2026-10-23T11:12:18.2462403Z ·  ────┬──── 2026-10-23T11:12:18.2462618Z · ╰── This is the containing effect 2026-10-23T11:12:18.2462836Z 106 │ clearReviewCommentTarget(); 2026-10-23T11:12:18.2463030Z 107 │ setPendingNativeCommentSelection(null); 2026-10-23T11:12:18.2463249Z ·  ────────────────┬─────────────── 2026-10-23T11:12:18.2463535Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2463785Z 108 │ }, [selectedSection?.id]); 2026-10-23T11:12:18.2463929Z ╰──── 2026-10-23T11:12:18.2464574Z  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-23T11:12:18.2465422Z  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-23T11:12:18.2465724Z 2026-10-23T11:12:18.2465980Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T11:12:18.2466473Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7] 2026-10-23T11:12:18.2466762Z 109 │ 2026-10-23T11:12:18.2466885Z 110 │ useEffect(() => { 2026-10-23T11:12:18.2467039Z ·  ────┬──── 2026-10-23T11:12:18.2467254Z · ╰── This is the containing effect 2026-10-23T11:12:18.2467477Z 111 │ if (activeCommentTarget === null) { 2026-10-23T11:12:18.2467691Z 112 │ setPendingNativeCommentSelection(null); 2026-10-23T11:12:18.2468020Z ·  ────────────────┬─────────────── 2026-10-23T11:12:18.2468312Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2468535Z 113 │ } 2026-10-23T11:12:18.2468652Z ╰──── 2026-10-23T11:12:18.2469299Z  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-23T11:12:18.2470145Z  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-23T11:12:18.2470453Z 2026-10-23T11:12:18.2470652Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T11:12:18.2471028Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7] 2026-10-23T11:12:18.2471309Z 107 │ setPendingNativeCommentSelection(null); 2026-10-23T11:12:18.2471494Z 108 │ }, [selectedSection?.id]); 2026-10-23T11:12:18.2471670Z ·  ─────────┬───────── 2026-10-23T11:12:18.2471936Z · ╰── Unnecessary dependency `selectedSection?.id` 2026-10-23T11:12:18.2472149Z 109 │ 2026-10-23T11:12:18.2472262Z ╰──── 2026-10-23T11:12:18.2472606Z  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-23T11:12:18.2473182Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2473474Z 2026-10-23T11:12:18.2473725Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T11:12:18.2474099Z ╭─[apps/mobile/src/components/ProjectFavicon.tsx:158:5] 2026-10-23T11:12:18.2474480Z 153 │ const [activeFaviconRequest, setActiveFaviconRequest] = useState(null); 2026-10-23T11:12:18.2474773Z 154 │ useLayoutEffect(() => { 2026-10-23T11:12:18.2474939Z ·  ───────┬─────── 2026-10-23T11:12:18.2475166Z · ╰── This is the containing effect 2026-10-23T11:12:18.2475391Z 155 │ if (faviconRequest === null) return; 2026-10-23T11:12:18.2475558Z 156 │ 2026-10-23T11:12:18.2475799Z 157 │ const endRequest = beginProjectFaviconRequest(faviconRequest); 2026-10-23T11:12:18.2476037Z 158 │ setActiveFaviconRequest(faviconRequest); 2026-10-23T11:12:18.2476240Z ·  ───────────┬─────────── 2026-10-23T11:12:18.2476511Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2476744Z 159 │ return endRequest; 2026-10-23T11:12:18.2476879Z ╰──── 2026-10-23T11:12:18.2477530Z  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-23T11:12:18.2478396Z  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-23T11:12:18.2478691Z 2026-10-23T11:12:18.2478894Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-23T11:12:18.2479217Z ╭─[packages/client-runtime/src/state/filesystem.ts:3:8] 2026-10-23T11:12:18.2479426Z 2 │ AuthFilesystemReadScope, 2026-10-23T11:12:18.2479589Z 3 │ type AuthSessionState, 2026-10-23T11:12:18.2479761Z ·  ────────┬─────── 2026-10-23T11:12:18.2480001Z · ╰── 'AuthSessionState' is imported here 2026-10-23T11:12:18.2480219Z 4 │ type FilesystemBrowseEntry, 2026-10-23T11:12:18.2480362Z ╰──── 2026-10-23T11:12:18.2480514Z  help: Consider removing this import. 2026-10-23T11:12:18.2480628Z 2026-10-23T11:12:18.2480882Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T11:12:18.2481261Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:68:5] 2026-10-23T11:12:18.2481509Z 66 │ const { id: attachmentId, fileUri } = attachment; 2026-10-23T11:12:18.2481690Z 67 │ useEffect(() => { 2026-10-23T11:12:18.2481840Z ·  ────┬──── 2026-10-23T11:12:18.2482059Z · ╰── This is the containing effect 2026-10-23T11:12:18.2482258Z 68 │ setUri(null); 2026-10-23T11:12:18.2482404Z ·  ───┬── 2026-10-23T11:12:18.2482650Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2482878Z 69 │ setError(null); 2026-10-23T11:12:18.2483008Z ╰──── 2026-10-23T11:12:18.2483648Z  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-23T11:12:18.2484587Z  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-23T11:12:18.2484926Z 2026-10-23T11:12:18.2485124Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T11:12:18.2485452Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:91:7] 2026-10-23T11:12:18.2485650Z 90 │ }; 2026-10-23T11:12:18.2485796Z 91 │ }, [attachmentId, fileUri]); 2026-10-23T11:12:18.2486008Z ·  ──────┬───── ───┬─── 2026-10-23T11:12:18.2486315Z · │ ╰── Unnecessary dependency `fileUri` 2026-10-23T11:12:18.2486635Z · ╰── Unnecessary dependency `attachmentId` 2026-10-23T11:12:18.2486922Z 92 │ const mimeType = videoMimeType(attachment) ?? attachment.mimeType; 2026-10-23T11:12:18.2487114Z ╰──── 2026-10-23T11:12:18.2487468Z  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-23T11:12:18.2488064Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2488356Z 2026-10-23T11:12:18.2488566Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T11:12:18.2488908Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:213:34] 2026-10-23T11:12:18.2489124Z 212 │ useEffect(() => { 2026-10-23T11:12:18.2489319Z 213 │ if (!isFocused && hasSource) props.onRequestClose(); 2026-10-23T11:12:18.2489548Z ·  ──┬── 2026-10-23T11:12:18.2489815Z · ╰── Missing dependency `props` 2026-10-23T11:12:18.2490078Z 214 │ }, [isFocused, hasSource, props.onRequestClose]); 2026-10-23T11:12:18.2490314Z ·  ──────────┬───────── 2026-10-23T11:12:18.2490664Z · ╰── Overly precise dependency `props.onRequestClose`, use `props` instead 2026-10-23T11:12:18.2490947Z 215 │ const { source } = props; 2026-10-23T11:12:18.2491093Z ╰──── 2026-10-23T11:12:18.2491562Z  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-23T11:12:18.2492256Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2492554Z 2026-10-23T11:12:18.2493015Z ⚠ 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-23T11:12:18.2493566Z ╭─[packages/client-runtime/src/rpc/session.test.ts:226:3] 2026-10-23T11:12:18.2493767Z 225 │ ) { 2026-10-23T11:12:18.2500640Z 226 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T11:12:18.2500952Z 227 │ │ const socket = sockets[index]; 2026-10-23T11:12:18.2501165Z 228 │ │ if (socket) { 2026-10-23T11:12:18.2501457Z 229 │ │ return socket; 2026-10-23T11:12:18.2501676Z 230 │ │ } 2026-10-23T11:12:18.2501870Z 231 │ │ yield* Effect.yieldNow; 2026-10-23T11:12:18.2502111Z 232 │ ╰─▶ } 2026-10-23T11:12:18.2502417Z 233 │ return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket.")); 2026-10-23T11:12:18.2502646Z ╰──── 2026-10-23T11:12:18.2502702Z 2026-10-23T11:12:18.2503166Z ⚠ 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-23T11:12:18.2503715Z ╭─[packages/client-runtime/src/rpc/session.test.ts:240:3] 2026-10-23T11:12:18.2503911Z 239 │ ) { 2026-10-23T11:12:18.2504184Z 240 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T11:12:18.2504588Z 241 │ │ const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index]; 2026-10-23T11:12:18.2504885Z 242 │ │ if (request) { 2026-10-23T11:12:18.2505086Z 243 │ │ return request; 2026-10-23T11:12:18.2505267Z 244 │ │ } 2026-10-23T11:12:18.2505461Z 245 │ │ yield* Effect.yieldNow; 2026-10-23T11:12:18.2505697Z 246 │ ╰─▶ } 2026-10-23T11:12:18.2505994Z 247 │ return yield* Effect.die(new Error("Expected the RPC protocol to send a request.")); 2026-10-23T11:12:18.2506213Z ╰──── 2026-10-23T11:12:18.2506272Z 2026-10-23T11:12:18.2506471Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T11:12:18.2506809Z ╭─[apps/mobile/src/components/ComposerContextSheet.tsx:267:25] 2026-10-23T11:12:18.2507073Z 266 │ {record.elements?.map((element, index) => ( 2026-10-23T11:12:18.2507357Z 267 │ 2026-10-23T11:12:18.2507719Z ·  ─────────────────────────────────────────────────────── 2026-10-23T11:12:18.2507950Z 268 │ { 2026-10-23T11:12:18.2509653Z ·  ────┬──── 2026-10-23T11:12:18.2509867Z · ╰── This is the containing effect 2026-10-23T11:12:18.2510067Z 57 │ scheduler.reset(); 2026-10-23T11:12:18.2510253Z 58 │ highlightedRowIdsRef.current = new Set(); 2026-10-23T11:12:18.2510451Z 59 │ visibleChunkIndexRef.current = 0; 2026-10-23T11:12:18.2510671Z 60 │ setVisibleRange({ firstRowIndex: 0, lastRowIndex: 80 }); 2026-10-23T11:12:18.2510878Z ·  ───────┬─────── 2026-10-23T11:12:18.2511205Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2511519Z 61 │ setTokensPatchJson(createEmptyTokenPatch(resetKey)); 2026-10-23T11:12:18.2511700Z ╰──── 2026-10-23T11:12:18.2512359Z  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-23T11:12:18.2513210Z  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-23T11:12:18.2513509Z 2026-10-23T11:12:18.2513708Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T11:12:18.2514080Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:63:7] 2026-10-23T11:12:18.2514166Z 62 │ return () => scheduler.cancel(); 2026-10-23T11:12:18.2514265Z 63 │ }, [enabled, resetKey, rows.length, scheduler]); 2026-10-23T11:12:18.2514397Z ·  ───┬─── ─────┬───── 2026-10-23T11:12:18.2514589Z · │ ╰── Unnecessary dependency `rows.length` 2026-10-23T11:12:18.2514728Z · ╰── Unnecessary dependency `enabled` 2026-10-23T11:12:18.2514779Z 64 │ 2026-10-23T11:12:18.2514832Z ╰──── 2026-10-23T11:12:18.2515123Z  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-23T11:12:18.2515441Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2515447Z 2026-10-23T11:12:18.2515993Z ⚠ 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-23T11:12:18.2516129Z ╭─[packages/client-runtime/src/rpc/client.test.ts:131:9] 2026-10-23T11:12:18.2516194Z 130 │ ) { 2026-10-23T11:12:18.2516407Z 131 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T11:12:18.2516540Z 132 │ │ if (subscriptions.length >= count) { 2026-10-23T11:12:18.2516637Z 133 │ │ return; 2026-10-23T11:12:18.2516723Z 134 │ │ } 2026-10-23T11:12:18.2516833Z 135 │ │ yield* Effect.yieldNow; 2026-10-23T11:12:18.2516969Z 136 │ ╰─▶ } 2026-10-23T11:12:18.2517132Z 137 │ return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`)); 2026-10-23T11:12:18.2517188Z ╰──── 2026-10-23T11:12:18.2517190Z 2026-10-23T11:12:18.2517670Z ⚠ 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-23T11:12:18.2517812Z ╭─[packages/client-runtime/src/rpc/client.test.ts:252:7] 2026-10-23T11:12:18.2518049Z 251 │ yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient))); 2026-10-23T11:12:18.2518347Z 252 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) { 2026-10-23T11:12:18.2518455Z 253 │ │ yield* Effect.yieldNow; 2026-10-23T11:12:18.2518588Z 254 │ ╰─▶ } 2026-10-23T11:12:18.2518713Z 255 │ yield* SubscriptionRef.set(activeSession, Option.none()); 2026-10-23T11:12:18.2518763Z ╰──── 2026-10-23T11:12:18.2518766Z 2026-10-23T11:12:18.2519218Z ⚠ 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-23T11:12:18.2519357Z ╭─[packages/client-runtime/src/rpc/client.test.ts:258:7] 2026-10-23T11:12:18.2519417Z 257 │ 2026-10-23T11:12:18.2519663Z 258 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-23T11:12:18.2519767Z 259 │ │ yield* Effect.yieldNow; 2026-10-23T11:12:18.2519897Z 260 │ ╰─▶ } 2026-10-23T11:12:18.2520003Z 261 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-23T11:12:18.2520056Z ╰──── 2026-10-23T11:12:18.2520058Z 2026-10-23T11:12:18.2520505Z ⚠ 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-23T11:12:18.2520640Z ╭─[packages/client-runtime/src/rpc/client.test.ts:322:7] 2026-10-23T11:12:18.2520703Z 321 │ ); 2026-10-23T11:12:18.2520953Z 322 │ ╭─▶ for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) { 2026-10-23T11:12:18.2521055Z 323 │ │ yield* Effect.yieldNow; 2026-10-23T11:12:18.2521185Z 324 │ ╰─▶ } 2026-10-23T11:12:18.2521241Z 325 │ 2026-10-23T11:12:18.2521294Z ╰──── 2026-10-23T11:12:18.2521297Z 2026-10-23T11:12:18.2521796Z ⚠ 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-23T11:12:18.2521959Z ╭─[packages/client-runtime/src/rpc/client.test.ts:330:7] 2026-10-23T11:12:18.2522121Z 329 │ yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient))); 2026-10-23T11:12:18.2522365Z 330 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-23T11:12:18.2522470Z 331 │ │ yield* Effect.yieldNow; 2026-10-23T11:12:18.2522596Z 332 │ ╰─▶ } 2026-10-23T11:12:18.2522700Z 333 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-23T11:12:18.2522754Z ╰──── 2026-10-23T11:12:18.2522757Z 2026-10-23T11:12:18.2523207Z ⚠ 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-23T11:12:18.2523368Z ╭─[packages/client-runtime/src/connection/supervisor.test.ts:135:3] 2026-10-23T11:12:18.2523477Z 134 │ let lastState = yield* SubscriptionRef.get(state); 2026-10-23T11:12:18.2523686Z 135 │ ╭─▶ for (let iteration = 0; iteration < 100; iteration += 1) { 2026-10-23T11:12:18.2523821Z 136 │ │ lastState = yield* SubscriptionRef.get(state); 2026-10-23T11:12:18.2523926Z 137 │ │ if (predicate(lastState)) { 2026-10-23T11:12:18.2524022Z 138 │ │ return lastState; 2026-10-23T11:12:18.2524099Z 139 │ │ } 2026-10-23T11:12:18.2524205Z 140 │ │ yield* Effect.yieldNow; 2026-10-23T11:12:18.2524334Z 141 │ ╰─▶ } 2026-10-23T11:12:18.2524407Z 142 │ return yield* Effect.die( 2026-10-23T11:12:18.2524463Z ╰──── 2026-10-23T11:12:18.2524465Z 2026-10-23T11:12:18.2524724Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T11:12:18.2524893Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:123:7] 2026-10-23T11:12:18.2524944Z 118 │ 2026-10-23T11:12:18.2525010Z 119 │ useEffect(() => { 2026-10-23T11:12:18.2525084Z ·  ────┬──── 2026-10-23T11:12:18.2525217Z · ╰── This is the containing effect 2026-10-23T11:12:18.2525297Z 120 │ if (orientationSettled) return; 2026-10-23T11:12:18.2525418Z 121 │ const orientation = getNativeShowcaseOrientation(); 2026-10-23T11:12:18.2525495Z 122 │ if (orientation === null) { 2026-10-23T11:12:18.2525579Z 123 │ setOrientationSettled(true); 2026-10-23T11:12:18.2525670Z ·  ──────────┬────────── 2026-10-23T11:12:18.2525846Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2525908Z 124 │ return; 2026-10-23T11:12:18.2525961Z ╰──── 2026-10-23T11:12:18.2526553Z  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-23T11:12:18.2526922Z  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-23T11:12:18.2526964Z 2026-10-23T11:12:18.2527219Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T11:12:18.2527387Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:304:7] 2026-10-23T11:12:18.2527442Z 292 │ 2026-10-23T11:12:18.2527505Z 293 │ useEffect(() => { 2026-10-23T11:12:18.2527581Z ·  ────┬──── 2026-10-23T11:12:18.2527784Z · ╰── This is the containing effect 2026-10-23T11:12:18.2527846Z 294 │ if ( 2026-10-23T11:12:18.2527913Z 295 │ scene === null || 2026-10-23T11:12:18.2527992Z 296 │ requestedScene === null || 2026-10-23T11:12:18.2528076Z 297 │ scene !== requestedScene || 2026-10-23T11:12:18.2528142Z 298 │ !hasFixture || 2026-10-23T11:12:18.2528217Z 299 │ !orientationSettled || 2026-10-23T11:12:18.2528288Z 300 │ !themeApplied || 2026-10-23T11:12:18.2528407Z 301 │ (scene === "agent-activity" && !agentActivityStaged) || 2026-10-23T11:12:18.2528540Z 302 │ !isShowcaseNativeContentReady({ scene, themeId, renderSignal }) 2026-10-23T11:12:18.2528598Z 303 │ ) { 2026-10-23T11:12:18.2528670Z 304 │ setReadyScene(null); 2026-10-23T11:12:18.2528752Z ·  ──────┬────── 2026-10-23T11:12:18.2528920Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2528985Z 305 │ return; 2026-10-23T11:12:18.2529041Z ╰──── 2026-10-23T11:12:18.2529932Z  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-23T11:12:18.2530261Z  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-23T11:12:18.2530265Z 2026-10-23T11:12:18.2530530Z ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'. 2026-10-23T11:12:18.2530701Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:128:9] 2026-10-23T11:12:18.2530771Z 127 │ let cancelled = false; 2026-10-23T11:12:18.2530867Z 128 │ let lastOutcome: string | null = null; 2026-10-23T11:12:18.2530948Z ·  ─────┬───── 2026-10-23T11:12:18.2531085Z · ╰── 'lastOutcome' is declared here 2026-10-23T11:12:18.2531264Z 129 │ void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), { 2026-10-23T11:12:18.2531318Z ╰──── 2026-10-23T11:12:18.2531424Z  help: Consider removing this declaration. 2026-10-23T11:12:18.2531429Z 2026-10-23T11:12:18.2531627Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T11:12:18.2531774Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7] 2026-10-23T11:12:18.2531872Z 256 │ return () => cancelAnimationFrame(frame); 2026-10-23T11:12:18.2531955Z 257 │ }, [props.path, targetIndex]); 2026-10-23T11:12:18.2532097Z ·  ─────┬──── 2026-10-23T11:12:18.2532278Z · ╰── Unnecessary dependency `props.path` 2026-10-23T11:12:18.2532334Z 258 │ 2026-10-23T11:12:18.2532386Z ╰──── 2026-10-23T11:12:18.2532674Z  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-23T11:12:18.2532982Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2532984Z 2026-10-23T11:12:18.2533176Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T11:12:18.2533325Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23] 2026-10-23T11:12:18.2533401Z 292 │ 2026-10-23T11:12:18.2534618Z ·  ─────────── 2026-10-23T11:12:18.2534692Z 310 │ {body} 2026-10-23T11:12:18.2534745Z ╰──── 2026-10-23T11:12:18.2534890Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-23T11:12:18.2534892Z 2026-10-23T11:12:18.2535071Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T11:12:18.2535254Z ╭─[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:116:34] 2026-10-23T11:12:18.2535326Z 115 │ return [...commands]; 2026-10-23T11:12:18.2535456Z 116 │ }, [activeThreadRef, pathname, registrationVersion, navigation]); 2026-10-23T11:12:18.2535569Z ·  ─────────┬───────── 2026-10-23T11:12:18.2535753Z · ╰── Unnecessary dependency `registrationVersion` 2026-10-23T11:12:18.2535813Z 117 │ 2026-10-23T11:12:18.2535865Z ╰──── 2026-10-23T11:12:18.2536174Z  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-23T11:12:18.2536483Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2536486Z 2026-10-23T11:12:18.2536643Z ⚠ react(immutability): This value cannot be modified 2026-10-23T11:12:18.2536801Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:42:5] 2026-10-23T11:12:18.2536867Z 35 │ 2026-10-23T11:12:18.2537010Z 36 │ const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0); 2026-10-23T11:12:18.2537101Z ·  ────────┬──────── 2026-10-23T11:12:18.2537305Z · ╰── `inspectorProgress` originates here 2026-10-23T11:12:18.2537438Z 37 │ const { renderedInspectorWidth } = props; 2026-10-23T11:12:18.2537568Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-23T11:12:18.2537645Z 39 │ 2026-10-23T11:12:18.2537724Z 40 │ const onClosed = props.onClosed; 2026-10-23T11:12:18.2537791Z 41 │ useEffect(() => { 2026-10-23T11:12:18.2537882Z 42 │ inspectorProgress.value = withTiming( 2026-10-23T11:12:18.2537966Z ·  ────────┬──────── 2026-10-23T11:12:18.2538113Z · ╰── `inspectorProgress` cannot be modified 2026-10-23T11:12:18.2538194Z 43 │ inspectorVisible ? 1 : 0, 2026-10-23T11:12:18.2538248Z ╰──── 2026-10-23T11:12:18.2538518Z  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-23T11:12:18.2538818Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T11:12:18.2538824Z 2026-10-23T11:12:18.2538975Z ⚠ react(immutability): This value cannot be modified 2026-10-23T11:12:18.2539133Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:67:7] 2026-10-23T11:12:18.2539227Z 37 │ const { renderedInspectorWidth } = props; 2026-10-23T11:12:18.2539358Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-23T11:12:18.2539447Z ·  ──────────┬───────── 2026-10-23T11:12:18.2539602Z · ╰── `renderedContentWidth` originates here 2026-10-23T11:12:18.2539661Z 39 │ 2026-10-23T11:12:18.2539745Z 40 │ const onClosed = props.onClosed; 2026-10-23T11:12:18.2539808Z 41 │ useEffect(() => { 2026-10-23T11:12:18.2539900Z 42 │ inspectorProgress.value = withTiming( 2026-10-23T11:12:18.2539976Z 43 │ inspectorVisible ? 1 : 0, 2026-10-23T11:12:18.2540046Z 44 │ WORKSPACE_PANE_TIMING, 2026-10-23T11:12:18.2540113Z 45 │ (finished) => { 2026-10-23T11:12:18.2540252Z 46 │ if (finished === true && !inspectorVisible && onClosed !== undefined) { 2026-10-23T11:12:18.2540326Z 47 │ runOnJS(onClosed)(); 2026-10-23T11:12:18.2540381Z 48 │ } 2026-10-23T11:12:18.2540441Z 49 │ }, 2026-10-23T11:12:18.2540498Z 50 │ ); 2026-10-23T11:12:18.2540630Z 51 │ const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0; 2026-10-23T11:12:18.2540707Z 52 │ renderedInspectorWidth.set( 2026-10-23T11:12:18.2540854Z 53 │ resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING), 2026-10-23T11:12:18.2540914Z 54 │ ); 2026-10-23T11:12:18.2540974Z 55 │ }, [ 2026-10-23T11:12:18.2541049Z 56 │ inspectorProgress, 2026-10-23T11:12:18.2541116Z 57 │ inspectorVisible, 2026-10-23T11:12:18.2541180Z 58 │ inspectorWidth, 2026-10-23T11:12:18.2541242Z 59 │ onClosed, 2026-10-23T11:12:18.2541316Z 60 │ renderedInspectorWidth, 2026-10-23T11:12:18.2541373Z 61 │ resizing, 2026-10-23T11:12:18.2541428Z 62 │ ]); 2026-10-23T11:12:18.2541480Z 63 │ 2026-10-23T11:12:18.2541545Z 64 │ useEffect(() => { 2026-10-23T11:12:18.2541635Z 65 │ const targetWidth = inspectorWidth ?? 0; 2026-10-23T11:12:18.2541722Z 66 │ if (!inspectorVisible || resizing) { 2026-10-23T11:12:18.2541821Z 67 │ renderedContentWidth.value = targetWidth; 2026-10-23T11:12:18.2541963Z ·  ──────────┬───────── 2026-10-23T11:12:18.2542154Z · ╰── `renderedContentWidth` cannot be modified 2026-10-23T11:12:18.2542215Z 68 │ return; 2026-10-23T11:12:18.2542269Z ╰──── 2026-10-23T11:12:18.2542526Z  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-23T11:12:18.2542824Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T11:12:18.2542827Z 2026-10-23T11:12:18.2543013Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T11:12:18.2543152Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:121:27] 2026-10-23T11:12:18.2543320Z 120 │ const scope = makeScope(options.capabilities ?? new Set(["preview", "worktree"])); 2026-10-23T11:12:18.2543408Z 121 │ const dispatch = vi.fn((_: unknown) => 2026-10-23T11:12:18.2543493Z ·  ┬ 2026-10-23T11:12:18.2543624Z · ╰── '_' is declared here 2026-10-23T11:12:18.2543726Z 122 │ (options.dispatchGate ?? Effect.void).pipe( 2026-10-23T11:12:18.2543776Z ╰──── 2026-10-23T11:12:18.2543880Z  help: Consider removing this parameter. 2026-10-23T11:12:18.2543883Z 2026-10-23T11:12:18.2544065Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T11:12:18.2544200Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:134:39] 2026-10-23T11:12:18.2544254Z 133 │ ); 2026-10-23T11:12:18.2544365Z 134 │ const listLocalBranchNames = vi.fn((_: string) => 2026-10-23T11:12:18.2544466Z ·  ┬ 2026-10-23T11:12:18.2544608Z · ╰── '_' is declared here 2026-10-23T11:12:18.2544672Z 135 │ Effect.succeed( 2026-10-23T11:12:18.2544727Z ╰──── 2026-10-23T11:12:18.2544827Z  help: Consider removing this parameter. 2026-10-23T11:12:18.2544830Z 2026-10-23T11:12:18.2545012Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T11:12:18.2545144Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:178:31] 2026-10-23T11:12:18.2545199Z 177 │ }); 2026-10-23T11:12:18.2545299Z 178 │ const sendToThread = vi.fn((_: unknown) => { 2026-10-23T11:12:18.2545438Z ·  ┬ 2026-10-23T11:12:18.2545600Z · ╰── '_' is declared here 2026-10-23T11:12:18.2545697Z 179 │ switch (options.continuation ?? "queued") { 2026-10-23T11:12:18.2545750Z ╰──── 2026-10-23T11:12:18.2545850Z  help: Consider removing this parameter. 2026-10-23T11:12:18.2545852Z 2026-10-23T11:12:18.2546030Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T11:12:18.2546163Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:203:33] 2026-10-23T11:12:18.2546219Z 202 │ ); 2026-10-23T11:12:18.2546318Z 203 │ const removeWorktree = vi.fn((_: unknown) => 2026-10-23T11:12:18.2546406Z ·  ┬ 2026-10-23T11:12:18.2546548Z · ╰── '_' is declared here 2026-10-23T11:12:18.2546631Z 204 │ options.removeWorktreeFails 2026-10-23T11:12:18.2546681Z ╰──── 2026-10-23T11:12:18.2546778Z  help: Consider removing this parameter. 2026-10-23T11:12:18.2546782Z 2026-10-23T11:12:18.2546957Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T11:12:18.2547088Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:208:36] 2026-10-23T11:12:18.2547143Z 207 │ ); 2026-10-23T11:12:18.2547246Z 208 │ const deleteLocalBranch = vi.fn((_: unknown) => 2026-10-23T11:12:18.2547339Z ·  ┬ 2026-10-23T11:12:18.2547474Z · ╰── '_' is declared here 2026-10-23T11:12:18.2547557Z 209 │ options.deleteLocalBranchFails 2026-10-23T11:12:18.2547617Z ╰──── 2026-10-23T11:12:18.2547749Z  help: Consider removing this parameter. 2026-10-23T11:12:18.2547755Z 2026-10-23T11:12:18.2547935Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T11:12:18.2548068Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:213:42] 2026-10-23T11:12:18.2548124Z 212 │ ); 2026-10-23T11:12:18.2548235Z 213 │ const fetchWorktreeBaseCommit = vi.fn((_: unknown) => 2026-10-23T11:12:18.2548335Z ·  ┬ 2026-10-23T11:12:18.2548477Z · ╰── '_' is declared here 2026-10-23T11:12:18.2548561Z 214 │ options.fetchWorktreeBaseFails 2026-10-23T11:12:18.2548610Z ╰──── 2026-10-23T11:12:18.2548709Z  help: Consider removing this parameter. 2026-10-23T11:12:18.2548712Z 2026-10-23T11:12:18.2548892Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T11:12:18.2549035Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:254:30] 2026-10-23T11:12:18.2549087Z 253 │ ); 2026-10-23T11:12:18.2549178Z 254 │ const localStatus = vi.fn((_: unknown) => 2026-10-23T11:12:18.2549264Z ·  ┬ 2026-10-23T11:12:18.2549399Z · ╰── '_' is declared here 2026-10-23T11:12:18.2549464Z 255 │ Effect.succeed({ 2026-10-23T11:12:18.2549516Z ╰──── 2026-10-23T11:12:18.2549613Z  help: Consider removing this parameter. 2026-10-23T11:12:18.2549615Z 2026-10-23T11:12:18.2549791Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T11:12:18.2549974Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:264:32] 2026-10-23T11:12:18.2550059Z 263 │ ); 2026-10-23T11:12:18.2550209Z 264 │ const refreshStatus = vi.fn((_: string) => Effect.die("refreshStatus stub")); 2026-10-23T11:12:18.2550299Z ·  ┬ 2026-10-23T11:12:18.2550432Z · ╰── '_' is declared here 2026-10-23T11:12:18.2550576Z 265 │ const runForThread = vi.fn((input: { readonly worktreePath: string }) => { 2026-10-23T11:12:18.2550628Z ╰──── 2026-10-23T11:12:18.2550727Z  help: Consider removing this parameter. 2026-10-23T11:12:18.2550729Z 2026-10-23T11:12:18.2550924Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T11:12:18.2551089Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:215:7] 2026-10-23T11:12:18.2551149Z 214 │ } 2026-10-23T11:12:18.2551219Z 215 │ }, [wrappedRender]); 2026-10-23T11:12:18.2551297Z ·  ──────┬────── 2026-10-23T11:12:18.2551445Z · ╰── Unnecessary dependency `wrappedRender` 2026-10-23T11:12:18.2551498Z 216 │ 2026-10-23T11:12:18.2551552Z ╰──── 2026-10-23T11:12:18.2551839Z  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-23T11:12:18.2552147Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2552150Z 2026-10-23T11:12:18.2552392Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-23T11:12:18.2552551Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:817:35] 2026-10-23T11:12:18.2552611Z 816 │ > 2026-10-23T11:12:18.2552718Z 817 │ 2026-10-23T11:12:18.2552836Z ·  ──────────────────── 2026-10-23T11:12:18.2552928Z 818 │ 2026-10-23T11:12:18.2553928Z 832 │ 2026-10-23T11:12:18.2554051Z ·  ──────────────────── 2026-10-23T11:12:18.2554149Z 833 │ 2026-10-23T11:12:18.2554198Z ╰──── 2026-10-23T11:12:18.2554414Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-23T11:12:18.2554548Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-23T11:12:18.2554551Z 2026-10-23T11:12:18.2554895Z ⚠ eslint(no-unused-vars): Variable 'revokeActiveMcpThread' is declared but never used. Unused variables should start with a '_'. 2026-10-23T11:12:18.2555053Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:218:7] 2026-10-23T11:12:18.2555104Z 217 │ 2026-10-23T11:12:18.2555253Z 218 │ const revokeActiveMcpThread = (threadId: ThreadId): Effect.Effect => 2026-10-23T11:12:18.2555343Z ·  ──────────┬────────── 2026-10-23T11:12:18.2555651Z · ╰── 'revokeActiveMcpThread' is declared here 2026-10-23T11:12:18.2555833Z 219 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeThread(threadId) : Effect.void; 2026-10-23T11:12:18.2555885Z ╰──── 2026-10-23T11:12:18.2555987Z  help: Consider removing this declaration. 2026-10-23T11:12:18.2555990Z 2026-10-23T11:12:18.2556299Z ⚠ eslint(no-unused-vars): Variable 'revokeAllActiveMcpCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-23T11:12:18.2556423Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:221:7] 2026-10-23T11:12:18.2556474Z 220 │ 2026-10-23T11:12:18.2556605Z 221 │ const revokeAllActiveMcpCredentials = (): Effect.Effect => 2026-10-23T11:12:18.2556711Z ·  ──────────────┬────────────── 2026-10-23T11:12:18.2556884Z · ╰── 'revokeAllActiveMcpCredentials' is declared here 2026-10-23T11:12:18.2557045Z 222 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void; 2026-10-23T11:12:18.2557095Z ╰──── 2026-10-23T11:12:18.2557199Z  help: Consider removing this declaration. 2026-10-23T11:12:18.2557201Z 2026-10-23T11:12:18.2557367Z ⚠ eslint(no-empty-pattern): Empty array binding pattern 2026-10-23T11:12:18.2557529Z ╭─[apps/server/src/pullRequest/PullRequestService.test.ts:1429:12] 2026-10-23T11:12:18.2557583Z 1428 │ 2026-10-23T11:12:18.2557674Z 1429 │ for (const [] of [ 2026-10-23T11:12:18.2557744Z ·  ── 2026-10-23T11:12:18.2557822Z 1430 │ ["github", "github.com"], 2026-10-23T11:12:18.2557877Z ╰──── 2026-10-23T11:12:18.2558151Z  help: Passing non-iterable values (null, undefined, numbers, booleans, etc.) will result in a runtime error because these values are not iterable. 2026-10-23T11:12:18.2558154Z 2026-10-23T11:12:18.2558302Z ⚠ eslint(no-new): Do not use 'new' for side effects. 2026-10-23T11:12:18.2558426Z ╭─[apps/server/src/mcp/McpToolAccess.test.ts:168:3] 2026-10-23T11:12:18.2558542Z 167 │ // @ts-expect-error a declaration constructed directly 2026-10-23T11:12:18.2558642Z 168 │ new McpToolAccess.Declaration(unchecked); 2026-10-23T11:12:18.2558735Z ·  ───────────────────────────── 2026-10-23T11:12:18.2558863Z 169 │ // @ts-expect-error a handlers layer built outside McpToolAccess 2026-10-23T11:12:18.2558915Z ╰──── 2026-10-23T11:12:18.2559070Z  help: Assign the result of 'new' to a variable or compare it to a reference. 2026-10-23T11:12:18.2559072Z 2026-10-23T11:12:18.2559256Z ⚠ eslint(no-unused-vars): Identifier 'Fiber' is imported but never used. 2026-10-23T11:12:18.2559352Z ╭─[apps/server/src/ws.ts:10:13] 2026-10-23T11:12:18.2559442Z  9 │ import * as Effect from "effect/Effect"; 2026-10-23T11:12:18.2559529Z 10 │ import * as Fiber from "effect/Fiber"; 2026-10-23T11:12:18.2559601Z ·  ──┬── 2026-10-23T11:12:18.2559801Z · ╰── 'Fiber' is imported here 2026-10-23T11:12:18.2559944Z 11 │ import * as FileSystem from "effect/FileSystem"; 2026-10-23T11:12:18.2559995Z ╰──── 2026-10-23T11:12:18.2560091Z  help: Consider removing this import. 2026-10-23T11:12:18.2560096Z 2026-10-23T11:12:18.2560288Z ⚠ eslint(no-unused-vars): Identifier 'Schedule' is imported but never used. 2026-10-23T11:12:18.2560389Z ╭─[apps/server/src/ws.ts:17:13] 2026-10-23T11:12:18.2560471Z 16 │ import * as Ref from "effect/Ref"; 2026-10-23T11:12:18.2560560Z 17 │ import * as Schedule from "effect/Schedule"; 2026-10-23T11:12:18.2560638Z ·  ────┬─── 2026-10-23T11:12:18.2560771Z · ╰── 'Schedule' is imported here 2026-10-23T11:12:18.2560863Z 18 │ import * as Schema from "effect/Schema"; 2026-10-23T11:12:18.2560915Z ╰──── 2026-10-23T11:12:18.2561010Z  help: Consider removing this import. 2026-10-23T11:12:18.2561013Z 2026-10-23T11:12:18.2561304Z ⚠ eslint(no-unused-vars): Variable 'projectSetupScriptRunner' is declared but never used. Unused variables should start with a '_'. 2026-10-23T11:12:18.2561403Z ╭─[apps/server/src/ws.ts:1285:13] 2026-10-23T11:12:18.2561556Z 1284 │ const usageLimitSources = yield* UsageLimitSources.UsageLimitSources; 2026-10-23T11:12:18.2561749Z 1285 │ const projectSetupScriptRunner = yield* ProjectSetupScriptRunner.ProjectSetupScriptRunner; 2026-10-23T11:12:18.2561858Z ·  ────────────┬─────────── 2026-10-23T11:12:18.2562028Z · ╰── 'projectSetupScriptRunner' is declared here 2026-10-23T11:12:18.2562198Z 1286 │ const worktreeSetupTracker = yield* WorktreeSetupTracker.WorktreeSetupTracker; 2026-10-23T11:12:18.2562251Z ╰──── 2026-10-23T11:12:18.2562355Z  help: Consider removing this declaration. 2026-10-23T11:12:18.2562357Z 2026-10-23T11:12:18.2562613Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T11:12:18.2562772Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:285:5] 2026-10-23T11:12:18.2562889Z 283 │ const [snoozeWakeTick, bumpSnoozeWakeTick] = useState(0); 2026-10-23T11:12:18.2562957Z 284 │ useEffect(() => { 2026-10-23T11:12:18.2563031Z ·  ────┬──── 2026-10-23T11:12:18.2563163Z · ╰── This is the containing effect 2026-10-23T11:12:18.2563247Z 285 │ setNow(new Date().toISOString()); 2026-10-23T11:12:18.2563323Z ·  ───┬── 2026-10-23T11:12:18.2563489Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2563626Z 286 │ const id = setInterval(() => setNow(new Date().toISOString()), 60_000); 2026-10-23T11:12:18.2563676Z ╰──── 2026-10-23T11:12:18.2564263Z  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-23T11:12:18.2564579Z  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-23T11:12:18.2564582Z 2026-10-23T11:12:18.2564837Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T11:12:18.2565036Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:365:25] 2026-10-23T11:12:18.2565166Z 364 │ // range) the boundary string is identical and the chain would die. 2026-10-23T11:12:18.2565255Z 365 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-23T11:12:18.2565358Z ·  ───────┬────── 2026-10-23T11:12:18.2565522Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-23T11:12:18.2565632Z 366 │ const listItems = ((): readonly SidebarListItem[] => { 2026-10-23T11:12:18.2565685Z ╰──── 2026-10-23T11:12:18.2565978Z  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-23T11:12:18.2566285Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2566287Z 2026-10-23T11:12:18.2566451Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T11:12:18.2566608Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:356:53] 2026-10-23T11:12:18.2566695Z 355 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-23T11:12:18.2566850Z 356 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-23T11:12:18.2566971Z ·  ─────┬──── 2026-10-23T11:12:18.2567140Z · ╰── Cannot call impure function 2026-10-23T11:12:18.2567223Z 357 │ const id = setTimeout(() => { 2026-10-23T11:12:18.2567273Z ╰──── 2026-10-23T11:12:18.2567555Z  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-23T11:12:18.2567857Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T11:12:18.2567861Z 2026-10-23T11:12:18.2568024Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T11:12:18.2568143Z ╭─[apps/server/src/processRunner.test.ts:266:14] 2026-10-23T11:12:18.2568195Z 265 │ 2026-10-23T11:12:18.2568300Z 266 │ for (const {} of ["timeout", "success"] as const) { 2026-10-23T11:12:18.2568423Z ·  ── 2026-10-23T11:12:18.2568527Z 267 │ } 2026-10-23T11:12:18.2568578Z ╰──── 2026-10-23T11:12:18.2568803Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T11:12:18.2568806Z 2026-10-23T11:12:18.2569014Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T11:12:18.2569154Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:772:7] 2026-10-23T11:12:18.2569256Z 771 │ if (settingsSheetPresentation.isActive) { 2026-10-23T11:12:18.2569383Z 772 │ settingsRoutePresentation.present(settingsRouteSession); 2026-10-23T11:12:18.2569476Z ·  ────────────┬──────────── 2026-10-23T11:12:18.2569654Z · ╰── Missing dependency `settingsRoutePresentation` 2026-10-23T11:12:18.2569712Z 773 │ } 2026-10-23T11:12:18.2569915Z 774 │ }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]); 2026-10-23T11:12:18.2570022Z ·  ────────────────┬──────────────── 2026-10-23T11:12:18.2570300Z · ╰── Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead 2026-10-23T11:12:18.2570352Z 775 │ 2026-10-23T11:12:18.2570405Z ╰──── 2026-10-23T11:12:18.2570816Z  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-23T11:12:18.2571130Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2571136Z 2026-10-23T11:12:18.2571289Z ⚠ react(immutability): This value cannot be modified 2026-10-23T11:12:18.2571429Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:390:5] 2026-10-23T11:12:18.2571588Z 386 │ typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0; 2026-10-23T11:12:18.2571720Z 387 │ const animatedBorderRadius = useSharedValue(targetBorderRadius); 2026-10-23T11:12:18.2571812Z ·  ──────────┬───────── 2026-10-23T11:12:18.2571965Z · ╰── `animatedBorderRadius` originates here 2026-10-23T11:12:18.2572119Z 388 │ const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android"; 2026-10-23T11:12:18.2572192Z 389 │ useLayoutEffect(() => { 2026-10-23T11:12:18.2572295Z 390 │ animatedBorderRadius.value = shouldAnimate 2026-10-23T11:12:18.2572383Z ·  ──────────┬───────── 2026-10-23T11:12:18.2572540Z · ╰── `animatedBorderRadius` cannot be modified 2026-10-23T11:12:18.2572627Z 391 │ ? withTiming(targetBorderRadius, { 2026-10-23T11:12:18.2572681Z ╰──── 2026-10-23T11:12:18.2572942Z  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-23T11:12:18.2573241Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T11:12:18.2573243Z 2026-10-23T11:12:18.2573483Z ⚠ eslint(no-unused-vars): Type 'Scope' is imported but never used. 2026-10-23T11:12:18.2573648Z ╭─[apps/server/src/provider/ProviderAuthService.ts:15:18] 2026-10-23T11:12:18.2573735Z 14 │ import * as Layer from "effect/Layer"; 2026-10-23T11:12:18.2573830Z 15 │ import type * as Scope from "effect/Scope"; 2026-10-23T11:12:18.2573910Z ·  ──┬── 2026-10-23T11:12:18.2574040Z · ╰── 'Scope' is imported here 2026-10-23T11:12:18.2574128Z 16 │ import * as Stream from "effect/Stream"; 2026-10-23T11:12:18.2574182Z ╰──── 2026-10-23T11:12:18.2574277Z  help: Consider removing this import. 2026-10-23T11:12:18.2574282Z 2026-10-23T11:12:18.2574433Z ⚠ react(immutability): This value cannot be modified 2026-10-23T11:12:18.2574595Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:111:5] 2026-10-23T11:12:18.2574657Z 107 │ ); 2026-10-23T11:12:18.2574811Z 108 │ const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0); 2026-10-23T11:12:18.2574898Z ·  ─────────┬──────── 2026-10-23T11:12:18.2575050Z · ╰── `separationProgress` originates here 2026-10-23T11:12:18.2575104Z 109 │ 2026-10-23T11:12:18.2575172Z 110 │ useEffect(() => { 2026-10-23T11:12:18.2575340Z 111 │ separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING); 2026-10-23T11:12:18.2575425Z ·  ─────────┬──────── 2026-10-23T11:12:18.2575576Z · ╰── `separationProgress` cannot be modified 2026-10-23T11:12:18.2575686Z 112 │ }, [props.showScrollToEnd, separationProgress]); 2026-10-23T11:12:18.2575736Z ╰──── 2026-10-23T11:12:18.2576002Z  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-23T11:12:18.2576308Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T11:12:18.2576311Z 2026-10-23T11:12:18.2576465Z ⚠ react(immutability): This value cannot be modified 2026-10-23T11:12:18.2576623Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-23T11:12:18.2576737Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-23T11:12:18.2576851Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-23T11:12:18.2576935Z ·  ──────┬───── 2026-10-23T11:12:18.2577074Z · ╰── `capsuleWidth` originates here 2026-10-23T11:12:18.2577186Z 130 │ const measuredWidthRef = useRef(null); 2026-10-23T11:12:18.2577302Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-23T11:12:18.2577411Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-23T11:12:18.2577505Z 133 │ if (width === measuredWidthRef.current) { 2026-10-23T11:12:18.2577567Z 134 │ return; 2026-10-23T11:12:18.2577639Z 135 │ } 2026-10-23T11:12:18.2577747Z 136 │ const first = measuredWidthRef.current === null; 2026-10-23T11:12:18.2577831Z 137 │ measuredWidthRef.current = width; 2026-10-23T11:12:18.2577974Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-23T11:12:18.2578051Z ·  ──────┬───── 2026-10-23T11:12:18.2578246Z · ╰── `capsuleWidth` cannot be modified 2026-10-23T11:12:18.2578335Z 139 │ }; 2026-10-23T11:12:18.2578390Z ╰──── 2026-10-23T11:12:18.2578648Z  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-23T11:12:18.2578947Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T11:12:18.2578949Z 2026-10-23T11:12:18.2579104Z ⚠ react(immutability): This value cannot be modified 2026-10-23T11:12:18.2579261Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-23T11:12:18.2579371Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-23T11:12:18.2579484Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-23T11:12:18.2579570Z ·  ──────┬───── 2026-10-23T11:12:18.2579707Z · ╰── `capsuleWidth` originates here 2026-10-23T11:12:18.2579817Z 130 │ const measuredWidthRef = useRef(null); 2026-10-23T11:12:18.2579933Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-23T11:12:18.2580039Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-23T11:12:18.2580133Z 133 │ if (width === measuredWidthRef.current) { 2026-10-23T11:12:18.2580197Z 134 │ return; 2026-10-23T11:12:18.2580253Z 135 │ } 2026-10-23T11:12:18.2580359Z 136 │ const first = measuredWidthRef.current === null; 2026-10-23T11:12:18.2580443Z 137 │ measuredWidthRef.current = width; 2026-10-23T11:12:18.2580585Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-23T11:12:18.2580645Z 139 │ }; 2026-10-23T11:12:18.2580736Z 140 │ const hasStatus = props.status !== null; 2026-10-23T11:12:18.2580869Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-23T11:12:18.2580938Z 142 │ useEffect(() => { 2026-10-23T11:12:18.2581005Z 143 │ if (!hasStatus) { 2026-10-23T11:12:18.2581090Z 144 │ measuredWidthRef.current = null; 2026-10-23T11:12:18.2581171Z 145 │ capsuleWidth.value = null; 2026-10-23T11:12:18.2581249Z ·  ──────┬───── 2026-10-23T11:12:18.2581390Z · ╰── `capsuleWidth` cannot be modified 2026-10-23T11:12:18.2581444Z 146 │ } 2026-10-23T11:12:18.2581497Z ╰──── 2026-10-23T11:12:18.2581756Z  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-23T11:12:18.2582059Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T11:12:18.2582065Z 2026-10-23T11:12:18.2582264Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T11:12:18.2582421Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-23T11:12:18.2582557Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-23T11:12:18.2582622Z 142 │ useEffect(() => { 2026-10-23T11:12:18.2582700Z ·  ───┬─── 2026-10-23T11:12:18.2582919Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-23T11:12:18.2582988Z 143 │ if (!hasStatus) { 2026-10-23T11:12:18.2583126Z 144 │ measuredWidthRef.current = null; 2026-10-23T11:12:18.2583236Z 145 │ capsuleWidth.value = null; 2026-10-23T11:12:18.2583311Z ·  ──────┬───── 2026-10-23T11:12:18.2583454Z · ╰── This modifies `capsuleWidth` 2026-10-23T11:12:18.2583512Z 146 │ } 2026-10-23T11:12:18.2583567Z ╰──── 2026-10-23T11:12:18.2583901Z  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-23T11:12:18.2584203Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T11:12:18.2584205Z 2026-10-23T11:12:18.2584406Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T11:12:18.2584571Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-23T11:12:18.2584681Z 130 │ const measuredWidthRef = useRef(null); 2026-10-23T11:12:18.2584798Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-23T11:12:18.2584923Z ·  ───────────────┬─────────────── 2026-10-23T11:12:18.2585162Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-23T11:12:18.2585267Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-23T11:12:18.2585362Z 133 │ if (width === measuredWidthRef.current) { 2026-10-23T11:12:18.2585424Z 134 │ return; 2026-10-23T11:12:18.2585478Z 135 │ } 2026-10-23T11:12:18.2585587Z 136 │ const first = measuredWidthRef.current === null; 2026-10-23T11:12:18.2585678Z 137 │ measuredWidthRef.current = width; 2026-10-23T11:12:18.2585821Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-23T11:12:18.2585898Z ·  ──────┬───── 2026-10-23T11:12:18.2586030Z · ╰── This modifies `capsuleWidth` 2026-10-23T11:12:18.2586085Z 139 │ }; 2026-10-23T11:12:18.2586140Z ╰──── 2026-10-23T11:12:18.2586472Z  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-23T11:12:18.2586768Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T11:12:18.2586771Z 2026-10-23T11:12:18.2587028Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T11:12:18.2587206Z ╭─[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:60:5] 2026-10-23T11:12:18.2587259Z 58 │ 2026-10-23T11:12:18.2587325Z 59 │ useEffect(() => { 2026-10-23T11:12:18.2587394Z ·  ────┬──── 2026-10-23T11:12:18.2587523Z · ╰── This is the containing effect 2026-10-23T11:12:18.2587618Z 60 │ setMountedModes((current) => { 2026-10-23T11:12:18.2587698Z ·  ───────┬─────── 2026-10-23T11:12:18.2587896Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2587979Z 61 │ if (current.has(props.mode)) { 2026-10-23T11:12:18.2588087Z ╰──── 2026-10-23T11:12:18.2588719Z  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-23T11:12:18.2589036Z  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-23T11:12:18.2589039Z 2026-10-23T11:12:18.2589229Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T11:12:18.2589396Z ╭─[apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx:814:17] 2026-10-23T11:12:18.2589463Z 813 │
{ 2026-10-23T11:12:18.2590709Z ·  ────┬──── 2026-10-23T11:12:18.2590843Z · ╰── This is the containing effect 2026-10-23T11:12:18.2590948Z 102 │ if (!target || selectedLines.length === 0) { 2026-10-23T11:12:18.2591033Z 103 │ setHighlightedLinesById({}); 2026-10-23T11:12:18.2591122Z ·  ───────────┬─────────── 2026-10-23T11:12:18.2591295Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2591358Z 104 │ return; 2026-10-23T11:12:18.2591412Z ╰──── 2026-10-23T11:12:18.2591994Z  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-23T11:12:18.2592357Z  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-23T11:12:18.2592394Z 2026-10-23T11:12:18.2592618Z ⚠ eslint(no-unused-vars): Function 'assertUserMessagesExclude' is declared but never used. 2026-10-23T11:12:18.2592782Z ╭─[apps/server/src/orchestration-v2/testkit/fixtures/shared.ts:1398:10] 2026-10-23T11:12:18.2592838Z 1397 │ 2026-10-23T11:12:18.2592924Z 1398 │ function assertUserMessagesExclude( 2026-10-23T11:12:18.2593030Z ·  ────────────┬──────────── 2026-10-23T11:12:18.2593198Z · ╰── 'assertUserMessagesExclude' is declared here 2026-10-23T11:12:18.2593308Z 1399 │ projection: OrchestrationV2ThreadProjection, 2026-10-23T11:12:18.2593366Z ╰──── 2026-10-23T11:12:18.2593474Z  help: Consider removing this declaration. 2026-10-23T11:12:18.2593477Z 2026-10-23T11:12:18.2593642Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T11:12:18.2593799Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:697:76] 2026-10-23T11:12:18.2593976Z 696 │ const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() })); 2026-10-23T11:12:18.2594142Z 697 │ if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() }); 2026-10-23T11:12:18.2594281Z ·  ─────┬──── 2026-10-23T11:12:18.2594472Z · ╰── Cannot call impure function 2026-10-23T11:12:18.2594611Z 698 │ const snoozeGateNow = new Date(snoozeGateClock.now).toISOString(); 2026-10-23T11:12:18.2594662Z ╰──── 2026-10-23T11:12:18.2594943Z  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-23T11:12:18.2595232Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T11:12:18.2595234Z 2026-10-23T11:12:18.2595399Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T11:12:18.2595613Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:718:71] 2026-10-23T11:12:18.2595696Z 717 │ const snoozePresets = useMemo( 2026-10-23T11:12:18.2595878Z 718 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-23T11:12:18.2596012Z ·  ─────┬──── 2026-10-23T11:12:18.2596194Z · ╰── Cannot call impure function 2026-10-23T11:12:18.2596310Z 719 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-23T11:12:18.2596363Z ╰──── 2026-10-23T11:12:18.2596634Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T11:12:18.2596924Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T11:12:18.2596927Z 2026-10-23T11:12:18.2597168Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T11:12:18.2597361Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:719:6] 2026-10-23T11:12:18.2597537Z 718 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-23T11:12:18.2597670Z 719 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-23T11:12:18.2597766Z ·  ────────────┬─────────── 2026-10-23T11:12:18.2597938Z · ╰── Unnecessary dependency `props.snoozePresetMinute` 2026-10-23T11:12:18.2597996Z 720 │ ); 2026-10-23T11:12:18.2598049Z ╰──── 2026-10-23T11:12:18.2598362Z  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-23T11:12:18.2598670Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2598675Z 2026-10-23T11:12:18.2598854Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T11:12:18.2599008Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:765:7] 2026-10-23T11:12:18.2599078Z 764 │ thread.pinnedAt, 2026-10-23T11:12:18.2599139Z 765 │ variant, 2026-10-23T11:12:18.2599213Z ·  ───┬─── 2026-10-23T11:12:18.2599351Z · ╰── Unnecessary dependency `variant` 2026-10-23T11:12:18.2599409Z 766 │ ], 2026-10-23T11:12:18.2599459Z ╰──── 2026-10-23T11:12:18.2599771Z  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-23T11:12:18.2600077Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2600079Z 2026-10-23T11:12:18.2600271Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T11:12:18.2600431Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1215:21] 2026-10-23T11:12:18.2600563Z 1214 │ {providerDrivers.slice(0, -1).map((driver, index) => ( 2026-10-23T11:12:18.2600701Z 1215 │ 2026-10-23T11:12:18.2600819Z ·  ────────────────────────── 2026-10-23T11:12:18.2600934Z 1216 │ 2026-10-23T11:12:18.2600989Z ╰──── 2026-10-23T11:12:18.2601136Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-23T11:12:18.2601139Z 2026-10-23T11:12:18.2601395Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T11:12:18.2601551Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:444:5] 2026-10-23T11:12:18.2601611Z 434 │ : null; 2026-10-23T11:12:18.2601679Z 435 │ useEffect(() => { 2026-10-23T11:12:18.2601752Z ·  ────┬──── 2026-10-23T11:12:18.2601885Z · ╰── This is the containing effect 2026-10-23T11:12:18.2601941Z 436 │ if ( 2026-10-23T11:12:18.2602021Z 437 │ props.active === false || 2026-10-23T11:12:18.2602149Z 438 │ activeDraftKey !== null || 2026-10-23T11:12:18.2602261Z 439 │ editingPendingTask !== null || 2026-10-23T11:12:18.2602334Z 440 │ selectedProject === null 2026-10-23T11:12:18.2602392Z 441 │ ) { 2026-10-23T11:12:18.2602452Z 442 │ return; 2026-10-23T11:12:18.2602506Z 443 │ } 2026-10-23T11:12:18.2602576Z 444 │ setActiveDraftKey( 2026-10-23T11:12:18.2602662Z ·  ────────┬──────── 2026-10-23T11:12:18.2602832Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2602902Z 445 │ createNewTaskDraft({ 2026-10-23T11:12:18.2602953Z ╰──── 2026-10-23T11:12:18.2603546Z  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-23T11:12:18.2603866Z  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-23T11:12:18.2603869Z 2026-10-23T11:12:18.2604109Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-23T11:12:18.2604270Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1244:36] 2026-10-23T11:12:18.2604376Z 1243 │ 2026-10-23T11:12:18.2604573Z 1244 │ {props.children} 2026-10-23T11:12:18.2604691Z ·  ───────────── 2026-10-23T11:12:18.2604768Z 1245 │ 2026-10-23T11:12:18.2604820Z ╰──── 2026-10-23T11:12:18.2605041Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-23T11:12:18.2605181Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-23T11:12:18.2605183Z 2026-10-23T11:12:18.2605391Z ⚠ eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used. 2026-10-23T11:12:18.2605493Z ╭─[infra/relay/src/http/Api.ts:69:13] 2026-10-23T11:12:18.2605636Z 68 │ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts"; 2026-10-23T11:12:18.2605754Z 69 │ import * as HookForwarder from "../hooks/HookForwarder.ts"; 2026-10-23T11:12:18.2605848Z ·  ──────┬────── 2026-10-23T11:12:18.2605992Z · ╰── 'HookForwarder' is imported here 2026-10-23T11:12:18.2606097Z 70 │ import * as HeldHooks from "../hooks/HeldHooks.ts"; 2026-10-23T11:12:18.2606150Z ╰──── 2026-10-23T11:12:18.2606249Z  help: Consider removing this import. 2026-10-23T11:12:18.2606251Z 2026-10-23T11:12:18.2606441Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T11:12:18.2606613Z ╭─[apps/web/src/components/pullRequest/PullRequestChecksPopover.tsx:88:15] 2026-10-23T11:12:18.2606677Z 87 │
  • { 2026-10-23T11:12:18.2607967Z ·  ────┬──── 2026-10-23T11:12:18.2608100Z · ╰── This is the containing effect 2026-10-23T11:12:18.2608202Z 332 │ if (!guidesEnabled && section === "guide") { 2026-10-23T11:12:18.2608305Z 333 │ requestedSection.current = "overview"; 2026-10-23T11:12:18.2608472Z 334 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-23T11:12:18.2608548Z 335 │ setSection("overview"); 2026-10-23T11:12:18.2608624Z ·  ─────┬──── 2026-10-23T11:12:18.2608795Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2608849Z 336 │ } 2026-10-23T11:12:18.2608903Z ╰──── 2026-10-23T11:12:18.2609494Z  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-23T11:12:18.2609817Z  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-23T11:12:18.2609822Z 2026-10-23T11:12:18.2610026Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-23T11:12:18.2610192Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:337:6] 2026-10-23T11:12:18.2610291Z 332 │ if (!guidesEnabled && section === "guide") { 2026-10-23T11:12:18.2610391Z 333 │ requestedSection.current = "overview"; 2026-10-23T11:12:18.2610476Z ·  ────────┬─────── 2026-10-23T11:12:18.2610915Z · ╰── 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-23T11:12:18.2611082Z 334 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-23T11:12:18.2611237Z ·  ─────────┬───────── ──────┬────── 2026-10-23T11:12:18.2611725Z · │ ╰── 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-23T11:12:18.2612163Z · ╰── 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-23T11:12:18.2612239Z 335 │ setSection("overview"); 2026-10-23T11:12:18.2612349Z 336 │ } 2026-10-23T11:12:18.2612477Z 337 │ }, [guidesEnabled, section, insets.top]); 2026-10-23T11:12:18.2612591Z ·  ──────────────────┬───────────────── 2026-10-23T11:12:18.2612784Z · ╰── This dependency list is missing values used by the callback 2026-10-23T11:12:18.2612868Z 338 │ const tabContent = activityContent; 2026-10-23T11:12:18.2612923Z ╰──── 2026-10-23T11:12:18.2613091Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-23T11:12:18.2613400Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2613403Z 2026-10-23T11:12:18.2613607Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-23T11:12:18.2613779Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:873:6] 2026-10-23T11:12:18.2613839Z 856 │ if ( 2026-10-23T11:12:18.2613956Z 857 │ lastSelection.current.path === route.params.path && 2026-10-23T11:12:18.2614034Z ·  ──────┬────── 2026-10-23T11:12:18.2614460Z · ╰── 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-23T11:12:18.2614587Z 858 │ lastSelection.current.id === route.params.fileSelectionId 2026-10-23T11:12:18.2614644Z 859 │ ) 2026-10-23T11:12:18.2614703Z 860 │ return; 2026-10-23T11:12:18.2614884Z 861 │ lastSelection.current = { path: route.params.path, id: route.params.fileSelectionId }; 2026-10-23T11:12:18.2615025Z 862 │ if (route.params.focus) navigation.setParams({ focus: undefined }); 2026-10-23T11:12:18.2615112Z 863 │ setJumpPath(route.params.path); 2026-10-23T11:12:18.2615182Z 864 │ setSelectedRowId(null); 2026-10-23T11:12:18.2615262Z 865 │ jumpStarted.current = false; 2026-10-23T11:12:18.2615410Z 866 │ const file = data.files.find((entry) => entry.path === route.params.path); 2026-10-23T11:12:18.2615506Z 867 │ if (!file || !nativeView.current) return; 2026-10-23T11:12:18.2615594Z ·  ─────┬──── 2026-10-23T11:12:18.2616021Z · ╰── 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-23T11:12:18.2616196Z 868 │ setCollapsedIds((ids) => ids.filter((id) => id !== file.id)); 2026-10-23T11:12:18.2616391Z 869 │ jumpStarted.current = true; 2026-10-23T11:12:18.2616528Z 870 │ void nativeView.current.scrollToFile(file.id, false).catch(() => { 2026-10-23T11:12:18.2616606Z 871 │ jumpStarted.current = false; 2026-10-23T11:12:18.2616664Z 872 │ }); 2026-10-23T11:12:18.2616857Z 873 │ }, [route.params.path, route.params.fileSelectionId, route.params.focus, data.files, navigation]); 2026-10-23T11:12:18.2617060Z ·  ──────────────────────────────────────────────┬────────────────────────────────────────────── 2026-10-23T11:12:18.2617276Z · ╰── This dependency list is missing values used by the callback 2026-10-23T11:12:18.2617389Z 874 │ const appliedFilter = useRef(filter.hideTestFiles); 2026-10-23T11:12:18.2617441Z ╰──── 2026-10-23T11:12:18.2617623Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-23T11:12:18.2617949Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2617952Z 2026-10-23T11:12:18.2618139Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-23T11:12:18.2618294Z ╭─[apps/mobile/src/features/threads/ThreadQueueControl.tsx:602:27] 2026-10-23T11:12:18.2618461Z 601 │ const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success)); 2026-10-23T11:12:18.2618541Z 602 │ const gesture = Gesture.Pan() 2026-10-23T11:12:18.2618626Z ·  ─┬─ 2026-10-23T11:12:18.2618774Z · ╰── `Pan` may be a component 2026-10-23T11:12:18.2618854Z 603 │ .enabled(!props.disabled) 2026-10-23T11:12:18.2618906Z ╰──── 2026-10-23T11:12:18.2619175Z  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-23T11:12:18.2619611Z  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-23T11:12:18.2619614Z 2026-10-23T11:12:18.2619893Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-23T11:12:18.2620059Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:387:19] 2026-10-23T11:12:18.2620123Z 386 │ onFilters, 2026-10-23T11:12:18.2620195Z 387 │ authorOptions = [], 2026-10-23T11:12:18.2620271Z ·  ── 2026-10-23T11:12:18.2620341Z 388 │ labelOptions = [], 2026-10-23T11:12:18.2620390Z ╰──── 2026-10-23T11:12:18.2620705Z  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-23T11:12:18.2620707Z 2026-10-23T11:12:18.2620990Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-23T11:12:18.2621158Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:388:18] 2026-10-23T11:12:18.2621227Z 387 │ authorOptions = [], 2026-10-23T11:12:18.2621291Z 388 │ labelOptions = [], 2026-10-23T11:12:18.2621417Z ·  ── 2026-10-23T11:12:18.2621504Z 389 │ host, 2026-10-23T11:12:18.2621559Z ╰──── 2026-10-23T11:12:18.2621868Z  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-23T11:12:18.2621871Z 2026-10-23T11:12:18.2622332Z ⚠ 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-23T11:12:18.2622501Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7] 2026-10-23T11:12:18.2622608Z 565 │ let afterSequence = created[0]!.sequence; 2026-10-23T11:12:18.2622807Z 566 │ ╭─▶ for (let index = 1; index <= 32; index += 1) { 2026-10-23T11:12:18.2622914Z 567 │ │ const nextEvent = { 2026-10-23T11:12:18.2623073Z 568 │ │ id: EventId.make(`event:foundation-stream-race:${index}`), 2026-10-23T11:12:18.2623208Z 569 │ │ type: "thread.metadata-updated" as const, 2026-10-23T11:12:18.2623302Z 570 │ │ threadId, 2026-10-23T11:12:18.2623406Z 571 │ │ providerInstanceId, 2026-10-23T11:12:18.2623507Z 572 │ │ occurredAt: now, 2026-10-23T11:12:18.2623656Z 573 │ │ payload: { ...thread, title: `Race update ${index}` }, 2026-10-23T11:12:18.2623787Z 574 │ │ } satisfies OrchestrationV2DomainEvent; 2026-10-23T11:12:18.2623905Z 575 │ │ const reader = yield* eventSink 2026-10-23T11:12:18.2624031Z 576 │ │ .stream({ threadId, afterSequence }) 2026-10-23T11:12:18.2624164Z 577 │ │ .pipe(Stream.runHead, Effect.forkChild); 2026-10-23T11:12:18.2624270Z 578 │ │ yield* Effect.yieldNow; 2026-10-23T11:12:18.2624430Z 579 │ │ const written = yield* eventSink.write({ events: [nextEvent] }); 2026-10-23T11:12:18.2624561Z 580 │ │ const received = yield* Fiber.join(reader); 2026-10-23T11:12:18.2624678Z 581 │ │ if (Option.isNone(received)) { 2026-10-23T11:12:18.2624877Z 582 │ │ return yield* Effect.die("The event stream ended before delivering the live event."); 2026-10-23T11:12:18.2624961Z 583 │ │ } 2026-10-23T11:12:18.2625124Z 584 │ │ assert.equal(received.value.sequence, written[0]?.sequence); 2026-10-23T11:12:18.2625269Z 585 │ │ assert.equal(received.value.event.id, nextEvent.id); 2026-10-23T11:12:18.2625398Z 586 │ │ afterSequence = received.value.sequence; 2026-10-23T11:12:18.2625526Z 587 │ ╰─▶ } 2026-10-23T11:12:18.2625588Z 588 │ }), 2026-10-23T11:12:18.2625642Z ╰──── 2026-10-23T11:12:18.2625645Z 2026-10-23T11:12:18.2626102Z ⚠ 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-23T11:12:18.2626326Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:2327:9] 2026-10-23T11:12:18.2626435Z 2326 │ let settled = false; 2026-10-23T11:12:18.2626600Z 2327 │ ╭─▶ while (!settled) { 2026-10-23T11:12:18.2626760Z 2328 │ │ settled = (yield* outbox.listByCommandId(commandId)).every( 2026-10-23T11:12:18.2626893Z 2329 │ │ (effect) => effect.status === "succeeded", 2026-10-23T11:12:18.2626974Z 2330 │ │ ); 2026-10-23T11:12:18.2627102Z 2331 │ │ if (!settled) yield* Effect.yieldNow; 2026-10-23T11:12:18.2627240Z 2332 │ ╰─▶ } 2026-10-23T11:12:18.2627359Z 2333 │ }).pipe(Effect.provide(layerWorker), Effect.scoped); 2026-10-23T11:12:18.2627416Z ╰──── 2026-10-23T11:12:18.2627424Z 2026-10-23T11:12:18.2627686Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-23T11:12:18.2627841Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:290:50] 2026-10-23T11:12:18.2627904Z 289 │ return ( 2026-10-23T11:12:18.2628035Z 290 │ 2026-10-23T11:12:18.2628160Z ·  ───────────── 2026-10-23T11:12:18.2628228Z 291 │ {props.children} 2026-10-23T11:12:18.2628283Z ╰──── 2026-10-23T11:12:18.2628503Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-23T11:12:18.2628649Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-23T11:12:18.2628654Z 2026-10-23T11:12:18.2628887Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-23T11:12:18.2629039Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:654:44] 2026-10-23T11:12:18.2629100Z 653 │ return ( 2026-10-23T11:12:18.2629217Z 654 │ 2026-10-23T11:12:18.2629332Z ·  ───────────── 2026-10-23T11:12:18.2629402Z 655 │ {props.children} 2026-10-23T11:12:18.2629456Z ╰──── 2026-10-23T11:12:18.2629670Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-23T11:12:18.2629810Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-23T11:12:18.2629815Z 2026-10-23T11:12:18.2630048Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-23T11:12:18.2630205Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1462:55] 2026-10-23T11:12:18.2630264Z 1461 │ return ( 2026-10-23T11:12:18.2630423Z 1462 │ 2026-10-23T11:12:18.2630554Z ·  ──────────────────── 2026-10-23T11:12:18.2630652Z 1463 │ { 2026-10-23T11:12:18.2635433Z 174 │ rotation.value = withTiming(props.expanded ? expandedAngle : 0, { 2026-10-23T11:12:18.2635573Z ·  ────┬─── 2026-10-23T11:12:18.2635703Z · ╰── `rotation` cannot be modified 2026-10-23T11:12:18.2635804Z 175 │ duration: THREAD_DISCLOSURE_TRANSITION_MS, 2026-10-23T11:12:18.2635858Z ╰──── 2026-10-23T11:12:18.2636131Z  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-23T11:12:18.2636438Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T11:12:18.2636441Z 2026-10-23T11:12:18.2636631Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T11:12:18.2636782Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:1246:23] 2026-10-23T11:12:18.2636851Z 1245 │ { 2026-10-23T11:12:18.2638298Z ·  ────┬──── 2026-10-23T11:12:18.2638428Z · ╰── This is the containing effect 2026-10-23T11:12:18.2638518Z 357 │ if (!isReturningToProjectPicker) { 2026-10-23T11:12:18.2638589Z 358 │ return; 2026-10-23T11:12:18.2638645Z 359 │ } 2026-10-23T11:12:18.2638743Z 360 │ if (requestedInitialProjectAvailable) { 2026-10-23T11:12:18.2638836Z 361 │ setIsReturningToProjectPicker(false); 2026-10-23T11:12:18.2638941Z ·  ──────────────┬────────────── 2026-10-23T11:12:18.2639115Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2639180Z 362 │ return; 2026-10-23T11:12:18.2639233Z ╰──── 2026-10-23T11:12:18.2639821Z  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-23T11:12:18.2640201Z  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-23T11:12:18.2640246Z 2026-10-23T11:12:18.2640497Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T11:12:18.2640647Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:504:9] 2026-10-23T11:12:18.2640701Z 447 │ 2026-10-23T11:12:18.2640767Z 448 │ useEffect(() => { 2026-10-23T11:12:18.2640837Z ·  ────┬──── 2026-10-23T11:12:18.2640966Z · ╰── This is the containing effect 2026-10-23T11:12:18.2641070Z 449 │ if (props.pendingTaskId || props.draftId) { 2026-10-23T11:12:18.2641131Z 450 │ return; 2026-10-23T11:12:18.2641184Z 451 │ } 2026-10-23T11:12:18.2641333Z 452 │ if (lastInitialProjectRefRef.current !== props.initialProjectRef) { 2026-10-23T11:12:18.2641471Z 453 │ lastInitialProjectRefRef.current = props.initialProjectRef; 2026-10-23T11:12:18.2641578Z 454 │ appliedInitialProjectKeyRef.current = null; 2026-10-23T11:12:18.2641632Z 455 │ } 2026-10-23T11:12:18.2641773Z 456 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-23T11:12:18.2641900Z 457 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-23T11:12:18.2642006Z 458 │ if (initialEnvironmentId && initialProjectId) { 2026-10-23T11:12:18.2642077Z 459 │ const directProject = 2026-10-23T11:12:18.2642145Z 460 │ projects.find( 2026-10-23T11:12:18.2642213Z 461 │ (project) => 2026-10-23T11:12:18.2642389Z 462 │ project.environmentId === initialEnvironmentId && project.id === initialProjectId, 2026-10-23T11:12:18.2642457Z 463 │ ) ?? null; 2026-10-23T11:12:18.2642513Z 464 │ 2026-10-23T11:12:18.2642585Z 465 │ if (directProject) { 2026-10-23T11:12:18.2642727Z 466 │ // Apply the route's project once. Re-applying on every change would 2026-10-23T11:12:18.2642863Z 467 │ // instantly revert environment/project switches made in the picker. 2026-10-23T11:12:18.2643029Z 468 │ const directProjectKey = `${directProject.environmentId}:${directProject.id}`; 2026-10-23T11:12:18.2643166Z 469 │ if (appliedInitialProjectKeyRef.current === directProjectKey) { 2026-10-23T11:12:18.2643231Z 470 │ return; 2026-10-23T11:12:18.2643288Z 471 │ } 2026-10-23T11:12:18.2643388Z 472 │ if (props.initialProjectRef?.branch) { 2026-10-23T11:12:18.2643452Z 473 │ if ( 2026-10-23T11:12:18.2643600Z 474 │ selectedProject?.environmentId !== directProject.environmentId || 2026-10-23T11:12:18.2643702Z 475 │ selectedProject.id !== directProject.id 2026-10-23T11:12:18.2643764Z 476 │ ) { 2026-10-23T11:12:18.2643849Z 477 │ setProject(directProject); 2026-10-23T11:12:18.2643912Z 478 │ return; 2026-10-23T11:12:18.2643972Z 479 │ } 2026-10-23T11:12:18.2644055Z 480 │ if (!flow.draftKey) return; 2026-10-23T11:12:18.2644194Z 481 │ // The route completes checkout before mounting this composer. Local 2026-10-23T11:12:18.2644336Z 482 │ // mode reuses an existing worktree; worktree mode would create another. 2026-10-23T11:12:18.2644448Z 483 │ updateComposerDraftSettings(flow.draftKey, { 2026-10-23T11:12:18.2644528Z 484 │ workspaceSelection: { 2026-10-23T11:12:18.2644602Z 485 │ mode: "local", 2026-10-23T11:12:18.2644805Z 486 │ branch: props.initialProjectRef.branch, 2026-10-23T11:12:18.2644994Z 487 │ worktreePath: props.initialProjectRef.worktreePath ?? null, 2026-10-23T11:12:18.2645076Z 488 │ startFromOrigin: false, 2026-10-23T11:12:18.2645138Z 489 │ }, 2026-10-23T11:12:18.2645195Z 490 │ }); 2026-10-23T11:12:18.2645256Z 491 │ } 2026-10-23T11:12:18.2645384Z 492 │ appliedInitialProjectKeyRef.current = directProjectKey; 2026-10-23T11:12:18.2645447Z 493 │ if ( 2026-10-23T11:12:18.2645585Z 494 │ selectedProject?.environmentId === directProject.environmentId && 2026-10-23T11:12:18.2645686Z 495 │ selectedProject.id === directProject.id 2026-10-23T11:12:18.2645744Z 496 │ ) { 2026-10-23T11:12:18.2645809Z 497 │ return; 2026-10-23T11:12:18.2645865Z 498 │ } 2026-10-23T11:12:18.2645953Z 499 │ setProject(directProject); 2026-10-23T11:12:18.2646020Z 500 │ return; 2026-10-23T11:12:18.2646076Z 501 │ } 2026-10-23T11:12:18.2646127Z 502 │ 2026-10-23T11:12:18.2646207Z 503 │ if (projects.length > 0) { 2026-10-23T11:12:18.2646304Z 504 │ setIsReturningToProjectPicker(true); 2026-10-23T11:12:18.2646410Z ·  ──────────────┬────────────── 2026-10-23T11:12:18.2646593Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2646650Z 505 │ } 2026-10-23T11:12:18.2646703Z ╰──── 2026-10-23T11:12:18.2647298Z  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-23T11:12:18.2647629Z  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-23T11:12:18.2647631Z 2026-10-23T11:12:18.2647910Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T11:12:18.2648062Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:604:5] 2026-10-23T11:12:18.2648116Z 545 │ 2026-10-23T11:12:18.2648179Z 546 │ useEffect(() => { 2026-10-23T11:12:18.2648253Z ·  ────┬──── 2026-10-23T11:12:18.2648384Z · ╰── This is the containing effect 2026-10-23T11:12:18.2648480Z 547 │ const shareId = props.incomingShareId; 2026-10-23T11:12:18.2648563Z 548 │ const draftKey = flow.draftKey; 2026-10-23T11:12:18.2648670Z 549 │ const destinationProject = selectedProject; 2026-10-23T11:12:18.2648809Z 550 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-23T11:12:18.2648936Z 551 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-23T11:12:18.2649024Z 552 │ const selectedProjectMatchesRoute = 2026-10-23T11:12:18.2649102Z 553 │ !initialEnvironmentId || 2026-10-23T11:12:18.2649173Z 554 │ !initialProjectId || 2026-10-23T11:12:18.2649306Z 555 │ (destinationProject?.environmentId === initialEnvironmentId && 2026-10-23T11:12:18.2649409Z 556 │ destinationProject.id === initialProjectId); 2026-10-23T11:12:18.2649470Z 557 │ if ( 2026-10-23T11:12:18.2649535Z 558 │ !shareId || 2026-10-23T11:12:18.2649600Z 559 │ !draftKey || 2026-10-23T11:12:18.2649726Z 560 │ !destinationProject || 2026-10-23T11:12:18.2649848Z 561 │ !selectedProjectMatchesRoute || 2026-10-23T11:12:18.2649939Z 562 │ cancelledIncomingShareId === shareId 2026-10-23T11:12:18.2649997Z 563 │ ) { 2026-10-23T11:12:18.2650055Z 564 │ return; 2026-10-23T11:12:18.2650112Z 565 │ } 2026-10-23T11:12:18.2650208Z 566 │ const importKey = `${shareId}:${draftKey}`; 2026-10-23T11:12:18.2650268Z 567 │ if ( 2026-10-23T11:12:18.2650378Z 568 │ startedShareImportKeyRef.current === importKey || 2026-10-23T11:12:18.2650490Z 569 │ cancellingShareImportKeyRef.current === importKey 2026-10-23T11:12:18.2650546Z 570 │ ) { 2026-10-23T11:12:18.2650604Z 571 │ return; 2026-10-23T11:12:18.2650660Z 572 │ } 2026-10-23T11:12:18.2650713Z 573 │ 2026-10-23T11:12:18.2650787Z 574 │ if (!incomingShare) { 2026-10-23T11:12:18.2650989Z 575 │ if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) { 2026-10-23T11:12:18.2651123Z 576 │ alertedUnavailableIncomingShareIdRef.current = shareId; 2026-10-23T11:12:18.2651192Z 577 │ Dialog.alert( 2026-10-23T11:12:18.2651279Z 578 │ "Shared content unavailable", 2026-10-23T11:12:18.2651448Z 579 │ "The shared content is no longer in the inbox. You can continue editing this task draft.", 2026-10-23T11:12:18.2651508Z 580 │ ); 2026-10-23T11:12:18.2651565Z 581 │ } 2026-10-23T11:12:18.2651624Z 582 │ return; 2026-10-23T11:12:18.2651677Z 583 │ } 2026-10-23T11:12:18.2651731Z 584 │ 2026-10-23T11:12:18.2651788Z 585 │ if ( 2026-10-23T11:12:18.2651947Z 586 │ incomingShare.attachments.some((attachment) => attachment.type === "file") && 2026-10-23T11:12:18.2652051Z 587 │ selectedEnvironmentServerConfig === null 2026-10-23T11:12:18.2652111Z 588 │ ) { 2026-10-23T11:12:18.2652172Z 589 │ return; 2026-10-23T11:12:18.2652224Z 590 │ } 2026-10-23T11:12:18.2652278Z 591 │ 2026-10-23T11:12:18.2652416Z 592 │ if (alertedUnavailableIncomingShareIdRef.current === shareId) { 2026-10-23T11:12:18.2652537Z 593 │ alertedUnavailableIncomingShareIdRef.current = null; 2026-10-23T11:12:18.2652588Z 594 │ } 2026-10-23T11:12:18.2652696Z 595 │ startedShareImportKeyRef.current = importKey; 2026-10-23T11:12:18.2652765Z 596 │ const draftBackup = 2026-10-23T11:12:18.2652954Z 597 │ shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey); 2026-10-23T11:12:18.2653089Z 598 │ shareImportDraftBackupRef.current.set(importKey, draftBackup); 2026-10-23T11:12:18.2653180Z 599 │ const importToken = Symbol(importKey); 2026-10-23T11:12:18.2653264Z 600 │ let didReserveShare = false; 2026-10-23T11:12:18.2653343Z 601 │ let didConsumeShare = false; 2026-10-23T11:12:18.2653420Z 602 │ let needsDraftRestore = false; 2026-10-23T11:12:18.2653533Z 603 │ activeShareImportTokenRef.current = importToken; 2026-10-23T11:12:18.2653617Z 604 │ setImportingShareKey(importKey); 2026-10-23T11:12:18.2653707Z ·  ──────────┬───────── 2026-10-23T11:12:18.2653877Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2653947Z 605 │ void (async () => { 2026-10-23T11:12:18.2654000Z ╰──── 2026-10-23T11:12:18.2654647Z  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-23T11:12:18.2655004Z  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-23T11:12:18.2655007Z 2026-10-23T11:12:18.2655205Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T11:12:18.2655358Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:524:5] 2026-10-23T11:12:18.2655437Z 523 │ props.initialProjectRef, 2026-10-23T11:12:18.2655509Z 524 │ props.incomingShareId, 2026-10-23T11:12:18.2655595Z ·  ──────────┬────────── 2026-10-23T11:12:18.2655763Z · ╰── Unnecessary dependency `props.incomingShareId` 2026-10-23T11:12:18.2655843Z 525 │ props.pendingTaskId, 2026-10-23T11:12:18.2655901Z ╰──── 2026-10-23T11:12:18.2656189Z  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-23T11:12:18.2656497Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2656499Z 2026-10-23T11:12:18.2656712Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T11:12:18.2656864Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:543:5] 2026-10-23T11:12:18.2656982Z 542 │ loadedBranchesProjectKeyRef.current = projectKey; 2026-10-23T11:12:18.2657049Z 543 │ flow.loadBranches(); 2026-10-23T11:12:18.2657126Z ·  ──┬─ 2026-10-23T11:12:18.2657255Z · ╰── Missing dependency `flow` 2026-10-23T11:12:18.2657349Z 544 │ }, [flow.loadBranches, selectedProject]); 2026-10-23T11:12:18.2657433Z ·  ────────┬──────── 2026-10-23T11:12:18.2657652Z · ╰── Overly precise dependency `flow.loadBranches`, use `flow` instead 2026-10-23T11:12:18.2657706Z 545 │ 2026-10-23T11:12:18.2657757Z ╰──── 2026-10-23T11:12:18.2660915Z  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-23T11:12:18.2661249Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2661258Z 2026-10-23T11:12:18.2661463Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T11:12:18.2661612Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:766:5] 2026-10-23T11:12:18.2661679Z 765 │ flow.draftKey, 2026-10-23T11:12:18.2661755Z 766 │ hasImportedIncomingShare, 2026-10-23T11:12:18.2661847Z ·  ────────────┬─────────── 2026-10-23T11:12:18.2662018Z · ╰── Unnecessary dependency `hasImportedIncomingShare` 2026-10-23T11:12:18.2662082Z 767 │ incomingShare, 2026-10-23T11:12:18.2662163Z 768 │ isIncomingShareInboxLoading, 2026-10-23T11:12:18.2662258Z ·  ─────────────┬───────────── 2026-10-23T11:12:18.2662529Z · ╰── Unnecessary dependency `isIncomingShareInboxLoading` 2026-10-23T11:12:18.2662648Z 769 │ isIncomingShareUnavailable, 2026-10-23T11:12:18.2662719Z 770 │ props.incomingShareId, 2026-10-23T11:12:18.2662812Z 771 │ props.initialProjectRef?.environmentId, 2026-10-23T11:12:18.2662897Z 772 │ props.initialProjectRef?.projectId, 2026-10-23T11:12:18.2662969Z 773 │ releaseShareReservation, 2026-10-23T11:12:18.2663031Z 774 │ reserveShare, 2026-10-23T11:12:18.2663115Z 775 │ selectedEnvironmentServerConfig, 2026-10-23T11:12:18.2663179Z 776 │ selectedProject, 2026-10-23T11:12:18.2663249Z 777 │ shareImportAttempt, 2026-10-23T11:12:18.2663334Z ·  ─────────┬──────── 2026-10-23T11:12:18.2663498Z · ╰── Unnecessary dependency `shareImportAttempt` 2026-10-23T11:12:18.2663551Z 778 │ ]); 2026-10-23T11:12:18.2663611Z ╰──── 2026-10-23T11:12:18.2663903Z  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-23T11:12:18.2664211Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2664214Z 2026-10-23T11:12:18.2664469Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T11:12:18.2664621Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:57:5] 2026-10-23T11:12:18.2664675Z 55 │ 2026-10-23T11:12:18.2664741Z 56 │ useEffect(() => { 2026-10-23T11:12:18.2664810Z ·  ────┬──── 2026-10-23T11:12:18.2664949Z · ╰── This is the containing effect 2026-10-23T11:12:18.2665019Z 57 │ setDecodedSize(null); 2026-10-23T11:12:18.2665097Z ·  ───────┬────── 2026-10-23T11:12:18.2665264Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2665334Z 58 │ }, [props.sourceKey]); 2026-10-23T11:12:18.2665386Z ╰──── 2026-10-23T11:12:18.2665980Z  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-23T11:12:18.2666349Z  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-23T11:12:18.2666385Z 2026-10-23T11:12:18.2666637Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T11:12:18.2666787Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5] 2026-10-23T11:12:18.2666841Z 59 │ 2026-10-23T11:12:18.2666907Z 60 │ useEffect(() => { 2026-10-23T11:12:18.2666976Z ·  ────┬──── 2026-10-23T11:12:18.2667105Z · ╰── This is the containing effect 2026-10-23T11:12:18.2667174Z 61 │ setFailedUri(null); 2026-10-23T11:12:18.2667250Z ·  ──────┬───── 2026-10-23T11:12:18.2667410Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2667478Z 62 │ }, [props.uri]); 2026-10-23T11:12:18.2667537Z ╰──── 2026-10-23T11:12:18.2668173Z  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-23T11:12:18.2668487Z  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-23T11:12:18.2668493Z 2026-10-23T11:12:18.2668705Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-23T11:12:18.2668856Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10] 2026-10-23T11:12:18.2668988Z 6 │ import { parse, SvgAst, type JsxAST } from "react-native-svg"; 2026-10-23T11:12:18.2669168Z 7 │ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native"; 2026-10-23T11:12:18.2669253Z ·  ────────┬──────── 2026-10-23T11:12:18.2669404Z · ╰── 'ActivityIndicator' is imported here 2026-10-23T11:12:18.2669462Z 8 │ 2026-10-23T11:12:18.2669516Z ╰──── 2026-10-23T11:12:18.2669613Z  help: Consider removing this import. 2026-10-23T11:12:18.2669616Z 2026-10-23T11:12:18.2669816Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T11:12:18.2669964Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7] 2026-10-23T11:12:18.2670035Z 57 │ setDecodedSize(null); 2026-10-23T11:12:18.2670101Z 58 │ }, [props.sourceKey]); 2026-10-23T11:12:18.2670191Z ·  ───────┬─────── 2026-10-23T11:12:18.2670347Z · ╰── Unnecessary dependency `props.sourceKey` 2026-10-23T11:12:18.2670401Z 59 │ 2026-10-23T11:12:18.2670451Z ╰──── 2026-10-23T11:12:18.2670743Z  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-23T11:12:18.2671048Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2671051Z 2026-10-23T11:12:18.2671247Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T11:12:18.2671448Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7] 2026-10-23T11:12:18.2671549Z 61 │ setFailedUri(null); 2026-10-23T11:12:18.2671614Z 62 │ }, [props.uri]); 2026-10-23T11:12:18.2671689Z ·  ────┬──── 2026-10-23T11:12:18.2671829Z · ╰── Unnecessary dependency `props.uri` 2026-10-23T11:12:18.2671882Z 63 │ 2026-10-23T11:12:18.2671934Z ╰──── 2026-10-23T11:12:18.2672220Z  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-23T11:12:18.2672526Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2672528Z 2026-10-23T11:12:18.2672711Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T11:12:18.2672889Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:555:70] 2026-10-23T11:12:18.2672974Z 554 │ assert.deepStrictEqual( 2026-10-23T11:12:18.2673138Z 555 │ (yield* Ref.get(fixture.syncCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-23T11:12:18.2673261Z ·  ┬ 2026-10-23T11:12:18.2673427Z · ╰── '_' is declared here 2026-10-23T11:12:18.2673491Z 556 │ [ 2026-10-23T11:12:18.2673544Z ╰──── 2026-10-23T11:12:18.2673647Z  help: Consider removing this parameter. 2026-10-23T11:12:18.2673650Z 2026-10-23T11:12:18.2673833Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T11:12:18.2674012Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:1155:70] 2026-10-23T11:12:18.2674101Z 1154 │ assert.deepStrictEqual( 2026-10-23T11:12:18.2674264Z 1155 │ (yield* Ref.get(fixture.linkCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-23T11:12:18.2674389Z ·  ┬ 2026-10-23T11:12:18.2674557Z · ╰── '_' is declared here 2026-10-23T11:12:18.2674622Z 1156 │ [ 2026-10-23T11:12:18.2674676Z ╰──── 2026-10-23T11:12:18.2674775Z  help: Consider removing this parameter. 2026-10-23T11:12:18.2674777Z 2026-10-23T11:12:18.2675037Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T11:12:18.2675209Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:79:5] 2026-10-23T11:12:18.2675261Z 76 │ 2026-10-23T11:12:18.2675324Z 77 │ useEffect(() => { 2026-10-23T11:12:18.2675396Z ·  ────┬──── 2026-10-23T11:12:18.2675597Z · ╰── This is the containing effect 2026-10-23T11:12:18.2675727Z 78 │ const { host, code } = parsePairingUrl(connectionPairingUrl); 2026-10-23T11:12:18.2675792Z 79 │ setHostInput(host); 2026-10-23T11:12:18.2675868Z ·  ──────┬───── 2026-10-23T11:12:18.2676034Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2676101Z 80 │ setCodeInput(code); 2026-10-23T11:12:18.2676151Z ╰──── 2026-10-23T11:12:18.2676810Z  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-23T11:12:18.2677172Z  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-23T11:12:18.2677174Z 2026-10-23T11:12:18.2677430Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T11:12:18.2677599Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:89:5] 2026-10-23T11:12:18.2677660Z 82 │ 2026-10-23T11:12:18.2677757Z 83 │ useEffect(() => { 2026-10-23T11:12:18.2677841Z ·  ────┬──── 2026-10-23T11:12:18.2677973Z · ╰── This is the containing effect 2026-10-23T11:12:18.2678062Z 84 │ if (routePairingUrl.length === 0) { 2026-10-23T11:12:18.2678125Z 85 │ return; 2026-10-23T11:12:18.2678181Z 86 │ } 2026-10-23T11:12:18.2678231Z 87 │ 2026-10-23T11:12:18.2678348Z 88 │ const { host, code } = parsePairingUrl(routePairingUrl); 2026-10-23T11:12:18.2678417Z 89 │ setHostInput(host); 2026-10-23T11:12:18.2678493Z ·  ──────┬───── 2026-10-23T11:12:18.2678657Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2678724Z 90 │ setCodeInput(code); 2026-10-23T11:12:18.2678777Z ╰──── 2026-10-23T11:12:18.2679375Z  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-23T11:12:18.2679694Z  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-23T11:12:18.2679697Z 2026-10-23T11:12:18.2679946Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T11:12:18.2680114Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:95:7] 2026-10-23T11:12:18.2680169Z 92 │ 2026-10-23T11:12:18.2680233Z 93 │ useEffect(() => { 2026-10-23T11:12:18.2680300Z ·  ────┬──── 2026-10-23T11:12:18.2680434Z · ╰── This is the containing effect 2026-10-23T11:12:18.2680521Z 94 │ if (pairingConnectionError) { 2026-10-23T11:12:18.2680594Z 95 │ setIsSubmitting(false); 2026-10-23T11:12:18.2680673Z ·  ───────┬─────── 2026-10-23T11:12:18.2680841Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2680897Z 96 │ } 2026-10-23T11:12:18.2680950Z ╰──── 2026-10-23T11:12:18.2681534Z  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-23T11:12:18.2681900Z  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-23T11:12:18.2681940Z 2026-10-23T11:12:18.2682197Z ⚠ unicorn(prefer-add-event-listener): Prefer `addEventListener()` over their `on`-function counterparts. 2026-10-23T11:12:18.2682338Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:12:14] 2026-10-23T11:12:18.2682495Z 11 │ addEventListener(_type: string, listener: (event: { data: string }) => void) { 2026-10-23T11:12:18.2682572Z 12 │ this.onmessage = listener; 2026-10-23T11:12:18.2682654Z ·  ───────── 2026-10-23T11:12:18.2682713Z 13 │ } 2026-10-23T11:12:18.2682767Z ╰──── 2026-10-23T11:12:18.2683088Z  help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on` replaces any previously registered handler. 2026-10-23T11:12:18.2683094Z 2026-10-23T11:12:18.2683305Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-23T11:12:18.2683449Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:16:9] 2026-10-23T11:12:18.2683518Z 15 │ constructor() { 2026-10-23T11:12:18.2683583Z 16 │ source = this; 2026-10-23T11:12:18.2683657Z ·  ────── 2026-10-23T11:12:18.2683714Z 17 │ } 2026-10-23T11:12:18.2683766Z ╰──── 2026-10-23T11:12:18.2684037Z  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-23T11:12:18.2684039Z 2026-10-23T11:12:18.2684233Z ⚠ eslint(require-yield): This generator function does not have `yield` 2026-10-23T11:12:18.2684385Z ╭─[packages/provider-acp/src/server/mcpOverAcpBridge.ts:81:78] 2026-10-23T11:12:18.2684442Z  80 │ 2026-10-23T11:12:18.2684715Z  81 │ ╭─▶ export const makeAcpMcpOverAcpBridge = Effect.fn("AcpMcpOverAcpBridge.make")(function* ( 2026-10-23T11:12:18.2684835Z  82 │ │ options: AcpMcpOverAcpBridgeOptions, 2026-10-23T11:12:18.2684963Z  83 │ │ ): Effect.fn.Return { 2026-10-23T11:12:18.2685133Z  84 │ │ const fetchImplementation = options.fetchImplementation ?? fetch; 2026-10-23T11:12:18.2685272Z  85 │ │ const connections = new Map(); 2026-10-23T11:12:18.2685339Z  86 │ │ 2026-10-23T11:12:18.2685559Z  87 │ │ const connectionFor = (connectionId: string): Effect.Effect => 2026-10-23T11:12:18.2685664Z  88 │ │ Effect.suspend(() => { 2026-10-23T11:12:18.2685801Z  89 │ │ const connection = connections.get(connectionId); 2026-10-23T11:12:18.2685910Z  90 │ │ return connection === undefined 2026-10-23T11:12:18.2686132Z  91 │ │ ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`)) 2026-10-23T11:12:18.2686243Z  92 │ │ : Effect.succeed(connection); 2026-10-23T11:12:18.2686321Z  93 │ │ }); 2026-10-23T11:12:18.2686388Z  94 │ │ 2026-10-23T11:12:18.2686479Z  95 │ │ const send = ( 2026-10-23T11:12:18.2686646Z  96 │ │ connection: Connection, 2026-10-23T11:12:18.2686772Z  97 │ │ message: unknown, 2026-10-23T11:12:18.2686929Z  98 │ │ ): Effect.Effect, AcpMcpOverAcpError> => 2026-10-23T11:12:18.2687046Z  99 │ │ connection.mutex.withPermits(1)( 2026-10-23T11:12:18.2687154Z 100 │ │ Effect.gen(function* () { 2026-10-23T11:12:18.2687278Z 101 │ │ const body = JSON.stringify(message); 2026-10-23T11:12:18.2687417Z 102 │ │ if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) { 2026-10-23T11:12:18.2687643Z 103 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB.")); 2026-10-23T11:12:18.2687743Z 104 │ │ } 2026-10-23T11:12:18.2687884Z 105 │ │ const response = yield* Effect.tryPromise({ 2026-10-23T11:12:18.2687985Z 106 │ │ try: (signal) => 2026-10-23T11:12:18.2688119Z 107 │ │ fetchImplementation(options.endpoint, { 2026-10-23T11:12:18.2688223Z 108 │ │ method: "POST", 2026-10-23T11:12:18.2688316Z 109 │ │ signal, 2026-10-23T11:12:18.2688411Z 110 │ │ headers: { 2026-10-23T11:12:18.2688539Z 111 │ │ "content-type": "application/json", 2026-10-23T11:12:18.2688685Z 112 │ │ accept: "application/json, text/event-stream", 2026-10-23T11:12:18.2688818Z 113 │ │ authorization: options.authorization, 2026-10-23T11:12:18.2688950Z 114 │ │ ...(connection.sessionId === null 2026-10-23T11:12:18.2689045Z 115 │ │ ? {} 2026-10-23T11:12:18.2689191Z 116 │ │ : { "mcp-session-id": connection.sessionId }), 2026-10-23T11:12:18.2689326Z 117 │ │ ...(connection.protocolVersion === null 2026-10-23T11:12:18.2689420Z 118 │ │ ? {} 2026-10-23T11:12:18.2689582Z 119 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-23T11:12:18.2689671Z 120 │ │ }, 2026-10-23T11:12:18.2689764Z 121 │ │ body, 2026-10-23T11:12:18.2689851Z 122 │ │ }), 2026-10-23T11:12:18.2689951Z 123 │ │ catch: bridgeError, 2026-10-23T11:12:18.2690088Z 124 │ │ }); 2026-10-23T11:12:18.2690336Z 125 │ │ connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId; 2026-10-23T11:12:18.2690439Z 126 │ │ if (!response.ok) { 2026-10-23T11:12:18.2690543Z 127 │ │ yield* Effect.promise( 2026-10-23T11:12:18.2690728Z 128 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-23T11:12:18.2690810Z 129 │ │ ); 2026-10-23T11:12:18.2690924Z 130 │ │ return yield* Effect.fail( 2026-10-23T11:12:18.2691130Z 131 │ │ new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`), 2026-10-23T11:12:18.2691212Z 132 │ │ ); 2026-10-23T11:12:18.2691301Z 133 │ │ } 2026-10-23T11:12:18.2691514Z 134 │ │ const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))]; 2026-10-23T11:12:18.2691634Z 135 │ │ for (const payload of payloads) { 2026-10-23T11:12:18.2691848Z 136 │ │ connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion; 2026-10-23T11:12:18.2691926Z 137 │ │ } 2026-10-23T11:12:18.2692026Z 138 │ │ return payloads; 2026-10-23T11:12:18.2692147Z 139 │ │ }).pipe(Effect.mapError(bridgeError)), 2026-10-23T11:12:18.2692224Z 140 │ │ ); 2026-10-23T11:12:18.2692295Z 141 │ │ 2026-10-23T11:12:18.2692476Z 142 │ │ const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* ( 2026-10-23T11:12:18.2692603Z 143 │ │ request: AcpSchema.DisconnectMcpRequest, 2026-10-23T11:12:18.2692790Z 144 │ │ ): Effect.fn.Return { 2026-10-23T11:12:18.2692950Z 145 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-23T11:12:18.2693076Z 146 │ │ connections.delete(request.connectionId); 2026-10-23T11:12:18.2693197Z 147 │ │ const sessionId = connection.sessionId; 2026-10-23T11:12:18.2693296Z 148 │ │ if (sessionId !== null) { 2026-10-23T11:12:18.2693426Z 149 │ │ const response = yield* Effect.tryPromise({ 2026-10-23T11:12:18.2693523Z 150 │ │ try: (signal) => 2026-10-23T11:12:18.2693658Z 151 │ │ fetchImplementation(options.endpoint, { 2026-10-23T11:12:18.2693760Z 152 │ │ method: "DELETE", 2026-10-23T11:12:18.2693852Z 153 │ │ signal, 2026-10-23T11:12:18.2693945Z 154 │ │ headers: { 2026-10-23T11:12:18.2694076Z 155 │ │ authorization: options.authorization, 2026-10-23T11:12:18.2694192Z 156 │ │ "mcp-session-id": sessionId, 2026-10-23T11:12:18.2694325Z 157 │ │ ...(connection.protocolVersion === null 2026-10-23T11:12:18.2694416Z 158 │ │ ? {} 2026-10-23T11:12:18.2694583Z 159 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-23T11:12:18.2694717Z 160 │ │ }, 2026-10-23T11:12:18.2694831Z 161 │ │ }), 2026-10-23T11:12:18.2694932Z 162 │ │ catch: bridgeError, 2026-10-23T11:12:18.2695012Z 163 │ │ }); 2026-10-23T11:12:18.2695144Z 164 │ │ if (!response.ok && response.status !== 404) { 2026-10-23T11:12:18.2695255Z 165 │ │ return yield* Effect.fail( 2026-10-23T11:12:18.2695366Z 166 │ │ new AcpMcpOverAcpError( 2026-10-23T11:12:18.2695551Z 167 │ │ `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`, 2026-10-23T11:12:18.2695629Z 168 │ │ ), 2026-10-23T11:12:18.2695710Z 169 │ │ ); 2026-10-23T11:12:18.2695793Z 170 │ │ } 2026-10-23T11:12:18.2695902Z 171 │ │ yield* Effect.promise( 2026-10-23T11:12:18.2696079Z 172 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-23T11:12:18.2696159Z 173 │ │ ); 2026-10-23T11:12:18.2696233Z 174 │ │ } 2026-10-23T11:12:18.2696319Z 175 │ │ return {}; 2026-10-23T11:12:18.2696393Z 176 │ │ }); 2026-10-23T11:12:18.2696464Z 177 │ │ 2026-10-23T11:12:18.2696544Z 178 │ │ return { 2026-10-23T11:12:18.2696715Z 179 │ │ connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) { 2026-10-23T11:12:18.2696832Z 180 │ │ if (request.serverId !== "t3-code") { 2026-10-23T11:12:18.2696951Z 181 │ │ return yield* Effect.fail( 2026-10-23T11:12:18.2697142Z 182 │ │ new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`), 2026-10-23T11:12:18.2697222Z 183 │ │ ); 2026-10-23T11:12:18.2697295Z 184 │ │ } 2026-10-23T11:12:18.2697424Z 185 │ │ if (connections.size >= MAX_CONNECTIONS) { 2026-10-23T11:12:18.2697643Z 186 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections.")); 2026-10-23T11:12:18.2697745Z 187 │ │ } 2026-10-23T11:12:18.2697898Z 188 │ │ const connectionId = yield* options.allocateConnectionId; 2026-10-23T11:12:18.2698018Z 189 │ │ connections.set(connectionId, { 2026-10-23T11:12:18.2698145Z 190 │ │ mutex: yield* Semaphore.make(1), 2026-10-23T11:12:18.2698248Z 191 │ │ sessionId: null, 2026-10-23T11:12:18.2698352Z 192 │ │ protocolVersion: null, 2026-10-23T11:12:18.2698452Z 193 │ │ nextRequestId: 0, 2026-10-23T11:12:18.2698531Z 194 │ │ }); 2026-10-23T11:12:18.2698635Z 195 │ │ return { connectionId }; 2026-10-23T11:12:18.2698708Z 196 │ │ }), 2026-10-23T11:12:18.2698880Z 197 │ │ message: Effect.fn("mcpOverAcpBridge.message")(function* (request) { 2026-10-23T11:12:18.2699040Z 198 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-23T11:12:18.2699170Z 199 │ │ const id = ++connection.nextRequestId; 2026-10-23T11:12:18.2699356Z 200 │ │ const payloads = yield* send(connection, { 2026-10-23T11:12:18.2699487Z 201 │ │ jsonrpc: "2.0", 2026-10-23T11:12:18.2699571Z 202 │ │ id, 2026-10-23T11:12:18.2699674Z 203 │ │ method: request.method, 2026-10-23T11:12:18.2699834Z 204 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-23T11:12:18.2699914Z 205 │ │ }); 2026-10-23T11:12:18.2700103Z 206 │ │ const response = payloads.find((payload) => asEnvelope(payload)?.id === id); 2026-10-23T11:12:18.2700223Z 207 │ │ const envelope = asEnvelope(response); 2026-10-23T11:12:18.2700328Z 208 │ │ if (envelope === null) { 2026-10-23T11:12:18.2700444Z 209 │ │ return yield* Effect.fail( 2026-10-23T11:12:18.2700633Z 210 │ │ new AcpMcpOverAcpError("MCP server did not return a matching response."), 2026-10-23T11:12:18.2700709Z 211 │ │ ); 2026-10-23T11:12:18.2700789Z 212 │ │ } 2026-10-23T11:12:18.2700910Z 213 │ │ if (envelope.error !== undefined) { 2026-10-23T11:12:18.2701105Z 214 │ │ return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error))); 2026-10-23T11:12:18.2701177Z 215 │ │ } 2026-10-23T11:12:18.2701351Z 216 │ │ return (envelope.result ?? null) as AcpSchema.MessageMcpResponse; 2026-10-23T11:12:18.2701425Z 217 │ │ }), 2026-10-23T11:12:18.2701622Z 218 │ │ notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) { 2026-10-23T11:12:18.2701810Z 219 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-23T11:12:18.2701912Z 220 │ │ yield* send(connection, { 2026-10-23T11:12:18.2702008Z 221 │ │ jsonrpc: "2.0", 2026-10-23T11:12:18.2702110Z 222 │ │ method: request.method, 2026-10-23T11:12:18.2702270Z 223 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-23T11:12:18.2702346Z 224 │ │ }); 2026-10-23T11:12:18.2702422Z 225 │ │ }), 2026-10-23T11:12:18.2702510Z 226 │ │ disconnect, 2026-10-23T11:12:18.2702620Z 227 │ │ dispose: Effect.suspend(() => 2026-10-23T11:12:18.2702718Z 228 │ │ Effect.forEach( 2026-10-23T11:12:18.2702826Z 229 │ │ [...connections.keys()], 2026-10-23T11:12:18.2702996Z 230 │ │ (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore), 2026-10-23T11:12:18.2703096Z 231 │ │ { discard: true }, 2026-10-23T11:12:18.2703172Z 232 │ │ ), 2026-10-23T11:12:18.2703250Z 233 │ │ ), 2026-10-23T11:12:18.2703325Z 234 │ │ }; 2026-10-23T11:12:18.2703454Z 235 │ ╰─▶ }); 2026-10-23T11:12:18.2703505Z ╰──── 2026-10-23T11:12:18.2703759Z  help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed. 2026-10-23T11:12:18.2703762Z 2026-10-23T11:12:18.2703964Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2704124Z ╭─[apps/mobile/src/native/StackHeader.tsx:184:9] 2026-10-23T11:12:18.2704188Z 183 │ "options", 2026-10-23T11:12:18.2704283Z 184 │ latestOptionFunctionsRef.current, 2026-10-23T11:12:18.2704396Z ·  ────────────────┬─────────────── 2026-10-23T11:12:18.2704592Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T11:12:18.2704686Z 185 │ optionFunctionWrappersRef.current, 2026-10-23T11:12:18.2704741Z ╰──── 2026-10-23T11:12:18.2705214Z  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-23T11:12:18.2705510Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2705513Z 2026-10-23T11:12:18.2705657Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2705773Z ╭─[apps/mobile/src/native/StackHeader.tsx:185:9] 2026-10-23T11:12:18.2705867Z 184 │ latestOptionFunctionsRef.current, 2026-10-23T11:12:18.2705964Z 185 │ optionFunctionWrappersRef.current, 2026-10-23T11:12:18.2706074Z ·  ────────────────┬──────────────── 2026-10-23T11:12:18.2706264Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T11:12:18.2706362Z 186 │ ) as NativeStackNavigationOptions) 2026-10-23T11:12:18.2706420Z ╰──── 2026-10-23T11:12:18.2706878Z  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-23T11:12:18.2707165Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2707170Z 2026-10-23T11:12:18.2707423Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T11:12:18.2707561Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2109:5] 2026-10-23T11:12:18.2707630Z 2107 │ ); 2026-10-23T11:12:18.2707722Z 2108 │ useEffect(() => { 2026-10-23T11:12:18.2707797Z ·  ────┬──── 2026-10-23T11:12:18.2707931Z · ╰── This is the containing effect 2026-10-23T11:12:18.2708005Z 2109 │ setExpandedVideo(null); 2026-10-23T11:12:18.2708085Z ·  ────────┬─────── 2026-10-23T11:12:18.2708258Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2708333Z 2110 │ setExpandedFile(null); 2026-10-23T11:12:18.2708388Z ╰──── 2026-10-23T11:12:18.2708991Z  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-23T11:12:18.2709360Z  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-23T11:12:18.2709395Z 2026-10-23T11:12:18.2709620Z ⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used. 2026-10-23T11:12:18.2709753Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:62:10] 2026-10-23T11:12:18.2709891Z 61 │ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets"; 2026-10-23T11:12:18.2710030Z 62 │ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks"; 2026-10-23T11:12:18.2710127Z ·  ───────────┬─────────── 2026-10-23T11:12:18.2710293Z · ╰── 'isMarkdownFileLinkLabel' is imported here 2026-10-23T11:12:18.2710459Z 63 │ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments"; 2026-10-23T11:12:18.2710517Z ╰──── 2026-10-23T11:12:18.2710612Z  help: Consider removing this import. 2026-10-23T11:12:18.2710615Z 2026-10-23T11:12:18.2710821Z ⚠ eslint(no-unused-vars): Identifier 'createContext' is imported but never used. 2026-10-23T11:12:18.2710955Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:88:3] 2026-10-23T11:12:18.2711015Z 87 │ import { 2026-10-23T11:12:18.2711078Z 88 │ createContext, 2026-10-23T11:12:18.2711158Z ·  ──────┬────── 2026-10-23T11:12:18.2711297Z · ╰── 'createContext' is imported here 2026-10-23T11:12:18.2711358Z 89 │ memo, 2026-10-23T11:12:18.2711411Z ╰──── 2026-10-23T11:12:18.2711518Z  help: Consider removing this import. 2026-10-23T11:12:18.2711523Z 2026-10-23T11:12:18.2711731Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-23T11:12:18.2711866Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:103:3] 2026-10-23T11:12:18.2711923Z 102 │ import { 2026-10-23T11:12:18.2711994Z 103 │ ActivityIndicator, 2026-10-23T11:12:18.2712076Z ·  ────────┬──────── 2026-10-23T11:12:18.2712220Z · ╰── 'ActivityIndicator' is imported here 2026-10-23T11:12:18.2712276Z 104 │ Image, 2026-10-23T11:12:18.2712330Z ╰──── 2026-10-23T11:12:18.2712426Z  help: Consider removing this import. 2026-10-23T11:12:18.2712428Z 2026-10-23T11:12:18.2712624Z ⚠ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used. 2026-10-23T11:12:18.2712804Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:110:3] 2026-10-23T11:12:18.2712902Z 109 │ Pressable, 2026-10-23T11:12:18.2712966Z 110 │ ScrollView, 2026-10-23T11:12:18.2713039Z ·  ─────┬──── 2026-10-23T11:12:18.2713170Z · ╰── 'ScrollView' is imported here 2026-10-23T11:12:18.2713233Z 111 │ StyleSheet, 2026-10-23T11:12:18.2713285Z ╰──── 2026-10-23T11:12:18.2713378Z  help: Consider removing this import. 2026-10-23T11:12:18.2713383Z 2026-10-23T11:12:18.2713575Z ⚠ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used. 2026-10-23T11:12:18.2713707Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:112:11] 2026-10-23T11:12:18.2713771Z 111 │ StyleSheet, 2026-10-23T11:12:18.2713845Z 112 │ Text as NativeText, 2026-10-23T11:12:18.2713929Z ·  ─────┬──── 2026-10-23T11:12:18.2714066Z · ╰── 'NativeText' is imported here 2026-10-23T11:12:18.2714132Z 113 │ type ColorValue, 2026-10-23T11:12:18.2714186Z ╰──── 2026-10-23T11:12:18.2714279Z  help: Consider removing this import. 2026-10-23T11:12:18.2714281Z 2026-10-23T11:12:18.2714493Z ⚠ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used. 2026-10-23T11:12:18.2714626Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:134:10] 2026-10-23T11:12:18.2714762Z 133 │ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic"; 2026-10-23T11:12:18.2714887Z 134 │ import { tryOpenExternalUrl } from "../../lib/openExternalUrl"; 2026-10-23T11:12:18.2714983Z ·  ─────────┬──────── 2026-10-23T11:12:18.2715139Z · ╰── 'tryOpenExternalUrl' is imported here 2026-10-23T11:12:18.2715287Z 135 │ import { downloadAndShareAttachment } from "../../lib/attachmentDownload"; 2026-10-23T11:12:18.2715338Z ╰──── 2026-10-23T11:12:18.2715434Z  help: Consider removing this import. 2026-10-23T11:12:18.2715437Z 2026-10-23T11:12:18.2715701Z ⚠ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used. 2026-10-23T11:12:18.2715833Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:137:10] 2026-10-23T11:12:18.2715966Z 136 │ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks"; 2026-10-23T11:12:18.2716091Z 137 │ import { faviconUrlForOrigin } from "@t3tools/shared/favicon"; 2026-10-23T11:12:18.2716188Z ·  ─────────┬───────── 2026-10-23T11:12:18.2716348Z · ╰── 'faviconUrlForOrigin' is imported here 2026-10-23T11:12:18.2716406Z 138 │ import { 2026-10-23T11:12:18.2716460Z ╰──── 2026-10-23T11:12:18.2716555Z  help: Consider removing this import. 2026-10-23T11:12:18.2716557Z 2026-10-23T11:12:18.2716768Z ⚠ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used. 2026-10-23T11:12:18.2716897Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:151:10] 2026-10-23T11:12:18.2717047Z 150 │ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile"; 2026-10-23T11:12:18.2717180Z 151 │ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer"; 2026-10-23T11:12:18.2717268Z ·  ────────┬─────── 2026-10-23T11:12:18.2717488Z · ╰── 'MediaVideoPlayer' is imported here 2026-10-23T11:12:18.2717683Z 152 │ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia"; 2026-10-23T11:12:18.2717739Z ╰──── 2026-10-23T11:12:18.2717839Z  help: Consider removing this import. 2026-10-23T11:12:18.2717841Z 2026-10-23T11:12:18.2718059Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used. 2026-10-23T11:12:18.2718188Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:155:3] 2026-10-23T11:12:18.2718271Z 154 │ attachmentVideoPreviewSource, 2026-10-23T11:12:18.2718343Z 155 │ mediaVideoPreviewUri, 2026-10-23T11:12:18.2718427Z ·  ──────────┬───────── 2026-10-23T11:12:18.2718577Z · ╰── 'mediaVideoPreviewUri' is imported here 2026-10-23T11:12:18.2718654Z 156 │ mediaVideoThumbnailKey, 2026-10-23T11:12:18.2718711Z ╰──── 2026-10-23T11:12:18.2718806Z  help: Consider removing this import. 2026-10-23T11:12:18.2718808Z 2026-10-23T11:12:18.2719025Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used. 2026-10-23T11:12:18.2719157Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:156:3] 2026-10-23T11:12:18.2719227Z 155 │ mediaVideoPreviewUri, 2026-10-23T11:12:18.2719298Z 156 │ mediaVideoThumbnailKey, 2026-10-23T11:12:18.2719384Z ·  ───────────┬────────── 2026-10-23T11:12:18.2719540Z · ╰── 'mediaVideoThumbnailKey' is imported here 2026-10-23T11:12:18.2719621Z 157 │ type MediaVideoPreviewSource, 2026-10-23T11:12:18.2719675Z ╰──── 2026-10-23T11:12:18.2719771Z  help: Consider removing this import. 2026-10-23T11:12:18.2719776Z 2026-10-23T11:12:18.2719986Z ⚠ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used. 2026-10-23T11:12:18.2720118Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:157:8] 2026-10-23T11:12:18.2720191Z 156 │ mediaVideoThumbnailKey, 2026-10-23T11:12:18.2720268Z 157 │ type MediaVideoPreviewSource, 2026-10-23T11:12:18.2720364Z ·  ───────────┬─────────── 2026-10-23T11:12:18.2720524Z · ╰── 'MediaVideoPreviewSource' is imported here 2026-10-23T11:12:18.2720612Z 158 │ } from "../../lib/videoPreviewSource"; 2026-10-23T11:12:18.2720663Z ╰──── 2026-10-23T11:12:18.2720758Z  help: Consider removing this import. 2026-10-23T11:12:18.2720760Z 2026-10-23T11:12:18.2720961Z ⚠ eslint(no-unused-vars): Type 'ReviewDiffTheme' is imported but never used. 2026-10-23T11:12:18.2721096Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:165:15] 2026-10-23T11:12:18.2721269Z 164 │ import { parseReviewCommentMessageSegments } from "../review/reviewCommentSelection"; 2026-10-23T11:12:18.2721407Z 165 │ import type { ReviewDiffTheme } from "../review/shikiReviewHighlighter"; 2026-10-23T11:12:18.2721499Z ·  ───────┬─────── 2026-10-23T11:12:18.2721648Z · ╰── 'ReviewDiffTheme' is imported here 2026-10-23T11:12:18.2721704Z 166 │ import { 2026-10-23T11:12:18.2721757Z ╰──── 2026-10-23T11:12:18.2721852Z  help: Consider removing this import. 2026-10-23T11:12:18.2721854Z 2026-10-23T11:12:18.2722192Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used. 2026-10-23T11:12:18.2722352Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:180:3] 2026-10-23T11:12:18.2722411Z 179 │ import { 2026-10-23T11:12:18.2722487Z 180 │ resolveMarkdownFontSizes, 2026-10-23T11:12:18.2722578Z ·  ────────────┬─────────── 2026-10-23T11:12:18.2722732Z · ╰── 'resolveMarkdownFontSizes' is imported here 2026-10-23T11:12:18.2722820Z 181 │ resolveNativeMarkdownTypography, 2026-10-23T11:12:18.2722872Z ╰──── 2026-10-23T11:12:18.2722966Z  help: Consider removing this import. 2026-10-23T11:12:18.2722968Z 2026-10-23T11:12:18.2723184Z ⚠ eslint(no-unused-vars): Identifier 'markdownLinkIconSource' is imported but never used. 2026-10-23T11:12:18.2723324Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:185:10] 2026-10-23T11:12:18.2723462Z 184 │ import { PierreEntryIcon } from "../../components/PierreEntryIcon"; 2026-10-23T11:12:18.2723597Z 185 │ import { markdownLinkIconSource } from "../../lib/markdownLinkIcons"; 2026-10-23T11:12:18.2723692Z ·  ───────────┬────────── 2026-10-23T11:12:18.2723850Z · ╰── 'markdownLinkIconSource' is imported here 2026-10-23T11:12:18.2723909Z 186 │ import { 2026-10-23T11:12:18.2723962Z ╰──── 2026-10-23T11:12:18.2724054Z  help: Consider removing this import. 2026-10-23T11:12:18.2724059Z 2026-10-23T11:12:18.2724312Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used. 2026-10-23T11:12:18.2724443Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:188:3] 2026-10-23T11:12:18.2724528Z 187 │ normalizeNativeMarkdownUrl, 2026-10-23T11:12:18.2724627Z 188 │ resolveMarkdownInlineCodePresentation, 2026-10-23T11:12:18.2724735Z ·  ──────────────────┬────────────────── 2026-10-23T11:12:18.2724929Z · ╰── 'resolveMarkdownInlineCodePresentation' is imported here 2026-10-23T11:12:18.2725004Z 189 │ resolveMarkdownLinkIcon, 2026-10-23T11:12:18.2725058Z ╰──── 2026-10-23T11:12:18.2725150Z  help: Consider removing this import. 2026-10-23T11:12:18.2725153Z 2026-10-23T11:12:18.2725376Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownLinkIcon' is imported but never used. 2026-10-23T11:12:18.2725507Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:189:3] 2026-10-23T11:12:18.2725603Z 188 │ resolveMarkdownInlineCodePresentation, 2026-10-23T11:12:18.2725680Z 189 │ resolveMarkdownLinkIcon, 2026-10-23T11:12:18.2725774Z ·  ───────────┬─────────── 2026-10-23T11:12:18.2725928Z · ╰── 'resolveMarkdownLinkIcon' is imported here 2026-10-23T11:12:18.2726015Z 190 │ resolveMarkdownLinkPresentation, 2026-10-23T11:12:18.2726065Z ╰──── 2026-10-23T11:12:18.2726159Z  help: Consider removing this import. 2026-10-23T11:12:18.2726161Z 2026-10-23T11:12:18.2726385Z ⚠ eslint(no-unused-vars): Identifier 'useMarkdownCodeHighlight' is imported but never used. 2026-10-23T11:12:18.2726515Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:228:10] 2026-10-23T11:12:18.2726616Z 227 │ import { ThreadMcpApp } from "./McpAppWebView"; 2026-10-23T11:12:18.2726762Z 228 │ import { useMarkdownCodeHighlight } from "./markdownCodeHighlightState"; 2026-10-23T11:12:18.2726917Z ·  ────────────┬─────────── 2026-10-23T11:12:18.2727115Z · ╰── 'useMarkdownCodeHighlight' is imported here 2026-10-23T11:12:18.2727172Z 229 │ import { 2026-10-23T11:12:18.2727224Z ╰──── 2026-10-23T11:12:18.2727321Z  help: Consider removing this import. 2026-10-23T11:12:18.2727323Z 2026-10-23T11:12:18.2727529Z ⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used. 2026-10-23T11:12:18.2727673Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:232:3] 2026-10-23T11:12:18.2727741Z 231 │ useAssetUrl, 2026-10-23T11:12:18.2727815Z 232 │ useAssetUrlState, 2026-10-23T11:12:18.2727898Z ·  ────────┬─────── 2026-10-23T11:12:18.2728044Z · ╰── 'useAssetUrlState' is imported here 2026-10-23T11:12:18.2728119Z 233 │ useRefreshAssetUrl, 2026-10-23T11:12:18.2728172Z ╰──── 2026-10-23T11:12:18.2728268Z  help: Consider removing this import. 2026-10-23T11:12:18.2728270Z 2026-10-23T11:12:18.2728466Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T11:12:18.2728602Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2111:7] 2026-10-23T11:12:18.2728678Z 2110 │ setExpandedFile(null); 2026-10-23T11:12:18.2728838Z 2111 │ }, [props.environmentId, props.threadId, props.contentPresentation.kind]); 2026-10-23T11:12:18.2729060Z ·  ─────────┬───────── ───────┬────── ───────────────┬────────────── 2026-10-23T11:12:18.2729356Z · │ │ ╰── Unnecessary dependency `props.contentPresentation.kind` 2026-10-23T11:12:18.2729560Z · │ ╰── Unnecessary dependency `props.threadId` 2026-10-23T11:12:18.2729722Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-23T11:12:18.2729864Z 2112 │ const horizontalPadding = props.layoutVariant === "split" ? 20 : 16; 2026-10-23T11:12:18.2729914Z ╰──── 2026-10-23T11:12:18.2730206Z  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-23T11:12:18.2730568Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2730608Z 2026-10-23T11:12:18.2730807Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T11:12:18.2730940Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2578:7] 2026-10-23T11:12:18.2731036Z 2577 │ reportHeaderMaterialVisibility(false); 2026-10-23T11:12:18.2731152Z 2578 │ }, [feedThreadKey, reportHeaderMaterialVisibility]); 2026-10-23T11:12:18.2731234Z ·  ──────┬────── 2026-10-23T11:12:18.2731385Z · ╰── Unnecessary dependency `feedThreadKey` 2026-10-23T11:12:18.2731439Z 2579 │ 2026-10-23T11:12:18.2731492Z ╰──── 2026-10-23T11:12:18.2731781Z  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-23T11:12:18.2732096Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2732101Z 2026-10-23T11:12:18.2732297Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T11:12:18.2732431Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2594:7] 2026-10-23T11:12:18.2732490Z 2593 │ } 2026-10-23T11:12:18.2732621Z 2594 │ }, [listMountKey, props.contentInsetEndAdjustment, listRef]); 2026-10-23T11:12:18.2732700Z ·  ──────┬───── 2026-10-23T11:12:18.2732850Z · ╰── Unnecessary dependency `listMountKey` 2026-10-23T11:12:18.2732907Z 2595 │ 2026-10-23T11:12:18.2732960Z ╰──── 2026-10-23T11:12:18.2733251Z  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-23T11:12:18.2733560Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2733562Z 2026-10-23T11:12:18.2733762Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T11:12:18.2733901Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2751:7] 2026-10-23T11:12:18.2733960Z 2750 │ } 2026-10-23T11:12:18.2734139Z 2751 │ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]); 2026-10-23T11:12:18.2734339Z ·  ───────┬─────── ─────────┬──────── ────────┬─────── 2026-10-23T11:12:18.2734597Z · │ │ ╰── Unnecessary dependency `expandedWorkRows` 2026-10-23T11:12:18.2734804Z · │ ╰── Unnecessary dependency `expandedWorkGroups` 2026-10-23T11:12:18.2734958Z · ╰── Unnecessary dependency `expandedTurnIds` 2026-10-23T11:12:18.2735010Z 2752 │ 2026-10-23T11:12:18.2735063Z ╰──── 2026-10-23T11:12:18.2735348Z  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-23T11:12:18.2735704Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2735738Z 2026-10-23T11:12:18.2735914Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T11:12:18.2736050Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:603:9] 2026-10-23T11:12:18.2736110Z 602 │ }; 2026-10-23T11:12:18.2736226Z 603 │ }, [props.environmentId, attachment.id, httpBaseUrl]), 2026-10-23T11:12:18.2736414Z ·  ─────────┬───────── ──────┬────── ─────┬───── 2026-10-23T11:12:18.2736654Z · │ │ ╰── Unnecessary dependency `httpBaseUrl` 2026-10-23T11:12:18.2736856Z · │ ╰── Unnecessary dependency `attachment.id` 2026-10-23T11:12:18.2737023Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-23T11:12:18.2737079Z 604 │ ); 2026-10-23T11:12:18.2737130Z ╰──── 2026-10-23T11:12:18.2737443Z  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-23T11:12:18.2737796Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2737798Z 2026-10-23T11:12:18.2738049Z ⚠ eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used. 2026-10-23T11:12:18.2738232Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:960:10] 2026-10-23T11:12:18.2738290Z 959 │ 2026-10-23T11:12:18.2738401Z 960 │ function layerClaudeAgentSdkReplayQueryRunner( 2026-10-23T11:12:18.2738517Z ·  ──────────────────┬───────────────── 2026-10-23T11:12:18.2738709Z · ╰── 'layerClaudeAgentSdkReplayQueryRunner' is declared here 2026-10-23T11:12:18.2738815Z 961 │ transcript: ClaudeAgentSdkReplayTranscript, 2026-10-23T11:12:18.2738870Z ╰──── 2026-10-23T11:12:18.2738975Z  help: Consider removing this declaration. 2026-10-23T11:12:18.2738977Z 2026-10-23T11:12:18.2739180Z ⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used. 2026-10-23T11:12:18.2739320Z ╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10] 2026-10-23T11:12:18.2739373Z 21 │ 2026-10-23T11:12:18.2739540Z 22 │ function summarizePayload(payload: unknown): Readonly> { 2026-10-23T11:12:18.2739630Z ·  ────────┬─────── 2026-10-23T11:12:18.2739778Z · ╰── 'summarizePayload' is declared here 2026-10-23T11:12:18.2739887Z 23 │ if (payload === null) return { valueType: "null" }; 2026-10-23T11:12:18.2739942Z ╰──── 2026-10-23T11:12:18.2740042Z  help: Consider removing this declaration. 2026-10-23T11:12:18.2740048Z 2026-10-23T11:12:18.2740266Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-23T11:12:18.2740439Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:1998:15] 2026-10-23T11:12:18.2740507Z 1997 │ assert.equal( 2026-10-23T11:12:18.2740708Z 1998 │ items.filter((item) => item.type === "assistant_message").at(-1)?.text, 2026-10-23T11:12:18.2740822Z ·  ────── 2026-10-23T11:12:18.2740902Z 1999 │ "authoritative answer", 2026-10-23T11:12:18.2740956Z ╰──── 2026-10-23T11:12:18.2741125Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-23T11:12:18.2741128Z 2026-10-23T11:12:18.2741589Z ⚠ 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-23T11:12:18.2741758Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:3951:7] 2026-10-23T11:12:18.2741938Z 3950 │ const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped); 2026-10-23T11:12:18.2742150Z 3951 │ ╭─▶ while (!responseLifecycle.includes("failed")) { 2026-10-23T11:12:18.2742264Z 3952 │ │ yield* Effect.yieldNow; 2026-10-23T11:12:18.2742397Z 3953 │ ╰─▶ } 2026-10-23T11:12:18.2742522Z 3954 │ const responseExit = yield* Fiber.join(responseFiber); 2026-10-23T11:12:18.2742575Z ╰──── 2026-10-23T11:12:18.2742577Z 2026-10-23T11:12:18.2743033Z ⚠ 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-23T11:12:18.2743198Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6062:9] 2026-10-23T11:12:18.2743294Z 6061 │ .pipe(Effect.forkScoped); 2026-10-23T11:12:18.2743481Z 6062 │ ╭─▶ while (promptGates.length < 1) { 2026-10-23T11:12:18.2743594Z 6063 │ │ yield* Effect.yieldNow; 2026-10-23T11:12:18.2743733Z 6064 │ ╰─▶ } 2026-10-23T11:12:18.2743904Z 6065 │ assert.isDefined(sessionUpdateHandler, "session update handler must be wired"); 2026-10-23T11:12:18.2743958Z ╰──── 2026-10-23T11:12:18.2743960Z 2026-10-23T11:12:18.2744410Z ⚠ 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-23T11:12:18.2744581Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6197:9] 2026-10-23T11:12:18.2744668Z 6196 │ .pipe(Effect.forkScoped); 2026-10-23T11:12:18.2744850Z 6197 │ ╭─▶ while (promptGates.length < 2) { 2026-10-23T11:12:18.2744961Z 6198 │ │ yield* Effect.yieldNow; 2026-10-23T11:12:18.2745096Z 6199 │ ╰─▶ } 2026-10-23T11:12:18.2745257Z 6200 │ if (sessionUpdateHandler === undefined || capturedMutation.current === null) { 2026-10-23T11:12:18.2745313Z ╰──── 2026-10-23T11:12:18.2745315Z 2026-10-23T11:12:18.2745572Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T11:12:18.2745790Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10578:7] 2026-10-23T11:12:18.2745877Z 10577 │ 2026-10-23T11:12:18.2745953Z 10578 │ const layer: Layer.Layer< 2026-10-23T11:12:18.2746028Z ·  ──┬── 2026-10-23T11:12:18.2746158Z · ╰── 'layer' is declared here 2026-10-23T11:12:18.2746250Z 10579 │ ProviderAdapter.ProviderAdapterV2, 2026-10-23T11:12:18.2746305Z ╰──── 2026-10-23T11:12:18.2746410Z  help: Consider removing this declaration. 2026-10-23T11:12:18.2746412Z 2026-10-23T11:12:18.2746567Z ⚠ react(immutability): This value cannot be modified 2026-10-23T11:12:18.2746722Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-23T11:12:18.2746776Z  86 │ 2026-10-23T11:12:18.2746870Z  87 │ const cardCoverage = props.cardCoverage; 2026-10-23T11:12:18.2746958Z ·  ──────┬───── 2026-10-23T11:12:18.2747096Z · ╰── `cardCoverage` originates here 2026-10-23T11:12:18.2747177Z  88 │ const barHeightRef = useRef(0); 2026-10-23T11:12:18.2747258Z  89 │ const cardHeightRef = useRef(0); 2026-10-23T11:12:18.2747344Z  90 │ const cardHeight = useSharedValue(0); 2026-10-23T11:12:18.2747435Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-23T11:12:18.2747504Z  92 │ if (!cardCoverage) { 2026-10-23T11:12:18.2747566Z  93 │ return; 2026-10-23T11:12:18.2747635Z  94 │ } 2026-10-23T11:12:18.2747821Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-23T11:12:18.2747912Z  96 │ if (coverage === cardCoverage.value) { 2026-10-23T11:12:18.2747974Z  97 │ return; 2026-10-23T11:12:18.2748031Z  98 │ } 2026-10-23T11:12:18.2748114Z  99 │ if (cardCoverage.value === 0) { 2026-10-23T11:12:18.2748200Z 100 │ cardCoverage.value = coverage; 2026-10-23T11:12:18.2748281Z ·  ──────┬───── 2026-10-23T11:12:18.2748424Z · ╰── `cardCoverage` cannot be modified 2026-10-23T11:12:18.2748482Z 101 │ return; 2026-10-23T11:12:18.2748538Z ╰──── 2026-10-23T11:12:18.2748834Z  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-23T11:12:18.2749140Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T11:12:18.2749142Z 2026-10-23T11:12:18.2749345Z ⚠ react(immutability): This value cannot be modified 2026-10-23T11:12:18.2749538Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7] 2026-10-23T11:12:18.2749621Z  89 │ const cardHeightRef = useRef(0); 2026-10-23T11:12:18.2749706Z  90 │ const cardHeight = useSharedValue(0); 2026-10-23T11:12:18.2749781Z ·  ─────┬──── 2026-10-23T11:12:18.2749918Z · ╰── `cardHeight` originates here 2026-10-23T11:12:18.2750013Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-23T11:12:18.2750082Z  92 │ if (!cardCoverage) { 2026-10-23T11:12:18.2750141Z  93 │ return; 2026-10-23T11:12:18.2750196Z  94 │ } 2026-10-23T11:12:18.2750344Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-23T11:12:18.2750432Z  96 │ if (coverage === cardCoverage.value) { 2026-10-23T11:12:18.2750494Z  97 │ return; 2026-10-23T11:12:18.2750553Z  98 │ } 2026-10-23T11:12:18.2750635Z  99 │ if (cardCoverage.value === 0) { 2026-10-23T11:12:18.2750719Z 100 │ cardCoverage.value = coverage; 2026-10-23T11:12:18.2750776Z 101 │ return; 2026-10-23T11:12:18.2750831Z 102 │ } 2026-10-23T11:12:18.2750932Z 103 │ cardCoverage.value = withTiming(coverage, { 2026-10-23T11:12:18.2751030Z 104 │ duration: USER_INPUT_TOGGLE_DURATION_MS, 2026-10-23T11:12:18.2751113Z 105 │ easing: Easing.out(Easing.cubic), 2026-10-23T11:12:18.2751171Z 106 │ }); 2026-10-23T11:12:18.2751238Z 107 │ }, [cardCoverage]); 2026-10-23T11:12:18.2751320Z 108 │ const handleBarLayout = useCallback( 2026-10-23T11:12:18.2751401Z 109 │ (event: LayoutChangeEvent) => { 2026-10-23T11:12:18.2751529Z 110 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-23T11:12:18.2751603Z 111 │ notifyCoverage(); 2026-10-23T11:12:18.2751659Z 112 │ }, 2026-10-23T11:12:18.2751727Z 113 │ [notifyCoverage], 2026-10-23T11:12:18.2751783Z 114 │ ); 2026-10-23T11:12:18.2751869Z 115 │ const handleCardLayout = useCallback( 2026-10-23T11:12:18.2751947Z 116 │ (event: LayoutChangeEvent) => { 2026-10-23T11:12:18.2752075Z 117 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-23T11:12:18.2752190Z 118 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-23T11:12:18.2752269Z ·  ─────┬──── 2026-10-23T11:12:18.2752404Z · ╰── `cardHeight` cannot be modified 2026-10-23T11:12:18.2752473Z 119 │ notifyCoverage(); 2026-10-23T11:12:18.2752527Z ╰──── 2026-10-23T11:12:18.2752796Z  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-23T11:12:18.2753100Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T11:12:18.2753104Z 2026-10-23T11:12:18.2753300Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T11:12:18.2753455Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-23T11:12:18.2753547Z  90 │ const cardHeight = useSharedValue(0); 2026-10-23T11:12:18.2753645Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-23T11:12:18.2753750Z ·  ───┬─── 2026-10-23T11:12:18.2754040Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-23T11:12:18.2754145Z  92 │ if (!cardCoverage) { 2026-10-23T11:12:18.2754206Z  93 │ return; 2026-10-23T11:12:18.2754258Z  94 │ } 2026-10-23T11:12:18.2754407Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-23T11:12:18.2754495Z  96 │ if (coverage === cardCoverage.value) { 2026-10-23T11:12:18.2754554Z  97 │ return; 2026-10-23T11:12:18.2754606Z  98 │ } 2026-10-23T11:12:18.2754687Z  99 │ if (cardCoverage.value === 0) { 2026-10-23T11:12:18.2754769Z 100 │ cardCoverage.value = coverage; 2026-10-23T11:12:18.2754847Z ·  ──────┬───── 2026-10-23T11:12:18.2754986Z · ╰── This modifies `cardCoverage` 2026-10-23T11:12:18.2755048Z 101 │ return; 2026-10-23T11:12:18.2755101Z ╰──── 2026-10-23T11:12:18.2755444Z  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-23T11:12:18.2755804Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T11:12:18.2755806Z 2026-10-23T11:12:18.2756005Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T11:12:18.2756160Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-23T11:12:18.2756242Z  99 │ if (cardCoverage.value === 0) { 2026-10-23T11:12:18.2756323Z 100 │ cardCoverage.value = coverage; 2026-10-23T11:12:18.2756401Z ·  ──────┬───── 2026-10-23T11:12:18.2756541Z · ╰── This modifies `cardCoverage` 2026-10-23T11:12:18.2756604Z 101 │ return; 2026-10-23T11:12:18.2756657Z 102 │ } 2026-10-23T11:12:18.2756759Z 103 │ cardCoverage.value = withTiming(coverage, { 2026-10-23T11:12:18.2756858Z 104 │ duration: USER_INPUT_TOGGLE_DURATION_MS, 2026-10-23T11:12:18.2756945Z 105 │ easing: Easing.out(Easing.cubic), 2026-10-23T11:12:18.2756999Z 106 │ }); 2026-10-23T11:12:18.2757068Z 107 │ }, [cardCoverage]); 2026-10-23T11:12:18.2757153Z 108 │ const handleBarLayout = useCallback( 2026-10-23T11:12:18.2757235Z 109 │ (event: LayoutChangeEvent) => { 2026-10-23T11:12:18.2757340Z ·  ───────────────┬─────────────── 2026-10-23T11:12:18.2757564Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-23T11:12:18.2757746Z 110 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-23T11:12:18.2757808Z ╰──── 2026-10-23T11:12:18.2758143Z  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-23T11:12:18.2758449Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T11:12:18.2758452Z 2026-10-23T11:12:18.2758649Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T11:12:18.2758806Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7] 2026-10-23T11:12:18.2758890Z 115 │ const handleCardLayout = useCallback( 2026-10-23T11:12:18.2759041Z 116 │ (event: LayoutChangeEvent) => { 2026-10-23T11:12:18.2759188Z ·  ───────────────┬─────────────── 2026-10-23T11:12:18.2759404Z · ╰── This function may (indirectly) reassign or modify `cardHeight` after render 2026-10-23T11:12:18.2759530Z 117 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-23T11:12:18.2759644Z 118 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-23T11:12:18.2759722Z ·  ─────┬──── 2026-10-23T11:12:18.2759854Z · ╰── This modifies `cardHeight` 2026-10-23T11:12:18.2759924Z 119 │ notifyCoverage(); 2026-10-23T11:12:18.2759974Z ╰──── 2026-10-23T11:12:18.2760309Z  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-23T11:12:18.2760615Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T11:12:18.2760617Z 2026-10-23T11:12:18.2760819Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-23T11:12:18.2760954Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:229:6] 2026-10-23T11:12:18.2761118Z 225 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-23T11:12:18.2761208Z 226 │ nativeEventSnapshotsRef.current, 2026-10-23T11:12:18.2761302Z ·  ───────────┬─────────── 2026-10-23T11:12:18.2761761Z · ╰── 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-23T11:12:18.2761840Z 227 │ mostRecentEventCount, 2026-10-23T11:12:18.2761898Z 228 │ ); 2026-10-23T11:12:18.2762022Z 229 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-23T11:12:18.2762156Z ·  ──────────────────────────┬────────────────────────── 2026-10-23T11:12:18.2762356Z · ╰── This dependency list is missing values used by the callback 2026-10-23T11:12:18.2762440Z 230 │ const assumedValue = props.value; 2026-10-23T11:12:18.2762494Z ╰──── 2026-10-23T11:12:18.2762663Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-23T11:12:18.2762975Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2762981Z 2026-10-23T11:12:18.2763195Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T11:12:18.2763332Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:237:7] 2026-10-23T11:12:18.2763476Z 236 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-23T11:12:18.2763563Z 237 │ nativeEventSnapshotsRef.current, 2026-10-23T11:12:18.2763656Z ·  ───────────┬─────────── 2026-10-23T11:12:18.2764104Z · ╰── 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-23T11:12:18.2764228Z 238 │ controlledEventCount, 2026-10-23T11:12:18.2764323Z 239 │ assumedValue, 2026-10-23T11:12:18.2764378Z 240 │ ); 2026-10-23T11:12:18.2764537Z 241 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-23T11:12:18.2764678Z ·  ───────────┬────────── 2026-10-23T11:12:18.2764886Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-23T11:12:18.2764974Z 242 │ const acceptNativeEvent = useCallback( 2026-10-23T11:12:18.2765028Z ╰──── 2026-10-23T11:12:18.2765450Z  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-23T11:12:18.2765765Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2765768Z 2026-10-23T11:12:18.2765909Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2766045Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:162:29] 2026-10-23T11:12:18.2766171Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T11:12:18.2766285Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T11:12:18.2766402Z ·  ─────────────┬──────────── 2026-10-23T11:12:18.2766574Z · ╰── Cannot access ref value during render 2026-10-23T11:12:18.2766637Z 163 │ }); 2026-10-23T11:12:18.2766695Z ╰──── 2026-10-23T11:12:18.2767154Z  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-23T11:12:18.2767439Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2767442Z 2026-10-23T11:12:18.2767587Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2767744Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:162:29] 2026-10-23T11:12:18.2767867Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T11:12:18.2767981Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T11:12:18.2768102Z ·  ─────────────┬──────────── 2026-10-23T11:12:18.2768308Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T11:12:18.2768366Z 163 │ }); 2026-10-23T11:12:18.2768415Z ╰──── 2026-10-23T11:12:18.2768870Z  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-23T11:12:18.2769158Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2769160Z 2026-10-23T11:12:18.2769360Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2769529Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:23] 2026-10-23T11:12:18.2769583Z 163 │ }); 2026-10-23T11:12:18.2769678Z 164 │ confirmedTokensRef.current = tokens; 2026-10-23T11:12:18.2769805Z ·  ─────────┬────────────┬─── 2026-10-23T11:12:18.2769994Z · │ ╰── Cannot update ref value during render 2026-10-23T11:12:18.2770110Z · ╰── This value is a ref 2026-10-23T11:12:18.2770185Z 165 │ return JSON.stringify( 2026-10-23T11:12:18.2770238Z ╰──── 2026-10-23T11:12:18.2770710Z  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-23T11:12:18.2771000Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2771002Z 2026-10-23T11:12:18.2771142Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2771277Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:206:5] 2026-10-23T11:12:18.2771348Z 205 │ mostRecentEventCount, 2026-10-23T11:12:18.2771437Z 206 │ nativeEventSnapshotsRef.current, 2026-10-23T11:12:18.2771539Z ·  ───────────────┬─────────────── 2026-10-23T11:12:18.2771726Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T11:12:18.2771787Z 207 │ ); 2026-10-23T11:12:18.2771843Z ╰──── 2026-10-23T11:12:18.2772298Z  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-23T11:12:18.2772585Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2772588Z 2026-10-23T11:12:18.2772732Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2772868Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:212:5] 2026-10-23T11:12:18.2772941Z 211 │ mostRecentEventCount, 2026-10-23T11:12:18.2773075Z 212 │ nativeEventSnapshotsRef.current, 2026-10-23T11:12:18.2773214Z ·  ───────────────┬─────────────── 2026-10-23T11:12:18.2773400Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T11:12:18.2773458Z 213 │ ); 2026-10-23T11:12:18.2773508Z ╰──── 2026-10-23T11:12:18.2773968Z  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-23T11:12:18.2774256Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2774258Z 2026-10-23T11:12:18.2774451Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-23T11:12:18.2774586Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:197:6] 2026-10-23T11:12:18.2774710Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T11:12:18.2774823Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T11:12:18.2774933Z ·  ─────────┬──────── 2026-10-23T11:12:18.2775390Z · ╰── 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-23T11:12:18.2775446Z 163 │ }); 2026-10-23T11:12:18.2775539Z 164 │ confirmedTokensRef.current = tokens; 2026-10-23T11:12:18.2775612Z 165 │ return JSON.stringify( 2026-10-23T11:12:18.2775781Z 166 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-23T11:12:18.2775852Z 167 │ const record = 2026-10-23T11:12:18.2775933Z 168 │ token.type === "context" 2026-10-23T11:12:18.2776098Z 169 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-23T11:12:18.2776167Z 170 │ : undefined; 2026-10-23T11:12:18.2776275Z 171 │ const presentation = contextChipPresentation( 2026-10-23T11:12:18.2776387Z 172 │ token.type === "context" ? token.kind : token.type, 2026-10-23T11:12:18.2776451Z 173 │ record, 2026-10-23T11:12:18.2776514Z 174 │ ); 2026-10-23T11:12:18.2776598Z 175 │ const icon = contextChipIcon( 2026-10-23T11:12:18.2776667Z 176 │ presentation, 2026-10-23T11:12:18.2776815Z 177 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-23T11:12:18.2776878Z 178 │ ); 2026-10-23T11:12:18.2776939Z 179 │ return { 2026-10-23T11:12:18.2777010Z 180 │ type: token.type, 2026-10-23T11:12:18.2777087Z 181 │ source: token.source, 2026-10-23T11:12:18.2777156Z 182 │ start: token.start, 2026-10-23T11:12:18.2777224Z 183 │ end: token.end, 2026-10-23T11:12:18.2777309Z 184 │ accent: presentation.accent, 2026-10-23T11:12:18.2777374Z 185 │ label: 2026-10-23T11:12:18.2777450Z 186 │ token.type === "skill" 2026-10-23T11:12:18.2777559Z 187 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-23T11:12:18.2777656Z 188 │ : token.type === "context" 2026-10-23T11:12:18.2777967Z 189 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-23T11:12:18.2778082Z 190 │ : basename(token.value), 2026-10-23T11:12:18.2778228Z 191 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-23T11:12:18.2778322Z 192 │ iconUri: contextChipIconUri(icon), 2026-10-23T11:12:18.2778413Z 193 │ tintsIcon: icon.kind === "chip", 2026-10-23T11:12:18.2778469Z 194 │ }; 2026-10-23T11:12:18.2778528Z 195 │ }), 2026-10-23T11:12:18.2778586Z 196 │ ); 2026-10-23T11:12:18.2778686Z 197 │ }, [props.value, props.context, skillLabels]); 2026-10-23T11:12:18.2778804Z ·  ────────────────────┬──────────────────── 2026-10-23T11:12:18.2779004Z · ╰── This dependency list is missing values used by the callback 2026-10-23T11:12:18.2779152Z 198 │ // Every render resolves against the snapshot history, so a render whose 2026-10-23T11:12:18.2779211Z ╰──── 2026-10-23T11:12:18.2779413Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-23T11:12:18.2779724Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2779726Z 2026-10-23T11:12:18.2779913Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-23T11:12:18.2780049Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:259:5] 2026-10-23T11:12:18.2780180Z 251 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-23T11:12:18.2780280Z 252 │ nativeEventSnapshotsRef.current.push({ 2026-10-23T11:12:18.2780373Z ·  ───────────┬─────────── 2026-10-23T11:12:18.2780828Z · ╰── 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-23T11:12:18.2780925Z 253 │ eventCount: acknowledgedEventCount, 2026-10-23T11:12:18.2780985Z 254 │ value, 2026-10-23T11:12:18.2781066Z 255 │ selection: nextSelection, 2026-10-23T11:12:18.2781126Z 256 │ }); 2026-10-23T11:12:18.2781211Z 257 │ return acknowledgedEventCount; 2026-10-23T11:12:18.2781272Z 258 │ }, 2026-10-23T11:12:18.2781328Z 259 │ [], 2026-10-23T11:12:18.2781398Z ·  ─┬ 2026-10-23T11:12:18.2781580Z · ╰── This dependency list is missing values used by the callback 2026-10-23T11:12:18.2781639Z 260 │ ); 2026-10-23T11:12:18.2781695Z ╰──── 2026-10-23T11:12:18.2781895Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-23T11:12:18.2782202Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2782205Z 2026-10-23T11:12:18.2782457Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T11:12:18.2782617Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-23T11:12:18.2782681Z 259 │ .join("|"); 2026-10-23T11:12:18.2782745Z 260 │ useEffect(() => { 2026-10-23T11:12:18.2782815Z ·  ────┬──── 2026-10-23T11:12:18.2782997Z · ╰── This is the containing effect 2026-10-23T11:12:18.2783095Z 261 │ stop(); 2026-10-23T11:12:18.2783166Z ·  ──┬─ 2026-10-23T11:12:18.2783328Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2783396Z 262 │ }, [orderVersion]); 2026-10-23T11:12:18.2783449Z ╰──── 2026-10-23T11:12:18.2784049Z  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-23T11:12:18.2784373Z  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-23T11:12:18.2784378Z 2026-10-23T11:12:18.2784588Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T11:12:18.2784747Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-23T11:12:18.2784814Z 260 │ useEffect(() => { 2026-10-23T11:12:18.2784873Z 261 │ stop(); 2026-10-23T11:12:18.2784938Z ·  ──┬─ 2026-10-23T11:12:18.2785065Z · ╰── Missing dependency `stop` 2026-10-23T11:12:18.2785131Z 262 │ }, [orderVersion]); 2026-10-23T11:12:18.2785211Z ·  ──────┬───── 2026-10-23T11:12:18.2785355Z · ╰── Unnecessary dependency `orderVersion` 2026-10-23T11:12:18.2785416Z 263 │ useEffect( 2026-10-23T11:12:18.2785467Z ╰──── 2026-10-23T11:12:18.2785886Z  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-23T11:12:18.2786192Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2786197Z 2026-10-23T11:12:18.2786340Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2786500Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9] 2026-10-23T11:12:18.2786580Z 95 │ const latest = useRef(props); 2026-10-23T11:12:18.2786650Z 96 │ latest.current = props; 2026-10-23T11:12:18.2786758Z ·  ───┬──────┬─── 2026-10-23T11:12:18.2786943Z · │ ╰── Cannot update ref value during render 2026-10-23T11:12:18.2787060Z · ╰── This value is a ref 2026-10-23T11:12:18.2787129Z 97 │ const gesture = useMemo( 2026-10-23T11:12:18.2787179Z ╰──── 2026-10-23T11:12:18.2787650Z  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-23T11:12:18.2787964Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2787967Z 2026-10-23T11:12:18.2788164Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2788358Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18] 2026-10-23T11:12:18.2788424Z 103 │ .runOnJS(true) 2026-10-23T11:12:18.2788523Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-23T11:12:18.2788641Z ·  ───────────────┬────────────── 2026-10-23T11:12:18.2788837Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T11:12:18.2788971Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-23T11:12:18.2789024Z ╰──── 2026-10-23T11:12:18.2789483Z  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-23T11:12:18.2789773Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2789775Z 2026-10-23T11:12:18.2789917Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2790076Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19] 2026-10-23T11:12:18.2790172Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-23T11:12:18.2790306Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-23T11:12:18.2790448Z ·  ──────────────────────────┬───────────────────────── 2026-10-23T11:12:18.2790663Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T11:12:18.2790795Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-23T11:12:18.2790848Z ╰──── 2026-10-23T11:12:18.2791303Z  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-23T11:12:18.2791586Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2791588Z 2026-10-23T11:12:18.2791729Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2791886Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16] 2026-10-23T11:12:18.2792068Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-23T11:12:18.2792294Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-23T11:12:18.2792439Z ·  ──────────────────────────┬───────────────────────── 2026-10-23T11:12:18.2792644Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T11:12:18.2792768Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-23T11:12:18.2792821Z ╰──── 2026-10-23T11:12:18.2793273Z  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-23T11:12:18.2793567Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2793573Z 2026-10-23T11:12:18.2793716Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2793872Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21] 2026-10-23T11:12:18.2793994Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-23T11:12:18.2794120Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-23T11:12:18.2794259Z ·  ───────────────────────┬────────────────────── 2026-10-23T11:12:18.2794466Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T11:12:18.2794542Z 108 │ [props.disabled], 2026-10-23T11:12:18.2794595Z ╰──── 2026-10-23T11:12:18.2795052Z  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-23T11:12:18.2795336Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2795338Z 2026-10-23T11:12:18.2795488Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2795689Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:249:9] 2026-10-23T11:12:18.2795804Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-23T11:12:18.2795915Z 249 │ latest.current = { rows, planners, moveThread }; 2026-10-23T11:12:18.2796024Z ·  ───┬──────┬─── 2026-10-23T11:12:18.2796205Z · │ ╰── Cannot update ref value during render 2026-10-23T11:12:18.2796318Z · ╰── This value is a ref 2026-10-23T11:12:18.2796373Z 250 │ 2026-10-23T11:12:18.2796426Z ╰──── 2026-10-23T11:12:18.2796885Z  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-23T11:12:18.2797167Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2797231Z 2026-10-23T11:12:18.2797411Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2797569Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:247:22] 2026-10-23T11:12:18.2797702Z 246 │ const [preview, setPreview] = useState(null); 2026-10-23T11:12:18.2797816Z 247 │ const translateY = useRef(new Animated.Value(0)).current; 2026-10-23T11:12:18.2797941Z ·  ──────────────────┬────────────────── 2026-10-23T11:12:18.2798109Z · ╰── Cannot access ref value during render 2026-10-23T11:12:18.2798219Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-23T11:12:18.2798271Z ╰──── 2026-10-23T11:12:18.2798729Z  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-23T11:12:18.2799020Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2799022Z 2026-10-23T11:12:18.2799188Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T11:12:18.2799345Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:324:16] 2026-10-23T11:12:18.2799407Z 323 │ update(0); 2026-10-23T11:12:18.2799490Z 324 │ let last = performance.now(); 2026-10-23T11:12:18.2799587Z ·  ────────┬──────── 2026-10-23T11:12:18.2799733Z · ╰── Cannot call impure function 2026-10-23T11:12:18.2799802Z 325 │ const tick = () => { 2026-10-23T11:12:18.2799855Z ╰──── 2026-10-23T11:12:18.2800152Z  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-23T11:12:18.2800441Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T11:12:18.2800444Z 2026-10-23T11:12:18.2800629Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-23T11:12:18.2800785Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15] 2026-10-23T11:12:18.2800846Z  98 │ () => 2026-10-23T11:12:18.2800913Z  99 │ Gesture.Pan() 2026-10-23T11:12:18.2800993Z ·  ─┬─ 2026-10-23T11:12:18.2801124Z · ╰── `Pan` may be a component 2026-10-23T11:12:18.2801203Z 100 │ .enabled(!props.disabled) 2026-10-23T11:12:18.2801255Z ╰──── 2026-10-23T11:12:18.2801528Z  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-23T11:12:18.2801964Z  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-23T11:12:18.2801967Z 2026-10-23T11:12:18.2802151Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-23T11:12:18.2802360Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5] 2026-10-23T11:12:18.2802468Z 103 │ .runOnJS(true) 2026-10-23T11:12:18.2802565Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-23T11:12:18.2802659Z ·  ───┬── 2026-10-23T11:12:18.2803086Z · ╰── 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-23T11:12:18.2803217Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-23T11:12:18.2803341Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-23T11:12:18.2803460Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-23T11:12:18.2803530Z 108 │ [props.disabled], 2026-10-23T11:12:18.2803618Z ·  ────────┬─────── 2026-10-23T11:12:18.2803806Z · ╰── This dependency list is missing values used by the callback 2026-10-23T11:12:18.2803860Z 109 │ ); 2026-10-23T11:12:18.2803912Z ╰──── 2026-10-23T11:12:18.2804114Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-23T11:12:18.2804420Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2804423Z 2026-10-23T11:12:18.2804751Z ⚠ eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'. 2026-10-23T11:12:18.2804921Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1444:7] 2026-10-23T11:12:18.2804979Z 1443 │ 2026-10-23T11:12:18.2805095Z 1444 │ const layerCodexAppServerClientFactoryCommand = ( 2026-10-23T11:12:18.2805212Z ·  ───────────────────┬─────────────────── 2026-10-23T11:12:18.2805415Z · ╰── 'layerCodexAppServerClientFactoryCommand' is declared here 2026-10-23T11:12:18.2805536Z 1445 │ options: CodexClient.CodexAppServerClientOptions & { 2026-10-23T11:12:18.2805589Z ╰──── 2026-10-23T11:12:18.2805693Z  help: Consider removing this declaration. 2026-10-23T11:12:18.2805696Z 2026-10-23T11:12:18.2805947Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T11:12:18.2806114Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1680:7] 2026-10-23T11:12:18.2806171Z 1679 │ 2026-10-23T11:12:18.2806243Z 1680 │ const layer: Layer.Layer< 2026-10-23T11:12:18.2806313Z ·  ──┬── 2026-10-23T11:12:18.2806445Z · ╰── 'layer' is declared here 2026-10-23T11:12:18.2806540Z 1681 │ ProviderAdapter.ProviderAdapterV2, 2026-10-23T11:12:18.2806593Z ╰──── 2026-10-23T11:12:18.2806693Z  help: Consider removing this declaration. 2026-10-23T11:12:18.2806696Z 2026-10-23T11:12:18.2806987Z ⚠ eslint(no-unused-vars): Variable 'layerFromProviderAdapter' is declared but never used. Unused variables should start with a '_'. 2026-10-23T11:12:18.2807146Z ╭─[apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts:346:7] 2026-10-23T11:12:18.2807201Z 345 │ 2026-10-23T11:12:18.2807350Z 346 │ const layerFromProviderAdapter: Layer.Layer< 2026-10-23T11:12:18.2807479Z ·  ────────────┬─────────── 2026-10-23T11:12:18.2807660Z · ╰── 'layerFromProviderAdapter' is declared here 2026-10-23T11:12:18.2807738Z 347 │ ProviderAdapterRegistryV2, 2026-10-23T11:12:18.2807800Z ╰──── 2026-10-23T11:12:18.2807902Z  help: Consider removing this declaration. 2026-10-23T11:12:18.2807904Z 2026-10-23T11:12:18.2808159Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T11:12:18.2808311Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:512:5] 2026-10-23T11:12:18.2808369Z 510 │ }, []); 2026-10-23T11:12:18.2808436Z 511 │ useEffect(() => { 2026-10-23T11:12:18.2808509Z ·  ────┬──── 2026-10-23T11:12:18.2808647Z · ╰── This is the containing effect 2026-10-23T11:12:18.2808734Z 512 │ setKeyboardStateSuspect(false); 2026-10-23T11:12:18.2808826Z ·  ───────────┬─────────── 2026-10-23T11:12:18.2808995Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2809096Z 513 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-23T11:12:18.2809146Z ╰──── 2026-10-23T11:12:18.2809747Z  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-23T11:12:18.2810071Z  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-23T11:12:18.2810076Z 2026-10-23T11:12:18.2810329Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T11:12:18.2810479Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:872:7] 2026-10-23T11:12:18.2810631Z 869 │ const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0); 2026-10-23T11:12:18.2810697Z 870 │ useEffect(() => { 2026-10-23T11:12:18.2810770Z ·  ────┬──── 2026-10-23T11:12:18.2810898Z · ╰── This is the containing effect 2026-10-23T11:12:18.2811053Z 871 │ if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) { 2026-10-23T11:12:18.2811172Z 872 │ setLastKnownKeyboardHeight(liveKeyboardHeight); 2026-10-23T11:12:18.2811272Z ·  ─────────────┬──────────── 2026-10-23T11:12:18.2811447Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2811501Z 873 │ } 2026-10-23T11:12:18.2811553Z ╰──── 2026-10-23T11:12:18.2812142Z  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-23T11:12:18.2812460Z  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-23T11:12:18.2812516Z 2026-10-23T11:12:18.2812799Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T11:12:18.2812951Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1119:5] 2026-10-23T11:12:18.2813006Z 1117 │ 2026-10-23T11:12:18.2813073Z 1118 │ useEffect(() => { 2026-10-23T11:12:18.2813146Z ·  ────┬──── 2026-10-23T11:12:18.2813273Z · ╰── This is the containing effect 2026-10-23T11:12:18.2813352Z 1119 │ setAnchorMessageId(null); 2026-10-23T11:12:18.2813439Z ·  ─────────┬──────── 2026-10-23T11:12:18.2813609Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2813690Z 1120 │ setSubmittedMessageId(null); 2026-10-23T11:12:18.2813752Z ╰──── 2026-10-23T11:12:18.2814339Z  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-23T11:12:18.2814655Z  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-23T11:12:18.2814658Z 2026-10-23T11:12:18.2814854Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T11:12:18.2815001Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:513:7] 2026-10-23T11:12:18.2815088Z 512 │ setKeyboardStateSuspect(false); 2026-10-23T11:12:18.2815189Z 513 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-23T11:12:18.2815333Z ·  ────────┬──────── ─────────┬──────── 2026-10-23T11:12:18.2815537Z · │ ╰── Unnecessary dependency `liveKeyboardHeight` 2026-10-23T11:12:18.2815695Z · ╰── Unnecessary dependency `isKeyboardVisible` 2026-10-23T11:12:18.2815822Z 514 │ const handleOwnedInputFocusChange = (focused: boolean) => { 2026-10-23T11:12:18.2815875Z ╰──── 2026-10-23T11:12:18.2816162Z  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-23T11:12:18.2816522Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2816558Z 2026-10-23T11:12:18.2816757Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T11:12:18.2816912Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1067:7] 2026-10-23T11:12:18.2817000Z 1066 │ userInputInsetProgress.set(1); 2026-10-23T11:12:18.2817159Z 1067 │ }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]); 2026-10-23T11:12:18.2817255Z ·  ────────────┬─────────── 2026-10-23T11:12:18.2817435Z · ╰── Unnecessary dependency `activeUserInputRequestId` 2026-10-23T11:12:18.2817543Z 1068 │ const showContent = props.showContent ?? true; 2026-10-23T11:12:18.2817594Z ╰──── 2026-10-23T11:12:18.2817926Z  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-23T11:12:18.2818236Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2818238Z 2026-10-23T11:12:18.2818436Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T11:12:18.2818592Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1125:15] 2026-10-23T11:12:18.2818660Z 1124 │ freeze.set(false); 2026-10-23T11:12:18.2818745Z 1125 │ }, [freeze, selectedThreadKey]); 2026-10-23T11:12:18.2818840Z ·  ────────┬──────── 2026-10-23T11:12:18.2819007Z · ╰── Unnecessary dependency `selectedThreadKey` 2026-10-23T11:12:18.2819063Z 1126 │ 2026-10-23T11:12:18.2819119Z ╰──── 2026-10-23T11:12:18.2819406Z  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-23T11:12:18.2819713Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2819715Z 2026-10-23T11:12:18.2819869Z ⚠ react(immutability): This value cannot be modified 2026-10-23T11:12:18.2820022Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:955:5] 2026-10-23T11:12:18.2820133Z 950 │ const composerPopoverHeight = useSharedValue(0); 2026-10-23T11:12:18.2820243Z 951 │ const floatingControlCoverage = useSharedValue( 2026-10-23T11:12:18.2820339Z ·  ───────────┬─────────── 2026-10-23T11:12:18.2820501Z · ╰── `floatingControlCoverage` originates here 2026-10-23T11:12:18.2820629Z 952 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-23T11:12:18.2820685Z 953 │ ); 2026-10-23T11:12:18.2820749Z 954 │ useEffect(() => { 2026-10-23T11:12:18.2820853Z 955 │ floatingControlCoverage.value = withTiming( 2026-10-23T11:12:18.2820947Z ·  ───────────┬─────────── 2026-10-23T11:12:18.2821107Z · ╰── `floatingControlCoverage` cannot be modified 2026-10-23T11:12:18.2821232Z 956 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-23T11:12:18.2821286Z ╰──── 2026-10-23T11:12:18.2821603Z  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-23T11:12:18.2821944Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T11:12:18.2821946Z 2026-10-23T11:12:18.2822101Z ⚠ react(immutability): This value cannot be modified 2026-10-23T11:12:18.2822250Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:973:7] 2026-10-23T11:12:18.2822435Z 963 │ const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null; 2026-10-23T11:12:18.2822560Z 964 │ const combinedContentInsetEndAdjustment = useSharedValue( 2026-10-23T11:12:18.2822670Z ·  ────────────────┬──────────────── 2026-10-23T11:12:18.2822855Z · ╰── `combinedContentInsetEndAdjustment` originates here 2026-10-23T11:12:18.2822988Z 965 │ Math.max(0, estimatedOverlayHeight - nativeInsetOvercount), 2026-10-23T11:12:18.2823044Z 966 │ ); 2026-10-23T11:12:18.2823118Z 967 │ useAnimatedReaction( 2026-10-23T11:12:18.2825670Z 968 │ () => 2026-10-23T11:12:18.2825775Z 969 │ contentInsetEndAdjustment.value + 2026-10-23T11:12:18.2825867Z 970 │ floatingControlCoverage.value + 2026-10-23T11:12:18.2826062Z 971 │ (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0), 2026-10-23T11:12:18.2826124Z 972 │ (value) => { 2026-10-23T11:12:18.2826235Z 973 │ combinedContentInsetEndAdjustment.value = value; 2026-10-23T11:12:18.2826346Z ·  ────────────────┬──────────────── 2026-10-23T11:12:18.2826547Z · ╰── `combinedContentInsetEndAdjustment` cannot be modified 2026-10-23T11:12:18.2826608Z 974 │ }, 2026-10-23T11:12:18.2826657Z ╰──── 2026-10-23T11:12:18.2826921Z  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-23T11:12:18.2827223Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T11:12:18.2827226Z 2026-10-23T11:12:18.2827480Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T11:12:18.2827673Z ╭─[apps/server/src/orchestration-v2/ThreadPullRequestService.ts:408:7] 2026-10-23T11:12:18.2827726Z 407 │ 2026-10-23T11:12:18.2827863Z 408 │ const layer = Layer.effect(ThreadPullRequestServiceV2, make); 2026-10-23T11:12:18.2827937Z ·  ──┬── 2026-10-23T11:12:18.2828062Z · ╰── 'layer' is declared here 2026-10-23T11:12:18.2828112Z ╰──── 2026-10-23T11:12:18.2828216Z  help: Consider removing this declaration. 2026-10-23T11:12:18.2828218Z 2026-10-23T11:12:18.2828473Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T11:12:18.2828624Z ╭─[apps/mobile/src/features/threads/use-worktree-setup.ts:30:40] 2026-10-23T11:12:18.2828782Z 28 │ const snapshot = resolveWorktreeSetupSnapshot(input.threadId, query.data, live); 2026-10-23T11:12:18.2828851Z 29 │ useEffect(() => { 2026-10-23T11:12:18.2828923Z ·  ────┬──── 2026-10-23T11:12:18.2829117Z · ╰── This is the containing effect 2026-10-23T11:12:18.2829270Z 30 │ if (snapshot && snapshot !== live) setHeld({ key, snapshot }); 2026-10-23T11:12:18.2829377Z ·  ───┬─── 2026-10-23T11:12:18.2829568Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2829640Z 31 │ }, [key, live, snapshot]); 2026-10-23T11:12:18.2829690Z ╰──── 2026-10-23T11:12:18.2830282Z  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-23T11:12:18.2830611Z  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-23T11:12:18.2830616Z 2026-10-23T11:12:18.2830895Z ⚠ eslint(no-unused-vars): Variable 'layerUnavailable' is declared but never used. Unused variables should start with a '_'. 2026-10-23T11:12:18.2831041Z ╭─[apps/server/src/orchestration-v2/Orchestrator.ts:12322:7] 2026-10-23T11:12:18.2831095Z 12321 │ 2026-10-23T11:12:18.2831237Z 12322 │ const layerUnavailable: Layer.Layer = Layer.succeed( 2026-10-23T11:12:18.2831324Z ·  ────────┬─────── 2026-10-23T11:12:18.2831475Z · ╰── 'layerUnavailable' is declared here 2026-10-23T11:12:18.2831542Z 12323 │ OrchestratorV2, 2026-10-23T11:12:18.2831598Z ╰──── 2026-10-23T11:12:18.2831708Z  help: Consider removing this declaration. 2026-10-23T11:12:18.2831714Z 2026-10-23T11:12:18.2831906Z ⚠ eslint(no-unused-vars): Identifier 'Image' is imported but never used. 2026-10-23T11:12:18.2832045Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:17:10] 2026-10-23T11:12:18.2832180Z 16 │ import type { NativeSyntheticEvent, ViewProps } from "react-native"; 2026-10-23T11:12:18.2832297Z 17 │ import { Image, Platform, StyleSheet } from "react-native"; 2026-10-23T11:12:18.2832371Z ·  ──┬── 2026-10-23T11:12:18.2832496Z · ╰── 'Image' is imported here 2026-10-23T11:12:18.2832551Z 18 │ 2026-10-23T11:12:18.2832604Z ╰──── 2026-10-23T11:12:18.2832703Z  help: Consider removing this import. 2026-10-23T11:12:18.2832705Z 2026-10-23T11:12:18.2832912Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-23T11:12:18.2833058Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:227:6] 2026-10-23T11:12:18.2833222Z 223 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-23T11:12:18.2833315Z 224 │ nativeEventSnapshotsRef.current, 2026-10-23T11:12:18.2833409Z ·  ───────────┬─────────── 2026-10-23T11:12:18.2833867Z · ╰── 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-23T11:12:18.2833943Z 225 │ mostRecentEventCount, 2026-10-23T11:12:18.2834002Z 226 │ ); 2026-10-23T11:12:18.2834180Z 227 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-23T11:12:18.2834347Z ·  ──────────────────────────┬────────────────────────── 2026-10-23T11:12:18.2834550Z · ╰── This dependency list is missing values used by the callback 2026-10-23T11:12:18.2834636Z 228 │ const assumedValue = props.value; 2026-10-23T11:12:18.2834690Z ╰──── 2026-10-23T11:12:18.2834855Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-23T11:12:18.2835167Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2835169Z 2026-10-23T11:12:18.2835382Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T11:12:18.2835541Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:235:7] 2026-10-23T11:12:18.2835744Z 234 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-23T11:12:18.2835831Z 235 │ nativeEventSnapshotsRef.current, 2026-10-23T11:12:18.2835923Z ·  ───────────┬─────────── 2026-10-23T11:12:18.2836372Z · ╰── 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-23T11:12:18.2836445Z 236 │ controlledEventCount, 2026-10-23T11:12:18.2836509Z 237 │ assumedValue, 2026-10-23T11:12:18.2836565Z 238 │ ); 2026-10-23T11:12:18.2836722Z 239 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-23T11:12:18.2836865Z ·  ───────────┬────────── 2026-10-23T11:12:18.2837072Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-23T11:12:18.2837165Z 240 │ const acceptNativeEvent = useCallback( 2026-10-23T11:12:18.2837219Z ╰──── 2026-10-23T11:12:18.2837654Z  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-23T11:12:18.2837970Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2837975Z 2026-10-23T11:12:18.2838188Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2838376Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:160:29] 2026-10-23T11:12:18.2838501Z 159 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T11:12:18.2838614Z 160 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T11:12:18.2838731Z ·  ─────────────┬──────────── 2026-10-23T11:12:18.2838900Z · ╰── Cannot access ref value during render 2026-10-23T11:12:18.2838959Z 161 │ }); 2026-10-23T11:12:18.2839013Z ╰──── 2026-10-23T11:12:18.2839479Z  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-23T11:12:18.2839772Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2839775Z 2026-10-23T11:12:18.2839918Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2840064Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:160:29] 2026-10-23T11:12:18.2840186Z 159 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T11:12:18.2840295Z 160 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T11:12:18.2840414Z ·  ─────────────┬──────────── 2026-10-23T11:12:18.2840627Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T11:12:18.2840689Z 161 │ }); 2026-10-23T11:12:18.2840740Z ╰──── 2026-10-23T11:12:18.2841202Z  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-23T11:12:18.2841490Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2841492Z 2026-10-23T11:12:18.2841636Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2841778Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:23] 2026-10-23T11:12:18.2841834Z 161 │ }); 2026-10-23T11:12:18.2841930Z 162 │ confirmedTokensRef.current = tokens; 2026-10-23T11:12:18.2842058Z ·  ─────────┬────────────┬─── 2026-10-23T11:12:18.2842245Z · │ ╰── Cannot update ref value during render 2026-10-23T11:12:18.2842361Z · ╰── This value is a ref 2026-10-23T11:12:18.2842434Z 163 │ return JSON.stringify( 2026-10-23T11:12:18.2842486Z ╰──── 2026-10-23T11:12:18.2842944Z  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-23T11:12:18.2843285Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2843321Z 2026-10-23T11:12:18.2843464Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2843607Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:204:5] 2026-10-23T11:12:18.2843681Z 203 │ mostRecentEventCount, 2026-10-23T11:12:18.2843768Z 204 │ nativeEventSnapshotsRef.current, 2026-10-23T11:12:18.2843875Z ·  ───────────────┬─────────────── 2026-10-23T11:12:18.2844064Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T11:12:18.2844120Z 205 │ ); 2026-10-23T11:12:18.2844170Z ╰──── 2026-10-23T11:12:18.2844633Z  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-23T11:12:18.2844928Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2844931Z 2026-10-23T11:12:18.2845074Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2845216Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:210:5] 2026-10-23T11:12:18.2845285Z 209 │ mostRecentEventCount, 2026-10-23T11:12:18.2845377Z 210 │ nativeEventSnapshotsRef.current, 2026-10-23T11:12:18.2845483Z ·  ───────────────┬─────────────── 2026-10-23T11:12:18.2845669Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T11:12:18.2845728Z 211 │ ); 2026-10-23T11:12:18.2845785Z ╰──── 2026-10-23T11:12:18.2846241Z  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-23T11:12:18.2846530Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2846532Z 2026-10-23T11:12:18.2846719Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-23T11:12:18.2846858Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:195:6] 2026-10-23T11:12:18.2846982Z 159 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T11:12:18.2847099Z 160 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T11:12:18.2847211Z ·  ─────────┬──────── 2026-10-23T11:12:18.2847683Z · ╰── 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-23T11:12:18.2847742Z 161 │ }); 2026-10-23T11:12:18.2847834Z 162 │ confirmedTokensRef.current = tokens; 2026-10-23T11:12:18.2847907Z 163 │ return JSON.stringify( 2026-10-23T11:12:18.2848068Z 164 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-23T11:12:18.2848138Z 165 │ const record = 2026-10-23T11:12:18.2848220Z 166 │ token.type === "context" 2026-10-23T11:12:18.2848438Z 167 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-23T11:12:18.2848538Z 168 │ : undefined; 2026-10-23T11:12:18.2848650Z 169 │ const presentation = contextChipPresentation( 2026-10-23T11:12:18.2848761Z 170 │ token.type === "context" ? token.kind : token.type, 2026-10-23T11:12:18.2848825Z 171 │ record, 2026-10-23T11:12:18.2848884Z 172 │ ); 2026-10-23T11:12:18.2848969Z 173 │ const icon = contextChipIcon( 2026-10-23T11:12:18.2849038Z 174 │ presentation, 2026-10-23T11:12:18.2849181Z 175 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-23T11:12:18.2849237Z 176 │ ); 2026-10-23T11:12:18.2849300Z 177 │ return { 2026-10-23T11:12:18.2849373Z 178 │ type: token.type, 2026-10-23T11:12:18.2849455Z 179 │ source: token.source, 2026-10-23T11:12:18.2849529Z 180 │ start: token.start, 2026-10-23T11:12:18.2849597Z 181 │ end: token.end, 2026-10-23T11:12:18.2849684Z 182 │ accent: presentation.accent, 2026-10-23T11:12:18.2849745Z 183 │ label: 2026-10-23T11:12:18.2849821Z 184 │ token.type === "skill" 2026-10-23T11:12:18.2849930Z 185 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-23T11:12:18.2850017Z 186 │ : token.type === "context" 2026-10-23T11:12:18.2850249Z 187 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-23T11:12:18.2850331Z 188 │ : basename(token.value), 2026-10-23T11:12:18.2850476Z 189 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-23T11:12:18.2850576Z 190 │ iconUri: contextChipIconUri(icon), 2026-10-23T11:12:18.2850669Z 191 │ tintsIcon: icon.kind === "chip", 2026-10-23T11:12:18.2850725Z 192 │ }; 2026-10-23T11:12:18.2850785Z 193 │ }), 2026-10-23T11:12:18.2850842Z 194 │ ); 2026-10-23T11:12:18.2850940Z 195 │ }, [props.value, props.context, skillLabels]); 2026-10-23T11:12:18.2851060Z ·  ────────────────────┬──────────────────── 2026-10-23T11:12:18.2851258Z · ╰── This dependency list is missing values used by the callback 2026-10-23T11:12:18.2851396Z 196 │ // Every render resolves against the snapshot history, so a render whose 2026-10-23T11:12:18.2851450Z ╰──── 2026-10-23T11:12:18.2851651Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-23T11:12:18.2851967Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2851973Z 2026-10-23T11:12:18.2852158Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-23T11:12:18.2852299Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:257:5] 2026-10-23T11:12:18.2852427Z 249 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-23T11:12:18.2852531Z 250 │ nativeEventSnapshotsRef.current.push({ 2026-10-23T11:12:18.2852623Z ·  ───────────┬─────────── 2026-10-23T11:12:18.2853130Z · ╰── 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-23T11:12:18.2853259Z 251 │ eventCount: acknowledgedEventCount, 2026-10-23T11:12:18.2853320Z 252 │ value, 2026-10-23T11:12:18.2853400Z 253 │ selection: nextSelection, 2026-10-23T11:12:18.2853459Z 254 │ }); 2026-10-23T11:12:18.2853543Z 255 │ return acknowledgedEventCount; 2026-10-23T11:12:18.2853601Z 256 │ }, 2026-10-23T11:12:18.2853657Z 257 │ [], 2026-10-23T11:12:18.2853726Z ·  ─┬ 2026-10-23T11:12:18.2853903Z · ╰── This dependency list is missing values used by the callback 2026-10-23T11:12:18.2853960Z 258 │ ); 2026-10-23T11:12:18.2854013Z ╰──── 2026-10-23T11:12:18.2854217Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-23T11:12:18.2854529Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2854539Z 2026-10-23T11:12:18.2854704Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T11:12:18.2854837Z ╭─[apps/web/src/components/CommandPalette.tsx:1996:20] 2026-10-23T11:12:18.2854957Z 1995 │ title: inferProjectTitleFromPath(destinationPath), 2026-10-23T11:12:18.2855053Z 1996 │ createdAt: new Date().toISOString(), 2026-10-23T11:12:18.2855144Z ·  ─────┬──── 2026-10-23T11:12:18.2855291Z · ╰── Cannot call impure function 2026-10-23T11:12:18.2855400Z 1997 │ remoteUrl: addProjectCloneFlow.remoteUrl, 2026-10-23T11:12:18.2855458Z ╰──── 2026-10-23T11:12:18.2855740Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T11:12:18.2856036Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T11:12:18.2856038Z 2026-10-23T11:12:18.2856237Z ⚠ eslint(no-unsafe-optional-chaining): Unsafe usage of optional chaining 2026-10-23T11:12:18.2856406Z ╭─[apps/server/src/orchestration-v2/ThreadLaunchService.test.ts:1783:8] 2026-10-23T11:12:18.2856470Z 1782 │ assert.equal( 2026-10-23T11:12:18.2856616Z 1783 │ (stored.context?.records[0] as { attachmentId: string }).attachmentId, 2026-10-23T11:12:18.2856719Z ·  ────────────────────────── 2026-10-23T11:12:18.2856850Z 1784 │ stored.attachments[0]?.id, 2026-10-23T11:12:18.2856947Z ╰──── 2026-10-23T11:12:18.2857118Z  help: If this short-circuits with 'undefined' the evaluation will throw TypeError 2026-10-23T11:12:18.2857120Z 2026-10-23T11:12:18.2857325Z ⚠ eslint(no-unused-vars): Identifier 'HostProcess' is imported but never used. 2026-10-23T11:12:18.2857489Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:25:13] 2026-10-23T11:12:18.2857575Z 24 │ import * as Schema from "effect/Schema"; 2026-10-23T11:12:18.2857745Z 25 │ import * as HostProcess from "@t3tools/shared/HostProcess"; 2026-10-23T11:12:18.2857830Z ·  ─────┬───── 2026-10-23T11:12:18.2857971Z · ╰── 'HostProcess' is imported here 2026-10-23T11:12:18.2858023Z 26 │ 2026-10-23T11:12:18.2858077Z ╰──── 2026-10-23T11:12:18.2858182Z  help: Consider removing this import. 2026-10-23T11:12:18.2858188Z 2026-10-23T11:12:18.2858458Z ⚠ eslint(no-unused-vars): Variable 'serverConfig' is declared but never used. Unused variables should start with a '_'. 2026-10-23T11:12:18.2858625Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:124:11] 2026-10-23T11:12:18.2858706Z 123 │ const path = yield* Path.Path; 2026-10-23T11:12:18.2858830Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-23T11:12:18.2858914Z ·  ──────┬───── 2026-10-23T11:12:18.2859054Z · ╰── 'serverConfig' is declared here 2026-10-23T11:12:18.2859195Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-23T11:12:18.2859249Z ╰──── 2026-10-23T11:12:18.2859359Z  help: Consider removing this declaration. 2026-10-23T11:12:18.2859364Z 2026-10-23T11:12:18.2859634Z ⚠ eslint(no-unused-vars): Variable 'serverSettings' is declared but never used. Unused variables should start with a '_'. 2026-10-23T11:12:18.2859793Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:125:11] 2026-10-23T11:12:18.2859910Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-23T11:12:18.2860048Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-23T11:12:18.2860136Z ·  ───────┬────── 2026-10-23T11:12:18.2860278Z · ╰── 'serverSettings' is declared here 2026-10-23T11:12:18.2860415Z 126 │ const gitWorkflow = yield* GitWorkflowService.GitWorkflowService; 2026-10-23T11:12:18.2860469Z ╰──── 2026-10-23T11:12:18.2860579Z  help: Consider removing this declaration. 2026-10-23T11:12:18.2860585Z 2026-10-23T11:12:18.2860790Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-23T11:12:18.2860924Z ╭─[apps/web/src/lib/composerContextReferences.ts:90:40] 2026-10-23T11:12:18.2861001Z 89 │ let cursor = prompt.length; 2026-10-23T11:12:18.2861109Z 90 │ for (const occurrence of occurrences.reverse()) { 2026-10-23T11:12:18.2861213Z ·  ─────── 2026-10-23T11:12:18.2861298Z 91 │ let { start, end } = occurrence; 2026-10-23T11:12:18.2861353Z ╰──── 2026-10-23T11:12:18.2861614Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-23T11:12:18.2861616Z 2026-10-23T11:12:18.2861889Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T11:12:18.2862097Z ╭─[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:370:7] 2026-10-23T11:12:18.2862180Z 369 │ mountedRef.current = false; 2026-10-23T11:12:18.2862258Z 370 │ flow.setBranchQuery(""); 2026-10-23T11:12:18.2862331Z ·  ──┬─ 2026-10-23T11:12:18.2862455Z · ╰── Missing dependency `flow` 2026-10-23T11:12:18.2862514Z 371 │ }; 2026-10-23T11:12:18.2862589Z 372 │ }, [flow.setBranchQuery]); 2026-10-23T11:12:18.2862674Z ·  ─────────┬───────── 2026-10-23T11:12:18.2862877Z · ╰── Overly precise dependency `flow.setBranchQuery`, use `flow` instead 2026-10-23T11:12:18.2862935Z 373 │ 2026-10-23T11:12:18.2862995Z ╰──── 2026-10-23T11:12:18.2863414Z  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-23T11:12:18.2863725Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2863728Z 2026-10-23T11:12:18.2863985Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T11:12:18.2864148Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:40:5] 2026-10-23T11:12:18.2864264Z 37 │ const [initialized, setInitialized] = useState(false); 2026-10-23T11:12:18.2864335Z 38 │ useLayoutEffect(() => { 2026-10-23T11:12:18.2864417Z ·  ───────┬─────── 2026-10-23T11:12:18.2864549Z · ╰── This is the containing effect 2026-10-23T11:12:18.2864612Z 39 │ reset(); 2026-10-23T11:12:18.2864678Z 40 │ setInitialized(true); 2026-10-23T11:12:18.2864757Z ·  ───────┬────── 2026-10-23T11:12:18.2864926Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2864991Z 41 │ }, [reset]); 2026-10-23T11:12:18.2865042Z ╰──── 2026-10-23T11:12:18.2865643Z  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-23T11:12:18.2865967Z  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-23T11:12:18.2865969Z 2026-10-23T11:12:18.2866225Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T11:12:18.2866386Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:93:5] 2026-10-23T11:12:18.2866438Z 88 │ 2026-10-23T11:12:18.2866511Z 89 │ useEffect(() => { 2026-10-23T11:12:18.2866585Z ·  ────┬──── 2026-10-23T11:12:18.2866710Z · ╰── This is the containing effect 2026-10-23T11:12:18.2866870Z 90 │ if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return; 2026-10-23T11:12:18.2867033Z 91 │ const branchName = initialProjectRef.branch; 2026-10-23T11:12:18.2867135Z 92 │ let active = true; 2026-10-23T11:12:18.2867230Z 93 │ setPendingCheckouts((count) => count + 1); 2026-10-23T11:12:18.2867316Z ·  ─────────┬───────── 2026-10-23T11:12:18.2867487Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2867653Z 94 │ // Serialize replacements: ignoring a stale result cannot undo its Git mutation. 2026-10-23T11:12:18.2867729Z ╰──── 2026-10-23T11:12:18.2868321Z  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-23T11:12:18.2868646Z  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-23T11:12:18.2868653Z 2026-10-23T11:12:18.2868908Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T11:12:18.2869074Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:215:7] 2026-10-23T11:12:18.2869128Z 211 │ }; 2026-10-23T11:12:18.2869196Z 212 │ useEffect(() => { 2026-10-23T11:12:18.2869270Z ·  ────┬──── 2026-10-23T11:12:18.2869400Z · ╰── This is the containing effect 2026-10-23T11:12:18.2869574Z 213 │ const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null; 2026-10-23T11:12:18.2869646Z 214 │ if (inserted) { 2026-10-23T11:12:18.2869726Z 215 │ setSelection((current) => 2026-10-23T11:12:18.2869808Z ·  ──────┬───── 2026-10-23T11:12:18.2869973Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2870145Z 216 │ current.start === inserted.start && current.end === inserted.end ? current : inserted, 2026-10-23T11:12:18.2870199Z ╰──── 2026-10-23T11:12:18.2870792Z  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-23T11:12:18.2871113Z  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-23T11:12:18.2871118Z 2026-10-23T11:12:18.2871368Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T11:12:18.2871532Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:296:7] 2026-10-23T11:12:18.2871611Z 284 │ }, [hasWorkspaceSnapshot]); 2026-10-23T11:12:18.2871676Z 285 │ useEffect(() => { 2026-10-23T11:12:18.2871746Z ·  ────┬──── 2026-10-23T11:12:18.2871875Z · ╰── This is the containing effect 2026-10-23T11:12:18.2872021Z 286 │ if (!environmentId || !projectCwd || !selectedProviderInstanceId) return; 2026-10-23T11:12:18.2872217Z 287 │ const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`; 2026-10-23T11:12:18.2872421Z 288 │ const now = Date.now(); 2026-10-23T11:12:18.2872535Z 289 │ const lastRequest = workspaceRefreshKeyRef.current; 2026-10-23T11:12:18.2872594Z 290 │ if ( 2026-10-23T11:12:18.2872673Z 291 │ lastRequest?.key === key && 2026-10-23T11:12:18.2872811Z 292 │ now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS 2026-10-23T11:12:18.2872866Z 293 │ ) 2026-10-23T11:12:18.2872926Z 294 │ return; 2026-10-23T11:12:18.2873100Z 295 │ if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) { 2026-10-23T11:12:18.2873186Z 296 │ setWorkspaceRefreshRetry(null); 2026-10-23T11:12:18.2873283Z ·  ────────────┬─────────── 2026-10-23T11:12:18.2873461Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2873531Z 297 │ return; 2026-10-23T11:12:18.2873586Z ╰──── 2026-10-23T11:12:18.2874175Z  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-23T11:12:18.2874494Z  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-23T11:12:18.2874496Z 2026-10-23T11:12:18.2874694Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T11:12:18.2874856Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:326:5] 2026-10-23T11:12:18.2874914Z 325 │ }, [ 2026-10-23T11:12:18.2874982Z 326 │ draftMessage, 2026-10-23T11:12:18.2875058Z ·  ──────┬───── 2026-10-23T11:12:18.2875202Z · ╰── Unnecessary dependency `draftMessage` 2026-10-23T11:12:18.2875265Z 327 │ environmentId, 2026-10-23T11:12:18.2875318Z ╰──── 2026-10-23T11:12:18.2875678Z  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-23T11:12:18.2875984Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2875987Z 2026-10-23T11:12:18.2876260Z ⚠ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'. 2026-10-23T11:12:18.2876408Z ╭─[apps/web/src/components/preview/PreviewPanelShell.tsx:61:9] 2026-10-23T11:12:18.2876466Z 60 │ ) { 2026-10-23T11:12:18.2876635Z 61 │ const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded"; 2026-10-23T11:12:18.2876715Z ·  ──────┬────── 2026-10-23T11:12:18.2876855Z · ╰── 'useDragRegion' is declared here 2026-10-23T11:12:18.2876948Z 62 │ const isInline = props.mode === "inline"; 2026-10-23T11:12:18.2877000Z ╰──── 2026-10-23T11:12:18.2877102Z  help: Consider removing this declaration. 2026-10-23T11:12:18.2877105Z 2026-10-23T11:12:18.2877358Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T11:12:18.2877569Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:400:5] 2026-10-23T11:12:18.2877686Z 398 │ 2026-10-23T11:12:18.2877751Z 399 │ useEffect(() => { 2026-10-23T11:12:18.2877829Z ·  ────┬──── 2026-10-23T11:12:18.2877959Z · ╰── This is the containing effect 2026-10-23T11:12:18.2878051Z 400 │ setInspectorSelection((current) => { 2026-10-23T11:12:18.2878136Z ·  ──────────┬────────── 2026-10-23T11:12:18.2878306Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2878409Z 401 │ if (props.renderInspector === undefined) { 2026-10-23T11:12:18.2878460Z ╰──── 2026-10-23T11:12:18.2879055Z  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-23T11:12:18.2879376Z  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-23T11:12:18.2879378Z 2026-10-23T11:12:18.2879592Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-23T11:12:18.2879745Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:528:24] 2026-10-23T11:12:18.2879903Z 527 │ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top; 2026-10-23T11:12:18.2880075Z 528 │ ╭─▶ const GitInspector = () => ( 2026-10-23T11:12:18.2880174Z 529 │ │ 2026-10-23T11:12:18.2880791Z 534 │ ╰─▶ ); 2026-10-23T11:12:18.2880874Z 535 │ const FilesInspector = () => 2026-10-23T11:12:18.2880925Z ╰──── 2026-10-23T11:12:18.2881141Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-23T11:12:18.2881144Z 2026-10-23T11:12:18.2881401Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-23T11:12:18.2881586Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:535:26] 2026-10-23T11:12:18.2881644Z 534 │ ); 2026-10-23T11:12:18.2881806Z 535 │ ╭─▶ const FilesInspector = () => 2026-10-23T11:12:18.2881954Z 536 │ │ selectedThread !== null && selectedThreadCwd !== null ? ( 2026-10-23T11:12:18.2882062Z 537 │ │ 2026-10-23T11:12:18.2883030Z 545 │ ╰─▶ ) : null; 2026-10-23T11:12:18.2883182Z 546 │ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset); 2026-10-23T11:12:18.2883232Z ╰──── 2026-10-23T11:12:18.2883449Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-23T11:12:18.2883451Z 2026-10-23T11:12:18.2883791Z ⚠ 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-23T11:12:18.2883937Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:50:18] 2026-10-23T11:12:18.2884095Z 49 │ for (const tool of ["sendMessage", "followupTask", "interruptAgent", "listAgents"]) { 2026-10-23T11:12:18.2884262Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-23T11:12:18.2884346Z ·  ───────── 2026-10-23T11:12:18.2884526Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-23T11:12:18.2884578Z ╰──── 2026-10-23T11:12:18.2884581Z 2026-10-23T11:12:18.2884904Z ⚠ 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-23T11:12:18.2885052Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:51:18] 2026-10-23T11:12:18.2885222Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-23T11:12:18.2885398Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-23T11:12:18.2885481Z ·  ───────── 2026-10-23T11:12:18.2885534Z 52 │ } 2026-10-23T11:12:18.2885587Z ╰──── 2026-10-23T11:12:18.2885590Z 2026-10-23T11:12:18.2885919Z ⚠ 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-23T11:12:18.2886058Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:55:5] 2026-10-23T11:12:18.2886122Z 54 │ assert.equal( 2026-10-23T11:12:18.2886339Z 55 │ Schema.is(CodexSchema.ServerNotification__CollabAgentToolCallStatus)("interrupted"), 2026-10-23T11:12:18.2886443Z ·  ───────── 2026-10-23T11:12:18.2886503Z 56 │ true, 2026-10-23T11:12:18.2886553Z ╰──── 2026-10-23T11:12:18.2886555Z 2026-10-23T11:12:18.2886878Z ⚠ 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-23T11:12:18.2887017Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:59:5] 2026-10-23T11:12:18.2887081Z 58 │ assert.equal( 2026-10-23T11:12:18.2887257Z 59 │ Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentToolCallStatus)("interrupted"), 2026-10-23T11:12:18.2887330Z ·  ───────── 2026-10-23T11:12:18.2887386Z 60 │ true, 2026-10-23T11:12:18.2887439Z ╰──── 2026-10-23T11:12:18.2887441Z 2026-10-23T11:12:18.2887807Z ⚠ 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-23T11:12:18.2887958Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:103:16] 2026-10-23T11:12:18.2888011Z 102 │ 2026-10-23T11:12:18.2888180Z 103 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse)(resumeResponse), true); 2026-10-23T11:12:18.2888264Z ·  ───────── 2026-10-23T11:12:18.2888320Z 104 │ }); 2026-10-23T11:12:18.2888372Z ╰──── 2026-10-23T11:12:18.2888375Z 2026-10-23T11:12:18.2888519Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2888674Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:122:38] 2026-10-23T11:12:18.2888837Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-23T11:12:18.2888962Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-23T11:12:18.2889084Z ·  ───────────┬────────── 2026-10-23T11:12:18.2889258Z · ╰── Cannot access ref value during render 2026-10-23T11:12:18.2889377Z 123 │ const sessionRef = useRef(null); 2026-10-23T11:12:18.2889427Z ╰──── 2026-10-23T11:12:18.2889895Z  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-23T11:12:18.2890194Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2890199Z 2026-10-23T11:12:18.2890339Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2890498Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8] 2026-10-23T11:12:18.2890553Z 125 │ 2026-10-23T11:12:18.2890664Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T11:12:18.2890749Z ·  ─────────┬──────── 2026-10-23T11:12:18.2890900Z · ╰── Cannot access ref value during render 2026-10-23T11:12:18.2891002Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-23T11:12:18.2891053Z ╰──── 2026-10-23T11:12:18.2891564Z  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-23T11:12:18.2891885Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2891887Z 2026-10-23T11:12:18.2892028Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2892183Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7] 2026-10-23T11:12:18.2892236Z 125 │ 2026-10-23T11:12:18.2892341Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T11:12:18.2892427Z ·  ─────────┬───────── 2026-10-23T11:12:18.2892574Z · ╰── Cannot access ref value during render 2026-10-23T11:12:18.2892679Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-23T11:12:18.2892733Z ╰──── 2026-10-23T11:12:18.2893190Z  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-23T11:12:18.2893476Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2893478Z 2026-10-23T11:12:18.2893619Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2893775Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31] 2026-10-23T11:12:18.2893827Z 125 │ 2026-10-23T11:12:18.2893940Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T11:12:18.2894059Z ·  ─────────┬───────── 2026-10-23T11:12:18.2894225Z · ╰── Cannot access ref value during render 2026-10-23T11:12:18.2894324Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-23T11:12:18.2894379Z ╰──── 2026-10-23T11:12:18.2894836Z  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-23T11:12:18.2895125Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2895127Z 2026-10-23T11:12:18.2895272Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2895428Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30] 2026-10-23T11:12:18.2895481Z 125 │ 2026-10-23T11:12:18.2895586Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T11:12:18.2895701Z ·  ──────────┬───────── 2026-10-23T11:12:18.2895863Z · ╰── Cannot access ref value during render 2026-10-23T11:12:18.2895964Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-23T11:12:18.2896014Z ╰──── 2026-10-23T11:12:18.2896519Z  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-23T11:12:18.2896842Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2896844Z 2026-10-23T11:12:18.2896985Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2897139Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46] 2026-10-23T11:12:18.2897250Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T11:12:18.2897440Z 127 │ ╭─▶ const recorder = createLazyVoiceRecorder({ 2026-10-23T11:12:18.2897626Z 128 │ │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-23T11:12:18.2897758Z 129 │ │ onStatus: (status: RecordingStatus) => { 2026-10-23T11:12:18.2897918Z 130 │ │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-23T11:12:18.2898038Z 131 │ │ isFinished: status.isFinished, 2026-10-23T11:12:18.2898211Z 132 │ │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-23T11:12:18.2898316Z 133 │ │ error: status.error, 2026-10-23T11:12:18.2898415Z 134 │ │ url: status.url, 2026-10-23T11:12:18.2898497Z 135 │ │ }); 2026-10-23T11:12:18.2898573Z 136 │ │ }, 2026-10-23T11:12:18.2898770Z 137 │ │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-23T11:12:18.2898883Z 138 │ │ selectInput: (inputs) => { 2026-10-23T11:12:18.2899039Z 139 │ │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-23T11:12:18.2899181Z 140 │ │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-23T11:12:18.2899345Z 141 │ │ const known = microphoneOrder(preferences.value.microphones); 2026-10-23T11:12:18.2899483Z 142 │ │ const order = rememberMicrophones(known, inputs); 2026-10-23T11:12:18.2899586Z 143 │ │ if (order !== known) { 2026-10-23T11:12:18.2899722Z 144 │ │ registry.set(updateMobilePreferencesAtom, { 2026-10-23T11:12:18.2899837Z 145 │ │ transform: (current) => ({ 2026-10-23T11:12:18.2900045Z 146 │ │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-23T11:12:18.2900135Z 147 │ │ }), 2026-10-23T11:12:18.2900214Z 148 │ │ }); 2026-10-23T11:12:18.2900294Z 149 │ │ } 2026-10-23T11:12:18.2900432Z 150 │ │ return preferredMicrophoneInput(inputs, order); 2026-10-23T11:12:18.2900509Z 151 │ │ }, 2026-10-23T11:12:18.2900638Z 152 │ ├─▶ }); 2026-10-23T11:12:18.2900873Z · ╰──── Passing a ref to a function may read its value during render 2026-10-23T11:12:18.2900960Z 153 │ recorderRef.current = recorder; 2026-10-23T11:12:18.2901013Z ╰──── 2026-10-23T11:12:18.2901519Z  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-23T11:12:18.2901836Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2901838Z 2026-10-23T11:12:18.2901980Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2902139Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16] 2026-10-23T11:12:18.2902196Z 152 │ }); 2026-10-23T11:12:18.2902276Z 153 │ recorderRef.current = recorder; 2026-10-23T11:12:18.2902391Z ·  ─────┬─────────┬─── 2026-10-23T11:12:18.2902581Z · │ ╰── Cannot update ref value during render 2026-10-23T11:12:18.2902702Z · ╰── This value is a ref 2026-10-23T11:12:18.2902807Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-23T11:12:18.2902858Z ╰──── 2026-10-23T11:12:18.2903318Z  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-23T11:12:18.2903604Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2903606Z 2026-10-23T11:12:18.2903753Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2903909Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48] 2026-10-23T11:12:18.2903995Z 153 │ recorderRef.current = recorder; 2026-10-23T11:12:18.2904188Z 154 │ ╭─▶ sessionRef.current = new VoiceInputSession({ 2026-10-23T11:12:18.2904276Z 155 │ │ recorder, 2026-10-23T11:12:18.2904405Z 156 │ │ getTranscriber: getLocalVoiceTranscriber, 2026-10-23T11:12:18.2904522Z 157 │ │ requestPermission: async () => { 2026-10-23T11:12:18.2904687Z 158 │ │ const permission = await requestRecordingPermissionsAsync(); 2026-10-23T11:12:18.2904878Z 159 │ │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-23T11:12:18.2904962Z 160 │ │ }, 2026-10-23T11:12:18.2905104Z 161 │ │ configureRecording: configureVoiceRecordingAudio, 2026-10-23T11:12:18.2905240Z 162 │ │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-23T11:12:18.2905375Z 163 │ │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-23T11:12:18.2905487Z 164 │ │ onStateChange: (nextState) => 2026-10-23T11:12:18.2905577Z 165 │ │ setState({ 2026-10-23T11:12:18.2905682Z 166 │ │ state: nextState, 2026-10-23T11:12:18.2905820Z 167 │ │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-23T11:12:18.2905949Z 168 │ │ label: sessionRef.current?.label ?? null, 2026-10-23T11:12:18.2906084Z 169 │ │ }), 2026-10-23T11:12:18.2906247Z 170 │ ├─▶ }); 2026-10-23T11:12:18.2906459Z · ╰──── Cannot access ref value during render 2026-10-23T11:12:18.2906517Z 171 │ } 2026-10-23T11:12:18.2906568Z ╰──── 2026-10-23T11:12:18.2907031Z  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-23T11:12:18.2907317Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2907320Z 2026-10-23T11:12:18.2907467Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2907657Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15] 2026-10-23T11:12:18.2907738Z 153 │ recorderRef.current = recorder; 2026-10-23T11:12:18.2907845Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-23T11:12:18.2907958Z ·  ─────┬────────┬─── 2026-10-23T11:12:18.2908140Z · │ ╰── Cannot update ref value during render 2026-10-23T11:12:18.2908255Z · ╰── This value is a ref 2026-10-23T11:12:18.2908320Z 155 │ recorder, 2026-10-23T11:12:18.2908373Z ╰──── 2026-10-23T11:12:18.2908836Z  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-23T11:12:18.2909124Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2909129Z 2026-10-23T11:12:18.2909269Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2909426Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7] 2026-10-23T11:12:18.2909513Z 184 │ return () => subscription.remove(); 2026-10-23T11:12:18.2909578Z 185 │ }, [controller]); 2026-10-23T11:12:18.2909654Z ·  ─────┬──── 2026-10-23T11:12:18.2909799Z · ╰── Cannot access ref value during render 2026-10-23T11:12:18.2909906Z 186 │ 2026-10-23T11:12:18.2909989Z ╰──── 2026-10-23T11:12:18.2910447Z  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-23T11:12:18.2910732Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2910734Z 2026-10-23T11:12:18.2910877Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2911033Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6] 2026-10-23T11:12:18.2911118Z 184 │ return () => subscription.remove(); 2026-10-23T11:12:18.2911185Z 185 │ }, [controller]); 2026-10-23T11:12:18.2911268Z ·  ──────┬───── 2026-10-23T11:12:18.2911412Z · ╰── Cannot access ref value during render 2026-10-23T11:12:18.2911463Z 186 │ 2026-10-23T11:12:18.2911516Z ╰──── 2026-10-23T11:12:18.2911972Z  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-23T11:12:18.2912263Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2912265Z 2026-10-23T11:12:18.2912406Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2912562Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6] 2026-10-23T11:12:18.2912625Z 191 │ }, 2026-10-23T11:12:18.2912699Z 192 │ [controller, recorder], 2026-10-23T11:12:18.2912776Z ·  ─────┬──── 2026-10-23T11:12:18.2912915Z · ╰── Cannot access ref value during render 2026-10-23T11:12:18.2912973Z 193 │ ); 2026-10-23T11:12:18.2913026Z ╰──── 2026-10-23T11:12:18.2913478Z  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-23T11:12:18.2913761Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2913764Z 2026-10-23T11:12:18.2913909Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2914068Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20] 2026-10-23T11:12:18.2914160Z 174 │ const controller = session.controller; 2026-10-23T11:12:18.2914245Z 175 │ const recorder = recorderRef.current; 2026-10-23T11:12:18.2914351Z ·  ─────────┬───────── 2026-10-23T11:12:18.2914506Z · ╰── Cannot access ref value during render 2026-10-23T11:12:18.2914560Z 176 │ 2026-10-23T11:12:18.2914610Z ╰──── 2026-10-23T11:12:18.2915118Z  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-23T11:12:18.2915438Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2915440Z 2026-10-23T11:12:18.2915640Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2915797Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5] 2026-10-23T11:12:18.2915852Z 191 │ }, 2026-10-23T11:12:18.2915925Z 192 │ [controller, recorder], 2026-10-23T11:12:18.2916017Z ·  ───────────┬────────── 2026-10-23T11:12:18.2916164Z · ╰── Cannot access ref value during render 2026-10-23T11:12:18.2916217Z 193 │ ); 2026-10-23T11:12:18.2916271Z ╰──── 2026-10-23T11:12:18.2916735Z  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-23T11:12:18.2917026Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2917028Z 2026-10-23T11:12:18.2917169Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2917321Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20] 2026-10-23T11:12:18.2917413Z 245 │ return () => clearInterval(intervalId); 2026-10-23T11:12:18.2917526Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-23T11:12:18.2917643Z ·  ─────┬──── 2026-10-23T11:12:18.2917804Z · ╰── Cannot access ref value during render 2026-10-23T11:12:18.2917861Z 247 │ 2026-10-23T11:12:18.2917913Z ╰──── 2026-10-23T11:12:18.2918373Z  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-23T11:12:18.2918657Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2918662Z 2026-10-23T11:12:18.2918801Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2918961Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6] 2026-10-23T11:12:18.2919055Z 245 │ return () => clearInterval(intervalId); 2026-10-23T11:12:18.2919164Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-23T11:12:18.2919291Z ·  ────────────────────────┬─────────────────────── 2026-10-23T11:12:18.2919451Z · ╰── Cannot access ref value during render 2026-10-23T11:12:18.2919505Z 247 │ 2026-10-23T11:12:18.2919557Z ╰──── 2026-10-23T11:12:18.2920010Z  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-23T11:12:18.2920360Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2920406Z 2026-10-23T11:12:18.2920546Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2920702Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5] 2026-10-23T11:12:18.2920768Z 260 │ setOwnerFocused, 2026-10-23T11:12:18.2920832Z 261 │ session, 2026-10-23T11:12:18.2920904Z ·  ───┬─── 2026-10-23T11:12:18.2921043Z · ╰── Cannot access ref value during render 2026-10-23T11:12:18.2921101Z 262 │ stop, 2026-10-23T11:12:18.2921155Z ╰──── 2026-10-23T11:12:18.2921616Z  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-23T11:12:18.2921905Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2921907Z 2026-10-23T11:12:18.2922048Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2922201Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10] 2026-10-23T11:12:18.2922258Z 250 │ 2026-10-23T11:12:18.2922399Z 251 │ ╭─▶ return { 2026-10-23T11:12:18.2922609Z 252 │ │ isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null, 2026-10-23T11:12:18.2922690Z 253 │ │ state, 2026-10-23T11:12:18.2922786Z 254 │ │ audioLevels, 2026-10-23T11:12:18.2922886Z 255 │ │ elapsedSeconds, 2026-10-23T11:12:18.2923017Z 256 │ │ isBusy: voiceInputBlocksSubmission(state), 2026-10-23T11:12:18.2923097Z 257 │ │ ownerKey, 2026-10-23T11:12:18.2923178Z 258 │ │ label, 2026-10-23T11:12:18.2923270Z 259 │ │ focusedOwners, 2026-10-23T11:12:18.2923366Z 260 │ │ setOwnerFocused, 2026-10-23T11:12:18.2923444Z 261 │ │ session, 2026-10-23T11:12:18.2923526Z 262 │ │ stop, 2026-10-23T11:12:18.2923607Z 263 │ │ cancel, 2026-10-23T11:12:18.2923737Z 264 │ ├─▶ }; 2026-10-23T11:12:18.2923938Z · ╰──── Cannot access ref value during render 2026-10-23T11:12:18.2924001Z 265 │ } 2026-10-23T11:12:18.2924054Z ╰──── 2026-10-23T11:12:18.2924517Z  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-23T11:12:18.2924800Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2924806Z 2026-10-23T11:12:18.2924964Z ⚠ react(immutability): This value cannot be modified 2026-10-23T11:12:18.2925125Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-23T11:12:18.2925336Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-23T11:12:18.2925492Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-23T11:12:18.2925571Z ·  ─────┬───── 2026-10-23T11:12:18.2925707Z · ╰── `audioLevels` originates here 2026-10-23T11:12:18.2925830Z 123 │ const sessionRef = useRef(null); 2026-10-23T11:12:18.2925978Z 124 │ const recorderRef = useRef | null>(null); 2026-10-23T11:12:18.2926029Z 125 │ 2026-10-23T11:12:18.2926137Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T11:12:18.2926238Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-23T11:12:18.2926380Z 128 │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-23T11:12:18.2926480Z 129 │ onStatus: (status: RecordingStatus) => { 2026-10-23T11:12:18.2926606Z 130 │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-23T11:12:18.2926694Z 131 │ isFinished: status.isFinished, 2026-10-23T11:12:18.2926837Z 132 │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-23T11:12:18.2926909Z 133 │ error: status.error, 2026-10-23T11:12:18.2926979Z 134 │ url: status.url, 2026-10-23T11:12:18.2927041Z 135 │ }); 2026-10-23T11:12:18.2927099Z 136 │ }, 2026-10-23T11:12:18.2927260Z 137 │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-23T11:12:18.2927341Z 138 │ selectInput: (inputs) => { 2026-10-23T11:12:18.2927465Z 139 │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-23T11:12:18.2927585Z 140 │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-23T11:12:18.2927758Z 141 │ const known = microphoneOrder(preferences.value.microphones); 2026-10-23T11:12:18.2927867Z 142 │ const order = rememberMicrophones(known, inputs); 2026-10-23T11:12:18.2927944Z 143 │ if (order !== known) { 2026-10-23T11:12:18.2928053Z 144 │ registry.set(updateMobilePreferencesAtom, { 2026-10-23T11:12:18.2928134Z 145 │ transform: (current) => ({ 2026-10-23T11:12:18.2928305Z 146 │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-23T11:12:18.2928370Z 147 │ }), 2026-10-23T11:12:18.2928434Z 148 │ }); 2026-10-23T11:12:18.2928490Z 149 │ } 2026-10-23T11:12:18.2928601Z 150 │ return preferredMicrophoneInput(inputs, order); 2026-10-23T11:12:18.2928660Z 151 │ }, 2026-10-23T11:12:18.2928715Z 152 │ }); 2026-10-23T11:12:18.2928806Z 153 │ recorderRef.current = recorder; 2026-10-23T11:12:18.2928917Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-23T11:12:18.2928979Z 155 │ recorder, 2026-10-23T11:12:18.2929078Z 156 │ getTranscriber: getLocalVoiceTranscriber, 2026-10-23T11:12:18.2929165Z 157 │ requestPermission: async () => { 2026-10-23T11:12:18.2929296Z 158 │ const permission = await requestRecordingPermissionsAsync(); 2026-10-23T11:12:18.2929454Z 159 │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-23T11:12:18.2929509Z 160 │ }, 2026-10-23T11:12:18.2929620Z 161 │ configureRecording: configureVoiceRecordingAudio, 2026-10-23T11:12:18.2929727Z 162 │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-23T11:12:18.2929830Z 163 │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-23T11:12:18.2929964Z 164 │ onStateChange: (nextState) => 2026-10-23T11:12:18.2930062Z 165 │ setState({ 2026-10-23T11:12:18.2930132Z 166 │ state: nextState, 2026-10-23T11:12:18.2930239Z 167 │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-23T11:12:18.2930336Z 168 │ label: sessionRef.current?.label ?? null, 2026-10-23T11:12:18.2930398Z 169 │ }), 2026-10-23T11:12:18.2930454Z 170 │ }); 2026-10-23T11:12:18.2930509Z 171 │ } 2026-10-23T11:12:18.2930560Z 172 │ 2026-10-23T11:12:18.2930647Z 173 │ const session = sessionRef.current; 2026-10-23T11:12:18.2930736Z 174 │ const controller = session.controller; 2026-10-23T11:12:18.2930820Z 175 │ const recorder = recorderRef.current; 2026-10-23T11:12:18.2930878Z 176 │ 2026-10-23T11:12:18.2930946Z 177 │ useEffect(() => { 2026-10-23T11:12:18.2931103Z 178 │ const subscription = AppState.addEventListener("change", (nextState) => { 2026-10-23T11:12:18.2931244Z 179 │ // iOS reports `inactive` while its permission dialog is open. Only the 2026-10-23T11:12:18.2931381Z 180 │ // real background state cancels preparation; recorder status handles 2026-10-23T11:12:18.2931490Z 181 │ // calls and route interruptions during capture. 2026-10-23T11:12:18.2931627Z 182 │ if (nextState === "background") controller.appMovedToBackground(); 2026-10-23T11:12:18.2931682Z 183 │ }); 2026-10-23T11:12:18.2931769Z 184 │ return () => subscription.remove(); 2026-10-23T11:12:18.2931836Z 185 │ }, [controller]); 2026-10-23T11:12:18.2931891Z 186 │ 2026-10-23T11:12:18.2931951Z 187 │ useEffect( 2026-10-23T11:12:18.2932016Z 188 │ () => () => { 2026-10-23T11:12:18.2932090Z 189 │ controller.dispose(); 2026-10-23T11:12:18.2932161Z 190 │ recorder.release(); 2026-10-23T11:12:18.2932220Z 191 │ }, 2026-10-23T11:12:18.2932295Z 192 │ [controller, recorder], 2026-10-23T11:12:18.2932353Z 193 │ ); 2026-10-23T11:12:18.2932406Z 194 │ 2026-10-23T11:12:18.2932468Z 195 │ useEffect(() => { 2026-10-23T11:12:18.2932563Z 196 │ if (state.phase !== "recording") return; 2026-10-23T11:12:18.2932617Z 197 │ 2026-10-23T11:12:18.2932765Z 198 │ const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`; 2026-10-23T11:12:18.2932870Z 199 │ const activation = activateKeepAwakeAsync(tag); 2026-10-23T11:12:18.2932951Z 200 │ void activation.catch(() => {}); 2026-10-23T11:12:18.2933014Z 201 │ return () => { 2026-10-23T11:12:18.2933162Z 202 │ // Release after activation settles, even if the recording ends immediately. 2026-10-23T11:12:18.2933300Z 203 │ void activation.then(() => deactivateKeepAwake(tag)).catch(() => {}); 2026-10-23T11:12:18.2933361Z 204 │ }; 2026-10-23T11:12:18.2933445Z 205 │ }, [keepAwakeId, state.phase]); 2026-10-23T11:12:18.2933496Z 206 │ 2026-10-23T11:12:18.2933562Z 207 │ useEffect(() => { 2026-10-23T11:12:18.2933695Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-23T11:12:18.2933749Z 209 │ 2026-10-23T11:12:18.2933868Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-23T11:12:18.2934022Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-23T11:12:18.2934129Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-23T11:12:18.2934207Z ·  ─────┬───── 2026-10-23T11:12:18.2934345Z · ╰── `audioLevels` cannot be modified 2026-10-23T11:12:18.2934402Z 213 │ } 2026-10-23T11:12:18.2934456Z ╰──── 2026-10-23T11:12:18.2934785Z  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-23T11:12:18.2935122Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T11:12:18.2935128Z 2026-10-23T11:12:18.2935326Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T11:12:18.2935484Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-23T11:12:18.2935540Z 206 │ 2026-10-23T11:12:18.2935606Z 207 │ useEffect(() => { 2026-10-23T11:12:18.2935684Z ·  ───┬─── 2026-10-23T11:12:18.2935907Z · ╰── This function may (indirectly) reassign or modify `audioLevels` after render 2026-10-23T11:12:18.2936047Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-23T11:12:18.2936102Z 209 │ 2026-10-23T11:12:18.2936219Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-23T11:12:18.2936376Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-23T11:12:18.2936481Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-23T11:12:18.2936559Z ·  ─────┬───── 2026-10-23T11:12:18.2936691Z · ╰── This modifies `audioLevels` 2026-10-23T11:12:18.2936749Z 213 │ } 2026-10-23T11:12:18.2936803Z ╰──── 2026-10-23T11:12:18.2937143Z  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-23T11:12:18.2937447Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T11:12:18.2937450Z 2026-10-23T11:12:18.2937596Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2937796Z ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14] 2026-10-23T11:12:18.2937882Z 26 │ const latestInput = useRef(input); 2026-10-23T11:12:18.2937957Z 27 │ latestInput.current = input; 2026-10-23T11:12:18.2938071Z ·  ─────┬─────────┬─── 2026-10-23T11:12:18.2938255Z · │ ╰── Cannot update ref value during render 2026-10-23T11:12:18.2938425Z · ╰── This value is a ref 2026-10-23T11:12:18.2938534Z 28 │ const mounted = useRef(true); 2026-10-23T11:12:18.2938589Z ╰──── 2026-10-23T11:12:18.2939053Z  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-23T11:12:18.2939342Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2939345Z 2026-10-23T11:12:18.2939500Z ⚠ react(immutability): This value cannot be modified 2026-10-23T11:12:18.2939665Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5] 2026-10-23T11:12:18.2939722Z 90 │ }) { 2026-10-23T11:12:18.2939841Z 91 │ const rotation = useSharedValue(props.hidden ? 1 : 0); 2026-10-23T11:12:18.2939919Z ·  ────┬─── 2026-10-23T11:12:18.2940048Z · ╰── `rotation` originates here 2026-10-23T11:12:18.2940118Z 92 │ useLayoutEffect(() => { 2026-10-23T11:12:18.2940262Z 93 │ rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING); 2026-10-23T11:12:18.2940335Z ·  ────┬─── 2026-10-23T11:12:18.2940464Z · ╰── `rotation` cannot be modified 2026-10-23T11:12:18.2940542Z 94 │ }, [props.hidden, rotation]); 2026-10-23T11:12:18.2940596Z ╰──── 2026-10-23T11:12:18.2940861Z  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-23T11:12:18.2941164Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T11:12:18.2941171Z 2026-10-23T11:12:18.2941328Z ⚠ react(immutability): This value cannot be modified 2026-10-23T11:12:18.2941498Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:269:5] 2026-10-23T11:12:18.2941594Z 266 │ const variant = props.variant ?? "plain"; 2026-10-23T11:12:18.2941728Z 267 │ const loadingVisibility = useSharedValue(props.loading ? 1 : 0); 2026-10-23T11:12:18.2941813Z ·  ────────┬──────── 2026-10-23T11:12:18.2941963Z · ╰── `loadingVisibility` originates here 2026-10-23T11:12:18.2942033Z 268 │ useLayoutEffect(() => { 2026-10-23T11:12:18.2942197Z 269 │ loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING); 2026-10-23T11:12:18.2942280Z ·  ────────┬──────── 2026-10-23T11:12:18.2942427Z · ╰── `loadingVisibility` cannot be modified 2026-10-23T11:12:18.2942520Z 270 │ }, [loadingVisibility, props.loading]); 2026-10-23T11:12:18.2942572Z ╰──── 2026-10-23T11:12:18.2942831Z  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-23T11:12:18.2943137Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T11:12:18.2943140Z 2026-10-23T11:12:18.2943295Z ⚠ react(immutability): This value cannot be modified 2026-10-23T11:12:18.2943516Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:328:5] 2026-10-23T11:12:18.2943601Z 325 │ }) { 2026-10-23T11:12:18.2943761Z 326 │ const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0); 2026-10-23T11:12:18.2943851Z ·  ─────────┬───────── 2026-10-23T11:12:18.2944003Z · ╰── `recordingVisibility` originates here 2026-10-23T11:12:18.2944071Z 327 │ useLayoutEffect(() => { 2026-10-23T11:12:18.2944259Z 328 │ recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING); 2026-10-23T11:12:18.2944348Z ·  ─────────┬───────── 2026-10-23T11:12:18.2944501Z · ╰── `recordingVisibility` cannot be modified 2026-10-23T11:12:18.2944591Z 329 │ }, [props.phase, recordingVisibility]); 2026-10-23T11:12:18.2944645Z ╰──── 2026-10-23T11:12:18.2944912Z  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-23T11:12:18.2945218Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T11:12:18.2945220Z 2026-10-23T11:12:18.2945373Z ⚠ react(immutability): This value cannot be modified 2026-10-23T11:12:18.2945535Z ╭─[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5] 2026-10-23T11:12:18.2945640Z 65 │ const [expanded, setExpanded] = useState(false); 2026-10-23T11:12:18.2945726Z 66 │ const progress = useSharedValue(0); 2026-10-23T11:12:18.2945803Z ·  ────┬─── 2026-10-23T11:12:18.2945934Z · ╰── `progress` originates here 2026-10-23T11:12:18.2946007Z 67 │ useEffect(() => { 2026-10-23T11:12:18.2946131Z 68 │ progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING); 2026-10-23T11:12:18.2946203Z ·  ────┬─── 2026-10-23T11:12:18.2946330Z · ╰── `progress` cannot be modified 2026-10-23T11:12:18.2946403Z 69 │ }, [expanded, progress]); 2026-10-23T11:12:18.2946456Z ╰──── 2026-10-23T11:12:18.2946713Z  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-23T11:12:18.2947013Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T11:12:18.2947015Z 2026-10-23T11:12:18.2947214Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T11:12:18.2947375Z ╭─[apps/mobile/src/features/terminal/TerminalContextSheet.tsx:72:15] 2026-10-23T11:12:18.2947442Z 71 │ ({ key: input.targetKey, location: candidate })); 2026-10-23T11:12:18.2948785Z 113 │ useEffect(() => { 2026-10-23T11:12:18.2948855Z ·  ────┬──── 2026-10-23T11:12:18.2948988Z · ╰── This is the containing effect 2026-10-23T11:12:18.2949153Z 114 │ if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) { 2026-10-23T11:12:18.2949215Z 115 │ return; 2026-10-23T11:12:18.2949269Z 116 │ } 2026-10-23T11:12:18.2949391Z 117 │ setEntry({ key: input.targetKey, location: candidate }); 2026-10-23T11:12:18.2949465Z ·  ────┬─── 2026-10-23T11:12:18.2949630Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2949758Z 118 │ }, [candidate, entry.key, entry.location, input.targetKey]); 2026-10-23T11:12:18.2949814Z ╰──── 2026-10-23T11:12:18.2950411Z  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-23T11:12:18.2950733Z  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-23T11:12:18.2950735Z 2026-10-23T11:12:18.2950991Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T11:12:18.2951163Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:643:5] 2026-10-23T11:12:18.2951223Z 638 │ 2026-10-23T11:12:18.2951293Z 639 │ useEffect(() => { 2026-10-23T11:12:18.2951363Z ·  ────┬──── 2026-10-23T11:12:18.2951493Z · ╰── This is the containing effect 2026-10-23T11:12:18.2951605Z 640 │ if (pendingLaunchEntry.key === launchTargetKey) { 2026-10-23T11:12:18.2951669Z 641 │ return; 2026-10-23T11:12:18.2951722Z 642 │ } 2026-10-23T11:12:18.2951799Z 643 │ setPendingLaunchEntry({ 2026-10-23T11:12:18.2951889Z ·  ──────────┬────────── 2026-10-23T11:12:18.2952086Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2952157Z 644 │ key: launchTargetKey, 2026-10-23T11:12:18.2952211Z ╰──── 2026-10-23T11:12:18.2952811Z  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-23T11:12:18.2953131Z  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-23T11:12:18.2953134Z 2026-10-23T11:12:18.2953387Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T11:12:18.2953554Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5] 2026-10-23T11:12:18.2953608Z 648 │ 2026-10-23T11:12:18.2953678Z 649 │ useEffect(() => { 2026-10-23T11:12:18.2953751Z ·  ────┬──── 2026-10-23T11:12:18.2953929Z · ╰── This is the containing effect 2026-10-23T11:12:18.2954087Z 650 │ if (initialAttachGridEntry.key === launchTargetKey) { 2026-10-23T11:12:18.2954149Z 651 │ return; 2026-10-23T11:12:18.2954205Z 652 │ } 2026-10-23T11:12:18.2954286Z 653 │ setInitialAttachGridEntry({ 2026-10-23T11:12:18.2954381Z ·  ────────────┬──────────── 2026-10-23T11:12:18.2954553Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2954625Z 654 │ key: launchTargetKey, 2026-10-23T11:12:18.2954676Z ╰──── 2026-10-23T11:12:18.2955273Z  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-23T11:12:18.2955649Z  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-23T11:12:18.2955651Z 2026-10-23T11:12:18.2955906Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T11:12:18.2956076Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7] 2026-10-23T11:12:18.2956128Z 743 │ 2026-10-23T11:12:18.2956193Z 744 │ useEffect(() => { 2026-10-23T11:12:18.2956263Z ·  ────┬──── 2026-10-23T11:12:18.2956393Z · ╰── This is the containing effect 2026-10-23T11:12:18.2956496Z 745 │ if (!routeEnvironmentId || !routeThreadId) { 2026-10-23T11:12:18.2956571Z 746 │ setLastGridSize({ 2026-10-23T11:12:18.2956655Z ·  ───────┬─────── 2026-10-23T11:12:18.2956822Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2956918Z 747 │ cols: DEFAULT_TERMINAL_COLS, 2026-10-23T11:12:18.2956973Z ╰──── 2026-10-23T11:12:18.2957561Z  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-23T11:12:18.2957911Z  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-23T11:12:18.2957917Z 2026-10-23T11:12:18.2958118Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T11:12:18.2958285Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24] 2026-10-23T11:12:18.2958344Z 537 │ }); 2026-10-23T11:12:18.2958481Z 538 │ }, [terminal.buffer, terminal.buffer.length, terminalKey]); 2026-10-23T11:12:18.2958593Z ·  ───────────┬────────── 2026-10-23T11:12:18.2958834Z · ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead 2026-10-23T11:12:18.2958997Z 539 │ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null; 2026-10-23T11:12:18.2959050Z ╰──── 2026-10-23T11:12:18.2959405Z  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-23T11:12:18.2959751Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2959756Z 2026-10-23T11:12:18.2959952Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T11:12:18.2960119Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7] 2026-10-23T11:12:18.2960217Z 708 │ sentInitialInputKeyRef.current = null; 2026-10-23T11:12:18.2960286Z 709 │ }, [terminalKey]); 2026-10-23T11:12:18.2960362Z ·  ─────┬───── 2026-10-23T11:12:18.2960515Z · ╰── Unnecessary dependency `terminalKey` 2026-10-23T11:12:18.2960573Z 710 │ 2026-10-23T11:12:18.2960625Z ╰──── 2026-10-23T11:12:18.2960909Z  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-23T11:12:18.2961217Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2961219Z 2026-10-23T11:12:18.2961417Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T11:12:18.2961585Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52] 2026-10-23T11:12:18.2961642Z 799 │ }; 2026-10-23T11:12:18.2961825Z 800 │ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]); 2026-10-23T11:12:18.2962007Z ·  ────────────┬──────────── ─────┬───── 2026-10-23T11:12:18.2962239Z · │ ╰── Unnecessary dependency `terminalKey` 2026-10-23T11:12:18.2962448Z · ╰── Unnecessary dependency `terminal.lifecycleVersion` 2026-10-23T11:12:18.2962499Z 801 │ 2026-10-23T11:12:18.2962554Z ╰──── 2026-10-23T11:12:18.2962843Z  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-23T11:12:18.2963198Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.2963238Z 2026-10-23T11:12:18.2963379Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.2963548Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24] 2026-10-23T11:12:18.2963604Z 792 │ } 2026-10-23T11:12:18.2963712Z 793 │ const pasteSession = pasteSessionRef.current; 2026-10-23T11:12:18.2963823Z ·  ───────────┬─────────── 2026-10-23T11:12:18.2963986Z · ╰── Cannot access ref value during render 2026-10-23T11:12:18.2964041Z 794 │ 2026-10-23T11:12:18.2964093Z ╰──── 2026-10-23T11:12:18.2964563Z  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-23T11:12:18.2964858Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.2964860Z 2026-10-23T11:12:18.2965045Z ⚠ react(static-components): Cannot create components during render 2026-10-23T11:12:18.2965205Z ╭─[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10] 2026-10-23T11:12:18.2965293Z 196 │ const { onInput, onResize } = props; 2026-10-23T11:12:18.2965440Z 197 │ const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView(); 2026-10-23T11:12:18.2965576Z ·  ────────────────┬─────────────── 2026-10-23T11:12:18.2965765Z · ╰── The component is created during render here 2026-10-23T11:12:18.2965894Z 198 │ const hasNativeSurface = Boolean(NativeTerminalSurfaceView); 2026-10-23T11:12:18.2965945Z 199 │ 2026-10-23T11:12:18.2966014Z 200 │ useEffect(() => { 2026-10-23T11:12:18.2966106Z 201 │ terminalDebugLog("native:surface", { 2026-10-23T11:12:18.2966193Z 202 │ terminalKey: props.terminalKey, 2026-10-23T11:12:18.2966268Z 203 │ native: hasNativeSurface, 2026-10-23T11:12:18.2966404Z 204 │ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(), 2026-10-23T11:12:18.2966491Z 205 │ bufferLen: props.buffer.length, 2026-10-23T11:12:18.2966572Z 206 │ isRunning: props.isRunning, 2026-10-23T11:12:18.2966627Z 207 │ }); 2026-10-23T11:12:18.2966793Z 208 │ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]); 2026-10-23T11:12:18.2966884Z 209 │ const handleNativeInput = useCallback( 2026-10-23T11:12:18.2967002Z 210 │ (event: NativeSyntheticEvent) => { 2026-10-23T11:12:18.2967098Z 211 │ if (!props.isRunning || props.readOnly) { 2026-10-23T11:12:18.2967162Z 212 │ return; 2026-10-23T11:12:18.2967220Z 213 │ } 2026-10-23T11:12:18.2967312Z 214 │ terminalDebugLog("native:onInput", { 2026-10-23T11:12:18.2967460Z 215 │ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)), 2026-10-23T11:12:18.2967521Z 216 │ }); 2026-10-23T11:12:18.2967621Z 217 │ onInput(event.nativeEvent.data); 2026-10-23T11:12:18.2967679Z 218 │ }, 2026-10-23T11:12:18.2967810Z 219 │ [onInput, props.isRunning, props.readOnly], 2026-10-23T11:12:18.2967868Z 220 │ ); 2026-10-23T11:12:18.2968016Z 221 │ const handleNativeResize = useCallback( 2026-10-23T11:12:18.2968173Z 222 │ (event: NativeSyntheticEvent) => { 2026-10-23T11:12:18.2968235Z 223 │ onResize({ 2026-10-23T11:12:18.2968320Z 224 │ cols: event.nativeEvent.cols, 2026-10-23T11:12:18.2968404Z 225 │ rows: event.nativeEvent.rows, 2026-10-23T11:12:18.2968459Z 226 │ }); 2026-10-23T11:12:18.2968516Z 227 │ }, 2026-10-23T11:12:18.2968579Z 228 │ [onResize], 2026-10-23T11:12:18.2968633Z 229 │ ); 2026-10-23T11:12:18.2968684Z 230 │ 2026-10-23T11:12:18.2968769Z 231 │ if (NativeTerminalSurfaceView) { 2026-10-23T11:12:18.2968830Z 232 │ return ( 2026-10-23T11:12:18.2968910Z 233 │ 2026-10-23T11:12:18.2968989Z 234 │ { 2026-10-23T11:12:18.2973398Z 57 │ if (pulse) { 2026-10-23T11:12:18.2973488Z 58 │ pulseProgress.value = withRepeat( 2026-10-23T11:12:18.2973570Z ·  ──────┬────── 2026-10-23T11:12:18.2973726Z · ╰── `pulseProgress` cannot be modified 2026-10-23T11:12:18.2973793Z 59 │ withTiming(1, { 2026-10-23T11:12:18.2973846Z ╰──── 2026-10-23T11:12:18.2974111Z  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-23T11:12:18.2974423Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T11:12:18.2974430Z 2026-10-23T11:12:18.2974868Z ⚠ 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-23T11:12:18.2974997Z ╭─[apps/server/src/assets/AssetAccess.test.ts:1043:32] 2026-10-23T11:12:18.2975137Z 1042 │ expect(error._tag).toBe("AssetGitHubMediaUrlValidationError"); 2026-10-23T11:12:18.2975323Z 1043 │ const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(AssetAccessError))(error); 2026-10-23T11:12:18.2975438Z ·  ─────────────────── 2026-10-23T11:12:18.2975537Z 1044 │ expect(encoded).not.toContain(url); 2026-10-23T11:12:18.2975594Z ╰──── 2026-10-23T11:12:18.2975597Z 2026-10-23T11:12:18.2975822Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-23T11:12:18.2975946Z ╭─[apps/server/src/terminal/Manager.test.ts:731:31] 2026-10-23T11:12:18.2976007Z 730 │ ); 2026-10-23T11:12:18.2976178Z 731 │ const snapshot = events.filter((event) => event.type === "snapshot").at(-1)?.snapshot; 2026-10-23T11:12:18.2976278Z ·  ────── 2026-10-23T11:12:18.2976400Z 732 │ expect(snapshot?.history).toBe("aa😀\rEND"); 2026-10-23T11:12:18.2976452Z ╰──── 2026-10-23T11:12:18.2976622Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-23T11:12:18.2976624Z 2026-10-23T11:12:18.2977093Z ⚠ 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-23T11:12:18.2977277Z ╭─[apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts:223:5] 2026-10-23T11:12:18.2977351Z 222 │ let idlePasses = 0; 2026-10-23T11:12:18.2977494Z 223 │ ╭─▶ for (;;) { 2026-10-23T11:12:18.2977645Z 224 │ │ yield* Effect.promise(() => Promise.resolve()); 2026-10-23T11:12:18.2977823Z 225 │ │ const pending = backgroundRuntime.pending.shift(); 2026-10-23T11:12:18.2977923Z 226 │ │ if (!pending) { 2026-10-23T11:12:18.2978076Z 227 │ │ idlePasses++; 2026-10-23T11:12:18.2978218Z 228 │ │ if (idlePasses >= 3) { 2026-10-23T11:12:18.2978305Z 229 │ │ return; 2026-10-23T11:12:18.2978386Z 230 │ │ } 2026-10-23T11:12:18.2978471Z 231 │ │ continue; 2026-10-23T11:12:18.2978550Z 232 │ │ } 2026-10-23T11:12:18.2978644Z 233 │ │ idlePasses = 0; 2026-10-23T11:12:18.2978762Z 234 │ │ const exit = yield* Effect.exit( 2026-10-23T11:12:18.2978973Z 235 │ │ pending.operation as Effect.Effect, 2026-10-23T11:12:18.2979053Z 236 │ │ ); 2026-10-23T11:12:18.2979160Z 237 │ │ yield* Effect.sync(() => { 2026-10-23T11:12:18.2979275Z 238 │ │ pending.resolve(exit); 2026-10-23T11:12:18.2979355Z 239 │ │ }); 2026-10-23T11:12:18.2979487Z 240 │ ╰─▶ } 2026-10-23T11:12:18.2979547Z 241 │ }, 2026-10-23T11:12:18.2979601Z ╰──── 2026-10-23T11:12:18.2979605Z 2026-10-23T11:12:18.2979769Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T11:12:18.2979909Z ╭─[apps/server/src/process/externalLauncher.test.ts:186:12] 2026-10-23T11:12:18.2979965Z 185 │ 2026-10-23T11:12:18.2980067Z 186 │ for (const {} of ["darwin", "linux"] as const) { 2026-10-23T11:12:18.2980137Z ·  ── 2026-10-23T11:12:18.2980192Z 187 │ } 2026-10-23T11:12:18.2980246Z ╰──── 2026-10-23T11:12:18.2980483Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T11:12:18.2980488Z 2026-10-23T11:12:18.2980650Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T11:12:18.2980788Z ╭─[apps/server/src/process/externalLauncher.test.ts:189:12] 2026-10-23T11:12:18.2980842Z 188 │ 2026-10-23T11:12:18.2980910Z 189 │ for (const {} of [ 2026-10-23T11:12:18.2980979Z ·  ── 2026-10-23T11:12:18.2981072Z 190 │ { kind: "browser", folderVerb: "none" }, 2026-10-23T11:12:18.2981127Z ╰──── 2026-10-23T11:12:18.2981354Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T11:12:18.2981357Z 2026-10-23T11:12:18.2981519Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T11:12:18.2981659Z ╭─[apps/server/src/process/externalLauncher.test.ts:311:12] 2026-10-23T11:12:18.2981717Z 310 │ 2026-10-23T11:12:18.2981847Z 311 │ for (const {} of ["rejected", "spawn-error", "stalled"] as const) { 2026-10-23T11:12:18.2981916Z ·  ── 2026-10-23T11:12:18.2981971Z 312 │ } 2026-10-23T11:12:18.2982024Z ╰──── 2026-10-23T11:12:18.2982252Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T11:12:18.2982254Z 2026-10-23T11:12:18.2982417Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T11:12:18.2982550Z ╭─[apps/server/src/process/externalLauncher.test.ts:314:12] 2026-10-23T11:12:18.2982605Z 313 │ 2026-10-23T11:12:18.2982671Z 314 │ for (const {} of [ 2026-10-23T11:12:18.2982791Z ·  ── 2026-10-23T11:12:18.2982881Z 315 │ { 2026-10-23T11:12:18.2982934Z ╰──── 2026-10-23T11:12:18.2983157Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T11:12:18.2983159Z 2026-10-23T11:12:18.2983618Z ⚠ 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-23T11:12:18.2983751Z ╭─[apps/server/src/project/ProjectService.test.ts:94:3] 2026-10-23T11:12:18.2983808Z 93 │ ) { 2026-10-23T11:12:18.2984010Z 94 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T11:12:18.2984188Z 95 │ │ const project = Option.getOrThrow(yield* service.getById(projectId)); 2026-10-23T11:12:18.2984309Z 96 │ │ if (predicate(project)) return project; 2026-10-23T11:12:18.2984413Z 97 │ │ yield* Effect.yieldNow; 2026-10-23T11:12:18.2984537Z 98 │ ╰─▶ } 2026-10-23T11:12:18.2984689Z 99 │ return yield* Effect.die(`Project ${projectId} was not enriched in time.`); 2026-10-23T11:12:18.2984739Z ╰──── 2026-10-23T11:12:18.2984742Z 2026-10-23T11:12:18.2985197Z ⚠ 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-23T11:12:18.2985362Z ╭─[apps/server/src/project/ProjectEnrichmentService.test.ts:28:3] 2026-10-23T11:12:18.2985423Z 27 │ ) { 2026-10-23T11:12:18.2985620Z 28 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T11:12:18.2985761Z 29 │ │ const available = yield* service.peek(workspaceRoot); 2026-10-23T11:12:18.2985887Z 30 │ │ if (predicate(available)) return available; 2026-10-23T11:12:18.2985988Z 31 │ │ yield* Effect.yieldNow; 2026-10-23T11:12:18.2986111Z 32 │ ╰─▶ } 2026-10-23T11:12:18.2986287Z 33 │ return yield* Effect.die(`Project metadata for ${workspaceRoot} was not resolved in time.`); 2026-10-23T11:12:18.2986340Z ╰──── 2026-10-23T11:12:18.2986342Z 2026-10-23T11:12:18.2986670Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-23T11:12:18.2986836Z ╭─[apps/server/src/telemetry/AnalyticsService.ts:340:7] 2026-10-23T11:12:18.2986888Z 339 │ 2026-10-23T11:12:18.2986994Z 340 │ const layerTest = AnalyticsService.layerTest; 2026-10-23T11:12:18.2987072Z ·  ────┬──── 2026-10-23T11:12:18.2987207Z · ╰── 'layerTest' is declared here 2026-10-23T11:12:18.2987257Z ╰──── 2026-10-23T11:12:18.2987364Z  help: Consider removing this declaration. 2026-10-23T11:12:18.2987367Z 2026-10-23T11:12:18.2987573Z ⚠ eslint(no-unused-vars): Function 'describeSchedule' is declared but never used. 2026-10-23T11:12:18.2987739Z ╭─[apps/server/src/scheduledTasks/Schedule.ts:79:10] 2026-10-23T11:12:18.2987797Z 78 │ 2026-10-23T11:12:18.2987938Z 79 │ function describeSchedule(schedule: ScheduledTaskSchedule): string { 2026-10-23T11:12:18.2988027Z ·  ────────┬─────── 2026-10-23T11:12:18.2988176Z · ╰── 'describeSchedule' is declared here 2026-10-23T11:12:18.2988280Z 80 │ if (schedule.type === "webhook") return "On webhook"; 2026-10-23T11:12:18.2988335Z ╰──── 2026-10-23T11:12:18.2988438Z  help: Consider removing this declaration. 2026-10-23T11:12:18.2988441Z 2026-10-23T11:12:18.2988697Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T11:12:18.2988883Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:119:10] 2026-10-23T11:12:18.2988935Z 117 │ 2026-10-23T11:12:18.2989010Z 118 │ useEffect(() => { 2026-10-23T11:12:18.2989088Z ·  ────┬──── 2026-10-23T11:12:18.2989217Z · ╰── This is the containing effect 2026-10-23T11:12:18.2989303Z 119 │ void refreshNotifications(); 2026-10-23T11:12:18.2989396Z ·  ──────────┬───────── 2026-10-23T11:12:18.2989571Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2989715Z 120 │ const subscription = AppState.addEventListener("change", (state) => { 2026-10-23T11:12:18.2989767Z ╰──── 2026-10-23T11:12:18.2990371Z  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-23T11:12:18.2993164Z  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-23T11:12:18.2993168Z 2026-10-23T11:12:18.2993440Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T11:12:18.2993627Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7] 2026-10-23T11:12:18.2993680Z 125 │ 2026-10-23T11:12:18.2993744Z 126 │ useEffect(() => { 2026-10-23T11:12:18.2993815Z ·  ────┬──── 2026-10-23T11:12:18.2993944Z · ╰── This is the containing effect 2026-10-23T11:12:18.2994010Z 127 │ if (!isLoaded) { 2026-10-23T11:12:18.2994179Z 128 │ setLiveActivityStatus("checking"); 2026-10-23T11:12:18.2994309Z ·  ──────────┬────────── 2026-10-23T11:12:18.2994481Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T11:12:18.2994543Z 129 │ return; 2026-10-23T11:12:18.2994594Z ╰──── 2026-10-23T11:12:18.2995185Z  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-23T11:12:18.2995589Z  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-23T11:12:18.2995592Z 2026-10-23T11:12:18.2995799Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-23T11:12:18.2995967Z ╭─[apps/web/src/components/settings/ProviderSettingsPanel.logic.ts:4:8] 2026-10-23T11:12:18.2996039Z 3 │ AuthProvidersManageScope, 2026-10-23T11:12:18.2996109Z 4 │ type AuthSessionState, 2026-10-23T11:12:18.2996192Z ·  ────────┬─────── 2026-10-23T11:12:18.2996337Z · ╰── 'AuthSessionState' is imported here 2026-10-23T11:12:18.2996401Z 5 │ type EnvironmentId, 2026-10-23T11:12:18.2996454Z ╰──── 2026-10-23T11:12:18.2996553Z  help: Consider removing this import. 2026-10-23T11:12:18.2996555Z 2026-10-23T11:12:18.2997026Z ⚠ 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-23T11:12:18.2997214Z ╭─[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:521:13] 2026-10-23T11:12:18.2997287Z 520 │ })).delivery; 2026-10-23T11:12:18.2997485Z 521 │ ╭─▶ while (delivery.outcome === "accepted") { 2026-10-23T11:12:18.2997600Z 522 │ │ yield* Effect.yieldNow; 2026-10-23T11:12:18.2997764Z 523 │ │ delivery = (yield* service.getWebhookDelivery({ 2026-10-23T11:12:18.2997869Z 524 │ │ id: task.id, 2026-10-23T11:12:18.2997988Z 525 │ │ deliveryId: deliveryId!, 2026-10-23T11:12:18.2998093Z 526 │ │ })).delivery; 2026-10-23T11:12:18.2998233Z 527 │ ╰─▶ } 2026-10-23T11:12:18.2998351Z 528 │ assert.equal(delivery.outcome, "dispatch_failed"); 2026-10-23T11:12:18.2998405Z ╰──── 2026-10-23T11:12:18.2998407Z 2026-10-23T11:12:18.2998575Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T11:12:18.2998693Z ╭─[apps/web/src/hooks/useThreadActions.ts:821:56] 2026-10-23T11:12:18.2998798Z 820 │ const resolved = resolveThreadTarget(target); 2026-10-23T11:12:18.2998955Z 821 │ if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) { 2026-10-23T11:12:18.2999079Z ·  ─────┬──── 2026-10-23T11:12:18.2999324Z · ╰── Cannot call impure function 2026-10-23T11:12:18.2999446Z 822 │ return AsyncResult.failure( 2026-10-23T11:12:18.2999500Z ╰──── 2026-10-23T11:12:18.2999779Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T11:12:18.3000072Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T11:12:18.3000074Z 2026-10-23T11:12:18.3000238Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T11:12:18.3000358Z ╭─[apps/web/src/hooks/useThreadActions.ts:709:46] 2026-10-23T11:12:18.3000432Z 708 │ const wokeAt = resolved 2026-10-23T11:12:18.3000572Z 709 │ ? threadWokeAt(resolved.thread, { now: new Date().toISOString() }) 2026-10-23T11:12:18.3000687Z ·  ─────┬──── 2026-10-23T11:12:18.3000850Z · ╰── Cannot call impure function 2026-10-23T11:12:18.3000914Z 710 │ : null; 2026-10-23T11:12:18.3000966Z ╰──── 2026-10-23T11:12:18.3001235Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T11:12:18.3001525Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T11:12:18.3001527Z 2026-10-23T11:12:18.3001693Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T11:12:18.3001846Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:372:47] 2026-10-23T11:12:18.3001983Z 371 │ const { open, onOpenChange, onSnooze, timestampFormat } = props; 2026-10-23T11:12:18.3002135Z 372 │ const presets = open ? resolveSnoozePresets(new Date(), timestampFormat) : []; 2026-10-23T11:12:18.3002252Z ·  ─────┬──── 2026-10-23T11:12:18.3002413Z · ╰── Cannot call impure function 2026-10-23T11:12:18.3002474Z 373 │ return ( 2026-10-23T11:12:18.3002524Z ╰──── 2026-10-23T11:12:18.3002797Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T11:12:18.3003091Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T11:12:18.3003097Z 2026-10-23T11:12:18.3003260Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T11:12:18.3003406Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:853:39] 2026-10-23T11:12:18.3003499Z 852 │ if (snoozeGateClock.thread !== thread) { 2026-10-23T11:12:18.3003629Z 853 │ setSnoozeGateClock({ thread, now: new Date().toISOString() }); 2026-10-23T11:12:18.3003740Z ·  ─────┬──── 2026-10-23T11:12:18.3003893Z · ╰── Cannot call impure function 2026-10-23T11:12:18.3003947Z 854 │ } 2026-10-23T11:12:18.3004001Z ╰──── 2026-10-23T11:12:18.3004322Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T11:12:18.3004643Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T11:12:18.3004645Z 2026-10-23T11:12:18.3004823Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T11:12:18.3004983Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:100:85] 2026-10-23T11:12:18.3005088Z  99 │ const startEditor = startScheduledTaskEditor; 2026-10-23T11:12:18.3005273Z 100 │ const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]); 2026-10-23T11:12:18.3005424Z ·  ─────┬───── 2026-10-23T11:12:18.3005633Z · ╰── Unnecessary dependency `startEditor` 2026-10-23T11:12:18.3005717Z 101 │ const readEditor = useCallback( 2026-10-23T11:12:18.3005770Z ╰──── 2026-10-23T11:12:18.3006082Z  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-23T11:12:18.3006388Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.3006391Z 2026-10-23T11:12:18.3006572Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T11:12:18.3006736Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:121:7] 2026-10-23T11:12:18.3006803Z 120 │ setEditor, 2026-10-23T11:12:18.3006868Z 121 │ startEditor, 2026-10-23T11:12:18.3006947Z ·  ─────┬───── 2026-10-23T11:12:18.3007093Z · ╰── Unnecessary dependency `startEditor` 2026-10-23T11:12:18.3007158Z 122 │ hasChanges, 2026-10-23T11:12:18.3007208Z ╰──── 2026-10-23T11:12:18.3007518Z  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-23T11:12:18.3007844Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.3007847Z 2026-10-23T11:12:18.3008054Z ⚠ eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used. 2026-10-23T11:12:18.3008153Z ╭─[apps/web/src/types.ts:22:3] 2026-10-23T11:12:18.3008224Z 21 │ EnvironmentThreadShell, 2026-10-23T11:12:18.3008292Z 22 │ ThreadRunSummary, 2026-10-23T11:12:18.3008372Z ·  ────────┬─────── 2026-10-23T11:12:18.3008515Z · ╰── 'ThreadRunSummary' is imported here 2026-10-23T11:12:18.3008583Z 23 │ ThreadRuntimeSummary, 2026-10-23T11:12:18.3008638Z ╰──── 2026-10-23T11:12:18.3008736Z  help: Consider removing this import. 2026-10-23T11:12:18.3008738Z 2026-10-23T11:12:18.3009017Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-23T11:12:18.3009226Z ╭─[apps/web/src/components/settings/SettingInheritance.tsx:163:24] 2026-10-23T11:12:18.3009317Z 162 │ keys, 2026-10-23T11:12:18.3009390Z 163 │ overridingProjects = [], 2026-10-23T11:12:18.3009474Z ·  ── 2026-10-23T11:12:18.3009539Z 164 │ onClearOverrides, 2026-10-23T11:12:18.3009594Z ╰──── 2026-10-23T11:12:18.3009912Z  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-23T11:12:18.3009915Z 2026-10-23T11:12:18.3010172Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T11:12:18.3010294Z ╭─[apps/server/src/serverRuntimeStartup.ts:728:7] 2026-10-23T11:12:18.3010350Z 727 │ 2026-10-23T11:12:18.3010437Z 728 │ const layer = layerWithOptions(); 2026-10-23T11:12:18.3010511Z ·  ──┬── 2026-10-23T11:12:18.3010633Z · ╰── 'layer' is declared here 2026-10-23T11:12:18.3010686Z ╰──── 2026-10-23T11:12:18.3010791Z  help: Consider removing this declaration. 2026-10-23T11:12:18.3010793Z 2026-10-23T11:12:18.3011045Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T11:12:18.3011173Z ╭─[packages/provider-pi/src/server/adapter.ts:3405:7] 2026-10-23T11:12:18.3011230Z 3404 │ 2026-10-23T11:12:18.3011421Z 3405 │ const layer: Layer.Layer = 2026-10-23T11:12:18.3011496Z ·  ──┬── 2026-10-23T11:12:18.3011626Z · ╰── 'layer' is declared here 2026-10-23T11:12:18.3011696Z 3406 │ Layer.effect( 2026-10-23T11:12:18.3011751Z ╰──── 2026-10-23T11:12:18.3011853Z  help: Consider removing this declaration. 2026-10-23T11:12:18.3011856Z 2026-10-23T11:12:18.3012315Z ⚠ 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-23T11:12:18.3012463Z ╭─[apps/server/src/background/HostPowerMonitor.test.ts:133:11] 2026-10-23T11:12:18.3012597Z 132 │ const monitor = yield* HostPowerMonitor.HostPowerMonitor; 2026-10-23T11:12:18.3012744Z 133 │ ╭─▶ for ( 2026-10-23T11:12:18.3012852Z 134 │ │ let attempt = 0; 2026-10-23T11:12:18.3013019Z 135 │ │ attempt < 100 && (yield* monitor.snapshot).onBattery !== "true"; 2026-10-23T11:12:18.3013120Z 136 │ │ attempt += 1 2026-10-23T11:12:18.3013202Z 137 │ │ ) { 2026-10-23T11:12:18.3013314Z 138 │ │ yield* Effect.yieldNow; 2026-10-23T11:12:18.3013445Z 139 │ ╰─▶ } 2026-10-23T11:12:18.3013570Z 140 │ expect((yield* monitor.snapshot).onBattery).toBe("true"); 2026-10-23T11:12:18.3013622Z ╰──── 2026-10-23T11:12:18.3013625Z 2026-10-23T11:12:18.3013902Z ⚠ eslint(no-unused-vars): Variable 'legacyCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-23T11:12:18.3014109Z ╭─[packages/provider-cursor/src/server/credentialStore.test.ts:15:7] 2026-10-23T11:12:18.3014198Z 14 │ 2026-10-23T11:12:18.3014270Z 15 │ const legacyCredentials = { 2026-10-23T11:12:18.3014378Z ·  ────────┬──────── 2026-10-23T11:12:18.3014531Z · ╰── 'legacyCredentials' is declared here 2026-10-23T11:12:18.3014600Z 16 │ version: 1 as const, 2026-10-23T11:12:18.3014657Z ╰──── 2026-10-23T11:12:18.3014761Z  help: Consider removing this declaration. 2026-10-23T11:12:18.3014763Z 2026-10-23T11:12:18.3014958Z ⚠ eslint(no-unused-vars): Identifier 'Duration' is imported but never used. 2026-10-23T11:12:18.3015094Z ╭─[packages/provider-pi/src/server/adapter.test.ts:24:13] 2026-10-23T11:12:18.3015190Z 23 │ import * as Deferred from "effect/Deferred"; 2026-10-23T11:12:18.3015290Z 24 │ import * as Duration from "effect/Duration"; 2026-10-23T11:12:18.3015370Z ·  ────┬─── 2026-10-23T11:12:18.3015505Z · ╰── 'Duration' is imported here 2026-10-23T11:12:18.3015593Z 25 │ import * as Effect from "effect/Effect"; 2026-10-23T11:12:18.3015646Z ╰──── 2026-10-23T11:12:18.3015740Z  help: Consider removing this import. 2026-10-23T11:12:18.3015743Z 2026-10-23T11:12:18.3015938Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T11:12:18.3016082Z ╭─[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9] 2026-10-23T11:12:18.3016170Z 35 │ { 2026-10-23T11:12:18.3018413Z 236 │ const input = Schema.decodeUnknownSync(SettingsUpdate)(payload); 2026-10-23T11:12:18.3018522Z ·  ──────────────────────── 2026-10-23T11:12:18.3018661Z 237 │ const scopes = requiredScopesForServerSettingsPatch(input.patch); 2026-10-23T11:12:18.3018715Z ╰──── 2026-10-23T11:12:18.3018718Z 2026-10-23T11:12:18.3019080Z ⚠ 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-23T11:12:18.3019206Z ╭─[apps/server/src/auth/RpcAuthorization.ts:255:26] 2026-10-23T11:12:18.3019308Z 254 │ if (method === WS_METHODS.assetsCreateUrl) { 2026-10-23T11:12:18.3019465Z 255 │ const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload); 2026-10-23T11:12:18.3019577Z ·  ──────────────────────── 2026-10-23T11:12:18.3019640Z 256 │ return [ 2026-10-23T11:12:18.3019694Z ╰──── 2026-10-23T11:12:18.3019696Z 2026-10-23T11:12:18.3019971Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-23T11:12:18.3020105Z ╭─[packages/provider-cursor/src/server/auth.ts:249:20] 2026-10-23T11:12:18.3020164Z 248 │ }, 2026-10-23T11:12:18.3020246Z 249 │ (effect, flow, stopSessions) => 2026-10-23T11:12:18.3020339Z ·  ──────┬───── 2026-10-23T11:12:18.3020486Z · ╰── 'stopSessions' is declared here 2026-10-23T11:12:18.3020553Z 250 │ effect.pipe( 2026-10-23T11:12:18.3020607Z ╰──── 2026-10-23T11:12:18.3020711Z  help: Consider removing this parameter. 2026-10-23T11:12:18.3020714Z 2026-10-23T11:12:18.3020965Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T11:12:18.3021103Z ╭─[packages/provider-opencode/src/server/adapter.ts:3755:7] 2026-10-23T11:12:18.3021158Z 3754 │ 2026-10-23T11:12:18.3021363Z 3755 │ const layer: Layer.Layer = 2026-10-23T11:12:18.3021440Z ·  ──┬── 2026-10-23T11:12:18.3021563Z · ╰── 'layer' is declared here 2026-10-23T11:12:18.3021631Z 3756 │ Layer.effect( 2026-10-23T11:12:18.3021684Z ╰──── 2026-10-23T11:12:18.3021787Z  help: Consider removing this declaration. 2026-10-23T11:12:18.3021792Z 2026-10-23T11:12:18.3021955Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T11:12:18.3022144Z ╭─[packages/provider-opencode/src/server/OpenCodeRuntime.environment.test.ts:53:14] 2026-10-23T11:12:18.3022200Z 52 │ 2026-10-23T11:12:18.3022267Z 53 │ for (const {} of [ 2026-10-23T11:12:18.3022337Z ·  ── 2026-10-23T11:12:18.3022405Z 54 │ { healthy: true }, 2026-10-23T11:12:18.3022515Z ╰──── 2026-10-23T11:12:18.3022780Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T11:12:18.3022786Z 2026-10-23T11:12:18.3022988Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-23T11:12:18.3023157Z ╭─[apps/server/src/sourceControl/SourceControlProviderRegistry.ts:15:13] 2026-10-23T11:12:18.3023232Z 14 │ } from "@t3tools/contracts"; 2026-10-23T11:12:18.3023323Z 15 │ import type {} from "@t3tools/contracts"; 2026-10-23T11:12:18.3023392Z ·  ── 2026-10-23T11:12:18.3023576Z 16 │ import { detectSourceControlProviderFromRemoteUrl } from "@t3tools/shared/sourceControl"; 2026-10-23T11:12:18.3023630Z ╰──── 2026-10-23T11:12:18.3023713Z  help: Remove empty braces 2026-10-23T11:12:18.3023722Z 2026-10-23T11:12:18.3023919Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T11:12:18.3024050Z ╭─[apps/mobile/src/components/ComposerEditor.tsx:82:6] 2026-10-23T11:12:18.3024108Z 81 │ }, 2026-10-23T11:12:18.3024174Z 82 │ [draftKey], 2026-10-23T11:12:18.3024243Z ·  ────┬─── 2026-10-23T11:12:18.3024383Z · ╰── Unnecessary dependency `draftKey` 2026-10-23T11:12:18.3024439Z 83 │ ); 2026-10-23T11:12:18.3024492Z ╰──── 2026-10-23T11:12:18.3024781Z  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-23T11:12:18.3025098Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.3025104Z 2026-10-23T11:12:18.3025332Z ⚠ eslint(no-unused-vars): Function 'resolveThreadWorkspaceCwd' is declared but never used. 2026-10-23T11:12:18.3025451Z ╭─[apps/server/src/checkpointing/Utils.ts:12:10] 2026-10-23T11:12:18.3025502Z 11 │ 2026-10-23T11:12:18.3025600Z 12 │ function resolveThreadWorkspaceCwd(input: { 2026-10-23T11:12:18.3025702Z ·  ────────────┬──────────── 2026-10-23T11:12:18.3025871Z · ╰── 'resolveThreadWorkspaceCwd' is declared here 2026-10-23T11:12:18.3025937Z 13 │ readonly thread: { 2026-10-23T11:12:18.3025990Z ╰──── 2026-10-23T11:12:18.3026094Z  help: Consider removing this declaration. 2026-10-23T11:12:18.3026097Z 2026-10-23T11:12:18.3026366Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-23T11:12:18.3026487Z ╭─[apps/server/src/usage/UsageService.ts:169:7] 2026-10-23T11:12:18.3026540Z 168 │ 2026-10-23T11:12:18.3026623Z 169 │ const layerTest = Layer.succeed( 2026-10-23T11:12:18.3026699Z ·  ────┬──── 2026-10-23T11:12:18.3026831Z · ╰── 'layerTest' is declared here 2026-10-23T11:12:18.3026898Z 170 │ UsageService, 2026-10-23T11:12:18.3026951Z ╰──── 2026-10-23T11:12:18.3027053Z  help: Consider removing this declaration. 2026-10-23T11:12:18.3027055Z 2026-10-23T11:12:18.3027694Z ⚠ 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-23T11:12:18.3027856Z ╭─[apps/server/src/usage/UsageService.test.ts:2383:7] 2026-10-23T11:12:18.3027954Z 2382 │ let orphanedAt: number | undefined; 2026-10-23T11:12:18.3028184Z 2383 │ ╭─▶ for (let interruptAt = 1; interruptAt <= 31; interruptAt += 1) { 2026-10-23T11:12:18.3028307Z 2384 │ │ const tasks: Array<() => void> = []; 2026-10-23T11:12:18.3028456Z 2385 │ │ const dispatcher: Scheduler.SchedulerDispatcher = { 2026-10-23T11:12:18.3028592Z 2386 │ │ scheduleTask: (task) => tasks.push(task), 2026-10-23T11:12:18.3028694Z 2387 │ │ flush: () => { 2026-10-23T11:12:18.3028827Z 2388 │ │ let task: (() => void) | undefined; 2026-10-23T11:12:18.3028977Z 2389 │ │ while ((task = tasks.shift()) !== undefined) task(); 2026-10-23T11:12:18.3029062Z 2390 │ │ }, 2026-10-23T11:12:18.3029146Z 2391 │ │ }; 2026-10-23T11:12:18.3029219Z 2392 │ │ 2026-10-23T11:12:18.3029377Z 2393 │ │ let requestFiber: Fiber.Fiber | undefined; 2026-10-23T11:12:18.3029486Z 2394 │ │ let requestChecks = 0; 2026-10-23T11:12:18.3029617Z 2395 │ │ const scheduler: Scheduler.Scheduler = { 2026-10-23T11:12:18.3029730Z 2396 │ │ executionMode: "async", 2026-10-23T11:12:18.3029849Z 2397 │ │ makeDispatcher: () => dispatcher, 2026-10-23T11:12:18.3029968Z 2398 │ │ shouldYield: (fiber) => { 2026-10-23T11:12:18.3030107Z 2399 │ │ if (fiber !== requestFiber) return false; 2026-10-23T11:12:18.3030213Z 2400 │ │ requestChecks += 1; 2026-10-23T11:12:18.3030353Z 2401 │ │ if (requestChecks !== interruptAt) return false; 2026-10-23T11:12:18.3030470Z 2402 │ │ fiber.interruptUnsafe(); 2026-10-23T11:12:18.3030570Z 2403 │ │ return true; 2026-10-23T11:12:18.3030654Z 2404 │ │ }, 2026-10-23T11:12:18.3030734Z 2405 │ │ }; 2026-10-23T11:12:18.3030807Z 2406 │ │ 2026-10-23T11:12:18.3030937Z 2407 │ │ const input: UsageSummaryInput = { 2026-10-23T11:12:18.3031038Z 2408 │ │ ...WINDOW, 2026-10-23T11:12:18.3031168Z 2409 │ │ sinceDay: UsageDay.make("2026-09-01"), 2026-10-23T11:12:18.3031365Z 2410 │ │ untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`), 2026-10-23T11:12:18.3031448Z 2411 │ │ }; 2026-10-23T11:12:18.3031559Z 2412 │ │ const first = yield* service 2026-10-23T11:12:18.3031668Z 2413 │ │ .readSummary(input) 2026-10-23T11:12:18.3031759Z 2414 │ │ .pipe( 2026-10-23T11:12:18.3031857Z 2415 │ │ Effect.exit, 2026-10-23T11:12:18.3032014Z 2416 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-23T11:12:18.3032169Z 2417 │ │ Effect.forkChild, 2026-10-23T11:12:18.3032283Z 2418 │ │ ); 2026-10-23T11:12:18.3032387Z 2419 │ │ requestFiber = first; 2026-10-23T11:12:18.3032492Z 2420 │ │ yield* Effect.yieldNow; 2026-10-23T11:12:18.3032596Z 2421 │ │ dispatcher.flush(); 2026-10-23T11:12:18.3032669Z 2422 │ │ 2026-10-23T11:12:18.3032822Z 2423 │ │ const second = yield* service.readSummary(input).pipe( 2026-10-23T11:12:18.3032918Z 2424 │ │ Effect.match({ 2026-10-23T11:12:18.3033044Z 2425 │ │ onFailure: (error) => error.reason, 2026-10-23T11:12:18.3033169Z 2426 │ │ onSuccess: () => "success" as const, 2026-10-23T11:12:18.3033262Z 2427 │ │ }), 2026-10-23T11:12:18.3033416Z 2428 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-23T11:12:18.3033520Z 2429 │ │ Effect.forkChild, 2026-10-23T11:12:18.3033603Z 2430 │ │ ); 2026-10-23T11:12:18.3033709Z 2431 │ │ yield* Effect.yieldNow; 2026-10-23T11:12:18.3033808Z 2432 │ │ dispatcher.flush(); 2026-10-23T11:12:18.3033938Z 2433 │ │ const secondExit = second.pollUnsafe(); 2026-10-23T11:12:18.3034057Z 2434 │ │ if (secondExit === undefined) { 2026-10-23T11:12:18.3034171Z 2435 │ │ second.interruptUnsafe(); 2026-10-23T11:12:18.3034282Z 2436 │ │ orphanedAt = interruptAt; 2026-10-23T11:12:18.3034375Z 2437 │ │ break; 2026-10-23T11:12:18.3034457Z 2438 │ │ } 2026-10-23T11:12:18.3034576Z 2439 │ │ if (Exit.isFailure(secondExit)) { 2026-10-23T11:12:18.3034734Z 2440 │ │ assert.fail("the matching request fiber was interrupted"); 2026-10-23T11:12:18.3034811Z 2441 │ │ } 2026-10-23T11:12:18.3034962Z 2442 │ │ assert.strictEqual(secondExit.value, "invalidWindow"); 2026-10-23T11:12:18.3035095Z 2443 │ ╰─▶ } 2026-10-23T11:12:18.3035154Z 2444 │ 2026-10-23T11:12:18.3035205Z ╰──── 2026-10-23T11:12:18.3035207Z 2026-10-23T11:12:18.3035352Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.3035521Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:152:27] 2026-10-23T11:12:18.3035748Z 151 │ 2026-10-23T11:12:18.3035827Z 152 │ {props.children(open)} 2026-10-23T11:12:18.3035918Z ·  ──┬─ 2026-10-23T11:12:18.3036078Z · ╰── Cannot access ref value during render 2026-10-23T11:12:18.3036142Z 153 │ 2026-10-23T11:12:18.3036193Z ╰──── 2026-10-23T11:12:18.3036660Z  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-23T11:12:18.3037019Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.3037061Z 2026-10-23T11:12:18.3037258Z ⚠ react(memo-dependencies): Found missing/extra memoization dependencies 2026-10-23T11:12:18.3037407Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:140:9] 2026-10-23T11:12:18.3037488Z 139 │ if (action.id !== undefined) { 2026-10-23T11:12:18.3037568Z 140 │ props.onPressAction?.({ 2026-10-23T11:12:18.3037660Z ·  ──┬── 2026-10-23T11:12:18.3037798Z · ╰── Missing dependency `props` 2026-10-23T11:12:18.3037891Z 141 │ nativeEvent: { event: action.id }, 2026-10-23T11:12:18.3038038Z 142 │ } as Parameters>[0]); 2026-10-23T11:12:18.3038101Z 143 │ } 2026-10-23T11:12:18.3038160Z 144 │ }, 2026-10-23T11:12:18.3038243Z 145 │ [close, props.onPressAction], 2026-10-23T11:12:18.3038338Z ·  ─────────┬───────── 2026-10-23T11:12:18.3038551Z · ╰── Overly precise dependency `props.onPressAction`, use `props` instead 2026-10-23T11:12:18.3038604Z 146 │ ); 2026-10-23T11:12:18.3038658Z ╰──── 2026-10-23T11:12:18.3039130Z  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-23T11:12:18.3039446Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T11:12:18.3039451Z 2026-10-23T11:12:18.3039618Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T11:12:18.3039751Z ╭─[apps/web/src/components/CustomSnoozeDialog.tsx:140:58] 2026-10-23T11:12:18.3039886Z 139 │ {...(weekStartsOn === undefined ? {} : { weekStartsOn })} 2026-10-23T11:12:18.3040034Z 140 │ disabled={{ before: new Date(new Date().setHours(0, 0, 0, 0)) }} 2026-10-23T11:12:18.3040160Z ·  ─────┬──── 2026-10-23T11:12:18.3040330Z · ╰── Cannot call impure function 2026-10-23T11:12:18.3040425Z 141 │ onSelect={(selected) => { 2026-10-23T11:12:18.3040479Z ╰──── 2026-10-23T11:12:18.3040807Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T11:12:18.3041140Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T11:12:18.3041142Z 2026-10-23T11:12:18.3041284Z ⚠ react(refs): Cannot access refs during render 2026-10-23T11:12:18.3041403Z ╭─[apps/mobile/src/components/ui/Menu.tsx:54:36] 2026-10-23T11:12:18.3041581Z 53 │ const child = children as ReactElement>; 2026-10-23T11:12:18.3041752Z 54 │ ╭─▶ children = cloneElement(child, { 2026-10-23T11:12:18.3041862Z 55 │ │ onTouchStart: (event) => { 2026-10-23T11:12:18.3042023Z 56 │ │ // Reset for a new touch, not onPressIn, which also fires when a 2026-10-23T11:12:18.3042179Z 57 │ │ // finger moves out of the row and back during the same gesture. 2026-10-23T11:12:18.3042306Z 58 │ │ menuPress.current.isPreparing = false; 2026-10-23T11:12:18.3042472Z 59 │ │ menuPress.current.suppressPress = menuPress.current.isOpen; 2026-10-23T11:12:18.3042583Z 60 │ │ pendingPress.current = null; 2026-10-23T11:12:18.3042705Z 61 │ │ child.props.onTouchStart?.(event); 2026-10-23T11:12:18.3042782Z 62 │ │ }, 2026-10-23T11:12:18.3042884Z 63 │ │ onPress: (event) => { 2026-10-23T11:12:18.3043055Z 64 │ │ // Accessibility clicks have no touch identifier and must not inherit 2026-10-23T11:12:18.3043195Z 65 │ │ // cancellation from a previous physical gesture. 2026-10-23T11:12:18.3043362Z 66 │ │ const isTouch = typeof event.nativeEvent.identifier === "number"; 2026-10-23T11:12:18.3043551Z 67 │ │ if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) { 2026-10-23T11:12:18.3043635Z 68 │ │ return; 2026-10-23T11:12:18.3043716Z 69 │ │ } 2026-10-23T11:12:18.3043855Z 70 │ │ if (isTouch && menuPress.current.isPreparing) { 2026-10-23T11:12:18.3044026Z 71 │ │ // A release can arrive between native menu preparation and display. 2026-10-23T11:12:18.3044193Z 72 │ │ // Let UIKit's display/cancel callback decide this press's outcome. 2026-10-23T11:12:18.3044295Z 73 │ │ event.persist(); 2026-10-23T11:12:18.3044454Z 74 │ │ pendingPress.current = () => child.props.onPress?.(event); 2026-10-23T11:12:18.3044540Z 75 │ │ return; 2026-10-23T11:12:18.3044616Z 76 │ │ } 2026-10-23T11:12:18.3044730Z 77 │ │ child.props.onPress?.(event); 2026-10-23T11:12:18.3044809Z 78 │ │ }, 2026-10-23T11:12:18.3044940Z 79 │ ├─▶ }); 2026-10-23T11:12:18.3045171Z · ╰──── Passing a ref to a function may read its value during render 2026-10-23T11:12:18.3045327Z 80 │ menuProps.onMenuInteractionStart = () => { 2026-10-23T11:12:18.3045415Z ╰──── 2026-10-23T11:12:18.3045876Z  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-23T11:12:18.3046163Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T11:12:18.3046165Z 2026-10-23T11:12:18.3046326Z ⚠ eslint(no-control-regex): Unexpected control character 2026-10-23T11:12:18.3046517Z ╭─[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46] 2026-10-23T11:12:18.3046658Z 219 │ 2026-10-23T11:12:18.3046803Z 220 │ {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")} 2026-10-23T11:12:18.3046914Z ·  ──┬─ 2026-10-23T11:12:18.3047081Z · ╰── 'U+001B' is a control character. 2026-10-23T11:12:18.3047148Z 221 │ 2026-10-23T11:12:18.3047201Z ╰──── 2026-10-23T11:12:18.3047426Z  help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression. 2026-10-23T11:12:18.3047431Z 2026-10-23T11:12:18.3047671Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-23T11:12:18.3047858Z ╭─[apps/web/src/components/chat/useComposerSend.ts:985:13] 2026-10-23T11:12:18.3047985Z 984 │ const changedBeforeDecline = draftChangedSinceSend(); 2026-10-23T11:12:18.3048228Z 985 │ ╭─▶ const pendingIdsBeforeDecline = pendingApprovalsRef.current.map( 2026-10-23T11:12:18.3048348Z 986 │ │ (approval) => approval.requestId, 2026-10-23T11:12:18.3048483Z 987 │ ╰─▶ ); 2026-10-23T11:12:18.3048622Z 988 │ const approvalResponding = approvalsToDecline.some((approval) => 2026-10-23T11:12:18.3048677Z ╰──── 2026-10-23T11:12:18.3048752Z  help: Switch to `Set` 2026-10-23T11:12:18.3048755Z 2026-10-23T11:12:18.3048922Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T11:12:18.3049072Z ╭─[apps/web/src/components/chat/useThreadLifecycle.tsx:178:58] 2026-10-23T11:12:18.3049184Z 177 │ if (snoozeClockState.shell !== activeThreadShell) { 2026-10-23T11:12:18.3049344Z 178 │ setSnoozeClockState({ shell: activeThreadShell, now: new Date().toISOString() }); 2026-10-23T11:12:18.3049470Z ·  ─────┬──── 2026-10-23T11:12:18.3049641Z · ╰── Cannot call impure function 2026-10-23T11:12:18.3049695Z 179 │ } 2026-10-23T11:12:18.3049746Z ╰──── 2026-10-23T11:12:18.3050022Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T11:12:18.3050360Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T11:12:18.3050396Z 2026-10-23T11:12:18.3050480Z Found 0 errors and 362 warnings in 5395 files (5.1s, 8 threads) 2026-10-23T11:12:18.3495504Z Post job cleanup. 2026-10-23T11:12:18.4086762Z Cache hit occurred on the primary key electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309, not saving cache. 2026-10-23T11:12:18.4151265Z Post job cleanup. 2026-10-23T11:12:18.4166995Z ##[start-action display=Cache full pnpm store;id=__7beabdaf-339a-4ade-923e-25fbec62ce93.__actions_cache] 2026-10-23T11:12:18.4490567Z Post job cleanup. 2026-10-23T11:12:18.5131453Z Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-2baa264059789b1dde4bbc8fdc5b8342f31f2fc8e6176e5c5e486efdd242b36c, not saving cache. 2026-10-23T11:12:18.5160544Z ##[end-action id=__7beabdaf-339a-4ade-923e-25fbec62ce93.__actions_cache;outcome=success;conclusion=success;duration_ms=99] 2026-10-23T11:12:18.5161996Z ##[start-action display=Cache Vite+;id=__7beabdaf-339a-4ade-923e-25fbec62ce93.vp_cache] 2026-10-23T11:12:18.5183742Z Post job cleanup. 2026-10-23T11:12:18.5774103Z 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-23T11:12:18.5804864Z ##[end-action id=__7beabdaf-339a-4ade-923e-25fbec62ce93.vp_cache;outcome=success;conclusion=success;duration_ms=64] 2026-10-23T11:12:18.5838254Z Post job cleanup. 2026-10-23T11:12:18.6230480Z [command]/usr/local/bin/git version 2026-10-23T11:12:18.6260097Z git version 2.55.0 2026-10-23T11:12:18.6279195Z Temporarily overriding HOME='/home/runner/_work/_temp/3bfa222a-ca38-428a-879b-7f97339dc00c' before making global git config changes 2026-10-23T11:12:18.6279542Z Adding repository directory to the temporary git global config as a safe directory 2026-10-23T11:12:18.6282585Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-23T11:12:18.6304116Z Removing SSH command configuration 2026-10-23T11:12:18.6307193Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-23T11:12:18.6330522Z [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-23T11:12:18.6446041Z fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules 2026-10-23T11:12:18.6468899Z ##[warning]The process '/usr/local/bin/git' failed with exit code 128 2026-10-23T11:12:18.6501251Z A job completed hook has been configured by the self-hosted runner administrator 2026-10-23T11:12:18.6512652Z ##[group]Run '/job_completed.sh' 2026-10-23T11:12:18.6517795Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T11:12:18.6517962Z env: 2026-10-23T11:12:18.6518070Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 278 2026-10-23T11:12:18.6518216Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 438 2026-10-23T11:12:18.6518353Z BLACKSMITH_CHECK_RUN_ID: 120383083005 2026-10-23T11:12:18.6518493Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-23T11:12:18.6518640Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-23T11:12:18.6518770Z ##[endgroup] 2026-10-23T11:12:18.6589254Z Docker container cache not activated, skipping hash computation. 2026-10-23T11:12:18.6806188Z No active SSH sessions detected. Proceeding with shutdown immediately. 2026-10-23T11:12:18.6844841Z Cleaning up orphan processes