2026-10-25T02:26:19.6779072Z Current runner version: '2.338.1' 2026-10-25T02:26:19.6782476Z Runner name: 'blacksmith-8vcpu-ubuntu-2404-hfewmmnvoc6pqszk' 2026-10-25T02:26:19.6783146Z Runner group name: 'blacksmith scale sets - blacksmith-8vcpu-ubuntu-2404' 2026-10-25T02:26:19.6783816Z Machine name: 'ip-172-31-73-130' 2026-10-25T02:26:19.6785619Z ##[group]GITHUB_TOKEN Permissions 2026-10-25T02:26:19.6786886Z Contents: read 2026-10-25T02:26:19.6787317Z Metadata: read 2026-10-25T02:26:19.6787738Z ##[endgroup] 2026-10-25T02:26:19.6789102Z Secret source: Actions 2026-10-25T02:26:19.6789698Z Cache mode: write 2026-10-25T02:26:19.6790297Z Prepare workflow directory 2026-10-25T02:26:19.6962999Z Prepare all required actions 2026-10-25T02:26:19.6988542Z Getting action download info 2026-10-25T02:26:19.8320586Z Download action repository 'actions/checkout@v6' (SHA:d23441a48e516b6c34aea4fa41551a30e30af803) 2026-10-25T02:26:19.8642869Z Download action repository 'actions/cache@v6' (SHA:55cc8345863c7cc4c66a329aec7e433d2d1c52a9) 2026-10-25T02:26:19.9675215Z Setting BLACKSMITH_ACTIONS_RESULTS_URL to https://results-receiver.actions.githubusercontent.com/ 2026-10-25T02:26:19.9711357Z Complete job name: Lint 2026-10-25T02:26:20.0059461Z A job started hook has been configured by the self-hosted runner administrator 2026-10-25T02:26:20.0201010Z ##[group]Run '/setup.sh' 2026-10-25T02:26:20.0215005Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-25T02:26:20.0215411Z env: 2026-10-25T02:26:20.0215632Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 156 2026-10-25T02:26:20.0215917Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 382 2026-10-25T02:26:20.0216198Z BLACKSMITH_CHECK_RUN_ID: 121052657821 2026-10-25T02:26:20.0216738Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-25T02:26:20.0217067Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-25T02:26:20.0217327Z ##[endgroup] 2026-10-25T02:26:20.0422902Z Logging daemon started (blacksmithd for logs) 2026-10-25T02:26:20.0493595Z Results daemon started (blacksmithd for results) 2026-10-25T02:26:20.0628596Z Background adoption and SSH setup started (PID: 3160) 2026-10-25T02:26:20.0629124Z 2026-10-25T02:26:20.0629293Z ---------------------------------------- 2026-10-25T02:26:20.0630752Z View this job: https://app.blacksmith.sh/pingdotgg/runs/40154432578/jobs/121052657821 2026-10-25T02:26:20.0631681Z SSH Access (using your GitHub SSH key): 2026-10-25T02:26:20.0632314Z ssh -p 64000 runner@blacksmith-8vcpu-ubuntu-2404-hfewmmnvoc6pqszk.vm.blacksmith.sh 2026-10-25T02:26:20.0632704Z 2026-10-25T02:26:20.0632837Z No GitHub SSH key? Add one at: 2026-10-25T02:26:20.0633413Z https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account 2026-10-25T02:26:20.0633833Z 2026-10-25T02:26:20.0633937Z ---------------------------------------- 2026-10-25T02:26:20.0634111Z 2026-10-25T02:26:20.0634373Z VM ID: blacksmith-8vcpu-ubuntu-2404-hfewmmnvoc6pqszk 2026-10-25T02:26:20.0634910Z Host: production-152.236.30.58-x8664 2026-10-25T02:26:20.0635331Z Host Agent PID: 3811741 2026-10-25T02:26:20.0635705Z Host Agent Git SHA: 1637818df 2026-10-25T02:26:20.0636129Z Host CPU Manufacturer: AuthenticAMD 2026-10-25T02:26:20.0636611Z Blacksmith Host Generation: gen 2 2026-10-25T02:26:20.0637050Z Petname: production-tidy-thrush-2293798c 2026-10-25T02:26:20.0637497Z Region: us-east 2026-10-25T02:26:20.0637853Z Rootfs Version: ubuntu24-full-x64-081926 2026-10-25T02:26:20.0641400Z OS Version: Ubuntu 24.04.4 LTS 2026-10-25T02:26:20.0641798Z 2026-10-25T02:26:20.0641910Z Enabling Blacksmith transparent cache 2026-10-25T02:26:20.0896297Z ##[group]Run actions/checkout@v6 2026-10-25T02:26:20.0896633Z with: 2026-10-25T02:26:20.0896956Z sparse-checkout: /* !/.repos/ !/apps/mobile/modules/t3-terminal/Vendor/**/*.a 2026-10-25T02:26:20.0897352Z sparse-checkout-cone-mode: false 2026-10-25T02:26:20.0897622Z repository: pingdotgg/t3code 2026-10-25T02:26:20.0899440Z token: *** 2026-10-25T02:26:20.0899652Z ssh-strict: true 2026-10-25T02:26:20.0899864Z ssh-user: git 2026-10-25T02:26:20.0900081Z persist-credentials: true 2026-10-25T02:26:20.0900506Z clean: true 2026-10-25T02:26:20.0900711Z fetch-depth: 1 2026-10-25T02:26:20.0900923Z fetch-tags: false 2026-10-25T02:26:20.0901139Z show-progress: true 2026-10-25T02:26:20.0901361Z lfs: false 2026-10-25T02:26:20.0901566Z submodules: false 2026-10-25T02:26:20.0901787Z set-safe-directory: true 2026-10-25T02:26:20.0902036Z allow-unsafe-pr-checkout: false 2026-10-25T02:26:20.0902283Z env: 2026-10-25T02:26:20.0902518Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 156 2026-10-25T02:26:20.0902795Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 382 2026-10-25T02:26:20.0903067Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:26:20.0903330Z ##[endgroup] 2026-10-25T02:26:20.2147341Z Syncing repository: pingdotgg/t3code 2026-10-25T02:26:20.2148398Z ##[group]Getting Git version info 2026-10-25T02:26:20.2148733Z Working directory is '/home/runner/_work/t3code/t3code' 2026-10-25T02:26:20.2149217Z [command]/usr/local/bin/git version 2026-10-25T02:26:20.2217649Z git version 2.55.0 2026-10-25T02:26:20.2230371Z ##[endgroup] 2026-10-25T02:26:20.2237690Z Temporarily overriding HOME='/home/runner/_work/_temp/b883f699-eefb-476a-b538-49eacf486c86' before making global git config changes 2026-10-25T02:26:20.2238359Z Adding repository directory to the temporary git global config as a safe directory 2026-10-25T02:26:20.2241098Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-25T02:26:20.2271475Z Deleting the contents of '/home/runner/_work/t3code/t3code' 2026-10-25T02:26:20.2273239Z ##[group]Determining repository object format 2026-10-25T02:26:20.2274208Z ##[endgroup] 2026-10-25T02:26:20.2274565Z ##[group]Initializing the repository 2026-10-25T02:26:20.2276508Z [command]/usr/local/bin/git init /home/runner/_work/t3code/t3code 2026-10-25T02:26:20.2306904Z hint: Using 'master' as the name for the initial branch. This default branch name 2026-10-25T02:26:20.2307711Z hint: will change to "main" in Git 3.0. To configure the initial branch name 2026-10-25T02:26:20.2308467Z hint: to use in all of your new repositories, which will suppress this warning, 2026-10-25T02:26:20.2309047Z hint: call: 2026-10-25T02:26:20.2309360Z hint: 2026-10-25T02:26:20.2309690Z hint: git config --global init.defaultBranch 2026-10-25T02:26:20.2309996Z hint: 2026-10-25T02:26:20.2310288Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and 2026-10-25T02:26:20.2310738Z hint: 'development'. The just-created branch can be renamed via this command: 2026-10-25T02:26:20.2311101Z hint: 2026-10-25T02:26:20.2311311Z hint: git branch -m 2026-10-25T02:26:20.2311548Z hint: 2026-10-25T02:26:20.2311922Z hint: Disable this message with "git config set advice.defaultBranchName false" 2026-10-25T02:26:20.2312413Z Initialized empty Git repository in /home/runner/_work/t3code/t3code/.git/ 2026-10-25T02:26:20.2313231Z [command]/usr/local/bin/git remote add origin https://github.com/pingdotgg/t3code 2026-10-25T02:26:20.2336863Z ##[endgroup] 2026-10-25T02:26:20.2337251Z ##[group]Disabling automatic garbage collection 2026-10-25T02:26:20.2338788Z [command]/usr/local/bin/git config --local gc.auto 0 2026-10-25T02:26:20.2357841Z ##[endgroup] 2026-10-25T02:26:20.2358212Z ##[group]Setting up auth 2026-10-25T02:26:20.2358487Z Removing SSH command configuration 2026-10-25T02:26:20.2361698Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-25T02:26:20.2383631Z [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-25T02:26:20.2502616Z Removing HTTP extra header 2026-10-25T02:26:20.2505773Z [command]/usr/local/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader 2026-10-25T02:26:20.2527051Z [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-25T02:26:20.2617920Z Removing includeIf entries pointing to credentials config files 2026-10-25T02:26:20.2624101Z [command]/usr/local/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: 2026-10-25T02:26:20.2641466Z [command]/usr/local/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url 2026-10-25T02:26:20.2736771Z [command]/usr/local/bin/git config --file /home/runner/_work/_temp/git-credentials-c2537a0b-0437-40ac-9450-4872eee71755.config http.https://github.com/.extraheader AUTHORIZATION: basic *** 2026-10-25T02:26:20.2757187Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git.path /home/runner/_work/_temp/git-credentials-c2537a0b-0437-40ac-9450-4872eee71755.config 2026-10-25T02:26:20.2774297Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git/worktrees/*.path /home/runner/_work/_temp/git-credentials-c2537a0b-0437-40ac-9450-4872eee71755.config 2026-10-25T02:26:20.2791807Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-c2537a0b-0437-40ac-9450-4872eee71755.config 2026-10-25T02:26:20.2808434Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-c2537a0b-0437-40ac-9450-4872eee71755.config 2026-10-25T02:26:20.2823392Z ##[endgroup] 2026-10-25T02:26:20.2823752Z ##[group]Fetching the repository 2026-10-25T02:26:20.2827782Z [command]/usr/local/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --filter=blob:none --depth=1 origin +88b1361a1061c79ab4a354786bd33c75e5a4404b:refs/remotes/pull/23202/merge 2026-10-25T02:26:20.5590814Z From https://github.com/pingdotgg/t3code 2026-10-25T02:26:20.5591707Z * [new ref] 88b1361a1061c79ab4a354786bd33c75e5a4404b -> pull/23202/merge 2026-10-25T02:26:20.5610720Z ##[endgroup] 2026-10-25T02:26:20.5611459Z ##[group]Determining the checkout info 2026-10-25T02:26:20.5612228Z ##[endgroup] 2026-10-25T02:26:20.5612869Z ##[group]Setting up sparse checkout 2026-10-25T02:26:20.5614484Z [command]/usr/local/bin/git config core.sparseCheckout true 2026-10-25T02:26:20.5637020Z [command]/usr/local/bin/git rev-parse --git-path info/sparse-checkout 2026-10-25T02:26:20.5655438Z .git/info/sparse-checkout 2026-10-25T02:26:20.5659331Z ##[endgroup] 2026-10-25T02:26:20.5660043Z ##[group]Checking out the ref 2026-10-25T02:26:20.5661809Z [command]/usr/local/bin/git checkout --progress --force refs/remotes/pull/23202/merge 2026-10-25T02:26:27.3348762Z Updating files: 0% (1/6499) 2026-10-25T02:26:27.3376007Z Updating files: 1% (65/6499) 2026-10-25T02:26:27.3393012Z Updating files: 2% (130/6499) 2026-10-25T02:26:27.3413253Z Updating files: 3% (195/6499) 2026-10-25T02:26:27.3434028Z Updating files: 4% (260/6499) 2026-10-25T02:26:27.3463803Z Updating files: 5% (325/6499) 2026-10-25T02:26:27.3485951Z Updating files: 6% (390/6499) 2026-10-25T02:26:27.3535887Z Updating files: 7% (455/6499) 2026-10-25T02:26:27.3570851Z Updating files: 8% (520/6499) 2026-10-25T02:26:27.3660981Z Updating files: 9% (585/6499) 2026-10-25T02:26:27.3811504Z Updating files: 10% (650/6499) 2026-10-25T02:26:27.3961358Z Updating files: 11% (715/6499) 2026-10-25T02:26:27.3973822Z Updating files: 12% (780/6499) 2026-10-25T02:26:27.3985085Z Updating files: 13% (845/6499) 2026-10-25T02:26:27.4003003Z Updating files: 14% (910/6499) 2026-10-25T02:26:27.4020255Z Updating files: 15% (975/6499) 2026-10-25T02:26:27.4037670Z Updating files: 16% (1040/6499) 2026-10-25T02:26:27.4054697Z Updating files: 17% (1105/6499) 2026-10-25T02:26:27.4071355Z Updating files: 18% (1170/6499) 2026-10-25T02:26:27.4088224Z Updating files: 19% (1235/6499) 2026-10-25T02:26:27.4103013Z Updating files: 20% (1300/6499) 2026-10-25T02:26:27.4129842Z Updating files: 21% (1365/6499) 2026-10-25T02:26:27.4146727Z Updating files: 22% (1430/6499) 2026-10-25T02:26:27.4161842Z Updating files: 23% (1495/6499) 2026-10-25T02:26:27.4176695Z Updating files: 24% (1560/6499) 2026-10-25T02:26:27.4189528Z Updating files: 25% (1625/6499) 2026-10-25T02:26:27.4205867Z Updating files: 26% (1690/6499) 2026-10-25T02:26:27.4219507Z Updating files: 27% (1755/6499) 2026-10-25T02:26:27.4239348Z Updating files: 28% (1820/6499) 2026-10-25T02:26:27.4264981Z Updating files: 29% (1885/6499) 2026-10-25T02:26:27.4286578Z Updating files: 30% (1950/6499) 2026-10-25T02:26:27.4312321Z Updating files: 31% (2015/6499) 2026-10-25T02:26:27.4334340Z Updating files: 32% (2080/6499) 2026-10-25T02:26:27.4368365Z Updating files: 33% (2145/6499) 2026-10-25T02:26:27.4431832Z Updating files: 34% (2210/6499) 2026-10-25T02:26:27.4481633Z Updating files: 35% (2275/6499) 2026-10-25T02:26:27.4521480Z Updating files: 36% (2340/6499) 2026-10-25T02:26:27.4557702Z Updating files: 37% (2405/6499) 2026-10-25T02:26:27.4596303Z Updating files: 38% (2470/6499) 2026-10-25T02:26:27.4628933Z Updating files: 39% (2535/6499) 2026-10-25T02:26:27.4657365Z Updating files: 40% (2600/6499) 2026-10-25T02:26:27.4686945Z Updating files: 41% (2665/6499) 2026-10-25T02:26:27.4704335Z Updating files: 42% (2730/6499) 2026-10-25T02:26:27.4716270Z Updating files: 43% (2795/6499) 2026-10-25T02:26:27.4729325Z Updating files: 44% (2860/6499) 2026-10-25T02:26:27.4761778Z Updating files: 45% (2925/6499) 2026-10-25T02:26:27.4786086Z Updating files: 46% (2990/6499) 2026-10-25T02:26:27.4808965Z Updating files: 47% (3055/6499) 2026-10-25T02:26:27.4838011Z Updating files: 48% (3120/6499) 2026-10-25T02:26:27.4870561Z Updating files: 49% (3185/6499) 2026-10-25T02:26:27.4907292Z Updating files: 50% (3250/6499) 2026-10-25T02:26:27.4923387Z Updating files: 51% (3315/6499) 2026-10-25T02:26:27.4955809Z Updating files: 52% (3380/6499) 2026-10-25T02:26:27.4981543Z Updating files: 53% (3445/6499) 2026-10-25T02:26:27.5002248Z Updating files: 54% (3510/6499) 2026-10-25T02:26:27.5025539Z Updating files: 55% (3575/6499) 2026-10-25T02:26:27.5044503Z Updating files: 56% (3640/6499) 2026-10-25T02:26:27.5059899Z Updating files: 57% (3705/6499) 2026-10-25T02:26:27.5079689Z Updating files: 58% (3770/6499) 2026-10-25T02:26:27.5426661Z Updating files: 59% (3835/6499) 2026-10-25T02:26:27.5443107Z Updating files: 60% (3900/6499) 2026-10-25T02:26:27.5461591Z Updating files: 61% (3965/6499) 2026-10-25T02:26:27.5482600Z Updating files: 62% (4030/6499) 2026-10-25T02:26:27.5506751Z Updating files: 63% (4095/6499) 2026-10-25T02:26:27.5533854Z Updating files: 64% (4160/6499) 2026-10-25T02:26:27.5554187Z Updating files: 65% (4225/6499) 2026-10-25T02:26:27.5572156Z Updating files: 66% (4290/6499) 2026-10-25T02:26:27.5595345Z Updating files: 67% (4355/6499) 2026-10-25T02:26:27.5607798Z Updating files: 68% (4420/6499) 2026-10-25T02:26:27.5625975Z Updating files: 69% (4485/6499) 2026-10-25T02:26:27.5637973Z Updating files: 70% (4550/6499) 2026-10-25T02:26:27.5655048Z Updating files: 71% (4615/6499) 2026-10-25T02:26:27.5669517Z Updating files: 72% (4680/6499) 2026-10-25T02:26:27.5713177Z Updating files: 73% (4745/6499) 2026-10-25T02:26:27.5929462Z Updating files: 74% (4810/6499) 2026-10-25T02:26:27.6101229Z Updating files: 74% (4852/6499) 2026-10-25T02:26:27.6126229Z Updating files: 75% (4875/6499) 2026-10-25T02:26:27.6147188Z Updating files: 76% (4940/6499) 2026-10-25T02:26:27.6169181Z Updating files: 77% (5005/6499) 2026-10-25T02:26:27.6191817Z Updating files: 78% (5070/6499) 2026-10-25T02:26:27.6208595Z Updating files: 79% (5135/6499) 2026-10-25T02:26:27.6230103Z Updating files: 80% (5200/6499) 2026-10-25T02:26:27.6247473Z Updating files: 81% (5265/6499) 2026-10-25T02:26:27.6266112Z Updating files: 82% (5330/6499) 2026-10-25T02:26:27.6287659Z Updating files: 83% (5395/6499) 2026-10-25T02:26:27.6308100Z Updating files: 84% (5460/6499) 2026-10-25T02:26:27.6325822Z Updating files: 85% (5525/6499) 2026-10-25T02:26:27.6350575Z Updating files: 86% (5590/6499) 2026-10-25T02:26:27.6419033Z Updating files: 87% (5655/6499) 2026-10-25T02:26:27.6448927Z Updating files: 88% (5720/6499) 2026-10-25T02:26:27.6469082Z Updating files: 89% (5785/6499) 2026-10-25T02:26:27.6493039Z Updating files: 90% (5850/6499) 2026-10-25T02:26:27.6523163Z Updating files: 91% (5915/6499) 2026-10-25T02:26:27.6537234Z Updating files: 92% (5980/6499) 2026-10-25T02:26:27.6558128Z Updating files: 93% (6045/6499) 2026-10-25T02:26:27.6577814Z Updating files: 94% (6110/6499) 2026-10-25T02:26:27.6601840Z Updating files: 95% (6175/6499) 2026-10-25T02:26:27.6657130Z Updating files: 96% (6240/6499) 2026-10-25T02:26:27.6679466Z Updating files: 97% (6305/6499) 2026-10-25T02:26:27.6724729Z Updating files: 98% (6370/6499) 2026-10-25T02:26:27.6743440Z Updating files: 99% (6435/6499) 2026-10-25T02:26:27.6743780Z Updating files: 100% (6499/6499) 2026-10-25T02:26:27.6743967Z Updating files: 100% (6499/6499), done. 2026-10-25T02:26:27.6892402Z Note: switching to 'refs/remotes/pull/23202/merge'. 2026-10-25T02:26:27.6892633Z 2026-10-25T02:26:27.6892764Z You are in 'detached HEAD' state. You can look around, make experimental 2026-10-25T02:26:27.6893053Z changes and commit them, and you can discard any commits you make in this 2026-10-25T02:26:27.6893340Z state without impacting any branches by switching back to a branch. 2026-10-25T02:26:27.6893509Z 2026-10-25T02:26:27.6893627Z If you want to create a new branch to retain commits you create, you may 2026-10-25T02:26:27.6893909Z do so (now or later) by using -c with the switch command. Example: 2026-10-25T02:26:27.6894064Z 2026-10-25T02:26:27.6894138Z git switch -c 2026-10-25T02:26:27.6894252Z 2026-10-25T02:26:27.6894324Z Or undo this operation with: 2026-10-25T02:26:27.6894425Z 2026-10-25T02:26:27.6894506Z git switch - 2026-10-25T02:26:27.6894595Z 2026-10-25T02:26:27.6894726Z Turn off this advice by setting config variable advice.detachedHead to false 2026-10-25T02:26:27.6894913Z 2026-10-25T02:26:27.6904395Z HEAD is now at 88b1361 Merge 52c7dcdeb3d86ccd382a582ec79fb317884cc6bd into 8f26ed7e279d6d290ab7200e88055b7a58982b7d 2026-10-25T02:26:27.6905652Z ##[endgroup] 2026-10-25T02:26:27.6937068Z [command]/usr/local/bin/git log -1 --format=%H 2026-10-25T02:26:27.6954992Z 88b1361a1061c79ab4a354786bd33c75e5a4404b 2026-10-25T02:26:27.7024670Z ##[group]Run files="$(git ls-files .github/pr-assets)" 2026-10-25T02:26:27.7024919Z files="$(git ls-files .github/pr-assets)" 2026-10-25T02:26:27.7025096Z if test -n "$files"; then 2026-10-25T02:26:27.7025408Z  printf 'PR evidence must be uploaded to GitHub, not committed:\n%s\n' "$files" >&2 2026-10-25T02:26:27.7025618Z  exit 1 2026-10-25T02:26:27.7025721Z fi 2026-10-25T02:26:27.7042833Z shell: /usr/bin/bash -e {0} 2026-10-25T02:26:27.7042975Z env: 2026-10-25T02:26:27.7043098Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 156 2026-10-25T02:26:27.7043248Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 382 2026-10-25T02:26:27.7043388Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:26:27.7043523Z ##[endgroup] 2026-10-25T02:26:27.7198731Z Prepare all required actions 2026-10-25T02:26:27.7199025Z Getting action download info 2026-10-25T02:26:27.8156024Z Download action repository 'voidzero-dev/setup-vp@v1' (SHA:250f29ce396baf5e8f24498e17c0dfdebabc26eb) 2026-10-25T02:26:27.9093009Z ##[group]Run ./.github/actions/setup-ci-deps 2026-10-25T02:26:27.9093171Z env: 2026-10-25T02:26:27.9093290Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 156 2026-10-25T02:26:27.9093436Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 382 2026-10-25T02:26:27.9093583Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:26:27.9093716Z ##[endgroup] 2026-10-25T02:26:27.9799198Z ##[start-action display=Resolve Vite+ version;id=__self.vp] 2026-10-25T02:26:27.9813890Z ##[group]Run echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-25T02:26:27.9814325Z echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-25T02:26:27.9814621Z echo "node=$(jq -r '.engines.node' package.json)" >> "$GITHUB_OUTPUT" 2026-10-25T02:26:27.9814856Z echo "pnpm=$(jq -r '.packageManager' package.json)" >> "$GITHUB_OUTPUT" 2026-10-25T02:26:27.9830726Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-25T02:26:27.9830890Z env: 2026-10-25T02:26:27.9831004Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 156 2026-10-25T02:26:27.9831147Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 382 2026-10-25T02:26:27.9831302Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:26:27.9831435Z ##[endgroup] 2026-10-25T02:26:27.9900002Z ##[end-action id=__self.vp;outcome=success;conclusion=success;duration_ms=10] 2026-10-25T02:26:27.9901304Z ##[start-action display=Cache Vite+;id=__self.vp_cache] 2026-10-25T02:26:27.9942434Z ##[group]Run actions/cache@v6 2026-10-25T02:26:27.9942566Z with: 2026-10-25T02:26:27.9942667Z path: ~/.vite-plus 2026-10-25T02:26:27.9942828Z key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-25T02:26:27.9943024Z enableCrossOsArchive: false 2026-10-25T02:26:27.9943156Z fail-on-cache-miss: false 2026-10-25T02:26:27.9943282Z lookup-only: false 2026-10-25T02:26:27.9943391Z save-always: false 2026-10-25T02:26:27.9943502Z env: 2026-10-25T02:26:27.9943612Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 156 2026-10-25T02:26:27.9943757Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 382 2026-10-25T02:26:27.9943897Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:26:27.9944028Z ##[endgroup] 2026-10-25T02:26:28.1893390Z Cache hit for: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-25T02:26:28.5609127Z Received 170349591 of 170349591 (100.0%), 465.5 MBs/sec 2026-10-25T02:26:28.5609874Z Cache Size: ~162 MB (170349591 B) 2026-10-25T02:26:28.5644202Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/668810a7-7a37-42b1-a4ae-45116d1dde27/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-25T02:26:29.2210332Z Cache restored successfully 2026-10-25T02:26:29.2361823Z Cache restored from key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-25T02:26:29.2452816Z ##[end-action id=__self.vp_cache;outcome=success;conclusion=success;duration_ms=1255] 2026-10-25T02:26:29.2456540Z ##[start-action display=Use cached Vite+;id=__self.__run] 2026-10-25T02:26:29.2483547Z ##[group]Run echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-25T02:26:29.2483841Z echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-25T02:26:29.2484127Z "$HOME/.vite-plus/bin/vp" env use "26.12.1" 2026-10-25T02:26:29.2503846Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-25T02:26:29.2504020Z env: 2026-10-25T02:26:29.2504142Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 156 2026-10-25T02:26:29.2504295Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 382 2026-10-25T02:26:29.2504483Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:26:29.2504685Z ##[endgroup] 2026-10-25T02:26:29.2555485Z Using Node.js v26.12.1 (resolved from 26.12.1) 2026-10-25T02:26:29.2565635Z ##[end-action id=__self.__run;outcome=success;conclusion=success;duration_ms=10] 2026-10-25T02:26:29.2567728Z ##[start-action display=Setup Vite+;id=__self.__voidzero-dev_setup-vp] 2026-10-25T02:26:29.2573383Z ##[end-action id=__self.__voidzero-dev_setup-vp;outcome=skipped;conclusion=skipped;duration_ms=0] 2026-10-25T02:26:29.2575334Z ##[start-action display=Resolve pnpm store path;id=__self.pnpm_store] 2026-10-25T02:26:29.2609675Z ##[group]Run store_path="$(vp pm cache dir)" 2026-10-25T02:26:29.2609947Z store_path="$(vp pm cache dir)" 2026-10-25T02:26:29.2610122Z echo "path=$store_path" >> "$GITHUB_OUTPUT" 2026-10-25T02:26:29.2632608Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-25T02:26:29.2632929Z env: 2026-10-25T02:26:29.2633101Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 156 2026-10-25T02:26:29.2633444Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 382 2026-10-25T02:26:29.2633609Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:26:29.2633751Z ##[endgroup] 2026-10-25T02:26:29.2812065Z ##[end-action id=__self.pnpm_store;outcome=success;conclusion=success;duration_ms=23] 2026-10-25T02:26:29.2814149Z ##[start-action display=Cache full pnpm store;id=__self.__actions_cache] 2026-10-25T02:26:29.3204856Z ##[group]Run actions/cache@v6 2026-10-25T02:26:29.3205001Z with: 2026-10-25T02:26:29.3205138Z path: /home/runner/.local/share/pnpm/store/v11 2026-10-25T02:26:29.3205414Z key: pnpm-full-v1-Linux-X64-67727b77004e0e6799b7f8587a750813c0ad4460c623edf0becc280ccb581251 2026-10-25T02:26:29.3205689Z restore-keys: pnpm-full-v1-Linux-X64- 2026-10-25T02:26:29.3205847Z enableCrossOsArchive: false 2026-10-25T02:26:29.3205995Z fail-on-cache-miss: false 2026-10-25T02:26:29.3206127Z lookup-only: false 2026-10-25T02:26:29.3206252Z save-always: false 2026-10-25T02:26:29.3206392Z env: 2026-10-25T02:26:29.3206512Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 156 2026-10-25T02:26:29.3206670Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 382 2026-10-25T02:26:29.3206821Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:26:29.3206975Z ##[endgroup] 2026-10-25T02:26:29.5085393Z Cache hit for: pnpm-full-v1-Linux-X64-67727b77004e0e6799b7f8587a750813c0ad4460c623edf0becc280ccb581251 2026-10-25T02:26:30.5350496Z Received 738197504 of 998502311 (73.9%), 704.0 MBs/sec 2026-10-25T02:26:30.9576060Z Received 998502311 of 998502311 (100.0%), 669.2 MBs/sec 2026-10-25T02:26:30.9576599Z Cache Size: ~952 MB (998502311 B) 2026-10-25T02:26:30.9623557Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/efd81ba9-c174-4e01-8a47-e8293a855784/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-25T02:26:36.0761432Z Cache restored successfully 2026-10-25T02:26:36.1303422Z Cache restored from key: pnpm-full-v1-Linux-X64-67727b77004e0e6799b7f8587a750813c0ad4460c623edf0becc280ccb581251 2026-10-25T02:26:36.1384116Z ##[end-action id=__self.__actions_cache;outcome=success;conclusion=success;duration_ms=6856] 2026-10-25T02:26:36.1386778Z ##[start-action display=Install dependencies;id=__self.__run_2] 2026-10-25T02:26:36.1399849Z ##[group]Run vp install 2026-10-25T02:26:36.1400032Z vp install 2026-10-25T02:26:36.1417962Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-25T02:26:36.1418133Z env: 2026-10-25T02:26:36.1418255Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 156 2026-10-25T02:26:36.1418404Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 382 2026-10-25T02:26:36.1418551Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:26:36.1418694Z ##[endgroup] 2026-10-25T02:26:36.1745744Z Scope: all 34 workspace projects 2026-10-25T02:26:36.2783835Z ? Verifying lockfile against supply-chain policies (2087 entries)... 2026-10-25T02:26:36.5294278Z Packages are hard linked from the content-addressable store to the virtual store. 2026-10-25T02:26:36.5294754Z Content-addressable store is at: /home/runner/.local/share/pnpm/store/v11 2026-10-25T02:26:36.5295068Z Virtual store is at: node_modules/.pnpm 2026-10-25T02:26:38.6443746Z ✓ Lockfile passes supply-chain policies (2087 entries in 2.4s) 2026-10-25T02:26:38.6444064Z Lockfile is up to date, resolution step is skipped 2026-10-25T02:26:38.6603095Z Packages: +1720 2026-10-25T02:26:38.6603261Z ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2026-10-25T02:26:38.6924950Z Progress: resolved 1720, reused 1716, downloaded 0, added 1720, done 2026-10-25T02:26:39.5592448Z . prepare$ vp config --no-agent 2026-10-25T02:26:39.6537644Z . prepare: Done 2026-10-25T02:26:39.6551284Z 2026-10-25T02:26:39.6551507Z devDependencies: 2026-10-25T02:26:39.6551655Z + @coderabbitai/config 1.1.0 2026-10-25T02:26:39.6551796Z + @shadcn/lint 0.1.5 2026-10-25T02:26:39.6551944Z + @types/node 24.12.4 2026-10-25T02:26:39.6552066Z + knip 6.34.0 2026-10-25T02:26:39.6552213Z + typescript <- @tsc-rs/typescript 0.8.0 2026-10-25T02:26:39.6552359Z + vite-plus 1.3.0 2026-10-25T02:26:39.6552429Z 2026-10-25T02:26:39.6564517Z Done in 3.5s using pnpm v12.14.0 2026-10-25T02:26:39.6693332Z ##[end-action id=__self.__run_2;outcome=success;conclusion=success;duration_ms=3530] 2026-10-25T02:26:39.7355609Z ##[group]Run actions/cache@v6 2026-10-25T02:26:39.7355786Z with: 2026-10-25T02:26:39.7355907Z path: ~/.cache/electron 2026-10-25T02:26:39.7356153Z key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-25T02:26:39.7356387Z enableCrossOsArchive: false 2026-10-25T02:26:39.7356518Z fail-on-cache-miss: false 2026-10-25T02:26:39.7356641Z lookup-only: false 2026-10-25T02:26:39.7356753Z save-always: false 2026-10-25T02:26:39.7356858Z env: 2026-10-25T02:26:39.7356965Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 156 2026-10-25T02:26:39.7357111Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 382 2026-10-25T02:26:39.7357261Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:26:39.7357395Z ##[endgroup] 2026-10-25T02:26:39.9249144Z Cache hit for: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-25T02:26:40.0809098Z Received 122906203 of 122906203 (100.0%), 831.3 MBs/sec 2026-10-25T02:26:40.0809523Z Cache Size: ~117 MB (122906203 B) 2026-10-25T02:26:40.0823600Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/2383252c-3ca1-4b89-a4eb-6d2e4b78deb6/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-25T02:26:40.1402044Z Cache restored successfully 2026-10-25T02:26:40.1541802Z Cache restored from key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-25T02:26:40.1655631Z ##[group]Run vp run --filter @t3tools/desktop ensure:electron 2026-10-25T02:26:40.1655887Z vp run --filter @t3tools/desktop ensure:electron 2026-10-25T02:26:40.1674288Z shell: /usr/bin/bash -e {0} 2026-10-25T02:26:40.1674420Z env: 2026-10-25T02:26:40.1674682Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 156 2026-10-25T02:26:40.1674833Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 382 2026-10-25T02:26:40.1674976Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:26:40.1675117Z ##[endgroup] 2026-10-25T02:26:40.3444839Z ~/apps/desktop$ node scripts/ensure-electron-runtime.mjs ⊘ cache disabled 2026-10-25T02:26:40.9008755Z /home/runner/_work/t3code/t3code/node_modules/.pnpm/electron@44.9.3_supports-color@8.1.1/node_modules/electron/dist/electron 2026-10-25T02:26:40.9023858Z 2026-10-25T02:26:40.9118687Z ##[group]Run vp run knip:check 2026-10-25T02:26:40.9118923Z vp run knip:check 2026-10-25T02:26:40.9134978Z shell: /usr/bin/bash -e {0} 2026-10-25T02:26:40.9135113Z env: 2026-10-25T02:26:40.9135224Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 156 2026-10-25T02:26:40.9135385Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 382 2026-10-25T02:26:40.9135548Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:26:40.9135680Z ##[endgroup] 2026-10-25T02:26:41.0533780Z $ knip --include files,dependencies --no-config-hints ⊘ cache disabled 2026-10-25T02:26:44.6449282Z 2026-10-25T02:26:44.6452490Z $ knip --workspace apps/server --workspace apps/desktop --workspace apps/web --workspace packages/client-runtime --workspace packages/contracts --workspace packages/effect-acp --workspace packages/effect-codex-app-server --workspace packages/shared --workspace packages/ssh --workspace packages/tailscale --workspace packages/provider-core --workspace packages/provider-acp --workspace packages/provider-acp-registry --workspace packages/provider-testing --workspace packages/provider-pi --workspace packages/provider-muse --workspace packages/provider-opencode --workspace packages/provider-cursor --workspace packages/provider-grok --workspace packages/source-control-core --workspace packages/source-control-definitions --workspace packages/source-control-azure-devops --workspace packages/source-control-bitbucket --workspace packages/source-control-forgejo --workspace packages/source-control-gitcafe --workspace packages/source-control-github --workspace packages/source-control-gitlab --workspace packages/source-control-testing --exports --preprocessor ./scripts/knip-schemas.ts --no-config-hints ⊘ cache disabled 2026-10-25T02:26:52.6097139Z 2026-10-25T02:26:52.6098094Z --- 2026-10-25T02:26:52.6098358Z vp run: 2/2 successful. (Run `vp run --last-details` for full details) 2026-10-25T02:26:52.6163665Z ##[group]Run vp run --filter @t3tools/source-control-github generate --check 2026-10-25T02:26:52.6163954Z vp run --filter @t3tools/source-control-github generate --check 2026-10-25T02:26:52.6179776Z shell: /usr/bin/bash -e {0} 2026-10-25T02:26:52.6179914Z env: 2026-10-25T02:26:52.6180024Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 156 2026-10-25T02:26:52.6180172Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 382 2026-10-25T02:26:52.6180313Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:26:52.6180448Z ##[endgroup] 2026-10-25T02:26:52.7648488Z ~/packages/source-control-github$ graphqlgen --check ⊘ cache disabled 2026-10-25T02:26:52.9453311Z 2026-10-25T02:26:52.9517508Z ##[group]Run vp run --filter t3 generate --check 2026-10-25T02:26:52.9517761Z vp run --filter t3 generate --check 2026-10-25T02:26:52.9533331Z shell: /usr/bin/bash -e {0} 2026-10-25T02:26:52.9533456Z env: 2026-10-25T02:26:52.9533580Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 156 2026-10-25T02:26:52.9533726Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 382 2026-10-25T02:26:52.9533871Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:26:52.9534005Z ##[endgroup] 2026-10-25T02:26:53.0940812Z ~/apps/server$ graphqlgen --check ⊘ cache disabled 2026-10-25T02:26:53.2393036Z 2026-10-25T02:26:53.2456078Z ##[group]Run vp check 2026-10-25T02:26:53.2456224Z vp check 2026-10-25T02:26:53.2472035Z shell: /usr/bin/bash -e {0} 2026-10-25T02:26:53.2472161Z env: 2026-10-25T02:26:53.2472270Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 156 2026-10-25T02:26:53.2472418Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 382 2026-10-25T02:26:53.2472559Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:26:53.2472691Z ##[endgroup] 2026-10-25T02:26:53.7835847Z pass: All 5815 files are correctly formatted (402ms, 8 threads) 2026-10-25T02:26:58.7124978Z error: Lint issues found 2026-10-25T02:26:58.7125861Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T02:26:58.7126290Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:767:7] 2026-10-25T02:26:58.7126566Z 766 │ if (settingsSheetPresentation.isActive) { 2026-10-25T02:26:58.7126859Z 767 │ settingsRoutePresentation.present(settingsRouteSession); 2026-10-25T02:26:58.7127121Z ·  ────────────┬──────────── 2026-10-25T02:26:58.7127413Z · ╰── Missing dependency `settingsRoutePresentation` 2026-10-25T02:26:58.7127641Z 768 │ } 2026-10-25T02:26:58.7127919Z 769 │ }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]); 2026-10-25T02:26:58.7128323Z ·  ────────────────┬──────────────── 2026-10-25T02:26:58.7128733Z · ╰── Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead 2026-10-25T02:26:58.7129050Z 770 │ 2026-10-25T02:26:58.7129167Z ╰──── 2026-10-25T02:26:58.7129644Z  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-25T02:26:58.7130385Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7130694Z 2026-10-25T02:26:58.7130855Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:26:58.7131165Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:388:5] 2026-10-25T02:26:58.7131476Z 384 │ typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0; 2026-10-25T02:26:58.7131783Z 385 │ const animatedBorderRadius = useSharedValue(targetBorderRadius); 2026-10-25T02:26:58.7132021Z ·  ──────────┬───────── 2026-10-25T02:26:58.7132282Z · ╰── `animatedBorderRadius` originates here 2026-10-25T02:26:58.7132597Z 386 │ const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android"; 2026-10-25T02:26:58.7132840Z 387 │ useLayoutEffect(() => { 2026-10-25T02:26:58.7133032Z 388 │ animatedBorderRadius.value = shouldAnimate 2026-10-25T02:26:58.7133242Z ·  ──────────┬───────── 2026-10-25T02:26:58.7133499Z · ╰── `animatedBorderRadius` cannot be modified 2026-10-25T02:26:58.7133754Z 389 │ ? withTiming(targetBorderRadius, { 2026-10-25T02:26:58.7133917Z ╰──── 2026-10-25T02:26:58.7134238Z  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-25T02:26:58.7134797Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:26:58.7135093Z 2026-10-25T02:26:58.7135303Z ⚠ eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used. 2026-10-25T02:26:58.7135606Z ╭─[infra/relay/src/http/Api.ts:69:13] 2026-10-25T02:26:58.7135904Z 68 │ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts"; 2026-10-25T02:26:58.7136288Z 69 │ import * as HookForwarder from "../hooks/HookForwarder.ts"; 2026-10-25T02:26:58.7136538Z ·  ──────┬────── 2026-10-25T02:26:58.7136782Z · ╰── 'HookForwarder' is imported here 2026-10-25T02:26:58.7137026Z 70 │ import * as HeldHooks from "../hooks/HeldHooks.ts"; 2026-10-25T02:26:58.7137196Z ╰──── 2026-10-25T02:26:58.7137347Z  help: Consider removing this import. 2026-10-25T02:26:58.7137466Z 2026-10-25T02:26:58.7137933Z ⚠ 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-25T02:26:58.7138502Z ╭─[packages/client-runtime/src/connection/supervisor.test.ts:135:3] 2026-10-25T02:26:58.7138785Z 134 │ let lastState = yield* SubscriptionRef.get(state); 2026-10-25T02:26:58.7139133Z 135 │ ╭─▶ for (let iteration = 0; iteration < 100; iteration += 1) { 2026-10-25T02:26:58.7139469Z 136 │ │ lastState = yield* SubscriptionRef.get(state); 2026-10-25T02:26:58.7139718Z 137 │ │ if (predicate(lastState)) { 2026-10-25T02:26:58.7139937Z 138 │ │ return lastState; 2026-10-25T02:26:58.7140132Z 139 │ │ } 2026-10-25T02:26:58.7140332Z 140 │ │ yield* Effect.yieldNow; 2026-10-25T02:26:58.7140576Z 141 │ ╰─▶ } 2026-10-25T02:26:58.7140786Z 142 │ return yield* Effect.die( 2026-10-25T02:26:58.7140934Z ╰──── 2026-10-25T02:26:58.7140991Z 2026-10-25T02:26:58.7141210Z ⚠ eslint(no-unused-vars): Function 'nonEmptyString' is declared but never used. 2026-10-25T02:26:58.7141557Z ╭─[packages/client-runtime/src/work-log/presentation.ts:237:10] 2026-10-25T02:26:58.7141764Z 236 │ 2026-10-25T02:26:58.7141939Z 237 │ function nonEmptyString(value: unknown): string | null { 2026-10-25T02:26:58.7142157Z ·  ───────┬────── 2026-10-25T02:26:58.7142391Z · ╰── 'nonEmptyString' is declared here 2026-10-25T02:26:58.7142676Z 238 │ return typeof value === "string" && value.trim().length > 0 ? value : null; 2026-10-25T02:26:58.7142878Z ╰──── 2026-10-25T02:26:58.7143036Z  help: Consider removing this declaration. 2026-10-25T02:26:58.7143156Z 2026-10-25T02:26:58.7143369Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-25T02:26:58.7143695Z ╭─[apps/mobile/src/lib/markdownDocument.ts:259:28] 2026-10-25T02:26:58.7143932Z 258 │ visit(parser.parse(markdown), false, false); 2026-10-25T02:26:58.7144132Z 259 │ for (const edit of edits.reverse()) 2026-10-25T02:26:58.7144333Z ·  ─────── 2026-10-25T02:26:58.7144604Z 260 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-25T02:26:58.7144828Z ╰──── 2026-10-25T02:26:58.7145144Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-25T02:26:58.7145511Z 2026-10-25T02:26:58.7145721Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-25T02:26:58.7146062Z ╭─[apps/mobile/src/lib/markdownDocument.ts:290:28] 2026-10-25T02:26:58.7146447Z 289 │ visit(parser.parse(markdown)); 2026-10-25T02:26:58.7146670Z 290 │ for (const edit of edits.reverse()) 2026-10-25T02:26:58.7146869Z ·  ─────── 2026-10-25T02:26:58.7147136Z 291 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-25T02:26:58.7147358Z ╰──── 2026-10-25T02:26:58.7147667Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-25T02:26:58.7147917Z 2026-10-25T02:26:58.7148125Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-25T02:26:58.7148443Z ╭─[apps/mobile/src/lib/markdownDocument.ts:339:38] 2026-10-25T02:26:58.7148655Z 338 │ visit(parser.parse(markdown)); 2026-10-25T02:26:58.7148859Z 339 │ for (const lineStart of lineStarts.reverse()) { 2026-10-25T02:26:58.7149082Z ·  ─────── 2026-10-25T02:26:58.7149390Z 340 │ // Lazy headers can lack container markers; copy the delimiter's markers to the header and blank line. 2026-10-25T02:26:58.7149634Z ╰──── 2026-10-25T02:26:58.7149948Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-25T02:26:58.7150194Z 2026-10-25T02:26:58.7150417Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-25T02:26:58.7150779Z ╭─[packages/client-runtime/src/operations/projects.ts:238:51] 2026-10-25T02:26:58.7150993Z 237 │ ): string { 2026-10-25T02:26:58.7151230Z 238 │ const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? ""; 2026-10-25T02:26:58.7151506Z ·  ────── 2026-10-25T02:26:58.7151760Z 239 │ return target.owner ? `${target.owner}/${folderName}` : folderName; 2026-10-25T02:26:58.7151954Z ╰──── 2026-10-25T02:26:58.7152182Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-25T02:26:58.7152359Z 2026-10-25T02:26:58.7152565Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-25T02:26:58.7152893Z ╭─[apps/web/src/lib/announce.browser.test.ts:41:46] 2026-10-25T02:26:58.7153078Z 40 │ 2026-10-25T02:26:58.7153251Z 41 │ expect(regionTexts()).toEqual([...first].reverse()); 2026-10-25T02:26:58.7153489Z ·  ─────── 2026-10-25T02:26:58.7153712Z 42 │ expect(regionTexts()).toContain("Claude"); 2026-10-25T02:26:58.7153879Z ╰──── 2026-10-25T02:26:58.7154189Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-25T02:26:58.7154440Z 2026-10-25T02:26:58.7154697Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:26:58.7155102Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:433:5] 2026-10-25T02:26:58.7155336Z 423 │ : null; 2026-10-25T02:26:58.7155483Z 424 │ useEffect(() => { 2026-10-25T02:26:58.7155646Z ·  ────┬──── 2026-10-25T02:26:58.7155896Z · ╰── This is the containing effect 2026-10-25T02:26:58.7156094Z 425 │ if ( 2026-10-25T02:26:58.7156313Z 426 │ props.active === false || 2026-10-25T02:26:58.7156525Z 427 │ activeDraftKey !== null || 2026-10-25T02:26:58.7156707Z 428 │ editingPendingTask !== null || 2026-10-25T02:26:58.7156894Z 429 │ selectedProject === null 2026-10-25T02:26:58.7157051Z 430 │ ) { 2026-10-25T02:26:58.7157179Z 431 │ return; 2026-10-25T02:26:58.7157312Z 432 │ } 2026-10-25T02:26:58.7157448Z 433 │ setActiveDraftKey( 2026-10-25T02:26:58.7157625Z ·  ────────┬──────── 2026-10-25T02:26:58.7157891Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7158132Z 434 │ createNewTaskDraft({ 2026-10-25T02:26:58.7158868Z ╰──── 2026-10-25T02:26:58.7159572Z  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-25T02:26:58.7160450Z  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-25T02:26:58.7160763Z 2026-10-25T02:26:58.7161025Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-25T02:26:58.7161425Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1214:36] 2026-10-25T02:26:58.7161712Z 1213 │ 2026-10-25T02:26:58.7162036Z 1214 │ {props.children} 2026-10-25T02:26:58.7162357Z ·  ───────────── 2026-10-25T02:26:58.7162555Z 1215 │ 2026-10-25T02:26:58.7162709Z ╰──── 2026-10-25T02:26:58.7162989Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-25T02:26:58.7163353Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-25T02:26:58.7163536Z 2026-10-25T02:26:58.7163794Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:26:58.7164221Z ╭─[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:60:5] 2026-10-25T02:26:58.7164453Z 58 │ 2026-10-25T02:26:58.7164583Z 59 │ useEffect(() => { 2026-10-25T02:26:58.7164746Z ·  ────┬──── 2026-10-25T02:26:58.7164967Z · ╰── This is the containing effect 2026-10-25T02:26:58.7165185Z 60 │ setMountedModes((current) => { 2026-10-25T02:26:58.7165372Z ·  ───────┬─────── 2026-10-25T02:26:58.7165635Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7165979Z 61 │ if (current.has(props.mode)) { 2026-10-25T02:26:58.7166143Z ╰──── 2026-10-25T02:26:58.7166804Z  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-25T02:26:58.7167761Z  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-25T02:26:58.7168102Z 2026-10-25T02:26:58.7168452Z ⚠ 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-25T02:26:58.7168916Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:50:18] 2026-10-25T02:26:58.7169237Z 49 │ for (const tool of ["sendMessage", "followupTask", "interruptAgent", "listAgents"]) { 2026-10-25T02:26:58.7169583Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-25T02:26:58.7169848Z ·  ───────── 2026-10-25T02:26:58.7170130Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-25T02:26:58.7170373Z ╰──── 2026-10-25T02:26:58.7170434Z 2026-10-25T02:26:58.7170768Z ⚠ 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-25T02:26:58.7171233Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:51:18] 2026-10-25T02:26:58.7171564Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-25T02:26:58.7171919Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-25T02:26:58.7172196Z ·  ───────── 2026-10-25T02:26:58.7172352Z 52 │ } 2026-10-25T02:26:58.7172476Z ╰──── 2026-10-25T02:26:58.7172532Z 2026-10-25T02:26:58.7172874Z ⚠ 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-25T02:26:58.7173329Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:55:5] 2026-10-25T02:26:58.7173550Z 54 │ assert.equal( 2026-10-25T02:26:58.7173811Z 55 │ Schema.is(CodexSchema.ServerNotification__CollabAgentToolCallStatus)("interrupted"), 2026-10-25T02:26:58.7174067Z ·  ───────── 2026-10-25T02:26:58.7174222Z 56 │ true, 2026-10-25T02:26:58.7174348Z ╰──── 2026-10-25T02:26:58.7174410Z 2026-10-25T02:26:58.7174747Z ⚠ 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-25T02:26:58.7175381Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:59:5] 2026-10-25T02:26:58.7175617Z 58 │ assert.equal( 2026-10-25T02:26:58.7175931Z 59 │ Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentToolCallStatus)("interrupted"), 2026-10-25T02:26:58.7176198Z ·  ───────── 2026-10-25T02:26:58.7176346Z 60 │ true, 2026-10-25T02:26:58.7176470Z ╰──── 2026-10-25T02:26:58.7176531Z 2026-10-25T02:26:58.7176864Z ⚠ 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-25T02:26:58.7177321Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:103:16] 2026-10-25T02:26:58.7177539Z 102 │ 2026-10-25T02:26:58.7177770Z 103 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse)(resumeResponse), true); 2026-10-25T02:26:58.7178040Z ·  ───────── 2026-10-25T02:26:58.7193806Z 104 │ }); 2026-10-25T02:26:58.7194045Z ╰──── 2026-10-25T02:26:58.7194227Z 2026-10-25T02:26:58.7194463Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:26:58.7194794Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:174:5] 2026-10-25T02:26:58.7195108Z 170 │ const expandedAngle = props.collapsedDirection === "right" ? 90 : 180; 2026-10-25T02:26:58.7195411Z 171 │ const rotation = useSharedValue(props.expanded ? expandedAngle : 0); 2026-10-25T02:26:58.7195658Z ·  ────┬─── 2026-10-25T02:26:58.7195928Z · ╰── `rotation` originates here 2026-10-25T02:26:58.7196127Z 172 │ 2026-10-25T02:26:58.7196264Z 173 │ useLayoutEffect(() => { 2026-10-25T02:26:58.7196504Z 174 │ rotation.value = withTiming(props.expanded ? expandedAngle : 0, { 2026-10-25T02:26:58.7196727Z ·  ────┬─── 2026-10-25T02:26:58.7196960Z · ╰── `rotation` cannot be modified 2026-10-25T02:26:58.7197207Z 175 │ duration: THREAD_DISCLOSURE_TRANSITION_MS, 2026-10-25T02:26:58.7197383Z ╰──── 2026-10-25T02:26:58.7197713Z  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-25T02:26:58.7198296Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:26:58.7198594Z 2026-10-25T02:26:58.7198799Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T02:26:58.7199154Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:1238:23] 2026-10-25T02:26:58.7199387Z 1237 │ { 2026-10-25T02:26:58.7206076Z ·  ────┬──── 2026-10-25T02:26:58.7206300Z · ╰── This is the containing effect 2026-10-25T02:26:58.7206564Z 30 │ if (snapshot && snapshot !== live) setHeld({ key, snapshot }); 2026-10-25T02:26:58.7206808Z ·  ───┬─── 2026-10-25T02:26:58.7207125Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7207382Z 31 │ }, [key, live, snapshot]); 2026-10-25T02:26:58.7207525Z ╰──── 2026-10-25T02:26:58.7208183Z  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-25T02:26:58.7209059Z  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-25T02:26:58.7209369Z 2026-10-25T02:26:58.7209630Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:26:58.7210038Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:264:5] 2026-10-25T02:26:58.7210326Z 262 │ const [snoozeWakeTick, bumpSnoozeWakeTick] = useState(0); 2026-10-25T02:26:58.7210529Z 263 │ useEffect(() => { 2026-10-25T02:26:58.7210685Z ·  ────┬──── 2026-10-25T02:26:58.7210900Z · ╰── This is the containing effect 2026-10-25T02:26:58.7211120Z 264 │ setNow(new Date().toISOString()); 2026-10-25T02:26:58.7211290Z ·  ───┬── 2026-10-25T02:26:58.7211537Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7211836Z 265 │ const id = setInterval(() => setNow(new Date().toISOString()), 60_000); 2026-10-25T02:26:58.7212107Z ╰──── 2026-10-25T02:26:58.7212793Z  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-25T02:26:58.7213653Z  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-25T02:26:58.7213964Z 2026-10-25T02:26:58.7214195Z ⚠ eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used. 2026-10-25T02:26:58.7214580Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:12:8] 2026-10-25T02:26:58.7214821Z 11 │ threadSearchMatchKey, 2026-10-25T02:26:58.7215007Z 12 │ type EnvironmentThreadSearchMatch, 2026-10-25T02:26:58.7215222Z ·  ──────────────┬───────────── 2026-10-25T02:26:58.7215513Z · ╰── 'EnvironmentThreadSearchMatch' is imported here 2026-10-25T02:26:58.7215798Z 13 │ } from "@t3tools/client-runtime/state/thread-search"; 2026-10-25T02:26:58.7216248Z ╰──── 2026-10-25T02:26:58.7216448Z  help: Consider removing this import. 2026-10-25T02:26:58.7216581Z 2026-10-25T02:26:58.7216817Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:26:58.7217202Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:320:25] 2026-10-25T02:26:58.7217594Z 319 │ // snoozeWakeTick re-arms clamped timers even when the wake date exceeds 32-bit setTimeout and stays unchanged. 2026-10-25T02:26:58.7218029Z 320 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-25T02:26:58.7218271Z ·  ───────┬────── 2026-10-25T02:26:58.7218565Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-25T02:26:58.7218837Z 321 │ const listItems: readonly SidebarListItem[] = 2026-10-25T02:26:58.7219015Z ╰──── 2026-10-25T02:26:58.7219386Z  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-25T02:26:58.7219997Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7220301Z 2026-10-25T02:26:58.7220788Z ⚠ 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-25T02:26:58.7221386Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1742:7] 2026-10-25T02:26:58.7221646Z 1741 │ yield* harness.replaceSession; 2026-10-25T02:26:58.7221984Z 1742 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T02:26:58.7222343Z 1743 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) { 2026-10-25T02:26:58.7222612Z 1744 │ │ break; 2026-10-25T02:26:58.7222803Z 1745 │ │ } 2026-10-25T02:26:58.7223020Z 1746 │ │ yield* Effect.yieldNow; 2026-10-25T02:26:58.7223419Z 1747 │ ╰─▶ } 2026-10-25T02:26:58.7223679Z 1748 │ yield* Queue.offer( 2026-10-25T02:26:58.7223828Z ╰──── 2026-10-25T02:26:58.7223888Z 2026-10-25T02:26:58.7224369Z ⚠ 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-25T02:26:58.7224953Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1851:7] 2026-10-25T02:26:58.7225220Z 1850 │ yield* harness.replaceSession; 2026-10-25T02:26:58.7225761Z 1851 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T02:26:58.7226155Z 1852 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break; 2026-10-25T02:26:58.7226430Z 1853 │ │ yield* Effect.yieldNow; 2026-10-25T02:26:58.7226691Z 1854 │ ╰─▶ } 2026-10-25T02:26:58.7226962Z 1855 │ expect(yield* Ref.get(harness.subscriptionCount)).toBe(2); 2026-10-25T02:26:58.7227162Z ╰──── 2026-10-25T02:26:58.7227223Z 2026-10-25T02:26:58.7227396Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T02:26:58.7227727Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:699:76] 2026-10-25T02:26:58.7228078Z 698 │ const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() })); 2026-10-25T02:26:58.7228435Z 699 │ if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() }); 2026-10-25T02:26:58.7228760Z ·  ─────┬──── 2026-10-25T02:26:58.7229088Z · ╰── Cannot call impure function 2026-10-25T02:26:58.7229400Z 700 │ const snoozeGateNow = new Date(snoozeGateClock.now).toISOString(); 2026-10-25T02:26:58.7229600Z ╰──── 2026-10-25T02:26:58.7229954Z  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-25T02:26:58.7230524Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T02:26:58.7230810Z 2026-10-25T02:26:58.7230986Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T02:26:58.7231317Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:720:71] 2026-10-25T02:26:58.7231568Z 719 │ const snoozePresets = useMemo( 2026-10-25T02:26:58.7231852Z 720 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-25T02:26:58.7232173Z ·  ─────┬──── 2026-10-25T02:26:58.7232490Z · ╰── Cannot call impure function 2026-10-25T02:26:58.7232781Z 721 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-25T02:26:58.7232967Z ╰──── 2026-10-25T02:26:58.7233400Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T02:26:58.7234012Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T02:26:58.7234301Z 2026-10-25T02:26:58.7234486Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-25T02:26:58.7234821Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:721:6] 2026-10-25T02:26:58.7235164Z 720 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-25T02:26:58.7235463Z 721 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-25T02:26:58.7235699Z ·  ────────────┬─────────── 2026-10-25T02:26:58.7236014Z · ╰── Unnecessary dependency `props.snoozePresetMinute` 2026-10-25T02:26:58.7236261Z 722 │ ); 2026-10-25T02:26:58.7236381Z ╰──── 2026-10-25T02:26:58.7236760Z  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-25T02:26:58.7237365Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7237663Z 2026-10-25T02:26:58.7237847Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-25T02:26:58.7238185Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:767:7] 2026-10-25T02:26:58.7238424Z 766 │ thread.pinnedAt, 2026-10-25T02:26:58.7238579Z 767 │ variant, 2026-10-25T02:26:58.7238733Z ·  ───┬─── 2026-10-25T02:26:58.7238970Z · ╰── Unnecessary dependency `variant` 2026-10-25T02:26:58.7239176Z 768 │ ], 2026-10-25T02:26:58.7239294Z ╰──── 2026-10-25T02:26:58.7239656Z  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-25T02:26:58.7240260Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7240559Z 2026-10-25T02:26:58.7240757Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T02:26:58.7241113Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1216:21] 2026-10-25T02:26:58.7241422Z 1215 │ {providerDrivers.slice(0, -1).map((driver, index) => ( 2026-10-25T02:26:58.7241698Z 1216 │ 2026-10-25T02:26:58.7241963Z ·  ────────────────────────── 2026-10-25T02:26:58.7242195Z 1217 │ 2026-10-25T02:26:58.7242375Z ╰──── 2026-10-25T02:26:58.7242584Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-25T02:26:58.7242742Z 2026-10-25T02:26:58.7242889Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.7243204Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:120:38] 2026-10-25T02:26:58.7243538Z 119 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-25T02:26:58.7243905Z 120 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-25T02:26:58.7244203Z ·  ───────────┬────────── 2026-10-25T02:26:58.7244511Z · ╰── Cannot access ref value during render 2026-10-25T02:26:58.7244800Z 121 │ const sessionRef = useRef(null); 2026-10-25T02:26:58.7244991Z ╰──── 2026-10-25T02:26:58.7245521Z  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-25T02:26:58.7246560Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.7246863Z 2026-10-25T02:26:58.7247057Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.7247404Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:124:8] 2026-10-25T02:26:58.7247629Z 123 │ 2026-10-25T02:26:58.7247813Z 124 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-25T02:26:58.7248036Z ·  ─────────┬──────── 2026-10-25T02:26:58.7248311Z · ╰── Cannot access ref value during render 2026-10-25T02:26:58.7248570Z 125 │ const recorder = createLazyVoiceRecorder({ 2026-10-25T02:26:58.7248749Z ╰──── 2026-10-25T02:26:58.7249295Z  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-25T02:26:58.7250033Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.7250320Z 2026-10-25T02:26:58.7250469Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.7250794Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:124:7] 2026-10-25T02:26:58.7251015Z 123 │ 2026-10-25T02:26:58.7251190Z 124 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-25T02:26:58.7251404Z ·  ─────────┬───────── 2026-10-25T02:26:58.7251659Z · ╰── Cannot access ref value during render 2026-10-25T02:26:58.7251913Z 125 │ const recorder = createLazyVoiceRecorder({ 2026-10-25T02:26:58.7252086Z ╰──── 2026-10-25T02:26:58.7252774Z  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-25T02:26:58.7253625Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.7253905Z 2026-10-25T02:26:58.7254057Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.7254370Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:124:31] 2026-10-25T02:26:58.7254591Z 123 │ 2026-10-25T02:26:58.7254762Z 124 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-25T02:26:58.7255006Z ·  ─────────┬───────── 2026-10-25T02:26:58.7255299Z · ╰── Cannot access ref value during render 2026-10-25T02:26:58.7255563Z 125 │ const recorder = createLazyVoiceRecorder({ 2026-10-25T02:26:58.7255731Z ╰──── 2026-10-25T02:26:58.7256318Z  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-25T02:26:58.7257028Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.7257301Z 2026-10-25T02:26:58.7257449Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.7257764Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:124:30] 2026-10-25T02:26:58.7257982Z 123 │ 2026-10-25T02:26:58.7258154Z 124 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-25T02:26:58.7258388Z ·  ──────────┬───────── 2026-10-25T02:26:58.7258674Z · ╰── Cannot access ref value during render 2026-10-25T02:26:58.7258938Z 125 │ const recorder = createLazyVoiceRecorder({ 2026-10-25T02:26:58.7259104Z ╰──── 2026-10-25T02:26:58.7259625Z  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-25T02:26:58.7260343Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.7260624Z 2026-10-25T02:26:58.7260769Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.7261084Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:125:46] 2026-10-25T02:26:58.7261367Z 124 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-25T02:26:58.7261699Z 125 │ ╭─▶ const recorder = createLazyVoiceRecorder({ 2026-10-25T02:26:58.7262071Z 126 │ │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-25T02:26:58.7262380Z 127 │ │ onStatus: (status: RecordingStatus) => { 2026-10-25T02:26:58.7262755Z 128 │ │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-25T02:26:58.7263202Z 129 │ │ isFinished: status.isFinished, 2026-10-25T02:26:58.7263518Z 130 │ │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-25T02:26:58.7263802Z 131 │ │ error: status.error, 2026-10-25T02:26:58.7264024Z 132 │ │ url: status.url, 2026-10-25T02:26:58.7264221Z 133 │ │ }); 2026-10-25T02:26:58.7264405Z 134 │ │ }, 2026-10-25T02:26:58.7264699Z 135 │ │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-25T02:26:58.7265004Z 136 │ │ selectInput: (inputs) => { 2026-10-25T02:26:58.7265421Z 137 │ │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-25T02:26:58.7265734Z 138 │ │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-25T02:26:58.7266089Z 139 │ │ const known = microphoneOrder(preferences.value.microphones); 2026-10-25T02:26:58.7266402Z 140 │ │ const order = rememberMicrophones(known, inputs); 2026-10-25T02:26:58.7266652Z 141 │ │ if (order !== known) { 2026-10-25T02:26:58.7266902Z 142 │ │ registry.set(updateMobilePreferencesAtom, { 2026-10-25T02:26:58.7267162Z 143 │ │ transform: (current) => ({ 2026-10-25T02:26:58.7267494Z 144 │ │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-25T02:26:58.7267782Z 145 │ │ }), 2026-10-25T02:26:58.7267968Z 146 │ │ }); 2026-10-25T02:26:58.7268142Z 147 │ │ } 2026-10-25T02:26:58.7268377Z 148 │ │ return preferredMicrophoneInput(inputs, order); 2026-10-25T02:26:58.7268606Z 149 │ │ }, 2026-10-25T02:26:58.7268832Z 150 │ ├─▶ }); 2026-10-25T02:26:58.7269213Z · ╰──── Passing a ref to a function may read its value during render 2026-10-25T02:26:58.7269520Z 151 │ recorderRef.current = recorder; 2026-10-25T02:26:58.7269680Z ╰──── 2026-10-25T02:26:58.7270214Z  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-25T02:26:58.7270934Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.7271215Z 2026-10-25T02:26:58.7271360Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.7271670Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:151:16] 2026-10-25T02:26:58.7271890Z 150 │ }); 2026-10-25T02:26:58.7272040Z 151 │ recorderRef.current = recorder; 2026-10-25T02:26:58.7272256Z ·  ─────┬─────────┬─── 2026-10-25T02:26:58.7272565Z · │ ╰── Cannot update ref value during render 2026-10-25T02:26:58.7272955Z · ╰── This value is a ref 2026-10-25T02:26:58.7273348Z 152 │ sessionRef.current = new VoiceInputSession({ 2026-10-25T02:26:58.7273521Z ╰──── 2026-10-25T02:26:58.7274037Z  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-25T02:26:58.7274740Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.7275018Z 2026-10-25T02:26:58.7275164Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.7275476Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:152:48] 2026-10-25T02:26:58.7275730Z 151 │ recorderRef.current = recorder; 2026-10-25T02:26:58.7276066Z 152 │ ╭─▶ sessionRef.current = new VoiceInputSession({ 2026-10-25T02:26:58.7276338Z 153 │ │ recorder, 2026-10-25T02:26:58.7276565Z 154 │ │ getTranscriber: getLocalVoiceTranscriber, 2026-10-25T02:26:58.7276824Z 155 │ │ requestPermission: async () => { 2026-10-25T02:26:58.7277115Z 156 │ │ const permission = await requestRecordingPermissionsAsync(); 2026-10-25T02:26:58.7277473Z 157 │ │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-25T02:26:58.7277739Z 158 │ │ }, 2026-10-25T02:26:58.7277983Z 159 │ │ configureRecording: configureVoiceRecordingAudio, 2026-10-25T02:26:58.7278268Z 160 │ │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-25T02:26:58.7278547Z 161 │ │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-25T02:26:58.7278798Z 162 │ │ onStateChange: (nextState) => 2026-10-25T02:26:58.7279012Z 163 │ │ setState({ 2026-10-25T02:26:58.7279216Z 164 │ │ state: nextState, 2026-10-25T02:26:58.7279464Z 165 │ │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-25T02:26:58.7279742Z 166 │ │ label: sessionRef.current?.label ?? null, 2026-10-25T02:26:58.7279959Z 167 │ │ }), 2026-10-25T02:26:58.7280192Z 168 │ ├─▶ }); 2026-10-25T02:26:58.7280528Z · ╰──── Cannot access ref value during render 2026-10-25T02:26:58.7280771Z 169 │ } 2026-10-25T02:26:58.7280889Z ╰──── 2026-10-25T02:26:58.7281408Z  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-25T02:26:58.7282120Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.7282396Z 2026-10-25T02:26:58.7282540Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.7282913Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:152:15] 2026-10-25T02:26:58.7283326Z 151 │ recorderRef.current = recorder; 2026-10-25T02:26:58.7283530Z 152 │ sessionRef.current = new VoiceInputSession({ 2026-10-25T02:26:58.7283767Z ·  ─────┬────────┬─── 2026-10-25T02:26:58.7284065Z · │ ╰── Cannot update ref value during render 2026-10-25T02:26:58.7284355Z · ╰── This value is a ref 2026-10-25T02:26:58.7284544Z 153 │ recorder, 2026-10-25T02:26:58.7284673Z ╰──── 2026-10-25T02:26:58.7285194Z  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-25T02:26:58.7285945Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.7286222Z 2026-10-25T02:26:58.7286363Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.7286673Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:181:7] 2026-10-25T02:26:58.7286920Z 180 │ return () => subscription.remove(); 2026-10-25T02:26:58.7287092Z 181 │ }, [controller]); 2026-10-25T02:26:58.7287263Z ·  ─────┬──── 2026-10-25T02:26:58.7287501Z · ╰── Cannot access ref value during render 2026-10-25T02:26:58.7287704Z 182 │ 2026-10-25T02:26:58.7287817Z ╰──── 2026-10-25T02:26:58.7288332Z  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-25T02:26:58.7289044Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.7289318Z 2026-10-25T02:26:58.7289463Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.7289768Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:181:6] 2026-10-25T02:26:58.7290015Z 180 │ return () => subscription.remove(); 2026-10-25T02:26:58.7290180Z 181 │ }, [controller]); 2026-10-25T02:26:58.7290338Z ·  ──────┬───── 2026-10-25T02:26:58.7290576Z · ╰── Cannot access ref value during render 2026-10-25T02:26:58.7290773Z 182 │ 2026-10-25T02:26:58.7290885Z ╰──── 2026-10-25T02:26:58.7291393Z  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-25T02:26:58.7292100Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.7292376Z 2026-10-25T02:26:58.7292519Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.7292819Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:188:6] 2026-10-25T02:26:58.7293036Z 187 │ }, 2026-10-25T02:26:58.7293237Z 188 │ [controller, recorder], 2026-10-25T02:26:58.7293536Z ·  ─────┬──── 2026-10-25T02:26:58.7293788Z · ╰── Cannot access ref value during render 2026-10-25T02:26:58.7293984Z 189 │ ); 2026-10-25T02:26:58.7294100Z ╰──── 2026-10-25T02:26:58.7294607Z  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-25T02:26:58.7295308Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.7295582Z 2026-10-25T02:26:58.7295721Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.7296072Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:173:20] 2026-10-25T02:26:58.7296329Z 172 │ const controller = session.controller; 2026-10-25T02:26:58.7296525Z 173 │ const recorder = recorderRef.current; 2026-10-25T02:26:58.7296733Z ·  ─────────┬───────── 2026-10-25T02:26:58.7296998Z · ╰── Cannot access ref value during render 2026-10-25T02:26:58.7297199Z 174 │ 2026-10-25T02:26:58.7297306Z ╰──── 2026-10-25T02:26:58.7297814Z  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-25T02:26:58.7298520Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.7298802Z 2026-10-25T02:26:58.7298944Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.7299252Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:188:5] 2026-10-25T02:26:58.7299468Z 187 │ }, 2026-10-25T02:26:58.7299609Z 188 │ [controller, recorder], 2026-10-25T02:26:58.7299788Z ·  ───────────┬────────── 2026-10-25T02:26:58.7300037Z · ╰── Cannot access ref value during render 2026-10-25T02:26:58.7300239Z 189 │ ); 2026-10-25T02:26:58.7300353Z ╰──── 2026-10-25T02:26:58.7300874Z  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-25T02:26:58.7301578Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.7301894Z 2026-10-25T02:26:58.7302039Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.7302349Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:242:20] 2026-10-25T02:26:58.7302603Z 241 │ return () => clearInterval(intervalId); 2026-10-25T02:26:58.7302827Z 242 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-25T02:26:58.7303039Z ·  ─────┬──── 2026-10-25T02:26:58.7303358Z · ╰── Cannot access ref value during render 2026-10-25T02:26:58.7303728Z 243 │ 2026-10-25T02:26:58.7303843Z ╰──── 2026-10-25T02:26:58.7304355Z  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-25T02:26:58.7305051Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.7305872Z 2026-10-25T02:26:58.7306036Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.7306343Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:242:6] 2026-10-25T02:26:58.7306594Z 241 │ return () => clearInterval(intervalId); 2026-10-25T02:26:58.7306818Z 242 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-25T02:26:58.7307080Z ·  ────────────────────────┬─────────────────────── 2026-10-25T02:26:58.7307367Z · ╰── Cannot access ref value during render 2026-10-25T02:26:58.7307578Z 243 │ 2026-10-25T02:26:58.7307688Z ╰──── 2026-10-25T02:26:58.7308201Z  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-25T02:26:58.7308901Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.7309178Z 2026-10-25T02:26:58.7309327Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.7309634Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:257:5] 2026-10-25T02:26:58.7309867Z 256 │ setOwnerFocused, 2026-10-25T02:26:58.7310013Z 257 │ session, 2026-10-25T02:26:58.7310160Z ·  ───┬─── 2026-10-25T02:26:58.7310384Z · ╰── Cannot access ref value during render 2026-10-25T02:26:58.7310589Z 258 │ stop, 2026-10-25T02:26:58.7310712Z ╰──── 2026-10-25T02:26:58.7311229Z  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-25T02:26:58.7312013Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.7312463Z 2026-10-25T02:26:58.7312610Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.7312912Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:247:10] 2026-10-25T02:26:58.7313133Z 246 │ 2026-10-25T02:26:58.7313337Z 247 │ ╭─▶ return { 2026-10-25T02:26:58.7313691Z 248 │ │ isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null, 2026-10-25T02:26:58.7313973Z 249 │ │ state, 2026-10-25T02:26:58.7314164Z 250 │ │ audioLevels, 2026-10-25T02:26:58.7314362Z 251 │ │ elapsedSeconds, 2026-10-25T02:26:58.7314608Z 252 │ │ isBusy: voiceInputBlocksSubmission(state), 2026-10-25T02:26:58.7314835Z 253 │ │ ownerKey, 2026-10-25T02:26:58.7315013Z 254 │ │ label, 2026-10-25T02:26:58.7315200Z 255 │ │ focusedOwners, 2026-10-25T02:26:58.7315401Z 256 │ │ setOwnerFocused, 2026-10-25T02:26:58.7315596Z 257 │ │ session, 2026-10-25T02:26:58.7315771Z 258 │ │ stop, 2026-10-25T02:26:58.7315980Z 259 │ │ cancel, 2026-10-25T02:26:58.7316207Z 260 │ ├─▶ }; 2026-10-25T02:26:58.7316545Z · ╰──── Cannot access ref value during render 2026-10-25T02:26:58.7316788Z 261 │ } 2026-10-25T02:26:58.7316915Z ╰──── 2026-10-25T02:26:58.7317432Z  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-25T02:26:58.7318136Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.7318411Z 2026-10-25T02:26:58.7318570Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:26:58.7318886Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:208:7] 2026-10-25T02:26:58.7319208Z 119 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-25T02:26:58.7319502Z 120 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-25T02:26:58.7319718Z ·  ─────┬───── 2026-10-25T02:26:58.7319949Z · ╰── `audioLevels` originates here 2026-10-25T02:26:58.7320209Z 121 │ const sessionRef = useRef(null); 2026-10-25T02:26:58.7320487Z 122 │ const recorderRef = useRef | null>(null); 2026-10-25T02:26:58.7320695Z 123 │ 2026-10-25T02:26:58.7320862Z 124 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-25T02:26:58.7321083Z 125 │ const recorder = createLazyVoiceRecorder({ 2026-10-25T02:26:58.7321339Z 126 │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-25T02:26:58.7321581Z 127 │ onStatus: (status: RecordingStatus) => { 2026-10-25T02:26:58.7321883Z 128 │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-25T02:26:58.7322272Z 129 │ isFinished: status.isFinished, 2026-10-25T02:26:58.7322519Z 130 │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-25T02:26:58.7322748Z 131 │ error: status.error, 2026-10-25T02:26:58.7322912Z 132 │ url: status.url, 2026-10-25T02:26:58.7323062Z 133 │ }); 2026-10-25T02:26:58.7323187Z 134 │ }, 2026-10-25T02:26:58.7323416Z 135 │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-25T02:26:58.7323662Z 136 │ selectInput: (inputs) => { 2026-10-25T02:26:58.7323883Z 137 │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-25T02:26:58.7324136Z 138 │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-25T02:26:58.7324398Z 139 │ const known = microphoneOrder(preferences.value.microphones); 2026-10-25T02:26:58.7324657Z 140 │ const order = rememberMicrophones(known, inputs); 2026-10-25T02:26:58.7324855Z 141 │ if (order !== known) { 2026-10-25T02:26:58.7325057Z 142 │ registry.set(updateMobilePreferencesAtom, { 2026-10-25T02:26:58.7325262Z 143 │ transform: (current) => ({ 2026-10-25T02:26:58.7325535Z 144 │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-25T02:26:58.7325773Z 145 │ }), 2026-10-25T02:26:58.7325966Z 146 │ }); 2026-10-25T02:26:58.7326097Z 147 │ } 2026-10-25T02:26:58.7326274Z 148 │ return preferredMicrophoneInput(inputs, order); 2026-10-25T02:26:58.7326455Z 149 │ }, 2026-10-25T02:26:58.7326576Z 150 │ }); 2026-10-25T02:26:58.7326725Z 151 │ recorderRef.current = recorder; 2026-10-25T02:26:58.7326934Z 152 │ sessionRef.current = new VoiceInputSession({ 2026-10-25T02:26:58.7327119Z 153 │ recorder, 2026-10-25T02:26:58.7327293Z 154 │ getTranscriber: getLocalVoiceTranscriber, 2026-10-25T02:26:58.7327493Z 155 │ requestPermission: async () => { 2026-10-25T02:26:58.7327727Z 156 │ const permission = await requestRecordingPermissionsAsync(); 2026-10-25T02:26:58.7328024Z 157 │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-25T02:26:58.7328245Z 158 │ }, 2026-10-25T02:26:58.7328420Z 159 │ configureRecording: configureVoiceRecordingAudio, 2026-10-25T02:26:58.7328653Z 160 │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-25T02:26:58.7328876Z 161 │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-25T02:26:58.7329076Z 162 │ onStateChange: (nextState) => 2026-10-25T02:26:58.7329248Z 163 │ setState({ 2026-10-25T02:26:58.7329411Z 164 │ state: nextState, 2026-10-25T02:26:58.7329613Z 165 │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-25T02:26:58.7329834Z 166 │ label: sessionRef.current?.label ?? null, 2026-10-25T02:26:58.7330010Z 167 │ }), 2026-10-25T02:26:58.7330136Z 168 │ }); 2026-10-25T02:26:58.7330259Z 169 │ } 2026-10-25T02:26:58.7330372Z 170 │ 2026-10-25T02:26:58.7330518Z 171 │ const session = sessionRef.current; 2026-10-25T02:26:58.7330710Z 172 │ const controller = session.controller; 2026-10-25T02:26:58.7330903Z 173 │ const recorder = recorderRef.current; 2026-10-25T02:26:58.7331059Z 174 │ 2026-10-25T02:26:58.7331185Z 175 │ useEffect(() => { 2026-10-25T02:26:58.7331423Z 176 │ const subscription = AppState.addEventListener("change", (nextState) => { 2026-10-25T02:26:58.7331895Z 177 │ // iOS permission dialogs report inactive; cancel preparation only on background. Recorder status handles capture interruptions. 2026-10-25T02:26:58.7332460Z 178 │ if (nextState === "background") controller.appMovedToBackground(); 2026-10-25T02:26:58.7332665Z 179 │ }); 2026-10-25T02:26:58.7332817Z 180 │ return () => subscription.remove(); 2026-10-25T02:26:58.7332986Z 181 │ }, [controller]); 2026-10-25T02:26:58.7333125Z 182 │ 2026-10-25T02:26:58.7333247Z 183 │ useEffect( 2026-10-25T02:26:58.7333385Z 184 │ () => () => { 2026-10-25T02:26:58.7333535Z 185 │ controller.dispose(); 2026-10-25T02:26:58.7333695Z 186 │ recorder.release(); 2026-10-25T02:26:58.7333841Z 187 │ }, 2026-10-25T02:26:58.7333977Z 188 │ [controller, recorder], 2026-10-25T02:26:58.7334121Z 189 │ ); 2026-10-25T02:26:58.7334234Z 190 │ 2026-10-25T02:26:58.7334358Z 191 │ useEffect(() => { 2026-10-25T02:26:58.7334540Z 192 │ if (state.phase !== "recording") return; 2026-10-25T02:26:58.7334704Z 193 │ 2026-10-25T02:26:58.7334913Z 194 │ const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`; 2026-10-25T02:26:58.7335176Z 195 │ const activation = activateKeepAwakeAsync(tag); 2026-10-25T02:26:58.7335380Z 196 │ void activation.catch(() => {}); 2026-10-25T02:26:58.7335544Z 197 │ return () => { 2026-10-25T02:26:58.7335777Z 198 │ // Release after activation settles, even if the recording ends immediately. 2026-10-25T02:26:58.7336122Z 199 │ void activation.then(() => deactivateKeepAwake(tag)).catch(() => {}); 2026-10-25T02:26:58.7336331Z 200 │ }; 2026-10-25T02:26:58.7336475Z 201 │ }, [keepAwakeId, state.phase]); 2026-10-25T02:26:58.7336631Z 202 │ 2026-10-25T02:26:58.7336754Z 203 │ useEffect(() => { 2026-10-25T02:26:58.7336974Z 204 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-25T02:26:58.7337177Z 205 │ 2026-10-25T02:26:58.7337360Z 206 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-25T02:26:58.7337652Z 207 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-25T02:26:58.7337921Z 208 │ audioLevels.value = audioLevelsRef.current; 2026-10-25T02:26:58.7338124Z ·  ─────┬───── 2026-10-25T02:26:58.7338360Z · ╰── `audioLevels` cannot be modified 2026-10-25T02:26:58.7338562Z 209 │ } 2026-10-25T02:26:58.7338682Z ╰──── 2026-10-25T02:26:58.7339009Z  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-25T02:26:58.7339574Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:26:58.7339870Z 2026-10-25T02:26:58.7340074Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-25T02:26:58.7340426Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:208:7] 2026-10-25T02:26:58.7340643Z 202 │ 2026-10-25T02:26:58.7340767Z 203 │ useEffect(() => { 2026-10-25T02:26:58.7340933Z ·  ───┬─── 2026-10-25T02:26:58.7341248Z · ╰── This function may (indirectly) reassign or modify `audioLevels` after render 2026-10-25T02:26:58.7341588Z 204 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-25T02:26:58.7341789Z 205 │ 2026-10-25T02:26:58.7341972Z 206 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-25T02:26:58.7342341Z 207 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-25T02:26:58.7342768Z 208 │ audioLevels.value = audioLevelsRef.current; 2026-10-25T02:26:58.7342970Z ·  ─────┬───── 2026-10-25T02:26:58.7343196Z · ╰── This modifies `audioLevels` 2026-10-25T02:26:58.7343389Z 209 │ } 2026-10-25T02:26:58.7343509Z ╰──── 2026-10-25T02:26:58.7343907Z  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-25T02:26:58.7344521Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:26:58.7344814Z 2026-10-25T02:26:58.7345011Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-25T02:26:58.7345426Z ╭─[packages/client-runtime/src/state/shell.ts:203:5] 2026-10-25T02:26:58.7345673Z 200 │ let waiting = yield* Ref.get(awaitingCompletion); 2026-10-25T02:26:58.7345909Z 201 │ let next = initial; 2026-10-25T02:26:58.7346081Z ·  ──┬─ 2026-10-25T02:26:58.7346290Z · ╰── From this accumulator 2026-10-25T02:26:58.7346502Z 202 │ let receivedSnapshot = false; 2026-10-25T02:26:58.7346676Z 203 │ for (const item of items) { 2026-10-25T02:26:58.7346839Z ·  ─┬─ 2026-10-25T02:26:58.7347029Z · ╰── For this loop 2026-10-25T02:26:58.7347234Z 204 │ if (item.kind === "synchronized") { 2026-10-25T02:26:58.7347418Z 205 │ waiting = false; 2026-10-25T02:26:58.7347599Z 206 │ if (Option.isSome(next.snapshot)) { 2026-10-25T02:26:58.7347830Z 207 │ next = { ...next, status: "live", error: Option.none() }; 2026-10-25T02:26:58.7348049Z ·  ───┬─── 2026-10-25T02:26:58.7348282Z · ╰── From this spread 2026-10-25T02:26:58.7348471Z 208 │ } 2026-10-25T02:26:58.7348591Z ╰──── 2026-10-25T02:26:58.7348806Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-25T02:26:58.7349126Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-25T02:26:58.7349295Z 2026-10-25T02:26:58.7349454Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:26:58.7349785Z ╭─[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5] 2026-10-25T02:26:58.7350070Z 65 │ const [expanded, setExpanded] = useState(false); 2026-10-25T02:26:58.7350271Z 66 │ const progress = useSharedValue(0); 2026-10-25T02:26:58.7350452Z ·  ────┬─── 2026-10-25T02:26:58.7350679Z · ╰── `progress` originates here 2026-10-25T02:26:58.7350884Z 67 │ useEffect(() => { 2026-10-25T02:26:58.7351093Z 68 │ progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING); 2026-10-25T02:26:58.7351302Z ·  ────┬─── 2026-10-25T02:26:58.7351523Z · ╰── `progress` cannot be modified 2026-10-25T02:26:58.7351734Z 69 │ }, [expanded, progress]); 2026-10-25T02:26:58.7351877Z ╰──── 2026-10-25T02:26:58.7352279Z  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-25T02:26:58.7353014Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:26:58.7353304Z 2026-10-25T02:26:58.7353562Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:26:58.7353951Z ╭─[packages/provider-opencode/src/server/adapter.ts:3719:7] 2026-10-25T02:26:58.7354158Z 3718 │ 2026-10-25T02:26:58.7354427Z 3719 │ const layer: Layer.Layer = 2026-10-25T02:26:58.7354706Z ·  ──┬── 2026-10-25T02:26:58.7354922Z · ╰── 'layer' is declared here 2026-10-25T02:26:58.7355127Z 3720 │ Layer.effect( 2026-10-25T02:26:58.7355265Z ╰──── 2026-10-25T02:26:58.7355428Z  help: Consider removing this declaration. 2026-10-25T02:26:58.7355549Z 2026-10-25T02:26:58.7355810Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:26:58.7356244Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:52:5] 2026-10-25T02:26:58.7356457Z 50 │ 2026-10-25T02:26:58.7356581Z 51 │ useEffect(() => { 2026-10-25T02:26:58.7356737Z ·  ────┬──── 2026-10-25T02:26:58.7356952Z · ╰── This is the containing effect 2026-10-25T02:26:58.7357157Z 52 │ setDecodedSize(null); 2026-10-25T02:26:58.7357323Z ·  ───────┬────── 2026-10-25T02:26:58.7357592Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7357836Z 53 │ }, [props.sourceKey]); 2026-10-25T02:26:58.7357975Z ╰──── 2026-10-25T02:26:58.7358630Z  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-25T02:26:58.7359479Z  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-25T02:26:58.7359785Z 2026-10-25T02:26:58.7360043Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:26:58.7360438Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:56:5] 2026-10-25T02:26:58.7360651Z 54 │ 2026-10-25T02:26:58.7360774Z 55 │ useEffect(() => { 2026-10-25T02:26:58.7360936Z ·  ────┬──── 2026-10-25T02:26:58.7361148Z · ╰── This is the containing effect 2026-10-25T02:26:58.7361352Z 56 │ setFailedUri(null); 2026-10-25T02:26:58.7361511Z ·  ──────┬───── 2026-10-25T02:26:58.7361770Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7362002Z 57 │ }, [props.uri]); 2026-10-25T02:26:58.7362138Z ╰──── 2026-10-25T02:26:58.7362861Z  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-25T02:26:58.7363877Z  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-25T02:26:58.7364178Z 2026-10-25T02:26:58.7364391Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-25T02:26:58.7364749Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10] 2026-10-25T02:26:58.7365031Z 6 │ import { parse, SvgAst, type JsxAST } from "react-native-svg"; 2026-10-25T02:26:58.7365345Z 7 │ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native"; 2026-10-25T02:26:58.7365617Z ·  ────────┬──────── 2026-10-25T02:26:58.7365915Z · ╰── 'ActivityIndicator' is imported here 2026-10-25T02:26:58.7366119Z 8 │ 2026-10-25T02:26:58.7366233Z ╰──── 2026-10-25T02:26:58.7366387Z  help: Consider removing this import. 2026-10-25T02:26:58.7366502Z 2026-10-25T02:26:58.7366706Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:26:58.7373087Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:53:7] 2026-10-25T02:26:58.7373323Z 52 │ setDecodedSize(null); 2026-10-25T02:26:58.7373479Z 53 │ }, [props.sourceKey]); 2026-10-25T02:26:58.7373646Z ·  ───────┬─────── 2026-10-25T02:26:58.7373896Z · ╰── Unnecessary dependency `props.sourceKey` 2026-10-25T02:26:58.7374099Z 54 │ 2026-10-25T02:26:58.7374215Z ╰──── 2026-10-25T02:26:58.7374562Z  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-25T02:26:58.7375143Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7375437Z 2026-10-25T02:26:58.7375634Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:26:58.7376017Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:57:7] 2026-10-25T02:26:58.7376238Z 56 │ setFailedUri(null); 2026-10-25T02:26:58.7376386Z 57 │ }, [props.uri]); 2026-10-25T02:26:58.7376537Z ·  ────┬──── 2026-10-25T02:26:58.7376865Z · ╰── Unnecessary dependency `props.uri` 2026-10-25T02:26:58.7377187Z 58 │ 2026-10-25T02:26:58.7377296Z ╰──── 2026-10-25T02:26:58.7377636Z  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-25T02:26:58.7378215Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7378505Z 2026-10-25T02:26:58.7378664Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:26:58.7378990Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5] 2026-10-25T02:26:58.7379214Z 90 │ }) { 2026-10-25T02:26:58.7379391Z 91 │ const rotation = useSharedValue(props.hidden ? 1 : 0); 2026-10-25T02:26:58.7379597Z ·  ────┬─── 2026-10-25T02:26:58.7379819Z · ╰── `rotation` originates here 2026-10-25T02:26:58.7380024Z 92 │ useLayoutEffect(() => { 2026-10-25T02:26:58.7380252Z 93 │ rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING); 2026-10-25T02:26:58.7380473Z ·  ────┬─── 2026-10-25T02:26:58.7380689Z · ╰── `rotation` cannot be modified 2026-10-25T02:26:58.7380902Z 94 │ }, [props.hidden, rotation]); 2026-10-25T02:26:58.7381048Z ╰──── 2026-10-25T02:26:58.7381375Z  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-25T02:26:58.7381938Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:26:58.7382232Z 2026-10-25T02:26:58.7382391Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:26:58.7382715Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:266:5] 2026-10-25T02:26:58.7382984Z 263 │ const variant = props.variant ?? "plain"; 2026-10-25T02:26:58.7383228Z 264 │ const loadingVisibility = useSharedValue(props.loading ? 1 : 0); 2026-10-25T02:26:58.7383457Z ·  ────────┬──────── 2026-10-25T02:26:58.7383705Z · ╰── `loadingVisibility` originates here 2026-10-25T02:26:58.7383921Z 265 │ useLayoutEffect(() => { 2026-10-25T02:26:58.7384168Z 266 │ loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING); 2026-10-25T02:26:58.7384420Z ·  ────────┬──────── 2026-10-25T02:26:58.7384668Z · ╰── `loadingVisibility` cannot be modified 2026-10-25T02:26:58.7384904Z 267 │ }, [loadingVisibility, props.loading]); 2026-10-25T02:26:58.7385065Z ╰──── 2026-10-25T02:26:58.7385576Z  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-25T02:26:58.7386526Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:26:58.7386891Z 2026-10-25T02:26:58.7387087Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:26:58.7387493Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:325:5] 2026-10-25T02:26:58.7387881Z 322 │ }) { 2026-10-25T02:26:58.7388219Z 323 │ const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0); 2026-10-25T02:26:58.7388538Z ·  ─────────┬───────── 2026-10-25T02:26:58.7388855Z · ╰── `recordingVisibility` originates here 2026-10-25T02:26:58.7389132Z 324 │ useLayoutEffect(() => { 2026-10-25T02:26:58.7389478Z 325 │ recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING); 2026-10-25T02:26:58.7389820Z ·  ─────────┬───────── 2026-10-25T02:26:58.7390128Z · ╰── `recordingVisibility` cannot be modified 2026-10-25T02:26:58.7390426Z 326 │ }, [props.phase, recordingVisibility]); 2026-10-25T02:26:58.7390626Z ╰──── 2026-10-25T02:26:58.7391029Z  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-25T02:26:58.7391721Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:26:58.7392074Z 2026-10-25T02:26:58.7392257Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.7392652Z ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14] 2026-10-25T02:26:58.7392964Z 26 │ const latestInput = useRef(input); 2026-10-25T02:26:58.7393190Z 27 │ latestInput.current = input; 2026-10-25T02:26:58.7393446Z ·  ─────┬─────────┬─── 2026-10-25T02:26:58.7393816Z · │ ╰── Cannot update ref value during render 2026-10-25T02:26:58.7394180Z · ╰── This value is a ref 2026-10-25T02:26:58.7394427Z 28 │ const mounted = useRef(true); 2026-10-25T02:26:58.7394611Z ╰──── 2026-10-25T02:26:58.7395184Z  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-25T02:26:58.7395910Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.7396189Z 2026-10-25T02:26:58.7396652Z ⚠ 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-25T02:26:58.7397207Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:169:7] 2026-10-25T02:26:58.7397426Z 168 │ }); 2026-10-25T02:26:58.7397697Z 169 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-25T02:26:58.7398070Z 170 │ │ if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break; 2026-10-25T02:26:58.7398363Z 171 │ │ yield* Effect.yieldNow; 2026-10-25T02:26:58.7398614Z 172 │ ╰─▶ } 2026-10-25T02:26:58.7398803Z 173 │ 2026-10-25T02:26:58.7398917Z ╰──── 2026-10-25T02:26:58.7398974Z 2026-10-25T02:26:58.7399508Z ⚠ 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-25T02:26:58.7400097Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:178:7] 2026-10-25T02:26:58.7400359Z 177 │ yield* Deferred.succeed(releaseSave, undefined); 2026-10-25T02:26:58.7400670Z 178 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-25T02:26:58.7400982Z 179 │ │ if ((yield* Ref.get(saved)).length > 0) break; 2026-10-25T02:26:58.7401223Z 180 │ │ yield* Effect.yieldNow; 2026-10-25T02:26:58.7401469Z 181 │ ╰─▶ } 2026-10-25T02:26:58.7401654Z 182 │ 2026-10-25T02:26:58.7401768Z ╰──── 2026-10-25T02:26:58.7401830Z 2026-10-25T02:26:58.7402284Z ⚠ 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-25T02:26:58.7403222Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7] 2026-10-25T02:26:58.7403497Z 306 │ yield* Deferred.succeed(releaseUnenrichedSave, undefined); 2026-10-25T02:26:58.7403825Z 307 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-25T02:26:58.7404124Z 308 │ │ const values = yield* Ref.get(saved); 2026-10-25T02:26:58.7404450Z 309 │ │ if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) { 2026-10-25T02:26:58.7404730Z 310 │ │ break; 2026-10-25T02:26:58.7404915Z 311 │ │ } 2026-10-25T02:26:58.7405111Z 312 │ │ yield* Effect.yieldNow; 2026-10-25T02:26:58.7405360Z 313 │ ╰─▶ } 2026-10-25T02:26:58.7405546Z 314 │ 2026-10-25T02:26:58.7405658Z ╰──── 2026-10-25T02:26:58.7405711Z 2026-10-25T02:26:58.7405967Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:26:58.7406312Z ╭─[apps/mobile/src/features/connection/ConnectionStatusDot.tsx:58:7] 2026-10-25T02:26:58.7406568Z 53 │ function usePulseAnimation(pulse: boolean) { 2026-10-25T02:26:58.7406771Z 54 │ const pulseProgress = useSharedValue(0); 2026-10-25T02:26:58.7406960Z ·  ──────┬────── 2026-10-25T02:26:58.7407204Z · ╰── `pulseProgress` originates here 2026-10-25T02:26:58.7407407Z 55 │ 2026-10-25T02:26:58.7407530Z 56 │ useEffect(() => { 2026-10-25T02:26:58.7407679Z 57 │ if (pulse) { 2026-10-25T02:26:58.7407842Z 58 │ pulseProgress.value = withRepeat( 2026-10-25T02:26:58.7408028Z ·  ──────┬────── 2026-10-25T02:26:58.7408264Z · ╰── `pulseProgress` cannot be modified 2026-10-25T02:26:58.7408481Z 59 │ withTiming(1, { 2026-10-25T02:26:58.7408617Z ╰──── 2026-10-25T02:26:58.7408936Z  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-25T02:26:58.7409597Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:26:58.7409984Z 2026-10-25T02:26:58.7410159Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-25T02:26:58.7410521Z ╭─[packages/provider-opencode/src/server/OpenCodeRuntime.environment.test.ts:53:14] 2026-10-25T02:26:58.7410767Z 52 │ 2026-10-25T02:26:58.7410889Z 53 │ for (const {} of [ 2026-10-25T02:26:58.7411045Z ·  ── 2026-10-25T02:26:58.7411202Z 54 │ { healthy: true }, 2026-10-25T02:26:58.7411336Z ╰──── 2026-10-25T02:26:58.7411622Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-25T02:26:58.7411844Z 2026-10-25T02:26:58.7412315Z ⚠ 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-25T02:26:58.7412875Z ╭─[packages/client-runtime/src/rpc/session.test.ts:226:3] 2026-10-25T02:26:58.7413076Z 225 │ ) { 2026-10-25T02:26:58.7413352Z 226 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T02:26:58.7413653Z 227 │ │ const socket = sockets[index]; 2026-10-25T02:26:58.7413866Z 228 │ │ if (socket) { 2026-10-25T02:26:58.7414066Z 229 │ │ return socket; 2026-10-25T02:26:58.7414254Z 230 │ │ } 2026-10-25T02:26:58.7414449Z 231 │ │ yield* Effect.yieldNow; 2026-10-25T02:26:58.7414701Z 232 │ ╰─▶ } 2026-10-25T02:26:58.7415013Z 233 │ return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket.")); 2026-10-25T02:26:58.7415249Z ╰──── 2026-10-25T02:26:58.7415305Z 2026-10-25T02:26:58.7415768Z ⚠ 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-25T02:26:58.7416348Z ╭─[packages/client-runtime/src/rpc/session.test.ts:240:3] 2026-10-25T02:26:58.7416554Z 239 │ ) { 2026-10-25T02:26:58.7416819Z 240 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T02:26:58.7417230Z 241 │ │ const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index]; 2026-10-25T02:26:58.7417532Z 242 │ │ if (request) { 2026-10-25T02:26:58.7417736Z 243 │ │ return request; 2026-10-25T02:26:58.7417920Z 244 │ │ } 2026-10-25T02:26:58.7418116Z 245 │ │ yield* Effect.yieldNow; 2026-10-25T02:26:58.7418360Z 246 │ ╰─▶ } 2026-10-25T02:26:58.7418660Z 247 │ return yield* Effect.die(new Error("Expected the RPC protocol to send a request.")); 2026-10-25T02:26:58.7418882Z ╰──── 2026-10-25T02:26:58.7418939Z 2026-10-25T02:26:58.7419198Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:26:58.7419686Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:81:5] 2026-10-25T02:26:58.7420013Z 78 │ 2026-10-25T02:26:58.7420137Z 79 │ useEffect(() => { 2026-10-25T02:26:58.7420292Z ·  ────┬──── 2026-10-25T02:26:58.7420510Z · ╰── This is the containing effect 2026-10-25T02:26:58.7420773Z 80 │ const { host, code } = parsePairingUrl(connectionPairingUrl); 2026-10-25T02:26:58.7420980Z 81 │ setHostInput(host); 2026-10-25T02:26:58.7421143Z ·  ──────┬───── 2026-10-25T02:26:58.7421402Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7421635Z 82 │ setCodeInput(code); 2026-10-25T02:26:58.7421772Z ╰──── 2026-10-25T02:26:58.7422427Z  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-25T02:26:58.7423286Z  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-25T02:26:58.7423590Z 2026-10-25T02:26:58.7423844Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:26:58.7424257Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:91:5] 2026-10-25T02:26:58.7424483Z 84 │ 2026-10-25T02:26:58.7424605Z 85 │ useEffect(() => { 2026-10-25T02:26:58.7424758Z ·  ────┬──── 2026-10-25T02:26:58.7424976Z · ╰── This is the containing effect 2026-10-25T02:26:58.7425271Z 86 │ if (routePairingUrl.length === 0) { 2026-10-25T02:26:58.7425483Z 87 │ return; 2026-10-25T02:26:58.7425612Z 88 │ } 2026-10-25T02:26:58.7425726Z 89 │ 2026-10-25T02:26:58.7425929Z 90 │ const { host, code } = parsePairingUrl(routePairingUrl); 2026-10-25T02:26:58.7426124Z 91 │ setHostInput(host); 2026-10-25T02:26:58.7426286Z ·  ──────┬───── 2026-10-25T02:26:58.7426539Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7426769Z 92 │ setCodeInput(code); 2026-10-25T02:26:58.7426906Z ╰──── 2026-10-25T02:26:58.7427637Z  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-25T02:26:58.7428584Z  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-25T02:26:58.7428885Z 2026-10-25T02:26:58.7429139Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:26:58.7429542Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:97:7] 2026-10-25T02:26:58.7429768Z 94 │ 2026-10-25T02:26:58.7429888Z 95 │ useEffect(() => { 2026-10-25T02:26:58.7430042Z ·  ────┬──── 2026-10-25T02:26:58.7430253Z · ╰── This is the containing effect 2026-10-25T02:26:58.7430475Z 96 │ if (pairingConnectionError) { 2026-10-25T02:26:58.7430651Z 97 │ setIsSubmitting(false); 2026-10-25T02:26:58.7430823Z ·  ───────┬─────── 2026-10-25T02:26:58.7431092Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7431309Z 98 │ } 2026-10-25T02:26:58.7431423Z ╰──── 2026-10-25T02:26:58.7432062Z  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-25T02:26:58.7432904Z  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-25T02:26:58.7433205Z 2026-10-25T02:26:58.7433417Z ⚠ eslint(no-unused-vars): Identifier 'openSettings' is imported but never used. 2026-10-25T02:26:58.7433788Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:35:10] 2026-10-25T02:26:58.7434096Z 34 │ import { splitEnvironmentSections } from "./environmentSections"; 2026-10-25T02:26:58.7434366Z 35 │ import { openSettings } from "../settings/settings-navigation"; 2026-10-25T02:26:58.7434582Z ·  ──────┬───── 2026-10-25T02:26:58.7434816Z · ╰── 'openSettings' is imported here 2026-10-25T02:26:58.7435085Z 36 │ import { leaveSettingsPage } from "../settings/settings-navigation"; 2026-10-25T02:26:58.7435280Z ╰──── 2026-10-25T02:26:58.7435432Z  help: Consider removing this import. 2026-10-25T02:26:58.7435548Z 2026-10-25T02:26:58.7436071Z ⚠ 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-25T02:26:58.7436622Z ╭─[packages/client-runtime/src/rpc/client.test.ts:131:9] 2026-10-25T02:26:58.7436828Z 130 │ ) { 2026-10-25T02:26:58.7437112Z 131 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T02:26:58.7437433Z 132 │ │ if (subscriptions.length >= count) { 2026-10-25T02:26:58.7437657Z 133 │ │ return; 2026-10-25T02:26:58.7437847Z 134 │ │ } 2026-10-25T02:26:58.7438122Z 135 │ │ yield* Effect.yieldNow; 2026-10-25T02:26:58.7438470Z 136 │ ╰─▶ } 2026-10-25T02:26:58.7438769Z 137 │ return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`)); 2026-10-25T02:26:58.7438991Z ╰──── 2026-10-25T02:26:58.7439047Z 2026-10-25T02:26:58.7439507Z ⚠ 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-25T02:26:58.7440055Z ╭─[packages/client-runtime/src/rpc/client.test.ts:252:7] 2026-10-25T02:26:58.7440356Z 251 │ yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient))); 2026-10-25T02:26:58.7440779Z 252 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) { 2026-10-25T02:26:58.7441115Z 253 │ │ yield* Effect.yieldNow; 2026-10-25T02:26:58.7441370Z 254 │ ╰─▶ } 2026-10-25T02:26:58.7441628Z 255 │ yield* SubscriptionRef.set(activeSession, Option.none()); 2026-10-25T02:26:58.7441818Z ╰──── 2026-10-25T02:26:58.7441873Z 2026-10-25T02:26:58.7442330Z ⚠ 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-25T02:26:58.7442867Z ╭─[packages/client-runtime/src/rpc/client.test.ts:258:7] 2026-10-25T02:26:58.7443059Z 257 │ 2026-10-25T02:26:58.7443374Z 258 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-25T02:26:58.7443704Z 259 │ │ yield* Effect.yieldNow; 2026-10-25T02:26:58.7443954Z 260 │ ╰─▶ } 2026-10-25T02:26:58.7444191Z 261 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-25T02:26:58.7444360Z ╰──── 2026-10-25T02:26:58.7444415Z 2026-10-25T02:26:58.7444868Z ⚠ 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-25T02:26:58.7445406Z ╭─[packages/client-runtime/src/rpc/client.test.ts:322:7] 2026-10-25T02:26:58.7445610Z 321 │ ); 2026-10-25T02:26:58.7445980Z 322 │ ╭─▶ for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) { 2026-10-25T02:26:58.7446312Z 323 │ │ yield* Effect.yieldNow; 2026-10-25T02:26:58.7446563Z 324 │ ╰─▶ } 2026-10-25T02:26:58.7446752Z 325 │ 2026-10-25T02:26:58.7446868Z ╰──── 2026-10-25T02:26:58.7446922Z 2026-10-25T02:26:58.7447376Z ⚠ 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-25T02:26:58.7447915Z ╭─[packages/client-runtime/src/rpc/client.test.ts:330:7] 2026-10-25T02:26:58.7448280Z 329 │ yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient))); 2026-10-25T02:26:58.7448782Z 330 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-25T02:26:58.7449112Z 331 │ │ yield* Effect.yieldNow; 2026-10-25T02:26:58.7449360Z 332 │ ╰─▶ } 2026-10-25T02:26:58.7449597Z 333 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-25T02:26:58.7449767Z ╰──── 2026-10-25T02:26:58.7449824Z 2026-10-25T02:26:58.7449993Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T02:26:58.7450296Z ╭─[apps/web/src/components/CustomSnoozeDialog.tsx:140:58] 2026-10-25T02:26:58.7450576Z 139 │ {...(weekStartsOn === undefined ? {} : { weekStartsOn })} 2026-10-25T02:26:58.7450861Z 140 │ disabled={{ before: new Date(new Date().setHours(0, 0, 0, 0)) }} 2026-10-25T02:26:58.7451137Z ·  ─────┬──── 2026-10-25T02:26:58.7451433Z · ╰── Cannot call impure function 2026-10-25T02:26:58.7451692Z 141 │ onSelect={(selected) => { 2026-10-25T02:26:58.7451855Z ╰──── 2026-10-25T02:26:58.7452188Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T02:26:58.7452750Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T02:26:58.7453035Z 2026-10-25T02:26:58.7453295Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:26:58.7453684Z ╭─[apps/mobile/src/components/VideoPreviewModal.ios.tsx:63:55] 2026-10-25T02:26:58.7453896Z 61 │ }, []); 2026-10-25T02:26:58.7454029Z 62 │ useEffect(() => { 2026-10-25T02:26:58.7454183Z ·  ────┬──── 2026-10-25T02:26:58.7454400Z · ╰── This is the containing effect 2026-10-25T02:26:58.7454753Z 63 │ if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl); 2026-10-25T02:26:58.7455033Z ·  ───────┬────── 2026-10-25T02:26:58.7455378Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7455655Z 64 │ }, [playbackUrl, resolvedUrl]); 2026-10-25T02:26:58.7455811Z ╰──── 2026-10-25T02:26:58.7456496Z  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-25T02:26:58.7457354Z  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-25T02:26:58.7457661Z 2026-10-25T02:26:58.7457829Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T02:26:58.7458223Z ╭─[apps/web/src/components/CommandPaletteThreadItems.tsx:152:58] 2026-10-25T02:26:58.7458778Z 151 │ if (threadSearchQuery.trim().length > 0 && !threadSearchQuery.startsWith(">") && !isOpen) { 2026-10-25T02:26:58.7459322Z 152 │ claimThreadOpen(thread.environmentId, thread.id, Date.now()); 2026-10-25T02:26:58.7459592Z ·  ─────┬──── 2026-10-25T02:26:58.7459895Z · ╰── Cannot call impure function 2026-10-25T02:26:58.7460111Z 153 │ } 2026-10-25T02:26:58.7460236Z ╰──── 2026-10-25T02:26:58.7460577Z  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-25T02:26:58.7461150Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T02:26:58.7461434Z 2026-10-25T02:26:58.7461600Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T02:26:58.7461890Z ╭─[apps/web/src/hooks/useThreadActions.ts:839:56] 2026-10-25T02:26:58.7462127Z 838 │ const resolved = resolveThreadTarget(target); 2026-10-25T02:26:58.7462406Z 839 │ if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) { 2026-10-25T02:26:58.7462691Z ·  ─────┬──── 2026-10-25T02:26:58.7462989Z · ╰── Cannot call impure function 2026-10-25T02:26:58.7463231Z 840 │ return AsyncResult.failure( 2026-10-25T02:26:58.7463386Z ╰──── 2026-10-25T02:26:58.7463725Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T02:26:58.7464283Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T02:26:58.7464562Z 2026-10-25T02:26:58.7464732Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T02:26:58.7465023Z ╭─[apps/web/src/hooks/useThreadActions.ts:727:46] 2026-10-25T02:26:58.7465327Z 726 │ const wokeAt = resolved 2026-10-25T02:26:58.7465569Z 727 │ ? threadWokeAt(resolved.thread, { now: new Date().toISOString() }) 2026-10-25T02:26:58.7465872Z ·  ─────┬──── 2026-10-25T02:26:58.7466164Z · ╰── Cannot call impure function 2026-10-25T02:26:58.7466383Z 728 │ : null; 2026-10-25T02:26:58.7466511Z ╰──── 2026-10-25T02:26:58.7466846Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T02:26:58.7467404Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T02:26:58.7467687Z 2026-10-25T02:26:58.7467950Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:26:58.7468361Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:217:7] 2026-10-25T02:26:58.7468681Z 213 │ }; 2026-10-25T02:26:58.7468903Z 214 │ useEffect(() => { 2026-10-25T02:26:58.7469063Z ·  ────┬──── 2026-10-25T02:26:58.7469282Z · ╰── This is the containing effect 2026-10-25T02:26:58.7469598Z 215 │ const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null; 2026-10-25T02:26:58.7469843Z 216 │ if (inserted) { 2026-10-25T02:26:58.7470004Z 217 │ setSelection((current) => 2026-10-25T02:26:58.7470182Z ·  ──────┬───── 2026-10-25T02:26:58.7470449Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7470791Z 218 │ current.start === inserted.start && current.end === inserted.end ? current : inserted, 2026-10-25T02:26:58.7471016Z ╰──── 2026-10-25T02:26:58.7471680Z  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-25T02:26:58.7472542Z  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-25T02:26:58.7472853Z 2026-10-25T02:26:58.7473110Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:26:58.7473522Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:297:7] 2026-10-25T02:26:58.7473765Z 285 │ }, [hasWorkspaceSnapshot]); 2026-10-25T02:26:58.7473926Z 286 │ useEffect(() => { 2026-10-25T02:26:58.7474084Z ·  ────┬──── 2026-10-25T02:26:58.7474305Z · ╰── This is the containing effect 2026-10-25T02:26:58.7474592Z 287 │ if (!environmentId || !projectCwd || !selectedProviderInstanceId) return; 2026-10-25T02:26:58.7474900Z 288 │ const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`; 2026-10-25T02:26:58.7475132Z 289 │ const now = Date.now(); 2026-10-25T02:26:58.7475343Z 290 │ const lastRequest = workspaceRefreshKeyRef.current; 2026-10-25T02:26:58.7475531Z 291 │ if ( 2026-10-25T02:26:58.7475682Z 292 │ lastRequest?.key === key && 2026-10-25T02:26:58.7475968Z 293 │ now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS 2026-10-25T02:26:58.7476178Z 294 │ ) 2026-10-25T02:26:58.7476309Z 295 │ return; 2026-10-25T02:26:58.7476565Z 296 │ if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) { 2026-10-25T02:26:58.7476840Z 297 │ setWorkspaceRefreshRetry(null); 2026-10-25T02:26:58.7477045Z ·  ────────────┬─────────── 2026-10-25T02:26:58.7477330Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7477565Z 298 │ return; 2026-10-25T02:26:58.7477695Z ╰──── 2026-10-25T02:26:58.7478355Z  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-25T02:26:58.7479286Z  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-25T02:26:58.7479689Z 2026-10-25T02:26:58.7479896Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:26:58.7480261Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:327:5] 2026-10-25T02:26:58.7480488Z 326 │ }, [ 2026-10-25T02:26:58.7480623Z 327 │ draftMessage, 2026-10-25T02:26:58.7480785Z ·  ──────┬───── 2026-10-25T02:26:58.7481027Z · ╰── Unnecessary dependency `draftMessage` 2026-10-25T02:26:58.7481241Z 328 │ environmentId, 2026-10-25T02:26:58.7481376Z ╰──── 2026-10-25T02:26:58.7481728Z  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-25T02:26:58.7482328Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7482630Z 2026-10-25T02:26:58.7482893Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:26:58.7483263Z ╭─[apps/server/src/serverRuntimeStartup.ts:720:7] 2026-10-25T02:26:58.7483453Z 719 │ 2026-10-25T02:26:58.7483596Z 720 │ const layer = layerWithOptions(); 2026-10-25T02:26:58.7483771Z ·  ──┬── 2026-10-25T02:26:58.7483982Z · ╰── 'layer' is declared here 2026-10-25T02:26:58.7484167Z ╰──── 2026-10-25T02:26:58.7484330Z  help: Consider removing this declaration. 2026-10-25T02:26:58.7484450Z 2026-10-25T02:26:58.7484650Z ⚠ eslint(no-unused-vars): Identifier 'Fiber' is imported but never used. 2026-10-25T02:26:58.7484937Z ╭─[apps/server/src/ws.ts:10:13] 2026-10-25T02:26:58.7485139Z  9 │ import * as Effect from "effect/Effect"; 2026-10-25T02:26:58.7485332Z 10 │ import * as Fiber from "effect/Fiber"; 2026-10-25T02:26:58.7485513Z ·  ──┬── 2026-10-25T02:26:58.7485737Z · ╰── 'Fiber' is imported here 2026-10-25T02:26:58.7486010Z 11 │ import * as FileSystem from "effect/FileSystem"; 2026-10-25T02:26:58.7486179Z ╰──── 2026-10-25T02:26:58.7486334Z  help: Consider removing this import. 2026-10-25T02:26:58.7486450Z 2026-10-25T02:26:58.7486650Z ⚠ eslint(no-unused-vars): Identifier 'Schedule' is imported but never used. 2026-10-25T02:26:58.7487001Z ╭─[apps/server/src/ws.ts:17:13] 2026-10-25T02:26:58.7487281Z 16 │ import * as Ref from "effect/Ref"; 2026-10-25T02:26:58.7487472Z 17 │ import * as Schedule from "effect/Schedule"; 2026-10-25T02:26:58.7487664Z ·  ────┬─── 2026-10-25T02:26:58.7487890Z · ╰── 'Schedule' is imported here 2026-10-25T02:26:58.7488118Z 18 │ import * as Schema from "effect/Schema"; 2026-10-25T02:26:58.7488275Z ╰──── 2026-10-25T02:26:58.7488428Z  help: Consider removing this import. 2026-10-25T02:26:58.7488540Z 2026-10-25T02:26:58.7488841Z ⚠ eslint(no-unused-vars): Variable 'projectSetupScriptRunner' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:26:58.7489222Z ╭─[apps/server/src/ws.ts:1296:13] 2026-10-25T02:26:58.7489497Z 1295 │ const usageLimitSources = yield* UsageLimitSources.UsageLimitSources; 2026-10-25T02:26:58.7489870Z 1296 │ const projectSetupScriptRunner = yield* ProjectSetupScriptRunner.ProjectSetupScriptRunner; 2026-10-25T02:26:58.7490181Z ·  ────────────┬─────────── 2026-10-25T02:26:58.7490465Z · ╰── 'projectSetupScriptRunner' is declared here 2026-10-25T02:26:58.7490807Z 1297 │ const worktreeSetupTracker = yield* WorktreeSetupTracker.WorktreeSetupTracker; 2026-10-25T02:26:58.7491038Z ╰──── 2026-10-25T02:26:58.7491201Z  help: Consider removing this declaration. 2026-10-25T02:26:58.7491319Z 2026-10-25T02:26:58.7491598Z ⚠ eslint(no-unused-vars): Variable 'legacyCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:26:58.7492025Z ╭─[packages/provider-cursor/src/server/credentialStore.test.ts:15:7] 2026-10-25T02:26:58.7492249Z 14 │ 2026-10-25T02:26:58.7492383Z 15 │ const legacyCredentials = { 2026-10-25T02:26:58.7492557Z ·  ────────┬──────── 2026-10-25T02:26:58.7492802Z · ╰── 'legacyCredentials' is declared here 2026-10-25T02:26:58.7493015Z 16 │ version: 1 as const, 2026-10-25T02:26:58.7493151Z ╰──── 2026-10-25T02:26:58.7493256Z  help: Consider removing this declaration. 2026-10-25T02:26:58.7493259Z 2026-10-25T02:26:58.7493535Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-25T02:26:58.7493668Z ╭─[packages/provider-cursor/src/server/auth.ts:249:20] 2026-10-25T02:26:58.7493728Z 248 │ }, 2026-10-25T02:26:58.7493818Z 249 │ (effect, flow, stopSessions) => 2026-10-25T02:26:58.7493916Z ·  ──────┬───── 2026-10-25T02:26:58.7494067Z · ╰── 'stopSessions' is declared here 2026-10-25T02:26:58.7494133Z 250 │ effect.pipe( 2026-10-25T02:26:58.7494185Z ╰──── 2026-10-25T02:26:58.7494289Z  help: Consider removing this parameter. 2026-10-25T02:26:58.7494291Z 2026-10-25T02:26:58.7494551Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:26:58.7494709Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:358:7] 2026-10-25T02:26:58.7494848Z 352 │ }, [cancelledIncomingShareId, navigation, props.incomingShareId]); 2026-10-25T02:26:58.7494914Z 353 │ useEffect(() => { 2026-10-25T02:26:58.7495077Z ·  ────┬──── 2026-10-25T02:26:58.7495291Z · ╰── This is the containing effect 2026-10-25T02:26:58.7495386Z 354 │ if (!isReturningToProjectPicker) { 2026-10-25T02:26:58.7495446Z 355 │ return; 2026-10-25T02:26:58.7495504Z 356 │ } 2026-10-25T02:26:58.7495605Z 357 │ if (requestedInitialProjectAvailable) { 2026-10-25T02:26:58.7495698Z 358 │ setIsReturningToProjectPicker(false); 2026-10-25T02:26:58.7495807Z ·  ──────────────┬────────────── 2026-10-25T02:26:58.7496031Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7496092Z 359 │ return; 2026-10-25T02:26:58.7496143Z ╰──── 2026-10-25T02:26:58.7496740Z  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-25T02:26:58.7497068Z  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-25T02:26:58.7497070Z 2026-10-25T02:26:58.7497324Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:26:58.7497478Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:496:9] 2026-10-25T02:26:58.7497531Z 441 │ 2026-10-25T02:26:58.7497598Z 442 │ useEffect(() => { 2026-10-25T02:26:58.7497672Z ·  ────┬──── 2026-10-25T02:26:58.7497807Z · ╰── This is the containing effect 2026-10-25T02:26:58.7497910Z 443 │ if (props.pendingTaskId || props.draftId) { 2026-10-25T02:26:58.7497970Z 444 │ return; 2026-10-25T02:26:58.7498025Z 445 │ } 2026-10-25T02:26:58.7498167Z 446 │ if (lastInitialProjectRefRef.current !== props.initialProjectRef) { 2026-10-25T02:26:58.7498299Z 447 │ lastInitialProjectRefRef.current = props.initialProjectRef; 2026-10-25T02:26:58.7498409Z 448 │ appliedInitialProjectKeyRef.current = null; 2026-10-25T02:26:58.7498465Z 449 │ } 2026-10-25T02:26:58.7498606Z 450 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-25T02:26:58.7498733Z 451 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-25T02:26:58.7498840Z 452 │ if (initialEnvironmentId && initialProjectId) { 2026-10-25T02:26:58.7498918Z 453 │ const directProject = 2026-10-25T02:26:58.7498989Z 454 │ projects.find( 2026-10-25T02:26:58.7499054Z 455 │ (project) => 2026-10-25T02:26:58.7499230Z 456 │ project.environmentId === initialEnvironmentId && project.id === initialProjectId, 2026-10-25T02:26:58.7499292Z 457 │ ) ?? null; 2026-10-25T02:26:58.7499345Z 458 │ 2026-10-25T02:26:58.7499415Z 459 │ if (directProject) { 2026-10-25T02:26:58.7499568Z 460 │ // Apply the route project once or picker changes would immediately revert. 2026-10-25T02:26:58.7499731Z 461 │ const directProjectKey = `${directProject.environmentId}:${directProject.id}`; 2026-10-25T02:26:58.7499872Z 462 │ if (appliedInitialProjectKeyRef.current === directProjectKey) { 2026-10-25T02:26:58.7499934Z 463 │ return; 2026-10-25T02:26:58.7499994Z 464 │ } 2026-10-25T02:26:58.7500159Z 465 │ if (props.initialProjectRef?.branch) { 2026-10-25T02:26:58.7500260Z 466 │ if ( 2026-10-25T02:26:58.7500445Z 467 │ selectedProject?.environmentId !== directProject.environmentId || 2026-10-25T02:26:58.7500546Z 468 │ selectedProject.id !== directProject.id 2026-10-25T02:26:58.7500605Z 469 │ ) { 2026-10-25T02:26:58.7500692Z 470 │ setProject(directProject); 2026-10-25T02:26:58.7500754Z 471 │ return; 2026-10-25T02:26:58.7500814Z 472 │ } 2026-10-25T02:26:58.7500897Z 473 │ if (!flow.draftKey) return; 2026-10-25T02:26:58.7501089Z 474 │ // Checkout completed before mount; local mode reuses it while worktree mode would create another. 2026-10-25T02:26:58.7501200Z 475 │ updateComposerDraftSettings(flow.draftKey, { 2026-10-25T02:26:58.7501281Z 476 │ workspaceSelection: { 2026-10-25T02:26:58.7501358Z 477 │ mode: "local", 2026-10-25T02:26:58.7501464Z 478 │ branch: props.initialProjectRef.branch, 2026-10-25T02:26:58.7501601Z 479 │ worktreePath: props.initialProjectRef.worktreePath ?? null, 2026-10-25T02:26:58.7501685Z 480 │ startFromOrigin: false, 2026-10-25T02:26:58.7501746Z 481 │ }, 2026-10-25T02:26:58.7501804Z 482 │ }); 2026-10-25T02:26:58.7501863Z 483 │ } 2026-10-25T02:26:58.7501993Z 484 │ appliedInitialProjectKeyRef.current = directProjectKey; 2026-10-25T02:26:58.7502053Z 485 │ if ( 2026-10-25T02:26:58.7502193Z 486 │ selectedProject?.environmentId === directProject.environmentId && 2026-10-25T02:26:58.7502294Z 487 │ selectedProject.id === directProject.id 2026-10-25T02:26:58.7502353Z 488 │ ) { 2026-10-25T02:26:58.7502417Z 489 │ return; 2026-10-25T02:26:58.7502478Z 490 │ } 2026-10-25T02:26:58.7502565Z 491 │ setProject(directProject); 2026-10-25T02:26:58.7502633Z 492 │ return; 2026-10-25T02:26:58.7502690Z 493 │ } 2026-10-25T02:26:58.7502741Z 494 │ 2026-10-25T02:26:58.7502823Z 495 │ if (projects.length > 0) { 2026-10-25T02:26:58.7502923Z 496 │ setIsReturningToProjectPicker(true); 2026-10-25T02:26:58.7503033Z ·  ──────────────┬────────────── 2026-10-25T02:26:58.7503212Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7503270Z 497 │ } 2026-10-25T02:26:58.7503325Z ╰──── 2026-10-25T02:26:58.7503927Z  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-25T02:26:58.7504250Z  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-25T02:26:58.7504256Z 2026-10-25T02:26:58.7504509Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:26:58.7504662Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:596:5] 2026-10-25T02:26:58.7504719Z 537 │ 2026-10-25T02:26:58.7504787Z 538 │ useEffect(() => { 2026-10-25T02:26:58.7504858Z ·  ────┬──── 2026-10-25T02:26:58.7504988Z · ╰── This is the containing effect 2026-10-25T02:26:58.7505154Z 539 │ const shareId = props.incomingShareId; 2026-10-25T02:26:58.7505372Z 540 │ const draftKey = flow.draftKey; 2026-10-25T02:26:58.7505503Z 541 │ const destinationProject = selectedProject; 2026-10-25T02:26:58.7505646Z 542 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-25T02:26:58.7505775Z 543 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-25T02:26:58.7505899Z 544 │ const selectedProjectMatchesRoute = 2026-10-25T02:26:58.7505978Z 545 │ !initialEnvironmentId || 2026-10-25T02:26:58.7506050Z 546 │ !initialProjectId || 2026-10-25T02:26:58.7506184Z 547 │ (destinationProject?.environmentId === initialEnvironmentId && 2026-10-25T02:26:58.7506290Z 548 │ destinationProject.id === initialProjectId); 2026-10-25T02:26:58.7506349Z 549 │ if ( 2026-10-25T02:26:58.7506415Z 550 │ !shareId || 2026-10-25T02:26:58.7506486Z 551 │ !draftKey || 2026-10-25T02:26:58.7506561Z 552 │ !destinationProject || 2026-10-25T02:26:58.7506650Z 553 │ !selectedProjectMatchesRoute || 2026-10-25T02:26:58.7506742Z 554 │ cancelledIncomingShareId === shareId 2026-10-25T02:26:58.7506799Z 555 │ ) { 2026-10-25T02:26:58.7506858Z 556 │ return; 2026-10-25T02:26:58.7506916Z 557 │ } 2026-10-25T02:26:58.7507014Z 558 │ const importKey = `${shareId}:${draftKey}`; 2026-10-25T02:26:58.7507071Z 559 │ if ( 2026-10-25T02:26:58.7507183Z 560 │ startedShareImportKeyRef.current === importKey || 2026-10-25T02:26:58.7507298Z 561 │ cancellingShareImportKeyRef.current === importKey 2026-10-25T02:26:58.7507354Z 562 │ ) { 2026-10-25T02:26:58.7507416Z 563 │ return; 2026-10-25T02:26:58.7507471Z 564 │ } 2026-10-25T02:26:58.7507524Z 565 │ 2026-10-25T02:26:58.7507601Z 566 │ if (!incomingShare) { 2026-10-25T02:26:58.7507798Z 567 │ if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) { 2026-10-25T02:26:58.7507929Z 568 │ alertedUnavailableIncomingShareIdRef.current = shareId; 2026-10-25T02:26:58.7507998Z 569 │ Dialog.alert( 2026-10-25T02:26:58.7508085Z 570 │ "Shared content unavailable", 2026-10-25T02:26:58.7508257Z 571 │ "The shared content is no longer in the inbox. You can continue editing this task draft.", 2026-10-25T02:26:58.7508319Z 572 │ ); 2026-10-25T02:26:58.7508376Z 573 │ } 2026-10-25T02:26:58.7508435Z 574 │ return; 2026-10-25T02:26:58.7508488Z 575 │ } 2026-10-25T02:26:58.7508548Z 576 │ 2026-10-25T02:26:58.7508607Z 577 │ if ( 2026-10-25T02:26:58.7508772Z 578 │ incomingShare.attachments.some((attachment) => attachment.type === "file") && 2026-10-25T02:26:58.7508876Z 579 │ selectedEnvironmentServerConfig === null 2026-10-25T02:26:58.7508931Z 580 │ ) { 2026-10-25T02:26:58.7508992Z 581 │ return; 2026-10-25T02:26:58.7509048Z 582 │ } 2026-10-25T02:26:58.7509099Z 583 │ 2026-10-25T02:26:58.7509240Z 584 │ if (alertedUnavailableIncomingShareIdRef.current === shareId) { 2026-10-25T02:26:58.7509365Z 585 │ alertedUnavailableIncomingShareIdRef.current = null; 2026-10-25T02:26:58.7509422Z 586 │ } 2026-10-25T02:26:58.7509529Z 587 │ startedShareImportKeyRef.current = importKey; 2026-10-25T02:26:58.7509601Z 588 │ const draftBackup = 2026-10-25T02:26:58.7509789Z 589 │ shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey); 2026-10-25T02:26:58.7509925Z 590 │ shareImportDraftBackupRef.current.set(importKey, draftBackup); 2026-10-25T02:26:58.7510093Z 591 │ const importToken = Symbol(importKey); 2026-10-25T02:26:58.7510240Z 592 │ let didReserveShare = false; 2026-10-25T02:26:58.7510341Z 593 │ let didConsumeShare = false; 2026-10-25T02:26:58.7510420Z 594 │ let needsDraftRestore = false; 2026-10-25T02:26:58.7510535Z 595 │ activeShareImportTokenRef.current = importToken; 2026-10-25T02:26:58.7510620Z 596 │ setImportingShareKey(importKey); 2026-10-25T02:26:58.7510710Z ·  ──────────┬───────── 2026-10-25T02:26:58.7510881Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7510951Z 597 │ void (async () => { 2026-10-25T02:26:58.7511005Z ╰──── 2026-10-25T02:26:58.7511606Z  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-25T02:26:58.7511928Z  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-25T02:26:58.7511931Z 2026-10-25T02:26:58.7512130Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:26:58.7512288Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:516:5] 2026-10-25T02:26:58.7512367Z 515 │ props.initialProjectRef, 2026-10-25T02:26:58.7512441Z 516 │ props.incomingShareId, 2026-10-25T02:26:58.7512529Z ·  ──────────┬────────── 2026-10-25T02:26:58.7512703Z · ╰── Unnecessary dependency `props.incomingShareId` 2026-10-25T02:26:58.7512780Z 517 │ props.pendingTaskId, 2026-10-25T02:26:58.7512834Z ╰──── 2026-10-25T02:26:58.7513125Z  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-25T02:26:58.7513435Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7513438Z 2026-10-25T02:26:58.7513655Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T02:26:58.7513809Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:535:5] 2026-10-25T02:26:58.7513925Z 534 │ loadedBranchesProjectKeyRef.current = projectKey; 2026-10-25T02:26:58.7513996Z 535 │ flow.loadBranches(); 2026-10-25T02:26:58.7514072Z ·  ──┬─ 2026-10-25T02:26:58.7514198Z · ╰── Missing dependency `flow` 2026-10-25T02:26:58.7514292Z 536 │ }, [flow.loadBranches, selectedProject]); 2026-10-25T02:26:58.7514377Z ·  ────────┬──────── 2026-10-25T02:26:58.7514577Z · ╰── Overly precise dependency `flow.loadBranches`, use `flow` instead 2026-10-25T02:26:58.7514630Z 537 │ 2026-10-25T02:26:58.7514682Z ╰──── 2026-10-25T02:26:58.7515101Z  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-25T02:26:58.7515481Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7515511Z 2026-10-25T02:26:58.7515763Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:26:58.7515955Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:748:5] 2026-10-25T02:26:58.7516022Z 747 │ flow.draftKey, 2026-10-25T02:26:58.7516098Z 748 │ hasImportedIncomingShare, 2026-10-25T02:26:58.7516189Z ·  ────────────┬─────────── 2026-10-25T02:26:58.7516362Z · ╰── Unnecessary dependency `hasImportedIncomingShare` 2026-10-25T02:26:58.7516428Z 749 │ incomingShare, 2026-10-25T02:26:58.7516507Z 750 │ isIncomingShareInboxLoading, 2026-10-25T02:26:58.7516613Z ·  ─────────────┬───────────── 2026-10-25T02:26:58.7516798Z · ╰── Unnecessary dependency `isIncomingShareInboxLoading` 2026-10-25T02:26:58.7516878Z 751 │ isIncomingShareUnavailable, 2026-10-25T02:26:58.7516949Z 752 │ props.incomingShareId, 2026-10-25T02:26:58.7517045Z 753 │ props.initialProjectRef?.environmentId, 2026-10-25T02:26:58.7517135Z 754 │ props.initialProjectRef?.projectId, 2026-10-25T02:26:58.7517207Z 755 │ releaseShareReservation, 2026-10-25T02:26:58.7517274Z 756 │ reserveShare, 2026-10-25T02:26:58.7517359Z 757 │ selectedEnvironmentServerConfig, 2026-10-25T02:26:58.7517427Z 758 │ selectedProject, 2026-10-25T02:26:58.7517494Z 759 │ shareImportAttempt, 2026-10-25T02:26:58.7517581Z ·  ─────────┬──────── 2026-10-25T02:26:58.7517752Z · ╰── Unnecessary dependency `shareImportAttempt` 2026-10-25T02:26:58.7517811Z 760 │ ]); 2026-10-25T02:26:58.7517862Z ╰──── 2026-10-25T02:26:58.7518150Z  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-25T02:26:58.7518458Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7518460Z 2026-10-25T02:26:58.7518654Z ⚠ eslint(no-unused-vars): Identifier 'Option' is imported but never used. 2026-10-25T02:26:58.7518793Z ╭─[apps/server/src/guest/GuestShareService.test.ts:24:13] 2026-10-25T02:26:58.7518872Z 23 │ import * as Ref from "effect/Ref"; 2026-10-25T02:26:58.7518960Z 24 │ import * as Option from "effect/Option"; 2026-10-25T02:26:58.7519107Z ·  ───┬── 2026-10-25T02:26:58.7519272Z · ╰── 'Option' is imported here 2026-10-25T02:26:58.7519384Z 25 │ import * as Stream from "effect/Stream"; 2026-10-25T02:26:58.7519455Z ╰──── 2026-10-25T02:26:58.7519554Z  help: Consider removing this import. 2026-10-25T02:26:58.7519556Z 2026-10-25T02:26:58.7519779Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-25T02:26:58.7519916Z ╭─[apps/server/src/guest/GuestShareService.test.ts:733:50] 2026-10-25T02:26:58.7520067Z 732 │ yield* guestShares.submit(session, { shareId, text: `note ${index}` }, []); 2026-10-25T02:26:58.7520235Z 733 │ const [waiting] = (yield* waitingMessages).filter((next) => next.status === "pending"); 2026-10-25T02:26:58.7520355Z ·  ────── 2026-10-25T02:26:58.7520441Z 734 │ yield* orchestrator.dispatch({ 2026-10-25T02:26:58.7520495Z ╰──── 2026-10-25T02:26:58.7520665Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-25T02:26:58.7520669Z 2026-10-25T02:26:58.7520916Z ⚠ eslint(no-unused-vars): Variable 'I' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:26:58.7521019Z ╭─[apps/server/src/guest/http.ts:88:33] 2026-10-25T02:26:58.7521171Z 87 │ /** Server-sent events with a heartbeat, never cached or buffered on the way. */ 2026-10-25T02:26:58.7521255Z 88 │ const eventStreamResponse = ( 2026-10-25T02:26:58.7521348Z ·  ┬ 2026-10-25T02:26:58.7521486Z · ╰── 'I' is declared here 2026-10-25T02:26:58.7521564Z 89 │ events: Stream.Stream, 2026-10-25T02:26:58.7521618Z ╰──── 2026-10-25T02:26:58.7521724Z  help: Consider removing this declaration. 2026-10-25T02:26:58.7521727Z 2026-10-25T02:26:58.7521952Z ⚠ eslint(no-unused-vars): Function 'resolveThreadWorkspaceCwd' is declared but never used. 2026-10-25T02:26:58.7522068Z ╭─[apps/server/src/checkpointing/Utils.ts:12:10] 2026-10-25T02:26:58.7522123Z 11 │ 2026-10-25T02:26:58.7522220Z 12 │ function resolveThreadWorkspaceCwd(input: { 2026-10-25T02:26:58.7522318Z ·  ────────────┬──────────── 2026-10-25T02:26:58.7522483Z · ╰── 'resolveThreadWorkspaceCwd' is declared here 2026-10-25T02:26:58.7522551Z 13 │ readonly thread: { 2026-10-25T02:26:58.7522610Z ╰──── 2026-10-25T02:26:58.7522711Z  help: Consider removing this declaration. 2026-10-25T02:26:58.7522715Z 2026-10-25T02:26:58.7522966Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:26:58.7523127Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-25T02:26:58.7523190Z 259 │ .join("|"); 2026-10-25T02:26:58.7523253Z 260 │ useEffect(() => { 2026-10-25T02:26:58.7523322Z ·  ────┬──── 2026-10-25T02:26:58.7523448Z · ╰── This is the containing effect 2026-10-25T02:26:58.7523508Z 261 │ stop(); 2026-10-25T02:26:58.7523577Z ·  ──┬─ 2026-10-25T02:26:58.7523810Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7523929Z 262 │ }, [orderVersion]); 2026-10-25T02:26:58.7524011Z ╰──── 2026-10-25T02:26:58.7524600Z  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-25T02:26:58.7524914Z  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-25T02:26:58.7524917Z 2026-10-25T02:26:58.7525128Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T02:26:58.7525289Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-25T02:26:58.7525356Z 260 │ useEffect(() => { 2026-10-25T02:26:58.7525414Z 261 │ stop(); 2026-10-25T02:26:58.7525484Z ·  ──┬─ 2026-10-25T02:26:58.7525610Z · ╰── Missing dependency `stop` 2026-10-25T02:26:58.7525676Z 262 │ }, [orderVersion]); 2026-10-25T02:26:58.7525754Z ·  ──────┬───── 2026-10-25T02:26:58.7525935Z · ╰── Unnecessary dependency `orderVersion` 2026-10-25T02:26:58.7525998Z 263 │ useEffect( 2026-10-25T02:26:58.7526050Z ╰──── 2026-10-25T02:26:58.7526460Z  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-25T02:26:58.7526774Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7526781Z 2026-10-25T02:26:58.7526925Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.7527081Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9] 2026-10-25T02:26:58.7527155Z 95 │ const latest = useRef(props); 2026-10-25T02:26:58.7527223Z 96 │ latest.current = props; 2026-10-25T02:26:58.7527326Z ·  ───┬──────┬─── 2026-10-25T02:26:58.7527501Z · │ ╰── Cannot update ref value during render 2026-10-25T02:26:58.7527611Z · ╰── This value is a ref 2026-10-25T02:26:58.7527683Z 97 │ const gesture = useMemo( 2026-10-25T02:26:58.7527737Z ╰──── 2026-10-25T02:26:58.7528195Z  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-25T02:26:58.7528482Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.7528485Z 2026-10-25T02:26:58.7528629Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.7528785Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18] 2026-10-25T02:26:58.7528852Z 103 │ .runOnJS(true) 2026-10-25T02:26:58.7528953Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-25T02:26:58.7529128Z ·  ───────────────┬────────────── 2026-10-25T02:26:58.7529405Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T02:26:58.7529538Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-25T02:26:58.7529591Z ╰──── 2026-10-25T02:26:58.7530048Z  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-25T02:26:58.7530333Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.7530339Z 2026-10-25T02:26:58.7530484Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.7530645Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19] 2026-10-25T02:26:58.7530744Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-25T02:26:58.7530873Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-25T02:26:58.7531011Z ·  ──────────────────────────┬───────────────────────── 2026-10-25T02:26:58.7531215Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T02:26:58.7531340Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-25T02:26:58.7531393Z ╰──── 2026-10-25T02:26:58.7531853Z  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-25T02:26:58.7532139Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.7532141Z 2026-10-25T02:26:58.7532281Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.7532437Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16] 2026-10-25T02:26:58.7532564Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-25T02:26:58.7532682Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-25T02:26:58.7532826Z ·  ──────────────────────────┬───────────────────────── 2026-10-25T02:26:58.7533033Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T02:26:58.7533157Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-25T02:26:58.7533209Z ╰──── 2026-10-25T02:26:58.7533663Z  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-25T02:26:58.7533947Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.7533949Z 2026-10-25T02:26:58.7534148Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.7534385Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21] 2026-10-25T02:26:58.7534506Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-25T02:26:58.7534628Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-25T02:26:58.7534762Z ·  ───────────────────────┬────────────────────── 2026-10-25T02:26:58.7534969Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T02:26:58.7535036Z 108 │ [props.disabled], 2026-10-25T02:26:58.7535091Z ╰──── 2026-10-25T02:26:58.7535550Z  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-25T02:26:58.7535850Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.7535853Z 2026-10-25T02:26:58.7536021Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.7536175Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:249:9] 2026-10-25T02:26:58.7536290Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-25T02:26:58.7536396Z 249 │ latest.current = { rows, planners, moveThread }; 2026-10-25T02:26:58.7536498Z ·  ───┬──────┬─── 2026-10-25T02:26:58.7536672Z · │ ╰── Cannot update ref value during render 2026-10-25T02:26:58.7536792Z · ╰── This value is a ref 2026-10-25T02:26:58.7536850Z 250 │ 2026-10-25T02:26:58.7536902Z ╰──── 2026-10-25T02:26:58.7537352Z  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-25T02:26:58.7537637Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.7537639Z 2026-10-25T02:26:58.7537780Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.7537939Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:247:22] 2026-10-25T02:26:58.7538113Z 246 │ const [preview, setPreview] = useState(null); 2026-10-25T02:26:58.7538303Z 247 │ const translateY = useRef(new Animated.Value(0)).current; 2026-10-25T02:26:58.7538429Z ·  ──────────────────┬────────────────── 2026-10-25T02:26:58.7538595Z · ╰── Cannot access ref value during render 2026-10-25T02:26:58.7538703Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-25T02:26:58.7538753Z ╰──── 2026-10-25T02:26:58.7539207Z  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-25T02:26:58.7539499Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.7539505Z 2026-10-25T02:26:58.7539673Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T02:26:58.7539829Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:324:16] 2026-10-25T02:26:58.7539892Z 323 │ update(0); 2026-10-25T02:26:58.7539974Z 324 │ let last = performance.now(); 2026-10-25T02:26:58.7540071Z ·  ────────┬──────── 2026-10-25T02:26:58.7540210Z · ╰── Cannot call impure function 2026-10-25T02:26:58.7540278Z 325 │ const tick = () => { 2026-10-25T02:26:58.7540333Z ╰──── 2026-10-25T02:26:58.7540631Z  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-25T02:26:58.7540923Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T02:26:58.7540925Z 2026-10-25T02:26:58.7541107Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-25T02:26:58.7541265Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15] 2026-10-25T02:26:58.7541325Z  98 │ () => 2026-10-25T02:26:58.7541392Z  99 │ Gesture.Pan() 2026-10-25T02:26:58.7541466Z ·  ─┬─ 2026-10-25T02:26:58.7541594Z · ╰── `Pan` may be a component 2026-10-25T02:26:58.7541675Z 100 │ .enabled(!props.disabled) 2026-10-25T02:26:58.7541727Z ╰──── 2026-10-25T02:26:58.7541999Z  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-25T02:26:58.7542441Z  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-25T02:26:58.7542443Z 2026-10-25T02:26:58.7542628Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-25T02:26:58.7542785Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5] 2026-10-25T02:26:58.7542852Z 103 │ .runOnJS(true) 2026-10-25T02:26:58.7542948Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-25T02:26:58.7543034Z ·  ───┬── 2026-10-25T02:26:58.7543520Z · ╰── 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-25T02:26:58.7543732Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-25T02:26:58.7543855Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-25T02:26:58.7543979Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-25T02:26:58.7544052Z 108 │ [props.disabled], 2026-10-25T02:26:58.7579215Z ·  ────────┬─────── 2026-10-25T02:26:58.7579498Z · ╰── This dependency list is missing values used by the callback 2026-10-25T02:26:58.7579557Z 109 │ ); 2026-10-25T02:26:58.7579624Z ╰──── 2026-10-25T02:26:58.7579841Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-25T02:26:58.7580162Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7580167Z 2026-10-25T02:26:58.7580321Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.7580476Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:148:27] 2026-10-25T02:26:58.7580659Z 147 │ 2026-10-25T02:26:58.7580740Z 148 │ {props.children(open)} 2026-10-25T02:26:58.7580831Z ·  ──┬─ 2026-10-25T02:26:58.7580994Z · ╰── Cannot access ref value during render 2026-10-25T02:26:58.7581061Z 149 │ 2026-10-25T02:26:58.7581112Z ╰──── 2026-10-25T02:26:58.7581576Z  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-25T02:26:58.7581865Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.7581869Z 2026-10-25T02:26:58.7582064Z ⚠ react(memo-dependencies): Found missing/extra memoization dependencies 2026-10-25T02:26:58.7582218Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:136:9] 2026-10-25T02:26:58.7582303Z 135 │ if (action.id !== undefined) { 2026-10-25T02:26:58.7582382Z 136 │ props.onPressAction?.({ 2026-10-25T02:26:58.7582452Z ·  ──┬── 2026-10-25T02:26:58.7582585Z · ╰── Missing dependency `props` 2026-10-25T02:26:58.7582677Z 137 │ nativeEvent: { event: action.id }, 2026-10-25T02:26:58.7582821Z 138 │ } as Parameters>[0]); 2026-10-25T02:26:58.7582875Z 139 │ } 2026-10-25T02:26:58.7582931Z 140 │ }, 2026-10-25T02:26:58.7583013Z 141 │ [close, props.onPressAction], 2026-10-25T02:26:58.7583106Z ·  ─────────┬───────── 2026-10-25T02:26:58.7583316Z · ╰── Overly precise dependency `props.onPressAction`, use `props` instead 2026-10-25T02:26:58.7583514Z 142 │ ); 2026-10-25T02:26:58.7583630Z ╰──── 2026-10-25T02:26:58.7584182Z  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-25T02:26:58.7584493Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7584495Z 2026-10-25T02:26:58.7584680Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T02:26:58.7584819Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:121:27] 2026-10-25T02:26:58.7584984Z 120 │ const scope = makeScope(options.capabilities ?? new Set(["preview", "worktree"])); 2026-10-25T02:26:58.7585073Z 121 │ const dispatch = vi.fn((_: unknown) => 2026-10-25T02:26:58.7585156Z ·  ┬ 2026-10-25T02:26:58.7585423Z · ╰── '_' is declared here 2026-10-25T02:26:58.7585536Z 122 │ (options.dispatchGate ?? Effect.void).pipe( 2026-10-25T02:26:58.7585587Z ╰──── 2026-10-25T02:26:58.7585688Z  help: Consider removing this parameter. 2026-10-25T02:26:58.7585690Z 2026-10-25T02:26:58.7585909Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T02:26:58.7586060Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:134:39] 2026-10-25T02:26:58.7586114Z 133 │ ); 2026-10-25T02:26:58.7586220Z 134 │ const listLocalBranchNames = vi.fn((_: string) => 2026-10-25T02:26:58.7586322Z ·  ┬ 2026-10-25T02:26:58.7586460Z · ╰── '_' is declared here 2026-10-25T02:26:58.7586529Z 135 │ Effect.succeed( 2026-10-25T02:26:58.7586578Z ╰──── 2026-10-25T02:26:58.7586676Z  help: Consider removing this parameter. 2026-10-25T02:26:58.7586679Z 2026-10-25T02:26:58.7586855Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T02:26:58.7586987Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:178:31] 2026-10-25T02:26:58.7587040Z 177 │ }); 2026-10-25T02:26:58.7587137Z 178 │ const sendToThread = vi.fn((_: unknown) => { 2026-10-25T02:26:58.7587223Z ·  ┬ 2026-10-25T02:26:58.7587360Z · ╰── '_' is declared here 2026-10-25T02:26:58.7587458Z 179 │ switch (options.continuation ?? "queued") { 2026-10-25T02:26:58.7587510Z ╰──── 2026-10-25T02:26:58.7587608Z  help: Consider removing this parameter. 2026-10-25T02:26:58.7587611Z 2026-10-25T02:26:58.7587788Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T02:26:58.7587917Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:203:33] 2026-10-25T02:26:58.7587973Z 202 │ ); 2026-10-25T02:26:58.7588068Z 203 │ const removeWorktree = vi.fn((_: unknown) => 2026-10-25T02:26:58.7588158Z ·  ┬ 2026-10-25T02:26:58.7588288Z · ╰── '_' is declared here 2026-10-25T02:26:58.7588369Z 204 │ options.removeWorktreeFails 2026-10-25T02:26:58.7588490Z ╰──── 2026-10-25T02:26:58.7588648Z  help: Consider removing this parameter. 2026-10-25T02:26:58.7588651Z 2026-10-25T02:26:58.7588849Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T02:26:58.7588981Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:208:36] 2026-10-25T02:26:58.7589034Z 207 │ ); 2026-10-25T02:26:58.7589135Z 208 │ const deleteLocalBranch = vi.fn((_: unknown) => 2026-10-25T02:26:58.7589227Z ·  ┬ 2026-10-25T02:26:58.7589362Z · ╰── '_' is declared here 2026-10-25T02:26:58.7589446Z 209 │ options.deleteLocalBranchFails 2026-10-25T02:26:58.7589496Z ╰──── 2026-10-25T02:26:58.7589592Z  help: Consider removing this parameter. 2026-10-25T02:26:58.7589599Z 2026-10-25T02:26:58.7589777Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T02:26:58.7589907Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:213:42] 2026-10-25T02:26:58.7589961Z 212 │ ); 2026-10-25T02:26:58.7590071Z 213 │ const fetchWorktreeBaseCommit = vi.fn((_: unknown) => 2026-10-25T02:26:58.7590168Z ·  ┬ 2026-10-25T02:26:58.7590307Z · ╰── '_' is declared here 2026-10-25T02:26:58.7590391Z 214 │ options.fetchWorktreeBaseFails 2026-10-25T02:26:58.7590439Z ╰──── 2026-10-25T02:26:58.7590538Z  help: Consider removing this parameter. 2026-10-25T02:26:58.7590540Z 2026-10-25T02:26:58.7590724Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T02:26:58.7590860Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:254:30] 2026-10-25T02:26:58.7590912Z 253 │ ); 2026-10-25T02:26:58.7591002Z 254 │ const localStatus = vi.fn((_: unknown) => 2026-10-25T02:26:58.7591087Z ·  ┬ 2026-10-25T02:26:58.7591218Z · ╰── '_' is declared here 2026-10-25T02:26:58.7591284Z 255 │ Effect.succeed({ 2026-10-25T02:26:58.7591335Z ╰──── 2026-10-25T02:26:58.7591432Z  help: Consider removing this parameter. 2026-10-25T02:26:58.7591434Z 2026-10-25T02:26:58.7591611Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T02:26:58.7591739Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:264:32] 2026-10-25T02:26:58.7591796Z 263 │ ); 2026-10-25T02:26:58.7591947Z 264 │ const refreshStatus = vi.fn((_: string) => Effect.die("refreshStatus stub")); 2026-10-25T02:26:58.7592036Z ·  ┬ 2026-10-25T02:26:58.7592166Z · ╰── '_' is declared here 2026-10-25T02:26:58.7592311Z 265 │ const runForThread = vi.fn((input: { readonly worktreePath: string }) => { 2026-10-25T02:26:58.7592361Z ╰──── 2026-10-25T02:26:58.7592458Z  help: Consider removing this parameter. 2026-10-25T02:26:58.7592460Z 2026-10-25T02:26:58.7592600Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.7592716Z ╭─[apps/mobile/src/components/ui/Menu.tsx:54:36] 2026-10-25T02:26:58.7592955Z 53 │ const child = children as ReactElement>; 2026-10-25T02:26:58.7593202Z 54 │ ╭─▶ children = cloneElement(child, { 2026-10-25T02:26:58.7593306Z 55 │ │ onTouchStart: (event) => { 2026-10-25T02:26:58.7593505Z 56 │ │ // onPressIn can repeat within one gesture when a finger leaves and re-enters the row. 2026-10-25T02:26:58.7593632Z 57 │ │ menuPress.current.isPreparing = false; 2026-10-25T02:26:58.7593796Z 58 │ │ menuPress.current.suppressPress = menuPress.current.isOpen; 2026-10-25T02:26:58.7593906Z 59 │ │ pendingPress.current = null; 2026-10-25T02:26:58.7594023Z 60 │ │ child.props.onTouchStart?.(event); 2026-10-25T02:26:58.7594098Z 61 │ │ }, 2026-10-25T02:26:58.7594205Z 62 │ │ onPress: (event) => { 2026-10-25T02:26:58.7594415Z 63 │ │ // Accessibility clicks lack touch identifiers and must ignore previous touch cancellation. 2026-10-25T02:26:58.7594579Z 64 │ │ const isTouch = typeof event.nativeEvent.identifier === "number"; 2026-10-25T02:26:58.7594763Z 65 │ │ if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) { 2026-10-25T02:26:58.7594849Z 66 │ │ return; 2026-10-25T02:26:58.7594924Z 67 │ │ } 2026-10-25T02:26:58.7595060Z 68 │ │ if (isTouch && menuPress.current.isPreparing) { 2026-10-25T02:26:58.7595273Z 69 │ │ // A release can precede native display; let UIKit's display/cancel callback decide its outcome. 2026-10-25T02:26:58.7595376Z 70 │ │ event.persist(); 2026-10-25T02:26:58.7595534Z 71 │ │ pendingPress.current = () => child.props.onPress?.(event); 2026-10-25T02:26:58.7595617Z 72 │ │ return; 2026-10-25T02:26:58.7595692Z 73 │ │ } 2026-10-25T02:26:58.7595804Z 74 │ │ child.props.onPress?.(event); 2026-10-25T02:26:58.7595914Z 75 │ │ }, 2026-10-25T02:26:58.7596041Z 76 │ ├─▶ }); 2026-10-25T02:26:58.7596274Z · ╰──── Passing a ref to a function may read its value during render 2026-10-25T02:26:58.7596376Z 77 │ menuProps.onMenuInteractionStart = () => { 2026-10-25T02:26:58.7596428Z ╰──── 2026-10-25T02:26:58.7596898Z  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-25T02:26:58.7597189Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.7597192Z 2026-10-25T02:26:58.7597345Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:26:58.7597497Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:90:5] 2026-10-25T02:26:58.7597549Z 79 │ 2026-10-25T02:26:58.7597640Z 80 │ const cardCoverage = props.cardCoverage; 2026-10-25T02:26:58.7597719Z ·  ──────┬───── 2026-10-25T02:26:58.7597912Z · ╰── `cardCoverage` originates here 2026-10-25T02:26:58.7598043Z 81 │ const barHeightRef = useRef(0); 2026-10-25T02:26:58.7598148Z 82 │ const cardHeightRef = useRef(0); 2026-10-25T02:26:58.7598232Z 83 │ const cardHeight = useSharedValue(0); 2026-10-25T02:26:58.7598323Z 84 │ const notifyCoverage = useCallback(() => { 2026-10-25T02:26:58.7598390Z 85 │ if (!cardCoverage) { 2026-10-25T02:26:58.7598448Z 86 │ return; 2026-10-25T02:26:58.7598501Z 87 │ } 2026-10-25T02:26:58.7598663Z 88 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-25T02:26:58.7598763Z 89 │ // feed inset and floating controls trailing it. 2026-10-25T02:26:58.7598920Z 90 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-25T02:26:58.7598997Z ·  ──────┬───── 2026-10-25T02:26:58.7599140Z · ╰── `cardCoverage` cannot be modified 2026-10-25T02:26:58.7599209Z 91 │ }, [cardCoverage]); 2026-10-25T02:26:58.7599258Z ╰──── 2026-10-25T02:26:58.7599551Z  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-25T02:26:58.7599851Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:26:58.7599854Z 2026-10-25T02:26:58.7600006Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:26:58.7600160Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:102:7] 2026-10-25T02:26:58.7600238Z  82 │ const cardHeightRef = useRef(0); 2026-10-25T02:26:58.7600327Z  83 │ const cardHeight = useSharedValue(0); 2026-10-25T02:26:58.7600406Z ·  ─────┬──── 2026-10-25T02:26:58.7600538Z · ╰── `cardHeight` originates here 2026-10-25T02:26:58.7600629Z  84 │ const notifyCoverage = useCallback(() => { 2026-10-25T02:26:58.7600697Z  85 │ if (!cardCoverage) { 2026-10-25T02:26:58.7600757Z  86 │ return; 2026-10-25T02:26:58.7600809Z  87 │ } 2026-10-25T02:26:58.7600968Z  88 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-25T02:26:58.7601066Z  89 │ // feed inset and floating controls trailing it. 2026-10-25T02:26:58.7601219Z  90 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-25T02:26:58.7601282Z  91 │ }, [cardCoverage]); 2026-10-25T02:26:58.7601425Z  92 │ const handleBarLayout = useCallback( 2026-10-25T02:26:58.7601549Z  93 │ (event: LayoutChangeEvent) => { 2026-10-25T02:26:58.7601695Z  94 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-25T02:26:58.7601762Z  95 │ notifyCoverage(); 2026-10-25T02:26:58.7601816Z  96 │ }, 2026-10-25T02:26:58.7601881Z  97 │ [notifyCoverage], 2026-10-25T02:26:58.7601935Z  98 │ ); 2026-10-25T02:26:58.7602016Z  99 │ const handleCardLayout = useCallback( 2026-10-25T02:26:58.7602098Z 100 │ (event: LayoutChangeEvent) => { 2026-10-25T02:26:58.7602224Z 101 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-25T02:26:58.7602336Z 102 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-25T02:26:58.7602411Z ·  ─────┬──── 2026-10-25T02:26:58.7602552Z · ╰── `cardHeight` cannot be modified 2026-10-25T02:26:58.7602620Z 103 │ notifyCoverage(); 2026-10-25T02:26:58.7602671Z ╰──── 2026-10-25T02:26:58.7602930Z  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-25T02:26:58.7603231Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:26:58.7603234Z 2026-10-25T02:26:58.7603429Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-25T02:26:58.7603582Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:90:5] 2026-10-25T02:26:58.7603668Z 83 │ const cardHeight = useSharedValue(0); 2026-10-25T02:26:58.7603756Z 84 │ const notifyCoverage = useCallback(() => { 2026-10-25T02:26:58.7603860Z ·  ───┬─── 2026-10-25T02:26:58.7604093Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-25T02:26:58.7604159Z 85 │ if (!cardCoverage) { 2026-10-25T02:26:58.7604216Z 86 │ return; 2026-10-25T02:26:58.7604268Z 87 │ } 2026-10-25T02:26:58.7604428Z 88 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-25T02:26:58.7604527Z 89 │ // feed inset and floating controls trailing it. 2026-10-25T02:26:58.7604680Z 90 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-25T02:26:58.7604755Z ·  ──────┬───── 2026-10-25T02:26:58.7604884Z · ╰── This modifies `cardCoverage` 2026-10-25T02:26:58.7604955Z 91 │ }, [cardCoverage]); 2026-10-25T02:26:58.7605006Z ╰──── 2026-10-25T02:26:58.7605349Z  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-25T02:26:58.7605651Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:26:58.7605654Z 2026-10-25T02:26:58.7605884Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-25T02:26:58.7606033Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:90:5] 2026-10-25T02:26:58.7606132Z 89 │ // feed inset and floating controls trailing it. 2026-10-25T02:26:58.7606346Z 90 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-25T02:26:58.7606464Z ·  ──────┬───── 2026-10-25T02:26:58.7606624Z · ╰── This modifies `cardCoverage` 2026-10-25T02:26:58.7606689Z 91 │ }, [cardCoverage]); 2026-10-25T02:26:58.7606772Z 92 │ const handleBarLayout = useCallback( 2026-10-25T02:26:58.7606851Z 93 │ (event: LayoutChangeEvent) => { 2026-10-25T02:26:58.7606952Z ·  ───────────────┬─────────────── 2026-10-25T02:26:58.7607168Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-25T02:26:58.7607287Z 94 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-25T02:26:58.7607338Z ╰──── 2026-10-25T02:26:58.7607677Z  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-25T02:26:58.7607980Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:26:58.7607982Z 2026-10-25T02:26:58.7608176Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-25T02:26:58.7608330Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:102:7] 2026-10-25T02:26:58.7608414Z  99 │ const handleCardLayout = useCallback( 2026-10-25T02:26:58.7608493Z 100 │ (event: LayoutChangeEvent) => { 2026-10-25T02:26:58.7608595Z ·  ───────────────┬─────────────── 2026-10-25T02:26:58.7608814Z · ╰── This function may (indirectly) reassign or modify `cardHeight` after render 2026-10-25T02:26:58.7608940Z 101 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-25T02:26:58.7609050Z 102 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-25T02:26:58.7609125Z ·  ─────┬──── 2026-10-25T02:26:58.7609252Z · ╰── This modifies `cardHeight` 2026-10-25T02:26:58.7609318Z 103 │ notifyCoverage(); 2026-10-25T02:26:58.7609368Z ╰──── 2026-10-25T02:26:58.7609697Z  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-25T02:26:58.7609996Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:26:58.7610003Z 2026-10-25T02:26:58.7610188Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-25T02:26:58.7610341Z ╭─[apps/mobile/src/features/threads/ThreadQueueControl.tsx:606:27] 2026-10-25T02:26:58.7610504Z 605 │ const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success)); 2026-10-25T02:26:58.7610581Z 606 │ const gesture = Gesture.Pan() 2026-10-25T02:26:58.7610665Z ·  ─┬─ 2026-10-25T02:26:58.7610801Z · ╰── `Pan` may be a component 2026-10-25T02:26:58.7610874Z 607 │ .enabled(!props.disabled) 2026-10-25T02:26:58.7610925Z ╰──── 2026-10-25T02:26:58.7611258Z  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-25T02:26:58.7611769Z  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-25T02:26:58.7611772Z 2026-10-25T02:26:58.7612023Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:26:58.7612157Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2221:5] 2026-10-25T02:26:58.7612212Z 2219 │ ); 2026-10-25T02:26:58.7612276Z 2220 │ useEffect(() => { 2026-10-25T02:26:58.7612347Z ·  ────┬──── 2026-10-25T02:26:58.7612473Z · ╰── This is the containing effect 2026-10-25T02:26:58.7612547Z 2221 │ setExpandedVideo(null); 2026-10-25T02:26:58.7612633Z ·  ────────┬─────── 2026-10-25T02:26:58.7612802Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7612871Z 2222 │ setExpandedFile(null); 2026-10-25T02:26:58.7612923Z ╰──── 2026-10-25T02:26:58.7613514Z  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-25T02:26:58.7613832Z  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-25T02:26:58.7613835Z 2026-10-25T02:26:58.7614088Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:26:58.7614223Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2714:9] 2026-10-25T02:26:58.7614358Z 2705 │ const stopFollowingEnd = useEffectEvent(() => setEndFollow(false)); 2026-10-25T02:26:58.7614423Z 2706 │ useEffect(() => { 2026-10-25T02:26:58.7614494Z ·  ────┬──── 2026-10-25T02:26:58.7614619Z · ╰── This is the containing effect 2026-10-25T02:26:58.7614746Z 2707 │ if (!jumpToMessageId || loadedListKey !== listMountKey) return; 2026-10-25T02:26:58.7614839Z 2708 │ const index = presentedFeed.findIndex( 2026-10-25T02:26:58.7614972Z 2709 │ (entry) => entry.type === "message" && entry.id === jumpToMessageId, 2026-10-25T02:26:58.7615025Z 2710 │ ); 2026-10-25T02:26:58.7615103Z 2711 │ if (index === -1) { 2026-10-25T02:26:58.7615232Z 2712 │ const runId = messageFoldRunId(props.feed, jumpToMessageId); 2026-10-25T02:26:58.7615333Z 2713 │ if (runId && !expandedTurnIds.has(runId)) { 2026-10-25T02:26:58.7615425Z 2714 │ setInteractionState((current) => ({ 2026-10-25T02:26:58.7615512Z ·  ─────────┬───────── 2026-10-25T02:26:58.7615684Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7615750Z 2715 │ ...current, 2026-10-25T02:26:58.7615800Z ╰──── 2026-10-25T02:26:58.7616491Z  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-25T02:26:58.7616882Z  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-25T02:26:58.7616885Z 2026-10-25T02:26:58.7617111Z ⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used. 2026-10-25T02:26:58.7617243Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:72:10] 2026-10-25T02:26:58.7617377Z 71 │ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets"; 2026-10-25T02:26:58.7617516Z 72 │ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks"; 2026-10-25T02:26:58.7617610Z ·  ───────────┬─────────── 2026-10-25T02:26:58.7617778Z · ╰── 'isMarkdownFileLinkLabel' is imported here 2026-10-25T02:26:58.7617932Z 73 │ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments"; 2026-10-25T02:26:58.7617984Z ╰──── 2026-10-25T02:26:58.7618079Z  help: Consider removing this import. 2026-10-25T02:26:58.7618082Z 2026-10-25T02:26:58.7618284Z ⚠ eslint(no-unused-vars): Identifier 'createContext' is imported but never used. 2026-10-25T02:26:58.7618411Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:98:3] 2026-10-25T02:26:58.7618470Z 97 │ import { 2026-10-25T02:26:58.7618533Z 98 │ createContext, 2026-10-25T02:26:58.7618607Z ·  ──────┬────── 2026-10-25T02:26:58.7618738Z · ╰── 'createContext' is imported here 2026-10-25T02:26:58.7618793Z 99 │ memo, 2026-10-25T02:26:58.7618845Z ╰──── 2026-10-25T02:26:58.7618947Z  help: Consider removing this import. 2026-10-25T02:26:58.7618952Z 2026-10-25T02:26:58.7619156Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-25T02:26:58.7619288Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:114:3] 2026-10-25T02:26:58.7619345Z 113 │ import { 2026-10-25T02:26:58.7619412Z 114 │ ActivityIndicator, 2026-10-25T02:26:58.7619491Z ·  ────────┬──────── 2026-10-25T02:26:58.7619634Z · ╰── 'ActivityIndicator' is imported here 2026-10-25T02:26:58.7619692Z 115 │ Image, 2026-10-25T02:26:58.7619741Z ╰──── 2026-10-25T02:26:58.7619834Z  help: Consider removing this import. 2026-10-25T02:26:58.7619836Z 2026-10-25T02:26:58.7620038Z ⚠ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used. 2026-10-25T02:26:58.7620170Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:121:3] 2026-10-25T02:26:58.7620231Z 120 │ Pressable, 2026-10-25T02:26:58.7620292Z 121 │ ScrollView, 2026-10-25T02:26:58.7620363Z ·  ─────┬──── 2026-10-25T02:26:58.7620491Z · ╰── 'ScrollView' is imported here 2026-10-25T02:26:58.7620550Z 122 │ StyleSheet, 2026-10-25T02:26:58.7620598Z ╰──── 2026-10-25T02:26:58.7620693Z  help: Consider removing this import. 2026-10-25T02:26:58.7620696Z 2026-10-25T02:26:58.7620888Z ⚠ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used. 2026-10-25T02:26:58.7621021Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:123:11] 2026-10-25T02:26:58.7621079Z 122 │ StyleSheet, 2026-10-25T02:26:58.7621208Z 123 │ Text as NativeText, 2026-10-25T02:26:58.7621333Z ·  ─────┬──── 2026-10-25T02:26:58.7621496Z · ╰── 'NativeText' is imported here 2026-10-25T02:26:58.7621560Z 124 │ type ColorValue, 2026-10-25T02:26:58.7621612Z ╰──── 2026-10-25T02:26:58.7621705Z  help: Consider removing this import. 2026-10-25T02:26:58.7621707Z 2026-10-25T02:26:58.7621915Z ⚠ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used. 2026-10-25T02:26:58.7622045Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:146:10] 2026-10-25T02:26:58.7622179Z 145 │ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic"; 2026-10-25T02:26:58.7622304Z 146 │ import { tryOpenExternalUrl } from "../../lib/openExternalUrl"; 2026-10-25T02:26:58.7622396Z ·  ─────────┬──────── 2026-10-25T02:26:58.7622547Z · ╰── 'tryOpenExternalUrl' is imported here 2026-10-25T02:26:58.7622692Z 147 │ import { downloadAndShareAttachment } from "../../lib/attachmentDownload"; 2026-10-25T02:26:58.7622743Z ╰──── 2026-10-25T02:26:58.7622836Z  help: Consider removing this import. 2026-10-25T02:26:58.7622838Z 2026-10-25T02:26:58.7623049Z ⚠ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used. 2026-10-25T02:26:58.7623180Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:149:10] 2026-10-25T02:26:58.7623311Z 148 │ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks"; 2026-10-25T02:26:58.7623433Z 149 │ import { faviconUrlForOrigin } from "@t3tools/shared/favicon"; 2026-10-25T02:26:58.7623525Z ·  ─────────┬───────── 2026-10-25T02:26:58.7623675Z · ╰── 'faviconUrlForOrigin' is imported here 2026-10-25T02:26:58.7623734Z 150 │ import { 2026-10-25T02:26:58.7623784Z ╰──── 2026-10-25T02:26:58.7623874Z  help: Consider removing this import. 2026-10-25T02:26:58.7623877Z 2026-10-25T02:26:58.7624085Z ⚠ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used. 2026-10-25T02:26:58.7624214Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:163:10] 2026-10-25T02:26:58.7624359Z 162 │ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile"; 2026-10-25T02:26:58.7624490Z 163 │ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer"; 2026-10-25T02:26:58.7624576Z ·  ────────┬─────── 2026-10-25T02:26:58.7624781Z · ╰── 'MediaVideoPlayer' is imported here 2026-10-25T02:26:58.7624996Z 164 │ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia"; 2026-10-25T02:26:58.7625046Z ╰──── 2026-10-25T02:26:58.7625138Z  help: Consider removing this import. 2026-10-25T02:26:58.7625141Z 2026-10-25T02:26:58.7625499Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used. 2026-10-25T02:26:58.7625628Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:167:3] 2026-10-25T02:26:58.7625708Z 166 │ attachmentVideoPreviewSource, 2026-10-25T02:26:58.7625777Z 167 │ mediaVideoPreviewUri, 2026-10-25T02:26:58.7625892Z ·  ──────────┬───────── 2026-10-25T02:26:58.7626062Z · ╰── 'mediaVideoPreviewUri' is imported here 2026-10-25T02:26:58.7626135Z 168 │ mediaVideoThumbnailKey, 2026-10-25T02:26:58.7626183Z ╰──── 2026-10-25T02:26:58.7626277Z  help: Consider removing this import. 2026-10-25T02:26:58.7626279Z 2026-10-25T02:26:58.7626496Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used. 2026-10-25T02:26:58.7626625Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:168:3] 2026-10-25T02:26:58.7626692Z 167 │ mediaVideoPreviewUri, 2026-10-25T02:26:58.7626763Z 168 │ mediaVideoThumbnailKey, 2026-10-25T02:26:58.7626848Z ·  ───────────┬────────── 2026-10-25T02:26:58.7627003Z · ╰── 'mediaVideoThumbnailKey' is imported here 2026-10-25T02:26:58.7627081Z 169 │ type MediaVideoPreviewSource, 2026-10-25T02:26:58.7627132Z ╰──── 2026-10-25T02:26:58.7627232Z  help: Consider removing this import. 2026-10-25T02:26:58.7627237Z 2026-10-25T02:26:58.7627445Z ⚠ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used. 2026-10-25T02:26:58.7627572Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:169:8] 2026-10-25T02:26:58.7627642Z 168 │ mediaVideoThumbnailKey, 2026-10-25T02:26:58.7627720Z 169 │ type MediaVideoPreviewSource, 2026-10-25T02:26:58.7627812Z ·  ───────────┬─────────── 2026-10-25T02:26:58.7627970Z · ╰── 'MediaVideoPreviewSource' is imported here 2026-10-25T02:26:58.7628057Z 170 │ } from "../../lib/videoPreviewSource"; 2026-10-25T02:26:58.7628108Z ╰──── 2026-10-25T02:26:58.7628201Z  help: Consider removing this import. 2026-10-25T02:26:58.7628203Z 2026-10-25T02:26:58.7628430Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used. 2026-10-25T02:26:58.7628561Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:191:3] 2026-10-25T02:26:58.7628620Z 190 │ import { 2026-10-25T02:26:58.7628693Z 191 │ resolveMarkdownFontSizes, 2026-10-25T02:26:58.7628780Z ·  ────────────┬─────────── 2026-10-25T02:26:58.7628937Z · ╰── 'resolveMarkdownFontSizes' is imported here 2026-10-25T02:26:58.7629023Z 192 │ resolveNativeMarkdownTypography, 2026-10-25T02:26:58.7629072Z ╰──── 2026-10-25T02:26:58.7629164Z  help: Consider removing this import. 2026-10-25T02:26:58.7629166Z 2026-10-25T02:26:58.7629500Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used. 2026-10-25T02:26:58.7629735Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:198:3] 2026-10-25T02:26:58.7629813Z 197 │ normalizeNativeMarkdownUrl, 2026-10-25T02:26:58.7629904Z 198 │ resolveMarkdownInlineCodePresentation, 2026-10-25T02:26:58.7630013Z ·  ──────────────────┬────────────────── 2026-10-25T02:26:58.7630203Z · ╰── 'resolveMarkdownInlineCodePresentation' is imported here 2026-10-25T02:26:58.7630286Z 199 │ resolveMarkdownLinkPresentation, 2026-10-25T02:26:58.7630336Z ╰──── 2026-10-25T02:26:58.7630429Z  help: Consider removing this import. 2026-10-25T02:26:58.7630431Z 2026-10-25T02:26:58.7630640Z ⚠ eslint(no-unused-vars): Type 'PendingThreadFeedEntry' is imported but never used. 2026-10-25T02:26:58.7630774Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:237:8] 2026-10-25T02:26:58.7630854Z 236 │ isCompactionCommandFeedEntry, 2026-10-25T02:26:58.7630929Z 237 │ type PendingThreadFeedEntry, 2026-10-25T02:26:58.7631020Z ·  ───────────┬────────── 2026-10-25T02:26:58.7631175Z · ╰── 'PendingThreadFeedEntry' is imported here 2026-10-25T02:26:58.7631241Z 238 │ type ThreadFeedRow, 2026-10-25T02:26:58.7631290Z ╰──── 2026-10-25T02:26:58.7631383Z  help: Consider removing this import. 2026-10-25T02:26:58.7631385Z 2026-10-25T02:26:58.7631590Z ⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used. 2026-10-25T02:26:58.7631718Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:248:3] 2026-10-25T02:26:58.7631780Z 247 │ useAssetUrl, 2026-10-25T02:26:58.7631851Z 248 │ useAssetUrlState, 2026-10-25T02:26:58.7631933Z ·  ────────┬─────── 2026-10-25T02:26:58.7632073Z · ╰── 'useAssetUrlState' is imported here 2026-10-25T02:26:58.7632138Z 249 │ useRefreshAssetUrl, 2026-10-25T02:26:58.7632188Z ╰──── 2026-10-25T02:26:58.7632280Z  help: Consider removing this import. 2026-10-25T02:26:58.7632283Z 2026-10-25T02:26:58.7632480Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:26:58.7632612Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2223:7] 2026-10-25T02:26:58.7632684Z 2222 │ setExpandedFile(null); 2026-10-25T02:26:58.7632839Z 2223 │ }, [props.environmentId, props.threadId, props.contentPresentation.kind]); 2026-10-25T02:26:58.7633063Z ·  ─────────┬───────── ───────┬────── ───────────────┬────────────── 2026-10-25T02:26:58.7633350Z · │ │ ╰── Unnecessary dependency `props.contentPresentation.kind` 2026-10-25T02:26:58.7633545Z · │ ╰── Unnecessary dependency `props.threadId` 2026-10-25T02:26:58.7633705Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-25T02:26:58.7633845Z 2224 │ const horizontalPadding = props.layoutVariant === "split" ? 20 : 16; 2026-10-25T02:26:58.7633894Z ╰──── 2026-10-25T02:26:58.7634254Z  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-25T02:26:58.7634640Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7634643Z 2026-10-25T02:26:58.7634840Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:26:58.7634974Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2683:7] 2026-10-25T02:26:58.7635068Z 2682 │ reportHeaderMaterialVisibility(false); 2026-10-25T02:26:58.7635183Z 2683 │ }, [feedThreadKey, reportHeaderMaterialVisibility]); 2026-10-25T02:26:58.7635262Z ·  ──────┬────── 2026-10-25T02:26:58.7635408Z · ╰── Unnecessary dependency `feedThreadKey` 2026-10-25T02:26:58.7635461Z 2684 │ 2026-10-25T02:26:58.7635514Z ╰──── 2026-10-25T02:26:58.7635805Z  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-25T02:26:58.7636152Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7636155Z 2026-10-25T02:26:58.7636351Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:26:58.7636480Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2699:7] 2026-10-25T02:26:58.7636536Z 2698 │ } 2026-10-25T02:26:58.7636665Z 2699 │ }, [listMountKey, props.contentInsetEndAdjustment, listRef]); 2026-10-25T02:26:58.7636743Z ·  ──────┬───── 2026-10-25T02:26:58.7636889Z · ╰── Unnecessary dependency `listMountKey` 2026-10-25T02:26:58.7637034Z 2700 │ // Opening at a message: its run unfolds, the list stops following the end 2026-10-25T02:26:58.7637085Z ╰──── 2026-10-25T02:26:58.7637370Z  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-25T02:26:58.7637672Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7637675Z 2026-10-25T02:26:58.7637872Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:26:58.7638003Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2893:7] 2026-10-25T02:26:58.7638060Z 2892 │ } 2026-10-25T02:26:58.7638239Z 2893 │ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]); 2026-10-25T02:26:58.7638437Z ·  ───────┬─────── ─────────┬──────── ────────┬─────── 2026-10-25T02:26:58.7638687Z · │ │ ╰── Unnecessary dependency `expandedWorkRows` 2026-10-25T02:26:58.7638885Z · │ ╰── Unnecessary dependency `expandedWorkGroups` 2026-10-25T02:26:58.7639034Z · ╰── Unnecessary dependency `expandedTurnIds` 2026-10-25T02:26:58.7639086Z 2894 │ 2026-10-25T02:26:58.7639136Z ╰──── 2026-10-25T02:26:58.7639481Z  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-25T02:26:58.7639870Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7639873Z 2026-10-25T02:26:58.7640049Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-25T02:26:58.7640183Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:626:9] 2026-10-25T02:26:58.7640241Z 625 │ }; 2026-10-25T02:26:58.7640357Z 626 │ }, [props.environmentId, attachment.id, httpBaseUrl]), 2026-10-25T02:26:58.7640541Z ·  ─────────┬───────── ──────┬────── ─────┬───── 2026-10-25T02:26:58.7640782Z · │ │ ╰── Unnecessary dependency `httpBaseUrl` 2026-10-25T02:26:58.7640976Z · │ ╰── Unnecessary dependency `attachment.id` 2026-10-25T02:26:58.7641136Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-25T02:26:58.7641190Z 627 │ ); 2026-10-25T02:26:58.7641239Z ╰──── 2026-10-25T02:26:58.7641545Z  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-25T02:26:58.7641850Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7641853Z 2026-10-25T02:26:58.7642110Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:26:58.7642241Z ╭─[packages/provider-pi/src/server/adapter.ts:3337:7] 2026-10-25T02:26:58.7642292Z 3336 │ 2026-10-25T02:26:58.7642479Z 3337 │ const layer: Layer.Layer = 2026-10-25T02:26:58.7642550Z ·  ──┬── 2026-10-25T02:26:58.7642673Z · ╰── 'layer' is declared here 2026-10-25T02:26:58.7642736Z 3338 │ Layer.effect( 2026-10-25T02:26:58.7642788Z ╰──── 2026-10-25T02:26:58.7642890Z  help: Consider removing this declaration. 2026-10-25T02:26:58.7642892Z 2026-10-25T02:26:58.7643123Z ⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`. 2026-10-25T02:26:58.7643314Z ╭─[apps/web/src/terminal/ghostty/core.ts:186:19] 2026-10-25T02:26:58.7643437Z 185 │ const count = Math.min(CHUNK_SIZE, graphemeLength - start); 2026-10-25T02:26:58.7643526Z 186 │ const codes = new Array(count); 2026-10-25T02:26:58.7643634Z ·  ──────────────────────── 2026-10-25T02:26:58.7643733Z 187 │ for (let index = 0; index < count; index += 1) { 2026-10-25T02:26:58.7643784Z ╰──── 2026-10-25T02:26:58.7644195Z  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-25T02:26:58.7644197Z 2026-10-25T02:26:58.7644351Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:26:58.7644517Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:108:5] 2026-10-25T02:26:58.7644573Z 104 │ ); 2026-10-25T02:26:58.7644723Z 105 │ const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0); 2026-10-25T02:26:58.7644809Z ·  ─────────┬──────── 2026-10-25T02:26:58.7644954Z · ╰── `separationProgress` originates here 2026-10-25T02:26:58.7645007Z 106 │ 2026-10-25T02:26:58.7645072Z 107 │ useEffect(() => { 2026-10-25T02:26:58.7645244Z 108 │ separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING); 2026-10-25T02:26:58.7645326Z ·  ─────────┬──────── 2026-10-25T02:26:58.7645475Z · ╰── `separationProgress` cannot be modified 2026-10-25T02:26:58.7645587Z 109 │ }, [props.showScrollToEnd, separationProgress]); 2026-10-25T02:26:58.7645641Z ╰──── 2026-10-25T02:26:58.7645918Z  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-25T02:26:58.7646249Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:26:58.7646252Z 2026-10-25T02:26:58.7646403Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:26:58.7646564Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:132:5] 2026-10-25T02:26:58.7646787Z 122 │ // Animate an in-flow sizer for native glass layout. Measure labels at fixed width to avoid repeated animation retargeting. 2026-10-25T02:26:58.7646905Z 123 │ const capsuleWidth = useSharedValue(null); 2026-10-25T02:26:58.7646986Z ·  ──────┬───── 2026-10-25T02:26:58.7647118Z · ╰── `capsuleWidth` originates here 2026-10-25T02:26:58.7647228Z 124 │ const measuredWidthRef = useRef(null); 2026-10-25T02:26:58.7647340Z 125 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-25T02:26:58.7647445Z 126 │ const width = event.nativeEvent.layout.width; 2026-10-25T02:26:58.7647539Z 127 │ if (width === measuredWidthRef.current) { 2026-10-25T02:26:58.7647599Z 128 │ return; 2026-10-25T02:26:58.7647652Z 129 │ } 2026-10-25T02:26:58.7647755Z 130 │ const first = measuredWidthRef.current === null; 2026-10-25T02:26:58.7647841Z 131 │ measuredWidthRef.current = width; 2026-10-25T02:26:58.7648039Z 132 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-25T02:26:58.7648170Z ·  ──────┬───── 2026-10-25T02:26:58.7648332Z · ╰── `capsuleWidth` cannot be modified 2026-10-25T02:26:58.7648385Z 133 │ }; 2026-10-25T02:26:58.7648436Z ╰──── 2026-10-25T02:26:58.7648698Z  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-25T02:26:58.7648999Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:26:58.7649001Z 2026-10-25T02:26:58.7649152Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:26:58.7649310Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:139:7] 2026-10-25T02:26:58.7649536Z 122 │ // Animate an in-flow sizer for native glass layout. Measure labels at fixed width to avoid repeated animation retargeting. 2026-10-25T02:26:58.7649652Z 123 │ const capsuleWidth = useSharedValue(null); 2026-10-25T02:26:58.7649730Z ·  ──────┬───── 2026-10-25T02:26:58.7649862Z · ╰── `capsuleWidth` originates here 2026-10-25T02:26:58.7649972Z 124 │ const measuredWidthRef = useRef(null); 2026-10-25T02:26:58.7650084Z 125 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-25T02:26:58.7650188Z 126 │ const width = event.nativeEvent.layout.width; 2026-10-25T02:26:58.7650282Z 127 │ if (width === measuredWidthRef.current) { 2026-10-25T02:26:58.7650342Z 128 │ return; 2026-10-25T02:26:58.7650395Z 129 │ } 2026-10-25T02:26:58.7650502Z 130 │ const first = measuredWidthRef.current === null; 2026-10-25T02:26:58.7650588Z 131 │ measuredWidthRef.current = width; 2026-10-25T02:26:58.7650726Z 132 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-25T02:26:58.7650778Z 133 │ }; 2026-10-25T02:26:58.7650868Z 134 │ const hasStatus = props.status !== null; 2026-10-25T02:26:58.7650998Z 135 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-25T02:26:58.7651062Z 136 │ useEffect(() => { 2026-10-25T02:26:58.7651127Z 137 │ if (!hasStatus) { 2026-10-25T02:26:58.7651213Z 138 │ measuredWidthRef.current = null; 2026-10-25T02:26:58.7651290Z 139 │ capsuleWidth.value = null; 2026-10-25T02:26:58.7651365Z ·  ──────┬───── 2026-10-25T02:26:58.7651501Z · ╰── `capsuleWidth` cannot be modified 2026-10-25T02:26:58.7651561Z 140 │ } 2026-10-25T02:26:58.7651615Z ╰──── 2026-10-25T02:26:58.7651869Z  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-25T02:26:58.7652171Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:26:58.7652174Z 2026-10-25T02:26:58.7652370Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-25T02:26:58.7652529Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:139:7] 2026-10-25T02:26:58.7652663Z 135 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-25T02:26:58.7652727Z 136 │ useEffect(() => { 2026-10-25T02:26:58.7652805Z ·  ───┬─── 2026-10-25T02:26:58.7653082Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-25T02:26:58.7653182Z 137 │ if (!hasStatus) { 2026-10-25T02:26:58.7653305Z 138 │ measuredWidthRef.current = null; 2026-10-25T02:26:58.7653382Z 139 │ capsuleWidth.value = null; 2026-10-25T02:26:58.7653457Z ·  ──────┬───── 2026-10-25T02:26:58.7653589Z · ╰── This modifies `capsuleWidth` 2026-10-25T02:26:58.7653642Z 140 │ } 2026-10-25T02:26:58.7653693Z ╰──── 2026-10-25T02:26:58.7654028Z  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-25T02:26:58.7654330Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:26:58.7654335Z 2026-10-25T02:26:58.7654529Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-25T02:26:58.7654690Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:132:5] 2026-10-25T02:26:58.7654800Z 124 │ const measuredWidthRef = useRef(null); 2026-10-25T02:26:58.7654915Z 125 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-25T02:26:58.7655034Z ·  ───────────────┬─────────────── 2026-10-25T02:26:58.7655269Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-25T02:26:58.7655378Z 126 │ const width = event.nativeEvent.layout.width; 2026-10-25T02:26:58.7655476Z 127 │ if (width === measuredWidthRef.current) { 2026-10-25T02:26:58.7655534Z 128 │ return; 2026-10-25T02:26:58.7655589Z 129 │ } 2026-10-25T02:26:58.7655692Z 130 │ const first = measuredWidthRef.current === null; 2026-10-25T02:26:58.7655777Z 131 │ measuredWidthRef.current = width; 2026-10-25T02:26:58.7655954Z 132 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-25T02:26:58.7656032Z ·  ──────┬───── 2026-10-25T02:26:58.7656167Z · ╰── This modifies `capsuleWidth` 2026-10-25T02:26:58.7656221Z 133 │ }; 2026-10-25T02:26:58.7656270Z ╰──── 2026-10-25T02:26:58.7656608Z  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-25T02:26:58.7656910Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:26:58.7656913Z 2026-10-25T02:26:58.7657109Z ⚠ eslint(no-unused-vars): Identifier 'Duration' is imported but never used. 2026-10-25T02:26:58.7657246Z ╭─[packages/provider-pi/src/server/adapter.test.ts:24:13] 2026-10-25T02:26:58.7657338Z 23 │ import * as Deferred from "effect/Deferred"; 2026-10-25T02:26:58.7657430Z 24 │ import * as Duration from "effect/Duration"; 2026-10-25T02:26:58.7657510Z ·  ────┬─── 2026-10-25T02:26:58.7657642Z · ╰── 'Duration' is imported here 2026-10-25T02:26:58.7657725Z 25 │ import * as Effect from "effect/Effect"; 2026-10-25T02:26:58.7657837Z ╰──── 2026-10-25T02:26:58.7657986Z  help: Consider removing this import. 2026-10-25T02:26:58.7657989Z 2026-10-25T02:26:58.7658297Z ⚠ eslint(no-unused-vars): Variable 'revokeActiveMcpThread' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:26:58.7658422Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:214:7] 2026-10-25T02:26:58.7658476Z 213 │ 2026-10-25T02:26:58.7658621Z 214 │ const revokeActiveMcpThread = (threadId: ThreadId): Effect.Effect => 2026-10-25T02:26:58.7658711Z ·  ──────────┬────────── 2026-10-25T02:26:58.7658862Z · ╰── 'revokeActiveMcpThread' is declared here 2026-10-25T02:26:58.7659047Z 215 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeThread(threadId) : Effect.void; 2026-10-25T02:26:58.7659103Z ╰──── 2026-10-25T02:26:58.7659210Z  help: Consider removing this declaration. 2026-10-25T02:26:58.7659212Z 2026-10-25T02:26:58.7659513Z ⚠ eslint(no-unused-vars): Variable 'revokeAllActiveMcpCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:26:58.7659636Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:217:7] 2026-10-25T02:26:58.7659692Z 216 │ 2026-10-25T02:26:58.7659825Z 217 │ const revokeAllActiveMcpCredentials = (): Effect.Effect => 2026-10-25T02:26:58.7659924Z ·  ──────────────┬────────────── 2026-10-25T02:26:58.7660097Z · ╰── 'revokeAllActiveMcpCredentials' is declared here 2026-10-25T02:26:58.7660256Z 218 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void; 2026-10-25T02:26:58.7660312Z ╰──── 2026-10-25T02:26:58.7660415Z  help: Consider removing this declaration. 2026-10-25T02:26:58.7660419Z 2026-10-25T02:26:58.7660654Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-25T02:26:58.7660809Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:287:50] 2026-10-25T02:26:58.7660871Z 286 │ return ( 2026-10-25T02:26:58.7661003Z 287 │ 2026-10-25T02:26:58.7661119Z ·  ───────────── 2026-10-25T02:26:58.7661189Z 288 │ {props.children} 2026-10-25T02:26:58.7661241Z ╰──── 2026-10-25T02:26:58.7661460Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-25T02:26:58.7661654Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-25T02:26:58.7661681Z 2026-10-25T02:26:58.7661964Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-25T02:26:58.7662118Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:651:44] 2026-10-25T02:26:58.7662180Z 650 │ return ( 2026-10-25T02:26:58.7662298Z 651 │ 2026-10-25T02:26:58.7662410Z ·  ───────────── 2026-10-25T02:26:58.7662478Z 652 │ {props.children} 2026-10-25T02:26:58.7662529Z ╰──── 2026-10-25T02:26:58.7662744Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-25T02:26:58.7662884Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-25T02:26:58.7662889Z 2026-10-25T02:26:58.7663121Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-25T02:26:58.7663278Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1459:55] 2026-10-25T02:26:58.7663339Z 1458 │ return ( 2026-10-25T02:26:58.7663497Z 1459 │ 2026-10-25T02:26:58.7663626Z ·  ──────────────────── 2026-10-25T02:26:58.7663722Z 1460 │ { 2026-10-25T02:26:58.7667943Z ·  ────┬──── 2026-10-25T02:26:58.7668069Z · ╰── This is the containing effect 2026-10-25T02:26:58.7668163Z 58 │ const controller = new AbortController(); 2026-10-25T02:26:58.7668235Z 59 │ setLoadState("pending"); 2026-10-25T02:26:58.7668309Z ·  ──────┬───── 2026-10-25T02:26:58.7668472Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7668629Z 60 │ // A renewed signature is used on Retry, not as a reason to reset the native player. 2026-10-25T02:26:58.7668680Z ╰──── 2026-10-25T02:26:58.7669273Z  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-25T02:26:58.7669589Z  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-25T02:26:58.7669593Z 2026-10-25T02:26:58.7669788Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:26:58.7669921Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:70:7] 2026-10-25T02:26:58.7670001Z 69 │ return () => controller.abort(); 2026-10-25T02:26:58.7670098Z 70 │ }, [player, props.playRequested, attempt]); 2026-10-25T02:26:58.7670264Z ·  ───┬── ─────────┬───────── ───┬─── 2026-10-25T02:26:58.7670493Z · │ │ ╰── Unnecessary dependency `attempt` 2026-10-25T02:26:58.7670691Z · │ ╰── Unnecessary dependency `props.playRequested` 2026-10-25T02:26:58.7670830Z · ╰── Unnecessary dependency `player_0` 2026-10-25T02:26:58.7670881Z 71 │ 2026-10-25T02:26:58.7670932Z ╰──── 2026-10-25T02:26:58.7671221Z  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-25T02:26:58.7671528Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7671530Z 2026-10-25T02:26:58.7671793Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-25T02:26:58.7671981Z ╭─[apps/web/src/contextMenuFallback.test.ts:38:9] 2026-10-25T02:26:58.7672052Z 37 │ get isConnected() { 2026-10-25T02:26:58.7672143Z 38 │ let current: FakeElement | null = this; 2026-10-25T02:26:58.7672216Z ·  ─────── 2026-10-25T02:26:58.7672286Z 39 │ while (current?.parent) { 2026-10-25T02:26:58.7672338Z ╰──── 2026-10-25T02:26:58.7672608Z  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-25T02:26:58.7672611Z 2026-10-25T02:26:58.7672864Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:26:58.7673001Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:67:5] 2026-10-25T02:26:58.7673106Z 65 │ const { id: attachmentId, fileUri } = attachment; 2026-10-25T02:26:58.7673170Z 66 │ useEffect(() => { 2026-10-25T02:26:58.7673240Z ·  ────┬──── 2026-10-25T02:26:58.7673363Z · ╰── This is the containing effect 2026-10-25T02:26:58.7673426Z 67 │ setUri(null); 2026-10-25T02:26:58.7673496Z ·  ───┬── 2026-10-25T02:26:58.7673658Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7673720Z 68 │ setError(null); 2026-10-25T02:26:58.7673772Z ╰──── 2026-10-25T02:26:58.7674365Z  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-25T02:26:58.7674684Z  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-25T02:26:58.7674687Z 2026-10-25T02:26:58.7674885Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:26:58.7675016Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:90:7] 2026-10-25T02:26:58.7675071Z 89 │ }; 2026-10-25T02:26:58.7675145Z 90 │ }, [attachmentId, fileUri]); 2026-10-25T02:26:58.7675259Z ·  ──────┬───── ───┬─── 2026-10-25T02:26:58.7675433Z · │ ╰── Unnecessary dependency `fileUri` 2026-10-25T02:26:58.7675582Z · ╰── Unnecessary dependency `attachmentId` 2026-10-25T02:26:58.7675718Z 91 │ const mimeType = videoMimeType(attachment) ?? attachment.mimeType; 2026-10-25T02:26:58.7675768Z ╰──── 2026-10-25T02:26:58.7676092Z  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-25T02:26:58.7676402Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7676405Z 2026-10-25T02:26:58.7676615Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T02:26:58.7676753Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:212:34] 2026-10-25T02:26:58.7676873Z 211 │ useEffect(() => { 2026-10-25T02:26:58.7677042Z 212 │ if (!isFocused && hasSource) props.onRequestClose(); 2026-10-25T02:26:58.7677152Z ·  ──┬── 2026-10-25T02:26:58.7677300Z · ╰── Missing dependency `props` 2026-10-25T02:26:58.7677405Z 213 │ }, [isFocused, hasSource, props.onRequestClose]); 2026-10-25T02:26:58.7677515Z ·  ──────────┬───────── 2026-10-25T02:26:58.7677735Z · ╰── Overly precise dependency `props.onRequestClose`, use `props` instead 2026-10-25T02:26:58.7677807Z 214 │ const { source } = props; 2026-10-25T02:26:58.7677859Z ╰──── 2026-10-25T02:26:58.7678277Z  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-25T02:26:58.7678586Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7678588Z 2026-10-25T02:26:58.7678839Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:26:58.7678970Z ╭─[apps/mobile/src/components/ProjectFavicon.tsx:171:5] 2026-10-25T02:26:58.7679159Z 166 │ const [activeFaviconRequest, setActiveFaviconRequest] = useState(null); 2026-10-25T02:26:58.7679228Z 167 │ useLayoutEffect(() => { 2026-10-25T02:26:58.7679307Z ·  ───────┬─────── 2026-10-25T02:26:58.7679442Z · ╰── This is the containing effect 2026-10-25T02:26:58.7679531Z 168 │ if (faviconRequest === null) return; 2026-10-25T02:26:58.7679581Z 169 │ 2026-10-25T02:26:58.7679713Z 170 │ const endRequest = beginProjectFaviconRequest(faviconRequest); 2026-10-25T02:26:58.7679810Z 171 │ setActiveFaviconRequest(faviconRequest); 2026-10-25T02:26:58.7679900Z ·  ───────────┬─────────── 2026-10-25T02:26:58.7680067Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7680134Z 172 │ return endRequest; 2026-10-25T02:26:58.7680184Z ╰──── 2026-10-25T02:26:58.7680778Z  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-25T02:26:58.7681097Z  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-25T02:26:58.7681101Z 2026-10-25T02:26:58.7681351Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:26:58.7681503Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:562:5] 2026-10-25T02:26:58.7681561Z 560 │ }, []); 2026-10-25T02:26:58.7681625Z 561 │ useEffect(() => { 2026-10-25T02:26:58.7681694Z ·  ────┬──── 2026-10-25T02:26:58.7681822Z · ╰── This is the containing effect 2026-10-25T02:26:58.7681962Z 562 │ setKeyboardStateSuspect(false); 2026-10-25T02:26:58.7682097Z ·  ───────────┬─────────── 2026-10-25T02:26:58.7682288Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7682387Z 563 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-25T02:26:58.7682439Z ╰──── 2026-10-25T02:26:58.7683017Z  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-25T02:26:58.7683337Z  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-25T02:26:58.7683342Z 2026-10-25T02:26:58.7683591Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:26:58.7683741Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:956:7] 2026-10-25T02:26:58.7683893Z 953 │ const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0); 2026-10-25T02:26:58.7683958Z 954 │ useEffect(() => { 2026-10-25T02:26:58.7684026Z ·  ────┬──── 2026-10-25T02:26:58.7684152Z · ╰── This is the containing effect 2026-10-25T02:26:58.7684310Z 955 │ if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) { 2026-10-25T02:26:58.7684421Z 956 │ setLastKnownKeyboardHeight(liveKeyboardHeight); 2026-10-25T02:26:58.7684521Z ·  ─────────────┬──────────── 2026-10-25T02:26:58.7684696Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7684752Z 957 │ } 2026-10-25T02:26:58.7684802Z ╰──── 2026-10-25T02:26:58.7685385Z  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-25T02:26:58.7685700Z  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-25T02:26:58.7685702Z 2026-10-25T02:26:58.7686055Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:26:58.7686281Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1199:5] 2026-10-25T02:26:58.7686336Z 1197 │ 2026-10-25T02:26:58.7686400Z 1198 │ useEffect(() => { 2026-10-25T02:26:58.7686473Z ·  ────┬──── 2026-10-25T02:26:58.7686601Z · ╰── This is the containing effect 2026-10-25T02:26:58.7686678Z 1199 │ setAnchorMessageId(null); 2026-10-25T02:26:58.7686762Z ·  ─────────┬──────── 2026-10-25T02:26:58.7686928Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7687008Z 1200 │ setSubmittedMessageId(null); 2026-10-25T02:26:58.7687059Z ╰──── 2026-10-25T02:26:58.7687656Z  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-25T02:26:58.7687972Z  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-25T02:26:58.7687975Z 2026-10-25T02:26:58.7688173Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:26:58.7688321Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:563:7] 2026-10-25T02:26:58.7688405Z 562 │ setKeyboardStateSuspect(false); 2026-10-25T02:26:58.7688500Z 563 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-25T02:26:58.7688643Z ·  ────────┬──────── ─────────┬──────── 2026-10-25T02:26:58.7688852Z · │ ╰── Unnecessary dependency `liveKeyboardHeight` 2026-10-25T02:26:58.7689008Z · ╰── Unnecessary dependency `isKeyboardVisible` 2026-10-25T02:26:58.7689133Z 564 │ const handleOwnedInputFocusChange = (focused: boolean) => { 2026-10-25T02:26:58.7689185Z ╰──── 2026-10-25T02:26:58.7689476Z  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-25T02:26:58.7689781Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7689784Z 2026-10-25T02:26:58.7689984Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:26:58.7690139Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1147:7] 2026-10-25T02:26:58.7690225Z 1146 │ userInputInsetProgress.set(1); 2026-10-25T02:26:58.7690386Z 1147 │ }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]); 2026-10-25T02:26:58.7690480Z ·  ────────────┬─────────── 2026-10-25T02:26:58.7690653Z · ╰── Unnecessary dependency `activeUserInputRequestId` 2026-10-25T02:26:58.7690759Z 1148 │ const showContent = props.showContent ?? true; 2026-10-25T02:26:58.7690811Z ╰──── 2026-10-25T02:26:58.7691166Z  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-25T02:26:58.7691552Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7691554Z 2026-10-25T02:26:58.7691750Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:26:58.7691903Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1205:15] 2026-10-25T02:26:58.7691971Z 1204 │ freeze.set(false); 2026-10-25T02:26:58.7692051Z 1205 │ }, [freeze, selectedThreadKey]); 2026-10-25T02:26:58.7692146Z ·  ────────┬──────── 2026-10-25T02:26:58.7692308Z · ╰── Unnecessary dependency `selectedThreadKey` 2026-10-25T02:26:58.7692360Z 1206 │ 2026-10-25T02:26:58.7692415Z ╰──── 2026-10-25T02:26:58.7692706Z  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-25T02:26:58.7693011Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7693013Z 2026-10-25T02:26:58.7693166Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:26:58.7693315Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1042:5] 2026-10-25T02:26:58.7693423Z 1037 │ const composerPopoverHeight = useSharedValue(0); 2026-10-25T02:26:58.7693531Z 1038 │ const floatingControlCoverage = useSharedValue( 2026-10-25T02:26:58.7693625Z ·  ───────────┬─────────── 2026-10-25T02:26:58.7693788Z · ╰── `floatingControlCoverage` originates here 2026-10-25T02:26:58.7693915Z 1039 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-25T02:26:58.7693969Z 1040 │ ); 2026-10-25T02:26:58.7694035Z 1041 │ useEffect(() => { 2026-10-25T02:26:58.7694137Z 1042 │ floatingControlCoverage.value = withTiming( 2026-10-25T02:26:58.7694226Z ·  ───────────┬─────────── 2026-10-25T02:26:58.7694387Z · ╰── `floatingControlCoverage` cannot be modified 2026-10-25T02:26:58.7694513Z 1043 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-25T02:26:58.7694564Z ╰──── 2026-10-25T02:26:58.7694830Z  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-25T02:26:58.7695136Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:26:58.7695138Z 2026-10-25T02:26:58.7695293Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:26:58.7695443Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1058:7] 2026-10-25T02:26:58.7695626Z 1048 │ const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null; 2026-10-25T02:26:58.7695752Z 1049 │ const combinedContentInsetEndAdjustment = useSharedValue( 2026-10-25T02:26:58.7695893Z ·  ────────────────┬──────────────── 2026-10-25T02:26:58.7696087Z · ╰── `combinedContentInsetEndAdjustment` originates here 2026-10-25T02:26:58.7696293Z 1050 │ Math.max(0, estimatedOverlayHeight - nativeInsetOvercount), 2026-10-25T02:26:58.7696400Z 1051 │ ); 2026-10-25T02:26:58.7696497Z 1052 │ useAnimatedReaction( 2026-10-25T02:26:58.7696556Z 1053 │ () => 2026-10-25T02:26:58.7696649Z 1054 │ contentInsetEndAdjustment.value + 2026-10-25T02:26:58.7696737Z 1055 │ floatingControlCoverage.value + 2026-10-25T02:26:58.7696931Z 1056 │ (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0), 2026-10-25T02:26:58.7696995Z 1057 │ (value) => { 2026-10-25T02:26:58.7697107Z 1058 │ combinedContentInsetEndAdjustment.value = value; 2026-10-25T02:26:58.7697215Z ·  ────────────────┬──────────────── 2026-10-25T02:26:58.7697403Z · ╰── `combinedContentInsetEndAdjustment` cannot be modified 2026-10-25T02:26:58.7697467Z 1059 │ }, 2026-10-25T02:26:58.7697519Z ╰──── 2026-10-25T02:26:58.7697782Z  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-25T02:26:58.7698083Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:26:58.7698086Z 2026-10-25T02:26:58.7698302Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-25T02:26:58.7698421Z ╭─[packages/shared/src/serverSettings.ts:333:9] 2026-10-25T02:26:58.7698521Z 332 │ const entry: ProjectSettingsOverrides = { 2026-10-25T02:26:58.7698651Z 333 │ ...(entries.get(projectId) ?? currentEntries[projectId] ?? {}), 2026-10-25T02:26:58.7698807Z ·  ────────────────────────────────────────────────────────────── 2026-10-25T02:26:58.7698868Z 334 │ }; 2026-10-25T02:26:58.7698917Z ╰──── 2026-10-25T02:26:58.7699177Z  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-25T02:26:58.7699179Z 2026-10-25T02:26:58.7699395Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in Array.prototype.reduce() 2026-10-25T02:26:58.7699511Z ╭─[packages/shared/src/serverSettings.ts:435:24] 2026-10-25T02:26:58.7699575Z 434 │ const favorites = 2026-10-25T02:26:58.7699682Z 435 │ setModelFavorites?.reduce((current, change) => { 2026-10-25T02:26:58.7699767Z ·  ───┬── 2026-10-25T02:26:58.7699897Z · ╰── For this reduce 2026-10-25T02:26:58.7699978Z 436 │ const exists = current.some( 2026-10-25T02:26:58.7700148Z 437 │ (favorite) => favorite.provider === change.provider && favorite.model === change.model, 2026-10-25T02:26:58.7700206Z 438 │ ); 2026-10-25T02:26:58.7700281Z 439 │ return change.favorite 2026-10-25T02:26:58.7700343Z 440 │ ? exists 2026-10-25T02:26:58.7700408Z 441 │ ? current 2026-10-25T02:26:58.7700544Z 442 │ : [...current, { provider: change.provider, model: change.model }] 2026-10-25T02:26:58.7700631Z ·  ─────┬──── 2026-10-25T02:26:58.7700748Z · ╰── From this spread 2026-10-25T02:26:58.7700820Z 443 │ : current.filter( 2026-10-25T02:26:58.7700876Z ╰──── 2026-10-25T02:26:58.7701147Z  help: Consider using `Object.assign()` or `Array.prototype.push()` to mutate the accumulator instead. 2026-10-25T02:26:58.7701384Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-25T02:26:58.7701387Z 2026-10-25T02:26:58.7701577Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-25T02:26:58.7701699Z ╭─[packages/shared/src/serverSettings.ts:453:3] 2026-10-25T02:26:58.7701760Z 451 │ null; 2026-10-25T02:26:58.7701872Z 452 │ let nextModelPreferences = initialModelPreferences; 2026-10-25T02:26:58.7701963Z ·  ──────────┬───────── 2026-10-25T02:26:58.7702095Z · ╰── From this accumulator 2026-10-25T02:26:58.7702198Z 453 │ for (const change of setModelsHidden ?? []) { 2026-10-25T02:26:58.7702266Z ·  ─┬─ 2026-10-25T02:26:58.7702381Z · ╰── For this loop 2026-10-25T02:26:58.7702520Z 454 │ const preferences = nextModelPreferences?.[change.provider] ?? { 2026-10-25T02:26:58.7702590Z 455 │ hiddenModels: [], 2026-10-25T02:26:58.7702657Z 456 │ modelOrder: [], 2026-10-25T02:26:58.7702716Z 457 │ }; 2026-10-25T02:26:58.7702898Z 458 │ const hiddenModels = preferences.hiddenModels.filter((model) => model !== change.model); 2026-10-25T02:26:58.7703008Z 459 │ if (change.hidden) hiddenModels.push(change.model); 2026-10-25T02:26:58.7703082Z 460 │ nextModelPreferences = { 2026-10-25T02:26:58.7703160Z 461 │ ...nextModelPreferences, 2026-10-25T02:26:58.7703259Z ·  ───────────┬─────────── 2026-10-25T02:26:58.7703382Z · ╰── From this spread 2026-10-25T02:26:58.7703499Z 462 │ [change.provider]: { ...preferences, hiddenModels }, 2026-10-25T02:26:58.7703556Z ╰──── 2026-10-25T02:26:58.7703710Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-25T02:26:58.7703866Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-25T02:26:58.7703868Z 2026-10-25T02:26:58.7704242Z ⚠ 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-25T02:26:58.7704363Z ╭─[packages/shared/src/otelEnvironment.ts:146:14] 2026-10-25T02:26:58.7704425Z 145 │ name, 2026-10-25T02:26:58.7704565Z 146 │ (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()), 2026-10-25T02:26:58.7704669Z ·  ────────────────────────── 2026-10-25T02:26:58.7704912Z 147 │ `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`, 2026-10-25T02:26:58.7705039Z ╰──── 2026-10-25T02:26:58.7705043Z 2026-10-25T02:26:58.7705323Z ⚠ eslint(no-unused-vars): Type 'EnvironmentId' is imported but never used. 2026-10-25T02:26:58.7705529Z ╭─[packages/client-runtime/src/state/sharedSettings.ts:2:3] 2026-10-25T02:26:58.7705594Z 1 │ import type { 2026-10-25T02:26:58.7705662Z 2 │ EnvironmentId, 2026-10-25T02:26:58.7705741Z ·  ──────┬────── 2026-10-25T02:26:58.7705912Z · ╰── 'EnvironmentId' is imported here 2026-10-25T02:26:58.7705998Z 3 │ ExecutionEnvironmentCapabilities, 2026-10-25T02:26:58.7706053Z ╰──── 2026-10-25T02:26:58.7706158Z  help: Consider removing this import. 2026-10-25T02:26:58.7706161Z 2026-10-25T02:26:58.7706362Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T02:26:58.7706512Z ╭─[apps/mobile/src/components/ComposerContextSheet.tsx:272:25] 2026-10-25T02:26:58.7706619Z 271 │ {record.elements?.map((element, index) => ( 2026-10-25T02:26:58.7706817Z 272 │ 2026-10-25T02:26:58.7706998Z ·  ─────────────────────────────────────────────────────── 2026-10-25T02:26:58.7707086Z 273 │ ) { 2026-10-25T02:26:58.7718379Z 152 │ │ clipboardItemConstructor(data); 2026-10-25T02:26:58.7718473Z 153 │ │ } 2026-10-25T02:26:58.7718690Z 154 │ ╰─▶ }, 2026-10-25T02:26:58.7718789Z 155 │ clipboard: { 2026-10-25T02:26:58.7718861Z ╰──── 2026-10-25T02:26:58.7719051Z  help: Try replacing this class with a standalone function or deleting it entirely 2026-10-25T02:26:58.7719054Z 2026-10-25T02:26:58.7719302Z ⚠ eslint(no-unused-vars): Identifier 'serverEnvironment' is imported but never used. 2026-10-25T02:26:58.7719462Z ╭─[apps/web/src/components/chat/ChatHeader.tsx:27:10] 2026-10-25T02:26:58.7719604Z 26 │ import { threadEnvironment } from "../../state/threads"; 2026-10-25T02:26:58.7719718Z 27 │ import { serverEnvironment } from "../../state/server"; 2026-10-25T02:26:58.7719858Z ·  ────────┬──────── 2026-10-25T02:26:58.7720041Z · ╰── 'serverEnvironment' is imported here 2026-10-25T02:26:58.7720201Z 28 │ import { canShareWithGuestAtom } from "./guestShareAvailability"; 2026-10-25T02:26:58.7720267Z ╰──── 2026-10-25T02:26:58.7720397Z  help: Consider removing this import. 2026-10-25T02:26:58.7720400Z 2026-10-25T02:26:58.7720582Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.7720764Z ╭─[apps/mobile/src/features/home/thread-swipe-actions.tsx:472:27] 2026-10-25T02:26:58.7720851Z 471 │ > 2026-10-25T02:26:58.7720936Z 472 │ {props.children(close)} 2026-10-25T02:26:58.7721075Z ·  ──┬── 2026-10-25T02:26:58.7721378Z · ╰── Cannot access ref value during render 2026-10-25T02:26:58.7721542Z 473 │ 2026-10-25T02:26:58.7721619Z ╰──── 2026-10-25T02:26:58.7722135Z  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-25T02:26:58.7722461Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.7722464Z 2026-10-25T02:26:58.7722691Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-25T02:26:58.7722851Z ╭─[packages/client-runtime/src/state/usageAccess.ts:3:8] 2026-10-25T02:26:58.7722939Z 2 │ AuthDiagnosticsReadScope, 2026-10-25T02:26:58.7723060Z 3 │ type AuthSessionState, 2026-10-25T02:26:58.7723175Z ·  ────────┬─────── 2026-10-25T02:26:58.7723349Z · ╰── 'AuthSessionState' is imported here 2026-10-25T02:26:58.7723433Z 4 │ sessionGrantsScope, 2026-10-25T02:26:58.7723515Z ╰──── 2026-10-25T02:26:58.7723647Z  help: Consider removing this import. 2026-10-25T02:26:58.7723650Z 2026-10-25T02:26:58.7723873Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:26:58.7724026Z ╭─[apps/mobile/src/state/use-thread-outbox-drain.ts:1362:5] 2026-10-25T02:26:58.7724132Z 1361 │ queuedMessagesByThreadKey, 2026-10-25T02:26:58.7724302Z 1362 │ retryTick, 2026-10-25T02:26:58.7724412Z ·  ────┬──── 2026-10-25T02:26:58.7724564Z · ╰── Unnecessary dependency `retryTick` 2026-10-25T02:26:58.7724669Z 1363 │ restoreQueuedMessage, 2026-10-25T02:26:58.7724753Z ╰──── 2026-10-25T02:26:58.7725075Z  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-25T02:26:58.7725397Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7725416Z 2026-10-25T02:26:58.7725633Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-25T02:26:58.7725783Z ╭─[packages/client-runtime/src/state/filesystem.ts:3:8] 2026-10-25T02:26:58.7725955Z 2 │ AuthFilesystemReadScope, 2026-10-25T02:26:58.7726055Z 3 │ type AuthSessionState, 2026-10-25T02:26:58.7726155Z ·  ────────┬─────── 2026-10-25T02:26:58.7726325Z · ╰── 'AuthSessionState' is imported here 2026-10-25T02:26:58.7726433Z 4 │ type FilesystemBrowseEntry, 2026-10-25T02:26:58.7726519Z ╰──── 2026-10-25T02:26:58.7726628Z  help: Consider removing this import. 2026-10-25T02:26:58.7726631Z 2026-10-25T02:26:58.7726860Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:26:58.7727040Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:266:35] 2026-10-25T02:26:58.7727205Z 265 │ }; 2026-10-25T02:26:58.7727348Z 266 │ }, [method, nativeRef, payload, resetKey, onFailure, onDelivered]); 2026-10-25T02:26:58.7727549Z ·  ────┬─── 2026-10-25T02:26:58.7727813Z · ╰── Unnecessary dependency `resetKey` 2026-10-25T02:26:58.7727900Z 267 │ } 2026-10-25T02:26:58.7727976Z ╰──── 2026-10-25T02:26:58.7728292Z  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-25T02:26:58.7728627Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7728630Z 2026-10-25T02:26:58.7728796Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.7729003Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:390:39] 2026-10-25T02:26:58.7729076Z 389 │ 2026-10-25T02:26:58.7729284Z 390 │ ╭─▶ return createElement(RawNativeView, { 2026-10-25T02:26:58.7729407Z 391 │ │ ...nativeProps, 2026-10-25T02:26:58.7729588Z 392 │ │ refreshEnabled: props.onPullToRefresh !== undefined, 2026-10-25T02:26:58.7729710Z 393 │ │ onDebug: (event) => { 2026-10-25T02:26:58.7729892Z 394 │ │ if (event.nativeEvent.message === "rows-decode-failed") { 2026-10-25T02:26:58.7730178Z 395 │ │ console.error("[native-review-diff] rows decode failed", event.nativeEvent.error); 2026-10-25T02:26:58.7730297Z 396 │ │ onRowsFailure(); 2026-10-25T02:26:58.7730401Z 397 │ │ } 2026-10-25T02:26:58.7730538Z 398 │ │ onDebug?.(event); 2026-10-25T02:26:58.7730648Z 399 │ │ }, 2026-10-25T02:26:58.7730769Z 400 │ │ ref: nativeRef, 2026-10-25T02:26:58.7730907Z 401 │ ├─▶ }); 2026-10-25T02:26:58.7731189Z · ╰──── Passing a ref to a function may read its value during render 2026-10-25T02:26:58.7731274Z 402 │ } 2026-10-25T02:26:58.7731356Z ╰──── 2026-10-25T02:26:58.7731844Z  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-25T02:26:58.7732159Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.7732163Z 2026-10-25T02:26:58.7732392Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T02:26:58.7732563Z ╭─[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9] 2026-10-25T02:26:58.7732684Z 35 │ new Promise((resolve) => setImmediate(resolve))); 2026-10-25T02:26:58.7735274Z 141 │ ╰─▶ } 2026-10-25T02:26:58.7735384Z 142 │ return yield* Fiber.join(fiber); 2026-10-25T02:26:58.7735459Z ╰──── 2026-10-25T02:26:58.7735462Z 2026-10-25T02:26:58.7735717Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-25T02:26:58.7735915Z ╭─[apps/mobile/src/state/use-model-option-memory.ts:21:7] 2026-10-25T02:26:58.7736014Z 20 │ [instanceId]: { 2026-10-25T02:26:58.7736099Z 21 │ ...(state[instanceId] ?? {}), 2026-10-25T02:26:58.7736254Z ·  ──────────────────────────── 2026-10-25T02:26:58.7736409Z 22 │ [model]: options, 2026-10-25T02:26:58.7736488Z ╰──── 2026-10-25T02:26:58.7736769Z  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-25T02:26:58.7736774Z 2026-10-25T02:26:58.7737005Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:26:58.7737159Z ╭─[apps/mobile/src/state/thread-order.ts:28:7] 2026-10-25T02:26:58.7737263Z 27 │ getPendingThreadOrder(); 2026-10-25T02:26:58.7737355Z 28 │ }, [nowMinute, snoozeWakeTick]); 2026-10-25T02:26:58.7737501Z ·  ────┬──── ───────┬────── 2026-10-25T02:26:58.7737740Z · │ ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-25T02:26:58.7737907Z · ╰── Unnecessary dependency `nowMinute` 2026-10-25T02:26:58.7738001Z 29 │ return pending; 2026-10-25T02:26:58.7738064Z ╰──── 2026-10-25T02:26:58.7738395Z  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-25T02:26:58.7738740Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7738743Z 2026-10-25T02:26:58.7738974Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-25T02:26:58.7739155Z ╭─[apps/server/src/sourceControl/SourceControlProviderRegistry.ts:15:13] 2026-10-25T02:26:58.7739248Z 14 │ } from "@t3tools/contracts"; 2026-10-25T02:26:58.7739455Z 15 │ import type {} from "@t3tools/contracts"; 2026-10-25T02:26:58.7739555Z ·  ── 2026-10-25T02:26:58.7739620Z 16 │ 2026-10-25T02:26:58.7739768Z ╰──── 2026-10-25T02:26:58.7739940Z  help: Remove empty braces 2026-10-25T02:26:58.7739944Z 2026-10-25T02:26:58.7740186Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-25T02:26:58.7740382Z ╭─[apps/web/src/components/settings/ProviderSettingsPanel.logic.ts:4:8] 2026-10-25T02:26:58.7740468Z 3 │ AuthProvidersManageScope, 2026-10-25T02:26:58.7740558Z 4 │ type AuthSessionState, 2026-10-25T02:26:58.7740684Z ·  ────────┬─────── 2026-10-25T02:26:58.7740858Z · ╰── 'AuthSessionState' is imported here 2026-10-25T02:26:58.7740943Z 5 │ type EnvironmentId, 2026-10-25T02:26:58.7741023Z ╰──── 2026-10-25T02:26:58.7741151Z  help: Consider removing this import. 2026-10-25T02:26:58.7741153Z 2026-10-25T02:26:58.7741488Z ⚠ eslint(no-unused-vars): Variable 'layerFromProviderAdapter' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:26:58.7741668Z ╭─[apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts:346:7] 2026-10-25T02:26:58.7741752Z 345 │ 2026-10-25T02:26:58.7741924Z 346 │ const layerFromProviderAdapter: Layer.Layer< 2026-10-25T02:26:58.7742063Z ·  ────────────┬─────────── 2026-10-25T02:26:58.7742239Z · ╰── 'layerFromProviderAdapter' is declared here 2026-10-25T02:26:58.7742350Z 347 │ ProviderAdapterRegistryV2, 2026-10-25T02:26:58.7742431Z ╰──── 2026-10-25T02:26:58.7742571Z  help: Consider removing this declaration. 2026-10-25T02:26:58.7742574Z 2026-10-25T02:26:58.7742862Z ⚠ eslint(no-unused-vars): Variable 'layerDaemon' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:26:58.7743032Z ╭─[apps/server/src/orchestration-v2/EffectWorker.ts:920:7] 2026-10-25T02:26:58.7743115Z 919 │ 2026-10-25T02:26:58.7743324Z 920 │ const layerDaemon: Layer.Layer = Layer.effectDiscard( 2026-10-25T02:26:58.7743449Z ·  ─────┬───── 2026-10-25T02:26:58.7743598Z · ╰── 'layerDaemon' is declared here 2026-10-25T02:26:58.7743716Z 921 │ runDaemon.pipe(Effect.forkScoped), 2026-10-25T02:26:58.7743796Z ╰──── 2026-10-25T02:26:58.7743931Z  help: Consider removing this declaration. 2026-10-25T02:26:58.7743933Z 2026-10-25T02:26:58.7744403Z ⚠ 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-25T02:26:58.7744559Z ╭─[apps/server/src/serverSettings.test.ts:1740:32] 2026-10-25T02:26:58.7744758Z 1739 │ const model = createModelSelection(ProviderInstanceId.make("codex"), "gpt-5.5"); 2026-10-25T02:26:58.7745027Z 1740 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-25T02:26:58.7745258Z ·  ─────────────────── 2026-10-25T02:26:58.7745417Z 1741 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-25T02:26:58.7745498Z ╰──── 2026-10-25T02:26:58.7745501Z 2026-10-25T02:26:58.7746076Z ⚠ 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-25T02:26:58.7746334Z ╭─[apps/server/src/serverSettings.test.ts:1741:34] 2026-10-25T02:26:58.7746557Z 1740 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-25T02:26:58.7746694Z 1741 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-25T02:26:58.7746836Z ·  ─────────────────── 2026-10-25T02:26:58.7746972Z 1742 │ Schema.fromJsonString(Schema.Array(ProjectScript)), 2026-10-25T02:26:58.7750725Z ╰──── 2026-10-25T02:26:58.7750729Z 2026-10-25T02:26:58.7751001Z ⚠ eslint(no-unused-vars): Function 'promptResponseHasMissingXAiStopReason' is declared but never used. 2026-10-25T02:26:58.7751154Z ╭─[packages/provider-grok/src/server/xaiAcpExtension.ts:1558:10] 2026-10-25T02:26:58.7751214Z 1557 │ 2026-10-25T02:26:58.7751427Z 1558 │ function promptResponseHasMissingXAiStopReason(response: EffectAcpSchema.PromptResponse): boolean { 2026-10-25T02:26:58.7751544Z ·  ──────────────────┬────────────────── 2026-10-25T02:26:58.7751745Z · ╰── 'promptResponseHasMissingXAiStopReason' is declared here 2026-10-25T02:26:58.7751822Z 1559 │ const meta = response._meta; 2026-10-25T02:26:58.7751876Z ╰──── 2026-10-25T02:26:58.7751981Z  help: Consider removing this declaration. 2026-10-25T02:26:58.7751984Z 2026-10-25T02:26:58.7752237Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:26:58.7752365Z ╭─[packages/provider-grok/src/server/adapter.ts:411:7] 2026-10-25T02:26:58.7752427Z 410 │ 2026-10-25T02:26:58.7752502Z 411 │ const layer: Layer.Layer< 2026-10-25T02:26:58.7752572Z ·  ──┬── 2026-10-25T02:26:58.7752693Z · ╰── 'layer' is declared here 2026-10-25T02:26:58.7752784Z 412 │ ProviderAdapter.ProviderAdapterV2, 2026-10-25T02:26:58.7752835Z ╰──── 2026-10-25T02:26:58.7752936Z  help: Consider removing this declaration. 2026-10-25T02:26:58.7752939Z 2026-10-25T02:26:58.7753191Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:26:58.7753319Z ╭─[apps/mobile/src/state/use-vcs-action-state.ts:85:5] 2026-10-25T02:26:58.7753426Z 82 │ const [nowMs, setNowMs] = useState(() => Date.now()); 2026-10-25T02:26:58.7753495Z 83 │ useEffect(() => { 2026-10-25T02:26:58.7753662Z ·  ────┬──── 2026-10-25T02:26:58.7753882Z · ╰── This is the containing effect 2026-10-25T02:26:58.7753978Z 84 │ if (!actionState.isRunning) return; 2026-10-25T02:26:58.7754046Z 85 │ setNowMs(Date.now()); 2026-10-25T02:26:58.7754114Z ·  ────┬─── 2026-10-25T02:26:58.7754280Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7754406Z 86 │ const interval = setInterval(() => setNowMs(Date.now()), 1000); 2026-10-25T02:26:58.7754458Z ╰──── 2026-10-25T02:26:58.7755056Z  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-25T02:26:58.7755382Z  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-25T02:26:58.7755385Z 2026-10-25T02:26:58.7755585Z ⚠ eslint(no-unsafe-optional-chaining): Unsafe usage of optional chaining 2026-10-25T02:26:58.7755754Z ╭─[apps/server/src/orchestration-v2/ThreadLaunchService.test.ts:1849:8] 2026-10-25T02:26:58.7755819Z 1848 │ assert.equal( 2026-10-25T02:26:58.7756017Z 1849 │ (stored.context?.records[0] as { attachmentId: string }).attachmentId, 2026-10-25T02:26:58.7756119Z ·  ────────────────────────── 2026-10-25T02:26:58.7756200Z 1850 │ stored.attachments[0]?.id, 2026-10-25T02:26:58.7756253Z ╰──── 2026-10-25T02:26:58.7756429Z  help: If this short-circuits with 'undefined' the evaluation will throw TypeError 2026-10-25T02:26:58.7756434Z 2026-10-25T02:26:58.7756639Z ⚠ eslint(no-unused-vars): Function 'describeSchedule' is declared but never used. 2026-10-25T02:26:58.7756765Z ╭─[apps/server/src/scheduledTasks/Schedule.ts:75:10] 2026-10-25T02:26:58.7756820Z 74 │ 2026-10-25T02:26:58.7756950Z 75 │ function describeSchedule(schedule: ScheduledTaskSchedule): string { 2026-10-25T02:26:58.7757035Z ·  ────────┬─────── 2026-10-25T02:26:58.7757181Z · ╰── 'describeSchedule' is declared here 2026-10-25T02:26:58.7757288Z 76 │ if (schedule.type === "webhook") return "On webhook"; 2026-10-25T02:26:58.7757337Z ╰──── 2026-10-25T02:26:58.7757439Z  help: Consider removing this declaration. 2026-10-25T02:26:58.7757442Z 2026-10-25T02:26:58.7757913Z ⚠ 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-25T02:26:58.7758097Z ╭─[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:520:13] 2026-10-25T02:26:58.7758171Z 519 │ })).delivery; 2026-10-25T02:26:58.7758366Z 520 │ ╭─▶ while (delivery.outcome === "accepted") { 2026-10-25T02:26:58.7758480Z 521 │ │ yield* Effect.yieldNow; 2026-10-25T02:26:58.7758626Z 522 │ │ delivery = (yield* service.getWebhookDelivery({ 2026-10-25T02:26:58.7758725Z 523 │ │ id: task.id, 2026-10-25T02:26:58.7758901Z 524 │ │ deliveryId: deliveryId!, 2026-10-25T02:26:58.7759060Z 525 │ │ })).delivery; 2026-10-25T02:26:58.7759216Z 526 │ ╰─▶ } 2026-10-25T02:26:58.7759333Z 527 │ assert.equal(delivery.outcome, "dispatch_failed"); 2026-10-25T02:26:58.7759384Z ╰──── 2026-10-25T02:26:58.7759387Z 2026-10-25T02:26:58.7759665Z ⚠ eslint(no-unused-vars): Variable 'layerUnavailable' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:26:58.7759810Z ╭─[apps/server/src/orchestration-v2/Orchestrator.ts:12551:7] 2026-10-25T02:26:58.7759866Z 12550 │ 2026-10-25T02:26:58.7760003Z 12551 │ const layerUnavailable: Layer.Layer = Layer.succeed( 2026-10-25T02:26:58.7760096Z ·  ────────┬─────── 2026-10-25T02:26:58.7760242Z · ╰── 'layerUnavailable' is declared here 2026-10-25T02:26:58.7760311Z 12552 │ OrchestratorV2, 2026-10-25T02:26:58.7760362Z ╰──── 2026-10-25T02:26:58.7760467Z  help: Consider removing this declaration. 2026-10-25T02:26:58.7760469Z 2026-10-25T02:26:58.7760750Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-25T02:26:58.7760904Z ╭─[apps/web/src/components/settings/SettingInheritance.tsx:160:24] 2026-10-25T02:26:58.7760960Z 159 │ keys, 2026-10-25T02:26:58.7761033Z 160 │ overridingProjects = [], 2026-10-25T02:26:58.7761118Z ·  ── 2026-10-25T02:26:58.7761191Z 161 │ onClearOverrides, 2026-10-25T02:26:58.7761242Z ╰──── 2026-10-25T02:26:58.7761555Z  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-25T02:26:58.7761558Z 2026-10-25T02:26:58.7761767Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-25T02:26:58.7761899Z ╭─[apps/web/src/lib/composerContextReferences.ts:90:40] 2026-10-25T02:26:58.7761974Z 89 │ let cursor = prompt.length; 2026-10-25T02:26:58.7762078Z 90 │ for (const occurrence of occurrences.reverse()) { 2026-10-25T02:26:58.7762184Z ·  ─────── 2026-10-25T02:26:58.7762265Z 91 │ let { start, end } = occurrence; 2026-10-25T02:26:58.7762316Z ╰──── 2026-10-25T02:26:58.7762578Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-25T02:26:58.7762584Z 2026-10-25T02:26:58.7762749Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T02:26:58.7762894Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:373:47] 2026-10-25T02:26:58.7763022Z 372 │ const { open, onOpenChange, onSnooze, timestampFormat } = props; 2026-10-25T02:26:58.7763173Z 373 │ const presets = open ? resolveSnoozePresets(new Date(), timestampFormat) : []; 2026-10-25T02:26:58.7763287Z ·  ─────┬──── 2026-10-25T02:26:58.7763446Z · ╰── Cannot call impure function 2026-10-25T02:26:58.7763508Z 374 │ return ( 2026-10-25T02:26:58.7763626Z ╰──── 2026-10-25T02:26:58.7763981Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T02:26:58.7764275Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T02:26:58.7764277Z 2026-10-25T02:26:58.7764442Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T02:26:58.7764587Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:860:39] 2026-10-25T02:26:58.7764678Z 859 │ if (snoozeGateClock.thread !== thread) { 2026-10-25T02:26:58.7764805Z 860 │ setSnoozeGateClock({ thread, now: new Date().toISOString() }); 2026-10-25T02:26:58.7764913Z ·  ─────┬──── 2026-10-25T02:26:58.7765070Z · ╰── Cannot call impure function 2026-10-25T02:26:58.7765126Z 861 │ } 2026-10-25T02:26:58.7765176Z ╰──── 2026-10-25T02:26:58.7765446Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T02:26:58.7765735Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T02:26:58.7765737Z 2026-10-25T02:26:58.7766019Z ⚠ eslint(no-unused-vars): Function 'normalizeTerminalContextSelection' is declared but never used. 2026-10-25T02:26:58.7766134Z ╭─[apps/web/src/lib/terminalContext.ts:56:10] 2026-10-25T02:26:58.7766186Z 55 │ 2026-10-25T02:26:58.7766289Z 56 │ function normalizeTerminalContextSelection( 2026-10-25T02:26:58.7766398Z ·  ────────────────┬──────────────── 2026-10-25T02:26:58.7766585Z · ╰── 'normalizeTerminalContextSelection' is declared here 2026-10-25T02:26:58.7766672Z 57 │ selection: TerminalContextSelection, 2026-10-25T02:26:58.7766725Z ╰──── 2026-10-25T02:26:58.7766825Z  help: Consider removing this declaration. 2026-10-25T02:26:58.7766828Z 2026-10-25T02:26:58.7767028Z ⚠ eslint(no-unused-vars): Identifier 'HostProcess' is imported but never used. 2026-10-25T02:26:58.7767189Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:25:13] 2026-10-25T02:26:58.7767275Z 24 │ import * as Schema from "effect/Schema"; 2026-10-25T02:26:58.7767396Z 25 │ import * as HostProcess from "@t3tools/shared/HostProcess"; 2026-10-25T02:26:58.7767476Z ·  ─────┬───── 2026-10-25T02:26:58.7767615Z · ╰── 'HostProcess' is imported here 2026-10-25T02:26:58.7767669Z 26 │ 2026-10-25T02:26:58.7767717Z ╰──── 2026-10-25T02:26:58.7767814Z  help: Consider removing this import. 2026-10-25T02:26:58.7767816Z 2026-10-25T02:26:58.7768082Z ⚠ eslint(no-unused-vars): Variable 'serverConfig' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:26:58.7768243Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:124:11] 2026-10-25T02:26:58.7768325Z 123 │ const path = yield* Path.Path; 2026-10-25T02:26:58.7768438Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-25T02:26:58.7768590Z ·  ──────┬───── 2026-10-25T02:26:58.7768803Z · ╰── 'serverConfig' is declared here 2026-10-25T02:26:58.7768943Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-25T02:26:58.7768993Z ╰──── 2026-10-25T02:26:58.7769095Z  help: Consider removing this declaration. 2026-10-25T02:26:58.7769097Z 2026-10-25T02:26:58.7769365Z ⚠ eslint(no-unused-vars): Variable 'serverSettings' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:26:58.7769528Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:125:11] 2026-10-25T02:26:58.7769640Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-25T02:26:58.7769778Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-25T02:26:58.7769866Z ·  ───────┬────── 2026-10-25T02:26:58.7770010Z · ╰── 'serverSettings' is declared here 2026-10-25T02:26:58.7770143Z 126 │ const gitWorkflow = yield* GitWorkflowService.GitWorkflowService; 2026-10-25T02:26:58.7770195Z ╰──── 2026-10-25T02:26:58.7770299Z  help: Consider removing this declaration. 2026-10-25T02:26:58.7770301Z 2026-10-25T02:26:58.7770537Z × t3code(no-low-value-comments): Cut this to 4 lines or fewer: keep the constraint, drop the background. 2026-10-25T02:26:58.7770676Z ╭─[apps/server/src/orchestration-v2/WireProjection.ts:259:1] 2026-10-25T02:26:58.7770730Z 258 │ 2026-10-25T02:26:58.7770858Z 259 │ ╭─▶ /** 2026-10-25T02:26:58.7771063Z 260 │ │ * One per subscription, applied after coalescing so it only remembers records the client 2026-10-25T02:26:58.7771271Z 261 │ │ * received, in the snapshot or in events. A record event comes before the turn item that repeats 2026-10-25T02:26:58.7771472Z 262 │ │ * its body (adapters and the orchestrator emit them in that order), so the item can ship blank 2026-10-25T02:26:58.7771672Z 263 │ │ * and marked; so can a repeated subagent record. Emitting in the other order, or forgetting a 2026-10-25T02:26:58.7771807Z 264 │ │ * record, only costs bytes: the repeat ships whole. 2026-10-25T02:26:58.7771930Z 265 │ ╰─▶ */ 2026-10-25T02:26:58.7772023Z 266 │ export function makeLiveBodyDeduper(): ( 2026-10-25T02:26:58.7772076Z ╰──── 2026-10-25T02:26:58.7772078Z 2026-10-25T02:26:58.7772343Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:26:58.7772474Z ╭─[apps/server/src/telemetry/AnalyticsService.ts:327:7] 2026-10-25T02:26:58.7772525Z 326 │ 2026-10-25T02:26:58.7772627Z 327 │ const layerTest = AnalyticsService.layerTest; 2026-10-25T02:26:58.7772707Z ·  ────┬──── 2026-10-25T02:26:58.7772839Z · ╰── 'layerTest' is declared here 2026-10-25T02:26:58.7772890Z ╰──── 2026-10-25T02:26:58.7772992Z  help: Consider removing this declaration. 2026-10-25T02:26:58.7772994Z 2026-10-25T02:26:58.7773246Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:26:58.7773466Z ╭─[apps/server/src/orchestration-v2/ThreadPullRequestService.ts:405:7] 2026-10-25T02:26:58.7773554Z 404 │ 2026-10-25T02:26:58.7773723Z 405 │ const layer = Layer.effect(ThreadPullRequestServiceV2, make); 2026-10-25T02:26:58.7773793Z ·  ──┬── 2026-10-25T02:26:58.7773914Z · ╰── 'layer' is declared here 2026-10-25T02:26:58.7773962Z ╰──── 2026-10-25T02:26:58.7774062Z  help: Consider removing this declaration. 2026-10-25T02:26:58.7774065Z 2026-10-25T02:26:58.7774228Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-25T02:26:58.7774345Z ╭─[apps/server/src/processRunner.test.ts:264:14] 2026-10-25T02:26:58.7774398Z 263 │ 2026-10-25T02:26:58.7774499Z 264 │ for (const {} of ["timeout", "success"] as const) { 2026-10-25T02:26:58.7774569Z ·  ── 2026-10-25T02:26:58.7774630Z 265 │ } 2026-10-25T02:26:58.7774682Z ╰──── 2026-10-25T02:26:58.7774910Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-25T02:26:58.7774912Z 2026-10-25T02:26:58.7775099Z ⚠ eslint(require-yield): This generator function does not have `yield` 2026-10-25T02:26:58.7775244Z ╭─[packages/provider-acp/src/server/mcpOverAcpBridge.ts:81:78] 2026-10-25T02:26:58.7775298Z  80 │ 2026-10-25T02:26:58.7775560Z  81 │ ╭─▶ export const makeAcpMcpOverAcpBridge = Effect.fn("AcpMcpOverAcpBridge.make")(function* ( 2026-10-25T02:26:58.7775679Z  82 │ │ options: AcpMcpOverAcpBridgeOptions, 2026-10-25T02:26:58.7775799Z  83 │ │ ): Effect.fn.Return { 2026-10-25T02:26:58.7776016Z  84 │ │ const fetchImplementation = options.fetchImplementation ?? fetch; 2026-10-25T02:26:58.7776149Z  85 │ │ const connections = new Map(); 2026-10-25T02:26:58.7776218Z  86 │ │ 2026-10-25T02:26:58.7776430Z  87 │ │ const connectionFor = (connectionId: string): Effect.Effect => 2026-10-25T02:26:58.7776530Z  88 │ │ Effect.suspend(() => { 2026-10-25T02:26:58.7776663Z  89 │ │ const connection = connections.get(connectionId); 2026-10-25T02:26:58.7776773Z  90 │ │ return connection === undefined 2026-10-25T02:26:58.7776980Z  91 │ │ ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`)) 2026-10-25T02:26:58.7777095Z  92 │ │ : Effect.succeed(connection); 2026-10-25T02:26:58.7777172Z  93 │ │ }); 2026-10-25T02:26:58.7777240Z  94 │ │ 2026-10-25T02:26:58.7777326Z  95 │ │ const send = ( 2026-10-25T02:26:58.7777423Z  96 │ │ connection: Connection, 2026-10-25T02:26:58.7777513Z  97 │ │ message: unknown, 2026-10-25T02:26:58.7777667Z  98 │ │ ): Effect.Effect, AcpMcpOverAcpError> => 2026-10-25T02:26:58.7777781Z  99 │ │ connection.mutex.withPermits(1)( 2026-10-25T02:26:58.7777887Z 100 │ │ Effect.gen(function* () { 2026-10-25T02:26:58.7778006Z 101 │ │ const body = JSON.stringify(message); 2026-10-25T02:26:58.7778205Z 102 │ │ if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) { 2026-10-25T02:26:58.7778492Z 103 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB.")); 2026-10-25T02:26:58.7778570Z 104 │ │ } 2026-10-25T02:26:58.7778701Z 105 │ │ const response = yield* Effect.tryPromise({ 2026-10-25T02:26:58.7778800Z 106 │ │ try: (signal) => 2026-10-25T02:26:58.7778930Z 107 │ │ fetchImplementation(options.endpoint, { 2026-10-25T02:26:58.7779031Z 108 │ │ method: "POST", 2026-10-25T02:26:58.7779121Z 109 │ │ signal, 2026-10-25T02:26:58.7779215Z 110 │ │ headers: { 2026-10-25T02:26:58.7779348Z 111 │ │ "content-type": "application/json", 2026-10-25T02:26:58.7779490Z 112 │ │ accept: "application/json, text/event-stream", 2026-10-25T02:26:58.7779622Z 113 │ │ authorization: options.authorization, 2026-10-25T02:26:58.7779744Z 114 │ │ ...(connection.sessionId === null 2026-10-25T02:26:58.7779835Z 115 │ │ ? {} 2026-10-25T02:26:58.7779978Z 116 │ │ : { "mcp-session-id": connection.sessionId }), 2026-10-25T02:26:58.7780111Z 117 │ │ ...(connection.protocolVersion === null 2026-10-25T02:26:58.7780200Z 118 │ │ ? {} 2026-10-25T02:26:58.7780363Z 119 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-25T02:26:58.7780453Z 120 │ │ }, 2026-10-25T02:26:58.7780546Z 121 │ │ body, 2026-10-25T02:26:58.7780627Z 122 │ │ }), 2026-10-25T02:26:58.7780727Z 123 │ │ catch: bridgeError, 2026-10-25T02:26:58.7780806Z 124 │ │ }); 2026-10-25T02:26:58.7781015Z 125 │ │ connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId; 2026-10-25T02:26:58.7781113Z 126 │ │ if (!response.ok) { 2026-10-25T02:26:58.7781218Z 127 │ │ yield* Effect.promise( 2026-10-25T02:26:58.7781395Z 128 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-25T02:26:58.7781600Z 129 │ │ ); 2026-10-25T02:26:58.7781784Z 130 │ │ return yield* Effect.fail( 2026-10-25T02:26:58.7781989Z 131 │ │ new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`), 2026-10-25T02:26:58.7782068Z 132 │ │ ); 2026-10-25T02:26:58.7782146Z 133 │ │ } 2026-10-25T02:26:58.7782350Z 134 │ │ const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))]; 2026-10-25T02:26:58.7782469Z 135 │ │ for (const payload of payloads) { 2026-10-25T02:26:58.7782680Z 136 │ │ connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion; 2026-10-25T02:26:58.7782756Z 137 │ │ } 2026-10-25T02:26:58.7782856Z 138 │ │ return payloads; 2026-10-25T02:26:58.7782978Z 139 │ │ }).pipe(Effect.mapError(bridgeError)), 2026-10-25T02:26:58.7783052Z 140 │ │ ); 2026-10-25T02:26:58.7783121Z 141 │ │ 2026-10-25T02:26:58.7783292Z 142 │ │ const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* ( 2026-10-25T02:26:58.7783417Z 143 │ │ request: AcpSchema.DisconnectMcpRequest, 2026-10-25T02:26:58.7783598Z 144 │ │ ): Effect.fn.Return { 2026-10-25T02:26:58.7783758Z 145 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-25T02:26:58.7783883Z 146 │ │ connections.delete(request.connectionId); 2026-10-25T02:26:58.7784006Z 147 │ │ const sessionId = connection.sessionId; 2026-10-25T02:26:58.7784110Z 148 │ │ if (sessionId !== null) { 2026-10-25T02:26:58.7784235Z 149 │ │ const response = yield* Effect.tryPromise({ 2026-10-25T02:26:58.7784329Z 150 │ │ try: (signal) => 2026-10-25T02:26:58.7784454Z 151 │ │ fetchImplementation(options.endpoint, { 2026-10-25T02:26:58.7784553Z 152 │ │ method: "DELETE", 2026-10-25T02:26:58.7784641Z 153 │ │ signal, 2026-10-25T02:26:58.7784733Z 154 │ │ headers: { 2026-10-25T02:26:58.7784861Z 155 │ │ authorization: options.authorization, 2026-10-25T02:26:58.7784983Z 156 │ │ "mcp-session-id": sessionId, 2026-10-25T02:26:58.7785117Z 157 │ │ ...(connection.protocolVersion === null 2026-10-25T02:26:58.7785266Z 158 │ │ ? {} 2026-10-25T02:26:58.7785464Z 159 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-25T02:26:58.7785547Z 160 │ │ }, 2026-10-25T02:26:58.7785627Z 161 │ │ }), 2026-10-25T02:26:58.7785727Z 162 │ │ catch: bridgeError, 2026-10-25T02:26:58.7785802Z 163 │ │ }); 2026-10-25T02:26:58.7785969Z 164 │ │ if (!response.ok && response.status !== 404) { 2026-10-25T02:26:58.7786078Z 165 │ │ return yield* Effect.fail( 2026-10-25T02:26:58.7786267Z 166 │ │ new AcpMcpOverAcpError( 2026-10-25T02:26:58.7786569Z 167 │ │ `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`, 2026-10-25T02:26:58.7786650Z 168 │ │ ), 2026-10-25T02:26:58.7786728Z 169 │ │ ); 2026-10-25T02:26:58.7786804Z 170 │ │ } 2026-10-25T02:26:58.7786904Z 171 │ │ yield* Effect.promise( 2026-10-25T02:26:58.7787079Z 172 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-25T02:26:58.7787156Z 173 │ │ ); 2026-10-25T02:26:58.7787229Z 174 │ │ } 2026-10-25T02:26:58.7787310Z 175 │ │ return {}; 2026-10-25T02:26:58.7787386Z 176 │ │ }); 2026-10-25T02:26:58.7787459Z 177 │ │ 2026-10-25T02:26:58.7787541Z 178 │ │ return { 2026-10-25T02:26:58.7787708Z 179 │ │ connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) { 2026-10-25T02:26:58.7787829Z 180 │ │ if (request.serverId !== "t3-code") { 2026-10-25T02:26:58.7787935Z 181 │ │ return yield* Effect.fail( 2026-10-25T02:26:58.7788117Z 182 │ │ new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`), 2026-10-25T02:26:58.7788193Z 183 │ │ ); 2026-10-25T02:26:58.7788268Z 184 │ │ } 2026-10-25T02:26:58.7788393Z 185 │ │ if (connections.size >= MAX_CONNECTIONS) { 2026-10-25T02:26:58.7788605Z 186 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections.")); 2026-10-25T02:26:58.7788680Z 187 │ │ } 2026-10-25T02:26:58.7788834Z 188 │ │ const connectionId = yield* options.allocateConnectionId; 2026-10-25T02:26:58.7788951Z 189 │ │ connections.set(connectionId, { 2026-10-25T02:26:58.7789065Z 190 │ │ mutex: yield* Semaphore.make(1), 2026-10-25T02:26:58.7789159Z 191 │ │ sessionId: null, 2026-10-25T02:26:58.7789264Z 192 │ │ protocolVersion: null, 2026-10-25T02:26:58.7789361Z 193 │ │ nextRequestId: 0, 2026-10-25T02:26:58.7789444Z 194 │ │ }); 2026-10-25T02:26:58.7789544Z 195 │ │ return { connectionId }; 2026-10-25T02:26:58.7789626Z 196 │ │ }), 2026-10-25T02:26:58.7789798Z 197 │ │ message: Effect.fn("mcpOverAcpBridge.message")(function* (request) { 2026-10-25T02:26:58.7789959Z 198 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-25T02:26:58.7790080Z 199 │ │ const id = ++connection.nextRequestId; 2026-10-25T02:26:58.7790205Z 200 │ │ const payloads = yield* send(connection, { 2026-10-25T02:26:58.7790302Z 201 │ │ jsonrpc: "2.0", 2026-10-25T02:26:58.7790383Z 202 │ │ id, 2026-10-25T02:26:58.7790485Z 203 │ │ method: request.method, 2026-10-25T02:26:58.7790641Z 204 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-25T02:26:58.7790718Z 205 │ │ }); 2026-10-25T02:26:58.7790965Z 206 │ │ const response = payloads.find((payload) => asEnvelope(payload)?.id === id); 2026-10-25T02:26:58.7791166Z 207 │ │ const envelope = asEnvelope(response); 2026-10-25T02:26:58.7791265Z 208 │ │ if (envelope === null) { 2026-10-25T02:26:58.7791371Z 209 │ │ return yield* Effect.fail( 2026-10-25T02:26:58.7791553Z 210 │ │ new AcpMcpOverAcpError("MCP server did not return a matching response."), 2026-10-25T02:26:58.7791630Z 211 │ │ ); 2026-10-25T02:26:58.7791703Z 212 │ │ } 2026-10-25T02:26:58.7791820Z 213 │ │ if (envelope.error !== undefined) { 2026-10-25T02:26:58.7792018Z 214 │ │ return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error))); 2026-10-25T02:26:58.7792094Z 215 │ │ } 2026-10-25T02:26:58.7792261Z 216 │ │ return (envelope.result ?? null) as AcpSchema.MessageMcpResponse; 2026-10-25T02:26:58.7792335Z 217 │ │ }), 2026-10-25T02:26:58.7792521Z 218 │ │ notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) { 2026-10-25T02:26:58.7792678Z 219 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-25T02:26:58.7792781Z 220 │ │ yield* send(connection, { 2026-10-25T02:26:58.7792877Z 221 │ │ jsonrpc: "2.0", 2026-10-25T02:26:58.7792978Z 222 │ │ method: request.method, 2026-10-25T02:26:58.7793139Z 223 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-25T02:26:58.7793218Z 224 │ │ }); 2026-10-25T02:26:58.7793290Z 225 │ │ }), 2026-10-25T02:26:58.7793374Z 226 │ │ disconnect, 2026-10-25T02:26:58.7793481Z 227 │ │ dispose: Effect.suspend(() => 2026-10-25T02:26:58.7793575Z 228 │ │ Effect.forEach( 2026-10-25T02:26:58.7793677Z 229 │ │ [...connections.keys()], 2026-10-25T02:26:58.7793847Z 230 │ │ (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore), 2026-10-25T02:26:58.7793946Z 231 │ │ { discard: true }, 2026-10-25T02:26:58.7794022Z 232 │ │ ), 2026-10-25T02:26:58.7794096Z 233 │ │ ), 2026-10-25T02:26:58.7794174Z 234 │ │ }; 2026-10-25T02:26:58.7794302Z 235 │ ╰─▶ }); 2026-10-25T02:26:58.7794352Z ╰──── 2026-10-25T02:26:58.7794598Z  help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed. 2026-10-25T02:26:58.7794601Z 2026-10-25T02:26:58.7794806Z ⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used. 2026-10-25T02:26:58.7794944Z ╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10] 2026-10-25T02:26:58.7794995Z 21 │ 2026-10-25T02:26:58.7795151Z 22 │ function summarizePayload(payload: unknown): Readonly> { 2026-10-25T02:26:58.7795236Z ·  ────────┬─────── 2026-10-25T02:26:58.7795450Z · ╰── 'summarizePayload' is declared here 2026-10-25T02:26:58.7795621Z 23 │ if (payload === null) return { valueType: "null" }; 2026-10-25T02:26:58.7795680Z ╰──── 2026-10-25T02:26:58.7795785Z  help: Consider removing this declaration. 2026-10-25T02:26:58.7795787Z 2026-10-25T02:26:58.7796201Z ⚠ 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-25T02:26:58.7796311Z ╭─[packages/contracts/src/auth.test.ts:17:12] 2026-10-25T02:26:58.7796464Z 16 │ it("decodes legacy review credentials without offering them in new grants", () => { 2026-10-25T02:26:58.7796627Z 17 │ expect(Schema.decodeUnknownSync(AuthEnvironmentScopes)(["review:write"])).toEqual([ 2026-10-25T02:26:58.7796726Z ·  ──────────────────────── 2026-10-25T02:26:58.7796798Z 18 │ "review:write", 2026-10-25T02:26:58.7796850Z ╰──── 2026-10-25T02:26:58.7796853Z 2026-10-25T02:26:58.7797208Z ⚠ 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-25T02:26:58.7797316Z ╭─[packages/contracts/src/auth.test.ts:20:18] 2026-10-25T02:26:58.7797372Z 19 │ ]); 2026-10-25T02:26:58.7797530Z 20 │ expect(() => Schema.decodeUnknownSync(AuthGrantScopes)(["review:write"])).toThrow(); 2026-10-25T02:26:58.7797636Z ·  ──────────────────────── 2026-10-25T02:26:58.7797764Z 21 │ expect(AuthStandardClientScopes).not.toContain("review:write"); 2026-10-25T02:26:58.7797814Z ╰──── 2026-10-25T02:26:58.7797816Z 2026-10-25T02:26:58.7798173Z ⚠ 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-25T02:26:58.7798284Z ╭─[packages/contracts/src/auth.test.ts:57:21] 2026-10-25T02:26:58.7798452Z 56 │ it("ignores unknown response permissions without falling back to broader scopes", () => { 2026-10-25T02:26:58.7798574Z 57 │ const session = Schema.decodeUnknownSync(AuthSessionState)({ 2026-10-25T02:26:58.7798680Z ·  ──────────────────────── 2026-10-25T02:26:58.7798747Z 58 │ authenticated: true, 2026-10-25T02:26:58.7798800Z ╰──── 2026-10-25T02:26:58.7798802Z 2026-10-25T02:26:58.7799012Z ⚠ eslint(no-unused-vars): Identifier 'serverEnvironment' is imported but never used. 2026-10-25T02:26:58.7799141Z ╭─[apps/web/src/components/LegacySidebar.tsx:210:40] 2026-10-25T02:26:58.7799297Z 209 │ import { useClientSettings, updateClientSettings } from "~/hooks/useSettings"; 2026-10-25T02:26:58.7799459Z 210 │ import { primaryServerKeybindingsAtom, serverEnvironment } from "../state/server"; 2026-10-25T02:26:58.7799573Z ·  ────────┬──────── 2026-10-25T02:26:58.7799743Z · ╰── 'serverEnvironment' is imported here 2026-10-25T02:26:58.7799851Z 211 │ import { appAtomRegistry } from "../rpc/atomRegistry"; 2026-10-25T02:26:58.7799903Z ╰──── 2026-10-25T02:26:58.7799999Z  help: Consider removing this import. 2026-10-25T02:26:58.7800002Z 2026-10-25T02:26:58.7800254Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:26:58.7800483Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:388:7] 2026-10-25T02:26:58.7800586Z 383 │ }; 2026-10-25T02:26:58.7800686Z 384 │ useEffect(() => { 2026-10-25T02:26:58.7800758Z ·  ────┬──── 2026-10-25T02:26:58.7800886Z · ╰── This is the containing effect 2026-10-25T02:26:58.7800983Z 385 │ if (!guidesEnabled && section === "guide") { 2026-10-25T02:26:58.7801077Z 386 │ requestedSection.current = "overview"; 2026-10-25T02:26:58.7801240Z 387 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-25T02:26:58.7801311Z 388 │ setSection("overview"); 2026-10-25T02:26:58.7801387Z ·  ─────┬──── 2026-10-25T02:26:58.7801555Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7801618Z 389 │ } 2026-10-25T02:26:58.7801670Z ╰──── 2026-10-25T02:26:58.7802272Z  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-25T02:26:58.7802592Z  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-25T02:26:58.7802595Z 2026-10-25T02:26:58.7802798Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-25T02:26:58.7802967Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:390:6] 2026-10-25T02:26:58.7803065Z 385 │ if (!guidesEnabled && section === "guide") { 2026-10-25T02:26:58.7803160Z 386 │ requestedSection.current = "overview"; 2026-10-25T02:26:58.7803242Z ·  ────────┬─────── 2026-10-25T02:26:58.7803680Z · ╰── 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-25T02:26:58.7803840Z 387 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-25T02:26:58.7803985Z ·  ─────────┬───────── ──────┬────── 2026-10-25T02:26:58.7804531Z · │ ╰── 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-25T02:26:58.7805054Z · ╰── 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-25T02:26:58.7805128Z 388 │ setSection("overview"); 2026-10-25T02:26:58.7805182Z 389 │ } 2026-10-25T02:26:58.7805272Z 390 │ }, [guidesEnabled, section, insets.top]); 2026-10-25T02:26:58.7805382Z ·  ──────────────────┬───────────────── 2026-10-25T02:26:58.7805570Z · ╰── This dependency list is missing values used by the callback 2026-10-25T02:26:58.7805654Z 391 │ const tabContent = activityContent; 2026-10-25T02:26:58.7805709Z ╰──── 2026-10-25T02:26:58.7805899Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-25T02:26:58.7806239Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7806241Z 2026-10-25T02:26:58.7806425Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T02:26:58.7806594Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:555:70] 2026-10-25T02:26:58.7806675Z 554 │ assert.deepStrictEqual( 2026-10-25T02:26:58.7806837Z 555 │ (yield* Ref.get(fixture.syncCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-25T02:26:58.7806961Z ·  ┬ 2026-10-25T02:26:58.7807122Z · ╰── '_' is declared here 2026-10-25T02:26:58.7807185Z 556 │ [ 2026-10-25T02:26:58.7807235Z ╰──── 2026-10-25T02:26:58.7807337Z  help: Consider removing this parameter. 2026-10-25T02:26:58.7807339Z 2026-10-25T02:26:58.7807518Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T02:26:58.7807689Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:1154:70] 2026-10-25T02:26:58.7807770Z 1153 │ assert.deepStrictEqual( 2026-10-25T02:26:58.7807932Z 1154 │ (yield* Ref.get(fixture.linkCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-25T02:26:58.7808057Z ·  ┬ 2026-10-25T02:26:58.7808218Z · ╰── '_' is declared here 2026-10-25T02:26:58.7808280Z 1155 │ [ 2026-10-25T02:26:58.7808332Z ╰──── 2026-10-25T02:26:58.7808431Z  help: Consider removing this parameter. 2026-10-25T02:26:58.7808433Z 2026-10-25T02:26:58.7808621Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T02:26:58.7808784Z ╭─[apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx:803:17] 2026-10-25T02:26:58.7808847Z 802 │
({ key: input.targetKey, location: candidate })); 2026-10-25T02:26:58.7810229Z 113 │ useEffect(() => { 2026-10-25T02:26:58.7810298Z ·  ────┬──── 2026-10-25T02:26:58.7810428Z · ╰── This is the containing effect 2026-10-25T02:26:58.7810596Z 114 │ if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) { 2026-10-25T02:26:58.7810661Z 115 │ return; 2026-10-25T02:26:58.7810713Z 116 │ } 2026-10-25T02:26:58.7810829Z 117 │ setEntry({ key: input.targetKey, location: candidate }); 2026-10-25T02:26:58.7810898Z ·  ────┬─── 2026-10-25T02:26:58.7811064Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7811182Z 118 │ }, [candidate, entry.key, entry.location, input.targetKey]); 2026-10-25T02:26:58.7811234Z ╰──── 2026-10-25T02:26:58.7811827Z  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-25T02:26:58.7812146Z  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-25T02:26:58.7812149Z 2026-10-25T02:26:58.7812607Z ⚠ 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-25T02:26:58.7812754Z ╭─[apps/server/src/background/HostPowerMonitor.test.ts:133:11] 2026-10-25T02:26:58.7812883Z 132 │ const monitor = yield* HostPowerMonitor.HostPowerMonitor; 2026-10-25T02:26:58.7813025Z 133 │ ╭─▶ for ( 2026-10-25T02:26:58.7813131Z 134 │ │ let attempt = 0; 2026-10-25T02:26:58.7813296Z 135 │ │ attempt < 100 && (yield* monitor.snapshot).onBattery !== "true"; 2026-10-25T02:26:58.7813391Z 136 │ │ attempt += 1 2026-10-25T02:26:58.7813471Z 137 │ │ ) { 2026-10-25T02:26:58.7813583Z 138 │ │ yield* Effect.yieldNow; 2026-10-25T02:26:58.7813716Z 139 │ ╰─▶ } 2026-10-25T02:26:58.7813838Z 140 │ expect((yield* monitor.snapshot).onBattery).toBe("true"); 2026-10-25T02:26:58.7813888Z ╰──── 2026-10-25T02:26:58.7813890Z 2026-10-25T02:26:58.7814085Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T02:26:58.7814301Z ╭─[apps/mobile/src/features/terminal/TerminalContextSheet.tsx:72:15] 2026-10-25T02:26:58.7814409Z 71 │ { 2026-10-25T02:26:58.7818845Z ·  ────┬──── 2026-10-25T02:26:58.7818970Z · ╰── This is the containing effect 2026-10-25T02:26:58.7819146Z 638 │ if (pendingLaunchEntry.key === launchTargetKey) { 2026-10-25T02:26:58.7819250Z 639 │ return; 2026-10-25T02:26:58.7819335Z 640 │ } 2026-10-25T02:26:58.7819412Z 641 │ setPendingLaunchEntry({ 2026-10-25T02:26:58.7819498Z ·  ──────────┬────────── 2026-10-25T02:26:58.7819667Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7819737Z 642 │ key: launchTargetKey, 2026-10-25T02:26:58.7819787Z ╰──── 2026-10-25T02:26:58.7820379Z  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-25T02:26:58.7820701Z  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-25T02:26:58.7820706Z 2026-10-25T02:26:58.7820955Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:26:58.7821119Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:651:5] 2026-10-25T02:26:58.7821170Z 646 │ 2026-10-25T02:26:58.7821234Z 647 │ useEffect(() => { 2026-10-25T02:26:58.7821304Z ·  ────┬──── 2026-10-25T02:26:58.7821432Z · ╰── This is the containing effect 2026-10-25T02:26:58.7821544Z 648 │ if (initialAttachGridEntry.key === launchTargetKey) { 2026-10-25T02:26:58.7821604Z 649 │ return; 2026-10-25T02:26:58.7821660Z 650 │ } 2026-10-25T02:26:58.7821744Z 651 │ setInitialAttachGridEntry({ 2026-10-25T02:26:58.7821837Z ·  ────────────┬──────────── 2026-10-25T02:26:58.7822007Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7822076Z 652 │ key: launchTargetKey, 2026-10-25T02:26:58.7822127Z ╰──── 2026-10-25T02:26:58.7822711Z  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-25T02:26:58.7823031Z  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-25T02:26:58.7823036Z 2026-10-25T02:26:58.7823286Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:26:58.7823449Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:744:7] 2026-10-25T02:26:58.7823500Z 741 │ 2026-10-25T02:26:58.7823562Z 742 │ useEffect(() => { 2026-10-25T02:26:58.7823630Z ·  ────┬──── 2026-10-25T02:26:58.7823756Z · ╰── This is the containing effect 2026-10-25T02:26:58.7823855Z 743 │ if (!routeEnvironmentId || !routeThreadId) { 2026-10-25T02:26:58.7823923Z 744 │ setLastGridSize({ 2026-10-25T02:26:58.7824005Z ·  ───────┬─────── 2026-10-25T02:26:58.7824232Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7824376Z 745 │ cols: DEFAULT_TERMINAL_COLS, 2026-10-25T02:26:58.7824446Z ╰──── 2026-10-25T02:26:58.7825029Z  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-25T02:26:58.7825464Z  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-25T02:26:58.7825467Z 2026-10-25T02:26:58.7825667Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:26:58.7825870Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:536:24] 2026-10-25T02:26:58.7825928Z 535 │ }); 2026-10-25T02:26:58.7826050Z 536 │ }, [terminal.buffer, terminal.buffer.length, terminalKey]); 2026-10-25T02:26:58.7826159Z ·  ───────────┬────────── 2026-10-25T02:26:58.7826402Z · ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead 2026-10-25T02:26:58.7826562Z 537 │ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null; 2026-10-25T02:26:58.7826612Z ╰──── 2026-10-25T02:26:58.7826901Z  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-25T02:26:58.7827215Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7827221Z 2026-10-25T02:26:58.7827417Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:26:58.7827581Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:707:7] 2026-10-25T02:26:58.7827676Z 706 │ sentInitialInputKeyRef.current = null; 2026-10-25T02:26:58.7827741Z 707 │ }, [terminalKey]); 2026-10-25T02:26:58.7827817Z ·  ─────┬───── 2026-10-25T02:26:58.7827958Z · ╰── Unnecessary dependency `terminalKey` 2026-10-25T02:26:58.7828009Z 708 │ 2026-10-25T02:26:58.7828064Z ╰──── 2026-10-25T02:26:58.7828423Z  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-25T02:26:58.7828817Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7828820Z 2026-10-25T02:26:58.7829016Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:26:58.7829182Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:798:52] 2026-10-25T02:26:58.7829237Z 797 │ }; 2026-10-25T02:26:58.7829412Z 798 │ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]); 2026-10-25T02:26:58.7829589Z ·  ────────────┬──────────── ─────┬───── 2026-10-25T02:26:58.7829821Z · │ ╰── Unnecessary dependency `terminalKey` 2026-10-25T02:26:58.7830030Z · ╰── Unnecessary dependency `terminal.lifecycleVersion` 2026-10-25T02:26:58.7830080Z 799 │ 2026-10-25T02:26:58.7830131Z ╰──── 2026-10-25T02:26:58.7830416Z  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-25T02:26:58.7830719Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7830722Z 2026-10-25T02:26:58.7830864Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.7831034Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:791:24] 2026-10-25T02:26:58.7831089Z 790 │ } 2026-10-25T02:26:58.7831194Z 791 │ const pasteSession = pasteSessionRef.current; 2026-10-25T02:26:58.7831305Z ·  ───────────┬─────────── 2026-10-25T02:26:58.7831462Z · ╰── Cannot access ref value during render 2026-10-25T02:26:58.7831515Z 792 │ 2026-10-25T02:26:58.7831567Z ╰──── 2026-10-25T02:26:58.7832026Z  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-25T02:26:58.7832315Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.7832321Z 2026-10-25T02:26:58.7832525Z ⚠ eslint(no-unused-vars): Type 'PullRequestChecks' is imported but never used. 2026-10-25T02:26:58.7832687Z ╭─[apps/web/src/components/pullRequest/pullRequestDetail.logic.ts:16:8] 2026-10-25T02:26:58.7832758Z 15 │ type PullRequestCheck, 2026-10-25T02:26:58.7832827Z 16 │ type PullRequestChecks, 2026-10-25T02:26:58.7832912Z ·  ────────┬──────── 2026-10-25T02:26:58.7833058Z · ╰── 'PullRequestChecks' is imported here 2026-10-25T02:26:58.7833190Z 17 │ type PullRequestChecksState as ContractPullRequestChecksState, 2026-10-25T02:26:58.7833241Z ╰──── 2026-10-25T02:26:58.7833337Z  help: Consider removing this import. 2026-10-25T02:26:58.7833340Z 2026-10-25T02:26:58.7833650Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:26:58.7833893Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:123:7] 2026-10-25T02:26:58.7833945Z 118 │ 2026-10-25T02:26:58.7834008Z 119 │ useEffect(() => { 2026-10-25T02:26:58.7834079Z ·  ────┬──── 2026-10-25T02:26:58.7834204Z · ╰── This is the containing effect 2026-10-25T02:26:58.7834287Z 120 │ if (orientationSettled) return; 2026-10-25T02:26:58.7834398Z 121 │ const orientation = getNativeShowcaseOrientation(); 2026-10-25T02:26:58.7834475Z 122 │ if (orientation === null) { 2026-10-25T02:26:58.7834555Z 123 │ setOrientationSettled(true); 2026-10-25T02:26:58.7834651Z ·  ──────────┬────────── 2026-10-25T02:26:58.7834821Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7834883Z 124 │ return; 2026-10-25T02:26:58.7834935Z ╰──── 2026-10-25T02:26:58.7835523Z  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-25T02:26:58.7835872Z  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-25T02:26:58.7835877Z 2026-10-25T02:26:58.7836135Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:26:58.7836305Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:298:7] 2026-10-25T02:26:58.7836356Z 286 │ 2026-10-25T02:26:58.7836420Z 287 │ useEffect(() => { 2026-10-25T02:26:58.7836488Z ·  ────┬──── 2026-10-25T02:26:58.7836613Z · ╰── This is the containing effect 2026-10-25T02:26:58.7836671Z 288 │ if ( 2026-10-25T02:26:58.7836736Z 289 │ scene === null || 2026-10-25T02:26:58.7836811Z 290 │ requestedScene === null || 2026-10-25T02:26:58.7836888Z 291 │ scene !== requestedScene || 2026-10-25T02:26:58.7836953Z 292 │ !hasFixture || 2026-10-25T02:26:58.7837023Z 293 │ !orientationSettled || 2026-10-25T02:26:58.7837091Z 294 │ !themeApplied || 2026-10-25T02:26:58.7837210Z 295 │ (scene === "agent-activity" && !agentActivityStaged) || 2026-10-25T02:26:58.7837345Z 296 │ !isShowcaseNativeContentReady({ scene, themeId, renderSignal }) 2026-10-25T02:26:58.7837398Z 297 │ ) { 2026-10-25T02:26:58.7837468Z 298 │ setReadyScene(null); 2026-10-25T02:26:58.7837545Z ·  ──────┬────── 2026-10-25T02:26:58.7837713Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7837771Z 299 │ return; 2026-10-25T02:26:58.7837824Z ╰──── 2026-10-25T02:26:58.7838411Z  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-25T02:26:58.7838793Z  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-25T02:26:58.7838828Z 2026-10-25T02:26:58.7839144Z ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:26:58.7839310Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:128:9] 2026-10-25T02:26:58.7839379Z 127 │ let cancelled = false; 2026-10-25T02:26:58.7839470Z 128 │ let lastOutcome: string | null = null; 2026-10-25T02:26:58.7839547Z ·  ─────┬───── 2026-10-25T02:26:58.7839679Z · ╰── 'lastOutcome' is declared here 2026-10-25T02:26:58.7839861Z 129 │ void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), { 2026-10-25T02:26:58.7839912Z ╰──── 2026-10-25T02:26:58.7840016Z  help: Consider removing this declaration. 2026-10-25T02:26:58.7840019Z 2026-10-25T02:26:58.7840255Z × t3code(no-low-value-comments): Cut this to 4 lines or fewer: keep the constraint, drop the background. 2026-10-25T02:26:58.7840397Z ╭─[packages/shared/src/orchestrationV2DedupedBodies.ts:13:1] 2026-10-25T02:26:58.7840453Z 12 │ 2026-10-25T02:26:58.7840579Z 13 │ ╭─▶ /** 2026-10-25T02:26:58.7840776Z 14 │ │ * A turn item repeats a body its record already carries: message text, checkpoint files, a 2026-10-25T02:26:58.7840977Z 15 │ │ * subagent's prompt and result. For clients that opt in, the server blanks the repeat and marks 2026-10-25T02:26:58.7841186Z 16 │ │ * the field (`textOmitted`, `filesOmitted`, `promptOmitted`, `resultOmitted`), and the client 2026-10-25T02:26:58.7841390Z 17 │ │ * copies the value back from the record it already holds. Only a body equal to the record's is 2026-10-25T02:26:58.7841500Z 18 │ │ * blanked, so the restore is exact. 2026-10-25T02:26:58.7841618Z 19 │ ╰─▶ */ 2026-10-25T02:26:58.7841707Z 20 │ export interface DedupedBodySource { 2026-10-25T02:26:58.7841758Z ╰──── 2026-10-25T02:26:58.7841760Z 2026-10-25T02:26:58.7842013Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:26:58.7842171Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:40:5] 2026-10-25T02:26:58.7842286Z 37 │ const [initialized, setInitialized] = useState(false); 2026-10-25T02:26:58.7842356Z 38 │ useLayoutEffect(() => { 2026-10-25T02:26:58.7842434Z ·  ───────┬─────── 2026-10-25T02:26:58.7842562Z · ╰── This is the containing effect 2026-10-25T02:26:58.7842623Z 39 │ reset(); 2026-10-25T02:26:58.7842690Z 40 │ setInitialized(true); 2026-10-25T02:26:58.7842767Z ·  ───────┬────── 2026-10-25T02:26:58.7842933Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7842993Z 41 │ }, [reset]); 2026-10-25T02:26:58.7843044Z ╰──── 2026-10-25T02:26:58.7843701Z  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-25T02:26:58.7844100Z  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-25T02:26:58.7844103Z 2026-10-25T02:26:58.7844353Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:26:58.7844510Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:93:5] 2026-10-25T02:26:58.7844562Z 88 │ 2026-10-25T02:26:58.7844626Z 89 │ useEffect(() => { 2026-10-25T02:26:58.7844693Z ·  ────┬──── 2026-10-25T02:26:58.7844820Z · ╰── This is the containing effect 2026-10-25T02:26:58.7844982Z 90 │ if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return; 2026-10-25T02:26:58.7845086Z 91 │ const branchName = initialProjectRef.branch; 2026-10-25T02:26:58.7845149Z 92 │ let active = true; 2026-10-25T02:26:58.7845244Z 93 │ setPendingCheckouts((count) => count + 1); 2026-10-25T02:26:58.7845327Z ·  ─────────┬───────── 2026-10-25T02:26:58.7845493Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7845643Z 94 │ // Serialize replacements: ignoring a stale result cannot undo its Git mutation. 2026-10-25T02:26:58.7845694Z ╰──── 2026-10-25T02:26:58.7846335Z  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-25T02:26:58.7846652Z  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-25T02:26:58.7846655Z 2026-10-25T02:26:58.7846835Z ⚠ react(static-components): Cannot create components during render 2026-10-25T02:26:58.7846992Z ╭─[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10] 2026-10-25T02:26:58.7847077Z 196 │ const { onInput, onResize } = props; 2026-10-25T02:26:58.7847223Z 197 │ const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView(); 2026-10-25T02:26:58.7847351Z ·  ────────────────┬─────────────── 2026-10-25T02:26:58.7847595Z · ╰── The component is created during render here 2026-10-25T02:26:58.7847795Z 198 │ const hasNativeSurface = Boolean(NativeTerminalSurfaceView); 2026-10-25T02:26:58.7847847Z 199 │ 2026-10-25T02:26:58.7847912Z 200 │ useEffect(() => { 2026-10-25T02:26:58.7847998Z 201 │ terminalDebugLog("native:surface", { 2026-10-25T02:26:58.7848084Z 202 │ terminalKey: props.terminalKey, 2026-10-25T02:26:58.7848158Z 203 │ native: hasNativeSurface, 2026-10-25T02:26:58.7848291Z 204 │ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(), 2026-10-25T02:26:58.7848372Z 205 │ bufferLen: props.buffer.length, 2026-10-25T02:26:58.7848450Z 206 │ isRunning: props.isRunning, 2026-10-25T02:26:58.7848505Z 207 │ }); 2026-10-25T02:26:58.7848667Z 208 │ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]); 2026-10-25T02:26:58.7848756Z 209 │ const handleNativeInput = useCallback( 2026-10-25T02:26:58.7848869Z 210 │ (event: NativeSyntheticEvent) => { 2026-10-25T02:26:58.7848965Z 211 │ if (!props.isRunning || props.readOnly) { 2026-10-25T02:26:58.7849026Z 212 │ return; 2026-10-25T02:26:58.7849079Z 213 │ } 2026-10-25T02:26:58.7849168Z 214 │ terminalDebugLog("native:onInput", { 2026-10-25T02:26:58.7849315Z 215 │ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)), 2026-10-25T02:26:58.7849372Z 216 │ }); 2026-10-25T02:26:58.7849455Z 217 │ onInput(event.nativeEvent.data); 2026-10-25T02:26:58.7849509Z 218 │ }, 2026-10-25T02:26:58.7849606Z 219 │ [onInput, props.isRunning, props.readOnly], 2026-10-25T02:26:58.7849658Z 220 │ ); 2026-10-25T02:26:58.7849750Z 221 │ const handleNativeResize = useCallback( 2026-10-25T02:26:58.7849865Z 222 │ (event: NativeSyntheticEvent) => { 2026-10-25T02:26:58.7849927Z 223 │ onResize({ 2026-10-25T02:26:58.7850008Z 224 │ cols: event.nativeEvent.cols, 2026-10-25T02:26:58.7850088Z 225 │ rows: event.nativeEvent.rows, 2026-10-25T02:26:58.7850144Z 226 │ }); 2026-10-25T02:26:58.7850197Z 227 │ }, 2026-10-25T02:26:58.7850256Z 228 │ [onResize], 2026-10-25T02:26:58.7850309Z 229 │ ); 2026-10-25T02:26:58.7850360Z 230 │ 2026-10-25T02:26:58.7850440Z 231 │ if (NativeTerminalSurfaceView) { 2026-10-25T02:26:58.7850497Z 232 │ return ( 2026-10-25T02:26:58.7850574Z 233 │ 2026-10-25T02:26:58.7850652Z 234 │ { 2026-10-25T02:26:58.7852335Z ·  ────┬──── 2026-10-25T02:26:58.7852485Z · ╰── This is the containing effect 2026-10-25T02:26:58.7852575Z 410 │ setInspectorSelection((current) => { 2026-10-25T02:26:58.7852659Z ·  ──────────┬────────── 2026-10-25T02:26:58.7852828Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7852929Z 411 │ if (props.renderInspector === undefined) { 2026-10-25T02:26:58.7852979Z ╰──── 2026-10-25T02:26:58.7853570Z  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-25T02:26:58.7853888Z  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-25T02:26:58.7853890Z 2026-10-25T02:26:58.7854102Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-25T02:26:58.7854253Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:538:24] 2026-10-25T02:26:58.7854410Z 537 │ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top; 2026-10-25T02:26:58.7854573Z 538 │ ╭─▶ const GitInspector = () => ( 2026-10-25T02:26:58.7854668Z 539 │ │ 2026-10-25T02:26:58.7855273Z 544 │ ╰─▶ ); 2026-10-25T02:26:58.7855351Z 545 │ const FilesInspector = () => 2026-10-25T02:26:58.7855401Z ╰──── 2026-10-25T02:26:58.7855615Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-25T02:26:58.7855618Z 2026-10-25T02:26:58.7855859Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-25T02:26:58.7856023Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:545:26] 2026-10-25T02:26:58.7856083Z 544 │ ); 2026-10-25T02:26:58.7856244Z 545 │ ╭─▶ const FilesInspector = () => 2026-10-25T02:26:58.7856393Z 546 │ │ selectedThread !== null && selectedThreadCwd !== null ? ( 2026-10-25T02:26:58.7856501Z 547 │ │ 2026-10-25T02:26:58.7857647Z 555 │ ╰─▶ ) : null; 2026-10-25T02:26:58.7857797Z 556 │ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset); 2026-10-25T02:26:58.7857845Z ╰──── 2026-10-25T02:26:58.7858059Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-25T02:26:58.7858061Z 2026-10-25T02:26:58.7858317Z ⚠ unicorn(prefer-add-event-listener): Prefer `addEventListener()` over their `on`-function counterparts. 2026-10-25T02:26:58.7858462Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:12:14] 2026-10-25T02:26:58.7858614Z 11 │ addEventListener(_type: string, listener: (event: { data: string }) => void) { 2026-10-25T02:26:58.7858689Z 12 │ this.onmessage = listener; 2026-10-25T02:26:58.7858768Z ·  ───────── 2026-10-25T02:26:58.7858822Z 13 │ } 2026-10-25T02:26:58.7858872Z ╰──── 2026-10-25T02:26:58.7859186Z  help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on` replaces any previously registered handler. 2026-10-25T02:26:58.7859189Z 2026-10-25T02:26:58.7859392Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-25T02:26:58.7859533Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:16:9] 2026-10-25T02:26:58.7859600Z 15 │ constructor() { 2026-10-25T02:26:58.7859669Z 16 │ source = this; 2026-10-25T02:26:58.7859742Z ·  ────── 2026-10-25T02:26:58.7859796Z 17 │ } 2026-10-25T02:26:58.7859846Z ╰──── 2026-10-25T02:26:58.7860112Z  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-25T02:26:58.7860114Z 2026-10-25T02:26:58.7860295Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T02:26:58.7860400Z ╭─[packages/shared/src/qrCode.ts:458:44] 2026-10-25T02:26:58.7860462Z 457 │ ): Array { 2026-10-25T02:26:58.7860568Z 458 │ let result: Array = divisor.map((_) => 0); 2026-10-25T02:26:58.7860667Z ·  ┬ 2026-10-25T02:26:58.7860815Z · ╰── '_' is declared here 2026-10-25T02:26:58.7860886Z 459 │ for (const b of data) { 2026-10-25T02:26:58.7860936Z ╰──── 2026-10-25T02:26:58.7861038Z  help: Consider removing this parameter. 2026-10-25T02:26:58.7861041Z 2026-10-25T02:26:58.7861287Z ⚠ eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used. 2026-10-25T02:26:58.7861464Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:956:10] 2026-10-25T02:26:58.7861514Z 955 │ 2026-10-25T02:26:58.7861624Z 956 │ function layerClaudeAgentSdkReplayQueryRunner( 2026-10-25T02:26:58.7861735Z ·  ──────────────────┬───────────────── 2026-10-25T02:26:58.7861930Z · ╰── 'layerClaudeAgentSdkReplayQueryRunner' is declared here 2026-10-25T02:26:58.7862096Z 957 │ transcript: ClaudeAgentSdkReplayTranscript, 2026-10-25T02:26:58.7862181Z ╰──── 2026-10-25T02:26:58.7862327Z  help: Consider removing this declaration. 2026-10-25T02:26:58.7862329Z 2026-10-25T02:26:58.7862580Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:26:58.7862749Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10520:7] 2026-10-25T02:26:58.7862802Z 10519 │ 2026-10-25T02:26:58.7862874Z 10520 │ const layer: Layer.Layer< 2026-10-25T02:26:58.7862944Z ·  ──┬── 2026-10-25T02:26:58.7863067Z · ╰── 'layer' is declared here 2026-10-25T02:26:58.7863160Z 10521 │ ProviderAdapter.ProviderAdapterV2, 2026-10-25T02:26:58.7863213Z ╰──── 2026-10-25T02:26:58.7863320Z  help: Consider removing this declaration. 2026-10-25T02:26:58.7863325Z 2026-10-25T02:26:58.7863489Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-25T02:26:58.7863624Z ╭─[apps/server/src/process/externalLauncher.test.ts:183:12] 2026-10-25T02:26:58.7863676Z 182 │ 2026-10-25T02:26:58.7863775Z 183 │ for (const {} of ["darwin", "linux"] as const) { 2026-10-25T02:26:58.7863844Z ·  ── 2026-10-25T02:26:58.7863894Z 184 │ } 2026-10-25T02:26:58.7863944Z ╰──── 2026-10-25T02:26:58.7864169Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-25T02:26:58.7864171Z 2026-10-25T02:26:58.7864332Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-25T02:26:58.7864471Z ╭─[apps/server/src/process/externalLauncher.test.ts:186:12] 2026-10-25T02:26:58.7864524Z 185 │ 2026-10-25T02:26:58.7864588Z 186 │ for (const {} of [ 2026-10-25T02:26:58.7864656Z ·  ── 2026-10-25T02:26:58.7864744Z 187 │ { kind: "browser", folderVerb: "none" }, 2026-10-25T02:26:58.7864794Z ╰──── 2026-10-25T02:26:58.7865016Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-25T02:26:58.7865019Z 2026-10-25T02:26:58.7865183Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-25T02:26:58.7865526Z ╭─[apps/server/src/process/externalLauncher.test.ts:308:12] 2026-10-25T02:26:58.7865577Z 307 │ 2026-10-25T02:26:58.7865702Z 308 │ for (const {} of ["rejected", "spawn-error", "stalled"] as const) { 2026-10-25T02:26:58.7865775Z ·  ── 2026-10-25T02:26:58.7865864Z 309 │ } 2026-10-25T02:26:58.7865915Z ╰──── 2026-10-25T02:26:58.7866137Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-25T02:26:58.7866139Z 2026-10-25T02:26:58.7866299Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-25T02:26:58.7866430Z ╭─[apps/server/src/process/externalLauncher.test.ts:311:12] 2026-10-25T02:26:58.7866481Z 310 │ 2026-10-25T02:26:58.7866545Z 311 │ for (const {} of [ 2026-10-25T02:26:58.7866612Z ·  ── 2026-10-25T02:26:58.7866664Z 312 │ { 2026-10-25T02:26:58.7866714Z ╰──── 2026-10-25T02:26:58.7867008Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-25T02:26:58.7867048Z 2026-10-25T02:26:58.7867362Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-25T02:26:58.7867529Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:2143:15] 2026-10-25T02:26:58.7867595Z 2142 │ assert.equal( 2026-10-25T02:26:58.7867744Z 2143 │ items.filter((item) => item.type === "assistant_message").at(-1)?.text, 2026-10-25T02:26:58.7867824Z ·  ────── 2026-10-25T02:26:58.7867899Z 2144 │ "authoritative answer", 2026-10-25T02:26:58.7867953Z ╰──── 2026-10-25T02:26:58.7868121Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-25T02:26:58.7868123Z 2026-10-25T02:26:58.7868594Z ⚠ 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-25T02:26:58.7868764Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:4245:7] 2026-10-25T02:26:58.7868941Z 4244 │ const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped); 2026-10-25T02:26:58.7869144Z 4245 │ ╭─▶ while (!responseLifecycle.includes("failed")) { 2026-10-25T02:26:58.7869252Z 4246 │ │ yield* Effect.yieldNow; 2026-10-25T02:26:58.7869383Z 4247 │ ╰─▶ } 2026-10-25T02:26:58.7869502Z 4248 │ const responseExit = yield* Fiber.join(responseFiber); 2026-10-25T02:26:58.7869561Z ╰──── 2026-10-25T02:26:58.7869566Z 2026-10-25T02:26:58.7870022Z ⚠ 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-25T02:26:58.7870187Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6355:9] 2026-10-25T02:26:58.7870274Z 6354 │ .pipe(Effect.forkScoped); 2026-10-25T02:26:58.7870457Z 6355 │ ╭─▶ while (promptGates.length < 1) { 2026-10-25T02:26:58.7870566Z 6356 │ │ yield* Effect.yieldNow; 2026-10-25T02:26:58.7870699Z 6357 │ ╰─▶ } 2026-10-25T02:26:58.7870872Z 6358 │ assert.isDefined(sessionUpdateHandler, "session update handler must be wired"); 2026-10-25T02:26:58.7870925Z ╰──── 2026-10-25T02:26:58.7870927Z 2026-10-25T02:26:58.7871393Z ⚠ 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-25T02:26:58.7871556Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6490:9] 2026-10-25T02:26:58.7871643Z 6489 │ .pipe(Effect.forkScoped); 2026-10-25T02:26:58.7871821Z 6490 │ ╭─▶ while (promptGates.length < 2) { 2026-10-25T02:26:58.7871929Z 6491 │ │ yield* Effect.yieldNow; 2026-10-25T02:26:58.7872121Z 6492 │ ╰─▶ } 2026-10-25T02:26:58.7872378Z 6493 │ if (sessionUpdateHandler === undefined || capturedMutation.current === null) { 2026-10-25T02:26:58.7872427Z ╰──── 2026-10-25T02:26:58.7872431Z 2026-10-25T02:26:58.7872882Z ⚠ 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-25T02:26:58.7873048Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7] 2026-10-25T02:26:58.7873149Z 565 │ let afterSequence = created[0]!.sequence; 2026-10-25T02:26:58.7873337Z 566 │ ╭─▶ for (let index = 1; index <= 32; index += 1) { 2026-10-25T02:26:58.7873441Z 567 │ │ const nextEvent = { 2026-10-25T02:26:58.7873600Z 568 │ │ id: EventId.make(`event:foundation-stream-race:${index}`), 2026-10-25T02:26:58.7873730Z 569 │ │ type: "thread.metadata-updated" as const, 2026-10-25T02:26:58.7873819Z 570 │ │ threadId, 2026-10-25T02:26:58.7873921Z 571 │ │ providerInstanceId, 2026-10-25T02:26:58.7874021Z 572 │ │ occurredAt: now, 2026-10-25T02:26:58.7874166Z 573 │ │ payload: { ...thread, title: `Race update ${index}` }, 2026-10-25T02:26:58.7874291Z 574 │ │ } satisfies OrchestrationV2DomainEvent; 2026-10-25T02:26:58.7874402Z 575 │ │ const reader = yield* eventSink 2026-10-25T02:26:58.7874528Z 576 │ │ .stream({ threadId, afterSequence }) 2026-10-25T02:26:58.7874660Z 577 │ │ .pipe(Stream.runHead, Effect.forkChild); 2026-10-25T02:26:58.7874764Z 578 │ │ yield* Effect.yieldNow; 2026-10-25T02:26:58.7874923Z 579 │ │ const written = yield* eventSink.write({ events: [nextEvent] }); 2026-10-25T02:26:58.7875049Z 580 │ │ const received = yield* Fiber.join(reader); 2026-10-25T02:26:58.7875163Z 581 │ │ if (Option.isNone(received)) { 2026-10-25T02:26:58.7875360Z 582 │ │ return yield* Effect.die("The event stream ended before delivering the live event."); 2026-10-25T02:26:58.7875438Z 583 │ │ } 2026-10-25T02:26:58.7875595Z 584 │ │ assert.equal(received.value.sequence, written[0]?.sequence); 2026-10-25T02:26:58.7875744Z 585 │ │ assert.equal(received.value.event.id, nextEvent.id); 2026-10-25T02:26:58.7875906Z 586 │ │ afterSequence = received.value.sequence; 2026-10-25T02:26:58.7876042Z 587 │ ╰─▶ } 2026-10-25T02:26:58.7876100Z 588 │ }), 2026-10-25T02:26:58.7876155Z ╰──── 2026-10-25T02:26:58.7876157Z 2026-10-25T02:26:58.7876609Z ⚠ 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-25T02:26:58.7876781Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:2324:9] 2026-10-25T02:26:58.7876856Z 2323 │ let settled = false; 2026-10-25T02:26:58.7877076Z 2324 │ ╭─▶ while (!settled) { 2026-10-25T02:26:58.7877316Z 2325 │ │ settled = (yield* outbox.listByCommandId(commandId)).every( 2026-10-25T02:26:58.7877448Z 2326 │ │ (effect) => effect.status === "succeeded", 2026-10-25T02:26:58.7877529Z 2327 │ │ ); 2026-10-25T02:26:58.7877652Z 2328 │ │ if (!settled) yield* Effect.yieldNow; 2026-10-25T02:26:58.7877785Z 2329 │ ╰─▶ } 2026-10-25T02:26:58.7877901Z 2330 │ }).pipe(Effect.provide(layerWorker), Effect.scoped); 2026-10-25T02:26:58.7877952Z ╰──── 2026-10-25T02:26:58.7877954Z 2026-10-25T02:26:58.7878179Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-25T02:26:58.7878304Z ╭─[apps/server/src/terminal/Manager.test.ts:731:31] 2026-10-25T02:26:58.7878360Z 730 │ ); 2026-10-25T02:26:58.7878529Z 731 │ const snapshot = events.filter((event) => event.type === "snapshot").at(-1)?.snapshot; 2026-10-25T02:26:58.7878624Z ·  ────── 2026-10-25T02:26:58.7878736Z 732 │ expect(snapshot?.history).toBe("aa😀\rEND"); 2026-10-25T02:26:58.7878788Z ╰──── 2026-10-25T02:26:58.7878957Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-25T02:26:58.7878959Z 2026-10-25T02:26:58.7879152Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T02:26:58.7879331Z ╭─[apps/web/src/components/pullRequest/PullRequestChecksPopover.tsx:84:15] 2026-10-25T02:26:58.7879399Z 83 │
  • } 2026-10-25T02:26:58.7881592Z ·  ───────────────────────────────────────────── 2026-10-25T02:26:58.7881674Z 1063 │ screenOptions={({ route }) => 2026-10-25T02:26:58.7881733Z ╰──── 2026-10-25T02:26:58.7882091Z  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-25T02:26:58.7882096Z 2026-10-25T02:26:58.7882547Z ⚠ 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-25T02:26:58.7882673Z ╭─[packages/effect-acp/src/errors.test.ts:129:28] 2026-10-25T02:26:58.7882765Z 128 │ const secret = "acp-summary-secret"; 2026-10-25T02:26:58.7882875Z 129 │ const cause = yield* Schema.decodeUnknownEffect( 2026-10-25T02:26:58.7882988Z ·  ────────────────────────── 2026-10-25T02:26:58.7883064Z 130 │ Schema.Struct({ 2026-10-25T02:26:58.7883119Z ╰──── 2026-10-25T02:26:58.7883122Z 2026-10-25T02:26:58.7883387Z ⚠ eslint(no-unused-vars): Variable 'navigation' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:26:58.7883551Z ╭─[apps/mobile/src/features/workspace/WorkspaceSidebarTabs.ios.tsx:32:9] 2026-10-25T02:26:58.7883697Z 31 │ const tabs = [...visibleNavigationTabs(order, hidden), "settings" as const]; 2026-10-25T02:26:58.7883779Z 32 │ const navigation = useNavigation(); 2026-10-25T02:26:58.7883855Z ·  ─────┬──── 2026-10-25T02:26:58.7883987Z · ╰── 'navigation' is declared here 2026-10-25T02:26:58.7884080Z 33 │ const selectTab = useSelectWorkspaceTab(); 2026-10-25T02:26:58.7884131Z ╰──── 2026-10-25T02:26:58.7884241Z  help: Consider removing this declaration. 2026-10-25T02:26:58.7884246Z 2026-10-25T02:26:58.7884499Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:26:58.7884684Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:107:5] 2026-10-25T02:26:58.7884739Z 104 │ 2026-10-25T02:26:58.7884804Z 105 │ useEffect(() => { 2026-10-25T02:26:58.7884877Z ·  ────┬──── 2026-10-25T02:26:58.7885004Z · ╰── This is the containing effect 2026-10-25T02:26:58.7885083Z 106 │ clearReviewCommentTarget(); 2026-10-25T02:26:58.7885179Z 107 │ setPendingNativeCommentSelection(null); 2026-10-25T02:26:58.7885280Z ·  ────────────────┬─────────────── 2026-10-25T02:26:58.7885534Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7885676Z 108 │ }, [selectedSection?.id]); 2026-10-25T02:26:58.7885754Z ╰──── 2026-10-25T02:26:58.7886389Z  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-25T02:26:58.7886707Z  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-25T02:26:58.7886710Z 2026-10-25T02:26:58.7886966Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:26:58.7887150Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7] 2026-10-25T02:26:58.7887204Z 109 │ 2026-10-25T02:26:58.7887267Z 110 │ useEffect(() => { 2026-10-25T02:26:58.7887336Z ·  ────┬──── 2026-10-25T02:26:58.7887463Z · ╰── This is the containing effect 2026-10-25T02:26:58.7887551Z 111 │ if (activeCommentTarget === null) { 2026-10-25T02:26:58.7887649Z 112 │ setPendingNativeCommentSelection(null); 2026-10-25T02:26:58.7887756Z ·  ────────────────┬─────────────── 2026-10-25T02:26:58.7887934Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7887990Z 113 │ } 2026-10-25T02:26:58.7888039Z ╰──── 2026-10-25T02:26:58.7888632Z  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-25T02:26:58.7888952Z  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-25T02:26:58.7888954Z 2026-10-25T02:26:58.7889153Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:26:58.7889337Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7] 2026-10-25T02:26:58.7889433Z 107 │ setPendingNativeCommentSelection(null); 2026-10-25T02:26:58.7889512Z 108 │ }, [selectedSection?.id]); 2026-10-25T02:26:58.7889601Z ·  ─────────┬───────── 2026-10-25T02:26:58.7889760Z · ╰── Unnecessary dependency `selectedSection?.id` 2026-10-25T02:26:58.7889810Z 109 │ 2026-10-25T02:26:58.7889862Z ╰──── 2026-10-25T02:26:58.7890154Z  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-25T02:26:58.7890459Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7890462Z 2026-10-25T02:26:58.7890690Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-25T02:26:58.7890920Z ╭─[apps/web/src/components/pullRequest/pullRequestList.logic.ts:262:9] 2026-10-25T02:26:58.7891028Z 261 │ ): boolean { 2026-10-25T02:26:58.7891215Z 262 │ const labels = entry.labels.map((label) => label.name.trim().toLowerCase()); 2026-10-25T02:26:58.7891374Z ·  ───────────────────────────────────────────────────────────────────── 2026-10-25T02:26:58.7891518Z 263 │ const holds = (label: string) => labels.includes(label.trim().toLowerCase()); 2026-10-25T02:26:58.7891571Z ╰──── 2026-10-25T02:26:58.7891649Z  help: Switch to `Set` 2026-10-25T02:26:58.7891652Z 2026-10-25T02:26:58.7892020Z ⚠ 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-25T02:26:58.7892136Z ╭─[packages/effect-acp/src/client.ts:1270:11] 2026-10-25T02:26:58.7892289Z 1269 │ extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) => 2026-10-25T02:26:58.7892464Z 1270 │ Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe( 2026-10-25T02:26:58.7892569Z ·  ────────────────────────── 2026-10-25T02:26:58.7892713Z 1271 │ Effect.mapError(() => AcpError.AcpRequestError.invalidParams()), 2026-10-25T02:26:58.7892763Z ╰──── 2026-10-25T02:26:58.7892766Z 2026-10-25T02:26:58.7893218Z ⚠ 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-25T02:26:58.7893343Z ╭─[packages/effect-acp/src/protocol.test.ts:500:31] 2026-10-25T02:26:58.7893396Z 499 │ 2026-10-25T02:26:58.7893513Z 500 │ const response = yield* Schema.decodeUnknownEffect( 2026-10-25T02:26:58.7893633Z ·  ────────────────────────── 2026-10-25T02:26:58.7893741Z 501 │ Schema.fromJsonString(JsonRpcErrorResponse), 2026-10-25T02:26:58.7893792Z ╰──── 2026-10-25T02:26:58.7893795Z 2026-10-25T02:26:58.7894045Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:26:58.7894218Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:59:5] 2026-10-25T02:26:58.7894271Z 49 │ 2026-10-25T02:26:58.7894338Z 50 │ useEffect(() => { 2026-10-25T02:26:58.7894406Z ·  ────┬──── 2026-10-25T02:26:58.7894532Z · ╰── This is the containing effect 2026-10-25T02:26:58.7894688Z 51 │ traceDiffHighlight("viewport-reset", { 2026-10-25T02:26:58.7894841Z 52 │ reset: diffHighlightTraceId(resetKey), 2026-10-25T02:26:58.7894922Z 53 │ enabled, 2026-10-25T02:26:58.7894989Z 54 │ rows: rows.length, 2026-10-25T02:26:58.7895045Z 55 │ }); 2026-10-25T02:26:58.7895135Z 56 │ const previousRange = scheduler.reset(); 2026-10-25T02:26:58.7895229Z 57 │ highlightedRowIdsRef.current = new Set(); 2026-10-25T02:26:58.7895315Z 58 │ pendingPatchesRef.current = []; 2026-10-25T02:26:58.7895424Z 59 │ setViewport({ scope: viewportScope, range: null }); 2026-10-25T02:26:58.7895499Z ·  ─────┬───── 2026-10-25T02:26:58.7895664Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7895778Z 60 │ setTokensPatchJson(createEmptyTokenPatch(resetKey)); 2026-10-25T02:26:58.7895844Z ╰──── 2026-10-25T02:26:58.7896486Z  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-25T02:26:58.7896804Z  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-25T02:26:58.7896808Z 2026-10-25T02:26:58.7896998Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T02:26:58.7897148Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:223:31] 2026-10-25T02:26:58.7897255Z 222 │ ? snippetTokens.map((line, lineIndex) => ( 2026-10-25T02:26:58.7897354Z 223 │ 2026-10-25T02:26:58.7897460Z ·  ─────────────── 2026-10-25T02:26:58.7897554Z 224 │ {lineIndex > 0 ? "\n" : ""} 2026-10-25T02:26:58.7897608Z ╰──── 2026-10-25T02:26:58.7897757Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-25T02:26:58.7897760Z 2026-10-25T02:26:58.7897948Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T02:26:58.7898096Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25] 2026-10-25T02:26:58.7898172Z 226 │ cancelAnimationFrame(frame); 2026-10-25T02:26:58.7902497Z 114 │ }, [restoreSearch, tabActive, bottomSearch]); 2026-10-25T02:26:58.7902603Z ·  ──────┬───── 2026-10-25T02:26:58.7902771Z · ╰── Unnecessary dependency `bottomSearch` 2026-10-25T02:26:58.7902873Z 115 │ const composeButton = nativeToolbarCompose ? ( 2026-10-25T02:26:58.7902924Z ╰──── 2026-10-25T02:26:58.7903218Z  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-25T02:26:58.7903532Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7903537Z 2026-10-25T02:26:58.7903737Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:26:58.7903869Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:454:7] 2026-10-25T02:26:58.7903953Z 453 │ showAuxiliaryPane("inspector"); 2026-10-25T02:26:58.7904061Z 454 │ }, [environmentId, showAuxiliaryPane, threadId]); 2026-10-25T02:26:58.7904204Z ·  ──────┬────── ────┬─── 2026-10-25T02:26:58.7904399Z · │ ╰── Unnecessary dependency `threadId` 2026-10-25T02:26:58.7904549Z · ╰── Unnecessary dependency `environmentId` 2026-10-25T02:26:58.7904610Z 455 │ const { 2026-10-25T02:26:58.7904725Z ╰──── 2026-10-25T02:26:58.7905093Z  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-25T02:26:58.7905531Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7905534Z 2026-10-25T02:26:58.7905725Z ⚠ react(static-components): Cannot create components during render 2026-10-25T02:26:58.7905892Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:722:20] 2026-10-25T02:26:58.7906050Z 489 │ // Expo may return null before registration or in older binaries; use the fallback. 2026-10-25T02:26:58.7906174Z 490 │ const NativeReviewDiffView = resolveNativeReviewDiffView(); 2026-10-25T02:26:58.7906299Z ·  ─────────────┬───────────── 2026-10-25T02:26:58.7906480Z · ╰── The component is created during render here 2026-10-25T02:26:58.7906632Z 491 │ const nativeReviewDiffViewRef = useRef(null); 2026-10-25T02:26:58.7906750Z 492 │ const showcasedReviewDrawRef = useRef(null); 2026-10-25T02:26:58.7906882Z 493 │ const [isPullRefreshing, setIsPullRefreshing] = useState(false); 2026-10-25T02:26:58.7906976Z 494 │ const handlePullToRefresh = async () => { 2026-10-25T02:26:58.7907054Z 495 │ setIsPullRefreshing(true); 2026-10-25T02:26:58.7907137Z 496 │ await refreshSelectedSection(); 2026-10-25T02:26:58.7907213Z 497 │ setIsPullRefreshing(false); 2026-10-25T02:26:58.7907268Z 498 │ }; 2026-10-25T02:26:58.7907416Z 499 │ const reviewFileNavigatorRef = useRef(null); 2026-10-25T02:26:58.7907557Z 500 │ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : []; 2026-10-25T02:26:58.7907663Z 501 │ const fileVisibility = useReviewFileVisibility({ 2026-10-25T02:26:58.7907751Z 502 │ threadKey: reviewCache.threadKey, 2026-10-25T02:26:58.7907842Z 503 │ sectionId: selectedSection?.id ?? null, 2026-10-25T02:26:58.7907908Z 504 │ files: reviewFiles, 2026-10-25T02:26:58.7908010Z 505 │ cachedExpandedFileIds: selectedSection?.id 2026-10-25T02:26:58.7908140Z 506 │ ? reviewCache.expandedFileIdsBySection[selectedSection.id] 2026-10-25T02:26:58.7908206Z 507 │ : undefined, 2026-10-25T02:26:58.7908298Z 508 │ cachedViewedFileIds: selectedSection?.id 2026-10-25T02:26:58.7908424Z 509 │ ? reviewCache.viewedFileIdsBySection[selectedSection.id] 2026-10-25T02:26:58.7908487Z 510 │ : undefined, 2026-10-25T02:26:58.7908549Z 511 │ }); 2026-10-25T02:26:58.7908739Z 512 │ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility; 2026-10-25T02:26:58.7908870Z 513 │ const commentSelection = useReviewCommentSelectionController({ 2026-10-25T02:26:58.7908934Z 514 │ environmentId, 2026-10-25T02:26:58.7908995Z 515 │ threadId, 2026-10-25T02:26:58.7909058Z 516 │ selectedSection, 2026-10-25T02:26:58.7909129Z 517 │ nativeReviewDiffData, 2026-10-25T02:26:58.7909184Z 518 │ }); 2026-10-25T02:26:58.7909289Z 519 │ const nativeBridge = useNativeReviewDiffBridge({ 2026-10-25T02:26:58.7909373Z 520 │ threadKey: reviewCache.threadKey, 2026-10-25T02:26:58.7909461Z 521 │ sectionId: selectedSection?.id ?? null, 2026-10-25T02:26:58.7909540Z 522 │ diff: selectedSection?.diff, 2026-10-25T02:26:58.7909697Z 523 │ data: nativeReviewDiffData, 2026-10-25T02:26:58.7909818Z 524 │ collapsedFileIds, 2026-10-25T02:26:58.7909916Z 525 │ viewedFileIds, 2026-10-25T02:26:58.7910031Z 526 │ selectedRowIds: commentSelection.selectedRowIds, 2026-10-25T02:26:58.7910126Z 527 │ canHighlight: parsedDiff.kind === "files", 2026-10-25T02:26:58.7910181Z 528 │ }); 2026-10-25T02:26:58.7910254Z 529 │ const showcaseReviewKey = 2026-10-25T02:26:58.7911898Z 530 │ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection 2026-10-25T02:26:58.7912109Z 531 │ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}` 2026-10-25T02:26:58.7912170Z 532 │ : null; 2026-10-25T02:26:58.7912335Z 533 │ const handleNativeDebug = (event: NativeSyntheticEvent>) => { 2026-10-25T02:26:58.7912411Z 534 │ nativeBridge.onDebug(event); 2026-10-25T02:26:58.7912474Z 535 │ if ( 2026-10-25T02:26:58.7912554Z 536 │ showcaseReviewKey === null || 2026-10-25T02:26:58.7912674Z 537 │ showcasedReviewDrawRef.current === showcaseReviewKey || 2026-10-25T02:26:58.7912784Z 538 │ !isNativeReviewDiffDrawEvent(event.nativeEvent) 2026-10-25T02:26:58.7912838Z 539 │ ) { 2026-10-25T02:26:58.7912897Z 540 │ return; 2026-10-25T02:26:58.7912950Z 541 │ } 2026-10-25T02:26:58.7913061Z 542 │ showcasedReviewDrawRef.current = showcaseReviewKey; 2026-10-25T02:26:58.7913221Z 543 │ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId }); 2026-10-25T02:26:58.7913274Z 544 │ }; 2026-10-25T02:26:58.7913325Z 545 │ 2026-10-25T02:26:58.7913442Z 546 │ const handleSelectFile = async (fileId: string | null) => { 2026-10-25T02:26:58.7913520Z 547 │ loadVisibleFile(fileId, true); 2026-10-25T02:26:58.7913613Z 548 │ commentSelection.clearSelection(); 2026-10-25T02:26:58.7913735Z 549 │ if (fileId !== null && collapsedFileIds.includes(fileId)) { 2026-10-25T02:26:58.7913813Z 550 │ toggleExpandedFile(fileId); 2026-10-25T02:26:58.7913865Z 551 │ } 2026-10-25T02:26:58.7913975Z 552 │ const nativeView = nativeReviewDiffViewRef.current; 2026-10-25T02:26:58.7914045Z 553 │ if (!nativeView) return; 2026-10-25T02:26:58.7914136Z 554 │ const result = await settlePromise(() => 2026-10-25T02:26:58.7914308Z 555 │ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true), 2026-10-25T02:26:58.7914362Z 556 │ ); 2026-10-25T02:26:58.7914450Z 557 │ if (AsyncResult.isFailure(result)) { 2026-10-25T02:26:58.7914626Z 558 │ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result)); 2026-10-25T02:26:58.7914680Z 559 │ } 2026-10-25T02:26:58.7914737Z 560 │ }; 2026-10-25T02:26:58.7914820Z 561 │ const handleVisibleFileChange = ( 2026-10-25T02:26:58.7914948Z 562 │ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>, 2026-10-25T02:26:58.7915008Z 563 │ ) => { 2026-10-25T02:26:58.7915116Z 564 │ loadVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-25T02:26:58.7915282Z 565 │ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-25T02:26:58.7915334Z 566 │ }; 2026-10-25T02:26:58.7915412Z 567 │ const renderInspector = () => ( 2026-10-25T02:26:58.7915480Z 568 │ void handleSelectFile(fileId)} 2026-10-25T02:26:58.7916146Z 574 │ /> 2026-10-25T02:26:58.7916230Z 575 │ ); 2026-10-25T02:26:58.7916299Z 576 │ 2026-10-25T02:26:58.7916480Z 577 │ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => { 2026-10-25T02:26:58.7916564Z 578 │ const { fileId } = event.nativeEvent; 2026-10-25T02:26:58.7916627Z 579 │ if (fileId) { 2026-10-25T02:26:58.7916707Z 580 │ loadVisibleFile(fileId, true); 2026-10-25T02:26:58.7916785Z 581 │ toggleExpandedFile(fileId); 2026-10-25T02:26:58.7916836Z 582 │ } 2026-10-25T02:26:58.7916889Z 583 │ }; 2026-10-25T02:26:58.7916940Z 584 │ 2026-10-25T02:26:58.7917027Z 585 │ const handleNativeToggleViewedFile = ( 2026-10-25T02:26:58.7917145Z 586 │ event: NativeSyntheticEvent<{ readonly fileId?: string }>, 2026-10-25T02:26:58.7917205Z 587 │ ) => { 2026-10-25T02:26:58.7917293Z 588 │ const { fileId } = event.nativeEvent; 2026-10-25T02:26:58.7917352Z 589 │ if (fileId) { 2026-10-25T02:26:58.7917427Z 590 │ toggleViewedFile(fileId); 2026-10-25T02:26:58.7917480Z 591 │ } 2026-10-25T02:26:58.7917533Z 592 │ }; 2026-10-25T02:26:58.7917584Z 593 │ 2026-10-25T02:26:58.7917655Z 594 │ const parsedDiffNotice = 2026-10-25T02:26:58.7917813Z 595 │ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null; 2026-10-25T02:26:58.7917933Z 596 │ const hasCachedSelectedDiff = selectedSection?.diff != null; 2026-10-25T02:26:58.7918085Z 597 │ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null); 2026-10-25T02:26:58.7918204Z 598 │ const sectionMenu = buildReviewSectionMenu(reviewSections); 2026-10-25T02:26:58.7918366Z 599 │ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({ 2026-10-25T02:26:58.7918478Z 600 │ hasEnvironmentPresentation: environment.isReady, 2026-10-25T02:26:58.7918577Z 601 │ isEnvironmentConnected: isEnvironmentReady, 2026-10-25T02:26:58.7918648Z 602 │ hasCachedSelectedDiff, 2026-10-25T02:26:58.7918713Z 603 │ hasAnyCachedDiff, 2026-10-25T02:26:58.7918766Z 604 │ }); 2026-10-25T02:26:58.7918852Z 605 │ const handleRetryEnvironment = () => { 2026-10-25T02:26:58.7918939Z 606 │ void retryEnvironment(environmentId); 2026-10-25T02:26:58.7918992Z 607 │ }; 2026-10-25T02:26:58.7919074Z 608 │ const handleReturnToThread = () => { 2026-10-25T02:26:58.7919151Z 609 │ if (navigation.canGoBack()) { 2026-10-25T02:26:58.7919221Z 610 │ navigation.goBack(); 2026-10-25T02:26:58.7919281Z 611 │ return; 2026-10-25T02:26:58.7919332Z 612 │ } 2026-10-25T02:26:58.7919417Z 613 │ navigation.navigate("Thread", { 2026-10-25T02:26:58.7919509Z 614 │ environmentId: String(environmentId), 2026-10-25T02:26:58.7919584Z 615 │ threadId: String(threadId), 2026-10-25T02:26:58.7919637Z 616 │ }); 2026-10-25T02:26:58.7919689Z 617 │ }; 2026-10-25T02:26:58.7919765Z 618 │ const androidHeaderSubtitle = [ 2026-10-25T02:26:58.7919837Z 619 │ selectedSection?.title, 2026-10-25T02:26:58.7919917Z 620 │ headerDiffSummary.additions, 2026-10-25T02:26:58.7919994Z 621 │ headerDiffSummary.deletions, 2026-10-25T02:26:58.7920046Z 622 │ ] 2026-10-25T02:26:58.7920150Z 623 │ .filter((part): part is string => Boolean(part)) 2026-10-25T02:26:58.7920212Z 624 │ .join(" · "); 2026-10-25T02:26:58.7920263Z 625 │ 2026-10-25T02:26:58.7920341Z 626 │ const showChangedFilesPane = 2026-10-25T02:26:58.7920479Z 627 │ !showConnectionNotice && 2026-10-25T02:26:58.7920607Z 628 │ selectedSection !== null && 2026-10-25T02:26:58.7920713Z 629 │ parsedDiff.kind === "files" && 2026-10-25T02:26:58.7920792Z 630 │ NativeReviewDiffView !== null; 2026-10-25T02:26:58.7920960Z 631 │ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined); 2026-10-25T02:26:58.7921130Z 632 │ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane; 2026-10-25T02:26:58.7921183Z 633 │ 2026-10-25T02:26:58.7921254Z 634 │ const listHeader = (() => { 2026-10-25T02:26:58.7921336Z 635 │ const children: ReactElement[] = []; 2026-10-25T02:26:58.7921387Z 636 │ 2026-10-25T02:26:58.7921449Z 637 │ if (error) { 2026-10-25T02:26:58.7921514Z 638 │ children.push( 2026-10-25T02:26:58.7921574Z 639 │ 2026-10-25T02:26:58.7922220Z 646 │ Review unavailable 2026-10-25T02:26:58.7922373Z 647 │ {error} 2026-10-25T02:26:58.7922433Z 648 │ , 2026-10-25T02:26:58.7922489Z 649 │ ); 2026-10-25T02:26:58.7922542Z 650 │ } 2026-10-25T02:26:58.7922594Z 651 │ 2026-10-25T02:26:58.7922665Z 652 │ if (parsedDiffNotice) { 2026-10-25T02:26:58.7922826Z 653 │ children.push(); 2026-10-25T02:26:58.7922879Z 654 │ } 2026-10-25T02:26:58.7922929Z 655 │ 2026-10-25T02:26:58.7923004Z 656 │ if (children.length === 0) { 2026-10-25T02:26:58.7923068Z 657 │ return null; 2026-10-25T02:26:58.7923119Z 658 │ } 2026-10-25T02:26:58.7923170Z 659 │ 2026-10-25T02:26:58.7923239Z 660 │ return <>{children}; 2026-10-25T02:26:58.7923292Z 661 │ })(); 2026-10-25T02:26:58.7923360Z 662 │ const headerSubtitle = [ 2026-10-25T02:26:58.7923438Z 663 │ headerDiffSummary.additions, 2026-10-25T02:26:58.7923515Z 664 │ headerDiffSummary.deletions, 2026-10-25T02:26:58.7923596Z 665 │ pendingReviewCommentCount > 0 2026-10-25T02:26:58.7923764Z 666 │ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}` 2026-10-25T02:26:58.7923824Z 667 │ : null, 2026-10-25T02:26:58.7923875Z 668 │ ] 2026-10-25T02:26:58.7923943Z 669 │ .filter(Boolean) 2026-10-25T02:26:58.7924009Z 670 │ .join(" · "); 2026-10-25T02:26:58.7924142Z 671 │ const headerTitleText = selectedSection?.title ?? "Review changes"; 2026-10-25T02:26:58.7924193Z 672 │ 2026-10-25T02:26:58.7924250Z 673 │ return ( 2026-10-25T02:26:58.7924303Z 674 │ <> 2026-10-25T02:26:58.7924367Z 675 │ 2026-10-25T02:26:58.7925815Z 691 │ 2026-10-25T02:26:58.7925915Z 692 │ 2026-10-25T02:26:58.7926036Z 693 │ 2026-10-25T02:26:58.7926115Z 694 │ {showConnectionNotice ? ( 2026-10-25T02:26:58.7926260Z 695 │ 2026-10-25T02:26:58.7926350Z 696 │ 2026-10-25T02:26:58.7927342Z 708 │ 2026-10-25T02:26:58.7927496Z 709 │ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? ( 2026-10-25T02:26:58.7927557Z 710 │ 2026-10-25T02:26:58.7927985Z 716 │ 2026-10-25T02:26:58.7928393Z 720 │ {listHeader} 2026-10-25T02:26:58.7928732Z 721 │ 2026-10-25T02:26:58.7928838Z 722 │ 2026-10-25T02:26:58.7930447Z ·  ──────┬───── 2026-10-25T02:26:58.7930591Z · ╰── 'stopSessions' is declared here 2026-10-25T02:26:58.7930654Z 304 │ effect.pipe( 2026-10-25T02:26:58.7930703Z ╰──── 2026-10-25T02:26:58.7930805Z  help: Consider removing this parameter. 2026-10-25T02:26:58.7930807Z 2026-10-25T02:26:58.7931041Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-25T02:26:58.7931178Z ╭─[apps/web/src/components/chat/useComposerSend.ts:985:13] 2026-10-25T02:26:58.7931296Z 984 │ const changedBeforeDecline = draftChangedSinceSend(); 2026-10-25T02:26:58.7931530Z 985 │ ╭─▶ const pendingIdsBeforeDecline = pendingApprovalsRef.current.map( 2026-10-25T02:26:58.7931649Z 986 │ │ (approval) => approval.requestId, 2026-10-25T02:26:58.7931781Z 987 │ ╰─▶ ); 2026-10-25T02:26:58.7931919Z 988 │ const approvalResponding = approvalsToDecline.some((approval) => 2026-10-25T02:26:58.7931968Z ╰──── 2026-10-25T02:26:58.7932043Z  help: Switch to `Set` 2026-10-25T02:26:58.7932046Z 2026-10-25T02:26:58.7932501Z ⚠ 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-25T02:26:58.7932639Z ╭─[packages/contracts/src/composerContext.test.ts:181:18] 2026-10-25T02:26:58.7932769Z 180 │ it("sends a message without the records the wire cannot carry", () => { 2026-10-25T02:26:58.7932945Z 181 │ const wire = Schema.encodeUnknownSync(Schema.toCodecJson(OrchestrationMessageContext))({ 2026-10-25T02:26:58.7933050Z ·  ──────────────────────── 2026-10-25T02:26:58.7933112Z 182 │ version: 1, 2026-10-25T02:26:58.7933160Z ╰──── 2026-10-25T02:26:58.7933163Z 2026-10-25T02:26:58.7933462Z × t3code(no-low-value-comments): Cut this to 4 lines or fewer: keep the constraint, drop the background. 2026-10-25T02:26:58.7933660Z ╭─[packages/contracts/src/orchestrationV2.ts:746:1] 2026-10-25T02:26:58.7933714Z 745 │ 2026-10-25T02:26:58.7933837Z 746 │ ╭─▶ /** 2026-10-25T02:26:58.7934052Z 747 │ │ * Wire-only. Set for clients that opted in with `acceptDedupedBodies` or `dedupeBodies=1` when the 2026-10-25T02:26:58.7934252Z 748 │ │ * marked field was blanked because the client already holds the same value: in the record it 2026-10-25T02:26:58.7934405Z 749 │ │ * received earlier on the same response or stream. Restore with 2026-10-25T02:26:58.7934616Z 750 │ │ * `@t3tools/shared/orchestrationV2DedupedBodies` before use; never store or forward a marked 2026-10-25T02:26:58.7934822Z 751 │ │ * value. Clients that opted in restore only these fields, so blanking another field needs a new 2026-10-25T02:26:58.7934904Z 752 │ │ * opt-in. 2026-10-25T02:26:58.7935026Z 753 │ ╰─▶ */ 2026-10-25T02:26:58.7935159Z 754 │ const DedupedBodyMarker = Schema.optionalKey(Schema.Literal(true)); 2026-10-25T02:26:58.7935208Z ╰──── 2026-10-25T02:26:58.7935211Z 2026-10-25T02:26:58.7935410Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-25T02:26:58.7935513Z ╭─[packages/contracts/src/rpc.ts:302:8] 2026-10-25T02:26:58.7935579Z 301 │ } from "./device.ts"; 2026-10-25T02:26:58.7935668Z 302 │ import {} from "./previewAutomation.ts"; 2026-10-25T02:26:58.7935736Z ·  ── 2026-10-25T02:26:58.7935794Z 303 │ import { 2026-10-25T02:26:58.7935885Z ╰──── 2026-10-25T02:26:58.7935975Z  help: Remove empty braces 2026-10-25T02:26:58.7935977Z 2026-10-25T02:26:58.7936243Z ⚠ eslint(no-unused-vars): Variable 'navigation' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:26:58.7936406Z ╭─[apps/mobile/src/features/workspace/WorkspaceSectionToolbar.tsx:23:9] 2026-10-25T02:26:58.7936499Z 22 │ const selectTab = useSelectWorkspaceTab(); 2026-10-25T02:26:58.7936578Z 23 │ const navigation = useNavigation(); 2026-10-25T02:26:58.7936653Z ·  ─────┬──── 2026-10-25T02:26:58.7936783Z · ╰── 'navigation' is declared here 2026-10-25T02:26:58.7936870Z 24 │ const selected = selectedNavigationTab( 2026-10-25T02:26:58.7936918Z ╰──── 2026-10-25T02:26:58.7937028Z  help: Consider removing this declaration. 2026-10-25T02:26:58.7937033Z 2026-10-25T02:26:58.7937285Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:26:58.7937422Z ╭─[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5] 2026-10-25T02:26:58.7937473Z 150 │ 2026-10-25T02:26:58.7937537Z 151 │ useEffect(() => { 2026-10-25T02:26:58.7937607Z ·  ────┬──── 2026-10-25T02:26:58.7937732Z · ╰── This is the containing effect 2026-10-25T02:26:58.7937813Z 152 │ if (!controlledSelectedPath) { 2026-10-25T02:26:58.7937871Z 153 │ return; 2026-10-25T02:26:58.7937924Z 154 │ } 2026-10-25T02:26:58.7938003Z 155 │ setExpandedPaths((current) => { 2026-10-25T02:26:58.7938080Z ·  ────────┬─────── 2026-10-25T02:26:58.7938314Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7938513Z 156 │ const ancestors = ancestorPaths(controlledSelectedPath); 2026-10-25T02:26:58.7938562Z ╰──── 2026-10-25T02:26:58.7939151Z  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-25T02:26:58.7939469Z  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-25T02:26:58.7939472Z 2026-10-25T02:26:58.7939673Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:26:58.7939818Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7] 2026-10-25T02:26:58.7939912Z 256 │ return () => cancelAnimationFrame(frame); 2026-10-25T02:26:58.7939989Z 257 │ }, [props.path, targetIndex]); 2026-10-25T02:26:58.7940062Z ·  ─────┬──── 2026-10-25T02:26:58.7940204Z · ╰── Unnecessary dependency `props.path` 2026-10-25T02:26:58.7940257Z 258 │ 2026-10-25T02:26:58.7940305Z ╰──── 2026-10-25T02:26:58.7940591Z  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-25T02:26:58.7940908Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7940913Z 2026-10-25T02:26:58.7941101Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T02:26:58.7941246Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:289:23] 2026-10-25T02:26:58.7941316Z 288 │ 2026-10-25T02:26:58.7942380Z ·  ─────────── 2026-10-25T02:26:58.7942445Z 306 │ {body} 2026-10-25T02:26:58.7942496Z ╰──── 2026-10-25T02:26:58.7942642Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-25T02:26:58.7942644Z 2026-10-25T02:26:58.7942809Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-25T02:26:58.7942952Z ╭─[apps/server/src/provider/Drivers/CodexDriver.test.ts:460:14] 2026-10-25T02:26:58.7943003Z 459 │ 2026-10-25T02:26:58.7943177Z 460 │ for (const {} of ["direct", "wrapper"] as const) { 2026-10-25T02:26:58.7943315Z ·  ── 2026-10-25T02:26:58.7943387Z 461 │ } 2026-10-25T02:26:58.7943435Z ╰──── 2026-10-25T02:26:58.7943662Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-25T02:26:58.7943665Z 2026-10-25T02:26:58.7943863Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:26:58.7944020Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:156:7] 2026-10-25T02:26:58.7944073Z 155 │ } 2026-10-25T02:26:58.7944142Z 156 │ }, [wrappedRender]); 2026-10-25T02:26:58.7944221Z ·  ──────┬────── 2026-10-25T02:26:58.7944368Z · ╰── Unnecessary dependency `wrappedRender` 2026-10-25T02:26:58.7944424Z 157 │ 2026-10-25T02:26:58.7944477Z ╰──── 2026-10-25T02:26:58.7944764Z  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-25T02:26:58.7945073Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7945075Z 2026-10-25T02:26:58.7945611Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-25T02:26:58.7945773Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:825:42] 2026-10-25T02:26:58.7945827Z 824 │ > 2026-10-25T02:26:58.7945992Z 825 │ 2026-10-25T02:26:58.7946115Z ·  ──────────────────── 2026-10-25T02:26:58.7946216Z 826 │ 2026-10-25T02:26:58.7946266Z ╰──── 2026-10-25T02:26:58.7946485Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-25T02:26:58.7946622Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-25T02:26:58.7946625Z 2026-10-25T02:26:58.7946801Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-25T02:26:58.7946983Z ╭─[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:121:34] 2026-10-25T02:26:58.7947050Z 120 │ return [...commands]; 2026-10-25T02:26:58.7947185Z 121 │ }, [activeThreadRef, pathname, registrationVersion, navigation]); 2026-10-25T02:26:58.7947297Z ·  ─────────┬───────── 2026-10-25T02:26:58.7947477Z · ╰── Unnecessary dependency `registrationVersion` 2026-10-25T02:26:58.7947528Z 122 │ 2026-10-25T02:26:58.7947578Z ╰──── 2026-10-25T02:26:58.7947889Z  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-25T02:26:58.7948198Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7948200Z 2026-10-25T02:26:58.7948355Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:26:58.7948595Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:39:5] 2026-10-25T02:26:58.7948689Z 32 │ 2026-10-25T02:26:58.7948873Z 33 │ const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0); 2026-10-25T02:26:58.7948961Z ·  ────────┬──────── 2026-10-25T02:26:58.7949104Z · ╰── `inspectorProgress` originates here 2026-10-25T02:26:58.7949198Z 34 │ const { renderedInspectorWidth } = props; 2026-10-25T02:26:58.7949326Z 35 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-25T02:26:58.7949377Z 36 │ 2026-10-25T02:26:58.7949458Z 37 │ const onClosed = props.onClosed; 2026-10-25T02:26:58.7949522Z 38 │ useEffect(() => { 2026-10-25T02:26:58.7949609Z 39 │ inspectorProgress.value = withTiming( 2026-10-25T02:26:58.7949689Z ·  ────────┬──────── 2026-10-25T02:26:58.7949840Z · ╰── `inspectorProgress` cannot be modified 2026-10-25T02:26:58.7949917Z 40 │ inspectorVisible ? 1 : 0, 2026-10-25T02:26:58.7949968Z ╰──── 2026-10-25T02:26:58.7950230Z  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-25T02:26:58.7950532Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:26:58.7950535Z 2026-10-25T02:26:58.7950686Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:26:58.7950840Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:64:7] 2026-10-25T02:26:58.7950931Z 34 │ const { renderedInspectorWidth } = props; 2026-10-25T02:26:58.7951069Z 35 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-25T02:26:58.7951160Z ·  ──────────┬───────── 2026-10-25T02:26:58.7951309Z · ╰── `renderedContentWidth` originates here 2026-10-25T02:26:58.7951360Z 36 │ 2026-10-25T02:26:58.7951440Z 37 │ const onClosed = props.onClosed; 2026-10-25T02:26:58.7951503Z 38 │ useEffect(() => { 2026-10-25T02:26:58.7951589Z 39 │ inspectorProgress.value = withTiming( 2026-10-25T02:26:58.7951665Z 40 │ inspectorVisible ? 1 : 0, 2026-10-25T02:26:58.7951735Z 41 │ WORKSPACE_PANE_TIMING, 2026-10-25T02:26:58.7951800Z 42 │ (finished) => { 2026-10-25T02:26:58.7951936Z 43 │ if (finished === true && !inspectorVisible && onClosed !== undefined) { 2026-10-25T02:26:58.7952008Z 44 │ runOnJS(onClosed)(); 2026-10-25T02:26:58.7952125Z 45 │ } 2026-10-25T02:26:58.7952223Z 46 │ }, 2026-10-25T02:26:58.7952306Z 47 │ ); 2026-10-25T02:26:58.7952444Z 48 │ const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0; 2026-10-25T02:26:58.7952521Z 49 │ renderedInspectorWidth.set( 2026-10-25T02:26:58.7952661Z 50 │ resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING), 2026-10-25T02:26:58.7952715Z 51 │ ); 2026-10-25T02:26:58.7952768Z 52 │ }, [ 2026-10-25T02:26:58.7952836Z 53 │ inspectorProgress, 2026-10-25T02:26:58.7952898Z 54 │ inspectorVisible, 2026-10-25T02:26:58.7952960Z 55 │ inspectorWidth, 2026-10-25T02:26:58.7953020Z 56 │ onClosed, 2026-10-25T02:26:58.7953090Z 57 │ renderedInspectorWidth, 2026-10-25T02:26:58.7953148Z 58 │ resizing, 2026-10-25T02:26:58.7953201Z 59 │ ]); 2026-10-25T02:26:58.7953252Z 60 │ 2026-10-25T02:26:58.7953320Z 61 │ useEffect(() => { 2026-10-25T02:26:58.7953412Z 62 │ const targetWidth = inspectorWidth ?? 0; 2026-10-25T02:26:58.7953497Z 63 │ if (!inspectorVisible || resizing) { 2026-10-25T02:26:58.7953592Z 64 │ renderedContentWidth.value = targetWidth; 2026-10-25T02:26:58.7953677Z ·  ──────────┬───────── 2026-10-25T02:26:58.7953831Z · ╰── `renderedContentWidth` cannot be modified 2026-10-25T02:26:58.7953895Z 65 │ return; 2026-10-25T02:26:58.7953946Z ╰──── 2026-10-25T02:26:58.7954206Z  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-25T02:26:58.7954513Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:26:58.7954518Z 2026-10-25T02:26:58.7954743Z ⚠ eslint(no-unneeded-ternary): Unnecessary use of boolean literals in conditional expression 2026-10-25T02:26:58.7954867Z ╭─[packages/shared/src/serverSettings.test.ts:35:7] 2026-10-25T02:26:58.7955046Z 34 │ const fallback = fallbackTextGenerationModelSelection(providerInstances, (instanceId) => 2026-10-25T02:26:58.7955137Z 35 │ instanceId === configured ? true : false, 2026-10-25T02:26:58.7955253Z ·  ──────────────────────────────────────── 2026-10-25T02:26:58.7955307Z 36 │ ); 2026-10-25T02:26:58.7955357Z ╰──── 2026-10-25T02:26:58.7955450Z  help: Remove this ternary operator 2026-10-25T02:26:58.7955453Z 2026-10-25T02:26:58.7955676Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-25T02:26:58.7955807Z ╭─[scripts/lib/cli-external-packages.test.ts:104:11] 2026-10-25T02:26:58.7955908Z 103 │ const declared = { 2026-10-25T02:26:58.7956006Z 104 │ ...(manifest.dependencies ?? {}), 2026-10-25T02:26:58.7956115Z ·  ──────────────────────────────── 2026-10-25T02:26:58.7956218Z 105 │ ...(manifest.optionalDependencies ?? {}), 2026-10-25T02:26:58.7956272Z ╰──── 2026-10-25T02:26:58.7956532Z  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-25T02:26:58.7956536Z 2026-10-25T02:26:58.7956752Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-25T02:26:58.7956878Z ╭─[scripts/lib/cli-external-packages.test.ts:105:11] 2026-10-25T02:26:58.7957027Z 104 │ ...(manifest.dependencies ?? {}), 2026-10-25T02:26:58.7957189Z 105 │ ...(manifest.optionalDependencies ?? {}), 2026-10-25T02:26:58.7957322Z ·  ──────────────────────────────────────── 2026-10-25T02:26:58.7957418Z 106 │ ...(manifest.peerDependencies ?? {}), 2026-10-25T02:26:58.7957468Z ╰──── 2026-10-25T02:26:58.7957726Z  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-25T02:26:58.7957729Z 2026-10-25T02:26:58.7957942Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-25T02:26:58.7958067Z ╭─[scripts/lib/cli-external-packages.test.ts:106:11] 2026-10-25T02:26:58.7958167Z 105 │ ...(manifest.optionalDependencies ?? {}), 2026-10-25T02:26:58.7958267Z 106 │ ...(manifest.peerDependencies ?? {}), 2026-10-25T02:26:58.7958380Z ·  ──────────────────────────────────── 2026-10-25T02:26:58.7958439Z 107 │ }; 2026-10-25T02:26:58.7958490Z ╰──── 2026-10-25T02:26:58.7958747Z  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-25T02:26:58.7958750Z 2026-10-25T02:26:58.7959209Z ⚠ 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-25T02:26:58.7959387Z ╭─[apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts:222:5] 2026-10-25T02:26:58.7959463Z 221 │ let idlePasses = 0; 2026-10-25T02:26:58.7959608Z 222 │ ╭─▶ for (;;) { 2026-10-25T02:26:58.7959742Z 223 │ │ yield* Effect.promise(() => Promise.resolve()); 2026-10-25T02:26:58.7959882Z 224 │ │ const pending = backgroundRuntime.pending.shift(); 2026-10-25T02:26:58.7959977Z 225 │ │ if (!pending) { 2026-10-25T02:26:58.7960068Z 226 │ │ idlePasses++; 2026-10-25T02:26:58.7960172Z 227 │ │ if (idlePasses >= 3) { 2026-10-25T02:26:58.7960254Z 228 │ │ return; 2026-10-25T02:26:58.7960332Z 229 │ │ } 2026-10-25T02:26:58.7960415Z 230 │ │ continue; 2026-10-25T02:26:58.7960490Z 231 │ │ } 2026-10-25T02:26:58.7960586Z 232 │ │ idlePasses = 0; 2026-10-25T02:26:58.7960702Z 233 │ │ const exit = yield* Effect.exit( 2026-10-25T02:26:58.7960909Z 234 │ │ pending.operation as Effect.Effect, 2026-10-25T02:26:58.7960986Z 235 │ │ ); 2026-10-25T02:26:58.7961090Z 236 │ │ yield* Effect.sync(() => { 2026-10-25T02:26:58.7961192Z 237 │ │ pending.resolve(exit); 2026-10-25T02:26:58.7961269Z 238 │ │ }); 2026-10-25T02:26:58.7961400Z 239 │ ╰─▶ } 2026-10-25T02:26:58.7961456Z 240 │ }, 2026-10-25T02:26:58.7961507Z ╰──── 2026-10-25T02:26:58.7961510Z 2026-10-25T02:26:58.7961743Z ⚠ eslint(no-control-regex): Unexpected control character 2026-10-25T02:26:58.7962014Z ╭─[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46] 2026-10-25T02:26:58.7962151Z 219 │ 2026-10-25T02:26:58.7962287Z 220 │ {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")} 2026-10-25T02:26:58.7962395Z ·  ──┬─ 2026-10-25T02:26:58.7962559Z · ╰── 'U+001B' is a control character. 2026-10-25T02:26:58.7962622Z 221 │ 2026-10-25T02:26:58.7962673Z ╰──── 2026-10-25T02:26:58.7962903Z  help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression. 2026-10-25T02:26:58.7962911Z 2026-10-25T02:26:58.7963337Z ⚠ 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-25T02:26:58.7963483Z ╭─[apps/server/src/provider/acp/AntigravityProtocol.ts:260:20] 2026-10-25T02:26:58.7963563Z 259 │ ...(update._meta !== undefined 2026-10-25T02:26:58.7963726Z 260 │ ? { _meta: Schema.is(Schema.Record(Schema.String, Schema.Json))(meta) ? meta : null } 2026-10-25T02:26:58.7963813Z ·  ───────── 2026-10-25T02:26:58.7963876Z 261 │ : {}), 2026-10-25T02:26:58.7963926Z ╰──── 2026-10-25T02:26:58.7963928Z 2026-10-25T02:26:58.7964262Z ⚠ 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-25T02:26:58.7964382Z ╭─[packages/effect-acp/src/schema.test.ts:18:12] 2026-10-25T02:26:58.7964541Z 17 │ const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } }; 2026-10-25T02:26:58.7964660Z 18 │ expect(Schema.is(V1.AvailableCommand)(command)).toBe(true); 2026-10-25T02:26:58.7964736Z ·  ───────── 2026-10-25T02:26:58.7964794Z 19 │ expect( 2026-10-25T02:26:58.7964845Z ╰──── 2026-10-25T02:26:58.7964848Z 2026-10-25T02:26:58.7965172Z ⚠ 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-25T02:26:58.7965288Z ╭─[packages/effect-acp/src/schema.test.ts:20:7] 2026-10-25T02:26:58.7965346Z 19 │ expect( 2026-10-25T02:26:58.7965515Z 20 │ Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }), 2026-10-25T02:26:58.7965589Z ·  ───────── 2026-10-25T02:26:58.7965652Z 21 │ ).toBe(true); 2026-10-25T02:26:58.7965704Z ╰──── 2026-10-25T02:26:58.7965707Z 2026-10-25T02:26:58.7966010Z ⚠ eslint(no-unused-vars): Variable 'claudeCaps' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:26:58.7966118Z ╭─[packages/shared/src/model.test.ts:36:7] 2026-10-25T02:26:58.7966169Z 35 │ 2026-10-25T02:26:58.7966297Z 36 │ const claudeCaps: ModelCapabilities = createModelCapabilities({ 2026-10-25T02:26:58.7966369Z ·  ─────┬──── 2026-10-25T02:26:58.7966501Z · ╰── 'claudeCaps' is declared here 2026-10-25T02:26:58.7966631Z 37 │ optionDescriptors: [ 2026-10-25T02:26:58.7966711Z ╰──── 2026-10-25T02:26:58.7966861Z  help: Consider removing this declaration. 2026-10-25T02:26:58.7966864Z 2026-10-25T02:26:58.7967042Z ⚠ eslint(no-unused-vars): Type 'Scope' is imported but never used. 2026-10-25T02:26:58.7967176Z ╭─[apps/server/src/provider/ProviderAuthService.ts:15:18] 2026-10-25T02:26:58.7967261Z 14 │ import * as Layer from "effect/Layer"; 2026-10-25T02:26:58.7967352Z 15 │ import type * as Scope from "effect/Scope"; 2026-10-25T02:26:58.7967429Z ·  ──┬── 2026-10-25T02:26:58.7967560Z · ╰── 'Scope' is imported here 2026-10-25T02:26:58.7967645Z 16 │ import * as Stream from "effect/Stream"; 2026-10-25T02:26:58.7967695Z ╰──── 2026-10-25T02:26:58.7967796Z  help: Consider removing this import. 2026-10-25T02:26:58.7967802Z 2026-10-25T02:26:58.7968052Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:26:58.7968237Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:119:10] 2026-10-25T02:26:58.7968289Z 117 │ 2026-10-25T02:26:58.7968355Z 118 │ useEffect(() => { 2026-10-25T02:26:58.7968424Z ·  ────┬──── 2026-10-25T02:26:58.7968551Z · ╰── This is the containing effect 2026-10-25T02:26:58.7968631Z 119 │ void refreshNotifications(); 2026-10-25T02:26:58.7968720Z ·  ──────────┬───────── 2026-10-25T02:26:58.7968892Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7969037Z 120 │ const subscription = AppState.addEventListener("change", (state) => { 2026-10-25T02:26:58.7969091Z ╰──── 2026-10-25T02:26:58.7969679Z  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-25T02:26:58.7969995Z  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-25T02:26:58.7969998Z 2026-10-25T02:26:58.7970247Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:26:58.7970432Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7] 2026-10-25T02:26:58.7970486Z 125 │ 2026-10-25T02:26:58.7970550Z 126 │ useEffect(() => { 2026-10-25T02:26:58.7970619Z ·  ────┬──── 2026-10-25T02:26:58.7970745Z · ╰── This is the containing effect 2026-10-25T02:26:58.7970811Z 127 │ if (!isLoaded) { 2026-10-25T02:26:58.7970901Z 128 │ setLiveActivityStatus("checking"); 2026-10-25T02:26:58.7970989Z ·  ──────────┬────────── 2026-10-25T02:26:58.7971157Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:26:58.7971217Z 129 │ return; 2026-10-25T02:26:58.7971270Z ╰──── 2026-10-25T02:26:58.7971922Z  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-25T02:26:58.7972321Z  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-25T02:26:58.7972324Z 2026-10-25T02:26:58.7972530Z ⚠ eslint(no-unused-vars): Type 'ScheduledTaskDraft' is imported but never used. 2026-10-25T02:26:58.7972685Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:10:8] 2026-10-25T02:26:58.7972766Z  9 │ hasScheduledTaskDraftChanges, 2026-10-25T02:26:58.7972836Z 10 │ type ScheduledTaskDraft, 2026-10-25T02:26:58.7972922Z ·  ─────────┬──────── 2026-10-25T02:26:58.7973075Z · ╰── 'ScheduledTaskDraft' is imported here 2026-10-25T02:26:58.7973153Z 11 │ } from "./scheduledTaskDraft"; 2026-10-25T02:26:58.7973202Z ╰──── 2026-10-25T02:26:58.7973299Z  help: Consider removing this import. 2026-10-25T02:26:58.7973302Z 2026-10-25T02:26:58.7973478Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-25T02:26:58.7973635Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:81:85] 2026-10-25T02:26:58.7973734Z 80 │ const startEditor = startScheduledTaskEditor; 2026-10-25T02:26:58.7973911Z 81 │ const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]); 2026-10-25T02:26:58.7974053Z ·  ─────┬───── 2026-10-25T02:26:58.7974258Z · ╰── Unnecessary dependency `startEditor` 2026-10-25T02:26:58.7974336Z 82 │ const readEditor = useCallback( 2026-10-25T02:26:58.7974387Z ╰──── 2026-10-25T02:26:58.7974696Z  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-25T02:26:58.7975003Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7975006Z 2026-10-25T02:26:58.7975182Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-25T02:26:58.7975335Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:102:7] 2026-10-25T02:26:58.7975458Z 101 │ setEditor, 2026-10-25T02:26:58.7975570Z 102 │ startEditor, 2026-10-25T02:26:58.7975672Z ·  ─────┬───── 2026-10-25T02:26:58.7975811Z · ╰── Unnecessary dependency `startEditor` 2026-10-25T02:26:58.7975909Z 103 │ hasChanges, 2026-10-25T02:26:58.7975969Z ╰──── 2026-10-25T02:26:58.7976271Z  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-25T02:26:58.7976574Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7976579Z 2026-10-25T02:26:58.7977046Z ⚠ 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-25T02:26:58.7977180Z ╭─[apps/server/src/project/ProjectService.test.ts:94:3] 2026-10-25T02:26:58.7977235Z 93 │ ) { 2026-10-25T02:26:58.7977430Z 94 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T02:26:58.7977599Z 95 │ │ const project = Option.getOrThrow(yield* service.getById(projectId)); 2026-10-25T02:26:58.7977718Z 96 │ │ if (predicate(project)) return project; 2026-10-25T02:26:58.7977819Z 97 │ │ yield* Effect.yieldNow; 2026-10-25T02:26:58.7977941Z 98 │ ╰─▶ } 2026-10-25T02:26:58.7978092Z 99 │ return yield* Effect.die(`Project ${projectId} was not enriched in time.`); 2026-10-25T02:26:58.7978144Z ╰──── 2026-10-25T02:26:58.7978147Z 2026-10-25T02:26:58.7978600Z ⚠ 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-25T02:26:58.7978755Z ╭─[apps/server/src/project/ProjectEnrichmentService.test.ts:28:3] 2026-10-25T02:26:58.7978808Z 27 │ ) { 2026-10-25T02:26:58.7979001Z 28 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T02:26:58.7979142Z 29 │ │ const available = yield* service.peek(workspaceRoot); 2026-10-25T02:26:58.7979270Z 30 │ │ if (predicate(available)) return available; 2026-10-25T02:26:58.7979370Z 31 │ │ yield* Effect.yieldNow; 2026-10-25T02:26:58.7979490Z 32 │ ╰─▶ } 2026-10-25T02:26:58.7979664Z 33 │ return yield* Effect.die(`Project metadata for ${workspaceRoot} was not resolved in time.`); 2026-10-25T02:26:58.7979713Z ╰──── 2026-10-25T02:26:58.7979715Z 2026-10-25T02:26:58.7979898Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-25T02:26:58.7980011Z ╭─[apps/mobile/src/lib/useHoverGesture.ts:8:15] 2026-10-25T02:26:58.7980069Z 7 │ () => 2026-10-25T02:26:58.7980133Z 8 │ Gesture.Hover() 2026-10-25T02:26:58.7980209Z ·  ──┬── 2026-10-25T02:26:58.7980410Z · ╰── `Hover` may be a component 2026-10-25T02:26:58.7980535Z 9 │ .manualActivation(true) 2026-10-25T02:26:58.7980608Z ╰──── 2026-10-25T02:26:58.7980885Z  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-25T02:26:58.7981326Z  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-25T02:26:58.7981328Z 2026-10-25T02:26:58.7981598Z ⚠ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:26:58.7981743Z ╭─[apps/web/src/components/preview/PreviewPanelShell.tsx:57:9] 2026-10-25T02:26:58.7981797Z 56 │ ) { 2026-10-25T02:26:58.7981965Z 57 │ const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded"; 2026-10-25T02:26:58.7982047Z ·  ──────┬────── 2026-10-25T02:26:58.7982184Z · ╰── 'useDragRegion' is declared here 2026-10-25T02:26:58.7982273Z 58 │ const isInline = props.mode === "inline"; 2026-10-25T02:26:58.7982322Z ╰──── 2026-10-25T02:26:58.7982426Z  help: Consider removing this declaration. 2026-10-25T02:26:58.7982429Z 2026-10-25T02:26:58.7982592Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T02:26:58.7982737Z ╭─[apps/web/src/components/chat/useThreadLifecycle.tsx:178:58] 2026-10-25T02:26:58.7982847Z 177 │ if (snoozeClockState.shell !== activeThreadShell) { 2026-10-25T02:26:58.7983009Z 178 │ setSnoozeClockState({ shell: activeThreadShell, now: new Date().toISOString() }); 2026-10-25T02:26:58.7983135Z ·  ─────┬──── 2026-10-25T02:26:58.7983301Z · ╰── Cannot call impure function 2026-10-25T02:26:58.7983355Z 179 │ } 2026-10-25T02:26:58.7983403Z ╰──── 2026-10-25T02:26:58.7983677Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T02:26:58.7983969Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T02:26:58.7983971Z 2026-10-25T02:26:58.7984433Z ⚠ 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-25T02:26:58.7984562Z ╭─[apps/server/src/usage/UsageService.test.ts:2613:7] 2026-10-25T02:26:58.7984657Z 2612 │ let orphanedAt: number | undefined; 2026-10-25T02:26:58.7984883Z 2613 │ ╭─▶ for (let interruptAt = 1; interruptAt <= 31; interruptAt += 1) { 2026-10-25T02:26:58.7985003Z 2614 │ │ const tasks: Array<() => void> = []; 2026-10-25T02:26:58.7985152Z 2615 │ │ const dispatcher: Scheduler.SchedulerDispatcher = { 2026-10-25T02:26:58.7985369Z 2616 │ │ scheduleTask: (task) => tasks.push(task), 2026-10-25T02:26:58.7985542Z 2617 │ │ flush: () => { 2026-10-25T02:26:58.7985750Z 2618 │ │ let task: (() => void) | undefined; 2026-10-25T02:26:58.7985965Z 2619 │ │ while ((task = tasks.shift()) !== undefined) task(); 2026-10-25T02:26:58.7986047Z 2620 │ │ }, 2026-10-25T02:26:58.7986128Z 2621 │ │ }; 2026-10-25T02:26:58.7986200Z 2622 │ │ 2026-10-25T02:26:58.7986359Z 2623 │ │ let requestFiber: Fiber.Fiber | undefined; 2026-10-25T02:26:58.7986463Z 2624 │ │ let requestChecks = 0; 2026-10-25T02:26:58.7986593Z 2625 │ │ const scheduler: Scheduler.Scheduler = { 2026-10-25T02:26:58.7986701Z 2626 │ │ executionMode: "async", 2026-10-25T02:26:58.7986826Z 2627 │ │ makeDispatcher: () => dispatcher, 2026-10-25T02:26:58.7986937Z 2628 │ │ shouldYield: (fiber) => { 2026-10-25T02:26:58.7987070Z 2629 │ │ if (fiber !== requestFiber) return false; 2026-10-25T02:26:58.7987176Z 2630 │ │ requestChecks += 1; 2026-10-25T02:26:58.7987317Z 2631 │ │ if (requestChecks !== interruptAt) return false; 2026-10-25T02:26:58.7987430Z 2632 │ │ fiber.interruptUnsafe(); 2026-10-25T02:26:58.7987529Z 2633 │ │ return true; 2026-10-25T02:26:58.7987612Z 2634 │ │ }, 2026-10-25T02:26:58.7987695Z 2635 │ │ }; 2026-10-25T02:26:58.7987763Z 2636 │ │ 2026-10-25T02:26:58.7987889Z 2637 │ │ const input: UsageSummaryInput = { 2026-10-25T02:26:58.7987985Z 2638 │ │ ...WINDOW, 2026-10-25T02:26:58.7988112Z 2639 │ │ sinceDay: UsageDay.make("2026-09-01"), 2026-10-25T02:26:58.7988299Z 2640 │ │ untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`), 2026-10-25T02:26:58.7988379Z 2641 │ │ }; 2026-10-25T02:26:58.7988491Z 2642 │ │ const first = yield* service 2026-10-25T02:26:58.7988595Z 2643 │ │ .readSummary(input) 2026-10-25T02:26:58.7988681Z 2644 │ │ .pipe( 2026-10-25T02:26:58.7988778Z 2645 │ │ Effect.exit, 2026-10-25T02:26:58.7988939Z 2646 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-25T02:26:58.7989043Z 2647 │ │ Effect.forkChild, 2026-10-25T02:26:58.7989121Z 2648 │ │ ); 2026-10-25T02:26:58.7989224Z 2649 │ │ requestFiber = first; 2026-10-25T02:26:58.7989331Z 2650 │ │ yield* Effect.yieldNow; 2026-10-25T02:26:58.7989434Z 2651 │ │ dispatcher.flush(); 2026-10-25T02:26:58.7989501Z 2652 │ │ 2026-10-25T02:26:58.7989651Z 2653 │ │ const second = yield* service.readSummary(input).pipe( 2026-10-25T02:26:58.7989749Z 2654 │ │ Effect.match({ 2026-10-25T02:26:58.7989873Z 2655 │ │ onFailure: (error) => error.reason, 2026-10-25T02:26:58.7990132Z 2656 │ │ onSuccess: () => "success" as const, 2026-10-25T02:26:58.7990270Z 2657 │ │ }), 2026-10-25T02:26:58.7990447Z 2658 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-25T02:26:58.7990549Z 2659 │ │ Effect.forkChild, 2026-10-25T02:26:58.7990629Z 2660 │ │ ); 2026-10-25T02:26:58.7990731Z 2661 │ │ yield* Effect.yieldNow; 2026-10-25T02:26:58.7990830Z 2662 │ │ dispatcher.flush(); 2026-10-25T02:26:58.7990954Z 2663 │ │ const secondExit = second.pollUnsafe(); 2026-10-25T02:26:58.7991070Z 2664 │ │ if (secondExit === undefined) { 2026-10-25T02:26:58.7991182Z 2665 │ │ second.interruptUnsafe(); 2026-10-25T02:26:58.7991300Z 2666 │ │ orphanedAt = interruptAt; 2026-10-25T02:26:58.7991389Z 2667 │ │ break; 2026-10-25T02:26:58.7991468Z 2668 │ │ } 2026-10-25T02:26:58.7991584Z 2669 │ │ if (Exit.isFailure(secondExit)) { 2026-10-25T02:26:58.7991739Z 2670 │ │ assert.fail("the matching request fiber was interrupted"); 2026-10-25T02:26:58.7991818Z 2671 │ │ } 2026-10-25T02:26:58.7991967Z 2672 │ │ assert.strictEqual(secondExit.value, "invalidWindow"); 2026-10-25T02:26:58.7992099Z 2673 │ ╰─▶ } 2026-10-25T02:26:58.7992153Z 2674 │ 2026-10-25T02:26:58.7992207Z ╰──── 2026-10-25T02:26:58.7992210Z 2026-10-25T02:26:58.7992570Z ⚠ 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-25T02:26:58.7992706Z ╭─[apps/server/src/vcs/GitVcsDriverCore.test.ts:1786:34] 2026-10-25T02:26:58.7992839Z 1785 │ const stat = branch.files!.find((file) => file.path === path)!; 2026-10-25T02:26:58.7992983Z 1786 │ const request = yield* Schema.decodeEffect(ReviewDiffPreviewInput)({ 2026-10-25T02:26:58.7993097Z ·  ─────────────────── 2026-10-25T02:26:58.7993159Z 1787 │ cwd, 2026-10-25T02:26:58.7993212Z ╰──── 2026-10-25T02:26:58.7993214Z 2026-10-25T02:26:58.7993439Z ⚠ eslint(no-unused-vars): Function 'assertUserMessagesExclude' is declared but never used. 2026-10-25T02:26:58.7993605Z ╭─[apps/server/src/orchestration-v2/testkit/fixtures/shared.ts:1387:10] 2026-10-25T02:26:58.7993661Z 1386 │ 2026-10-25T02:26:58.7993746Z 1387 │ function assertUserMessagesExclude( 2026-10-25T02:26:58.7993848Z ·  ────────────┬──────────── 2026-10-25T02:26:58.7994011Z · ╰── 'assertUserMessagesExclude' is declared here 2026-10-25T02:26:58.7994118Z 1388 │ projection: OrchestrationV2ThreadProjection, 2026-10-25T02:26:58.7994170Z ╰──── 2026-10-25T02:26:58.7994274Z  help: Consider removing this declaration. 2026-10-25T02:26:58.7994276Z 2026-10-25T02:26:58.7994511Z ⚠ unicorn(prefer-string-starts-ends-with): Prefer String#startsWith over a regex with a caret. 2026-10-25T02:26:58.7994634Z ╭─[apps/server/src/vcs/GitVcsDriverCore.ts:498:11] 2026-10-25T02:26:58.7994795Z 497 │ GIT_DIAGNOSTIC_LINE_PATTERN.test(line) || 2026-10-25T02:26:58.7995017Z 498 │ (!/^remote:/.test(line) && SSH_TRANSPORT_REFUSAL_PATTERN.test(line)), 2026-10-25T02:26:58.7995103Z ·  ─────────────── 2026-10-25T02:26:58.7995157Z 499 │ ) 2026-10-25T02:26:58.7995207Z ╰──── 2026-10-25T02:26:58.7995359Z  help: Replace `/^remote:/.test(line)` with `line.startsWith('remote:')`. 2026-10-25T02:26:58.7995362Z 2026-10-25T02:26:58.7995564Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-25T02:26:58.7995701Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:229:6] 2026-10-25T02:26:58.7995873Z 225 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-25T02:26:58.7996004Z 226 │ nativeEventSnapshotsRef.current, 2026-10-25T02:26:58.7996100Z ·  ───────────┬─────────── 2026-10-25T02:26:58.7996557Z · ╰── 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-25T02:26:58.7996629Z 227 │ mostRecentEventCount, 2026-10-25T02:26:58.7996685Z 228 │ ); 2026-10-25T02:26:58.7996809Z 229 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-25T02:26:58.7996941Z ·  ──────────────────────────┬────────────────────────── 2026-10-25T02:26:58.7997134Z · ╰── This dependency list is missing values used by the callback 2026-10-25T02:26:58.7997217Z 230 │ const assumedValue = props.value; 2026-10-25T02:26:58.7997268Z ╰──── 2026-10-25T02:26:58.7997439Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-25T02:26:58.7997751Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.7997755Z 2026-10-25T02:26:58.7997964Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T02:26:58.7998100Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:235:7] 2026-10-25T02:26:58.7998242Z 234 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-25T02:26:58.7998332Z 235 │ nativeEventSnapshotsRef.current, 2026-10-25T02:26:58.7998420Z ·  ───────────┬─────────── 2026-10-25T02:26:58.7998930Z · ╰── 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-25T02:26:58.7999052Z 236 │ controlledEventCount, 2026-10-25T02:26:58.7999147Z 237 │ assumedValue, 2026-10-25T02:26:58.7999201Z 238 │ ); 2026-10-25T02:26:58.7999357Z 239 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-25T02:26:58.7999491Z ·  ───────────┬────────── 2026-10-25T02:26:58.7999695Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-25T02:26:58.7999785Z 240 │ const acceptNativeEvent = useCallback( 2026-10-25T02:26:58.7999836Z ╰──── 2026-10-25T02:26:58.8000254Z  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-25T02:26:58.8000568Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.8000570Z 2026-10-25T02:26:58.8000713Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.8000846Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:162:29] 2026-10-25T02:26:58.8000969Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-25T02:26:58.8001080Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-25T02:26:58.8001198Z ·  ─────────────┬──────────── 2026-10-25T02:26:58.8001364Z · ╰── Cannot access ref value during render 2026-10-25T02:26:58.8001424Z 163 │ }); 2026-10-25T02:26:58.8001474Z ╰──── 2026-10-25T02:26:58.8001935Z  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-25T02:26:58.8002223Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.8002227Z 2026-10-25T02:26:58.8002368Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.8002508Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:162:29] 2026-10-25T02:26:58.8002630Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-25T02:26:58.8002740Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-25T02:26:58.8002853Z ·  ─────────────┬──────────── 2026-10-25T02:26:58.8003056Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T02:26:58.8003112Z 163 │ }); 2026-10-25T02:26:58.8003163Z ╰──── 2026-10-25T02:26:58.8003616Z  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-25T02:26:58.8004052Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.8004116Z 2026-10-25T02:26:58.8004331Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.8004479Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:23] 2026-10-25T02:26:58.8004536Z 163 │ }); 2026-10-25T02:26:58.8004624Z 164 │ confirmedTokensRef.current = tokens; 2026-10-25T02:26:58.8004746Z ·  ─────────┬────────────┬─── 2026-10-25T02:26:58.8004932Z · │ ╰── Cannot update ref value during render 2026-10-25T02:26:58.8005045Z · ╰── This value is a ref 2026-10-25T02:26:58.8005115Z 165 │ return JSON.stringify( 2026-10-25T02:26:58.8005173Z ╰──── 2026-10-25T02:26:58.8005632Z  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-25T02:26:58.8005966Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.8005968Z 2026-10-25T02:26:58.8006110Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.8006242Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:206:5] 2026-10-25T02:26:58.8006312Z 205 │ mostRecentEventCount, 2026-10-25T02:26:58.8006399Z 206 │ nativeEventSnapshotsRef.current, 2026-10-25T02:26:58.8006505Z ·  ───────────────┬─────────────── 2026-10-25T02:26:58.8006691Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T02:26:58.8006745Z 207 │ ); 2026-10-25T02:26:58.8006795Z ╰──── 2026-10-25T02:26:58.8007253Z  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-25T02:26:58.8007537Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.8007539Z 2026-10-25T02:26:58.8007680Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.8007816Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:212:5] 2026-10-25T02:26:58.8007888Z 211 │ mostRecentEventCount, 2026-10-25T02:26:58.8007974Z 212 │ nativeEventSnapshotsRef.current, 2026-10-25T02:26:58.8008078Z ·  ───────────────┬─────────────── 2026-10-25T02:26:58.8008261Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T02:26:58.8008316Z 213 │ ); 2026-10-25T02:26:58.8008365Z ╰──── 2026-10-25T02:26:58.8008817Z  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-25T02:26:58.8009161Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.8009190Z 2026-10-25T02:26:58.8009423Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-25T02:26:58.8009557Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:197:6] 2026-10-25T02:26:58.8009676Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-25T02:26:58.8009787Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-25T02:26:58.8009895Z ·  ─────────┬──────── 2026-10-25T02:26:58.8010352Z · ╰── 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-25T02:26:58.8010412Z 163 │ }); 2026-10-25T02:26:58.8010502Z 164 │ confirmedTokensRef.current = tokens; 2026-10-25T02:26:58.8010572Z 165 │ return JSON.stringify( 2026-10-25T02:26:58.8010737Z 166 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-25T02:26:58.8010803Z 167 │ const record = 2026-10-25T02:26:58.8010882Z 168 │ token.type === "context" 2026-10-25T02:26:58.8011046Z 169 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-25T02:26:58.8011112Z 170 │ : undefined; 2026-10-25T02:26:58.8011217Z 171 │ const presentation = contextChipPresentation( 2026-10-25T02:26:58.8011327Z 172 │ token.type === "context" ? token.kind : token.type, 2026-10-25T02:26:58.8011391Z 173 │ record, 2026-10-25T02:26:58.8011451Z 174 │ ); 2026-10-25T02:26:58.8011539Z 175 │ const icon = contextChipIcon( 2026-10-25T02:26:58.8011608Z 176 │ presentation, 2026-10-25T02:26:58.8011749Z 177 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-25T02:26:58.8011806Z 178 │ ); 2026-10-25T02:26:58.8011867Z 179 │ return { 2026-10-25T02:26:58.8011936Z 180 │ type: token.type, 2026-10-25T02:26:58.8012010Z 181 │ source: token.source, 2026-10-25T02:26:58.8012081Z 182 │ start: token.start, 2026-10-25T02:26:58.8012145Z 183 │ end: token.end, 2026-10-25T02:26:58.8012292Z 184 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-25T02:26:58.8012353Z 185 │ label: 2026-10-25T02:26:58.8012432Z 186 │ token.type === "skill" 2026-10-25T02:26:58.8012536Z 187 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-25T02:26:58.8012623Z 188 │ : token.type === "context" 2026-10-25T02:26:58.8012859Z 189 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-25T02:26:58.8012941Z 190 │ : basename(token.value), 2026-10-25T02:26:58.8013080Z 191 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-25T02:26:58.8013175Z 192 │ iconUri: contextChipIconUri(icon), 2026-10-25T02:26:58.8013263Z 193 │ tintsIcon: icon.kind === "chip", 2026-10-25T02:26:58.8013321Z 194 │ }; 2026-10-25T02:26:58.8013376Z 195 │ }), 2026-10-25T02:26:58.8013431Z 196 │ ); 2026-10-25T02:26:58.8013562Z 197 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-25T02:26:58.8013781Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-25T02:26:58.8014064Z · ╰── This dependency list is missing values used by the callback 2026-10-25T02:26:58.8014204Z 198 │ // Every render resolves against the snapshot history, so a render whose 2026-10-25T02:26:58.8014256Z ╰──── 2026-10-25T02:26:58.8014461Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-25T02:26:58.8014769Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.8014771Z 2026-10-25T02:26:58.8014955Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-25T02:26:58.8015086Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:257:5] 2026-10-25T02:26:58.8015220Z 249 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-25T02:26:58.8015322Z 250 │ nativeEventSnapshotsRef.current.push({ 2026-10-25T02:26:58.8015410Z ·  ───────────┬─────────── 2026-10-25T02:26:58.8015874Z · ╰── 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-25T02:26:58.8016000Z 251 │ eventCount: acknowledgedEventCount, 2026-10-25T02:26:58.8016061Z 252 │ value, 2026-10-25T02:26:58.8016138Z 253 │ selection: nextSelection, 2026-10-25T02:26:58.8016197Z 254 │ }); 2026-10-25T02:26:58.8016280Z 255 │ return acknowledgedEventCount; 2026-10-25T02:26:58.8016334Z 256 │ }, 2026-10-25T02:26:58.8016392Z 257 │ [], 2026-10-25T02:26:58.8016464Z ·  ─┬ 2026-10-25T02:26:58.8016642Z · ╰── This dependency list is missing values used by the callback 2026-10-25T02:26:58.8016694Z 258 │ ); 2026-10-25T02:26:58.8016746Z ╰──── 2026-10-25T02:26:58.8016948Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-25T02:26:58.8017257Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.8017260Z 2026-10-25T02:26:58.8017450Z ⚠ eslint(no-unused-vars): Identifier 'Image' is imported but never used. 2026-10-25T02:26:58.8017590Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:17:10] 2026-10-25T02:26:58.8017788Z 16 │ import type { NativeSyntheticEvent, ViewProps } from "react-native"; 2026-10-25T02:26:58.8017981Z 17 │ import { Image, Platform, StyleSheet } from "react-native"; 2026-10-25T02:26:58.8018056Z ·  ──┬── 2026-10-25T02:26:58.8018178Z · ╰── 'Image' is imported here 2026-10-25T02:26:58.8018234Z 18 │ 2026-10-25T02:26:58.8018287Z ╰──── 2026-10-25T02:26:58.8018383Z  help: Consider removing this import. 2026-10-25T02:26:58.8018386Z 2026-10-25T02:26:58.8018582Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-25T02:26:58.8018724Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:227:6] 2026-10-25T02:26:58.8018887Z 223 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-25T02:26:58.8018982Z 224 │ nativeEventSnapshotsRef.current, 2026-10-25T02:26:58.8019073Z ·  ───────────┬─────────── 2026-10-25T02:26:58.8019519Z · ╰── 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-25T02:26:58.8019591Z 225 │ mostRecentEventCount, 2026-10-25T02:26:58.8019645Z 226 │ ); 2026-10-25T02:26:58.8019765Z 227 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-25T02:26:58.8019895Z ·  ──────────────────────────┬────────────────────────── 2026-10-25T02:26:58.8020088Z · ╰── This dependency list is missing values used by the callback 2026-10-25T02:26:58.8020178Z 228 │ const assumedValue = props.value; 2026-10-25T02:26:58.8020231Z ╰──── 2026-10-25T02:26:58.8020398Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-25T02:26:58.8020706Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.8020708Z 2026-10-25T02:26:58.8020918Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T02:26:58.8021058Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:233:7] 2026-10-25T02:26:58.8021198Z 232 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-25T02:26:58.8021286Z 233 │ nativeEventSnapshotsRef.current, 2026-10-25T02:26:58.8021376Z ·  ───────────┬─────────── 2026-10-25T02:26:58.8021832Z · ╰── 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-25T02:26:58.8021905Z 234 │ controlledEventCount, 2026-10-25T02:26:58.8021969Z 235 │ assumedValue, 2026-10-25T02:26:58.8022023Z 236 │ ); 2026-10-25T02:26:58.8022179Z 237 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-25T02:26:58.8022312Z ·  ───────────┬────────── 2026-10-25T02:26:58.8022515Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-25T02:26:58.8022670Z 238 │ const acceptNativeEvent = useCallback( 2026-10-25T02:26:58.8022756Z ╰──── 2026-10-25T02:26:58.8023217Z  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-25T02:26:58.8023524Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.8023527Z 2026-10-25T02:26:58.8023671Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.8023814Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:160:29] 2026-10-25T02:26:58.8023937Z 159 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-25T02:26:58.8024050Z 160 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-25T02:26:58.8024169Z ·  ─────────────┬──────────── 2026-10-25T02:26:58.8024333Z · ╰── Cannot access ref value during render 2026-10-25T02:26:58.8024389Z 161 │ }); 2026-10-25T02:26:58.8024440Z ╰──── 2026-10-25T02:26:58.8024900Z  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-25T02:26:58.8025259Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.8025263Z 2026-10-25T02:26:58.8025414Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.8025560Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:160:29] 2026-10-25T02:26:58.8025679Z 159 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-25T02:26:58.8025789Z 160 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-25T02:26:58.8025963Z ·  ─────────────┬──────────── 2026-10-25T02:26:58.8026167Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T02:26:58.8026222Z 161 │ }); 2026-10-25T02:26:58.8026274Z ╰──── 2026-10-25T02:26:58.8026734Z  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-25T02:26:58.8027024Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.8027026Z 2026-10-25T02:26:58.8027169Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.8027308Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:23] 2026-10-25T02:26:58.8027365Z 161 │ }); 2026-10-25T02:26:58.8027455Z 162 │ confirmedTokensRef.current = tokens; 2026-10-25T02:26:58.8027578Z ·  ─────────┬────────────┬─── 2026-10-25T02:26:58.8027762Z · │ ╰── Cannot update ref value during render 2026-10-25T02:26:58.8027952Z · ╰── This value is a ref 2026-10-25T02:26:58.8028076Z 163 │ return JSON.stringify( 2026-10-25T02:26:58.8028156Z ╰──── 2026-10-25T02:26:58.8028619Z  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-25T02:26:58.8028911Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.8028914Z 2026-10-25T02:26:58.8029057Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.8029198Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:204:5] 2026-10-25T02:26:58.8029273Z 203 │ mostRecentEventCount, 2026-10-25T02:26:58.8029361Z 204 │ nativeEventSnapshotsRef.current, 2026-10-25T02:26:58.8029464Z ·  ───────────────┬─────────────── 2026-10-25T02:26:58.8029649Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T02:26:58.8029704Z 205 │ ); 2026-10-25T02:26:58.8029753Z ╰──── 2026-10-25T02:26:58.8030209Z  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-25T02:26:58.8030496Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.8030498Z 2026-10-25T02:26:58.8030645Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.8030787Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:210:5] 2026-10-25T02:26:58.8030854Z 209 │ mostRecentEventCount, 2026-10-25T02:26:58.8030943Z 210 │ nativeEventSnapshotsRef.current, 2026-10-25T02:26:58.8031045Z ·  ───────────────┬─────────────── 2026-10-25T02:26:58.8031232Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T02:26:58.8031287Z 211 │ ); 2026-10-25T02:26:58.8031338Z ╰──── 2026-10-25T02:26:58.8031795Z  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-25T02:26:58.8032088Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.8032093Z 2026-10-25T02:26:58.8032275Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-25T02:26:58.8032414Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:195:6] 2026-10-25T02:26:58.8032536Z 159 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-25T02:26:58.8032649Z 160 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-25T02:26:58.8032758Z ·  ─────────┬──────── 2026-10-25T02:26:58.8033275Z · ╰── 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-25T02:26:58.8033376Z 161 │ }); 2026-10-25T02:26:58.8033501Z 162 │ confirmedTokensRef.current = tokens; 2026-10-25T02:26:58.8033574Z 163 │ return JSON.stringify( 2026-10-25T02:26:58.8033735Z 164 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-25T02:26:58.8033803Z 165 │ const record = 2026-10-25T02:26:58.8033884Z 166 │ token.type === "context" 2026-10-25T02:26:58.8034045Z 167 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-25T02:26:58.8034113Z 168 │ : undefined; 2026-10-25T02:26:58.8034222Z 169 │ const presentation = contextChipPresentation( 2026-10-25T02:26:58.8034331Z 170 │ token.type === "context" ? token.kind : token.type, 2026-10-25T02:26:58.8034398Z 171 │ record, 2026-10-25T02:26:58.8034457Z 172 │ ); 2026-10-25T02:26:58.8034543Z 173 │ const icon = contextChipIcon( 2026-10-25T02:26:58.8034612Z 174 │ presentation, 2026-10-25T02:26:58.8034753Z 175 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-25T02:26:58.8034809Z 176 │ ); 2026-10-25T02:26:58.8034872Z 177 │ return { 2026-10-25T02:26:58.8034943Z 178 │ type: token.type, 2026-10-25T02:26:58.8035016Z 179 │ source: token.source, 2026-10-25T02:26:58.8035089Z 180 │ start: token.start, 2026-10-25T02:26:58.8035154Z 181 │ end: token.end, 2026-10-25T02:26:58.8035302Z 182 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-25T02:26:58.8035362Z 183 │ label: 2026-10-25T02:26:58.8035445Z 184 │ token.type === "skill" 2026-10-25T02:26:58.8035555Z 185 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-25T02:26:58.8035639Z 186 │ : token.type === "context" 2026-10-25T02:26:58.8035901Z 187 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-25T02:26:58.8035992Z 188 │ : basename(token.value), 2026-10-25T02:26:58.8036137Z 189 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-25T02:26:58.8036229Z 190 │ iconUri: contextChipIconUri(icon), 2026-10-25T02:26:58.8036316Z 191 │ tintsIcon: icon.kind === "chip", 2026-10-25T02:26:58.8036375Z 192 │ }; 2026-10-25T02:26:58.8036434Z 193 │ }), 2026-10-25T02:26:58.8036490Z 194 │ ); 2026-10-25T02:26:58.8036623Z 195 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-25T02:26:58.8036774Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-25T02:26:58.8036975Z · ╰── This dependency list is missing values used by the callback 2026-10-25T02:26:58.8037113Z 196 │ // Every render resolves against the snapshot history, so a render whose 2026-10-25T02:26:58.8037163Z ╰──── 2026-10-25T02:26:58.8037367Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-25T02:26:58.8037677Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.8037679Z 2026-10-25T02:26:58.8037925Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-25T02:26:58.8038145Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:255:5] 2026-10-25T02:26:58.8038272Z 247 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-25T02:26:58.8038372Z 248 │ nativeEventSnapshotsRef.current.push({ 2026-10-25T02:26:58.8038468Z ·  ───────────┬─────────── 2026-10-25T02:26:58.8038917Z · ╰── 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-25T02:26:58.8039006Z 249 │ eventCount: acknowledgedEventCount, 2026-10-25T02:26:58.8039069Z 250 │ value, 2026-10-25T02:26:58.8039148Z 251 │ selection: nextSelection, 2026-10-25T02:26:58.8039213Z 252 │ }); 2026-10-25T02:26:58.8039297Z 253 │ return acknowledgedEventCount; 2026-10-25T02:26:58.8039354Z 254 │ }, 2026-10-25T02:26:58.8039409Z 255 │ [], 2026-10-25T02:26:58.8039476Z ·  ─┬ 2026-10-25T02:26:58.8039653Z · ╰── This dependency list is missing values used by the callback 2026-10-25T02:26:58.8039708Z 256 │ ); 2026-10-25T02:26:58.8039760Z ╰──── 2026-10-25T02:26:58.8039965Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-25T02:26:58.8040271Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:26:58.8040273Z 2026-10-25T02:26:58.8040639Z ⚠ 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-25T02:26:58.8040768Z ╭─[apps/server/src/auth/RpcAuthorization.ts:238:17] 2026-10-25T02:26:58.8040904Z 237 │ const requiredScopesForSettingsUpdate = (payload: unknown) => { 2026-10-25T02:26:58.8041035Z 238 │ const input = Schema.decodeUnknownSync(SettingsUpdate)(payload); 2026-10-25T02:26:58.8041138Z ·  ──────────────────────── 2026-10-25T02:26:58.8041276Z 239 │ const scopes = requiredScopesForServerSettingsPatch(input.patch); 2026-10-25T02:26:58.8041328Z ╰──── 2026-10-25T02:26:58.8041331Z 2026-10-25T02:26:58.8041688Z ⚠ 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-25T02:26:58.8041873Z ╭─[apps/server/src/auth/RpcAuthorization.ts:256:26] 2026-10-25T02:26:58.8042039Z 255 │ if (method === WS_METHODS.assetsCreateUrl) { 2026-10-25T02:26:58.8042202Z 256 │ const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload); 2026-10-25T02:26:58.8042317Z ·  ──────────────────────── 2026-10-25T02:26:58.8042376Z 257 │ return [ 2026-10-25T02:26:58.8042429Z ╰──── 2026-10-25T02:26:58.8042432Z 2026-10-25T02:26:58.8042629Z ⚠ eslint(no-unused-vars): Identifier 'identity' is imported but never used. 2026-10-25T02:26:58.8042734Z ╭─[apps/server/src/auth/http.ts:28:10] 2026-10-25T02:26:58.8042820Z 27 │ import * as Schema from "effect/Schema"; 2026-10-25T02:26:58.8042912Z 28 │ import { identity } from "effect/Function"; 2026-10-25T02:26:58.8042988Z ·  ────┬─── 2026-10-25T02:26:58.8043125Z · ╰── 'identity' is imported here 2026-10-25T02:26:58.8043211Z 29 │ import * as Layer from "effect/Layer"; 2026-10-25T02:26:58.8043265Z ╰──── 2026-10-25T02:26:58.8043362Z  help: Consider removing this import. 2026-10-25T02:26:58.8043364Z 2026-10-25T02:26:58.8043590Z ⚠ unicorn(no-useless-spread): Using a spread operator here creates a new array unnecessarily. 2026-10-25T02:26:58.8043725Z ╭─[apps/mobile/src/native/native-layout-metrics.tsx:43:27] 2026-10-25T02:26:58.8043795Z 42 │ latestMetrics = next; 2026-10-25T02:26:58.8043908Z 43 │ for (const settle of [...metricsWaiters]) settle(next); 2026-10-25T02:26:58.8043992Z ·  ─── 2026-10-25T02:26:58.8044056Z 44 │ setMetrics(next); 2026-10-25T02:26:58.8044111Z ╰──── 2026-10-25T02:26:58.8044302Z  help: `for…of` can iterate over iterable, it's unnecessary to convert to an array. 2026-10-25T02:26:58.8044307Z 2026-10-25T02:26:58.8044504Z ⚠ eslint(no-unused-vars): Identifier 'FormSheet' is imported but never used. 2026-10-25T02:26:58.8044652Z ╭─[apps/mobile/src/native/createV5StackNavigator.ios.tsx:26:10] 2026-10-25T02:26:58.8044753Z 25 │ import { StyleSheet, View } from "react-native"; 2026-10-25T02:26:58.8044867Z 26 │ import { FormSheet, Stack } from "react-native-screens"; 2026-10-25T02:26:58.8044944Z ·  ────┬──── 2026-10-25T02:26:58.8045076Z · ╰── 'FormSheet' is imported here 2026-10-25T02:26:58.8045224Z 27 │ import { NativeScrollEdgeEffectsContext } from "./NativeScrollViewMarker"; 2026-10-25T02:26:58.8045278Z ╰──── 2026-10-25T02:26:58.8045380Z  help: Consider removing this import. 2026-10-25T02:26:58.8045385Z 2026-10-25T02:26:58.8045615Z ⚠ eslint(no-unused-vars): Identifier 'nativeWorkspacePopAction' is imported but never used. 2026-10-25T02:26:58.8045759Z ╭─[apps/mobile/src/native/createV5StackNavigator.ios.tsx:33:3] 2026-10-25T02:26:58.8045870Z 32 │ nativeStackPopAction, 2026-10-25T02:26:58.8045946Z 33 │ nativeWorkspacePopAction, 2026-10-25T02:26:58.8046035Z ·  ────────────┬─────────── 2026-10-25T02:26:58.8046193Z · ╰── 'nativeWorkspacePopAction' is imported here 2026-10-25T02:26:58.8046269Z 34 │ nativeWorkspacePopCount, 2026-10-25T02:26:58.8046321Z ╰──── 2026-10-25T02:26:58.8046416Z  help: Consider removing this import. 2026-10-25T02:26:58.8046419Z 2026-10-25T02:26:58.8046701Z ⚠ eslint(no-unused-vars): Identifier 'nativeWorkspacePopCount' is imported but never used. 2026-10-25T02:26:58.8046934Z ╭─[apps/mobile/src/native/createV5StackNavigator.ios.tsx:34:3] 2026-10-25T02:26:58.8047009Z 33 │ nativeWorkspacePopAction, 2026-10-25T02:26:58.8047079Z 34 │ nativeWorkspacePopCount, 2026-10-25T02:26:58.8047164Z ·  ───────────┬─────────── 2026-10-25T02:26:58.8047322Z · ╰── 'nativeWorkspacePopCount' is imported here 2026-10-25T02:26:58.8047402Z 35 │ partitionStackPresentations, 2026-10-25T02:26:58.8047456Z ╰──── 2026-10-25T02:26:58.8047548Z  help: Consider removing this import. 2026-10-25T02:26:58.8047551Z 2026-10-25T02:26:58.8047694Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.8047820Z ╭─[apps/mobile/src/native/StackHeader.tsx:202:9] 2026-10-25T02:26:58.8047887Z 201 │ "options", 2026-10-25T02:26:58.8047979Z 202 │ latestOptionFunctionsRef.current, 2026-10-25T02:26:58.8048090Z ·  ────────────────┬─────────────── 2026-10-25T02:26:58.8048281Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T02:26:58.8048377Z 203 │ optionFunctionWrappersRef.current, 2026-10-25T02:26:58.8048428Z ╰──── 2026-10-25T02:26:58.8048894Z  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-25T02:26:58.8049191Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.8049197Z 2026-10-25T02:26:58.8049342Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:26:58.8049458Z ╭─[apps/mobile/src/native/StackHeader.tsx:203:9] 2026-10-25T02:26:58.8049550Z 202 │ latestOptionFunctionsRef.current, 2026-10-25T02:26:58.8049645Z 203 │ optionFunctionWrappersRef.current, 2026-10-25T02:26:58.8049752Z ·  ────────────────┬──────────────── 2026-10-25T02:26:58.8049941Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T02:26:58.8050032Z 204 │ ) as NativeStackNavigationOptions) 2026-10-25T02:26:58.8050085Z ╰──── 2026-10-25T02:26:58.8050549Z  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-25T02:26:58.8050840Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:26:58.8050843Z 2026-10-25T02:26:58.8051210Z ⚠ 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-25T02:26:58.8051337Z ╭─[apps/server/src/assets/AssetAccess.test.ts:975:35] 2026-10-25T02:26:58.8051486Z 974 │ // Every client and server release spells the resource this way on the wire. 2026-10-25T02:26:58.8051704Z 975 │ const { resource } = yield* Schema.decodeUnknownEffect(AssetCreateUrlInput)({ 2026-10-25T02:26:58.8051908Z ·  ────────────────────────── 2026-10-25T02:26:58.8052020Z 976 │ resource: { _tag: "github-media", cwd: "/repo", url }, 2026-10-25T02:26:58.8052072Z ╰──── 2026-10-25T02:26:58.8052074Z 2026-10-25T02:26:58.8052515Z ⚠ 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-25T02:26:58.8052647Z ╭─[apps/server/src/assets/AssetAccess.test.ts:1012:32] 2026-10-25T02:26:58.8052782Z 1011 │ expect(error._tag).toBe("AssetGitHubMediaUrlValidationError"); 2026-10-25T02:26:58.8052969Z 1012 │ const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(AssetAccessError))(error); 2026-10-25T02:26:58.8053089Z ·  ─────────────────── 2026-10-25T02:26:58.8053183Z 1013 │ expect(encoded).not.toContain(url); 2026-10-25T02:26:58.8053236Z ╰──── 2026-10-25T02:26:58.8053239Z 2026-10-25T02:26:58.8053400Z ⚠ eslint(no-empty-pattern): Empty array binding pattern 2026-10-25T02:26:58.8053556Z ╭─[apps/server/src/pullRequest/PullRequestService.test.ts:1436:12] 2026-10-25T02:26:58.8053612Z 1435 │ 2026-10-25T02:26:58.8053680Z 1436 │ for (const [] of [ 2026-10-25T02:26:58.8053752Z ·  ── 2026-10-25T02:26:58.8053824Z 1437 │ ["github", "github.com"], 2026-10-25T02:26:58.8053875Z ╰──── 2026-10-25T02:26:58.8054150Z  help: Passing non-iterable values (null, undefined, numbers, booleans, etc.) will result in a runtime error because these values are not iterable. 2026-10-25T02:26:58.8054162Z 2026-10-25T02:26:58.8054423Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:26:58.8054543Z ╭─[apps/server/src/usage/UsageService.ts:162:7] 2026-10-25T02:26:58.8054595Z 161 │ 2026-10-25T02:26:58.8054676Z 162 │ const layerTest = Layer.succeed( 2026-10-25T02:26:58.8054748Z ·  ────┬──── 2026-10-25T02:26:58.8054882Z · ╰── 'layerTest' is declared here 2026-10-25T02:26:58.8054948Z 163 │ UsageService, 2026-10-25T02:26:58.8054999Z ╰──── 2026-10-25T02:26:58.8055102Z  help: Consider removing this declaration. 2026-10-25T02:26:58.8055105Z 2026-10-25T02:26:58.8055270Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T02:26:58.8055459Z ╭─[apps/web/src/components/CommandPalette.tsx:2048:20] 2026-10-25T02:26:58.8055654Z 2047 │ title: inferProjectTitleFromPath(destinationPath), 2026-10-25T02:26:58.8055748Z 2048 │ createdAt: new Date().toISOString(), 2026-10-25T02:26:58.8055870Z ·  ─────┬──── 2026-10-25T02:26:58.8056025Z · ╰── Cannot call impure function 2026-10-25T02:26:58.8056133Z 2049 │ remoteUrl: addProjectCloneFlow.remoteUrl, 2026-10-25T02:26:58.8056184Z ╰──── 2026-10-25T02:26:58.8056460Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T02:26:58.8056756Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T02:26:58.8056761Z 2026-10-25T02:26:58.8056844Z Found 3 errors and 377 warnings in 5539 files (4.9s, 8 threads) 2026-10-25T02:26:58.8064866Z ##[error]Process completed with exit code 1. 2026-10-25T02:26:58.8134575Z Post job cleanup. 2026-10-25T02:26:58.8147741Z ##[start-action display=Cache full pnpm store;id=__5a90bdd6-2b8a-4139-a4ea-06b1c8342ce4.__actions_cache] 2026-10-25T02:26:58.8148668Z ##[end-action id=__5a90bdd6-2b8a-4139-a4ea-06b1c8342ce4.__actions_cache;outcome=skipped;conclusion=skipped;duration_ms=0] 2026-10-25T02:26:58.8149307Z ##[start-action display=Cache Vite+;id=__5a90bdd6-2b8a-4139-a4ea-06b1c8342ce4.vp_cache] 2026-10-25T02:26:58.8150006Z ##[end-action id=__5a90bdd6-2b8a-4139-a4ea-06b1c8342ce4.vp_cache;outcome=skipped;conclusion=skipped;duration_ms=0] 2026-10-25T02:26:58.8179003Z Post job cleanup. 2026-10-25T02:26:58.8588614Z [command]/usr/local/bin/git version 2026-10-25T02:26:58.8636214Z git version 2.55.0 2026-10-25T02:26:58.8653020Z Temporarily overriding HOME='/home/runner/_work/_temp/6d009772-005b-49e7-826a-2e9a1afdd4ed' before making global git config changes 2026-10-25T02:26:58.8653174Z Adding repository directory to the temporary git global config as a safe directory 2026-10-25T02:26:58.8655817Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-25T02:26:58.8675760Z Removing SSH command configuration 2026-10-25T02:26:58.8678836Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-25T02:26:58.8699502Z [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-25T02:26:58.8821029Z fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules 2026-10-25T02:26:58.8837819Z ##[warning]The process '/usr/local/bin/git' failed with exit code 128 2026-10-25T02:26:58.8871696Z A job completed hook has been configured by the self-hosted runner administrator 2026-10-25T02:26:58.8892018Z ##[group]Run '/job_completed.sh' 2026-10-25T02:26:58.8902124Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-25T02:26:58.8902170Z env: 2026-10-25T02:26:58.8902233Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 156 2026-10-25T02:26:58.8902289Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 382 2026-10-25T02:26:58.8902339Z BLACKSMITH_CHECK_RUN_ID: 121052657821 2026-10-25T02:26:58.8902394Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-25T02:26:58.8902448Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-25T02:26:58.8902501Z ##[endgroup] 2026-10-25T02:26:58.8978964Z Docker container cache not activated, skipping hash computation. 2026-10-25T02:26:58.9236547Z No active SSH sessions detected. Proceeding with shutdown immediately. 2026-10-25T02:26:58.9281251Z Cleaning up orphan processes