2026-10-25T00:57:12.3763111Z Current runner version: '2.338.1' 2026-10-25T00:57:12.3766335Z Runner name: 'blacksmith-8vcpu-ubuntu-2404-ymxkaxhz24tbuzpk' 2026-10-25T00:57:12.3767082Z Runner group name: 'blacksmith scale sets - blacksmith-8vcpu-ubuntu-2404' 2026-10-25T00:57:12.3767770Z Machine name: 'ip-172-31-73-130' 2026-10-25T00:57:12.3769313Z ##[group]GITHUB_TOKEN Permissions 2026-10-25T00:57:12.3770554Z Contents: read 2026-10-25T00:57:12.3770919Z Metadata: read 2026-10-25T00:57:12.3771289Z ##[endgroup] 2026-10-25T00:57:12.3772623Z Secret source: Actions 2026-10-25T00:57:12.3773253Z Cache mode: write 2026-10-25T00:57:12.3773729Z Prepare workflow directory 2026-10-25T00:57:12.3943000Z Prepare all required actions 2026-10-25T00:57:12.3967637Z Getting action download info 2026-10-25T00:57:12.5025559Z Download action repository 'actions/checkout@v6' (SHA:d23441a48e516b6c34aea4fa41551a30e30af803) 2026-10-25T00:57:12.5297749Z Download action repository 'actions/cache@v6' (SHA:55cc8345863c7cc4c66a329aec7e433d2d1c52a9) 2026-10-25T00:57:12.6397159Z Setting BLACKSMITH_ACTIONS_RESULTS_URL to https://results-receiver.actions.githubusercontent.com/ 2026-10-25T00:57:12.6432755Z Complete job name: Lint 2026-10-25T00:57:12.6787720Z A job started hook has been configured by the self-hosted runner administrator 2026-10-25T00:57:12.6859963Z ##[group]Run '/setup.sh' 2026-10-25T00:57:12.6869524Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-25T00:57:12.6869922Z env: 2026-10-25T00:57:12.6870130Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 216 2026-10-25T00:57:12.6870417Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 361 2026-10-25T00:57:12.6870685Z BLACKSMITH_CHECK_RUN_ID: 121035433332 2026-10-25T00:57:12.6870956Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-25T00:57:12.6871225Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-25T00:57:12.6871518Z ##[endgroup] 2026-10-25T00:57:12.7075753Z Logging daemon started (blacksmithd for logs) 2026-10-25T00:57:12.7156389Z Results daemon started (blacksmithd for results) 2026-10-25T00:57:12.7273926Z Background adoption and SSH setup started (PID: 3171) 2026-10-25T00:57:12.7274547Z 2026-10-25T00:57:12.7274755Z ---------------------------------------- 2026-10-25T00:57:12.7275288Z View this job: https://app.blacksmith.sh/pingdotgg/runs/40148688970/jobs/121035433332 2026-10-25T00:57:12.7275686Z SSH Access (using your GitHub SSH key): 2026-10-25T00:57:12.7276103Z ssh -p 64000 runner@blacksmith-8vcpu-ubuntu-2404-ymxkaxhz24tbuzpk.vm.blacksmith.sh 2026-10-25T00:57:12.7276400Z 2026-10-25T00:57:12.7276505Z No GitHub SSH key? Add one at: 2026-10-25T00:57:12.7276981Z https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account 2026-10-25T00:57:12.7277366Z 2026-10-25T00:57:12.7277468Z ---------------------------------------- 2026-10-25T00:57:12.7277637Z 2026-10-25T00:57:12.7277780Z VM ID: blacksmith-8vcpu-ubuntu-2404-ymxkaxhz24tbuzpk 2026-10-25T00:57:12.7278091Z Host: production-152.236.39.72-x8664 2026-10-25T00:57:12.7278354Z Host Agent PID: 4085119 2026-10-25T00:57:12.7278585Z Host Agent Git SHA: 1637818df 2026-10-25T00:57:12.7278908Z Host CPU Manufacturer: AuthenticAMD 2026-10-25T00:57:12.7279181Z Blacksmith Host Generation: gen 2 2026-10-25T00:57:12.7279461Z Petname: production-pleasing-gopher-5aec57c6 2026-10-25T00:57:12.7279743Z Region: us-east 2026-10-25T00:57:12.7279967Z Rootfs Version: ubuntu24-full-x64-081926 2026-10-25T00:57:12.7284790Z OS Version: Ubuntu 24.04.4 LTS 2026-10-25T00:57:12.7285313Z 2026-10-25T00:57:12.7324242Z Enabling Blacksmith transparent cache 2026-10-25T00:57:12.7476174Z ##[group]Run actions/checkout@v6 2026-10-25T00:57:12.7476458Z with: 2026-10-25T00:57:12.7476778Z sparse-checkout: /* !/.repos/ !/apps/mobile/modules/t3-terminal/Vendor/**/*.a 2026-10-25T00:57:12.7477165Z sparse-checkout-cone-mode: false 2026-10-25T00:57:12.7477435Z repository: pingdotgg/t3code 2026-10-25T00:57:12.7479226Z token: *** 2026-10-25T00:57:12.7479433Z ssh-strict: true 2026-10-25T00:57:12.7479645Z ssh-user: git 2026-10-25T00:57:12.7479864Z persist-credentials: true 2026-10-25T00:57:12.7480258Z clean: true 2026-10-25T00:57:12.7480567Z fetch-depth: 1 2026-10-25T00:57:12.7480781Z fetch-tags: false 2026-10-25T00:57:12.7480995Z show-progress: true 2026-10-25T00:57:12.7481217Z lfs: false 2026-10-25T00:57:12.7481416Z submodules: false 2026-10-25T00:57:12.7481673Z set-safe-directory: true 2026-10-25T00:57:12.7481922Z allow-unsafe-pr-checkout: false 2026-10-25T00:57:12.7482168Z env: 2026-10-25T00:57:12.7482395Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 216 2026-10-25T00:57:12.7482669Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 361 2026-10-25T00:57:12.7482941Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T00:57:12.7483194Z ##[endgroup] 2026-10-25T00:57:12.8389930Z Syncing repository: pingdotgg/t3code 2026-10-25T00:57:12.8390849Z ##[group]Getting Git version info 2026-10-25T00:57:12.8391178Z Working directory is '/home/runner/_work/t3code/t3code' 2026-10-25T00:57:12.8391697Z [command]/usr/local/bin/git version 2026-10-25T00:57:12.8407095Z git version 2.55.0 2026-10-25T00:57:12.8418052Z ##[endgroup] 2026-10-25T00:57:12.8424260Z Temporarily overriding HOME='/home/runner/_work/_temp/3e73c65a-645b-41d3-b7f1-58f0b13a29f7' before making global git config changes 2026-10-25T00:57:12.8424899Z Adding repository directory to the temporary git global config as a safe directory 2026-10-25T00:57:12.8427035Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-25T00:57:12.8474723Z Deleting the contents of '/home/runner/_work/t3code/t3code' 2026-10-25T00:57:12.8476155Z ##[group]Determining repository object format 2026-10-25T00:57:12.8477158Z ##[endgroup] 2026-10-25T00:57:12.8477519Z ##[group]Initializing the repository 2026-10-25T00:57:12.8479372Z [command]/usr/local/bin/git init /home/runner/_work/t3code/t3code 2026-10-25T00:57:12.8510873Z hint: Using 'master' as the name for the initial branch. This default branch name 2026-10-25T00:57:12.8511544Z hint: will change to "main" in Git 3.0. To configure the initial branch name 2026-10-25T00:57:12.8512049Z hint: to use in all of your new repositories, which will suppress this warning, 2026-10-25T00:57:12.8512396Z hint: call: 2026-10-25T00:57:12.8512592Z hint: 2026-10-25T00:57:12.8512956Z hint: git config --global init.defaultBranch 2026-10-25T00:57:12.8513354Z hint: 2026-10-25T00:57:12.8513635Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and 2026-10-25T00:57:12.8514073Z hint: 'development'. The just-created branch can be renamed via this command: 2026-10-25T00:57:12.8514427Z hint: 2026-10-25T00:57:12.8514630Z hint: git branch -m 2026-10-25T00:57:12.8514879Z hint: 2026-10-25T00:57:12.8515369Z hint: Disable this message with "git config set advice.defaultBranchName false" 2026-10-25T00:57:12.8515915Z Initialized empty Git repository in /home/runner/_work/t3code/t3code/.git/ 2026-10-25T00:57:12.8516730Z [command]/usr/local/bin/git remote add origin https://github.com/pingdotgg/t3code 2026-10-25T00:57:12.8541088Z ##[endgroup] 2026-10-25T00:57:12.8541513Z ##[group]Disabling automatic garbage collection 2026-10-25T00:57:12.8543013Z [command]/usr/local/bin/git config --local gc.auto 0 2026-10-25T00:57:12.8560938Z ##[endgroup] 2026-10-25T00:57:12.8561285Z ##[group]Setting up auth 2026-10-25T00:57:12.8561775Z Removing SSH command configuration 2026-10-25T00:57:12.8565302Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-25T00:57:12.8585055Z [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-25T00:57:12.8699738Z Removing HTTP extra header 2026-10-25T00:57:12.8702715Z [command]/usr/local/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader 2026-10-25T00:57:12.8724190Z [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-25T00:57:12.8811680Z Removing includeIf entries pointing to credentials config files 2026-10-25T00:57:12.8814769Z [command]/usr/local/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: 2026-10-25T00:57:12.8834894Z [command]/usr/local/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url 2026-10-25T00:57:12.8928180Z [command]/usr/local/bin/git config --file /home/runner/_work/_temp/git-credentials-24d716d5-05f6-4193-b9de-e15fbad01665.config http.https://github.com/.extraheader AUTHORIZATION: basic *** 2026-10-25T00:57:12.8949638Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git.path /home/runner/_work/_temp/git-credentials-24d716d5-05f6-4193-b9de-e15fbad01665.config 2026-10-25T00:57:12.8967449Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git/worktrees/*.path /home/runner/_work/_temp/git-credentials-24d716d5-05f6-4193-b9de-e15fbad01665.config 2026-10-25T00:57:12.8985438Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-24d716d5-05f6-4193-b9de-e15fbad01665.config 2026-10-25T00:57:12.9004431Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-24d716d5-05f6-4193-b9de-e15fbad01665.config 2026-10-25T00:57:12.9019658Z ##[endgroup] 2026-10-25T00:57:12.9020011Z ##[group]Fetching the repository 2026-10-25T00:57:12.9023884Z [command]/usr/local/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --filter=blob:none --depth=1 origin +5ed8b54860c6128012c2b13d489814758f794320:refs/remotes/origin/main 2026-10-25T00:57:13.1729439Z From https://github.com/pingdotgg/t3code 2026-10-25T00:57:13.1730262Z * [new ref] 5ed8b54860c6128012c2b13d489814758f794320 -> origin/main 2026-10-25T00:57:13.1752261Z [command]/usr/local/bin/git branch --list --remote origin/main 2026-10-25T00:57:13.1770747Z origin/main 2026-10-25T00:57:13.1774990Z [command]/usr/local/bin/git rev-parse refs/remotes/origin/main 2026-10-25T00:57:13.1790348Z 5ed8b54860c6128012c2b13d489814758f794320 2026-10-25T00:57:13.1792661Z ##[endgroup] 2026-10-25T00:57:13.1793371Z ##[group]Determining the checkout info 2026-10-25T00:57:13.1794201Z ##[endgroup] 2026-10-25T00:57:13.1794945Z ##[group]Setting up sparse checkout 2026-10-25T00:57:13.1795726Z [command]/usr/local/bin/git config core.sparseCheckout true 2026-10-25T00:57:13.1815661Z [command]/usr/local/bin/git rev-parse --git-path info/sparse-checkout 2026-10-25T00:57:13.1830427Z .git/info/sparse-checkout 2026-10-25T00:57:13.1833949Z ##[endgroup] 2026-10-25T00:57:13.1834871Z ##[group]Checking out the ref 2026-10-25T00:57:13.1836068Z [command]/usr/local/bin/git checkout --progress --force -B main refs/remotes/origin/main 2026-10-25T00:57:20.1997320Z Updating files: 0% (1/6433) 2026-10-25T00:57:20.2024771Z Updating files: 1% (65/6433) 2026-10-25T00:57:20.2034439Z Updating files: 2% (129/6433) 2026-10-25T00:57:20.2042952Z Updating files: 2% (154/6433) 2026-10-25T00:57:20.2063793Z Updating files: 3% (193/6433) 2026-10-25T00:57:20.2084409Z Updating files: 4% (258/6433) 2026-10-25T00:57:20.2115262Z Updating files: 5% (322/6433) 2026-10-25T00:57:20.2137159Z Updating files: 6% (386/6433) 2026-10-25T00:57:20.2188000Z Updating files: 7% (451/6433) 2026-10-25T00:57:20.2218943Z Updating files: 8% (515/6433) 2026-10-25T00:57:20.2283763Z Updating files: 9% (579/6433) 2026-10-25T00:57:20.2481250Z Updating files: 10% (644/6433) 2026-10-25T00:57:20.2562625Z Updating files: 11% (708/6433) 2026-10-25T00:57:20.2578422Z Updating files: 12% (772/6433) 2026-10-25T00:57:20.2589589Z Updating files: 13% (837/6433) 2026-10-25T00:57:20.2606020Z Updating files: 14% (901/6433) 2026-10-25T00:57:20.2622837Z Updating files: 15% (965/6433) 2026-10-25T00:57:20.2639898Z Updating files: 16% (1030/6433) 2026-10-25T00:57:20.2655443Z Updating files: 17% (1094/6433) 2026-10-25T00:57:20.2673801Z Updating files: 18% (1158/6433) 2026-10-25T00:57:20.2688409Z Updating files: 19% (1223/6433) 2026-10-25T00:57:20.2704713Z Updating files: 20% (1287/6433) 2026-10-25T00:57:20.2728141Z Updating files: 21% (1351/6433) 2026-10-25T00:57:20.2746241Z Updating files: 22% (1416/6433) 2026-10-25T00:57:20.2760191Z Updating files: 23% (1480/6433) 2026-10-25T00:57:20.2774388Z Updating files: 24% (1544/6433) 2026-10-25T00:57:20.2787278Z Updating files: 25% (1609/6433) 2026-10-25T00:57:20.2803834Z Updating files: 26% (1673/6433) 2026-10-25T00:57:20.2816601Z Updating files: 27% (1737/6433) 2026-10-25T00:57:20.2835680Z Updating files: 28% (1802/6433) 2026-10-25T00:57:20.2864417Z Updating files: 29% (1866/6433) 2026-10-25T00:57:20.2885181Z Updating files: 30% (1930/6433) 2026-10-25T00:57:20.2909613Z Updating files: 31% (1995/6433) 2026-10-25T00:57:20.2937378Z Updating files: 32% (2059/6433) 2026-10-25T00:57:20.2965535Z Updating files: 33% (2123/6433) 2026-10-25T00:57:20.3031543Z Updating files: 34% (2188/6433) 2026-10-25T00:57:20.3084273Z Updating files: 35% (2252/6433) 2026-10-25T00:57:20.3118005Z Updating files: 36% (2316/6433) 2026-10-25T00:57:20.3153011Z Updating files: 37% (2381/6433) 2026-10-25T00:57:20.3194246Z Updating files: 38% (2445/6433) 2026-10-25T00:57:20.3221965Z Updating files: 39% (2509/6433) 2026-10-25T00:57:20.3250372Z Updating files: 40% (2574/6433) 2026-10-25T00:57:20.3277692Z Updating files: 41% (2638/6433) 2026-10-25T00:57:20.3294578Z Updating files: 42% (2702/6433) 2026-10-25T00:57:20.3304888Z Updating files: 43% (2767/6433) 2026-10-25T00:57:20.3320049Z Updating files: 44% (2831/6433) 2026-10-25T00:57:20.3352648Z Updating files: 45% (2895/6433) 2026-10-25T00:57:20.3375592Z Updating files: 46% (2960/6433) 2026-10-25T00:57:20.3402667Z Updating files: 47% (3024/6433) 2026-10-25T00:57:20.3429208Z Updating files: 48% (3088/6433) 2026-10-25T00:57:20.3458164Z Updating files: 49% (3153/6433) 2026-10-25T00:57:20.3494833Z Updating files: 50% (3217/6433) 2026-10-25T00:57:20.3509736Z Updating files: 51% (3281/6433) 2026-10-25T00:57:20.3544240Z Updating files: 52% (3346/6433) 2026-10-25T00:57:20.3567673Z Updating files: 53% (3410/6433) 2026-10-25T00:57:20.3587257Z Updating files: 54% (3474/6433) 2026-10-25T00:57:20.3610897Z Updating files: 55% (3539/6433) 2026-10-25T00:57:20.3627759Z Updating files: 56% (3603/6433) 2026-10-25T00:57:20.3645189Z Updating files: 57% (3667/6433) 2026-10-25T00:57:20.3664096Z Updating files: 58% (3732/6433) 2026-10-25T00:57:20.4002621Z Updating files: 59% (3796/6433) 2026-10-25T00:57:20.4020665Z Updating files: 60% (3860/6433) 2026-10-25T00:57:20.4040211Z Updating files: 61% (3925/6433) 2026-10-25T00:57:20.4061321Z Updating files: 62% (3989/6433) 2026-10-25T00:57:20.4086118Z Updating files: 63% (4053/6433) 2026-10-25T00:57:20.4115332Z Updating files: 64% (4118/6433) 2026-10-25T00:57:20.4134370Z Updating files: 65% (4182/6433) 2026-10-25T00:57:20.4152550Z Updating files: 66% (4246/6433) 2026-10-25T00:57:20.4178290Z Updating files: 67% (4311/6433) 2026-10-25T00:57:20.4192233Z Updating files: 68% (4375/6433) 2026-10-25T00:57:20.4211532Z Updating files: 69% (4439/6433) 2026-10-25T00:57:20.4224741Z Updating files: 70% (4504/6433) 2026-10-25T00:57:20.4245487Z Updating files: 71% (4568/6433) 2026-10-25T00:57:20.4258519Z Updating files: 72% (4632/6433) 2026-10-25T00:57:20.4303559Z Updating files: 73% (4697/6433) 2026-10-25T00:57:20.4690847Z Updating files: 74% (4761/6433) 2026-10-25T00:57:20.4715399Z Updating files: 75% (4825/6433) 2026-10-25T00:57:20.4735546Z Updating files: 76% (4890/6433) 2026-10-25T00:57:20.4757111Z Updating files: 77% (4954/6433) 2026-10-25T00:57:20.4780762Z Updating files: 78% (5018/6433) 2026-10-25T00:57:20.4797362Z Updating files: 79% (5083/6433) 2026-10-25T00:57:20.4818399Z Updating files: 80% (5147/6433) 2026-10-25T00:57:20.4834369Z Updating files: 81% (5211/6433) 2026-10-25T00:57:20.4852755Z Updating files: 82% (5276/6433) 2026-10-25T00:57:20.4872855Z Updating files: 83% (5340/6433) 2026-10-25T00:57:20.4894038Z Updating files: 84% (5404/6433) 2026-10-25T00:57:20.4910886Z Updating files: 85% (5469/6433) 2026-10-25T00:57:20.4935005Z Updating files: 86% (5533/6433) 2026-10-25T00:57:20.5003646Z Updating files: 87% (5597/6433) 2026-10-25T00:57:20.5031973Z Updating files: 88% (5662/6433) 2026-10-25T00:57:20.5051398Z Updating files: 89% (5726/6433) 2026-10-25T00:57:20.5078899Z Updating files: 90% (5790/6433) 2026-10-25T00:57:20.5107546Z Updating files: 91% (5855/6433) 2026-10-25T00:57:20.5121983Z Updating files: 92% (5919/6433) 2026-10-25T00:57:20.5142832Z Updating files: 93% (5983/6433) 2026-10-25T00:57:20.5162285Z Updating files: 94% (6048/6433) 2026-10-25T00:57:20.5184334Z Updating files: 95% (6112/6433) 2026-10-25T00:57:20.5238931Z Updating files: 96% (6176/6433) 2026-10-25T00:57:20.5261085Z Updating files: 97% (6241/6433) 2026-10-25T00:57:20.5305391Z Updating files: 98% (6305/6433) 2026-10-25T00:57:20.5324312Z Updating files: 99% (6369/6433) 2026-10-25T00:57:20.5324624Z Updating files: 100% (6433/6433) 2026-10-25T00:57:20.5324760Z Updating files: 100% (6433/6433), done. 2026-10-25T00:57:20.5472793Z Switched to a new branch 'main' 2026-10-25T00:57:20.5473699Z branch 'main' set up to track 'origin/main'. 2026-10-25T00:57:20.5485308Z ##[endgroup] 2026-10-25T00:57:20.5515704Z [command]/usr/local/bin/git log -1 --format=%H 2026-10-25T00:57:20.5532716Z 5ed8b54860c6128012c2b13d489814758f794320 2026-10-25T00:57:20.5600697Z ##[group]Run files="$(git ls-files .github/pr-assets)" 2026-10-25T00:57:20.5600938Z files="$(git ls-files .github/pr-assets)" 2026-10-25T00:57:20.5601123Z if test -n "$files"; then 2026-10-25T00:57:20.5601341Z  printf 'PR evidence must be uploaded to GitHub, not committed:\n%s\n' "$files" >&2 2026-10-25T00:57:20.5601550Z  exit 1 2026-10-25T00:57:20.5601652Z fi 2026-10-25T00:57:20.5613528Z shell: /usr/bin/bash -e {0} 2026-10-25T00:57:20.5613673Z env: 2026-10-25T00:57:20.5613799Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 216 2026-10-25T00:57:20.5613946Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 361 2026-10-25T00:57:20.5614092Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T00:57:20.5614225Z ##[endgroup] 2026-10-25T00:57:20.5751080Z Prepare all required actions 2026-10-25T00:57:20.5751367Z Getting action download info 2026-10-25T00:57:20.6601087Z Download action repository 'voidzero-dev/setup-vp@v1' (SHA:250f29ce396baf5e8f24498e17c0dfdebabc26eb) 2026-10-25T00:57:20.7482807Z ##[group]Run ./.github/actions/setup-ci-deps 2026-10-25T00:57:20.7482966Z env: 2026-10-25T00:57:20.7483078Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 216 2026-10-25T00:57:20.7483224Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 361 2026-10-25T00:57:20.7483365Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T00:57:20.7483498Z ##[endgroup] 2026-10-25T00:57:20.7554803Z ##[start-action display=Resolve Vite+ version;id=__self.vp] 2026-10-25T00:57:20.7566837Z ##[group]Run echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-25T00:57:20.7567175Z echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-25T00:57:20.7567460Z echo "node=$(jq -r '.engines.node' package.json)" >> "$GITHUB_OUTPUT" 2026-10-25T00:57:20.7567690Z echo "pnpm=$(jq -r '.packageManager' package.json)" >> "$GITHUB_OUTPUT" 2026-10-25T00:57:20.7578302Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-25T00:57:20.7578466Z env: 2026-10-25T00:57:20.7578578Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 216 2026-10-25T00:57:20.7578718Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 361 2026-10-25T00:57:20.7578856Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T00:57:20.7578986Z ##[endgroup] 2026-10-25T00:57:20.7644915Z ##[end-action id=__self.vp;outcome=success;conclusion=success;duration_ms=8] 2026-10-25T00:57:20.7646584Z ##[start-action display=Cache Vite+;id=__self.vp_cache] 2026-10-25T00:57:20.7691039Z ##[group]Run actions/cache@v6 2026-10-25T00:57:20.7691435Z with: 2026-10-25T00:57:20.7691581Z path: ~/.vite-plus 2026-10-25T00:57:20.7691837Z key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-25T00:57:20.7692140Z enableCrossOsArchive: false 2026-10-25T00:57:20.7692328Z fail-on-cache-miss: false 2026-10-25T00:57:20.7692517Z lookup-only: false 2026-10-25T00:57:20.7692729Z save-always: false 2026-10-25T00:57:20.7692894Z env: 2026-10-25T00:57:20.7693072Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 216 2026-10-25T00:57:20.7693297Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 361 2026-10-25T00:57:20.7693456Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T00:57:20.7693586Z ##[endgroup] 2026-10-25T00:57:20.9609879Z Cache hit for: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-25T00:57:21.3274259Z Received 170349591 of 170349591 (100.0%), 475.0 MBs/sec 2026-10-25T00:57:21.3274992Z Cache Size: ~162 MB (170349591 B) 2026-10-25T00:57:21.3296227Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/08a0afdc-1984-4df3-acee-a19d00eabaf5/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-25T00:57:22.0162561Z Cache restored successfully 2026-10-25T00:57:22.0296577Z Cache restored from key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-25T00:57:22.0372883Z ##[end-action id=__self.vp_cache;outcome=success;conclusion=success;duration_ms=1272] 2026-10-25T00:57:22.0375295Z ##[start-action display=Use cached Vite+;id=__self.__run] 2026-10-25T00:57:22.0392130Z ##[group]Run echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-25T00:57:22.0392348Z echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-25T00:57:22.0392517Z "$HOME/.vite-plus/bin/vp" env use "26.12.1" 2026-10-25T00:57:22.0404968Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-25T00:57:22.0405132Z env: 2026-10-25T00:57:22.0405246Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 216 2026-10-25T00:57:22.0405387Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 361 2026-10-25T00:57:22.0405529Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T00:57:22.0405672Z ##[endgroup] 2026-10-25T00:57:22.0441711Z Using Node.js v26.12.1 (resolved from 26.12.1) 2026-10-25T00:57:22.0448352Z ##[end-action id=__self.__run;outcome=success;conclusion=success;duration_ms=7] 2026-10-25T00:57:22.0449584Z ##[start-action display=Setup Vite+;id=__self.__voidzero-dev_setup-vp] 2026-10-25T00:57:22.0453145Z ##[end-action id=__self.__voidzero-dev_setup-vp;outcome=skipped;conclusion=skipped;duration_ms=0] 2026-10-25T00:57:22.0454209Z ##[start-action display=Resolve pnpm store path;id=__self.pnpm_store] 2026-10-25T00:57:22.0462618Z ##[group]Run store_path="$(vp pm cache dir)" 2026-10-25T00:57:22.0462837Z store_path="$(vp pm cache dir)" 2026-10-25T00:57:22.0463209Z echo "path=$store_path" >> "$GITHUB_OUTPUT" 2026-10-25T00:57:22.0474275Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-25T00:57:22.0474447Z env: 2026-10-25T00:57:22.0474556Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 216 2026-10-25T00:57:22.0474710Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 361 2026-10-25T00:57:22.0474849Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T00:57:22.0474977Z ##[endgroup] 2026-10-25T00:57:22.0598388Z ##[end-action id=__self.pnpm_store;outcome=success;conclusion=success;duration_ms=14] 2026-10-25T00:57:22.0599671Z ##[start-action display=Cache full pnpm store;id=__self.__actions_cache] 2026-10-25T00:57:22.0919275Z ##[group]Run actions/cache@v6 2026-10-25T00:57:22.0919402Z with: 2026-10-25T00:57:22.0919526Z path: /home/runner/.local/share/pnpm/store/v11 2026-10-25T00:57:22.0919865Z key: pnpm-full-v1-Linux-X64-fe33cf74552d68b43bd4929ad8f74b63f776b4470e2e3533f781441d5e4f188c 2026-10-25T00:57:22.0920138Z restore-keys: pnpm-full-v1-Linux-X64- 2026-10-25T00:57:22.0920390Z enableCrossOsArchive: false 2026-10-25T00:57:22.0920717Z fail-on-cache-miss: false 2026-10-25T00:57:22.0920888Z lookup-only: false 2026-10-25T00:57:22.0921049Z save-always: false 2026-10-25T00:57:22.0921187Z env: 2026-10-25T00:57:22.0921345Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 216 2026-10-25T00:57:22.0921699Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 361 2026-10-25T00:57:22.0921879Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T00:57:22.0922055Z ##[endgroup] 2026-10-25T00:57:22.2773808Z Cache hit for: pnpm-full-v1-Linux-X64-fe33cf74552d68b43bd4929ad8f74b63f776b4470e2e3533f781441d5e4f188c 2026-10-25T00:57:23.3680708Z Received 671088640 of 996034848 (67.4%), 598.7 MBs/sec 2026-10-25T00:57:23.8320619Z Received 996034848 of 996034848 (100.0%), 619.6 MBs/sec 2026-10-25T00:57:23.8320976Z Cache Size: ~950 MB (996034848 B) 2026-10-25T00:57:23.8346251Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/102585fe-4f57-4528-ac90-8d9077a8426f/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-25T00:57:28.8006071Z Cache restored successfully 2026-10-25T00:57:28.8450057Z Cache restored from key: pnpm-full-v1-Linux-X64-fe33cf74552d68b43bd4929ad8f74b63f776b4470e2e3533f781441d5e4f188c 2026-10-25T00:57:28.8512887Z ##[end-action id=__self.__actions_cache;outcome=success;conclusion=success;duration_ms=6791] 2026-10-25T00:57:28.8515319Z ##[start-action display=Install dependencies;id=__self.__run_2] 2026-10-25T00:57:28.8526923Z ##[group]Run vp install 2026-10-25T00:57:28.8527124Z vp install 2026-10-25T00:57:28.8538696Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-25T00:57:28.8538859Z env: 2026-10-25T00:57:28.8538972Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 216 2026-10-25T00:57:28.8539111Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 361 2026-10-25T00:57:28.8539251Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T00:57:28.8539383Z ##[endgroup] 2026-10-25T00:57:28.8841309Z Scope: all 34 workspace projects 2026-10-25T00:57:28.9822551Z ? Verifying lockfile against supply-chain policies (2088 entries)... 2026-10-25T00:57:29.2160297Z Packages are hard linked from the content-addressable store to the virtual store. 2026-10-25T00:57:29.2161160Z Content-addressable store is at: /home/runner/.local/share/pnpm/store/v11 2026-10-25T00:57:29.2161651Z Virtual store is at: node_modules/.pnpm 2026-10-25T00:57:31.3233291Z ✓ Lockfile passes supply-chain policies (2088 entries in 2.3s) 2026-10-25T00:57:31.3233540Z Lockfile is up to date, resolution step is skipped 2026-10-25T00:57:31.3383284Z Packages: +1721 2026-10-25T00:57:31.3383485Z ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2026-10-25T00:57:31.3736710Z Progress: resolved 1721, reused 1717, downloaded 0, added 1721, done 2026-10-25T00:57:32.2656815Z . prepare$ vp config --no-agent 2026-10-25T00:57:32.3534895Z . prepare: Done 2026-10-25T00:57:32.3546905Z 2026-10-25T00:57:32.3547048Z devDependencies: 2026-10-25T00:57:32.3547247Z + @coderabbitai/config 1.1.0 2026-10-25T00:57:32.3547448Z + @shadcn/lint 0.1.5 2026-10-25T00:57:32.3547662Z + @types/node 24.12.4 2026-10-25T00:57:32.3547845Z + knip 6.34.0 2026-10-25T00:57:32.3548044Z + typescript <- @tsc-rs/typescript 0.8.0 2026-10-25T00:57:32.3548266Z + vite-plus 1.3.0 2026-10-25T00:57:32.3548368Z 2026-10-25T00:57:32.3561064Z Done in 3.5s using pnpm v12.14.0 2026-10-25T00:57:32.3708863Z ##[end-action id=__self.__run_2;outcome=success;conclusion=success;duration_ms=3519] 2026-10-25T00:57:32.4164905Z ##[group]Run actions/cache@v6 2026-10-25T00:57:32.4165040Z with: 2026-10-25T00:57:32.4165142Z path: ~/.cache/electron 2026-10-25T00:57:32.4165354Z key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-25T00:57:32.4165577Z enableCrossOsArchive: false 2026-10-25T00:57:32.4165706Z fail-on-cache-miss: false 2026-10-25T00:57:32.4165824Z lookup-only: false 2026-10-25T00:57:32.4165934Z save-always: false 2026-10-25T00:57:32.4166042Z env: 2026-10-25T00:57:32.4166151Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 216 2026-10-25T00:57:32.4166289Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 361 2026-10-25T00:57:32.4166440Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T00:57:32.4166573Z ##[endgroup] 2026-10-25T00:57:32.5995620Z Cache hit for: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-25T00:57:32.7478822Z Received 122906203 of 122906203 (100.0%), 888.0 MBs/sec 2026-10-25T00:57:32.7479118Z Cache Size: ~117 MB (122906203 B) 2026-10-25T00:57:32.7490878Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/941a3398-6684-466c-94ee-d9ad8116e44d/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-25T00:57:32.8195568Z Cache restored successfully 2026-10-25T00:57:32.8362172Z Cache restored from key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-25T00:57:32.8510904Z ##[group]Run vp run --filter @t3tools/desktop ensure:electron 2026-10-25T00:57:32.8511273Z vp run --filter @t3tools/desktop ensure:electron 2026-10-25T00:57:32.8524034Z shell: /usr/bin/bash -e {0} 2026-10-25T00:57:32.8524164Z env: 2026-10-25T00:57:32.8524453Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 216 2026-10-25T00:57:32.8524600Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 361 2026-10-25T00:57:32.8524740Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T00:57:32.8524875Z ##[endgroup] 2026-10-25T00:57:33.0032877Z ~/apps/desktop$ node scripts/ensure-electron-runtime.mjs ⊘ cache disabled 2026-10-25T00:57:33.5399520Z /home/runner/_work/t3code/t3code/node_modules/.pnpm/electron@44.9.3_supports-color@8.1.1/node_modules/electron/dist/electron 2026-10-25T00:57:33.5431159Z 2026-10-25T00:57:33.5568001Z ##[group]Run vp run knip:check 2026-10-25T00:57:33.5568342Z vp run knip:check 2026-10-25T00:57:33.5585076Z shell: /usr/bin/bash -e {0} 2026-10-25T00:57:33.5585215Z env: 2026-10-25T00:57:33.5585355Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 216 2026-10-25T00:57:33.5585837Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 361 2026-10-25T00:57:33.5586015Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T00:57:33.5586174Z ##[endgroup] 2026-10-25T00:57:33.7209390Z $ knip --include files,dependencies --no-config-hints ⊘ cache disabled 2026-10-25T00:57:37.2286963Z 2026-10-25T00:57:37.2290061Z $ 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-25T00:57:45.0137901Z 2026-10-25T00:57:45.0138970Z --- 2026-10-25T00:57:45.0139234Z vp run: 2/2 successful. (Run `vp run --last-details` for full details) 2026-10-25T00:57:45.0205131Z ##[group]Run vp run --filter @t3tools/source-control-github generate --check 2026-10-25T00:57:45.0205410Z vp run --filter @t3tools/source-control-github generate --check 2026-10-25T00:57:45.0217030Z shell: /usr/bin/bash -e {0} 2026-10-25T00:57:45.0217165Z env: 2026-10-25T00:57:45.0217279Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 216 2026-10-25T00:57:45.0217431Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 361 2026-10-25T00:57:45.0217578Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T00:57:45.0217710Z ##[endgroup] 2026-10-25T00:57:45.1608020Z ~/packages/source-control-github$ graphqlgen --check ⊘ cache disabled 2026-10-25T00:57:45.3441090Z 2026-10-25T00:57:45.3552673Z ##[group]Run vp run --filter t3 generate --check 2026-10-25T00:57:45.3552887Z vp run --filter t3 generate --check 2026-10-25T00:57:45.3564320Z shell: /usr/bin/bash -e {0} 2026-10-25T00:57:45.3564446Z env: 2026-10-25T00:57:45.3564564Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 216 2026-10-25T00:57:45.3564707Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 361 2026-10-25T00:57:45.3564851Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T00:57:45.3564984Z ##[endgroup] 2026-10-25T00:57:45.4988205Z ~/apps/server$ graphqlgen --check ⊘ cache disabled 2026-10-25T00:57:45.6505976Z 2026-10-25T00:57:45.6573234Z ##[group]Run vp check 2026-10-25T00:57:45.6573396Z vp check 2026-10-25T00:57:45.6585462Z shell: /usr/bin/bash -e {0} 2026-10-25T00:57:45.6585598Z env: 2026-10-25T00:57:45.6585711Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 216 2026-10-25T00:57:45.6585865Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 361 2026-10-25T00:57:45.6586013Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T00:57:45.6586151Z ##[endgroup] 2026-10-25T00:57:46.1686855Z pass: All 5760 files are correctly formatted (368ms, 8 threads) 2026-10-25T00:57:51.6231520Z warn: Lint warnings found 2026-10-25T00:57:51.6232696Z ⚠ eslint(no-unused-vars): Type 'EnvironmentId' is imported but never used. 2026-10-25T00:57:51.6233058Z ╭─[packages/client-runtime/src/state/sharedSettings.ts:2:3] 2026-10-25T00:57:51.6233304Z 1 │ import type { 2026-10-25T00:57:51.6233453Z 2 │ EnvironmentId, 2026-10-25T00:57:51.6233621Z ·  ──────┬────── 2026-10-25T00:57:51.6233857Z · ╰── 'EnvironmentId' is imported here 2026-10-25T00:57:51.6234079Z 3 │ ExecutionEnvironmentCapabilities, 2026-10-25T00:57:51.6234241Z ╰──── 2026-10-25T00:57:51.6234394Z  help: Consider removing this import. 2026-10-25T00:57:51.6234517Z 2026-10-25T00:57:51.6234792Z ⚠ eslint(no-unused-vars): Variable 'claudeCaps' is declared but never used. Unused variables should start with a '_'. 2026-10-25T00:57:51.6235160Z ╭─[packages/shared/src/model.test.ts:36:7] 2026-10-25T00:57:51.6235333Z 35 │ 2026-10-25T00:57:51.6235531Z 36 │ const claudeCaps: ModelCapabilities = createModelCapabilities({ 2026-10-25T00:57:51.6235752Z ·  ─────┬──── 2026-10-25T00:57:51.6235978Z · ╰── 'claudeCaps' is declared here 2026-10-25T00:57:51.6236182Z 37 │ optionDescriptors: [ 2026-10-25T00:57:51.6236320Z ╰──── 2026-10-25T00:57:51.6236480Z  help: Consider removing this declaration. 2026-10-25T00:57:51.6236599Z 2026-10-25T00:57:51.6237064Z ⚠ 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-25T00:57:51.6237650Z ╭─[apps/server/src/project/ProjectEnrichmentService.test.ts:28:3] 2026-10-25T00:57:51.6237874Z 27 │ ) { 2026-10-25T00:57:51.6238141Z 28 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T00:57:51.6238472Z 29 │ │ const available = yield* service.peek(workspaceRoot); 2026-10-25T00:57:51.6238739Z 30 │ │ if (predicate(available)) return available; 2026-10-25T00:57:51.6238984Z 31 │ │ yield* Effect.yieldNow; 2026-10-25T00:57:51.6239213Z 32 │ ╰─▶ } 2026-10-25T00:57:51.6239518Z 33 │ return yield* Effect.die(`Project metadata for ${workspaceRoot} was not resolved in time.`); 2026-10-25T00:57:51.6239748Z ╰──── 2026-10-25T00:57:51.6239804Z 2026-10-25T00:57:51.6240263Z ⚠ 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-25T00:57:51.6241131Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:169:7] 2026-10-25T00:57:51.6241362Z 168 │ }); 2026-10-25T00:57:51.6241626Z 169 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-25T00:57:51.6241988Z 170 │ │ if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break; 2026-10-25T00:57:51.6242289Z 171 │ │ yield* Effect.yieldNow; 2026-10-25T00:57:51.6242535Z 172 │ ╰─▶ } 2026-10-25T00:57:51.6242859Z 173 │ 2026-10-25T00:57:51.6243021Z ╰──── 2026-10-25T00:57:51.6243074Z 2026-10-25T00:57:51.6243551Z ⚠ 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-25T00:57:51.6244116Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:178:7] 2026-10-25T00:57:51.6244370Z 177 │ yield* Deferred.succeed(releaseSave, undefined); 2026-10-25T00:57:51.6244676Z 178 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-25T00:57:51.6244978Z 179 │ │ if ((yield* Ref.get(saved)).length > 0) break; 2026-10-25T00:57:51.6245217Z 180 │ │ yield* Effect.yieldNow; 2026-10-25T00:57:51.6245460Z 181 │ ╰─▶ } 2026-10-25T00:57:51.6245655Z 182 │ 2026-10-25T00:57:51.6245766Z ╰──── 2026-10-25T00:57:51.6245828Z 2026-10-25T00:57:51.6246272Z ⚠ 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-25T00:57:51.6246810Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7] 2026-10-25T00:57:51.6247084Z 306 │ yield* Deferred.succeed(releaseUnenrichedSave, undefined); 2026-10-25T00:57:51.6247400Z 307 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-25T00:57:51.6247697Z 308 │ │ const values = yield* Ref.get(saved); 2026-10-25T00:57:51.6248021Z 309 │ │ if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) { 2026-10-25T00:57:51.6248295Z 310 │ │ break; 2026-10-25T00:57:51.6248471Z 311 │ │ } 2026-10-25T00:57:51.6248667Z 312 │ │ yield* Effect.yieldNow; 2026-10-25T00:57:51.6248911Z 313 │ ╰─▶ } 2026-10-25T00:57:51.6249093Z 314 │ 2026-10-25T00:57:51.6249207Z ╰──── 2026-10-25T00:57:51.6249264Z 2026-10-25T00:57:51.6249426Z ⚠ eslint(no-control-regex): Unexpected control character 2026-10-25T00:57:51.6249780Z ╭─[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46] 2026-10-25T00:57:51.6250110Z 219 │ 2026-10-25T00:57:51.6250397Z 220 │ {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")} 2026-10-25T00:57:51.6250648Z ·  ──┬─ 2026-10-25T00:57:51.6250924Z · ╰── 'U+001B' is a control character. 2026-10-25T00:57:51.6251221Z 221 │ 2026-10-25T00:57:51.6251378Z ╰──── 2026-10-25T00:57:51.6251656Z  help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression. 2026-10-25T00:57:51.6251878Z 2026-10-25T00:57:51.6252079Z ⚠ eslint(no-unused-vars): Type 'ScheduledTaskDraft' is imported but never used. 2026-10-25T00:57:51.6252478Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:10:8] 2026-10-25T00:57:51.6252749Z  9 │ hasScheduledTaskDraftChanges, 2026-10-25T00:57:51.6252916Z 10 │ type ScheduledTaskDraft, 2026-10-25T00:57:51.6253104Z ·  ─────────┬──────── 2026-10-25T00:57:51.6253367Z · ╰── 'ScheduledTaskDraft' is imported here 2026-10-25T00:57:51.6253585Z 11 │ } from "./scheduledTaskDraft"; 2026-10-25T00:57:51.6253729Z ╰──── 2026-10-25T00:57:51.6253876Z  help: Consider removing this import. 2026-10-25T00:57:51.6253991Z 2026-10-25T00:57:51.6254167Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-25T00:57:51.6254492Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:81:85] 2026-10-25T00:57:51.6254755Z 80 │ const startEditor = startScheduledTaskEditor; 2026-10-25T00:57:51.6255060Z 81 │ const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]); 2026-10-25T00:57:51.6255379Z ·  ─────┬───── 2026-10-25T00:57:51.6255709Z · ╰── Unnecessary dependency `startEditor` 2026-10-25T00:57:51.6255966Z 82 │ const readEditor = useCallback( 2026-10-25T00:57:51.6256110Z ╰──── 2026-10-25T00:57:51.6256466Z  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-25T00:57:51.6257073Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6257362Z 2026-10-25T00:57:51.6257537Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-25T00:57:51.6257864Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:102:7] 2026-10-25T00:57:51.6258086Z 101 │ setEditor, 2026-10-25T00:57:51.6258224Z 102 │ startEditor, 2026-10-25T00:57:51.6258376Z ·  ─────┬───── 2026-10-25T00:57:51.6258605Z · ╰── Unnecessary dependency `startEditor` 2026-10-25T00:57:51.6258804Z 103 │ hasChanges, 2026-10-25T00:57:51.6258932Z ╰──── 2026-10-25T00:57:51.6259282Z  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-25T00:57:51.6259867Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6260154Z 2026-10-25T00:57:51.6260597Z ⚠ 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-25T00:57:51.6261130Z ╭─[apps/server/src/project/ProjectService.test.ts:94:3] 2026-10-25T00:57:51.6261322Z 93 │ ) { 2026-10-25T00:57:51.6261580Z 94 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T00:57:51.6261924Z 95 │ │ const project = Option.getOrThrow(yield* service.getById(projectId)); 2026-10-25T00:57:51.6262245Z 96 │ │ if (predicate(project)) return project; 2026-10-25T00:57:51.6262521Z 97 │ │ yield* Effect.yieldNow; 2026-10-25T00:57:51.6262755Z 98 │ ╰─▶ } 2026-10-25T00:57:51.6263025Z 99 │ return yield* Effect.die(`Project ${projectId} was not enriched in time.`); 2026-10-25T00:57:51.6263233Z ╰──── 2026-10-25T00:57:51.6263312Z 2026-10-25T00:57:51.6263562Z ⚠ eslint(no-unused-vars): Function 'promptResponseHasMissingXAiStopReason' is declared but never used. 2026-10-25T00:57:51.6281008Z ╭─[packages/provider-grok/src/server/xaiAcpExtension.ts:1620:10] 2026-10-25T00:57:51.6281243Z 1619 │ 2026-10-25T00:57:51.6281523Z 1620 │ function promptResponseHasMissingXAiStopReason(response: EffectAcpSchema.PromptResponse): boolean { 2026-10-25T00:57:51.6281881Z ·  ──────────────────┬────────────────── 2026-10-25T00:57:51.6282236Z · ╰── 'promptResponseHasMissingXAiStopReason' is declared here 2026-10-25T00:57:51.6282508Z 1621 │ const meta = response._meta; 2026-10-25T00:57:51.6282659Z ╰──── 2026-10-25T00:57:51.6282822Z  help: Consider removing this declaration. 2026-10-25T00:57:51.6282944Z 2026-10-25T00:57:51.6283151Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-25T00:57:51.6283804Z ╭─[apps/web/src/contextMenuFallback.test.ts:38:9] 2026-10-25T00:57:51.6284034Z 37 │ get isConnected() { 2026-10-25T00:57:51.6284216Z 38 │ let current: FakeElement | null = this; 2026-10-25T00:57:51.6284404Z ·  ─────── 2026-10-25T00:57:51.6284585Z 39 │ while (current?.parent) { 2026-10-25T00:57:51.6284730Z ╰──── 2026-10-25T00:57:51.6285055Z  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-25T00:57:51.6285312Z 2026-10-25T00:57:51.6285781Z ⚠ 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-25T00:57:51.6286372Z ╭─[apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts:223:5] 2026-10-25T00:57:51.6286614Z 222 │ let idlePasses = 0; 2026-10-25T00:57:51.6286857Z 223 │ ╭─▶ for (;;) { 2026-10-25T00:57:51.6287140Z 224 │ │ yield* Effect.promise(() => Promise.resolve()); 2026-10-25T00:57:51.6287523Z 225 │ │ const pending = backgroundRuntime.pending.shift(); 2026-10-25T00:57:51.6287762Z 226 │ │ if (!pending) { 2026-10-25T00:57:51.6287963Z 227 │ │ idlePasses++; 2026-10-25T00:57:51.6288171Z 228 │ │ if (idlePasses >= 3) { 2026-10-25T00:57:51.6288372Z 229 │ │ return; 2026-10-25T00:57:51.6288551Z 230 │ │ } 2026-10-25T00:57:51.6288734Z 231 │ │ continue; 2026-10-25T00:57:51.6288907Z 232 │ │ } 2026-10-25T00:57:51.6289092Z 233 │ │ idlePasses = 0; 2026-10-25T00:57:51.6289309Z 234 │ │ const exit = yield* Effect.exit( 2026-10-25T00:57:51.6289845Z 235 │ │ pending.operation as Effect.Effect, 2026-10-25T00:57:51.6290202Z 236 │ │ ); 2026-10-25T00:57:51.6290400Z 237 │ │ yield* Effect.sync(() => { 2026-10-25T00:57:51.6290621Z 238 │ │ pending.resolve(exit); 2026-10-25T00:57:51.6290810Z 239 │ │ }); 2026-10-25T00:57:51.6291033Z 240 │ ╰─▶ } 2026-10-25T00:57:51.6291223Z 241 │ }, 2026-10-25T00:57:51.6291345Z ╰──── 2026-10-25T00:57:51.6291401Z 2026-10-25T00:57:51.6291569Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-25T00:57:51.6291873Z ╭─[apps/server/src/process/externalLauncher.test.ts:186:12] 2026-10-25T00:57:51.6292077Z 185 │ 2026-10-25T00:57:51.6292241Z 186 │ for (const {} of ["darwin", "linux"] as const) { 2026-10-25T00:57:51.6292428Z ·  ── 2026-10-25T00:57:51.6292568Z 187 │ } 2026-10-25T00:57:51.6292685Z ╰──── 2026-10-25T00:57:51.6292963Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-25T00:57:51.6293183Z 2026-10-25T00:57:51.6293377Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-25T00:57:51.6293672Z ╭─[apps/server/src/process/externalLauncher.test.ts:189:12] 2026-10-25T00:57:51.6293867Z 188 │ 2026-10-25T00:57:51.6293990Z 189 │ for (const {} of [ 2026-10-25T00:57:51.6294140Z ·  ── 2026-10-25T00:57:51.6294311Z 190 │ { kind: "browser", folderVerb: "none" }, 2026-10-25T00:57:51.6294472Z ╰──── 2026-10-25T00:57:51.6294742Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-25T00:57:51.6294959Z 2026-10-25T00:57:51.6295121Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-25T00:57:51.6295410Z ╭─[apps/server/src/process/externalLauncher.test.ts:311:12] 2026-10-25T00:57:51.6295603Z 310 │ 2026-10-25T00:57:51.6295782Z 311 │ for (const {} of ["rejected", "spawn-error", "stalled"] as const) { 2026-10-25T00:57:51.6295981Z ·  ── 2026-10-25T00:57:51.6296119Z 312 │ } 2026-10-25T00:57:51.6296228Z ╰──── 2026-10-25T00:57:51.6296504Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-25T00:57:51.6296718Z 2026-10-25T00:57:51.6296879Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-25T00:57:51.6297175Z ╭─[apps/server/src/process/externalLauncher.test.ts:314:12] 2026-10-25T00:57:51.6297367Z 313 │ 2026-10-25T00:57:51.6297487Z 314 │ for (const {} of [ 2026-10-25T00:57:51.6297634Z ·  ── 2026-10-25T00:57:51.6297772Z 315 │ { 2026-10-25T00:57:51.6297882Z ╰──── 2026-10-25T00:57:51.6298149Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-25T00:57:51.6298363Z 2026-10-25T00:57:51.6298733Z ⚠ 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-25T00:57:51.6299239Z ╭─[packages/shared/src/otelEnvironment.ts:146:14] 2026-10-25T00:57:51.6299455Z 145 │ name, 2026-10-25T00:57:51.6299662Z 146 │ (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()), 2026-10-25T00:57:51.6299914Z ·  ────────────────────────── 2026-10-25T00:57:51.6300142Z 147 │ `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`, 2026-10-25T00:57:51.6300322Z ╰──── 2026-10-25T00:57:51.6300380Z 2026-10-25T00:57:51.6300636Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-25T00:57:51.6301007Z ╭─[apps/server/src/telemetry/AnalyticsService.ts:340:7] 2026-10-25T00:57:51.6301192Z 339 │ 2026-10-25T00:57:51.6301353Z 340 │ const layerTest = AnalyticsService.layerTest; 2026-10-25T00:57:51.6301542Z ·  ────┬──── 2026-10-25T00:57:51.6301767Z · ╰── 'layerTest' is declared here 2026-10-25T00:57:51.6301951Z ╰──── 2026-10-25T00:57:51.6302152Z  help: Consider removing this declaration. 2026-10-25T00:57:51.6302270Z 2026-10-25T00:57:51.6302518Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T00:57:51.6302879Z ╭─[packages/provider-grok/src/server/adapter.ts:427:7] 2026-10-25T00:57:51.6303070Z 426 │ 2026-10-25T00:57:51.6303196Z 427 │ const layer: Layer.Layer< 2026-10-25T00:57:51.6303383Z ·  ──┬── 2026-10-25T00:57:51.6303587Z · ╰── 'layer' is declared here 2026-10-25T00:57:51.6303803Z 428 │ ProviderAdapter.ProviderAdapterV2, 2026-10-25T00:57:51.6303963Z ╰──── 2026-10-25T00:57:51.6304121Z  help: Consider removing this declaration. 2026-10-25T00:57:51.6304241Z 2026-10-25T00:57:51.6304383Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6304682Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39] 2026-10-25T00:57:51.6304900Z 276 │ 2026-10-25T00:57:51.6305135Z 277 │ ╭─▶ return createElement(RawNativeView, { 2026-10-25T00:57:51.6305395Z 278 │ │ ...nativeProps, 2026-10-25T00:57:51.6305639Z 279 │ │ refreshEnabled: props.onPullToRefresh !== undefined, 2026-10-25T00:57:51.6305879Z 280 │ │ ref: nativeRef, 2026-10-25T00:57:51.6306107Z 281 │ ├─▶ }); 2026-10-25T00:57:51.6306524Z · ╰──── Passing a ref to a function may read its value during render 2026-10-25T00:57:51.6307049Z 282 │ } 2026-10-25T00:57:51.6307163Z ╰──── 2026-10-25T00:57:51.6307674Z  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-25T00:57:51.6308379Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6308649Z 2026-10-25T00:57:51.6308803Z ⚠ react(immutability): This value cannot be modified 2026-10-25T00:57:51.6309125Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:42:5] 2026-10-25T00:57:51.6309354Z 35 │ 2026-10-25T00:57:51.6309546Z 36 │ const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0); 2026-10-25T00:57:51.6309780Z ·  ────────┬──────── 2026-10-25T00:57:51.6310020Z · ╰── `inspectorProgress` originates here 2026-10-25T00:57:51.6310258Z 37 │ const { renderedInspectorWidth } = props; 2026-10-25T00:57:51.6310493Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-25T00:57:51.6310686Z 39 │ 2026-10-25T00:57:51.6310822Z 40 │ const onClosed = props.onClosed; 2026-10-25T00:57:51.6310990Z 41 │ useEffect(() => { 2026-10-25T00:57:51.6311160Z 42 │ inspectorProgress.value = withTiming( 2026-10-25T00:57:51.6311346Z ·  ────────┬──────── 2026-10-25T00:57:51.6311587Z · ╰── `inspectorProgress` cannot be modified 2026-10-25T00:57:51.6311811Z 43 │ inspectorVisible ? 1 : 0, 2026-10-25T00:57:51.6311954Z ╰──── 2026-10-25T00:57:51.6312265Z  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-25T00:57:51.6312814Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T00:57:51.6313101Z 2026-10-25T00:57:51.6313277Z ⚠ react(immutability): This value cannot be modified 2026-10-25T00:57:51.6313590Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:67:7] 2026-10-25T00:57:51.6313841Z 37 │ const { renderedInspectorWidth } = props; 2026-10-25T00:57:51.6314084Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-25T00:57:51.6314314Z ·  ──────────┬───────── 2026-10-25T00:57:51.6314566Z · ╰── `renderedContentWidth` originates here 2026-10-25T00:57:51.6314763Z 39 │ 2026-10-25T00:57:51.6314900Z 40 │ const onClosed = props.onClosed; 2026-10-25T00:57:51.6315062Z 41 │ useEffect(() => { 2026-10-25T00:57:51.6315232Z 42 │ inspectorProgress.value = withTiming( 2026-10-25T00:57:51.6315413Z 43 │ inspectorVisible ? 1 : 0, 2026-10-25T00:57:51.6315577Z 44 │ WORKSPACE_PANE_TIMING, 2026-10-25T00:57:51.6315731Z 45 │ (finished) => { 2026-10-25T00:57:51.6315948Z 46 │ if (finished === true && !inspectorVisible && onClosed !== undefined) { 2026-10-25T00:57:51.6316161Z 47 │ runOnJS(onClosed)(); 2026-10-25T00:57:51.6316307Z 48 │ } 2026-10-25T00:57:51.6316546Z 49 │ }, 2026-10-25T00:57:51.6316703Z 50 │ ); 2026-10-25T00:57:51.6316896Z 51 │ const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0; 2026-10-25T00:57:51.6317113Z 52 │ renderedInspectorWidth.set( 2026-10-25T00:57:51.6317352Z 53 │ resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING), 2026-10-25T00:57:51.6317556Z 54 │ ); 2026-10-25T00:57:51.6317673Z 55 │ }, [ 2026-10-25T00:57:51.6317807Z 56 │ inspectorProgress, 2026-10-25T00:57:51.6317957Z 57 │ inspectorVisible, 2026-10-25T00:57:51.6318108Z 58 │ inspectorWidth, 2026-10-25T00:57:51.6318248Z 59 │ onClosed, 2026-10-25T00:57:51.6318395Z 60 │ renderedInspectorWidth, 2026-10-25T00:57:51.6318544Z 61 │ resizing, 2026-10-25T00:57:51.6318670Z 62 │ ]); 2026-10-25T00:57:51.6318784Z 63 │ 2026-10-25T00:57:51.6318912Z 64 │ useEffect(() => { 2026-10-25T00:57:51.6319087Z 65 │ const targetWidth = inspectorWidth ?? 0; 2026-10-25T00:57:51.6319278Z 66 │ if (!inspectorVisible || resizing) { 2026-10-25T00:57:51.6319477Z 67 │ renderedContentWidth.value = targetWidth; 2026-10-25T00:57:51.6319673Z ·  ──────────┬───────── 2026-10-25T00:57:51.6319925Z · ╰── `renderedContentWidth` cannot be modified 2026-10-25T00:57:51.6320133Z 68 │ return; 2026-10-25T00:57:51.6320257Z ╰──── 2026-10-25T00:57:51.6320636Z  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-25T00:57:51.6321177Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T00:57:51.6321461Z 2026-10-25T00:57:51.6321658Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T00:57:51.6322000Z ╭─[apps/mobile/src/features/terminal/TerminalContextSheet.tsx:72:15] 2026-10-25T00:57:51.6322222Z 71 │ ({ key: input.targetKey, location: candidate })); 2026-10-25T00:57:51.6324474Z 113 │ useEffect(() => { 2026-10-25T00:57:51.6324630Z ·  ────┬──── 2026-10-25T00:57:51.6324842Z · ╰── This is the containing effect 2026-10-25T00:57:51.6325140Z 114 │ if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) { 2026-10-25T00:57:51.6325366Z 115 │ return; 2026-10-25T00:57:51.6325499Z 116 │ } 2026-10-25T00:57:51.6325680Z 117 │ setEntry({ key: input.targetKey, location: candidate }); 2026-10-25T00:57:51.6325879Z ·  ────┬─── 2026-10-25T00:57:51.6326125Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.6326474Z 118 │ }, [candidate, entry.key, entry.location, input.targetKey]); 2026-10-25T00:57:51.6326697Z ╰──── 2026-10-25T00:57:51.6327337Z  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-25T00:57:51.6328181Z  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-25T00:57:51.6328486Z 2026-10-25T00:57:51.6328714Z ⚠ eslint(no-unneeded-ternary): Unnecessary use of boolean literals in conditional expression 2026-10-25T00:57:51.6329059Z ╭─[packages/shared/src/serverSettings.test.ts:35:7] 2026-10-25T00:57:51.6329373Z 34 │ const fallback = fallbackTextGenerationModelSelection(providerInstances, (instanceId) => 2026-10-25T00:57:51.6329647Z 35 │ instanceId === configured ? true : false, 2026-10-25T00:57:51.6329874Z ·  ──────────────────────────────────────── 2026-10-25T00:57:51.6330045Z 36 │ ); 2026-10-25T00:57:51.6330163Z ╰──── 2026-10-25T00:57:51.6330314Z  help: Remove this ternary operator 2026-10-25T00:57:51.6330427Z 2026-10-25T00:57:51.6330621Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T00:57:51.6330974Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:167:7] 2026-10-25T00:57:51.6331191Z 166 │ } 2026-10-25T00:57:51.6331326Z 167 │ }, [wrappedRender]); 2026-10-25T00:57:51.6331498Z ·  ──────┬────── 2026-10-25T00:57:51.6331753Z · ╰── Unnecessary dependency `wrappedRender` 2026-10-25T00:57:51.6331953Z 168 │ 2026-10-25T00:57:51.6332067Z ╰──── 2026-10-25T00:57:51.6332407Z  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-25T00:57:51.6332982Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6333289Z 2026-10-25T00:57:51.6333530Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-25T00:57:51.6333924Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:843:42] 2026-10-25T00:57:51.6334151Z 842 │ > 2026-10-25T00:57:51.6334346Z 843 │ 2026-10-25T00:57:51.6334608Z ·  ──────────────────── 2026-10-25T00:57:51.6334831Z 844 │ 2026-10-25T00:57:51.6335001Z ╰──── 2026-10-25T00:57:51.6335275Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-25T00:57:51.6335626Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-25T00:57:51.6335801Z 2026-10-25T00:57:51.6335943Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6336209Z ╭─[apps/mobile/src/native/StackHeader.tsx:210:9] 2026-10-25T00:57:51.6336450Z 209 │ "options", 2026-10-25T00:57:51.6336667Z 210 │ latestOptionFunctionsRef.current, 2026-10-25T00:57:51.6336886Z ·  ────────────────┬─────────────── 2026-10-25T00:57:51.6337195Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T00:57:51.6337473Z 211 │ optionFunctionWrappersRef.current, 2026-10-25T00:57:51.6337646Z ╰──── 2026-10-25T00:57:51.6338160Z  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-25T00:57:51.6338859Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6339145Z 2026-10-25T00:57:51.6339292Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6339561Z ╭─[apps/mobile/src/native/StackHeader.tsx:211:9] 2026-10-25T00:57:51.6339779Z 210 │ latestOptionFunctionsRef.current, 2026-10-25T00:57:51.6339983Z 211 │ optionFunctionWrappersRef.current, 2026-10-25T00:57:51.6340206Z ·  ────────────────┬──────────────── 2026-10-25T00:57:51.6340518Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T00:57:51.6340790Z 212 │ ) as NativeStackNavigationOptions) 2026-10-25T00:57:51.6340950Z ╰──── 2026-10-25T00:57:51.6341463Z  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-25T00:57:51.6342163Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6342436Z 2026-10-25T00:57:51.6342633Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T00:57:51.6342975Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7] 2026-10-25T00:57:51.6343224Z 256 │ return () => cancelAnimationFrame(frame); 2026-10-25T00:57:51.6343442Z 257 │ }, [props.path, targetIndex]); 2026-10-25T00:57:51.6343616Z ·  ─────┬──── 2026-10-25T00:57:51.6343854Z · ╰── Unnecessary dependency `props.path` 2026-10-25T00:57:51.6344057Z 258 │ 2026-10-25T00:57:51.6344169Z ╰──── 2026-10-25T00:57:51.6344512Z  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-25T00:57:51.6345085Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6345376Z 2026-10-25T00:57:51.6345568Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T00:57:51.6345906Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23] 2026-10-25T00:57:51.6346129Z 292 │ 2026-10-25T00:57:51.6348456Z ·  ─────────── 2026-10-25T00:57:51.6348629Z 310 │ {body} 2026-10-25T00:57:51.6348766Z ╰──── 2026-10-25T00:57:51.6348969Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-25T00:57:51.6349128Z 2026-10-25T00:57:51.6349380Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T00:57:51.6349759Z ╭─[apps/mobile/src/components/ProjectFavicon.tsx:172:5] 2026-10-25T00:57:51.6350084Z 167 │ const [activeFaviconRequest, setActiveFaviconRequest] = useState(null); 2026-10-25T00:57:51.6350349Z 168 │ useLayoutEffect(() => { 2026-10-25T00:57:51.6350518Z ·  ───────┬─────── 2026-10-25T00:57:51.6350746Z · ╰── This is the containing effect 2026-10-25T00:57:51.6350974Z 169 │ if (faviconRequest === null) return; 2026-10-25T00:57:51.6351136Z 170 │ 2026-10-25T00:57:51.6351325Z 171 │ const endRequest = beginProjectFaviconRequest(faviconRequest); 2026-10-25T00:57:51.6351576Z 172 │ setActiveFaviconRequest(faviconRequest); 2026-10-25T00:57:51.6351783Z ·  ───────────┬─────────── 2026-10-25T00:57:51.6352060Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.6352298Z 173 │ return endRequest; 2026-10-25T00:57:51.6352438Z ╰──── 2026-10-25T00:57:51.6353086Z  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-25T00:57:51.6354027Z  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-25T00:57:51.6369241Z 2026-10-25T00:57:51.6369561Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T00:57:51.6369966Z ╭─[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5] 2026-10-25T00:57:51.6370172Z 150 │ 2026-10-25T00:57:51.6370298Z 151 │ useEffect(() => { 2026-10-25T00:57:51.6370454Z ·  ────┬──── 2026-10-25T00:57:51.6370675Z · ╰── This is the containing effect 2026-10-25T00:57:51.6370892Z 152 │ if (!controlledSelectedPath) { 2026-10-25T00:57:51.6371054Z 153 │ return; 2026-10-25T00:57:51.6371180Z 154 │ } 2026-10-25T00:57:51.6371322Z 155 │ setExpandedPaths((current) => { 2026-10-25T00:57:51.6371499Z ·  ────────┬─────── 2026-10-25T00:57:51.6371769Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.6372058Z 156 │ const ancestors = ancestorPaths(controlledSelectedPath); 2026-10-25T00:57:51.6372244Z ╰──── 2026-10-25T00:57:51.6372888Z  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-25T00:57:51.6373769Z  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-25T00:57:51.6374068Z 2026-10-25T00:57:51.6374328Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T00:57:51.6374723Z ╭─[apps/mobile/src/components/VideoPreviewModal.ios.tsx:63:55] 2026-10-25T00:57:51.6374929Z 61 │ }, []); 2026-10-25T00:57:51.6375058Z 62 │ useEffect(() => { 2026-10-25T00:57:51.6375210Z ·  ────┬──── 2026-10-25T00:57:51.6375427Z · ╰── This is the containing effect 2026-10-25T00:57:51.6375705Z 63 │ if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl); 2026-10-25T00:57:51.6375981Z ·  ───────┬────── 2026-10-25T00:57:51.6376309Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.6376574Z 64 │ }, [playbackUrl, resolvedUrl]); 2026-10-25T00:57:51.6376734Z ╰──── 2026-10-25T00:57:51.6377370Z  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-25T00:57:51.6378204Z  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-25T00:57:51.6378503Z 2026-10-25T00:57:51.6378698Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T00:57:51.6379035Z ╭─[apps/mobile/src/components/ComposerContextSheet.tsx:272:25] 2026-10-25T00:57:51.6379410Z 271 │ {record.elements?.map((element, index) => ( 2026-10-25T00:57:51.6379739Z 272 │ 2026-10-25T00:57:51.6380070Z ·  ─────────────────────────────────────────────────────── 2026-10-25T00:57:51.6380296Z 273 │ (VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-25T00:57:51.6381888Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-25T00:57:51.6382151Z ·  ───────────┬────────── 2026-10-25T00:57:51.6382457Z · ╰── Cannot access ref value during render 2026-10-25T00:57:51.6382741Z 123 │ const sessionRef = useRef(null); 2026-10-25T00:57:51.6382931Z ╰──── 2026-10-25T00:57:51.6383484Z  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-25T00:57:51.6384188Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6384464Z 2026-10-25T00:57:51.6384612Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6384926Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8] 2026-10-25T00:57:51.6385143Z 125 │ 2026-10-25T00:57:51.6385316Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-25T00:57:51.6385527Z ·  ─────────┬──────── 2026-10-25T00:57:51.6385782Z · ╰── Cannot access ref value during render 2026-10-25T00:57:51.6386035Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-25T00:57:51.6386210Z ╰──── 2026-10-25T00:57:51.6386730Z  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-25T00:57:51.6387427Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6387702Z 2026-10-25T00:57:51.6387844Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6388150Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7] 2026-10-25T00:57:51.6388363Z 125 │ 2026-10-25T00:57:51.6388536Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-25T00:57:51.6388785Z ·  ─────────┬───────── 2026-10-25T00:57:51.6389033Z · ╰── Cannot access ref value during render 2026-10-25T00:57:51.6389283Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-25T00:57:51.6389506Z ╰──── 2026-10-25T00:57:51.6390045Z  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-25T00:57:51.6390742Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6391013Z 2026-10-25T00:57:51.6391160Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6391469Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31] 2026-10-25T00:57:51.6391685Z 125 │ 2026-10-25T00:57:51.6391855Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-25T00:57:51.6392095Z ·  ─────────┬───────── 2026-10-25T00:57:51.6392386Z · ╰── Cannot access ref value during render 2026-10-25T00:57:51.6392655Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-25T00:57:51.6392829Z ╰──── 2026-10-25T00:57:51.6393367Z  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-25T00:57:51.6394068Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6394342Z 2026-10-25T00:57:51.6394490Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6394807Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30] 2026-10-25T00:57:51.6395027Z 125 │ 2026-10-25T00:57:51.6395196Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-25T00:57:51.6395433Z ·  ──────────┬───────── 2026-10-25T00:57:51.6395717Z · ╰── Cannot access ref value during render 2026-10-25T00:57:51.6395982Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-25T00:57:51.6396151Z ╰──── 2026-10-25T00:57:51.6396664Z  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-25T00:57:51.6397370Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6397647Z 2026-10-25T00:57:51.6397791Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6398099Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46] 2026-10-25T00:57:51.6398373Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-25T00:57:51.6398692Z 127 │ ╭─▶ const recorder = createLazyVoiceRecorder({ 2026-10-25T00:57:51.6399055Z 128 │ │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-25T00:57:51.6399356Z 129 │ │ onStatus: (status: RecordingStatus) => { 2026-10-25T00:57:51.6399705Z 130 │ │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-25T00:57:51.6400015Z 131 │ │ isFinished: status.isFinished, 2026-10-25T00:57:51.6400322Z 132 │ │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-25T00:57:51.6400657Z 133 │ │ error: status.error, 2026-10-25T00:57:51.6400875Z 134 │ │ url: status.url, 2026-10-25T00:57:51.6401070Z 135 │ │ }); 2026-10-25T00:57:51.6401253Z 136 │ │ }, 2026-10-25T00:57:51.6401540Z 137 │ │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-25T00:57:51.6401846Z 138 │ │ selectInput: (inputs) => { 2026-10-25T00:57:51.6402126Z 139 │ │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-25T00:57:51.6402432Z 140 │ │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-25T00:57:51.6402746Z 141 │ │ const known = microphoneOrder(preferences.value.microphones); 2026-10-25T00:57:51.6403055Z 142 │ │ const order = rememberMicrophones(known, inputs); 2026-10-25T00:57:51.6403331Z 143 │ │ if (order !== known) { 2026-10-25T00:57:51.6403592Z 144 │ │ registry.set(updateMobilePreferencesAtom, { 2026-10-25T00:57:51.6403857Z 145 │ │ transform: (current) => ({ 2026-10-25T00:57:51.6404187Z 146 │ │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-25T00:57:51.6404476Z 147 │ │ }), 2026-10-25T00:57:51.6404665Z 148 │ │ }); 2026-10-25T00:57:51.6404842Z 149 │ │ } 2026-10-25T00:57:51.6405079Z 150 │ │ return preferredMicrophoneInput(inputs, order); 2026-10-25T00:57:51.6405311Z 151 │ │ }, 2026-10-25T00:57:51.6405538Z 152 │ ├─▶ }); 2026-10-25T00:57:51.6405918Z · ╰──── Passing a ref to a function may read its value during render 2026-10-25T00:57:51.6406224Z 153 │ recorderRef.current = recorder; 2026-10-25T00:57:51.6406384Z ╰──── 2026-10-25T00:57:51.6406902Z  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-25T00:57:51.6407606Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6407889Z 2026-10-25T00:57:51.6408032Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6408347Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16] 2026-10-25T00:57:51.6408569Z 152 │ }); 2026-10-25T00:57:51.6408720Z 153 │ recorderRef.current = recorder; 2026-10-25T00:57:51.6408937Z ·  ─────┬─────────┬─── 2026-10-25T00:57:51.6409241Z · │ ╰── Cannot update ref value during render 2026-10-25T00:57:51.6409609Z · ╰── This value is a ref 2026-10-25T00:57:51.6409879Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-25T00:57:51.6410055Z ╰──── 2026-10-25T00:57:51.6410569Z  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-25T00:57:51.6411265Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6411542Z 2026-10-25T00:57:51.6411686Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6411997Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48] 2026-10-25T00:57:51.6412247Z 153 │ recorderRef.current = recorder; 2026-10-25T00:57:51.6412538Z 154 │ ╭─▶ sessionRef.current = new VoiceInputSession({ 2026-10-25T00:57:51.6412815Z 155 │ │ recorder, 2026-10-25T00:57:51.6413044Z 156 │ │ getTranscriber: getLocalVoiceTranscriber, 2026-10-25T00:57:51.6413328Z 157 │ │ requestPermission: async () => { 2026-10-25T00:57:51.6413620Z 158 │ │ const permission = await requestRecordingPermissionsAsync(); 2026-10-25T00:57:51.6413979Z 159 │ │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-25T00:57:51.6414247Z 160 │ │ }, 2026-10-25T00:57:51.6414494Z 161 │ │ configureRecording: configureVoiceRecordingAudio, 2026-10-25T00:57:51.6414782Z 162 │ │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-25T00:57:51.6415066Z 163 │ │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-25T00:57:51.6415326Z 164 │ │ onStateChange: (nextState) => 2026-10-25T00:57:51.6415545Z 165 │ │ setState({ 2026-10-25T00:57:51.6415754Z 166 │ │ state: nextState, 2026-10-25T00:57:51.6416006Z 167 │ │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-25T00:57:51.6416277Z 168 │ │ label: sessionRef.current?.label ?? null, 2026-10-25T00:57:51.6416498Z 169 │ │ }), 2026-10-25T00:57:51.6416775Z 170 │ ├─▶ }); 2026-10-25T00:57:51.6417145Z · ╰──── Cannot access ref value during render 2026-10-25T00:57:51.6417394Z 171 │ } 2026-10-25T00:57:51.6417511Z ╰──── 2026-10-25T00:57:51.6418021Z  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-25T00:57:51.6418719Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6418993Z 2026-10-25T00:57:51.6419139Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6419450Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15] 2026-10-25T00:57:51.6419697Z 153 │ recorderRef.current = recorder; 2026-10-25T00:57:51.6419900Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-25T00:57:51.6420135Z ·  ─────┬────────┬─── 2026-10-25T00:57:51.6420430Z · │ ╰── Cannot update ref value during render 2026-10-25T00:57:51.6420720Z · ╰── This value is a ref 2026-10-25T00:57:51.6420906Z 155 │ recorder, 2026-10-25T00:57:51.6421035Z ╰──── 2026-10-25T00:57:51.6421554Z  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-25T00:57:51.6422250Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6422525Z 2026-10-25T00:57:51.6422665Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6422974Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7] 2026-10-25T00:57:51.6423222Z 184 │ return () => subscription.remove(); 2026-10-25T00:57:51.6423417Z 185 │ }, [controller]); 2026-10-25T00:57:51.6423579Z ·  ─────┬──── 2026-10-25T00:57:51.6423818Z · ╰── Cannot access ref value during render 2026-10-25T00:57:51.6424015Z 186 │ 2026-10-25T00:57:51.6424126Z ╰──── 2026-10-25T00:57:51.6424636Z  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-25T00:57:51.6425338Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6425612Z 2026-10-25T00:57:51.6425754Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6426057Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6] 2026-10-25T00:57:51.6426303Z 184 │ return () => subscription.remove(); 2026-10-25T00:57:51.6426472Z 185 │ }, [controller]); 2026-10-25T00:57:51.6426630Z ·  ──────┬───── 2026-10-25T00:57:51.6426918Z · ╰── Cannot access ref value during render 2026-10-25T00:57:51.6427150Z 186 │ 2026-10-25T00:57:51.6427260Z ╰──── 2026-10-25T00:57:51.6427767Z  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-25T00:57:51.6428465Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6428738Z 2026-10-25T00:57:51.6428883Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6429190Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6] 2026-10-25T00:57:51.6429408Z 191 │ }, 2026-10-25T00:57:51.6429547Z 192 │ [controller, recorder], 2026-10-25T00:57:51.6429716Z ·  ─────┬──── 2026-10-25T00:57:51.6429948Z · ╰── Cannot access ref value during render 2026-10-25T00:57:51.6430148Z 193 │ ); 2026-10-25T00:57:51.6430261Z ╰──── 2026-10-25T00:57:51.6430769Z  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-25T00:57:51.6431466Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6431740Z 2026-10-25T00:57:51.6431882Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6432192Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20] 2026-10-25T00:57:51.6432446Z 174 │ const controller = session.controller; 2026-10-25T00:57:51.6432637Z 175 │ const recorder = recorderRef.current; 2026-10-25T00:57:51.6432849Z ·  ─────────┬───────── 2026-10-25T00:57:51.6433118Z · ╰── Cannot access ref value during render 2026-10-25T00:57:51.6433336Z 176 │ 2026-10-25T00:57:51.6433477Z ╰──── 2026-10-25T00:57:51.6433985Z  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-25T00:57:51.6434685Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6434963Z 2026-10-25T00:57:51.6435105Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6435411Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5] 2026-10-25T00:57:51.6435631Z 191 │ }, 2026-10-25T00:57:51.6435765Z 192 │ [controller, recorder], 2026-10-25T00:57:51.6435945Z ·  ───────────┬────────── 2026-10-25T00:57:51.6436187Z · ╰── Cannot access ref value during render 2026-10-25T00:57:51.6436390Z 193 │ ); 2026-10-25T00:57:51.6436502Z ╰──── 2026-10-25T00:57:51.6437067Z  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-25T00:57:51.6437803Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6438084Z 2026-10-25T00:57:51.6438227Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6438530Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20] 2026-10-25T00:57:51.6438786Z 245 │ return () => clearInterval(intervalId); 2026-10-25T00:57:51.6439005Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-25T00:57:51.6439219Z ·  ─────┬──── 2026-10-25T00:57:51.6439477Z · ╰── Cannot access ref value during render 2026-10-25T00:57:51.6439681Z 247 │ 2026-10-25T00:57:51.6439793Z ╰──── 2026-10-25T00:57:51.6440300Z  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-25T00:57:51.6441075Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6441350Z 2026-10-25T00:57:51.6441493Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6441797Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6] 2026-10-25T00:57:51.6442048Z 245 │ return () => clearInterval(intervalId); 2026-10-25T00:57:51.6442272Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-25T00:57:51.6442527Z ·  ────────────────────────┬─────────────────────── 2026-10-25T00:57:51.6442814Z · ╰── Cannot access ref value during render 2026-10-25T00:57:51.6443019Z 247 │ 2026-10-25T00:57:51.6443130Z ╰──── 2026-10-25T00:57:51.6443660Z  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-25T00:57:51.6444362Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6444637Z 2026-10-25T00:57:51.6444783Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6445089Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5] 2026-10-25T00:57:51.6445317Z 260 │ setOwnerFocused, 2026-10-25T00:57:51.6445465Z 261 │ session, 2026-10-25T00:57:51.6445609Z ·  ───┬─── 2026-10-25T00:57:51.6445834Z · ╰── Cannot access ref value during render 2026-10-25T00:57:51.6446033Z 262 │ stop, 2026-10-25T00:57:51.6446154Z ╰──── 2026-10-25T00:57:51.6446663Z  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-25T00:57:51.6447433Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6447749Z 2026-10-25T00:57:51.6447890Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6448193Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10] 2026-10-25T00:57:51.6448410Z 250 │ 2026-10-25T00:57:51.6448613Z 251 │ ╭─▶ return { 2026-10-25T00:57:51.6448963Z 252 │ │ isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null, 2026-10-25T00:57:51.6449250Z 253 │ │ state, 2026-10-25T00:57:51.6449437Z 254 │ │ audioLevels, 2026-10-25T00:57:51.6449635Z 255 │ │ elapsedSeconds, 2026-10-25T00:57:51.6449878Z 256 │ │ isBusy: voiceInputBlocksSubmission(state), 2026-10-25T00:57:51.6450103Z 257 │ │ ownerKey, 2026-10-25T00:57:51.6450280Z 258 │ │ label, 2026-10-25T00:57:51.6450463Z 259 │ │ focusedOwners, 2026-10-25T00:57:51.6450664Z 260 │ │ setOwnerFocused, 2026-10-25T00:57:51.6450852Z 261 │ │ session, 2026-10-25T00:57:51.6451025Z 262 │ │ stop, 2026-10-25T00:57:51.6451202Z 263 │ │ cancel, 2026-10-25T00:57:51.6451427Z 264 │ ├─▶ }; 2026-10-25T00:57:51.6451755Z · ╰──── Cannot access ref value during render 2026-10-25T00:57:51.6452005Z 265 │ } 2026-10-25T00:57:51.6452127Z ╰──── 2026-10-25T00:57:51.6452642Z  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-25T00:57:51.6453364Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6453638Z 2026-10-25T00:57:51.6453795Z ⚠ react(immutability): This value cannot be modified 2026-10-25T00:57:51.6454105Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-25T00:57:51.6454426Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-25T00:57:51.6454718Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-25T00:57:51.6454937Z ·  ─────┬───── 2026-10-25T00:57:51.6455165Z · ╰── `audioLevels` originates here 2026-10-25T00:57:51.6455424Z 123 │ const sessionRef = useRef(null); 2026-10-25T00:57:51.6455699Z 124 │ const recorderRef = useRef | null>(null); 2026-10-25T00:57:51.6455904Z 125 │ 2026-10-25T00:57:51.6456071Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-25T00:57:51.6456289Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-25T00:57:51.6456544Z 128 │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-25T00:57:51.6456782Z 129 │ onStatus: (status: RecordingStatus) => { 2026-10-25T00:57:51.6457071Z 130 │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-25T00:57:51.6457316Z 131 │ isFinished: status.isFinished, 2026-10-25T00:57:51.6457562Z 132 │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-25T00:57:51.6457789Z 133 │ error: status.error, 2026-10-25T00:57:51.6457951Z 134 │ url: status.url, 2026-10-25T00:57:51.6458096Z 135 │ }); 2026-10-25T00:57:51.6458220Z 136 │ }, 2026-10-25T00:57:51.6458447Z 137 │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-25T00:57:51.6458690Z 138 │ selectInput: (inputs) => { 2026-10-25T00:57:51.6458912Z 139 │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-25T00:57:51.6459160Z 140 │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-25T00:57:51.6459424Z 141 │ const known = microphoneOrder(preferences.value.microphones); 2026-10-25T00:57:51.6459681Z 142 │ const order = rememberMicrophones(known, inputs); 2026-10-25T00:57:51.6459886Z 143 │ if (order !== known) { 2026-10-25T00:57:51.6460088Z 144 │ registry.set(updateMobilePreferencesAtom, { 2026-10-25T00:57:51.6460297Z 145 │ transform: (current) => ({ 2026-10-25T00:57:51.6460568Z 146 │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-25T00:57:51.6460807Z 147 │ }), 2026-10-25T00:57:51.6460945Z 148 │ }); 2026-10-25T00:57:51.6461078Z 149 │ } 2026-10-25T00:57:51.6461259Z 150 │ return preferredMicrophoneInput(inputs, order); 2026-10-25T00:57:51.6461441Z 151 │ }, 2026-10-25T00:57:51.6461572Z 152 │ }); 2026-10-25T00:57:51.6461719Z 153 │ recorderRef.current = recorder; 2026-10-25T00:57:51.6461933Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-25T00:57:51.6462116Z 155 │ recorder, 2026-10-25T00:57:51.6462292Z 156 │ getTranscriber: getLocalVoiceTranscriber, 2026-10-25T00:57:51.6462493Z 157 │ requestPermission: async () => { 2026-10-25T00:57:51.6462725Z 158 │ const permission = await requestRecordingPermissionsAsync(); 2026-10-25T00:57:51.6463027Z 159 │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-25T00:57:51.6463272Z 160 │ }, 2026-10-25T00:57:51.6463454Z 161 │ configureRecording: configureVoiceRecordingAudio, 2026-10-25T00:57:51.6463683Z 162 │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-25T00:57:51.6463908Z 163 │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-25T00:57:51.6464106Z 164 │ onStateChange: (nextState) => 2026-10-25T00:57:51.6464276Z 165 │ setState({ 2026-10-25T00:57:51.6464432Z 166 │ state: nextState, 2026-10-25T00:57:51.6464632Z 167 │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-25T00:57:51.6464852Z 168 │ label: sessionRef.current?.label ?? null, 2026-10-25T00:57:51.6465024Z 169 │ }), 2026-10-25T00:57:51.6465153Z 170 │ }); 2026-10-25T00:57:51.6465273Z 171 │ } 2026-10-25T00:57:51.6465390Z 172 │ 2026-10-25T00:57:51.6465535Z 173 │ const session = sessionRef.current; 2026-10-25T00:57:51.6465727Z 174 │ const controller = session.controller; 2026-10-25T00:57:51.6465917Z 175 │ const recorder = recorderRef.current; 2026-10-25T00:57:51.6466072Z 176 │ 2026-10-25T00:57:51.6466198Z 177 │ useEffect(() => { 2026-10-25T00:57:51.6466432Z 178 │ const subscription = AppState.addEventListener("change", (nextState) => { 2026-10-25T00:57:51.6466794Z 179 │ // iOS reports `inactive` while its permission dialog is open. Only the 2026-10-25T00:57:51.6467117Z 180 │ // real background state cancels preparation; recorder status handles 2026-10-25T00:57:51.6467374Z 181 │ // calls and route interruptions during capture. 2026-10-25T00:57:51.6467628Z 182 │ if (nextState === "background") controller.appMovedToBackground(); 2026-10-25T00:57:51.6467836Z 183 │ }); 2026-10-25T00:57:51.6467985Z 184 │ return () => subscription.remove(); 2026-10-25T00:57:51.6468156Z 185 │ }, [controller]); 2026-10-25T00:57:51.6468291Z 186 │ 2026-10-25T00:57:51.6468412Z 187 │ useEffect( 2026-10-25T00:57:51.6468548Z 188 │ () => () => { 2026-10-25T00:57:51.6468700Z 189 │ controller.dispose(); 2026-10-25T00:57:51.6468867Z 190 │ recorder.release(); 2026-10-25T00:57:51.6469008Z 191 │ }, 2026-10-25T00:57:51.6469147Z 192 │ [controller, recorder], 2026-10-25T00:57:51.6469290Z 193 │ ); 2026-10-25T00:57:51.6469413Z 194 │ 2026-10-25T00:57:51.6469539Z 195 │ useEffect(() => { 2026-10-25T00:57:51.6469714Z 196 │ if (state.phase !== "recording") return; 2026-10-25T00:57:51.6469879Z 197 │ 2026-10-25T00:57:51.6470084Z 198 │ const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`; 2026-10-25T00:57:51.6470350Z 199 │ const activation = activateKeepAwakeAsync(tag); 2026-10-25T00:57:51.6470552Z 200 │ void activation.catch(() => {}); 2026-10-25T00:57:51.6470718Z 201 │ return () => { 2026-10-25T00:57:51.6470948Z 202 │ // Release after activation settles, even if the recording ends immediately. 2026-10-25T00:57:51.6471244Z 203 │ void activation.then(() => deactivateKeepAwake(tag)).catch(() => {}); 2026-10-25T00:57:51.6471445Z 204 │ }; 2026-10-25T00:57:51.6471590Z 205 │ }, [keepAwakeId, state.phase]); 2026-10-25T00:57:51.6471752Z 206 │ 2026-10-25T00:57:51.6471877Z 207 │ useEffect(() => { 2026-10-25T00:57:51.6472093Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-25T00:57:51.6472287Z 209 │ 2026-10-25T00:57:51.6472468Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-25T00:57:51.6472755Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-25T00:57:51.6473022Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-25T00:57:51.6473219Z ·  ─────┬───── 2026-10-25T00:57:51.6473479Z · ╰── `audioLevels` cannot be modified 2026-10-25T00:57:51.6473675Z 213 │ } 2026-10-25T00:57:51.6473797Z ╰──── 2026-10-25T00:57:51.6474175Z  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-25T00:57:51.6474771Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T00:57:51.6475060Z 2026-10-25T00:57:51.6475265Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-25T00:57:51.6475622Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-25T00:57:51.6475837Z 206 │ 2026-10-25T00:57:51.6475963Z 207 │ useEffect(() => { 2026-10-25T00:57:51.6476127Z ·  ───┬─── 2026-10-25T00:57:51.6476439Z · ╰── This function may (indirectly) reassign or modify `audioLevels` after render 2026-10-25T00:57:51.6476788Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-25T00:57:51.6476992Z 209 │ 2026-10-25T00:57:51.6477172Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-25T00:57:51.6477457Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-25T00:57:51.6477725Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-25T00:57:51.6477919Z ·  ─────┬───── 2026-10-25T00:57:51.6478146Z · ╰── This modifies `audioLevels` 2026-10-25T00:57:51.6478338Z 213 │ } 2026-10-25T00:57:51.6478456Z ╰──── 2026-10-25T00:57:51.6478848Z  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-25T00:57:51.6479469Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T00:57:51.6479762Z 2026-10-25T00:57:51.6480023Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T00:57:51.6480408Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:60:5] 2026-10-25T00:57:51.6480662Z 57 │ 2026-10-25T00:57:51.6480790Z 58 │ useEffect(() => { 2026-10-25T00:57:51.6480944Z ·  ────┬──── 2026-10-25T00:57:51.6481159Z · ╰── This is the containing effect 2026-10-25T00:57:51.6481390Z 59 │ const controller = new AbortController(); 2026-10-25T00:57:51.6481571Z 60 │ setLoadState("pending"); 2026-10-25T00:57:51.6481739Z ·  ──────┬───── 2026-10-25T00:57:51.6482001Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.6482329Z 61 │ // A renewed signature is used on Retry, not as a reason to reset the native player. 2026-10-25T00:57:51.6482543Z ╰──── 2026-10-25T00:57:51.6483188Z  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-25T00:57:51.6484063Z  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-25T00:57:51.6484368Z 2026-10-25T00:57:51.6484660Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T00:57:51.6485040Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:71:7] 2026-10-25T00:57:51.6485267Z 70 │ return () => controller.abort(); 2026-10-25T00:57:51.6485465Z 71 │ }, [player, props.playRequested, attempt]); 2026-10-25T00:57:51.6485755Z ·  ───┬── ─────────┬───────── ───┬─── 2026-10-25T00:57:51.6486139Z · │ │ ╰── Unnecessary dependency `attempt` 2026-10-25T00:57:51.6486545Z · │ ╰── Unnecessary dependency `props.playRequested` 2026-10-25T00:57:51.6486872Z · ╰── Unnecessary dependency `player_0` 2026-10-25T00:57:51.6487069Z 72 │ 2026-10-25T00:57:51.6487179Z ╰──── 2026-10-25T00:57:51.6487534Z  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-25T00:57:51.6488115Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6488409Z 2026-10-25T00:57:51.6488569Z ⚠ react(immutability): This value cannot be modified 2026-10-25T00:57:51.6488895Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5] 2026-10-25T00:57:51.6489127Z 90 │ }) { 2026-10-25T00:57:51.6489298Z 91 │ const rotation = useSharedValue(props.hidden ? 1 : 0); 2026-10-25T00:57:51.6489498Z ·  ────┬─── 2026-10-25T00:57:51.6489723Z · ╰── `rotation` originates here 2026-10-25T00:57:51.6489932Z 92 │ useLayoutEffect(() => { 2026-10-25T00:57:51.6490162Z 93 │ rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING); 2026-10-25T00:57:51.6490383Z ·  ────┬─── 2026-10-25T00:57:51.6490597Z · ╰── `rotation` cannot be modified 2026-10-25T00:57:51.6490808Z 94 │ }, [props.hidden, rotation]); 2026-10-25T00:57:51.6490957Z ╰──── 2026-10-25T00:57:51.6491270Z  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-25T00:57:51.6491820Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T00:57:51.6492107Z 2026-10-25T00:57:51.6492267Z ⚠ react(immutability): This value cannot be modified 2026-10-25T00:57:51.6492597Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:269:5] 2026-10-25T00:57:51.6492864Z 266 │ const variant = props.variant ?? "plain"; 2026-10-25T00:57:51.6493113Z 267 │ const loadingVisibility = useSharedValue(props.loading ? 1 : 0); 2026-10-25T00:57:51.6493372Z ·  ────────┬──────── 2026-10-25T00:57:51.6493621Z · ╰── `loadingVisibility` originates here 2026-10-25T00:57:51.6493837Z 268 │ useLayoutEffect(() => { 2026-10-25T00:57:51.6494085Z 269 │ loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING); 2026-10-25T00:57:51.6494336Z ·  ────────┬──────── 2026-10-25T00:57:51.6494629Z · ╰── `loadingVisibility` cannot be modified 2026-10-25T00:57:51.6494899Z 270 │ }, [loadingVisibility, props.loading]); 2026-10-25T00:57:51.6495058Z ╰──── 2026-10-25T00:57:51.6495374Z  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-25T00:57:51.6495927Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T00:57:51.6496216Z 2026-10-25T00:57:51.6496374Z ⚠ react(immutability): This value cannot be modified 2026-10-25T00:57:51.6496701Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:328:5] 2026-10-25T00:57:51.6496930Z 325 │ }) { 2026-10-25T00:57:51.6497158Z 326 │ const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0); 2026-10-25T00:57:51.6497417Z ·  ─────────┬───────── 2026-10-25T00:57:51.6497672Z · ╰── `recordingVisibility` originates here 2026-10-25T00:57:51.6497898Z 327 │ useLayoutEffect(() => { 2026-10-25T00:57:51.6498172Z 328 │ recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING); 2026-10-25T00:57:51.6498450Z ·  ─────────┬───────── 2026-10-25T00:57:51.6498698Z · ╰── `recordingVisibility` cannot be modified 2026-10-25T00:57:51.6498943Z 329 │ }, [props.phase, recordingVisibility]); 2026-10-25T00:57:51.6499103Z ╰──── 2026-10-25T00:57:51.6499424Z  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-25T00:57:51.6499986Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T00:57:51.6500277Z 2026-10-25T00:57:51.6500506Z ⚠ unicorn(no-useless-spread): Using a spread operator here creates a new array unnecessarily. 2026-10-25T00:57:51.6500857Z ╭─[apps/mobile/src/native/native-layout-metrics.tsx:43:27] 2026-10-25T00:57:51.6501073Z 42 │ latestMetrics = next; 2026-10-25T00:57:51.6501267Z 43 │ for (const settle of [...metricsWaiters]) settle(next); 2026-10-25T00:57:51.6501478Z ·  ─── 2026-10-25T00:57:51.6501643Z 44 │ setMetrics(next); 2026-10-25T00:57:51.6501784Z ╰──── 2026-10-25T00:57:51.6502022Z  help: `for…of` can iterate over iterable, it's unnecessary to convert to an array. 2026-10-25T00:57:51.6502196Z 2026-10-25T00:57:51.6502406Z ⚠ typescript(no-extraneous-class): Unexpected class with only a constructor. 2026-10-25T00:57:51.6502735Z ╭─[apps/desktop/src/preview/Manager.test.ts:158:18] 2026-10-25T00:57:51.6502974Z 157 │ BrowserWindow: browserWindowConstructor, 2026-10-25T00:57:51.6503264Z 158 │ ╭─▶ ClipboardItem: class { 2026-10-25T00:57:51.6503580Z 159 │ │ constructor(data: Record) { 2026-10-25T00:57:51.6503834Z 160 │ │ clipboardItemConstructor(data); 2026-10-25T00:57:51.6504035Z 161 │ │ } 2026-10-25T00:57:51.6504253Z 162 │ ╰─▶ }, 2026-10-25T00:57:51.6504452Z 163 │ clipboard: { 2026-10-25T00:57:51.6504587Z ╰──── 2026-10-25T00:57:51.6504859Z  help: Try replacing this class with a standalone function or deleting it entirely 2026-10-25T00:57:51.6505062Z 2026-10-25T00:57:51.6505217Z ⚠ react(immutability): This value cannot be modified 2026-10-25T00:57:51.6505532Z ╭─[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5] 2026-10-25T00:57:51.6505805Z 65 │ const [expanded, setExpanded] = useState(false); 2026-10-25T00:57:51.6506005Z 66 │ const progress = useSharedValue(0); 2026-10-25T00:57:51.6506185Z ·  ────┬─── 2026-10-25T00:57:51.6506405Z · ╰── `progress` originates here 2026-10-25T00:57:51.6506610Z 67 │ useEffect(() => { 2026-10-25T00:57:51.6506811Z 68 │ progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING); 2026-10-25T00:57:51.6507019Z ·  ────┬─── 2026-10-25T00:57:51.6507240Z · ╰── `progress` cannot be modified 2026-10-25T00:57:51.6507448Z 69 │ }, [expanded, progress]); 2026-10-25T00:57:51.6507589Z ╰──── 2026-10-25T00:57:51.6507900Z  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-25T00:57:51.6508461Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T00:57:51.6508751Z 2026-10-25T00:57:51.6508954Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-25T00:57:51.6509292Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:231:6] 2026-10-25T00:57:51.6509601Z 227 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-25T00:57:51.6509865Z 228 │ nativeEventSnapshotsRef.current, 2026-10-25T00:57:51.6510061Z ·  ───────────┬─────────── 2026-10-25T00:57:51.6510624Z · ╰── 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-25T00:57:51.6511098Z 229 │ mostRecentEventCount, 2026-10-25T00:57:51.6511300Z 230 │ ); 2026-10-25T00:57:51.6511487Z 231 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-25T00:57:51.6511763Z ·  ──────────────────────────┬────────────────────────── 2026-10-25T00:57:51.6512103Z · ╰── This dependency list is missing values used by the callback 2026-10-25T00:57:51.6512378Z 232 │ const assumedValue = props.value; 2026-10-25T00:57:51.6512527Z ╰──── 2026-10-25T00:57:51.6512751Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-25T00:57:51.6513229Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6513557Z 2026-10-25T00:57:51.6513771Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T00:57:51.6514115Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:239:7] 2026-10-25T00:57:51.6514400Z 238 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-25T00:57:51.6514642Z 239 │ nativeEventSnapshotsRef.current, 2026-10-25T00:57:51.6514895Z ·  ───────────┬─────────── 2026-10-25T00:57:51.6515480Z · ╰── 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-25T00:57:51.6515955Z 240 │ controlledEventCount, 2026-10-25T00:57:51.6516111Z 241 │ assumedValue, 2026-10-25T00:57:51.6516250Z 242 │ ); 2026-10-25T00:57:51.6516472Z 243 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-25T00:57:51.6516773Z ·  ───────────┬────────── 2026-10-25T00:57:51.6517126Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-25T00:57:51.6517403Z 244 │ const acceptNativeEvent = useCallback( 2026-10-25T00:57:51.6517561Z ╰──── 2026-10-25T00:57:51.6518034Z  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-25T00:57:51.6518721Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6519015Z 2026-10-25T00:57:51.6519160Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6519450Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29] 2026-10-25T00:57:51.6519725Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-25T00:57:51.6519980Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-25T00:57:51.6520231Z ·  ─────────────┬──────────── 2026-10-25T00:57:51.6520890Z · ╰── Cannot access ref value during render 2026-10-25T00:57:51.6521106Z 165 │ }); 2026-10-25T00:57:51.6521224Z ╰──── 2026-10-25T00:57:51.6521736Z  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-25T00:57:51.6522442Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6522720Z 2026-10-25T00:57:51.6522925Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6523274Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29] 2026-10-25T00:57:51.6523537Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-25T00:57:51.6523782Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-25T00:57:51.6524023Z ·  ─────────────┬──────────── 2026-10-25T00:57:51.6524349Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T00:57:51.6524600Z 165 │ }); 2026-10-25T00:57:51.6524719Z ╰──── 2026-10-25T00:57:51.6525235Z  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-25T00:57:51.6525938Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6526212Z 2026-10-25T00:57:51.6526352Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6526638Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:166:23] 2026-10-25T00:57:51.6526837Z 165 │ }); 2026-10-25T00:57:51.6526993Z 166 │ confirmedTokensRef.current = tokens; 2026-10-25T00:57:51.6527225Z ·  ─────────┬────────────┬─── 2026-10-25T00:57:51.6527538Z · │ ╰── Cannot update ref value during render 2026-10-25T00:57:51.6527837Z · ╰── This value is a ref 2026-10-25T00:57:51.6528038Z 167 │ return JSON.stringify( 2026-10-25T00:57:51.6528179Z ╰──── 2026-10-25T00:57:51.6528689Z  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-25T00:57:51.6529393Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6529673Z 2026-10-25T00:57:51.6529819Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6530103Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:208:5] 2026-10-25T00:57:51.6530324Z 207 │ mostRecentEventCount, 2026-10-25T00:57:51.6530504Z 208 │ nativeEventSnapshotsRef.current, 2026-10-25T00:57:51.6530715Z ·  ───────────────┬─────────────── 2026-10-25T00:57:51.6531011Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T00:57:51.6531247Z 209 │ ); 2026-10-25T00:57:51.6531360Z ╰──── 2026-10-25T00:57:51.6531873Z  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-25T00:57:51.6532577Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6532907Z 2026-10-25T00:57:51.6533083Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6533389Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:214:5] 2026-10-25T00:57:51.6533599Z 213 │ mostRecentEventCount, 2026-10-25T00:57:51.6533771Z 214 │ nativeEventSnapshotsRef.current, 2026-10-25T00:57:51.6533981Z ·  ───────────────┬─────────────── 2026-10-25T00:57:51.6534403Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T00:57:51.6534767Z 215 │ ); 2026-10-25T00:57:51.6534957Z ╰──── 2026-10-25T00:57:51.6535794Z  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-25T00:57:51.6542295Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6542575Z 2026-10-25T00:57:51.6542773Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-25T00:57:51.6543094Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:199:6] 2026-10-25T00:57:51.6543403Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-25T00:57:51.6543650Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-25T00:57:51.6543884Z ·  ─────────┬──────── 2026-10-25T00:57:51.6544464Z · ╰── 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-25T00:57:51.6544923Z 165 │ }); 2026-10-25T00:57:51.6545075Z 166 │ confirmedTokensRef.current = tokens; 2026-10-25T00:57:51.6545248Z 167 │ return JSON.stringify( 2026-10-25T00:57:51.6545497Z 168 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-25T00:57:51.6545730Z 169 │ const record = 2026-10-25T00:57:51.6545888Z 170 │ token.type === "context" 2026-10-25T00:57:51.6546144Z 171 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-25T00:57:51.6546368Z 172 │ : undefined; 2026-10-25T00:57:51.6546556Z 173 │ const presentation = contextChipPresentation( 2026-10-25T00:57:51.6546789Z 174 │ token.type === "context" ? token.kind : token.type, 2026-10-25T00:57:51.6546981Z 175 │ record, 2026-10-25T00:57:51.6547117Z 176 │ ); 2026-10-25T00:57:51.6547269Z 177 │ const icon = contextChipIcon( 2026-10-25T00:57:51.6547435Z 178 │ presentation, 2026-10-25T00:57:51.6547661Z 179 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-25T00:57:51.6547866Z 180 │ ); 2026-10-25T00:57:51.6547994Z 181 │ return { 2026-10-25T00:57:51.6548143Z 182 │ type: token.type, 2026-10-25T00:57:51.6548771Z 183 │ source: token.source, 2026-10-25T00:57:51.6549058Z 184 │ start: token.start, 2026-10-25T00:57:51.6549214Z 185 │ end: token.end, 2026-10-25T00:57:51.6549602Z 186 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-25T00:57:51.6549997Z 187 │ label: 2026-10-25T00:57:51.6550183Z 188 │ token.type === "skill" 2026-10-25T00:57:51.6550386Z 189 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-25T00:57:51.6550590Z 190 │ : token.type === "context" 2026-10-25T00:57:51.6550921Z 191 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-25T00:57:51.6551225Z 192 │ : basename(token.value), 2026-10-25T00:57:51.6551472Z 193 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-25T00:57:51.6551712Z 194 │ iconUri: contextChipIconUri(icon), 2026-10-25T00:57:51.6551910Z 195 │ tintsIcon: icon.kind === "chip", 2026-10-25T00:57:51.6552071Z 196 │ }; 2026-10-25T00:57:51.6552195Z 197 │ }), 2026-10-25T00:57:51.6552317Z 198 │ ); 2026-10-25T00:57:51.6552521Z 199 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-25T00:57:51.6552820Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-25T00:57:51.6553171Z · ╰── This dependency list is missing values used by the callback 2026-10-25T00:57:51.6553540Z 200 │ // Every render resolves against the snapshot history, so a render whose 2026-10-25T00:57:51.6553742Z ╰──── 2026-10-25T00:57:51.6553999Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-25T00:57:51.6554511Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6554802Z 2026-10-25T00:57:51.6554993Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-25T00:57:51.6555313Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:261:5] 2026-10-25T00:57:51.6555581Z 253 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-25T00:57:51.6555823Z 254 │ nativeEventSnapshotsRef.current.push({ 2026-10-25T00:57:51.6556032Z ·  ───────────┬─────────── 2026-10-25T00:57:51.6556585Z · ╰── 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-25T00:57:51.6557080Z 255 │ eventCount: acknowledgedEventCount, 2026-10-25T00:57:51.6557320Z 256 │ value, 2026-10-25T00:57:51.6557478Z 257 │ selection: nextSelection, 2026-10-25T00:57:51.6557633Z 258 │ }); 2026-10-25T00:57:51.6557785Z 259 │ return acknowledgedEventCount; 2026-10-25T00:57:51.6557942Z 260 │ }, 2026-10-25T00:57:51.6558064Z 261 │ [], 2026-10-25T00:57:51.6558198Z ·  ─┬ 2026-10-25T00:57:51.6558460Z · ╰── This dependency list is missing values used by the callback 2026-10-25T00:57:51.6558688Z 262 │ ); 2026-10-25T00:57:51.6558800Z ╰──── 2026-10-25T00:57:51.6559055Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-25T00:57:51.6559558Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6559853Z 2026-10-25T00:57:51.6560063Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6560410Z ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14] 2026-10-25T00:57:51.6560723Z 26 │ const latestInput = useRef(input); 2026-10-25T00:57:51.6560899Z 27 │ latestInput.current = input; 2026-10-25T00:57:51.6561108Z ·  ─────┬─────────┬─── 2026-10-25T00:57:51.6561403Z · │ ╰── Cannot update ref value during render 2026-10-25T00:57:51.6561685Z · ╰── This value is a ref 2026-10-25T00:57:51.6561878Z 28 │ const mounted = useRef(true); 2026-10-25T00:57:51.6562230Z ╰──── 2026-10-25T00:57:51.6562801Z  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-25T00:57:51.6563535Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6563814Z 2026-10-25T00:57:51.6564070Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T00:57:51.6564701Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:68:5] 2026-10-25T00:57:51.6564951Z 66 │ const { id: attachmentId, fileUri } = attachment; 2026-10-25T00:57:51.6565135Z 67 │ useEffect(() => { 2026-10-25T00:57:51.6565285Z ·  ────┬──── 2026-10-25T00:57:51.6565502Z · ╰── This is the containing effect 2026-10-25T00:57:51.6565707Z 68 │ setUri(null); 2026-10-25T00:57:51.6565860Z ·  ───┬── 2026-10-25T00:57:51.6566103Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.6566328Z 69 │ setError(null); 2026-10-25T00:57:51.6566457Z ╰──── 2026-10-25T00:57:51.6567099Z  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-25T00:57:51.6567942Z  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-25T00:57:51.6568245Z 2026-10-25T00:57:51.6568521Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T00:57:51.6568887Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:91:7] 2026-10-25T00:57:51.6569085Z 90 │ }; 2026-10-25T00:57:51.6569222Z 91 │ }, [attachmentId, fileUri]); 2026-10-25T00:57:51.6569432Z ·  ──────┬───── ───┬─── 2026-10-25T00:57:51.6569729Z · │ ╰── Unnecessary dependency `fileUri` 2026-10-25T00:57:51.6570045Z · ╰── Unnecessary dependency `attachmentId` 2026-10-25T00:57:51.6570324Z 92 │ const mimeType = videoMimeType(attachment) ?? attachment.mimeType; 2026-10-25T00:57:51.6570518Z ╰──── 2026-10-25T00:57:51.6570866Z  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-25T00:57:51.6571446Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6571736Z 2026-10-25T00:57:51.6571950Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T00:57:51.6572296Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:213:34] 2026-10-25T00:57:51.6572507Z 212 │ useEffect(() => { 2026-10-25T00:57:51.6572700Z 213 │ if (!isFocused && hasSource) props.onRequestClose(); 2026-10-25T00:57:51.6572924Z ·  ──┬── 2026-10-25T00:57:51.6573185Z · ╰── Missing dependency `props` 2026-10-25T00:57:51.6573481Z 214 │ }, [isFocused, hasSource, props.onRequestClose]); 2026-10-25T00:57:51.6573709Z ·  ──────────┬───────── 2026-10-25T00:57:51.6574052Z · ╰── Overly precise dependency `props.onRequestClose`, use `props` instead 2026-10-25T00:57:51.6574329Z 215 │ const { source } = props; 2026-10-25T00:57:51.6574473Z ╰──── 2026-10-25T00:57:51.6574937Z  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-25T00:57:51.6575735Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6576112Z 2026-10-25T00:57:51.6576574Z ⚠ 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-25T00:57:51.6577113Z ╭─[packages/shared/src/atomicWrite.test.ts:139:5] 2026-10-25T00:57:51.6577323Z 138 │ Effect.gen(function* () { 2026-10-25T00:57:51.6577607Z 139 │ ╭─▶ while (fiber.pollUnsafe() === undefined) { 2026-10-25T00:57:51.6577990Z 140 │ │ yield* TestClock.adjust("100 millis"); 2026-10-25T00:57:51.6578456Z 141 │ │ // oxlint-disable-next-line t3code/no-real-time-wait-in-tests -- a macrotask boundary so the real stat I/O can finish; time moves only via TestClock 2026-10-25T00:57:51.6579047Z 142 │ │ yield* Effect.promise(() => new Promise((resolve) => setImmediate(resolve))); 2026-10-25T00:57:51.6579390Z 143 │ ╰─▶ } 2026-10-25T00:57:51.6579613Z 144 │ return yield* Fiber.join(fiber); 2026-10-25T00:57:51.6579770Z ╰──── 2026-10-25T00:57:51.6579827Z 2026-10-25T00:57:51.6580024Z ⚠ eslint(no-unused-vars): Identifier 'FormSheet' is imported but never used. 2026-10-25T00:57:51.6580367Z ╭─[apps/mobile/src/native/createV5StackNavigator.ios.tsx:26:10] 2026-10-25T00:57:51.6580624Z 25 │ import { StyleSheet, View } from "react-native"; 2026-10-25T00:57:51.6580857Z 26 │ import { FormSheet, Stack } from "react-native-screens"; 2026-10-25T00:57:51.6581057Z ·  ────┬──── 2026-10-25T00:57:51.6581289Z · ╰── 'FormSheet' is imported here 2026-10-25T00:57:51.6581577Z 27 │ import { NativeScrollEdgeEffectsContext } from "./NativeScrollViewMarker"; 2026-10-25T00:57:51.6581788Z ╰──── 2026-10-25T00:57:51.6581943Z  help: Consider removing this import. 2026-10-25T00:57:51.6582056Z 2026-10-25T00:57:51.6582285Z ⚠ eslint(no-unused-vars): Identifier 'nativeWorkspacePopAction' is imported but never used. 2026-10-25T00:57:51.6582648Z ╭─[apps/mobile/src/native/createV5StackNavigator.ios.tsx:33:3] 2026-10-25T00:57:51.6582873Z 32 │ nativeStackPopAction, 2026-10-25T00:57:51.6583037Z 33 │ nativeWorkspacePopAction, 2026-10-25T00:57:51.6583222Z ·  ────────────┬─────────── 2026-10-25T00:57:51.6583522Z · ╰── 'nativeWorkspacePopAction' is imported here 2026-10-25T00:57:51.6583758Z 34 │ nativeWorkspacePopCount, 2026-10-25T00:57:51.6583909Z ╰──── 2026-10-25T00:57:51.6584057Z  help: Consider removing this import. 2026-10-25T00:57:51.6584169Z 2026-10-25T00:57:51.6584393Z ⚠ eslint(no-unused-vars): Identifier 'nativeWorkspacePopCount' is imported but never used. 2026-10-25T00:57:51.6584748Z ╭─[apps/mobile/src/native/createV5StackNavigator.ios.tsx:34:3] 2026-10-25T00:57:51.6584968Z 33 │ nativeWorkspacePopAction, 2026-10-25T00:57:51.6585128Z 34 │ nativeWorkspacePopCount, 2026-10-25T00:57:51.6585305Z ·  ───────────┬─────────── 2026-10-25T00:57:51.6585557Z · ╰── 'nativeWorkspacePopCount' is imported here 2026-10-25T00:57:51.6585788Z 35 │ partitionStackPresentations, 2026-10-25T00:57:51.6585935Z ╰──── 2026-10-25T00:57:51.6586087Z  help: Consider removing this import. 2026-10-25T00:57:51.6586201Z 2026-10-25T00:57:51.6586346Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6586642Z ╭─[apps/mobile/src/features/home/thread-swipe-actions.tsx:494:27] 2026-10-25T00:57:51.6586860Z 493 │ > 2026-10-25T00:57:51.6587003Z 494 │ {props.children(close)} 2026-10-25T00:57:51.6587190Z ·  ──┬── 2026-10-25T00:57:51.6587447Z · ╰── Cannot access ref value during render 2026-10-25T00:57:51.6587675Z 495 │ 2026-10-25T00:57:51.6587821Z ╰──── 2026-10-25T00:57:51.6588396Z  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-25T00:57:51.6589137Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6589411Z 2026-10-25T00:57:51.6589600Z ⚠ eslint(no-unused-vars): Identifier 'Image' is imported but never used. 2026-10-25T00:57:51.6589924Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:17:10] 2026-10-25T00:57:51.6590200Z 16 │ import type { NativeSyntheticEvent, ViewProps } from "react-native"; 2026-10-25T00:57:51.6590454Z 17 │ import { Image, Platform, StyleSheet } from "react-native"; 2026-10-25T00:57:51.6590653Z ·  ──┬── 2026-10-25T00:57:51.6590862Z · ╰── 'Image' is imported here 2026-10-25T00:57:51.6591052Z 18 │ 2026-10-25T00:57:51.6591161Z ╰──── 2026-10-25T00:57:51.6591308Z  help: Consider removing this import. 2026-10-25T00:57:51.6591420Z 2026-10-25T00:57:51.6591621Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-25T00:57:51.6591952Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:229:6] 2026-10-25T00:57:51.6592259Z 225 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-25T00:57:51.6592517Z 226 │ nativeEventSnapshotsRef.current, 2026-10-25T00:57:51.6592712Z ·  ───────────┬─────────── 2026-10-25T00:57:51.6593281Z · ╰── 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-25T00:57:51.6593787Z 227 │ mostRecentEventCount, 2026-10-25T00:57:51.6593933Z 228 │ ); 2026-10-25T00:57:51.6594119Z 229 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-25T00:57:51.6594386Z ·  ──────────────────────────┬────────────────────────── 2026-10-25T00:57:51.6594715Z · ╰── This dependency list is missing values used by the callback 2026-10-25T00:57:51.6594982Z 230 │ const assumedValue = props.value; 2026-10-25T00:57:51.6595134Z ╰──── 2026-10-25T00:57:51.6595354Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-25T00:57:51.6595838Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6596138Z 2026-10-25T00:57:51.6596347Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T00:57:51.6596692Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:237:7] 2026-10-25T00:57:51.6596979Z 236 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-25T00:57:51.6597223Z 237 │ nativeEventSnapshotsRef.current, 2026-10-25T00:57:51.6597418Z ·  ───────────┬─────────── 2026-10-25T00:57:51.6597970Z · ╰── 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-25T00:57:51.6598442Z 238 │ controlledEventCount, 2026-10-25T00:57:51.6598647Z 239 │ assumedValue, 2026-10-25T00:57:51.6598812Z 240 │ ); 2026-10-25T00:57:51.6599031Z 241 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-25T00:57:51.6599329Z ·  ───────────┬────────── 2026-10-25T00:57:51.6599667Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-25T00:57:51.6599940Z 242 │ const acceptNativeEvent = useCallback( 2026-10-25T00:57:51.6600093Z ╰──── 2026-10-25T00:57:51.6600634Z  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-25T00:57:51.6601321Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6601614Z 2026-10-25T00:57:51.6601759Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6602052Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29] 2026-10-25T00:57:51.6602321Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-25T00:57:51.6602568Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-25T00:57:51.6602810Z ·  ─────────────┬──────────── 2026-10-25T00:57:51.6603093Z · ╰── Cannot access ref value during render 2026-10-25T00:57:51.6603315Z 163 │ }); 2026-10-25T00:57:51.6603665Z ╰──── 2026-10-25T00:57:51.6604246Z  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-25T00:57:51.6604979Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6605264Z 2026-10-25T00:57:51.6605449Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6605766Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29] 2026-10-25T00:57:51.6606049Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-25T00:57:51.6606300Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-25T00:57:51.6606557Z ·  ─────────────┬──────────── 2026-10-25T00:57:51.6606889Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T00:57:51.6607142Z 163 │ }); 2026-10-25T00:57:51.6607257Z ╰──── 2026-10-25T00:57:51.6607770Z  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-25T00:57:51.6608466Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6608741Z 2026-10-25T00:57:51.6609065Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6609467Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:164:23] 2026-10-25T00:57:51.6609673Z 163 │ }); 2026-10-25T00:57:51.6609887Z 164 │ confirmedTokensRef.current = tokens; 2026-10-25T00:57:51.6610125Z ·  ─────────┬────────────┬─── 2026-10-25T00:57:51.6610440Z · │ ╰── Cannot update ref value during render 2026-10-25T00:57:51.6610731Z · ╰── This value is a ref 2026-10-25T00:57:51.6610924Z 165 │ return JSON.stringify( 2026-10-25T00:57:51.6611064Z ╰──── 2026-10-25T00:57:51.6611579Z  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-25T00:57:51.6612278Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6612552Z 2026-10-25T00:57:51.6612694Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6612983Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:206:5] 2026-10-25T00:57:51.6613197Z 205 │ mostRecentEventCount, 2026-10-25T00:57:51.6613399Z 206 │ nativeEventSnapshotsRef.current, 2026-10-25T00:57:51.6613605Z ·  ───────────────┬─────────────── 2026-10-25T00:57:51.6613902Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T00:57:51.6614129Z 207 │ ); 2026-10-25T00:57:51.6614245Z ╰──── 2026-10-25T00:57:51.6614744Z  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-25T00:57:51.6615426Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6615691Z 2026-10-25T00:57:51.6615829Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6616110Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:212:5] 2026-10-25T00:57:51.6616318Z 211 │ mostRecentEventCount, 2026-10-25T00:57:51.6616486Z 212 │ nativeEventSnapshotsRef.current, 2026-10-25T00:57:51.6616746Z ·  ───────────────┬─────────────── 2026-10-25T00:57:51.6617115Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T00:57:51.6617341Z 213 │ ); 2026-10-25T00:57:51.6617447Z ╰──── 2026-10-25T00:57:51.6617944Z  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-25T00:57:51.6618627Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6618893Z 2026-10-25T00:57:51.6619074Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-25T00:57:51.6619391Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:197:6] 2026-10-25T00:57:51.6619657Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-25T00:57:51.6619899Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-25T00:57:51.6620127Z ·  ─────────┬──────── 2026-10-25T00:57:51.6620689Z · ╰── 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-25T00:57:51.6621141Z 163 │ }); 2026-10-25T00:57:51.6621292Z 164 │ confirmedTokensRef.current = tokens; 2026-10-25T00:57:51.6621463Z 165 │ return JSON.stringify( 2026-10-25T00:57:51.6621710Z 166 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-25T00:57:51.6621943Z 167 │ const record = 2026-10-25T00:57:51.6622098Z 168 │ token.type === "context" 2026-10-25T00:57:51.6622357Z 169 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-25T00:57:51.6622579Z 170 │ : undefined; 2026-10-25T00:57:51.6622767Z 171 │ const presentation = contextChipPresentation( 2026-10-25T00:57:51.6622988Z 172 │ token.type === "context" ? token.kind : token.type, 2026-10-25T00:57:51.6623169Z 173 │ record, 2026-10-25T00:57:51.6623344Z 174 │ ); 2026-10-25T00:57:51.6623502Z 175 │ const icon = contextChipIcon( 2026-10-25T00:57:51.6623663Z 176 │ presentation, 2026-10-25T00:57:51.6623883Z 177 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-25T00:57:51.6624093Z 178 │ ); 2026-10-25T00:57:51.6624221Z 179 │ return { 2026-10-25T00:57:51.6624364Z 180 │ type: token.type, 2026-10-25T00:57:51.6624519Z 181 │ source: token.source, 2026-10-25T00:57:51.6624679Z 182 │ start: token.start, 2026-10-25T00:57:51.6624828Z 183 │ end: token.end, 2026-10-25T00:57:51.6625052Z 184 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-25T00:57:51.6625262Z 185 │ label: 2026-10-25T00:57:51.6625409Z 186 │ token.type === "skill" 2026-10-25T00:57:51.6625607Z 187 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-25T00:57:51.6625808Z 188 │ : token.type === "context" 2026-10-25T00:57:51.6626133Z 189 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-25T00:57:51.6626487Z 190 │ : basename(token.value), 2026-10-25T00:57:51.6626813Z 191 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-25T00:57:51.6627057Z 192 │ iconUri: contextChipIconUri(icon), 2026-10-25T00:57:51.6627252Z 193 │ tintsIcon: icon.kind === "chip", 2026-10-25T00:57:51.6627407Z 194 │ }; 2026-10-25T00:57:51.6627528Z 195 │ }), 2026-10-25T00:57:51.6627647Z 196 │ ); 2026-10-25T00:57:51.6627840Z 197 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-25T00:57:51.6628127Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-25T00:57:51.6628463Z · ╰── This dependency list is missing values used by the callback 2026-10-25T00:57:51.6628790Z 198 │ // Every render resolves against the snapshot history, so a render whose 2026-10-25T00:57:51.6628989Z ╰──── 2026-10-25T00:57:51.6629242Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-25T00:57:51.6629739Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6630027Z 2026-10-25T00:57:51.6630207Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-25T00:57:51.6630522Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:259:5] 2026-10-25T00:57:51.6630791Z 251 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-25T00:57:51.6631024Z 252 │ nativeEventSnapshotsRef.current.push({ 2026-10-25T00:57:51.6631231Z ·  ───────────┬─────────── 2026-10-25T00:57:51.6631781Z · ╰── 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-25T00:57:51.6632265Z 253 │ eventCount: acknowledgedEventCount, 2026-10-25T00:57:51.6632429Z 254 │ value, 2026-10-25T00:57:51.6632579Z 255 │ selection: nextSelection, 2026-10-25T00:57:51.6632726Z 256 │ }); 2026-10-25T00:57:51.6632872Z 257 │ return acknowledgedEventCount; 2026-10-25T00:57:51.6633023Z 258 │ }, 2026-10-25T00:57:51.6633139Z 259 │ [], 2026-10-25T00:57:51.6633305Z ·  ─┬ 2026-10-25T00:57:51.6633573Z · ╰── This dependency list is missing values used by the callback 2026-10-25T00:57:51.6633798Z 260 │ ); 2026-10-25T00:57:51.6633905Z ╰──── 2026-10-25T00:57:51.6634156Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-25T00:57:51.6634650Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6634938Z 2026-10-25T00:57:51.6635160Z ⚠ eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used. 2026-10-25T00:57:51.6635492Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:15:8] 2026-10-25T00:57:51.6635692Z 14 │ threadSearchMatchKey, 2026-10-25T00:57:51.6635860Z 15 │ type EnvironmentThreadSearchMatch, 2026-10-25T00:57:51.6636064Z ·  ──────────────┬───────────── 2026-10-25T00:57:51.6636397Z · ╰── 'EnvironmentThreadSearchMatch' is imported here 2026-10-25T00:57:51.6636772Z 16 │ } from "@t3tools/client-runtime/state/thread-search"; 2026-10-25T00:57:51.6636936Z ╰──── 2026-10-25T00:57:51.6637082Z  help: Consider removing this import. 2026-10-25T00:57:51.6637190Z 2026-10-25T00:57:51.6637384Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T00:57:51.6637700Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:527:25] 2026-10-25T00:57:51.6637960Z 526 │ // range) the boundary string is identical and the chain would die. 2026-10-25T00:57:51.6638185Z 527 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-25T00:57:51.6638384Z ·  ───────┬────── 2026-10-25T00:57:51.6638652Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-25T00:57:51.6638941Z 528 │ const v2SearchQuery = props.searchQuery.trim().toLocaleLowerCase(); 2026-10-25T00:57:51.6639133Z ╰──── 2026-10-25T00:57:51.6639467Z  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-25T00:57:51.6640031Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6640315Z 2026-10-25T00:57:51.6640561Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T00:57:51.6640848Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:518:53] 2026-10-25T00:57:51.6641064Z 517 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-25T00:57:51.6641320Z 518 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-25T00:57:51.6641593Z ·  ─────┬──── 2026-10-25T00:57:51.6641872Z · ╰── Cannot call impure function 2026-10-25T00:57:51.6642100Z 519 │ const id = setTimeout(() => { 2026-10-25T00:57:51.6642241Z ╰──── 2026-10-25T00:57:51.6642566Z  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-25T00:57:51.6643104Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T00:57:51.6643418Z 2026-10-25T00:57:51.6643605Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T00:57:51.6643886Z ╭─[packages/shared/src/qrCode.ts:458:44] 2026-10-25T00:57:51.6644066Z 457 │ ): Array { 2026-10-25T00:57:51.6644244Z 458 │ let result: Array = divisor.map((_) => 0); 2026-10-25T00:57:51.6644459Z ·  ┬ 2026-10-25T00:57:51.6644704Z · ╰── '_' is declared here 2026-10-25T00:57:51.6644907Z 459 │ for (const b of data) { 2026-10-25T00:57:51.6645044Z ╰──── 2026-10-25T00:57:51.6645194Z  help: Consider removing this parameter. 2026-10-25T00:57:51.6645306Z 2026-10-25T00:57:51.6645446Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6645776Z ╭─[apps/mobile/src/components/ui/Menu.tsx:54:36] 2026-10-25T00:57:51.6646158Z 53 │ const child = children as ReactElement>; 2026-10-25T00:57:51.6646498Z 54 │ ╭─▶ children = cloneElement(child, { 2026-10-25T00:57:51.6646760Z 55 │ │ onTouchStart: (event) => { 2026-10-25T00:57:51.6647025Z 56 │ │ // Reset for a new touch, not onPressIn, which also fires when a 2026-10-25T00:57:51.6647329Z 57 │ │ // finger moves out of the row and back during the same gesture. 2026-10-25T00:57:51.6647604Z 58 │ │ menuPress.current.isPreparing = false; 2026-10-25T00:57:51.6647896Z 59 │ │ menuPress.current.suppressPress = menuPress.current.isOpen; 2026-10-25T00:57:51.6648173Z 60 │ │ pendingPress.current = null; 2026-10-25T00:57:51.6648413Z 61 │ │ child.props.onTouchStart?.(event); 2026-10-25T00:57:51.6648610Z 62 │ │ }, 2026-10-25T00:57:51.6648796Z 63 │ │ onPress: (event) => { 2026-10-25T00:57:51.6649068Z 64 │ │ // Accessibility clicks have no touch identifier and must not inherit 2026-10-25T00:57:51.6649366Z 65 │ │ // cancellation from a previous physical gesture. 2026-10-25T00:57:51.6649666Z 66 │ │ const isTouch = typeof event.nativeEvent.identifier === "number"; 2026-10-25T00:57:51.6650013Z 67 │ │ if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) { 2026-10-25T00:57:51.6650281Z 68 │ │ return; 2026-10-25T00:57:51.6650458Z 69 │ │ } 2026-10-25T00:57:51.6650684Z 70 │ │ if (isTouch && menuPress.current.isPreparing) { 2026-10-25T00:57:51.6650987Z 71 │ │ // A release can arrive between native menu preparation and display. 2026-10-25T00:57:51.6651309Z 72 │ │ // Let UIKit's display/cancel callback decide this press's outcome. 2026-10-25T00:57:51.6651568Z 73 │ │ event.persist(); 2026-10-25T00:57:51.6651827Z 74 │ │ pendingPress.current = () => child.props.onPress?.(event); 2026-10-25T00:57:51.6652065Z 75 │ │ return; 2026-10-25T00:57:51.6652235Z 76 │ │ } 2026-10-25T00:57:51.6652434Z 77 │ │ child.props.onPress?.(event); 2026-10-25T00:57:51.6652680Z 78 │ │ }, 2026-10-25T00:57:51.6652972Z 79 │ ├─▶ }); 2026-10-25T00:57:51.6653373Z · ╰──── Passing a ref to a function may read its value during render 2026-10-25T00:57:51.6653680Z 80 │ menuProps.onMenuInteractionStart = () => { 2026-10-25T00:57:51.6653843Z ╰──── 2026-10-25T00:57:51.6654345Z  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-25T00:57:51.6655040Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6655311Z 2026-10-25T00:57:51.6655519Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-25T00:57:51.6655859Z ╭─[packages/shared/src/composerContextLegacySend.ts:19:45] 2026-10-25T00:57:51.6656121Z 18 │ const occurrences = collectComposerContextReferences(text); 2026-10-25T00:57:51.6656358Z 19 │ for (const occurrence of [...occurrences].reverse()) { 2026-10-25T00:57:51.6656582Z ·  ─────── 2026-10-25T00:57:51.6656805Z 20 │ const record = recordsById.get(occurrence.contextId); 2026-10-25T00:57:51.6656973Z ╰──── 2026-10-25T00:57:51.6657285Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-25T00:57:51.6657530Z 2026-10-25T00:57:51.6657732Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-25T00:57:51.6658089Z ╭─[apps/web/src/components/settings/ProviderSettingsPanel.logic.ts:4:8] 2026-10-25T00:57:51.6658325Z 3 │ AuthProvidersManageScope, 2026-10-25T00:57:51.6658480Z 4 │ type AuthSessionState, 2026-10-25T00:57:51.6658645Z ·  ────────┬─────── 2026-10-25T00:57:51.6658880Z · ╰── 'AuthSessionState' is imported here 2026-10-25T00:57:51.6659087Z 5 │ type EnvironmentId, 2026-10-25T00:57:51.6659216Z ╰──── 2026-10-25T00:57:51.6659361Z  help: Consider removing this import. 2026-10-25T00:57:51.6659472Z 2026-10-25T00:57:51.6659643Z ⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`. 2026-10-25T00:57:51.6659938Z ╭─[apps/web/src/terminal/ghostty/core.ts:194:19] 2026-10-25T00:57:51.6660187Z 193 │ const count = Math.min(CHUNK_SIZE, graphemeLength - start); 2026-10-25T00:57:51.6660403Z 194 │ const codes = new Array(count); 2026-10-25T00:57:51.6660612Z ·  ──────────────────────── 2026-10-25T00:57:51.6660822Z 195 │ for (let index = 0; index < count; index += 1) { 2026-10-25T00:57:51.6660985Z ╰──── 2026-10-25T00:57:51.6661446Z  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-25T00:57:51.6661812Z 2026-10-25T00:57:51.6662065Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T00:57:51.6662519Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:361:7] 2026-10-25T00:57:51.6662880Z 355 │ }, [cancelledIncomingShareId, navigation, props.incomingShareId]); 2026-10-25T00:57:51.6663086Z 356 │ useEffect(() => { 2026-10-25T00:57:51.6663234Z ·  ────┬──── 2026-10-25T00:57:51.6663494Z · ╰── This is the containing effect 2026-10-25T00:57:51.6663711Z 357 │ if (!isReturningToProjectPicker) { 2026-10-25T00:57:51.6663876Z 358 │ return; 2026-10-25T00:57:51.6663999Z 359 │ } 2026-10-25T00:57:51.6664155Z 360 │ if (requestedInitialProjectAvailable) { 2026-10-25T00:57:51.6664354Z 361 │ setIsReturningToProjectPicker(false); 2026-10-25T00:57:51.6664564Z ·  ──────────────┬────────────── 2026-10-25T00:57:51.6664848Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.6665074Z 362 │ return; 2026-10-25T00:57:51.6665198Z ╰──── 2026-10-25T00:57:51.6665837Z  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-25T00:57:51.6666678Z  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-25T00:57:51.6666975Z 2026-10-25T00:57:51.6667227Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T00:57:51.6667619Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:504:9] 2026-10-25T00:57:51.6667831Z 447 │ 2026-10-25T00:57:51.6667951Z 448 │ useEffect(() => { 2026-10-25T00:57:51.6668099Z ·  ────┬──── 2026-10-25T00:57:51.6668304Z · ╰── This is the containing effect 2026-10-25T00:57:51.6668534Z 449 │ if (props.pendingTaskId || props.draftId) { 2026-10-25T00:57:51.6668708Z 450 │ return; 2026-10-25T00:57:51.6668828Z 451 │ } 2026-10-25T00:57:51.6669029Z 452 │ if (lastInitialProjectRefRef.current !== props.initialProjectRef) { 2026-10-25T00:57:51.6669306Z 453 │ lastInitialProjectRefRef.current = props.initialProjectRef; 2026-10-25T00:57:51.6669553Z 454 │ appliedInitialProjectKeyRef.current = null; 2026-10-25T00:57:51.6669723Z 455 │ } 2026-10-25T00:57:51.6669928Z 456 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-25T00:57:51.6670205Z 457 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-25T00:57:51.6670443Z 458 │ if (initialEnvironmentId && initialProjectId) { 2026-10-25T00:57:51.6670628Z 459 │ const directProject = 2026-10-25T00:57:51.6670781Z 460 │ projects.find( 2026-10-25T00:57:51.6670927Z 461 │ (project) => 2026-10-25T00:57:51.6671177Z 462 │ project.environmentId === initialEnvironmentId && project.id === initialProjectId, 2026-10-25T00:57:51.6671411Z 463 │ ) ?? null; 2026-10-25T00:57:51.6671538Z 464 │ 2026-10-25T00:57:51.6671663Z 465 │ if (directProject) { 2026-10-25T00:57:51.6671881Z 466 │ // Apply the route's project once. Re-applying on every change would 2026-10-25T00:57:51.6672227Z 467 │ // instantly revert environment/project switches made in the picker. 2026-10-25T00:57:51.6672614Z 468 │ const directProjectKey = `${directProject.environmentId}:${directProject.id}`; 2026-10-25T00:57:51.6672909Z 469 │ if (appliedInitialProjectKeyRef.current === directProjectKey) { 2026-10-25T00:57:51.6673116Z 470 │ return; 2026-10-25T00:57:51.6673263Z 471 │ } 2026-10-25T00:57:51.6673453Z 472 │ if (props.initialProjectRef?.branch) { 2026-10-25T00:57:51.6673621Z 473 │ if ( 2026-10-25T00:57:51.6673831Z 474 │ selectedProject?.environmentId !== directProject.environmentId || 2026-10-25T00:57:51.6674077Z 475 │ selectedProject.id !== directProject.id 2026-10-25T00:57:51.6674245Z 476 │ ) { 2026-10-25T00:57:51.6674396Z 477 │ setProject(directProject); 2026-10-25T00:57:51.6674558Z 478 │ return; 2026-10-25T00:57:51.6674692Z 479 │ } 2026-10-25T00:57:51.6674841Z 480 │ if (!flow.draftKey) return; 2026-10-25T00:57:51.6675078Z 481 │ // The route completes checkout before mounting this composer. Local 2026-10-25T00:57:51.6675362Z 482 │ // mode reuses an existing worktree; worktree mode would create another. 2026-10-25T00:57:51.6675617Z 483 │ updateComposerDraftSettings(flow.draftKey, { 2026-10-25T00:57:51.6675811Z 484 │ workspaceSelection: { 2026-10-25T00:57:51.6675973Z 485 │ mode: "local", 2026-10-25T00:57:51.6676161Z 486 │ branch: props.initialProjectRef.branch, 2026-10-25T00:57:51.6676413Z 487 │ worktreePath: props.initialProjectRef.worktreePath ?? null, 2026-10-25T00:57:51.6676637Z 488 │ startFromOrigin: false, 2026-10-25T00:57:51.6676793Z 489 │ }, 2026-10-25T00:57:51.6676922Z 490 │ }); 2026-10-25T00:57:51.6677050Z 491 │ } 2026-10-25T00:57:51.6677241Z 492 │ appliedInitialProjectKeyRef.current = directProjectKey; 2026-10-25T00:57:51.6677431Z 493 │ if ( 2026-10-25T00:57:51.6677641Z 494 │ selectedProject?.environmentId === directProject.environmentId && 2026-10-25T00:57:51.6677898Z 495 │ selectedProject.id === directProject.id 2026-10-25T00:57:51.6678066Z 496 │ ) { 2026-10-25T00:57:51.6678194Z 497 │ return; 2026-10-25T00:57:51.6678322Z 498 │ } 2026-10-25T00:57:51.6678462Z 499 │ setProject(directProject); 2026-10-25T00:57:51.6678617Z 500 │ return; 2026-10-25T00:57:51.6678742Z 501 │ } 2026-10-25T00:57:51.6678854Z 502 │ 2026-10-25T00:57:51.6678985Z 503 │ if (projects.length > 0) { 2026-10-25T00:57:51.6679172Z 504 │ setIsReturningToProjectPicker(true); 2026-10-25T00:57:51.6679394Z ·  ──────────────┬────────────── 2026-10-25T00:57:51.6679681Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.6679906Z 505 │ } 2026-10-25T00:57:51.6680017Z ╰──── 2026-10-25T00:57:51.6680752Z  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-25T00:57:51.6681583Z  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-25T00:57:51.6681883Z 2026-10-25T00:57:51.6682204Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T00:57:51.6682713Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:604:5] 2026-10-25T00:57:51.6682918Z 545 │ 2026-10-25T00:57:51.6683035Z 546 │ useEffect(() => { 2026-10-25T00:57:51.6683185Z ·  ────┬──── 2026-10-25T00:57:51.6683455Z · ╰── This is the containing effect 2026-10-25T00:57:51.6683676Z 547 │ const shareId = props.incomingShareId; 2026-10-25T00:57:51.6683859Z 548 │ const draftKey = flow.draftKey; 2026-10-25T00:57:51.6684054Z 549 │ const destinationProject = selectedProject; 2026-10-25T00:57:51.6684303Z 550 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-25T00:57:51.6684572Z 551 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-25T00:57:51.6684801Z 552 │ const selectedProjectMatchesRoute = 2026-10-25T00:57:51.6684980Z 553 │ !initialEnvironmentId || 2026-10-25T00:57:51.6685141Z 554 │ !initialProjectId || 2026-10-25T00:57:51.6685351Z 555 │ (destinationProject?.environmentId === initialEnvironmentId && 2026-10-25T00:57:51.6685592Z 556 │ destinationProject.id === initialProjectId); 2026-10-25T00:57:51.6685763Z 557 │ if ( 2026-10-25T00:57:51.6685889Z 558 │ !shareId || 2026-10-25T00:57:51.6686023Z 559 │ !draftKey || 2026-10-25T00:57:51.6686169Z 560 │ !destinationProject || 2026-10-25T00:57:51.6686342Z 561 │ !selectedProjectMatchesRoute || 2026-10-25T00:57:51.6686528Z 562 │ cancelledIncomingShareId === shareId 2026-10-25T00:57:51.6686685Z 563 │ ) { 2026-10-25T00:57:51.6686804Z 564 │ return; 2026-10-25T00:57:51.6686927Z 565 │ } 2026-10-25T00:57:51.6687085Z 566 │ const importKey = `${shareId}:${draftKey}`; 2026-10-25T00:57:51.6687253Z 567 │ if ( 2026-10-25T00:57:51.6687423Z 568 │ startedShareImportKeyRef.current === importKey || 2026-10-25T00:57:51.6687652Z 569 │ cancellingShareImportKeyRef.current === importKey 2026-10-25T00:57:51.6687834Z 570 │ ) { 2026-10-25T00:57:51.6687951Z 571 │ return; 2026-10-25T00:57:51.6688074Z 572 │ } 2026-10-25T00:57:51.6688184Z 573 │ 2026-10-25T00:57:51.6688306Z 574 │ if (!incomingShare) { 2026-10-25T00:57:51.6688577Z 575 │ if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) { 2026-10-25T00:57:51.6688892Z 576 │ alertedUnavailableIncomingShareIdRef.current = shareId; 2026-10-25T00:57:51.6689091Z 577 │ Dialog.alert( 2026-10-25T00:57:51.6689250Z 578 │ "Shared content unavailable", 2026-10-25T00:57:51.6689521Z 579 │ "The shared content is no longer in the inbox. You can continue editing this task draft.", 2026-10-25T00:57:51.6689748Z 580 │ ); 2026-10-25T00:57:51.6689870Z 581 │ } 2026-10-25T00:57:51.6689987Z 582 │ return; 2026-10-25T00:57:51.6690110Z 583 │ } 2026-10-25T00:57:51.6690220Z 584 │ 2026-10-25T00:57:51.6690329Z 585 │ if ( 2026-10-25T00:57:51.6690546Z 586 │ incomingShare.attachments.some((attachment) => attachment.type === "file") && 2026-10-25T00:57:51.6690807Z 587 │ selectedEnvironmentServerConfig === null 2026-10-25T00:57:51.6690974Z 588 │ ) { 2026-10-25T00:57:51.6691090Z 589 │ return; 2026-10-25T00:57:51.6691214Z 590 │ } 2026-10-25T00:57:51.6691323Z 591 │ 2026-10-25T00:57:51.6691509Z 592 │ if (alertedUnavailableIncomingShareIdRef.current === shareId) { 2026-10-25T00:57:51.6691828Z 593 │ alertedUnavailableIncomingShareIdRef.current = null; 2026-10-25T00:57:51.6692090Z 594 │ } 2026-10-25T00:57:51.6692250Z 595 │ startedShareImportKeyRef.current = importKey; 2026-10-25T00:57:51.6692433Z 596 │ const draftBackup = 2026-10-25T00:57:51.6692696Z 597 │ shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey); 2026-10-25T00:57:51.6693011Z 598 │ shareImportDraftBackupRef.current.set(importKey, draftBackup); 2026-10-25T00:57:51.6693240Z 599 │ const importToken = Symbol(importKey); 2026-10-25T00:57:51.6693455Z 600 │ let didReserveShare = false; 2026-10-25T00:57:51.6693626Z 601 │ let didConsumeShare = false; 2026-10-25T00:57:51.6693793Z 602 │ let needsDraftRestore = false; 2026-10-25T00:57:51.6693998Z 603 │ activeShareImportTokenRef.current = importToken; 2026-10-25T00:57:51.6694198Z 604 │ setImportingShareKey(importKey); 2026-10-25T00:57:51.6694387Z ·  ──────────┬───────── 2026-10-25T00:57:51.6694654Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.6694719Z 605 │ void (async () => { 2026-10-25T00:57:51.6694769Z ╰──── 2026-10-25T00:57:51.6695347Z  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-25T00:57:51.6695661Z  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-25T00:57:51.6695664Z 2026-10-25T00:57:51.6695865Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T00:57:51.6696015Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:524:5] 2026-10-25T00:57:51.6696089Z 523 │ props.initialProjectRef, 2026-10-25T00:57:51.6696158Z 524 │ props.incomingShareId, 2026-10-25T00:57:51.6696243Z ·  ──────────┬────────── 2026-10-25T00:57:51.6696406Z · ╰── Unnecessary dependency `props.incomingShareId` 2026-10-25T00:57:51.6696474Z 525 │ props.pendingTaskId, 2026-10-25T00:57:51.6696522Z ╰──── 2026-10-25T00:57:51.6696805Z  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-25T00:57:51.6697109Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6697114Z 2026-10-25T00:57:51.6697321Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T00:57:51.6697466Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:543:5] 2026-10-25T00:57:51.6697579Z 542 │ loadedBranchesProjectKeyRef.current = projectKey; 2026-10-25T00:57:51.6697645Z 543 │ flow.loadBranches(); 2026-10-25T00:57:51.6697713Z ·  ──┬─ 2026-10-25T00:57:51.6697833Z · ╰── Missing dependency `flow` 2026-10-25T00:57:51.6697924Z 544 │ }, [flow.loadBranches, selectedProject]); 2026-10-25T00:57:51.6698006Z ·  ────────┬──────── 2026-10-25T00:57:51.6698255Z · ╰── Overly precise dependency `flow.loadBranches`, use `flow` instead 2026-10-25T00:57:51.6698367Z 545 │ 2026-10-25T00:57:51.6698425Z ╰──── 2026-10-25T00:57:51.6698833Z  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-25T00:57:51.6699134Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6699137Z 2026-10-25T00:57:51.6699331Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T00:57:51.6699474Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:766:5] 2026-10-25T00:57:51.6699536Z 765 │ flow.draftKey, 2026-10-25T00:57:51.6699615Z 766 │ hasImportedIncomingShare, 2026-10-25T00:57:51.6699705Z ·  ────────────┬─────────── 2026-10-25T00:57:51.6699871Z · ╰── Unnecessary dependency `hasImportedIncomingShare` 2026-10-25T00:57:51.6699935Z 767 │ incomingShare, 2026-10-25T00:57:51.6700015Z 768 │ isIncomingShareInboxLoading, 2026-10-25T00:57:51.6700110Z ·  ─────────────┬───────────── 2026-10-25T00:57:51.6700285Z · ╰── Unnecessary dependency `isIncomingShareInboxLoading` 2026-10-25T00:57:51.6734740Z 769 │ isIncomingShareUnavailable, 2026-10-25T00:57:51.6734887Z 770 │ props.incomingShareId, 2026-10-25T00:57:51.6734998Z 771 │ props.initialProjectRef?.environmentId, 2026-10-25T00:57:51.6735087Z 772 │ props.initialProjectRef?.projectId, 2026-10-25T00:57:51.6735173Z 773 │ releaseShareReservation, 2026-10-25T00:57:51.6735238Z 774 │ reserveShare, 2026-10-25T00:57:51.6735319Z 775 │ selectedEnvironmentServerConfig, 2026-10-25T00:57:51.6735383Z 776 │ selectedProject, 2026-10-25T00:57:51.6735449Z 777 │ shareImportAttempt, 2026-10-25T00:57:51.6735537Z ·  ─────────┬──────── 2026-10-25T00:57:51.6735719Z · ╰── Unnecessary dependency `shareImportAttempt` 2026-10-25T00:57:51.6735772Z 778 │ ]); 2026-10-25T00:57:51.6735823Z ╰──── 2026-10-25T00:57:51.6736116Z  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-25T00:57:51.6736567Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6736624Z 2026-10-25T00:57:51.6736859Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T00:57:51.6737016Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:698:76] 2026-10-25T00:57:51.6737190Z 697 │ const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() })); 2026-10-25T00:57:51.6737350Z 698 │ if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() }); 2026-10-25T00:57:51.6737484Z ·  ─────┬──── 2026-10-25T00:57:51.6737662Z · ╰── Cannot call impure function 2026-10-25T00:57:51.6737798Z 699 │ const snoozeGateNow = new Date(snoozeGateClock.now).toISOString(); 2026-10-25T00:57:51.6737850Z ╰──── 2026-10-25T00:57:51.6738125Z  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-25T00:57:51.6738406Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T00:57:51.6738409Z 2026-10-25T00:57:51.6738569Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T00:57:51.6738721Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:719:71] 2026-10-25T00:57:51.6738797Z 718 │ const snoozePresets = useMemo( 2026-10-25T00:57:51.6738966Z 719 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-25T00:57:51.6739097Z ·  ─────┬──── 2026-10-25T00:57:51.6739271Z · ╰── Cannot call impure function 2026-10-25T00:57:51.6739382Z 720 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-25T00:57:51.6739432Z ╰──── 2026-10-25T00:57:51.6739695Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T00:57:51.6739973Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T00:57:51.6739976Z 2026-10-25T00:57:51.6740155Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-25T00:57:51.6740306Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:720:6] 2026-10-25T00:57:51.6740472Z 719 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-25T00:57:51.6740582Z 720 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-25T00:57:51.6740671Z ·  ────────────┬─────────── 2026-10-25T00:57:51.6740838Z · ╰── Unnecessary dependency `props.snoozePresetMinute` 2026-10-25T00:57:51.6740890Z 721 │ ); 2026-10-25T00:57:51.6740938Z ╰──── 2026-10-25T00:57:51.6741241Z  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-25T00:57:51.6741584Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6741616Z 2026-10-25T00:57:51.6741826Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-25T00:57:51.6741976Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:766:7] 2026-10-25T00:57:51.6742042Z 765 │ thread.pinnedAt, 2026-10-25T00:57:51.6742101Z 766 │ variant, 2026-10-25T00:57:51.6742171Z ·  ───┬─── 2026-10-25T00:57:51.6742300Z · ╰── Unnecessary dependency `variant` 2026-10-25T00:57:51.6742352Z 767 │ ], 2026-10-25T00:57:51.6742399Z ╰──── 2026-10-25T00:57:51.6742703Z  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-25T00:57:51.6743002Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6743004Z 2026-10-25T00:57:51.6743190Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T00:57:51.6743385Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1216:21] 2026-10-25T00:57:51.6743514Z 1215 │ {providerDrivers.slice(0, -1).map((driver, index) => ( 2026-10-25T00:57:51.6743643Z 1216 │ 2026-10-25T00:57:51.6743753Z ·  ────────────────────────── 2026-10-25T00:57:51.6743857Z 1217 │ 2026-10-25T00:57:51.6743912Z ╰──── 2026-10-25T00:57:51.6744057Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-25T00:57:51.6744059Z 2026-10-25T00:57:51.6744273Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-25T00:57:51.6744385Z ╭─[packages/shared/src/serverSettings.ts:346:9] 2026-10-25T00:57:51.6744483Z 345 │ const entry: ProjectSettingsOverrides = { 2026-10-25T00:57:51.6744607Z 346 │ ...(entries.get(projectId) ?? currentEntries[projectId] ?? {}), 2026-10-25T00:57:51.6744756Z ·  ────────────────────────────────────────────────────────────── 2026-10-25T00:57:51.6744810Z 347 │ }; 2026-10-25T00:57:51.6744857Z ╰──── 2026-10-25T00:57:51.6745118Z  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-25T00:57:51.6745123Z 2026-10-25T00:57:51.6745333Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in Array.prototype.reduce() 2026-10-25T00:57:51.6745447Z ╭─[packages/shared/src/serverSettings.ts:448:24] 2026-10-25T00:57:51.6745512Z 447 │ const favorites = 2026-10-25T00:57:51.6745614Z 448 │ setModelFavorites?.reduce((current, change) => { 2026-10-25T00:57:51.6745698Z ·  ───┬── 2026-10-25T00:57:51.6745815Z · ╰── For this reduce 2026-10-25T00:57:51.6745894Z 449 │ const exists = current.some( 2026-10-25T00:57:51.6746058Z 450 │ (favorite) => favorite.provider === change.provider && favorite.model === change.model, 2026-10-25T00:57:51.6746110Z 451 │ ); 2026-10-25T00:57:51.6746229Z 452 │ return change.favorite 2026-10-25T00:57:51.6746348Z 453 │ ? exists 2026-10-25T00:57:51.6746412Z 454 │ ? current 2026-10-25T00:57:51.6746542Z 455 │ : [...current, { provider: change.provider, model: change.model }] 2026-10-25T00:57:51.6746624Z ·  ─────┬──── 2026-10-25T00:57:51.6746738Z · ╰── From this spread 2026-10-25T00:57:51.6746804Z 456 │ : current.filter( 2026-10-25T00:57:51.6746852Z ╰──── 2026-10-25T00:57:51.6747047Z  help: Consider using `Object.assign()` or `Array.prototype.push()` to mutate the accumulator instead. 2026-10-25T00:57:51.6747197Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-25T00:57:51.6747201Z 2026-10-25T00:57:51.6747384Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-25T00:57:51.6747497Z ╭─[packages/shared/src/serverSettings.ts:466:3] 2026-10-25T00:57:51.6747553Z 464 │ null; 2026-10-25T00:57:51.6747664Z 465 │ let nextModelPreferences = initialModelPreferences; 2026-10-25T00:57:51.6747748Z ·  ──────────┬───────── 2026-10-25T00:57:51.6747870Z · ╰── From this accumulator 2026-10-25T00:57:51.6747965Z 466 │ for (const change of setModelsHidden ?? []) { 2026-10-25T00:57:51.6748028Z ·  ─┬─ 2026-10-25T00:57:51.6748128Z · ╰── For this loop 2026-10-25T00:57:51.6748256Z 467 │ const preferences = nextModelPreferences?.[change.provider] ?? { 2026-10-25T00:57:51.6748321Z 468 │ hiddenModels: [], 2026-10-25T00:57:51.6748381Z 469 │ modelOrder: [], 2026-10-25T00:57:51.6748443Z 470 │ }; 2026-10-25T00:57:51.6748616Z 471 │ const hiddenModels = preferences.hiddenModels.filter((model) => model !== change.model); 2026-10-25T00:57:51.6748720Z 472 │ if (change.hidden) hiddenModels.push(change.model); 2026-10-25T00:57:51.6748789Z 473 │ nextModelPreferences = { 2026-10-25T00:57:51.6748862Z 474 │ ...nextModelPreferences, 2026-10-25T00:57:51.6748951Z ·  ───────────┬─────────── 2026-10-25T00:57:51.6749069Z · ╰── From this spread 2026-10-25T00:57:51.6749173Z 475 │ [change.provider]: { ...preferences, hiddenModels }, 2026-10-25T00:57:51.6749222Z ╰──── 2026-10-25T00:57:51.6749370Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-25T00:57:51.6749524Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-25T00:57:51.6749529Z 2026-10-25T00:57:51.6749689Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T00:57:51.6749801Z ╭─[apps/web/src/components/Sidebar.tsx:1136:11] 2026-10-25T00:57:51.6749898Z 1135 │ foldSearchQuery(threadSearchQuery), 2026-10-25T00:57:51.6749960Z 1136 │ Date.now(), 2026-10-25T00:57:51.6750037Z ·  ─────┬──── 2026-10-25T00:57:51.6750163Z · ╰── Cannot call impure function 2026-10-25T00:57:51.6750295Z 1137 │ // A list filter, as on mobile: a pick would move rows unexplained. 2026-10-25T00:57:51.6750344Z ╰──── 2026-10-25T00:57:51.6750664Z  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-25T00:57:51.6751015Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T00:57:51.6751018Z 2026-10-25T00:57:51.6751223Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T00:57:51.6751388Z ╭─[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:249:7] 2026-10-25T00:57:51.6751464Z 248 │ mountedRef.current = false; 2026-10-25T00:57:51.6751535Z 249 │ flow.setBranchQuery(""); 2026-10-25T00:57:51.6751600Z ·  ──┬─ 2026-10-25T00:57:51.6751720Z · ╰── Missing dependency `flow` 2026-10-25T00:57:51.6751772Z 250 │ }; 2026-10-25T00:57:51.6751840Z 251 │ }, [flow.setBranchQuery]); 2026-10-25T00:57:51.6751928Z ·  ─────────┬───────── 2026-10-25T00:57:51.6752126Z · ╰── Overly precise dependency `flow.setBranchQuery`, use `flow` instead 2026-10-25T00:57:51.6752176Z 252 │ 2026-10-25T00:57:51.6752222Z ╰──── 2026-10-25T00:57:51.6752628Z  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-25T00:57:51.6752927Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6752929Z 2026-10-25T00:57:51.6753183Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T00:57:51.6753375Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:404:5] 2026-10-25T00:57:51.6753425Z 402 │ 2026-10-25T00:57:51.6753487Z 403 │ useEffect(() => { 2026-10-25T00:57:51.6753554Z ·  ────┬──── 2026-10-25T00:57:51.6753677Z · ╰── This is the containing effect 2026-10-25T00:57:51.6753763Z 404 │ setInspectorSelection((current) => { 2026-10-25T00:57:51.6753845Z ·  ──────────┬────────── 2026-10-25T00:57:51.6754011Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.6754109Z 405 │ if (props.renderInspector === undefined) { 2026-10-25T00:57:51.6754156Z ╰──── 2026-10-25T00:57:51.6754790Z  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-25T00:57:51.6755171Z  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-25T00:57:51.6755174Z 2026-10-25T00:57:51.6755378Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-25T00:57:51.6755524Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:532:24] 2026-10-25T00:57:51.6755677Z 531 │ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top; 2026-10-25T00:57:51.6755846Z 532 │ ╭─▶ const GitInspector = () => ( 2026-10-25T00:57:51.6755940Z 533 │ │ 2026-10-25T00:57:51.6756522Z 538 │ ╰─▶ ); 2026-10-25T00:57:51.6756597Z 539 │ const FilesInspector = () => 2026-10-25T00:57:51.6756647Z ╰──── 2026-10-25T00:57:51.6756858Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-25T00:57:51.6756861Z 2026-10-25T00:57:51.6757071Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-25T00:57:51.6757219Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:539:26] 2026-10-25T00:57:51.6757273Z 538 │ ); 2026-10-25T00:57:51.6757432Z 539 │ ╭─▶ const FilesInspector = () => 2026-10-25T00:57:51.6757577Z 540 │ │ selectedThread !== null && selectedThreadCwd !== null ? ( 2026-10-25T00:57:51.6757680Z 541 │ │ 2026-10-25T00:57:51.6758608Z 549 │ ╰─▶ ) : null; 2026-10-25T00:57:51.6758752Z 550 │ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset); 2026-10-25T00:57:51.6758800Z ╰──── 2026-10-25T00:57:51.6759007Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-25T00:57:51.6759010Z 2026-10-25T00:57:51.6759218Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-25T00:57:51.6759392Z ╭─[apps/server/src/processRunner.test.ts:266:14] 2026-10-25T00:57:51.6759443Z 265 │ 2026-10-25T00:57:51.6759541Z 266 │ for (const {} of ["timeout", "success"] as const) { 2026-10-25T00:57:51.6759610Z ·  ── 2026-10-25T00:57:51.6759660Z 267 │ } 2026-10-25T00:57:51.6759709Z ╰──── 2026-10-25T00:57:51.6759929Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-25T00:57:51.6759932Z 2026-10-25T00:57:51.6760071Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6760215Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:152:27] 2026-10-25T00:57:51.6760395Z 151 │ 2026-10-25T00:57:51.6760571Z 152 │ {props.children(open)} 2026-10-25T00:57:51.6760694Z ·  ──┬─ 2026-10-25T00:57:51.6760848Z · ╰── Cannot access ref value during render 2026-10-25T00:57:51.6760907Z 153 │ 2026-10-25T00:57:51.6760955Z ╰──── 2026-10-25T00:57:51.6761408Z  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-25T00:57:51.6761689Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6761691Z 2026-10-25T00:57:51.6761884Z ⚠ react(memo-dependencies): Found missing/extra memoization dependencies 2026-10-25T00:57:51.6762032Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:140:9] 2026-10-25T00:57:51.6762109Z 139 │ if (action.id !== undefined) { 2026-10-25T00:57:51.6762183Z 140 │ props.onPressAction?.({ 2026-10-25T00:57:51.6762250Z ·  ──┬── 2026-10-25T00:57:51.6762377Z · ╰── Missing dependency `props` 2026-10-25T00:57:51.6762465Z 141 │ nativeEvent: { event: action.id }, 2026-10-25T00:57:51.6762609Z 142 │ } as Parameters>[0]); 2026-10-25T00:57:51.6762660Z 143 │ } 2026-10-25T00:57:51.6762711Z 144 │ }, 2026-10-25T00:57:51.6762788Z 145 │ [close, props.onPressAction], 2026-10-25T00:57:51.6762884Z ·  ─────────┬───────── 2026-10-25T00:57:51.6763091Z · ╰── Overly precise dependency `props.onPressAction`, use `props` instead 2026-10-25T00:57:51.6763142Z 146 │ ); 2026-10-25T00:57:51.6763191Z ╰──── 2026-10-25T00:57:51.6763694Z  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-25T00:57:51.6763997Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6764001Z 2026-10-25T00:57:51.6764434Z ⚠ 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-25T00:57:51.6764637Z ╭─[apps/server/src/assets/AssetAccess.test.ts:975:35] 2026-10-25T00:57:51.6764782Z 974 │ // Every client and server release spells the resource this way on the wire. 2026-10-25T00:57:51.6764929Z 975 │ const { resource } = yield* Schema.decodeUnknownEffect(AssetCreateUrlInput)({ 2026-10-25T00:57:51.6765047Z ·  ────────────────────────── 2026-10-25T00:57:51.6765156Z 976 │ resource: { _tag: "github-media", cwd: "/repo", url }, 2026-10-25T00:57:51.6765205Z ╰──── 2026-10-25T00:57:51.6765207Z 2026-10-25T00:57:51.6765646Z ⚠ 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-25T00:57:51.6765773Z ╭─[apps/server/src/assets/AssetAccess.test.ts:1012:32] 2026-10-25T00:57:51.6765905Z 1011 │ expect(error._tag).toBe("AssetGitHubMediaUrlValidationError"); 2026-10-25T00:57:51.6766084Z 1012 │ const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(AssetAccessError))(error); 2026-10-25T00:57:51.6766194Z ·  ─────────────────── 2026-10-25T00:57:51.6766283Z 1013 │ expect(encoded).not.toContain(url); 2026-10-25T00:57:51.6766332Z ╰──── 2026-10-25T00:57:51.6766334Z 2026-10-25T00:57:51.6766495Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T00:57:51.6766620Z ╭─[apps/web/src/components/CommandPalette.tsx:2037:20] 2026-10-25T00:57:51.6766737Z 2036 │ title: inferProjectTitleFromPath(destinationPath), 2026-10-25T00:57:51.6766828Z 2037 │ createdAt: new Date().toISOString(), 2026-10-25T00:57:51.6766913Z ·  ─────┬──── 2026-10-25T00:57:51.6767053Z · ╰── Cannot call impure function 2026-10-25T00:57:51.6767156Z 2038 │ remoteUrl: addProjectCloneFlow.remoteUrl, 2026-10-25T00:57:51.6767204Z ╰──── 2026-10-25T00:57:51.6767474Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T00:57:51.6767758Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T00:57:51.6767760Z 2026-10-25T00:57:51.6768013Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T00:57:51.6768136Z ╭─[apps/server/src/serverRuntimeStartup.ts:728:7] 2026-10-25T00:57:51.6768184Z 727 │ 2026-10-25T00:57:51.6768262Z 728 │ const layer = layerWithOptions(); 2026-10-25T00:57:51.6768328Z ·  ──┬── 2026-10-25T00:57:51.6768446Z · ╰── 'layer' is declared here 2026-10-25T00:57:51.6768495Z ╰──── 2026-10-25T00:57:51.6768595Z  help: Consider removing this declaration. 2026-10-25T00:57:51.6768597Z 2026-10-25T00:57:51.6768847Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T00:57:51.6769018Z ╭─[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:60:5] 2026-10-25T00:57:51.6769119Z 58 │ 2026-10-25T00:57:51.6769245Z 59 │ useEffect(() => { 2026-10-25T00:57:51.6769314Z ·  ────┬──── 2026-10-25T00:57:51.6769437Z · ╰── This is the containing effect 2026-10-25T00:57:51.6769514Z 60 │ setMountedModes((current) => { 2026-10-25T00:57:51.6769589Z ·  ───────┬─────── 2026-10-25T00:57:51.6769750Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.6769827Z 61 │ if (current.has(props.mode)) { 2026-10-25T00:57:51.6769878Z ╰──── 2026-10-25T00:57:51.6770464Z  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-25T00:57:51.6770780Z  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-25T00:57:51.6770782Z 2026-10-25T00:57:51.6771000Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-25T00:57:51.6771118Z ╭─[apps/server/src/terminal/Manager.test.ts:731:31] 2026-10-25T00:57:51.6771172Z 730 │ ); 2026-10-25T00:57:51.6771337Z 731 │ const snapshot = events.filter((event) => event.type === "snapshot").at(-1)?.snapshot; 2026-10-25T00:57:51.6771430Z ·  ────── 2026-10-25T00:57:51.6771537Z 732 │ expect(snapshot?.history).toBe("aa😀\rEND"); 2026-10-25T00:57:51.6771587Z ╰──── 2026-10-25T00:57:51.6771759Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-25T00:57:51.6771764Z 2026-10-25T00:57:51.6771953Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T00:57:51.6772094Z ╭─[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9] 2026-10-25T00:57:51.6772177Z 35 │ 0 && !threadSearchQuery.startsWith(">") && !isOpen) { 2026-10-25T00:57:51.6773192Z 152 │ claimThreadOpen(thread.environmentId, thread.id, Date.now()); 2026-10-25T00:57:51.6773322Z ·  ─────┬──── 2026-10-25T00:57:51.6773521Z · ╰── Cannot call impure function 2026-10-25T00:57:51.6773573Z 153 │ } 2026-10-25T00:57:51.6773622Z ╰──── 2026-10-25T00:57:51.6773897Z  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-25T00:57:51.6774229Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T00:57:51.6774256Z 2026-10-25T00:57:51.6774544Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T00:57:51.6774697Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:40:5] 2026-10-25T00:57:51.6774805Z 37 │ const [initialized, setInitialized] = useState(false); 2026-10-25T00:57:51.6774878Z 38 │ useLayoutEffect(() => { 2026-10-25T00:57:51.6774952Z ·  ───────┬─────── 2026-10-25T00:57:51.6775078Z · ╰── This is the containing effect 2026-10-25T00:57:51.6775136Z 39 │ reset(); 2026-10-25T00:57:51.6775201Z 40 │ setInitialized(true); 2026-10-25T00:57:51.6775282Z ·  ───────┬────── 2026-10-25T00:57:51.6775445Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.6775504Z 41 │ }, [reset]); 2026-10-25T00:57:51.6775553Z ╰──── 2026-10-25T00:57:51.6776135Z  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-25T00:57:51.6776446Z  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-25T00:57:51.6776449Z 2026-10-25T00:57:51.6776703Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T00:57:51.6776858Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:93:5] 2026-10-25T00:57:51.6776906Z 88 │ 2026-10-25T00:57:51.6776966Z 89 │ useEffect(() => { 2026-10-25T00:57:51.6777032Z ·  ────┬──── 2026-10-25T00:57:51.6777155Z · ╰── This is the containing effect 2026-10-25T00:57:51.6777306Z 90 │ if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return; 2026-10-25T00:57:51.6777407Z 91 │ const branchName = initialProjectRef.branch; 2026-10-25T00:57:51.6777468Z 92 │ let active = true; 2026-10-25T00:57:51.6777559Z 93 │ setPendingCheckouts((count) => count + 1); 2026-10-25T00:57:51.6777640Z ·  ─────────┬───────── 2026-10-25T00:57:51.6777810Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.6777963Z 94 │ // Serialize replacements: ignoring a stale result cannot undo its Git mutation. 2026-10-25T00:57:51.6778012Z ╰──── 2026-10-25T00:57:51.6778592Z  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-25T00:57:51.6778903Z  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-25T00:57:51.6778905Z 2026-10-25T00:57:51.6779108Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T00:57:51.6779300Z ╭─[apps/web/src/components/CustomSnoozeDialog.tsx:140:58] 2026-10-25T00:57:51.6779430Z 139 │ {...(weekStartsOn === undefined ? {} : { weekStartsOn })} 2026-10-25T00:57:51.6779573Z 140 │ disabled={{ before: new Date(new Date().setHours(0, 0, 0, 0)) }} 2026-10-25T00:57:51.6779691Z ·  ─────┬──── 2026-10-25T00:57:51.6779852Z · ╰── Cannot call impure function 2026-10-25T00:57:51.6779946Z 141 │ onSelect={(selected) => { 2026-10-25T00:57:51.6779996Z ╰──── 2026-10-25T00:57:51.6780269Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T00:57:51.6780553Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T00:57:51.6780556Z 2026-10-25T00:57:51.6780804Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T00:57:51.6780951Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:57:5] 2026-10-25T00:57:51.6781000Z 55 │ 2026-10-25T00:57:51.6781059Z 56 │ useEffect(() => { 2026-10-25T00:57:51.6781128Z ·  ────┬──── 2026-10-25T00:57:51.6781251Z · ╰── This is the containing effect 2026-10-25T00:57:51.6781316Z 57 │ setDecodedSize(null); 2026-10-25T00:57:51.6781389Z ·  ───────┬────── 2026-10-25T00:57:51.6781554Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.6781624Z 58 │ }, [props.sourceKey]); 2026-10-25T00:57:51.6781674Z ╰──── 2026-10-25T00:57:51.6782256Z  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-25T00:57:51.6782564Z  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-25T00:57:51.6782567Z 2026-10-25T00:57:51.6782858Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T00:57:51.6783077Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5] 2026-10-25T00:57:51.6783126Z 59 │ 2026-10-25T00:57:51.6783186Z 60 │ useEffect(() => { 2026-10-25T00:57:51.6783280Z ·  ────┬──── 2026-10-25T00:57:51.6783414Z · ╰── This is the containing effect 2026-10-25T00:57:51.6783480Z 61 │ setFailedUri(null); 2026-10-25T00:57:51.6783552Z ·  ──────┬───── 2026-10-25T00:57:51.6783711Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.6783773Z 62 │ }, [props.uri]); 2026-10-25T00:57:51.6783823Z ╰──── 2026-10-25T00:57:51.6784405Z  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-25T00:57:51.6784718Z  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-25T00:57:51.6784720Z 2026-10-25T00:57:51.6784927Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-25T00:57:51.6785072Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10] 2026-10-25T00:57:51.6785192Z 6 │ import { parse, SvgAst, type JsxAST } from "react-native-svg"; 2026-10-25T00:57:51.6785362Z 7 │ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native"; 2026-10-25T00:57:51.6785454Z ·  ────────┬──────── 2026-10-25T00:57:51.6785600Z · ╰── 'ActivityIndicator' is imported here 2026-10-25T00:57:51.6785651Z 8 │ 2026-10-25T00:57:51.6785698Z ╰──── 2026-10-25T00:57:51.6785795Z  help: Consider removing this import. 2026-10-25T00:57:51.6785797Z 2026-10-25T00:57:51.6785991Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T00:57:51.6786135Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7] 2026-10-25T00:57:51.6786198Z 57 │ setDecodedSize(null); 2026-10-25T00:57:51.6786264Z 58 │ }, [props.sourceKey]); 2026-10-25T00:57:51.6786342Z ·  ───────┬─────── 2026-10-25T00:57:51.6786491Z · ╰── Unnecessary dependency `props.sourceKey` 2026-10-25T00:57:51.6786546Z 59 │ 2026-10-25T00:57:51.6786598Z ╰──── 2026-10-25T00:57:51.6786881Z  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-25T00:57:51.6787182Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6787184Z 2026-10-25T00:57:51.6787378Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T00:57:51.6787519Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7] 2026-10-25T00:57:51.6787584Z 61 │ setFailedUri(null); 2026-10-25T00:57:51.6787646Z 62 │ }, [props.uri]); 2026-10-25T00:57:51.6787716Z ·  ────┬──── 2026-10-25T00:57:51.6787901Z · ╰── Unnecessary dependency `props.uri` 2026-10-25T00:57:51.6788002Z 63 │ 2026-10-25T00:57:51.6788063Z ╰──── 2026-10-25T00:57:51.6788347Z  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-25T00:57:51.6788645Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6788647Z 2026-10-25T00:57:51.6788896Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T00:57:51.6789023Z ╭─[packages/provider-pi/src/server/adapter.ts:3405:7] 2026-10-25T00:57:51.6789075Z 3404 │ 2026-10-25T00:57:51.6789258Z 3405 │ const layer: Layer.Layer = 2026-10-25T00:57:51.6789331Z ·  ──┬── 2026-10-25T00:57:51.6789452Z · ╰── 'layer' is declared here 2026-10-25T00:57:51.6789515Z 3406 │ Layer.effect( 2026-10-25T00:57:51.6789564Z ╰──── 2026-10-25T00:57:51.6789666Z  help: Consider removing this declaration. 2026-10-25T00:57:51.6789668Z 2026-10-25T00:57:51.6789860Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T00:57:51.6789985Z ╭─[apps/mobile/src/components/ComposerEditor.tsx:82:6] 2026-10-25T00:57:51.6790035Z 81 │ }, 2026-10-25T00:57:51.6790095Z 82 │ [draftKey], 2026-10-25T00:57:51.6790165Z ·  ────┬─── 2026-10-25T00:57:51.6790307Z · ╰── Unnecessary dependency `draftKey` 2026-10-25T00:57:51.6790361Z 83 │ ); 2026-10-25T00:57:51.6790411Z ╰──── 2026-10-25T00:57:51.6790692Z  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-25T00:57:51.6790990Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6790992Z 2026-10-25T00:57:51.6791142Z ⚠ react(immutability): This value cannot be modified 2026-10-25T00:57:51.6791281Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:174:5] 2026-10-25T00:57:51.6791421Z 170 │ const expandedAngle = props.collapsedDirection === "right" ? 90 : 180; 2026-10-25T00:57:51.6791558Z 171 │ const rotation = useSharedValue(props.expanded ? expandedAngle : 0); 2026-10-25T00:57:51.6791631Z ·  ────┬─── 2026-10-25T00:57:51.6791757Z · ╰── `rotation` originates here 2026-10-25T00:57:51.6791808Z 172 │ 2026-10-25T00:57:51.6791876Z 173 │ useLayoutEffect(() => { 2026-10-25T00:57:51.6792009Z 174 │ rotation.value = withTiming(props.expanded ? expandedAngle : 0, { 2026-10-25T00:57:51.6792078Z ·  ────┬─── 2026-10-25T00:57:51.6792205Z · ╰── `rotation` cannot be modified 2026-10-25T00:57:51.6792301Z 175 │ duration: THREAD_DISCLOSURE_TRANSITION_MS, 2026-10-25T00:57:51.6792351Z ╰──── 2026-10-25T00:57:51.6792653Z  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-25T00:57:51.6793017Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T00:57:51.6793019Z 2026-10-25T00:57:51.6793207Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T00:57:51.6793417Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:1246:23] 2026-10-25T00:57:51.6793480Z 1245 │ => 2026-10-25T00:57:51.6794641Z ·  ──────────┬────────── 2026-10-25T00:57:51.6794793Z · ╰── 'revokeActiveMcpThread' is declared here 2026-10-25T00:57:51.6794975Z 219 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeThread(threadId) : Effect.void; 2026-10-25T00:57:51.6795024Z ╰──── 2026-10-25T00:57:51.6795130Z  help: Consider removing this declaration. 2026-10-25T00:57:51.6795135Z 2026-10-25T00:57:51.6795431Z ⚠ eslint(no-unused-vars): Variable 'revokeAllActiveMcpCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-25T00:57:51.6795552Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:221:7] 2026-10-25T00:57:51.6795601Z 220 │ 2026-10-25T00:57:51.6795732Z 221 │ const revokeAllActiveMcpCredentials = (): Effect.Effect => 2026-10-25T00:57:51.6795834Z ·  ──────────────┬────────────── 2026-10-25T00:57:51.6796005Z · ╰── 'revokeAllActiveMcpCredentials' is declared here 2026-10-25T00:57:51.6796160Z 222 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void; 2026-10-25T00:57:51.6796210Z ╰──── 2026-10-25T00:57:51.6796316Z  help: Consider removing this declaration. 2026-10-25T00:57:51.6796322Z 2026-10-25T00:57:51.6796571Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T00:57:51.6796729Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:217:7] 2026-10-25T00:57:51.6796783Z 213 │ }; 2026-10-25T00:57:51.6796847Z 214 │ useEffect(() => { 2026-10-25T00:57:51.6796917Z ·  ────┬──── 2026-10-25T00:57:51.6797041Z · ╰── This is the containing effect 2026-10-25T00:57:51.6797209Z 215 │ const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null; 2026-10-25T00:57:51.6797273Z 216 │ if (inserted) { 2026-10-25T00:57:51.6797346Z 217 │ setSelection((current) => 2026-10-25T00:57:51.6797419Z ·  ──────┬───── 2026-10-25T00:57:51.6797633Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.6797871Z 218 │ current.start === inserted.start && current.end === inserted.end ? current : inserted, 2026-10-25T00:57:51.6797921Z ╰──── 2026-10-25T00:57:51.6798500Z  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-25T00:57:51.6798812Z  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-25T00:57:51.6798814Z 2026-10-25T00:57:51.6799069Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T00:57:51.6799229Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:298:7] 2026-10-25T00:57:51.6799303Z 286 │ }, [hasWorkspaceSnapshot]); 2026-10-25T00:57:51.6799363Z 287 │ useEffect(() => { 2026-10-25T00:57:51.6799430Z ·  ────┬──── 2026-10-25T00:57:51.6799555Z · ╰── This is the containing effect 2026-10-25T00:57:51.6799696Z 288 │ if (!environmentId || !projectCwd || !selectedProviderInstanceId) return; 2026-10-25T00:57:51.6799839Z 289 │ const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`; 2026-10-25T00:57:51.6799906Z 290 │ const now = Date.now(); 2026-10-25T00:57:51.6800017Z 291 │ const lastRequest = workspaceRefreshKeyRef.current; 2026-10-25T00:57:51.6800078Z 292 │ if ( 2026-10-25T00:57:51.6800154Z 293 │ lastRequest?.key === key && 2026-10-25T00:57:51.6800288Z 294 │ now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS 2026-10-25T00:57:51.6800340Z 295 │ ) 2026-10-25T00:57:51.6800399Z 296 │ return; 2026-10-25T00:57:51.6800670Z 297 │ if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) { 2026-10-25T00:57:51.6800754Z 298 │ setWorkspaceRefreshRetry(null); 2026-10-25T00:57:51.6800846Z ·  ────────────┬─────────── 2026-10-25T00:57:51.6801017Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.6801074Z 299 │ return; 2026-10-25T00:57:51.6801122Z ╰──── 2026-10-25T00:57:51.6801706Z  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-25T00:57:51.6802018Z  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-25T00:57:51.6802021Z 2026-10-25T00:57:51.6802216Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T00:57:51.6802372Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:328:5] 2026-10-25T00:57:51.6802425Z 327 │ }, [ 2026-10-25T00:57:51.6802487Z 328 │ draftMessage, 2026-10-25T00:57:51.6802560Z ·  ──────┬───── 2026-10-25T00:57:51.6802758Z · ╰── Unnecessary dependency `draftMessage` 2026-10-25T00:57:51.6802896Z 329 │ environmentId, 2026-10-25T00:57:51.6802946Z ╰──── 2026-10-25T00:57:51.6803230Z  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-25T00:57:51.6803568Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6803570Z 2026-10-25T00:57:51.6804027Z ⚠ 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-25T00:57:51.6804182Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1742:7] 2026-10-25T00:57:51.6804275Z 1741 │ yield* harness.replaceSession; 2026-10-25T00:57:51.6804479Z 1742 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T00:57:51.6804626Z 1743 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) { 2026-10-25T00:57:51.6804711Z 1744 │ │ break; 2026-10-25T00:57:51.6804787Z 1745 │ │ } 2026-10-25T00:57:51.6804892Z 1746 │ │ yield* Effect.yieldNow; 2026-10-25T00:57:51.6805019Z 1747 │ ╰─▶ } 2026-10-25T00:57:51.6805089Z 1748 │ yield* Queue.offer( 2026-10-25T00:57:51.6805140Z ╰──── 2026-10-25T00:57:51.6805142Z 2026-10-25T00:57:51.6805599Z ⚠ 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-25T00:57:51.6805753Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1851:7] 2026-10-25T00:57:51.6805840Z 1850 │ yield* harness.replaceSession; 2026-10-25T00:57:51.6806038Z 1851 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T00:57:51.6806193Z 1852 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break; 2026-10-25T00:57:51.6806295Z 1853 │ │ yield* Effect.yieldNow; 2026-10-25T00:57:51.6806422Z 1854 │ ╰─▶ } 2026-10-25T00:57:51.6806592Z 1855 │ expect(yield* Ref.get(harness.subscriptionCount)).toBe(2); 2026-10-25T00:57:51.6806703Z ╰──── 2026-10-25T00:57:51.6806707Z 2026-10-25T00:57:51.6806961Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T00:57:51.6807126Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:333:7] 2026-10-25T00:57:51.6807180Z 328 │ }; 2026-10-25T00:57:51.6807244Z 329 │ useEffect(() => { 2026-10-25T00:57:51.6807313Z ·  ────┬──── 2026-10-25T00:57:51.6807437Z · ╰── This is the containing effect 2026-10-25T00:57:51.6807533Z 330 │ if (!guidesEnabled && section === "guide") { 2026-10-25T00:57:51.6807625Z 331 │ requestedSection.current = "overview"; 2026-10-25T00:57:51.6807792Z 332 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-25T00:57:51.6807863Z 333 │ setSection("overview"); 2026-10-25T00:57:51.6807936Z ·  ─────┬──── 2026-10-25T00:57:51.6808100Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.6808153Z 334 │ } 2026-10-25T00:57:51.6808200Z ╰──── 2026-10-25T00:57:51.6808785Z  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-25T00:57:51.6809101Z  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-25T00:57:51.6809106Z 2026-10-25T00:57:51.6809302Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-25T00:57:51.6809466Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:335:6] 2026-10-25T00:57:51.6809558Z 330 │ if (!guidesEnabled && section === "guide") { 2026-10-25T00:57:51.6809650Z 331 │ requestedSection.current = "overview"; 2026-10-25T00:57:51.6809729Z ·  ────────┬─────── 2026-10-25T00:57:51.6810165Z · ╰── 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-25T00:57:51.6810326Z 332 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-25T00:57:51.6810475Z ·  ─────────┬───────── ──────┬────── 2026-10-25T00:57:51.6810956Z · │ ╰── 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-25T00:57:51.6811391Z · ╰── 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-25T00:57:51.6811462Z 333 │ setSection("overview"); 2026-10-25T00:57:51.6811513Z 334 │ } 2026-10-25T00:57:51.6811652Z 335 │ }, [guidesEnabled, section, insets.top]); 2026-10-25T00:57:51.6811822Z ·  ──────────────────┬───────────────── 2026-10-25T00:57:51.6812010Z · ╰── This dependency list is missing values used by the callback 2026-10-25T00:57:51.6812092Z 336 │ const tabContent = activityContent; 2026-10-25T00:57:51.6812141Z ╰──── 2026-10-25T00:57:51.6812305Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-25T00:57:51.6812608Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6812610Z 2026-10-25T00:57:51.6812807Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-25T00:57:51.6812976Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:877:6] 2026-10-25T00:57:51.6813034Z 860 │ if ( 2026-10-25T00:57:51.6813145Z 861 │ lastSelection.current.path === route.params.path && 2026-10-25T00:57:51.6813221Z ·  ──────┬────── 2026-10-25T00:57:51.6813686Z · ╰── Missing dependency `lastSelection`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values 2026-10-25T00:57:51.6813811Z 862 │ lastSelection.current.id === route.params.fileSelectionId 2026-10-25T00:57:51.6813863Z 863 │ ) 2026-10-25T00:57:51.6813923Z 864 │ return; 2026-10-25T00:57:51.6814091Z 865 │ lastSelection.current = { path: route.params.path, id: route.params.fileSelectionId }; 2026-10-25T00:57:51.6814228Z 866 │ if (route.params.focus) navigation.setParams({ focus: undefined }); 2026-10-25T00:57:51.6814313Z 867 │ setJumpPath(route.params.path); 2026-10-25T00:57:51.6814383Z 868 │ setSelectedRowId(null); 2026-10-25T00:57:51.6814458Z 869 │ jumpStarted.current = false; 2026-10-25T00:57:51.6814600Z 870 │ const file = data.files.find((entry) => entry.path === route.params.path); 2026-10-25T00:57:51.6814691Z 871 │ if (!file || !nativeView.current) return; 2026-10-25T00:57:51.6814777Z ·  ─────┬──── 2026-10-25T00:57:51.6815200Z · ╰── Missing dependency `nativeView`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values 2026-10-25T00:57:51.6815322Z 872 │ setCollapsedIds((ids) => ids.filter((id) => id !== file.id)); 2026-10-25T00:57:51.6815402Z 873 │ jumpStarted.current = true; 2026-10-25T00:57:51.6815536Z 874 │ void nativeView.current.scrollToFile(file.id, false).catch(() => { 2026-10-25T00:57:51.6815613Z 875 │ jumpStarted.current = false; 2026-10-25T00:57:51.6815666Z 876 │ }); 2026-10-25T00:57:51.6815858Z 877 │ }, [route.params.path, route.params.fileSelectionId, route.params.focus, data.files, navigation]); 2026-10-25T00:57:51.6816057Z ·  ──────────────────────────────────────────────┬────────────────────────────────────────────── 2026-10-25T00:57:51.6816270Z · ╰── This dependency list is missing values used by the callback 2026-10-25T00:57:51.6816377Z 878 │ const appliedFilter = useRef(filter.hideTestFiles); 2026-10-25T00:57:51.6816426Z ╰──── 2026-10-25T00:57:51.6816635Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-25T00:57:51.6817009Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6817011Z 2026-10-25T00:57:51.6817189Z ⚠ eslint(no-unused-vars): Type 'Scope' is imported but never used. 2026-10-25T00:57:51.6817322Z ╭─[apps/server/src/provider/ProviderAuthService.ts:15:18] 2026-10-25T00:57:51.6817404Z 14 │ import * as Layer from "effect/Layer"; 2026-10-25T00:57:51.6817494Z 15 │ import type * as Scope from "effect/Scope"; 2026-10-25T00:57:51.6817571Z ·  ──┬── 2026-10-25T00:57:51.6817700Z · ╰── 'Scope' is imported here 2026-10-25T00:57:51.6817783Z 16 │ import * as Stream from "effect/Stream"; 2026-10-25T00:57:51.6817840Z ╰──── 2026-10-25T00:57:51.6817935Z  help: Consider removing this import. 2026-10-25T00:57:51.6817938Z 2026-10-25T00:57:51.6818200Z ⚠ eslint(no-unused-vars): Variable 'layerDaemon' is declared but never used. Unused variables should start with a '_'. 2026-10-25T00:57:51.6818332Z ╭─[apps/server/src/orchestration-v2/EffectWorker.ts:935:7] 2026-10-25T00:57:51.6818385Z 934 │ 2026-10-25T00:57:51.6818565Z 935 │ const layerDaemon: Layer.Layer = Layer.effectDiscard( 2026-10-25T00:57:51.6818641Z ·  ─────┬───── 2026-10-25T00:57:51.6818772Z · ╰── 'layerDaemon' is declared here 2026-10-25T00:57:51.6818856Z 936 │ runDaemon.pipe(Effect.forkScoped), 2026-10-25T00:57:51.6818904Z ╰──── 2026-10-25T00:57:51.6819011Z  help: Consider removing this declaration. 2026-10-25T00:57:51.6819016Z 2026-10-25T00:57:51.6819212Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-25T00:57:51.6819341Z ╭─[packages/client-runtime/src/state/usageAccess.ts:3:8] 2026-10-25T00:57:51.6819411Z 2 │ AuthDiagnosticsReadScope, 2026-10-25T00:57:51.6819477Z 3 │ type AuthSessionState, 2026-10-25T00:57:51.6819558Z ·  ────────┬─────── 2026-10-25T00:57:51.6819699Z · ╰── 'AuthSessionState' is imported here 2026-10-25T00:57:51.6819763Z 4 │ sessionGrantsScope, 2026-10-25T00:57:51.6819813Z ╰──── 2026-10-25T00:57:51.6819908Z  help: Consider removing this import. 2026-10-25T00:57:51.6819910Z 2026-10-25T00:57:51.6820064Z ⚠ eslint(no-new): Do not use 'new' for side effects. 2026-10-25T00:57:51.6820187Z ╭─[apps/server/src/mcp/McpToolAccess.test.ts:168:3] 2026-10-25T00:57:51.6820294Z 167 │ // @ts-expect-error a declaration constructed directly 2026-10-25T00:57:51.6820386Z 168 │ new McpToolAccess.Declaration(unchecked); 2026-10-25T00:57:51.6820479Z ·  ───────────────────────────── 2026-10-25T00:57:51.6820602Z 169 │ // @ts-expect-error a handlers layer built outside McpToolAccess 2026-10-25T00:57:51.6820650Z ╰──── 2026-10-25T00:57:51.6820802Z  help: Assign the result of 'new' to a variable or compare it to a reference. 2026-10-25T00:57:51.6820805Z 2026-10-25T00:57:51.6821056Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T00:57:51.6821266Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:444:5] 2026-10-25T00:57:51.6821392Z 434 │ : null; 2026-10-25T00:57:51.6821458Z 435 │ useEffect(() => { 2026-10-25T00:57:51.6821527Z ·  ────┬──── 2026-10-25T00:57:51.6821654Z · ╰── This is the containing effect 2026-10-25T00:57:51.6821708Z 436 │ if ( 2026-10-25T00:57:51.6821782Z 437 │ props.active === false || 2026-10-25T00:57:51.6821855Z 438 │ activeDraftKey !== null || 2026-10-25T00:57:51.6821933Z 439 │ editingPendingTask !== null || 2026-10-25T00:57:51.6822005Z 440 │ selectedProject === null 2026-10-25T00:57:51.6822058Z 441 │ ) { 2026-10-25T00:57:51.6822116Z 442 │ return; 2026-10-25T00:57:51.6822166Z 443 │ } 2026-10-25T00:57:51.6822233Z 444 │ setActiveDraftKey( 2026-10-25T00:57:51.6822313Z ·  ────────┬──────── 2026-10-25T00:57:51.6822484Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.6822554Z 445 │ createNewTaskDraft({ 2026-10-25T00:57:51.6822605Z ╰──── 2026-10-25T00:57:51.6823192Z  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-25T00:57:51.6823549Z  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-25T00:57:51.6823552Z 2026-10-25T00:57:51.6823791Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-25T00:57:51.6823950Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1244:36] 2026-10-25T00:57:51.6824053Z 1243 │ 2026-10-25T00:57:51.6824239Z 1244 │ {props.children} 2026-10-25T00:57:51.6824348Z ·  ───────────── 2026-10-25T00:57:51.6824418Z 1245 │ 2026-10-25T00:57:51.6824468Z ╰──── 2026-10-25T00:57:51.6824683Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-25T00:57:51.6824820Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-25T00:57:51.6824823Z 2026-10-25T00:57:51.6825045Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T00:57:51.6825240Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:121:27] 2026-10-25T00:57:51.6825399Z 120 │ const scope = makeScope(options.capabilities ?? new Set(["preview", "worktree"])); 2026-10-25T00:57:51.6825485Z 121 │ const dispatch = vi.fn((_: unknown) => 2026-10-25T00:57:51.6825565Z ·  ┬ 2026-10-25T00:57:51.6825690Z · ╰── '_' is declared here 2026-10-25T00:57:51.6825787Z 122 │ (options.dispatchGate ?? Effect.void).pipe( 2026-10-25T00:57:51.6825835Z ╰──── 2026-10-25T00:57:51.6825934Z  help: Consider removing this parameter. 2026-10-25T00:57:51.6825936Z 2026-10-25T00:57:51.6826119Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T00:57:51.6826254Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:134:39] 2026-10-25T00:57:51.6826306Z 133 │ ); 2026-10-25T00:57:51.6826410Z 134 │ const listLocalBranchNames = vi.fn((_: string) => 2026-10-25T00:57:51.6826503Z ·  ┬ 2026-10-25T00:57:51.6826636Z · ╰── '_' is declared here 2026-10-25T00:57:51.6826701Z 135 │ Effect.succeed( 2026-10-25T00:57:51.6826750Z ╰──── 2026-10-25T00:57:51.6826846Z  help: Consider removing this parameter. 2026-10-25T00:57:51.6826848Z 2026-10-25T00:57:51.6827023Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T00:57:51.6827152Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:178:31] 2026-10-25T00:57:51.6827210Z 177 │ }); 2026-10-25T00:57:51.6827305Z 178 │ const sendToThread = vi.fn((_: unknown) => { 2026-10-25T00:57:51.6827390Z ·  ┬ 2026-10-25T00:57:51.6827518Z · ╰── '_' is declared here 2026-10-25T00:57:51.6827614Z 179 │ switch (options.continuation ?? "queued") { 2026-10-25T00:57:51.6827662Z ╰──── 2026-10-25T00:57:51.6827757Z  help: Consider removing this parameter. 2026-10-25T00:57:51.6827759Z 2026-10-25T00:57:51.6827937Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T00:57:51.6828066Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:203:33] 2026-10-25T00:57:51.6828117Z 202 │ ); 2026-10-25T00:57:51.6828211Z 203 │ const removeWorktree = vi.fn((_: unknown) => 2026-10-25T00:57:51.6828302Z ·  ┬ 2026-10-25T00:57:51.6828436Z · ╰── '_' is declared here 2026-10-25T00:57:51.6828511Z 204 │ options.removeWorktreeFails 2026-10-25T00:57:51.6828562Z ╰──── 2026-10-25T00:57:51.6828658Z  help: Consider removing this parameter. 2026-10-25T00:57:51.6828660Z 2026-10-25T00:57:51.6828834Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T00:57:51.6828961Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:208:36] 2026-10-25T00:57:51.6829014Z 207 │ ); 2026-10-25T00:57:51.6829112Z 208 │ const deleteLocalBranch = vi.fn((_: unknown) => 2026-10-25T00:57:51.6829202Z ·  ┬ 2026-10-25T00:57:51.6829383Z · ╰── '_' is declared here 2026-10-25T00:57:51.6829525Z 209 │ options.deleteLocalBranchFails 2026-10-25T00:57:51.6829575Z ╰──── 2026-10-25T00:57:51.6829669Z  help: Consider removing this parameter. 2026-10-25T00:57:51.6829671Z 2026-10-25T00:57:51.6829844Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T00:57:51.6829973Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:213:42] 2026-10-25T00:57:51.6830024Z 212 │ ); 2026-10-25T00:57:51.6830133Z 213 │ const fetchWorktreeBaseCommit = vi.fn((_: unknown) => 2026-10-25T00:57:51.6830226Z ·  ┬ 2026-10-25T00:57:51.6830363Z · ╰── '_' is declared here 2026-10-25T00:57:51.6830451Z 214 │ options.fetchWorktreeBaseFails 2026-10-25T00:57:51.6830502Z ╰──── 2026-10-25T00:57:51.6830595Z  help: Consider removing this parameter. 2026-10-25T00:57:51.6830598Z 2026-10-25T00:57:51.6830772Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T00:57:51.6830899Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:254:30] 2026-10-25T00:57:51.6830951Z 253 │ ); 2026-10-25T00:57:51.6831038Z 254 │ const localStatus = vi.fn((_: unknown) => 2026-10-25T00:57:51.6831122Z ·  ┬ 2026-10-25T00:57:51.6831250Z · ╰── '_' is declared here 2026-10-25T00:57:51.6831316Z 255 │ Effect.succeed({ 2026-10-25T00:57:51.6831363Z ╰──── 2026-10-25T00:57:51.6831459Z  help: Consider removing this parameter. 2026-10-25T00:57:51.6831466Z 2026-10-25T00:57:51.6831643Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T00:57:51.6831770Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:264:32] 2026-10-25T00:57:51.6831821Z 263 │ ); 2026-10-25T00:57:51.6831966Z 264 │ const refreshStatus = vi.fn((_: string) => Effect.die("refreshStatus stub")); 2026-10-25T00:57:51.6832052Z ·  ┬ 2026-10-25T00:57:51.6832184Z · ╰── '_' is declared here 2026-10-25T00:57:51.6832325Z 265 │ const runForThread = vi.fn((input: { readonly worktreePath: string }) => { 2026-10-25T00:57:51.6832373Z ╰──── 2026-10-25T00:57:51.6832468Z  help: Consider removing this parameter. 2026-10-25T00:57:51.6832471Z 2026-10-25T00:57:51.6832656Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-25T00:57:51.6832809Z ╭─[apps/mobile/src/features/threads/ThreadQueueControl.tsx:602:27] 2026-10-25T00:57:51.6832970Z 601 │ const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success)); 2026-10-25T00:57:51.6833044Z 602 │ const gesture = Gesture.Pan() 2026-10-25T00:57:51.6833129Z ·  ─┬─ 2026-10-25T00:57:51.6833298Z · ╰── `Pan` may be a component 2026-10-25T00:57:51.6833370Z 603 │ .enabled(!props.disabled) 2026-10-25T00:57:51.6833419Z ╰──── 2026-10-25T00:57:51.6833691Z  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-25T00:57:51.6834178Z  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-25T00:57:51.6834211Z 2026-10-25T00:57:51.6834500Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T00:57:51.6834647Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:570:5] 2026-10-25T00:57:51.6834705Z 568 │ }, []); 2026-10-25T00:57:51.6834768Z 569 │ useEffect(() => { 2026-10-25T00:57:51.6834836Z ·  ────┬──── 2026-10-25T00:57:51.6834961Z · ╰── This is the containing effect 2026-10-25T00:57:51.6835041Z 570 │ setKeyboardStateSuspect(false); 2026-10-25T00:57:51.6835133Z ·  ───────────┬─────────── 2026-10-25T00:57:51.6835300Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.6835394Z 571 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-25T00:57:51.6835442Z ╰──── 2026-10-25T00:57:51.6836024Z  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-25T00:57:51.6836335Z  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-25T00:57:51.6836338Z 2026-10-25T00:57:51.6836591Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T00:57:51.6836739Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:966:7] 2026-10-25T00:57:51.6836890Z 963 │ const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0); 2026-10-25T00:57:51.6836955Z 964 │ useEffect(() => { 2026-10-25T00:57:51.6837023Z ·  ────┬──── 2026-10-25T00:57:51.6837146Z · ╰── This is the containing effect 2026-10-25T00:57:51.6837299Z 965 │ if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) { 2026-10-25T00:57:51.6837408Z 966 │ setLastKnownKeyboardHeight(liveKeyboardHeight); 2026-10-25T00:57:51.6837503Z ·  ─────────────┬──────────── 2026-10-25T00:57:51.6837677Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.6837733Z 967 │ } 2026-10-25T00:57:51.6837781Z ╰──── 2026-10-25T00:57:51.6838360Z  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-25T00:57:51.6838671Z  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-25T00:57:51.6838675Z 2026-10-25T00:57:51.6838922Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T00:57:51.6839124Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1222:5] 2026-10-25T00:57:51.6839239Z 1220 │ 2026-10-25T00:57:51.6839303Z 1221 │ useEffect(() => { 2026-10-25T00:57:51.6839371Z ·  ────┬──── 2026-10-25T00:57:51.6839499Z · ╰── This is the containing effect 2026-10-25T00:57:51.6839574Z 1222 │ setAnchorMessageId(null); 2026-10-25T00:57:51.6839658Z ·  ─────────┬──────── 2026-10-25T00:57:51.6839822Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.6839899Z 1223 │ setSubmittedMessageId(null); 2026-10-25T00:57:51.6839949Z ╰──── 2026-10-25T00:57:51.6840643Z  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-25T00:57:51.6840957Z  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-25T00:57:51.6840961Z 2026-10-25T00:57:51.6841154Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T00:57:51.6841299Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:571:7] 2026-10-25T00:57:51.6841380Z 570 │ setKeyboardStateSuspect(false); 2026-10-25T00:57:51.6841476Z 571 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-25T00:57:51.6841612Z ·  ────────┬──────── ─────────┬──────── 2026-10-25T00:57:51.6841822Z · │ ╰── Unnecessary dependency `liveKeyboardHeight` 2026-10-25T00:57:51.6841979Z · ╰── Unnecessary dependency `isKeyboardVisible` 2026-10-25T00:57:51.6842101Z 572 │ const handleOwnedInputFocusChange = (focused: boolean) => { 2026-10-25T00:57:51.6842149Z ╰──── 2026-10-25T00:57:51.6842435Z  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-25T00:57:51.6842736Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6842738Z 2026-10-25T00:57:51.6842935Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T00:57:51.6843085Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1170:7] 2026-10-25T00:57:51.6843167Z 1169 │ userInputInsetProgress.set(1); 2026-10-25T00:57:51.6843359Z 1170 │ }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]); 2026-10-25T00:57:51.6843453Z ·  ────────────┬─────────── 2026-10-25T00:57:51.6843625Z · ╰── Unnecessary dependency `activeUserInputRequestId` 2026-10-25T00:57:51.6843724Z 1171 │ const showContent = props.showContent ?? true; 2026-10-25T00:57:51.6843774Z ╰──── 2026-10-25T00:57:51.6844057Z  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-25T00:57:51.6844420Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6844523Z 2026-10-25T00:57:51.6844729Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T00:57:51.6844881Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1228:15] 2026-10-25T00:57:51.6844947Z 1227 │ freeze.set(false); 2026-10-25T00:57:51.6845025Z 1228 │ }, [freeze, selectedThreadKey]); 2026-10-25T00:57:51.6845114Z ·  ────────┬──────── 2026-10-25T00:57:51.6845273Z · ╰── Unnecessary dependency `selectedThreadKey` 2026-10-25T00:57:51.6845325Z 1229 │ 2026-10-25T00:57:51.6845375Z ╰──── 2026-10-25T00:57:51.6845664Z  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-25T00:57:51.6845968Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6845971Z 2026-10-25T00:57:51.6846122Z ⚠ react(immutability): This value cannot be modified 2026-10-25T00:57:51.6846271Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1058:5] 2026-10-25T00:57:51.6846379Z 1053 │ const composerPopoverHeight = useSharedValue(0); 2026-10-25T00:57:51.6846482Z 1054 │ const floatingControlCoverage = useSharedValue( 2026-10-25T00:57:51.6846573Z ·  ───────────┬─────────── 2026-10-25T00:57:51.6846736Z · ╰── `floatingControlCoverage` originates here 2026-10-25T00:57:51.6846865Z 1055 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-25T00:57:51.6846917Z 1056 │ ); 2026-10-25T00:57:51.6846982Z 1057 │ useEffect(() => { 2026-10-25T00:57:51.6847083Z 1058 │ floatingControlCoverage.value = withTiming( 2026-10-25T00:57:51.6847170Z ·  ───────────┬─────────── 2026-10-25T00:57:51.6847325Z · ╰── `floatingControlCoverage` cannot be modified 2026-10-25T00:57:51.6847449Z 1059 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-25T00:57:51.6847500Z ╰──── 2026-10-25T00:57:51.6847757Z  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-25T00:57:51.6848059Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T00:57:51.6848064Z 2026-10-25T00:57:51.6848216Z ⚠ react(immutability): This value cannot be modified 2026-10-25T00:57:51.6848362Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1076:7] 2026-10-25T00:57:51.6848544Z 1066 │ const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null; 2026-10-25T00:57:51.6848667Z 1067 │ const combinedContentInsetEndAdjustment = useSharedValue( 2026-10-25T00:57:51.6848773Z ·  ────────────────┬──────────────── 2026-10-25T00:57:51.6848956Z · ╰── `combinedContentInsetEndAdjustment` originates here 2026-10-25T00:57:51.6849083Z 1068 │ Math.max(0, estimatedOverlayHeight - nativeInsetOvercount), 2026-10-25T00:57:51.6849187Z 1069 │ ); 2026-10-25T00:57:51.6849319Z 1070 │ useAnimatedReaction( 2026-10-25T00:57:51.6849376Z 1071 │ () => 2026-10-25T00:57:51.6849467Z 1072 │ contentInsetEndAdjustment.value + 2026-10-25T00:57:51.6849553Z 1073 │ floatingControlCoverage.value + 2026-10-25T00:57:51.6849743Z 1074 │ (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0), 2026-10-25T00:57:51.6849805Z 1075 │ (value) => { 2026-10-25T00:57:51.6849918Z 1076 │ combinedContentInsetEndAdjustment.value = value; 2026-10-25T00:57:51.6850023Z ·  ────────────────┬──────────────── 2026-10-25T00:57:51.6850208Z · ╰── `combinedContentInsetEndAdjustment` cannot be modified 2026-10-25T00:57:51.6850265Z 1077 │ }, 2026-10-25T00:57:51.6850316Z ╰──── 2026-10-25T00:57:51.6850575Z  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-25T00:57:51.6850872Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T00:57:51.6850875Z 2026-10-25T00:57:51.6851113Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-25T00:57:51.6851264Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:290:50] 2026-10-25T00:57:51.6851322Z 289 │ return ( 2026-10-25T00:57:51.6851452Z 290 │ 2026-10-25T00:57:51.6851569Z ·  ───────────── 2026-10-25T00:57:51.6851640Z 291 │ {props.children} 2026-10-25T00:57:51.6851693Z ╰──── 2026-10-25T00:57:51.6851910Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-25T00:57:51.6852045Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-25T00:57:51.6852047Z 2026-10-25T00:57:51.6852277Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-25T00:57:51.6852427Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:654:44] 2026-10-25T00:57:51.6852484Z 653 │ return ( 2026-10-25T00:57:51.6852598Z 654 │ 2026-10-25T00:57:51.6852707Z ·  ───────────── 2026-10-25T00:57:51.6852823Z 655 │ {props.children} 2026-10-25T00:57:51.6852935Z ╰──── 2026-10-25T00:57:51.6853152Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-25T00:57:51.6853316Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-25T00:57:51.6853319Z 2026-10-25T00:57:51.6853549Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-25T00:57:51.6853702Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1462:55] 2026-10-25T00:57:51.6853759Z 1461 │ return ( 2026-10-25T00:57:51.6853916Z 1462 │ 2026-10-25T00:57:51.6854048Z ·  ──────────────────── 2026-10-25T00:57:51.6854144Z 1463 │ file.path === path)!; 2026-10-25T00:57:51.6858619Z 1786 │ const request = yield* Schema.decodeEffect(ReviewDiffPreviewInput)({ 2026-10-25T00:57:51.6858731Z ·  ─────────────────── 2026-10-25T00:57:51.6858791Z 1787 │ cwd, 2026-10-25T00:57:51.6858845Z ╰──── 2026-10-25T00:57:51.6858847Z 2026-10-25T00:57:51.6859016Z ⚠ eslint(no-empty-pattern): Empty array binding pattern 2026-10-25T00:57:51.6859170Z ╭─[apps/server/src/pullRequest/PullRequestService.test.ts:1437:12] 2026-10-25T00:57:51.6859223Z 1436 │ 2026-10-25T00:57:51.6859290Z 1437 │ for (const [] of [ 2026-10-25T00:57:51.6859364Z ·  ── 2026-10-25T00:57:51.6859438Z 1438 │ ["github", "github.com"], 2026-10-25T00:57:51.6859488Z ╰──── 2026-10-25T00:57:51.6859761Z  help: Passing non-iterable values (null, undefined, numbers, booleans, etc.) will result in a runtime error because these values are not iterable. 2026-10-25T00:57:51.6859764Z 2026-10-25T00:57:51.6860180Z ⚠ 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-25T00:57:51.6860326Z ╭─[apps/server/src/provider/acp/AntigravityProtocol.ts:263:20] 2026-10-25T00:57:51.6860408Z 262 │ ...(update._meta !== undefined 2026-10-25T00:57:51.6860568Z 263 │ ? { _meta: Schema.is(Schema.Record(Schema.String, Schema.Json))(meta) ? meta : null } 2026-10-25T00:57:51.6860656Z ·  ───────── 2026-10-25T00:57:51.6860720Z 264 │ : {}), 2026-10-25T00:57:51.6860771Z ╰──── 2026-10-25T00:57:51.6860773Z 2026-10-25T00:57:51.6861044Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-25T00:57:51.6861175Z ╭─[apps/server/src/provider/AntigravityAuth.ts:285:20] 2026-10-25T00:57:51.6861231Z 284 │ }, 2026-10-25T00:57:51.6861312Z 285 │ (effect, flow, stopSessions) => 2026-10-25T00:57:51.6861406Z ·  ──────┬───── 2026-10-25T00:57:51.6861555Z · ╰── 'stopSessions' is declared here 2026-10-25T00:57:51.6861622Z 286 │ effect.pipe( 2026-10-25T00:57:51.6861676Z ╰──── 2026-10-25T00:57:51.6861776Z  help: Consider removing this parameter. 2026-10-25T00:57:51.6861778Z 2026-10-25T00:57:51.6861933Z ⚠ react(immutability): This value cannot be modified 2026-10-25T00:57:51.6862094Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:111:5] 2026-10-25T00:57:51.6862149Z 107 │ ); 2026-10-25T00:57:51.6862297Z 108 │ const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0); 2026-10-25T00:57:51.6862384Z ·  ─────────┬──────── 2026-10-25T00:57:51.6862581Z · ╰── `separationProgress` originates here 2026-10-25T00:57:51.6862699Z 109 │ 2026-10-25T00:57:51.6862763Z 110 │ useEffect(() => { 2026-10-25T00:57:51.6862970Z 111 │ separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING); 2026-10-25T00:57:51.6863137Z ·  ─────────┬──────── 2026-10-25T00:57:51.6863327Z · ╰── `separationProgress` cannot be modified 2026-10-25T00:57:51.6863466Z 112 │ }, [props.showScrollToEnd, separationProgress]); 2026-10-25T00:57:51.6863549Z ╰──── 2026-10-25T00:57:51.6863843Z  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-25T00:57:51.6864188Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T00:57:51.6864193Z 2026-10-25T00:57:51.6864358Z ⚠ react(immutability): This value cannot be modified 2026-10-25T00:57:51.6864548Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-25T00:57:51.6864679Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-25T00:57:51.6864840Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-25T00:57:51.6864931Z ·  ──────┬───── 2026-10-25T00:57:51.6865094Z · ╰── `capsuleWidth` originates here 2026-10-25T00:57:51.6865289Z 130 │ const measuredWidthRef = useRef(null); 2026-10-25T00:57:51.6865439Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-25T00:57:51.6865568Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-25T00:57:51.6865693Z 133 │ if (width === measuredWidthRef.current) { 2026-10-25T00:57:51.6865783Z 134 │ return; 2026-10-25T00:57:51.6865857Z 135 │ } 2026-10-25T00:57:51.6865987Z 136 │ const first = measuredWidthRef.current === null; 2026-10-25T00:57:51.6866107Z 137 │ measuredWidthRef.current = width; 2026-10-25T00:57:51.6866273Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-25T00:57:51.6866377Z ·  ──────┬───── 2026-10-25T00:57:51.6866524Z · ╰── `capsuleWidth` cannot be modified 2026-10-25T00:57:51.6866624Z 139 │ }; 2026-10-25T00:57:51.6866705Z ╰──── 2026-10-25T00:57:51.6866994Z  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-25T00:57:51.6867312Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T00:57:51.6867324Z 2026-10-25T00:57:51.6867498Z ⚠ react(immutability): This value cannot be modified 2026-10-25T00:57:51.6867697Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-25T00:57:51.6867891Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-25T00:57:51.6868033Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-25T00:57:51.6868116Z ·  ──────┬───── 2026-10-25T00:57:51.6868292Z · ╰── `capsuleWidth` originates here 2026-10-25T00:57:51.6868428Z 130 │ const measuredWidthRef = useRef(null); 2026-10-25T00:57:51.6868625Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-25T00:57:51.6868811Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-25T00:57:51.6868937Z 133 │ if (width === measuredWidthRef.current) { 2026-10-25T00:57:51.6869032Z 134 │ return; 2026-10-25T00:57:51.6869119Z 135 │ } 2026-10-25T00:57:51.6869234Z 136 │ const first = measuredWidthRef.current === null; 2026-10-25T00:57:51.6869338Z 137 │ measuredWidthRef.current = width; 2026-10-25T00:57:51.6869521Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-25T00:57:51.6869607Z 139 │ }; 2026-10-25T00:57:51.6869708Z 140 │ const hasStatus = props.status !== null; 2026-10-25T00:57:51.6869865Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-25T00:57:51.6869959Z 142 │ useEffect(() => { 2026-10-25T00:57:51.6870124Z 143 │ if (!hasStatus) { 2026-10-25T00:57:51.6870226Z 144 │ measuredWidthRef.current = null; 2026-10-25T00:57:51.6870331Z 145 │ capsuleWidth.value = null; 2026-10-25T00:57:51.6870431Z ·  ──────┬───── 2026-10-25T00:57:51.6870625Z · ╰── `capsuleWidth` cannot be modified 2026-10-25T00:57:51.6870692Z 146 │ } 2026-10-25T00:57:51.6870774Z ╰──── 2026-10-25T00:57:51.6871060Z  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-25T00:57:51.6871387Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T00:57:51.6871390Z 2026-10-25T00:57:51.6871630Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-25T00:57:51.6871807Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-25T00:57:51.6871967Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-25T00:57:51.6872052Z 142 │ useEffect(() => { 2026-10-25T00:57:51.6872179Z ·  ───┬─── 2026-10-25T00:57:51.6872409Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-25T00:57:51.6872502Z 143 │ if (!hasStatus) { 2026-10-25T00:57:51.6872614Z 144 │ measuredWidthRef.current = null; 2026-10-25T00:57:51.6872723Z 145 │ capsuleWidth.value = null; 2026-10-25T00:57:51.6872877Z ·  ──────┬───── 2026-10-25T00:57:51.6873091Z · ╰── This modifies `capsuleWidth` 2026-10-25T00:57:51.6873241Z 146 │ } 2026-10-25T00:57:51.6873335Z ╰──── 2026-10-25T00:57:51.6873720Z  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-25T00:57:51.6874051Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T00:57:51.6874053Z 2026-10-25T00:57:51.6874276Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-25T00:57:51.6874468Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-25T00:57:51.6874608Z 130 │ const measuredWidthRef = useRef(null); 2026-10-25T00:57:51.6874744Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-25T00:57:51.6874897Z ·  ───────────────┬─────────────── 2026-10-25T00:57:51.6875162Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-25T00:57:51.6875287Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-25T00:57:51.6875401Z 133 │ if (width === measuredWidthRef.current) { 2026-10-25T00:57:51.6875496Z 134 │ return; 2026-10-25T00:57:51.6875582Z 135 │ } 2026-10-25T00:57:51.6875711Z 136 │ const first = measuredWidthRef.current === null; 2026-10-25T00:57:51.6875856Z 137 │ measuredWidthRef.current = width; 2026-10-25T00:57:51.6876043Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-25T00:57:51.6876155Z ·  ──────┬───── 2026-10-25T00:57:51.6876317Z · ╰── This modifies `capsuleWidth` 2026-10-25T00:57:51.6876382Z 139 │ }; 2026-10-25T00:57:51.6876465Z ╰──── 2026-10-25T00:57:51.6876829Z  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-25T00:57:51.6877155Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T00:57:51.6877158Z 2026-10-25T00:57:51.6877371Z ⚠ eslint(no-unused-vars): Identifier 'Arr' is imported but never used. 2026-10-25T00:57:51.6877505Z ╭─[packages/client-runtime/src/state/threadSort.ts:4:13] 2026-10-25T00:57:51.6877673Z 3 │ import type { EnvironmentThreadShell } from "./models.ts"; 2026-10-25T00:57:51.6877790Z 4 │ import * as Arr from "effect/Array"; 2026-10-25T00:57:51.6877889Z ·  ─┬─ 2026-10-25T00:57:51.6878021Z · ╰── 'Arr' is imported here 2026-10-25T00:57:51.6878146Z 5 │ import * as Order from "effect/Order"; 2026-10-25T00:57:51.6878235Z ╰──── 2026-10-25T00:57:51.6878359Z  help: Consider removing this import. 2026-10-25T00:57:51.6878362Z 2026-10-25T00:57:51.6878562Z ⚠ eslint(no-unused-vars): Identifier 'Order' is imported but never used. 2026-10-25T00:57:51.6878762Z ╭─[packages/client-runtime/src/state/threadSort.ts:5:13] 2026-10-25T00:57:51.6878887Z 4 │ import * as Arr from "effect/Array"; 2026-10-25T00:57:51.6878995Z 5 │ import * as Order from "effect/Order"; 2026-10-25T00:57:51.6879131Z ·  ──┬── 2026-10-25T00:57:51.6879354Z · ╰── 'Order' is imported here 2026-10-25T00:57:51.6879444Z 6 │ 2026-10-25T00:57:51.6879532Z ╰──── 2026-10-25T00:57:51.6879638Z  help: Consider removing this import. 2026-10-25T00:57:51.6879657Z 2026-10-25T00:57:51.6879851Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-25T00:57:51.6880000Z ╭─[packages/client-runtime/src/state/shell.ts:189:5] 2026-10-25T00:57:51.6880154Z 186 │ let waiting = yield* Ref.get(awaitingCompletion); 2026-10-25T00:57:51.6880249Z 187 │ let next = initial; 2026-10-25T00:57:51.6880331Z ·  ──┬─ 2026-10-25T00:57:51.6880531Z · ╰── From this accumulator 2026-10-25T00:57:51.6880695Z 188 │ let receivedSnapshot = false; 2026-10-25T00:57:51.6880820Z 189 │ for (const item of items) { 2026-10-25T00:57:51.6880899Z ·  ─┬─ 2026-10-25T00:57:51.6881101Z · ╰── For this loop 2026-10-25T00:57:51.6881211Z 190 │ if (item.kind === "synchronized") { 2026-10-25T00:57:51.6881324Z 191 │ waiting = false; 2026-10-25T00:57:51.6881427Z 192 │ if (Option.isSome(next.snapshot)) { 2026-10-25T00:57:51.6881571Z 193 │ next = { ...next, status: "live", error: Option.none() }; 2026-10-25T00:57:51.6881688Z ·  ───┬─── 2026-10-25T00:57:51.6881849Z · ╰── From this spread 2026-10-25T00:57:51.6881925Z 194 │ } 2026-10-25T00:57:51.6882004Z ╰──── 2026-10-25T00:57:51.6882196Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-25T00:57:51.6882372Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-25T00:57:51.6882375Z 2026-10-25T00:57:51.6882594Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-25T00:57:51.6882758Z ╭─[packages/client-runtime/src/state/filesystem.ts:3:8] 2026-10-25T00:57:51.6882862Z 2 │ AuthFilesystemReadScope, 2026-10-25T00:57:51.6882961Z 3 │ type AuthSessionState, 2026-10-25T00:57:51.6883047Z ·  ────────┬─────── 2026-10-25T00:57:51.6883235Z · ╰── 'AuthSessionState' is imported here 2026-10-25T00:57:51.6883453Z 4 │ type FilesystemBrowseEntry, 2026-10-25T00:57:51.6883532Z ╰──── 2026-10-25T00:57:51.6883644Z  help: Consider removing this import. 2026-10-25T00:57:51.6883649Z 2026-10-25T00:57:51.6883931Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T00:57:51.6884124Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-25T00:57:51.6884218Z 259 │ .join("|"); 2026-10-25T00:57:51.6884295Z 260 │ useEffect(() => { 2026-10-25T00:57:51.6884390Z ·  ────┬──── 2026-10-25T00:57:51.6884560Z · ╰── This is the containing effect 2026-10-25T00:57:51.6884652Z 261 │ stop(); 2026-10-25T00:57:51.6884733Z ·  ──┬─ 2026-10-25T00:57:51.6884922Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.6885017Z 262 │ }, [orderVersion]); 2026-10-25T00:57:51.6885175Z ╰──── 2026-10-25T00:57:51.6885870Z  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-25T00:57:51.6886196Z  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-25T00:57:51.6886215Z 2026-10-25T00:57:51.6886430Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T00:57:51.6886697Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-25T00:57:51.6886790Z 260 │ useEffect(() => { 2026-10-25T00:57:51.6886879Z 261 │ stop(); 2026-10-25T00:57:51.6886959Z ·  ──┬─ 2026-10-25T00:57:51.6887126Z · ╰── Missing dependency `stop` 2026-10-25T00:57:51.6887226Z 262 │ }, [orderVersion]); 2026-10-25T00:57:51.6887330Z ·  ──────┬───── 2026-10-25T00:57:51.6887486Z · ╰── Unnecessary dependency `orderVersion` 2026-10-25T00:57:51.6887573Z 263 │ useEffect( 2026-10-25T00:57:51.6887672Z ╰──── 2026-10-25T00:57:51.6888109Z  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-25T00:57:51.6888430Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6888436Z 2026-10-25T00:57:51.6888608Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6888794Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9] 2026-10-25T00:57:51.6888904Z 95 │ const latest = useRef(props); 2026-10-25T00:57:51.6889004Z 96 │ latest.current = props; 2026-10-25T00:57:51.6889125Z ·  ───┬──────┬─── 2026-10-25T00:57:51.6889320Z · │ ╰── Cannot update ref value during render 2026-10-25T00:57:51.6889536Z · ╰── This value is a ref 2026-10-25T00:57:51.6889631Z 97 │ const gesture = useMemo( 2026-10-25T00:57:51.6889694Z ╰──── 2026-10-25T00:57:51.6890188Z  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-25T00:57:51.6890510Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6890512Z 2026-10-25T00:57:51.6890688Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6890875Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18] 2026-10-25T00:57:51.6890953Z 103 │ .runOnJS(true) 2026-10-25T00:57:51.6891071Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-25T00:57:51.6891288Z ·  ───────────────┬────────────── 2026-10-25T00:57:51.6891586Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T00:57:51.6891727Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-25T00:57:51.6891807Z ╰──── 2026-10-25T00:57:51.6892291Z  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-25T00:57:51.6892612Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6892615Z 2026-10-25T00:57:51.6892781Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6892951Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19] 2026-10-25T00:57:51.6893130Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-25T00:57:51.6893339Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-25T00:57:51.6893506Z ·  ──────────────────────────┬───────────────────────── 2026-10-25T00:57:51.6893721Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T00:57:51.6893872Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-25T00:57:51.6893955Z ╰──── 2026-10-25T00:57:51.6894452Z  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-25T00:57:51.6894764Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6894766Z 2026-10-25T00:57:51.6894916Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6895090Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16] 2026-10-25T00:57:51.6895263Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-25T00:57:51.6895408Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-25T00:57:51.6895558Z ·  ──────────────────────────┬───────────────────────── 2026-10-25T00:57:51.6895791Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T00:57:51.6895949Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-25T00:57:51.6896033Z ╰──── 2026-10-25T00:57:51.6896512Z  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-25T00:57:51.6896876Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6896879Z 2026-10-25T00:57:51.6897043Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6897294Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21] 2026-10-25T00:57:51.6897512Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-25T00:57:51.6897666Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-25T00:57:51.6897814Z ·  ───────────────────────┬────────────────────── 2026-10-25T00:57:51.6898051Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T00:57:51.6898153Z 108 │ [props.disabled], 2026-10-25T00:57:51.6898238Z ╰──── 2026-10-25T00:57:51.6898699Z  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-25T00:57:51.6899005Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6899010Z 2026-10-25T00:57:51.6899193Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6899378Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:249:9] 2026-10-25T00:57:51.6899518Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-25T00:57:51.6899634Z 249 │ latest.current = { rows, planners, moveThread }; 2026-10-25T00:57:51.6899768Z ·  ───┬──────┬─── 2026-10-25T00:57:51.6899975Z · │ ╰── Cannot update ref value during render 2026-10-25T00:57:51.6900177Z · ╰── This value is a ref 2026-10-25T00:57:51.6900249Z 250 │ 2026-10-25T00:57:51.6900327Z ╰──── 2026-10-25T00:57:51.6900824Z  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-25T00:57:51.6901136Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6901139Z 2026-10-25T00:57:51.6901306Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.6901475Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:247:22] 2026-10-25T00:57:51.6901622Z 246 │ const [preview, setPreview] = useState(null); 2026-10-25T00:57:51.6901820Z 247 │ const translateY = useRef(new Animated.Value(0)).current; 2026-10-25T00:57:51.6902037Z ·  ──────────────────┬────────────────── 2026-10-25T00:57:51.6902212Z · ╰── Cannot access ref value during render 2026-10-25T00:57:51.6902341Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-25T00:57:51.6902443Z ╰──── 2026-10-25T00:57:51.6902921Z  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-25T00:57:51.6903227Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.6903234Z 2026-10-25T00:57:51.6903458Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T00:57:51.6903649Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:324:16] 2026-10-25T00:57:51.6903812Z 323 │ update(0); 2026-10-25T00:57:51.6903918Z 324 │ let last = performance.now(); 2026-10-25T00:57:51.6904024Z ·  ────────┬──────── 2026-10-25T00:57:51.6907370Z · ╰── Cannot call impure function 2026-10-25T00:57:51.6907452Z 325 │ const tick = () => { 2026-10-25T00:57:51.6907503Z ╰──── 2026-10-25T00:57:51.6907801Z  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-25T00:57:51.6908095Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T00:57:51.6908101Z 2026-10-25T00:57:51.6908289Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-25T00:57:51.6908443Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15] 2026-10-25T00:57:51.6908506Z  98 │ () => 2026-10-25T00:57:51.6908574Z  99 │ Gesture.Pan() 2026-10-25T00:57:51.6908650Z ·  ─┬─ 2026-10-25T00:57:51.6908777Z · ╰── `Pan` may be a component 2026-10-25T00:57:51.6908857Z 100 │ .enabled(!props.disabled) 2026-10-25T00:57:51.6908910Z ╰──── 2026-10-25T00:57:51.6909185Z  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-25T00:57:51.6909617Z  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-25T00:57:51.6909622Z 2026-10-25T00:57:51.6909802Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-25T00:57:51.6909958Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5] 2026-10-25T00:57:51.6910024Z 103 │ .runOnJS(true) 2026-10-25T00:57:51.6910122Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-25T00:57:51.6910208Z ·  ───┬── 2026-10-25T00:57:51.6910719Z · ╰── 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-25T00:57:51.6910946Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-25T00:57:51.6911069Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-25T00:57:51.6911187Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-25T00:57:51.6911254Z 108 │ [props.disabled], 2026-10-25T00:57:51.6911334Z ·  ────────┬─────── 2026-10-25T00:57:51.6911516Z · ╰── This dependency list is missing values used by the callback 2026-10-25T00:57:51.6911568Z 109 │ ); 2026-10-25T00:57:51.6911620Z ╰──── 2026-10-25T00:57:51.6911824Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-25T00:57:51.6912131Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6912134Z 2026-10-25T00:57:51.6912392Z ⚠ eslint(no-unused-vars): Variable 'navigation' is declared but never used. Unused variables should start with a '_'. 2026-10-25T00:57:51.6912556Z ╭─[apps/mobile/src/features/workspace/WorkspaceSidebarTabs.ios.tsx:32:9] 2026-10-25T00:57:51.6912701Z 31 │ const tabs = [...visibleNavigationTabs(order, hidden), "settings" as const]; 2026-10-25T00:57:51.6912782Z 32 │ const navigation = useNavigation(); 2026-10-25T00:57:51.6912857Z ·  ─────┬──── 2026-10-25T00:57:51.6912993Z · ╰── 'navigation' is declared here 2026-10-25T00:57:51.6913088Z 33 │ const selectTab = useSelectWorkspaceTab(); 2026-10-25T00:57:51.6913141Z ╰──── 2026-10-25T00:57:51.6913256Z  help: Consider removing this declaration. 2026-10-25T00:57:51.6913262Z 2026-10-25T00:57:51.6913463Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-25T00:57:51.6913607Z ╭─[apps/server/src/provider/Drivers/CodexDriver.test.ts:466:14] 2026-10-25T00:57:51.6913659Z 465 │ 2026-10-25T00:57:51.6913763Z 466 │ for (const {} of ["direct", "wrapper"] as const) { 2026-10-25T00:57:51.6913833Z ·  ── 2026-10-25T00:57:51.6913886Z 467 │ } 2026-10-25T00:57:51.6913937Z ╰──── 2026-10-25T00:57:51.6914160Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-25T00:57:51.6914171Z 2026-10-25T00:57:51.6914425Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T00:57:51.6914570Z ╭─[apps/mobile/src/features/threads/use-worktree-setup.ts:30:40] 2026-10-25T00:57:51.6914727Z 28 │ const snapshot = resolveWorktreeSetupSnapshot(input.threadId, query.data, live); 2026-10-25T00:57:51.6914792Z 29 │ useEffect(() => { 2026-10-25T00:57:51.6914860Z ·  ────┬──── 2026-10-25T00:57:51.6914987Z · ╰── This is the containing effect 2026-10-25T00:57:51.6915295Z 30 │ if (snapshot && snapshot !== live) setHeld({ key, snapshot }); 2026-10-25T00:57:51.6915398Z ·  ───┬─── 2026-10-25T00:57:51.6915637Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.6915782Z 31 │ }, [key, live, snapshot]); 2026-10-25T00:57:51.6915834Z ╰──── 2026-10-25T00:57:51.6916419Z  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-25T00:57:51.6916734Z  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-25T00:57:51.6916736Z 2026-10-25T00:57:51.6916997Z ⚠ eslint(no-unused-vars): Variable 'navigation' is declared but never used. Unused variables should start with a '_'. 2026-10-25T00:57:51.6917161Z ╭─[apps/mobile/src/features/workspace/WorkspaceSectionToolbar.tsx:23:9] 2026-10-25T00:57:51.6917253Z 22 │ const selectTab = useSelectWorkspaceTab(); 2026-10-25T00:57:51.6917336Z 23 │ const navigation = useNavigation(); 2026-10-25T00:57:51.6917408Z ·  ─────┬──── 2026-10-25T00:57:51.6917541Z · ╰── 'navigation' is declared here 2026-10-25T00:57:51.6917630Z 24 │ const selected = selectedNavigationTab( 2026-10-25T00:57:51.6917683Z ╰──── 2026-10-25T00:57:51.6917784Z  help: Consider removing this declaration. 2026-10-25T00:57:51.6917786Z 2026-10-25T00:57:51.6917995Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T00:57:51.6918142Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:773:7] 2026-10-25T00:57:51.6918248Z 772 │ if (settingsSheetPresentation.isActive) { 2026-10-25T00:57:51.6918375Z 773 │ settingsRoutePresentation.present(settingsRouteSession); 2026-10-25T00:57:51.6918470Z ·  ────────────┬──────────── 2026-10-25T00:57:51.6918640Z · ╰── Missing dependency `settingsRoutePresentation` 2026-10-25T00:57:51.6918695Z 774 │ } 2026-10-25T00:57:51.6918893Z 775 │ }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]); 2026-10-25T00:57:51.6918996Z ·  ────────────────┬──────────────── 2026-10-25T00:57:51.6919268Z · ╰── Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead 2026-10-25T00:57:51.6919323Z 776 │ 2026-10-25T00:57:51.6919382Z ╰──── 2026-10-25T00:57:51.6919793Z  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-25T00:57:51.6920102Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6920104Z 2026-10-25T00:57:51.6920256Z ⚠ react(immutability): This value cannot be modified 2026-10-25T00:57:51.6920397Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:391:5] 2026-10-25T00:57:51.6920661Z 387 │ typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0; 2026-10-25T00:57:51.6920868Z 388 │ const animatedBorderRadius = useSharedValue(targetBorderRadius); 2026-10-25T00:57:51.6921052Z ·  ──────────┬───────── 2026-10-25T00:57:51.6921221Z · ╰── `animatedBorderRadius` originates here 2026-10-25T00:57:51.6921375Z 389 │ const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android"; 2026-10-25T00:57:51.6921443Z 390 │ useLayoutEffect(() => { 2026-10-25T00:57:51.6921542Z 391 │ animatedBorderRadius.value = shouldAnimate 2026-10-25T00:57:51.6921631Z ·  ──────────┬───────── 2026-10-25T00:57:51.6921784Z · ╰── `animatedBorderRadius` cannot be modified 2026-10-25T00:57:51.6921869Z 392 │ ? withTiming(targetBorderRadius, { 2026-10-25T00:57:51.6921921Z ╰──── 2026-10-25T00:57:51.6922185Z  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-25T00:57:51.6922485Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T00:57:51.6922487Z 2026-10-25T00:57:51.6922681Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T00:57:51.6922838Z ╭─[apps/mobile/src/features/workspace/WorkspaceToolbar.ios.tsx:114:33] 2026-10-25T00:57:51.6922932Z 113 │ return () => cancelAnimationFrame(frame); 2026-10-25T00:57:51.6923029Z 114 │ }, [restoreSearch, tabActive, bottomSearch]); 2026-10-25T00:57:51.6923131Z ·  ──────┬───── 2026-10-25T00:57:51.6923325Z · ╰── Unnecessary dependency `bottomSearch` 2026-10-25T00:57:51.6923442Z 115 │ const composeButton = nativeToolbarCompose ? ( 2026-10-25T00:57:51.6923495Z ╰──── 2026-10-25T00:57:51.6923779Z  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-25T00:57:51.6924081Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6924083Z 2026-10-25T00:57:51.6924290Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-25T00:57:51.6924392Z ╭─[apps/mobile/src/Stack.tsx:1049:21] 2026-10-25T00:57:51.6924455Z 1048 │ } 2026-10-25T00:57:51.6924777Z ·  ───────────────────────────────────────────── 2026-10-25T00:57:51.6924929Z 1050 │ screenOptions={({ route }) => 2026-10-25T00:57:51.6924981Z ╰──── 2026-10-25T00:57:51.6925331Z  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-25T00:57:51.6925334Z 2026-10-25T00:57:51.6925588Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T00:57:51.6925723Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2189:5] 2026-10-25T00:57:51.6925778Z 2187 │ ); 2026-10-25T00:57:51.6925842Z 2188 │ useEffect(() => { 2026-10-25T00:57:51.6925915Z ·  ────┬──── 2026-10-25T00:57:51.6926050Z · ╰── This is the containing effect 2026-10-25T00:57:51.6926128Z 2189 │ setExpandedVideo(null); 2026-10-25T00:57:51.6926206Z ·  ────────┬─────── 2026-10-25T00:57:51.6926376Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.6926449Z 2190 │ setExpandedFile(null); 2026-10-25T00:57:51.6926501Z ╰──── 2026-10-25T00:57:51.6927088Z  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-25T00:57:51.6927406Z  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-25T00:57:51.6927410Z 2026-10-25T00:57:51.6927661Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T00:57:51.6927794Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2694:9] 2026-10-25T00:57:51.6927929Z 2685 │ const stopFollowingEnd = useEffectEvent(() => setEndFollow(false)); 2026-10-25T00:57:51.6927991Z 2686 │ useEffect(() => { 2026-10-25T00:57:51.6928065Z ·  ────┬──── 2026-10-25T00:57:51.6928192Z · ╰── This is the containing effect 2026-10-25T00:57:51.6928320Z 2687 │ if (!jumpToMessageId || loadedListKey !== listMountKey) return; 2026-10-25T00:57:51.6928413Z 2688 │ const index = presentedFeed.findIndex( 2026-10-25T00:57:51.6928549Z 2689 │ (entry) => entry.type === "message" && entry.id === jumpToMessageId, 2026-10-25T00:57:51.6928610Z 2690 │ ); 2026-10-25T00:57:51.6928680Z 2691 │ if (index === -1) { 2026-10-25T00:57:51.6928804Z 2692 │ const runId = messageFoldRunId(props.feed, jumpToMessageId); 2026-10-25T00:57:51.6928908Z 2693 │ if (runId && !expandedTurnIds.has(runId)) { 2026-10-25T00:57:51.6929002Z 2694 │ setInteractionState((current) => ({ 2026-10-25T00:57:51.6929091Z ·  ─────────┬───────── 2026-10-25T00:57:51.6929262Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.6929328Z 2695 │ ...current, 2026-10-25T00:57:51.6929380Z ╰──── 2026-10-25T00:57:51.6930017Z  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-25T00:57:51.6930399Z  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-25T00:57:51.6930402Z 2026-10-25T00:57:51.6930625Z ⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used. 2026-10-25T00:57:51.6930756Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:70:10] 2026-10-25T00:57:51.6930892Z 69 │ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets"; 2026-10-25T00:57:51.6931029Z 70 │ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks"; 2026-10-25T00:57:51.6931127Z ·  ───────────┬─────────── 2026-10-25T00:57:51.6931292Z · ╰── 'isMarkdownFileLinkLabel' is imported here 2026-10-25T00:57:51.6931448Z 71 │ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments"; 2026-10-25T00:57:51.6931501Z ╰──── 2026-10-25T00:57:51.6931595Z  help: Consider removing this import. 2026-10-25T00:57:51.6931600Z 2026-10-25T00:57:51.6931798Z ⚠ eslint(no-unused-vars): Identifier 'createContext' is imported but never used. 2026-10-25T00:57:51.6931928Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:96:3] 2026-10-25T00:57:51.6931986Z 95 │ import { 2026-10-25T00:57:51.6932049Z 96 │ createContext, 2026-10-25T00:57:51.6932121Z ·  ──────┬────── 2026-10-25T00:57:51.6932261Z · ╰── 'createContext' is imported here 2026-10-25T00:57:51.6932320Z 97 │ memo, 2026-10-25T00:57:51.6932369Z ╰──── 2026-10-25T00:57:51.6932467Z  help: Consider removing this import. 2026-10-25T00:57:51.6932469Z 2026-10-25T00:57:51.6932676Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-25T00:57:51.6932806Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:112:3] 2026-10-25T00:57:51.6932864Z 111 │ import { 2026-10-25T00:57:51.6932929Z 112 │ ActivityIndicator, 2026-10-25T00:57:51.6933009Z ·  ────────┬──────── 2026-10-25T00:57:51.6933152Z · ╰── 'ActivityIndicator' is imported here 2026-10-25T00:57:51.6933209Z 113 │ Image, 2026-10-25T00:57:51.6933276Z ╰──── 2026-10-25T00:57:51.6933404Z  help: Consider removing this import. 2026-10-25T00:57:51.6933409Z 2026-10-25T00:57:51.6933602Z ⚠ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used. 2026-10-25T00:57:51.6933732Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:119:3] 2026-10-25T00:57:51.6933792Z 118 │ Pressable, 2026-10-25T00:57:51.6933855Z 119 │ ScrollView, 2026-10-25T00:57:51.6933927Z ·  ─────┬──── 2026-10-25T00:57:51.6934054Z · ╰── 'ScrollView' is imported here 2026-10-25T00:57:51.6934116Z 120 │ StyleSheet, 2026-10-25T00:57:51.6934166Z ╰──── 2026-10-25T00:57:51.6934261Z  help: Consider removing this import. 2026-10-25T00:57:51.6934263Z 2026-10-25T00:57:51.6934456Z ⚠ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used. 2026-10-25T00:57:51.6934635Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:121:11] 2026-10-25T00:57:51.6934763Z 120 │ StyleSheet, 2026-10-25T00:57:51.6934834Z 121 │ Text as NativeText, 2026-10-25T00:57:51.6934910Z ·  ─────┬──── 2026-10-25T00:57:51.6935046Z · ╰── 'NativeText' is imported here 2026-10-25T00:57:51.6935113Z 122 │ type ColorValue, 2026-10-25T00:57:51.6935167Z ╰──── 2026-10-25T00:57:51.6935259Z  help: Consider removing this import. 2026-10-25T00:57:51.6935265Z 2026-10-25T00:57:51.6935472Z ⚠ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used. 2026-10-25T00:57:51.6935603Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:144:10] 2026-10-25T00:57:51.6935742Z 143 │ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic"; 2026-10-25T00:57:51.6935871Z 144 │ import { tryOpenExternalUrl } from "../../lib/openExternalUrl"; 2026-10-25T00:57:51.6935958Z ·  ─────────┬──────── 2026-10-25T00:57:51.6936108Z · ╰── 'tryOpenExternalUrl' is imported here 2026-10-25T00:57:51.6936253Z 145 │ import { downloadAndShareAttachment } from "../../lib/attachmentDownload"; 2026-10-25T00:57:51.6936306Z ╰──── 2026-10-25T00:57:51.6936398Z  help: Consider removing this import. 2026-10-25T00:57:51.6936400Z 2026-10-25T00:57:51.6936611Z ⚠ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used. 2026-10-25T00:57:51.6936741Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:147:10] 2026-10-25T00:57:51.6936879Z 146 │ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks"; 2026-10-25T00:57:51.6937002Z 147 │ import { faviconUrlForOrigin } from "@t3tools/shared/favicon"; 2026-10-25T00:57:51.6937091Z ·  ─────────┬───────── 2026-10-25T00:57:51.6937241Z · ╰── 'faviconUrlForOrigin' is imported here 2026-10-25T00:57:51.6937301Z 148 │ import { 2026-10-25T00:57:51.6937350Z ╰──── 2026-10-25T00:57:51.6937443Z  help: Consider removing this import. 2026-10-25T00:57:51.6937446Z 2026-10-25T00:57:51.6937652Z ⚠ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used. 2026-10-25T00:57:51.6937782Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:161:10] 2026-10-25T00:57:51.6937926Z 160 │ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile"; 2026-10-25T00:57:51.6938065Z 161 │ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer"; 2026-10-25T00:57:51.6938156Z ·  ────────┬─────── 2026-10-25T00:57:51.6938302Z · ╰── 'MediaVideoPlayer' is imported here 2026-10-25T00:57:51.6938434Z 162 │ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia"; 2026-10-25T00:57:51.6938486Z ╰──── 2026-10-25T00:57:51.6938581Z  help: Consider removing this import. 2026-10-25T00:57:51.6938583Z 2026-10-25T00:57:51.6938797Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used. 2026-10-25T00:57:51.6938928Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:165:3] 2026-10-25T00:57:51.6939007Z 164 │ attachmentVideoPreviewSource, 2026-10-25T00:57:51.6939078Z 165 │ mediaVideoPreviewUri, 2026-10-25T00:57:51.6939214Z ·  ──────────┬───────── 2026-10-25T00:57:51.6939426Z · ╰── 'mediaVideoPreviewUri' is imported here 2026-10-25T00:57:51.6939496Z 166 │ mediaVideoThumbnailKey, 2026-10-25T00:57:51.6939548Z ╰──── 2026-10-25T00:57:51.6939642Z  help: Consider removing this import. 2026-10-25T00:57:51.6939644Z 2026-10-25T00:57:51.6939862Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used. 2026-10-25T00:57:51.6939989Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:166:3] 2026-10-25T00:57:51.6940059Z 165 │ mediaVideoPreviewUri, 2026-10-25T00:57:51.6940130Z 166 │ mediaVideoThumbnailKey, 2026-10-25T00:57:51.6940217Z ·  ───────────┬────────── 2026-10-25T00:57:51.6940375Z · ╰── 'mediaVideoThumbnailKey' is imported here 2026-10-25T00:57:51.6940458Z 167 │ type MediaVideoPreviewSource, 2026-10-25T00:57:51.6940510Z ╰──── 2026-10-25T00:57:51.6940604Z  help: Consider removing this import. 2026-10-25T00:57:51.6940606Z 2026-10-25T00:57:51.6940811Z ⚠ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used. 2026-10-25T00:57:51.6940939Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:167:8] 2026-10-25T00:57:51.6941007Z 166 │ mediaVideoThumbnailKey, 2026-10-25T00:57:51.6941085Z 167 │ type MediaVideoPreviewSource, 2026-10-25T00:57:51.6941176Z ·  ───────────┬─────────── 2026-10-25T00:57:51.6941334Z · ╰── 'MediaVideoPreviewSource' is imported here 2026-10-25T00:57:51.6941424Z 168 │ } from "../../lib/videoPreviewSource"; 2026-10-25T00:57:51.6941478Z ╰──── 2026-10-25T00:57:51.6941568Z  help: Consider removing this import. 2026-10-25T00:57:51.6941570Z 2026-10-25T00:57:51.6941791Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used. 2026-10-25T00:57:51.6941920Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:189:3] 2026-10-25T00:57:51.6941977Z 188 │ import { 2026-10-25T00:57:51.6942047Z 189 │ resolveMarkdownFontSizes, 2026-10-25T00:57:51.6942137Z ·  ────────────┬─────────── 2026-10-25T00:57:51.6942293Z · ╰── 'resolveMarkdownFontSizes' is imported here 2026-10-25T00:57:51.6942377Z 190 │ resolveNativeMarkdownTypography, 2026-10-25T00:57:51.6942426Z ╰──── 2026-10-25T00:57:51.6942519Z  help: Consider removing this import. 2026-10-25T00:57:51.6942569Z 2026-10-25T00:57:51.6942891Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used. 2026-10-25T00:57:51.6943020Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:196:3] 2026-10-25T00:57:51.6943093Z 195 │ normalizeNativeMarkdownUrl, 2026-10-25T00:57:51.6943188Z 196 │ resolveMarkdownInlineCodePresentation, 2026-10-25T00:57:51.6943327Z ·  ──────────────────┬────────────────── 2026-10-25T00:57:51.6943531Z · ╰── 'resolveMarkdownInlineCodePresentation' is imported here 2026-10-25T00:57:51.6943614Z 197 │ resolveMarkdownLinkPresentation, 2026-10-25T00:57:51.6943666Z ╰──── 2026-10-25T00:57:51.6943758Z  help: Consider removing this import. 2026-10-25T00:57:51.6943761Z 2026-10-25T00:57:51.6943974Z ⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used. 2026-10-25T00:57:51.6944103Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:244:3] 2026-10-25T00:57:51.6944166Z 243 │ useAssetUrl, 2026-10-25T00:57:51.6944234Z 244 │ useAssetUrlState, 2026-10-25T00:57:51.6944312Z ·  ────────┬─────── 2026-10-25T00:57:51.6944449Z · ╰── 'useAssetUrlState' is imported here 2026-10-25T00:57:51.6944518Z 245 │ useRefreshAssetUrl, 2026-10-25T00:57:51.6944569Z ╰──── 2026-10-25T00:57:51.6944662Z  help: Consider removing this import. 2026-10-25T00:57:51.6944664Z 2026-10-25T00:57:51.6944856Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T00:57:51.6944994Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2191:7] 2026-10-25T00:57:51.6945069Z 2190 │ setExpandedFile(null); 2026-10-25T00:57:51.6945223Z 2191 │ }, [props.environmentId, props.threadId, props.contentPresentation.kind]); 2026-10-25T00:57:51.6945440Z ·  ─────────┬───────── ───────┬────── ───────────────┬────────────── 2026-10-25T00:57:51.6945726Z · │ │ ╰── Unnecessary dependency `props.contentPresentation.kind` 2026-10-25T00:57:51.6945922Z · │ ╰── Unnecessary dependency `props.threadId` 2026-10-25T00:57:51.6946083Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-25T00:57:51.6946227Z 2192 │ const horizontalPadding = props.layoutVariant === "split" ? 20 : 16; 2026-10-25T00:57:51.6946282Z ╰──── 2026-10-25T00:57:51.6946570Z  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-25T00:57:51.6946873Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6946876Z 2026-10-25T00:57:51.6947069Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T00:57:51.6947200Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2663:7] 2026-10-25T00:57:51.6947294Z 2662 │ reportHeaderMaterialVisibility(false); 2026-10-25T00:57:51.6947458Z 2663 │ }, [feedThreadKey, reportHeaderMaterialVisibility]); 2026-10-25T00:57:51.6947603Z ·  ──────┬────── 2026-10-25T00:57:51.6947751Z · ╰── Unnecessary dependency `feedThreadKey` 2026-10-25T00:57:51.6947803Z 2664 │ 2026-10-25T00:57:51.6947853Z ╰──── 2026-10-25T00:57:51.6948137Z  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-25T00:57:51.6948438Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6948441Z 2026-10-25T00:57:51.6948631Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T00:57:51.6948768Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2679:7] 2026-10-25T00:57:51.6948825Z 2678 │ } 2026-10-25T00:57:51.6948952Z 2679 │ }, [listMountKey, props.contentInsetEndAdjustment, listRef]); 2026-10-25T00:57:51.6949027Z ·  ──────┬───── 2026-10-25T00:57:51.6949171Z · ╰── Unnecessary dependency `listMountKey` 2026-10-25T00:57:51.6949311Z 2680 │ // Opening at a message: its run unfolds, the list stops following the end 2026-10-25T00:57:51.6949361Z ╰──── 2026-10-25T00:57:51.6949643Z  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-25T00:57:51.6949944Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6949946Z 2026-10-25T00:57:51.6950141Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T00:57:51.6950272Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2875:7] 2026-10-25T00:57:51.6950326Z 2874 │ } 2026-10-25T00:57:51.6950501Z 2875 │ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]); 2026-10-25T00:57:51.6950696Z ·  ───────┬─────── ─────────┬──────── ────────┬─────── 2026-10-25T00:57:51.6950939Z · │ │ ╰── Unnecessary dependency `expandedWorkRows` 2026-10-25T00:57:51.6951138Z · │ ╰── Unnecessary dependency `expandedWorkGroups` 2026-10-25T00:57:51.6951293Z · ╰── Unnecessary dependency `expandedTurnIds` 2026-10-25T00:57:51.6951347Z 2876 │ 2026-10-25T00:57:51.6951397Z ╰──── 2026-10-25T00:57:51.6951680Z  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-25T00:57:51.6951981Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6951984Z 2026-10-25T00:57:51.6952156Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-25T00:57:51.6952286Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:626:9] 2026-10-25T00:57:51.6952342Z 625 │ }; 2026-10-25T00:57:51.6952500Z 626 │ }, [props.environmentId, attachment.id, httpBaseUrl]), 2026-10-25T00:57:51.6952747Z ·  ─────────┬───────── ──────┬────── ─────┬───── 2026-10-25T00:57:51.6952977Z · │ │ ╰── Unnecessary dependency `httpBaseUrl` 2026-10-25T00:57:51.6953166Z · │ ╰── Unnecessary dependency `attachment.id` 2026-10-25T00:57:51.6953354Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-25T00:57:51.6953412Z 627 │ ); 2026-10-25T00:57:51.6953461Z ╰──── 2026-10-25T00:57:51.6953772Z  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-25T00:57:51.6954074Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6954077Z 2026-10-25T00:57:51.6954249Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-25T00:57:51.6954426Z ╭─[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:121:34] 2026-10-25T00:57:51.6954492Z 120 │ return [...commands]; 2026-10-25T00:57:51.6954621Z 121 │ }, [activeThreadRef, pathname, registrationVersion, navigation]); 2026-10-25T00:57:51.6954736Z ·  ─────────┬───────── 2026-10-25T00:57:51.6954918Z · ╰── Unnecessary dependency `registrationVersion` 2026-10-25T00:57:51.6954971Z 122 │ 2026-10-25T00:57:51.6955021Z ╰──── 2026-10-25T00:57:51.6955323Z  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-25T00:57:51.6955628Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6955630Z 2026-10-25T00:57:51.6955878Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T00:57:51.6956057Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:107:5] 2026-10-25T00:57:51.6956108Z 104 │ 2026-10-25T00:57:51.6956173Z 105 │ useEffect(() => { 2026-10-25T00:57:51.6956245Z ·  ────┬──── 2026-10-25T00:57:51.6956374Z · ╰── This is the containing effect 2026-10-25T00:57:51.6956451Z 106 │ clearReviewCommentTarget(); 2026-10-25T00:57:51.6956545Z 107 │ setPendingNativeCommentSelection(null); 2026-10-25T00:57:51.6956647Z ·  ────────────────┬─────────────── 2026-10-25T00:57:51.6956818Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.6956888Z 108 │ }, [selectedSection?.id]); 2026-10-25T00:57:51.6956937Z ╰──── 2026-10-25T00:57:51.6957571Z  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-25T00:57:51.6957958Z  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-25T00:57:51.6957960Z 2026-10-25T00:57:51.6958210Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T00:57:51.6958388Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7] 2026-10-25T00:57:51.6958440Z 109 │ 2026-10-25T00:57:51.6958501Z 110 │ useEffect(() => { 2026-10-25T00:57:51.6958571Z ·  ────┬──── 2026-10-25T00:57:51.6958696Z · ╰── This is the containing effect 2026-10-25T00:57:51.6958784Z 111 │ if (activeCommentTarget === null) { 2026-10-25T00:57:51.6958883Z 112 │ setPendingNativeCommentSelection(null); 2026-10-25T00:57:51.6958988Z ·  ────────────────┬─────────────── 2026-10-25T00:57:51.6959160Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.6959214Z 113 │ } 2026-10-25T00:57:51.6959262Z ╰──── 2026-10-25T00:57:51.6959842Z  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-25T00:57:51.6960158Z  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-25T00:57:51.6960163Z 2026-10-25T00:57:51.6960357Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T00:57:51.6960688Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7] 2026-10-25T00:57:51.6960784Z 107 │ setPendingNativeCommentSelection(null); 2026-10-25T00:57:51.6960856Z 108 │ }, [selectedSection?.id]); 2026-10-25T00:57:51.6960940Z ·  ─────────┬───────── 2026-10-25T00:57:51.6961097Z · ╰── Unnecessary dependency `selectedSection?.id` 2026-10-25T00:57:51.6961146Z 109 │ 2026-10-25T00:57:51.6961196Z ╰──── 2026-10-25T00:57:51.6961546Z  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-25T00:57:51.6961968Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6961971Z 2026-10-25T00:57:51.6962219Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T00:57:51.6962389Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:38:5] 2026-10-25T00:57:51.6962442Z 33 │ 2026-10-25T00:57:51.6962507Z 34 │ useEffect(() => { 2026-10-25T00:57:51.6962575Z ·  ────┬──── 2026-10-25T00:57:51.6962698Z · ╰── This is the containing effect 2026-10-25T00:57:51.6962762Z 35 │ scheduler.reset(); 2026-10-25T00:57:51.6962864Z 36 │ highlightedRowIdsRef.current = new Set(); 2026-10-25T00:57:51.6962948Z 37 │ visibleChunkIndexRef.current = 0; 2026-10-25T00:57:51.6963062Z 38 │ setVisibleRange({ firstRowIndex: 0, lastRowIndex: 80 }); 2026-10-25T00:57:51.6963139Z ·  ───────┬─────── 2026-10-25T00:57:51.6963340Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.6963449Z 39 │ setTokensPatchJson(createEmptyTokenPatch(resetKey)); 2026-10-25T00:57:51.6963500Z ╰──── 2026-10-25T00:57:51.6964077Z  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-25T00:57:51.6964392Z  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-25T00:57:51.6964396Z 2026-10-25T00:57:51.6964591Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T00:57:51.6964759Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:41:7] 2026-10-25T00:57:51.6964836Z 40 │ return () => scheduler.cancel(); 2026-10-25T00:57:51.6964936Z 41 │ }, [enabled, resetKey, rows.length, scheduler]); 2026-10-25T00:57:51.6965058Z ·  ───┬─── ─────┬───── 2026-10-25T00:57:51.6965243Z · │ ╰── Unnecessary dependency `rows.length` 2026-10-25T00:57:51.6965382Z · ╰── Unnecessary dependency `enabled` 2026-10-25T00:57:51.6965435Z 42 │ 2026-10-25T00:57:51.6965484Z ╰──── 2026-10-25T00:57:51.6965768Z  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-25T00:57:51.6966070Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6966073Z 2026-10-25T00:57:51.6966347Z ⚠ eslint(no-unused-vars): Variable 'legacyCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-25T00:57:51.6966500Z ╭─[packages/provider-cursor/src/server/credentialStore.test.ts:15:7] 2026-10-25T00:57:51.6966551Z 14 │ 2026-10-25T00:57:51.6966619Z 15 │ const legacyCredentials = { 2026-10-25T00:57:51.6966751Z ·  ────────┬──────── 2026-10-25T00:57:51.6966960Z · ╰── 'legacyCredentials' is declared here 2026-10-25T00:57:51.6967025Z 16 │ version: 1 as const, 2026-10-25T00:57:51.6967073Z ╰──── 2026-10-25T00:57:51.6967175Z  help: Consider removing this declaration. 2026-10-25T00:57:51.6967178Z 2026-10-25T00:57:51.6967447Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-25T00:57:51.6967576Z ╭─[packages/provider-cursor/src/server/auth.ts:249:20] 2026-10-25T00:57:51.6967629Z 248 │ }, 2026-10-25T00:57:51.6967707Z 249 │ (effect, flow, stopSessions) => 2026-10-25T00:57:51.6967797Z ·  ──────┬───── 2026-10-25T00:57:51.6967948Z · ╰── 'stopSessions' is declared here 2026-10-25T00:57:51.6968013Z 250 │ effect.pipe( 2026-10-25T00:57:51.6968063Z ╰──── 2026-10-25T00:57:51.6968163Z  help: Consider removing this parameter. 2026-10-25T00:57:51.6968165Z 2026-10-25T00:57:51.6968353Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T00:57:51.6968499Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:223:31] 2026-10-25T00:57:51.6968604Z 222 │ ? snippetTokens.map((line, lineIndex) => ( 2026-10-25T00:57:51.6968695Z 223 │ 2026-10-25T00:57:51.6968799Z ·  ─────────────── 2026-10-25T00:57:51.6968887Z 224 │ {lineIndex > 0 ? "\n" : ""} 2026-10-25T00:57:51.6968939Z ╰──── 2026-10-25T00:57:51.6969086Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-25T00:57:51.6969091Z 2026-10-25T00:57:51.6969277Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T00:57:51.6969421Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25] 2026-10-25T00:57:51.6969492Z 226 │ { 2026-10-25T00:57:51.6970596Z ·  ────┬──── 2026-10-25T00:57:51.6970722Z · ╰── This is the containing effect 2026-10-25T00:57:51.6970803Z 279 │ setNow(new Date().toISOString()); 2026-10-25T00:57:51.6970872Z ·  ───┬── 2026-10-25T00:57:51.6971031Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.6971163Z 280 │ const id = setInterval(() => setNow(new Date().toISOString()), 60_000); 2026-10-25T00:57:51.6971326Z ╰──── 2026-10-25T00:57:51.6972041Z  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-25T00:57:51.6972356Z  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-25T00:57:51.6972358Z 2026-10-25T00:57:51.6972580Z ⚠ eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used. 2026-10-25T00:57:51.6972734Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:13:8] 2026-10-25T00:57:51.6972805Z 12 │ threadSearchMatchKey, 2026-10-25T00:57:51.6972889Z 13 │ type EnvironmentThreadSearchMatch, 2026-10-25T00:57:51.6972990Z ·  ──────────────┬───────────── 2026-10-25T00:57:51.6973173Z · ╰── 'EnvironmentThreadSearchMatch' is imported here 2026-10-25T00:57:51.6973308Z 14 │ } from "@t3tools/client-runtime/state/thread-search"; 2026-10-25T00:57:51.6973367Z ╰──── 2026-10-25T00:57:51.6973464Z  help: Consider removing this import. 2026-10-25T00:57:51.6973466Z 2026-10-25T00:57:51.6973658Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T00:57:51.6973816Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:359:25] 2026-10-25T00:57:51.6973946Z 358 │ // range) the boundary string is identical and the chain would die. 2026-10-25T00:57:51.6974038Z 359 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-25T00:57:51.6974139Z ·  ───────┬────── 2026-10-25T00:57:51.6974295Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-25T00:57:51.6974404Z 360 │ const listItems = ((): readonly SidebarListItem[] => { 2026-10-25T00:57:51.6974454Z ╰──── 2026-10-25T00:57:51.6974739Z  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-25T00:57:51.6975039Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6975043Z 2026-10-25T00:57:51.6975208Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T00:57:51.6975369Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:350:53] 2026-10-25T00:57:51.6975452Z 349 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-25T00:57:51.6975604Z 350 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-25T00:57:51.6975720Z ·  ─────┬──── 2026-10-25T00:57:51.6975879Z · ╰── Cannot call impure function 2026-10-25T00:57:51.6975955Z 351 │ const id = setTimeout(() => { 2026-10-25T00:57:51.6976005Z ╰──── 2026-10-25T00:57:51.6976280Z  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-25T00:57:51.6976617Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T00:57:51.6976649Z 2026-10-25T00:57:51.6976888Z ⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used. 2026-10-25T00:57:51.6977024Z ╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10] 2026-10-25T00:57:51.6977074Z 21 │ 2026-10-25T00:57:51.6977226Z 22 │ function summarizePayload(payload: unknown): Readonly> { 2026-10-25T00:57:51.6977309Z ·  ────────┬─────── 2026-10-25T00:57:51.6977452Z · ╰── 'summarizePayload' is declared here 2026-10-25T00:57:51.6977553Z 23 │ if (payload === null) return { valueType: "null" }; 2026-10-25T00:57:51.6977602Z ╰──── 2026-10-25T00:57:51.6977707Z  help: Consider removing this declaration. 2026-10-25T00:57:51.6977712Z 2026-10-25T00:57:51.6977863Z ⚠ react(immutability): This value cannot be modified 2026-10-25T00:57:51.6978014Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-25T00:57:51.6978063Z 83 │ 2026-10-25T00:57:51.6978154Z 84 │ const cardCoverage = props.cardCoverage; 2026-10-25T00:57:51.6978230Z ·  ──────┬───── 2026-10-25T00:57:51.6978361Z · ╰── `cardCoverage` originates here 2026-10-25T00:57:51.6978436Z 85 │ const barHeightRef = useRef(0); 2026-10-25T00:57:51.6978513Z 86 │ const cardHeightRef = useRef(0); 2026-10-25T00:57:51.6978595Z 87 │ const cardHeight = useSharedValue(0); 2026-10-25T00:57:51.6978683Z 88 │ const notifyCoverage = useCallback(() => { 2026-10-25T00:57:51.6978754Z 89 │ if (!cardCoverage) { 2026-10-25T00:57:51.6978816Z 90 │ return; 2026-10-25T00:57:51.6978869Z 91 │ } 2026-10-25T00:57:51.6979028Z 92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-25T00:57:51.6979128Z 93 │ // feed inset and floating controls trailing it. 2026-10-25T00:57:51.6979282Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-25T00:57:51.6979355Z ·  ──────┬───── 2026-10-25T00:57:51.6979487Z · ╰── `cardCoverage` cannot be modified 2026-10-25T00:57:51.6979552Z 95 │ }, [cardCoverage]); 2026-10-25T00:57:51.6979602Z ╰──── 2026-10-25T00:57:51.6979893Z  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-25T00:57:51.6980194Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T00:57:51.6980197Z 2026-10-25T00:57:51.6980347Z ⚠ react(immutability): This value cannot be modified 2026-10-25T00:57:51.6980498Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:106:7] 2026-10-25T00:57:51.6980577Z  86 │ const cardHeightRef = useRef(0); 2026-10-25T00:57:51.6980661Z  87 │ const cardHeight = useSharedValue(0); 2026-10-25T00:57:51.6980735Z ·  ─────┬──── 2026-10-25T00:57:51.6980866Z · ╰── `cardHeight` originates here 2026-10-25T00:57:51.6980957Z  88 │ const notifyCoverage = useCallback(() => { 2026-10-25T00:57:51.6981079Z  89 │ if (!cardCoverage) { 2026-10-25T00:57:51.6981199Z  90 │ return; 2026-10-25T00:57:51.6981254Z  91 │ } 2026-10-25T00:57:51.6981414Z  92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-25T00:57:51.6981511Z  93 │ // feed inset and floating controls trailing it. 2026-10-25T00:57:51.6981661Z  94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-25T00:57:51.6981726Z  95 │ }, [cardCoverage]); 2026-10-25T00:57:51.6981808Z  96 │ const handleBarLayout = useCallback( 2026-10-25T00:57:51.6981887Z  97 │ (event: LayoutChangeEvent) => { 2026-10-25T00:57:51.6982005Z  98 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-25T00:57:51.6982071Z  99 │ notifyCoverage(); 2026-10-25T00:57:51.6982124Z 100 │ }, 2026-10-25T00:57:51.6982187Z 101 │ [notifyCoverage], 2026-10-25T00:57:51.6982243Z 102 │ ); 2026-10-25T00:57:51.6982329Z 103 │ const handleCardLayout = useCallback( 2026-10-25T00:57:51.6982408Z 104 │ (event: LayoutChangeEvent) => { 2026-10-25T00:57:51.6982529Z 105 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-25T00:57:51.6982638Z 106 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-25T00:57:51.6982714Z ·  ─────┬──── 2026-10-25T00:57:51.6982846Z · ╰── `cardHeight` cannot be modified 2026-10-25T00:57:51.6982909Z 107 │ notifyCoverage(); 2026-10-25T00:57:51.6982959Z ╰──── 2026-10-25T00:57:51.6983218Z  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-25T00:57:51.6983564Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T00:57:51.6983569Z 2026-10-25T00:57:51.6983763Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-25T00:57:51.6983911Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-25T00:57:51.6983995Z 87 │ const cardHeight = useSharedValue(0); 2026-10-25T00:57:51.6984084Z 88 │ const notifyCoverage = useCallback(() => { 2026-10-25T00:57:51.6984184Z ·  ───┬─── 2026-10-25T00:57:51.6984413Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-25T00:57:51.6984477Z 89 │ if (!cardCoverage) { 2026-10-25T00:57:51.6984537Z 90 │ return; 2026-10-25T00:57:51.6984637Z 91 │ } 2026-10-25T00:57:51.6984863Z 92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-25T00:57:51.6984961Z 93 │ // feed inset and floating controls trailing it. 2026-10-25T00:57:51.6985115Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-25T00:57:51.6985188Z ·  ──────┬───── 2026-10-25T00:57:51.6985312Z · ╰── This modifies `cardCoverage` 2026-10-25T00:57:51.6985376Z 95 │ }, [cardCoverage]); 2026-10-25T00:57:51.6985426Z ╰──── 2026-10-25T00:57:51.6985757Z  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-25T00:57:51.6986055Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T00:57:51.6986062Z 2026-10-25T00:57:51.6986253Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-25T00:57:51.6986403Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-25T00:57:51.6986501Z 93 │ // feed inset and floating controls trailing it. 2026-10-25T00:57:51.6986652Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-25T00:57:51.6986722Z ·  ──────┬───── 2026-10-25T00:57:51.6986848Z · ╰── This modifies `cardCoverage` 2026-10-25T00:57:51.6986913Z 95 │ }, [cardCoverage]); 2026-10-25T00:57:51.6986994Z 96 │ const handleBarLayout = useCallback( 2026-10-25T00:57:51.6987075Z 97 │ (event: LayoutChangeEvent) => { 2026-10-25T00:57:51.6987181Z ·  ───────────────┬─────────────── 2026-10-25T00:57:51.6987397Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-25T00:57:51.6987516Z 98 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-25T00:57:51.6987566Z ╰──── 2026-10-25T00:57:51.6987894Z  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-25T00:57:51.6988193Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T00:57:51.6988196Z 2026-10-25T00:57:51.6988396Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-25T00:57:51.6988552Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:106:7] 2026-10-25T00:57:51.6988635Z 103 │ const handleCardLayout = useCallback( 2026-10-25T00:57:51.6988715Z 104 │ (event: LayoutChangeEvent) => { 2026-10-25T00:57:51.6988816Z ·  ───────────────┬─────────────── 2026-10-25T00:57:51.6989031Z · ╰── This function may (indirectly) reassign or modify `cardHeight` after render 2026-10-25T00:57:51.6989152Z 105 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-25T00:57:51.6989263Z 106 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-25T00:57:51.6989335Z ·  ─────┬──── 2026-10-25T00:57:51.6989508Z · ╰── This modifies `cardHeight` 2026-10-25T00:57:51.6989633Z 107 │ notifyCoverage(); 2026-10-25T00:57:51.6989683Z ╰──── 2026-10-25T00:57:51.6990008Z  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-25T00:57:51.6990304Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T00:57:51.6990306Z 2026-10-25T00:57:51.6990500Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T00:57:51.6990631Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:454:7] 2026-10-25T00:57:51.6990711Z 453 │ showAuxiliaryPane("inspector"); 2026-10-25T00:57:51.6990818Z 454 │ }, [environmentId, showAuxiliaryPane, threadId]); 2026-10-25T00:57:51.6990956Z ·  ──────┬────── ────┬─── 2026-10-25T00:57:51.6991149Z · │ ╰── Unnecessary dependency `threadId` 2026-10-25T00:57:51.6991292Z · ╰── Unnecessary dependency `environmentId` 2026-10-25T00:57:51.6991349Z 455 │ const { 2026-10-25T00:57:51.6991398Z ╰──── 2026-10-25T00:57:51.6991683Z  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-25T00:57:51.6991985Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.6991987Z 2026-10-25T00:57:51.6992174Z ⚠ react(static-components): Cannot create components during render 2026-10-25T00:57:51.6992307Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:725:20] 2026-10-25T00:57:51.6992367Z 492 │ // same check. 2026-10-25T00:57:51.6992489Z 493 │ const NativeReviewDiffView = resolveNativeReviewDiffView(); 2026-10-25T00:57:51.6992604Z ·  ─────────────┬───────────── 2026-10-25T00:57:51.6992778Z · ╰── The component is created during render here 2026-10-25T00:57:51.6992923Z 494 │ const nativeReviewDiffViewRef = useRef(null); 2026-10-25T00:57:51.6993040Z 495 │ const showcasedReviewDrawRef = useRef(null); 2026-10-25T00:57:51.6993174Z 496 │ const [isPullRefreshing, setIsPullRefreshing] = useState(false); 2026-10-25T00:57:51.6993279Z 497 │ const handlePullToRefresh = async () => { 2026-10-25T00:57:51.6993384Z 498 │ setIsPullRefreshing(true); 2026-10-25T00:57:51.6993466Z 499 │ await refreshSelectedSection(); 2026-10-25T00:57:51.6993541Z 500 │ setIsPullRefreshing(false); 2026-10-25T00:57:51.6993593Z 501 │ }; 2026-10-25T00:57:51.6993729Z 502 │ const reviewFileNavigatorRef = useRef(null); 2026-10-25T00:57:51.6993867Z 503 │ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : []; 2026-10-25T00:57:51.6993972Z 504 │ const fileVisibility = useReviewFileVisibility({ 2026-10-25T00:57:51.6994054Z 505 │ threadKey: reviewCache.threadKey, 2026-10-25T00:57:51.6994139Z 506 │ sectionId: selectedSection?.id ?? null, 2026-10-25T00:57:51.6994205Z 507 │ files: reviewFiles, 2026-10-25T00:57:51.6994350Z 508 │ cachedExpandedFileIds: selectedSection?.id 2026-10-25T00:57:51.6994545Z 509 │ ? reviewCache.expandedFileIdsBySection[selectedSection.id] 2026-10-25T00:57:51.6994607Z 510 │ : undefined, 2026-10-25T00:57:51.6994699Z 511 │ cachedViewedFileIds: selectedSection?.id 2026-10-25T00:57:51.6994816Z 512 │ ? reviewCache.viewedFileIdsBySection[selectedSection.id] 2026-10-25T00:57:51.6994876Z 513 │ : undefined, 2026-10-25T00:57:51.6994927Z 514 │ }); 2026-10-25T00:57:51.6995113Z 515 │ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility; 2026-10-25T00:57:51.6995242Z 516 │ const commentSelection = useReviewCommentSelectionController({ 2026-10-25T00:57:51.6995302Z 517 │ environmentId, 2026-10-25T00:57:51.6995360Z 518 │ threadId, 2026-10-25T00:57:51.6995423Z 519 │ selectedSection, 2026-10-25T00:57:51.6995491Z 520 │ nativeReviewDiffData, 2026-10-25T00:57:51.6995552Z 521 │ }); 2026-10-25T00:57:51.6995655Z 522 │ const nativeBridge = useNativeReviewDiffBridge({ 2026-10-25T00:57:51.6995738Z 523 │ threadKey: reviewCache.threadKey, 2026-10-25T00:57:51.6995824Z 524 │ sectionId: selectedSection?.id ?? null, 2026-10-25T00:57:51.6995898Z 525 │ diff: selectedSection?.diff, 2026-10-25T00:57:51.6995972Z 526 │ data: nativeReviewDiffData, 2026-10-25T00:57:51.6996038Z 527 │ collapsedFileIds, 2026-10-25T00:57:51.6996099Z 528 │ viewedFileIds, 2026-10-25T00:57:51.6996203Z 529 │ selectedRowIds: commentSelection.selectedRowIds, 2026-10-25T00:57:51.6996298Z 530 │ canHighlight: parsedDiff.kind === "files", 2026-10-25T00:57:51.6996350Z 531 │ }); 2026-10-25T00:57:51.6996420Z 532 │ const showcaseReviewKey = 2026-10-25T00:57:51.6996547Z 533 │ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection 2026-10-25T00:57:51.6996753Z 534 │ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}` 2026-10-25T00:57:51.6996814Z 535 │ : null; 2026-10-25T00:57:51.6996976Z 536 │ const handleNativeDebug = (event: NativeSyntheticEvent>) => { 2026-10-25T00:57:51.6997050Z 537 │ nativeBridge.onDebug(event); 2026-10-25T00:57:51.6997108Z 538 │ if ( 2026-10-25T00:57:51.6997185Z 539 │ showcaseReviewKey === null || 2026-10-25T00:57:51.6997303Z 540 │ showcasedReviewDrawRef.current === showcaseReviewKey || 2026-10-25T00:57:51.6997407Z 541 │ !isNativeReviewDiffDrawEvent(event.nativeEvent) 2026-10-25T00:57:51.6997463Z 542 │ ) { 2026-10-25T00:57:51.6997521Z 543 │ return; 2026-10-25T00:57:51.6997575Z 544 │ } 2026-10-25T00:57:51.6997681Z 545 │ showcasedReviewDrawRef.current = showcaseReviewKey; 2026-10-25T00:57:51.6997844Z 546 │ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId }); 2026-10-25T00:57:51.6997897Z 547 │ }; 2026-10-25T00:57:51.6997947Z 548 │ 2026-10-25T00:57:51.6998058Z 549 │ const handleSelectFile = async (fileId: string | null) => { 2026-10-25T00:57:51.6998135Z 550 │ loadVisibleFile(fileId, true); 2026-10-25T00:57:51.6998222Z 551 │ commentSelection.clearSelection(); 2026-10-25T00:57:51.6998340Z 552 │ if (fileId !== null && collapsedFileIds.includes(fileId)) { 2026-10-25T00:57:51.6998416Z 553 │ toggleExpandedFile(fileId); 2026-10-25T00:57:51.6998470Z 554 │ } 2026-10-25T00:57:51.6998577Z 555 │ const nativeView = nativeReviewDiffViewRef.current; 2026-10-25T00:57:51.6998646Z 556 │ if (!nativeView) return; 2026-10-25T00:57:51.6998735Z 557 │ const result = await settlePromise(() => 2026-10-25T00:57:51.6998962Z 558 │ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true), 2026-10-25T00:57:51.6999074Z 559 │ ); 2026-10-25T00:57:51.6999168Z 560 │ if (AsyncResult.isFailure(result)) { 2026-10-25T00:57:51.6999345Z 561 │ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result)); 2026-10-25T00:57:51.6999397Z 562 │ } 2026-10-25T00:57:51.6999449Z 563 │ }; 2026-10-25T00:57:51.6999528Z 564 │ const handleVisibleFileChange = ( 2026-10-25T00:57:51.6999658Z 565 │ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>, 2026-10-25T00:57:51.6999713Z 566 │ ) => { 2026-10-25T00:57:51.6999819Z 567 │ loadVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-25T00:57:51.6999981Z 568 │ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-25T00:57:51.7000033Z 569 │ }; 2026-10-25T00:57:51.7000114Z 570 │ const renderInspector = () => ( 2026-10-25T00:57:51.7000183Z 571 │ void handleSelectFile(fileId)} 2026-10-25T00:57:51.7000793Z 577 │ /> 2026-10-25T00:57:51.7000845Z 578 │ ); 2026-10-25T00:57:51.7000895Z 579 │ 2026-10-25T00:57:51.7001074Z 580 │ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => { 2026-10-25T00:57:51.7001159Z 581 │ const { fileId } = event.nativeEvent; 2026-10-25T00:57:51.7001220Z 582 │ if (fileId) { 2026-10-25T00:57:51.7001304Z 583 │ loadVisibleFile(fileId, true); 2026-10-25T00:57:51.7001382Z 584 │ toggleExpandedFile(fileId); 2026-10-25T00:57:51.7001433Z 585 │ } 2026-10-25T00:57:51.7001485Z 586 │ }; 2026-10-25T00:57:51.7001533Z 587 │ 2026-10-25T00:57:51.7001620Z 588 │ const handleNativeToggleViewedFile = ( 2026-10-25T00:57:51.7001735Z 589 │ event: NativeSyntheticEvent<{ readonly fileId?: string }>, 2026-10-25T00:57:51.7001790Z 590 │ ) => { 2026-10-25T00:57:51.7001871Z 591 │ const { fileId } = event.nativeEvent; 2026-10-25T00:57:51.7001931Z 592 │ if (fileId) { 2026-10-25T00:57:51.7002004Z 593 │ toggleViewedFile(fileId); 2026-10-25T00:57:51.7002055Z 594 │ } 2026-10-25T00:57:51.7002105Z 595 │ }; 2026-10-25T00:57:51.7002154Z 596 │ 2026-10-25T00:57:51.7002225Z 597 │ const parsedDiffNotice = 2026-10-25T00:57:51.7002386Z 598 │ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null; 2026-10-25T00:57:51.7002506Z 599 │ const hasCachedSelectedDiff = selectedSection?.diff != null; 2026-10-25T00:57:51.7002659Z 600 │ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null); 2026-10-25T00:57:51.7002775Z 601 │ const sectionMenu = buildReviewSectionMenu(reviewSections); 2026-10-25T00:57:51.7002927Z 602 │ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({ 2026-10-25T00:57:51.7003033Z 603 │ hasEnvironmentPresentation: environment.isReady, 2026-10-25T00:57:51.7003131Z 604 │ isEnvironmentConnected: isEnvironmentReady, 2026-10-25T00:57:51.7003201Z 605 │ hasCachedSelectedDiff, 2026-10-25T00:57:51.7003295Z 606 │ hasAnyCachedDiff, 2026-10-25T00:57:51.7003348Z 607 │ }); 2026-10-25T00:57:51.7003438Z 608 │ const handleRetryEnvironment = () => { 2026-10-25T00:57:51.7003588Z 609 │ void retryEnvironment(environmentId); 2026-10-25T00:57:51.7003715Z 610 │ }; 2026-10-25T00:57:51.7003801Z 611 │ const handleReturnToThread = () => { 2026-10-25T00:57:51.7003877Z 612 │ if (navigation.canGoBack()) { 2026-10-25T00:57:51.7003944Z 613 │ navigation.goBack(); 2026-10-25T00:57:51.7004001Z 614 │ return; 2026-10-25T00:57:51.7004053Z 615 │ } 2026-10-25T00:57:51.7004131Z 616 │ navigation.navigate("Thread", { 2026-10-25T00:57:51.7004218Z 617 │ environmentId: String(environmentId), 2026-10-25T00:57:51.7004291Z 618 │ threadId: String(threadId), 2026-10-25T00:57:51.7004345Z 619 │ }); 2026-10-25T00:57:51.7004396Z 620 │ }; 2026-10-25T00:57:51.7004471Z 621 │ const androidHeaderSubtitle = [ 2026-10-25T00:57:51.7004538Z 622 │ selectedSection?.title, 2026-10-25T00:57:51.7004616Z 623 │ headerDiffSummary.additions, 2026-10-25T00:57:51.7004697Z 624 │ headerDiffSummary.deletions, 2026-10-25T00:57:51.7004751Z 625 │ ] 2026-10-25T00:57:51.7004852Z 626 │ .filter((part): part is string => Boolean(part)) 2026-10-25T00:57:51.7004915Z 627 │ .join(" · "); 2026-10-25T00:57:51.7004965Z 628 │ 2026-10-25T00:57:51.7005040Z 629 │ const showChangedFilesPane = 2026-10-25T00:57:51.7005108Z 630 │ !showConnectionNotice && 2026-10-25T00:57:51.7005181Z 631 │ selectedSection !== null && 2026-10-25T00:57:51.7005256Z 632 │ parsedDiff.kind === "files" && 2026-10-25T00:57:51.7005332Z 633 │ NativeReviewDiffView !== null; 2026-10-25T00:57:51.7005498Z 634 │ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined); 2026-10-25T00:57:51.7005662Z 635 │ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane; 2026-10-25T00:57:51.7005711Z 636 │ 2026-10-25T00:57:51.7005785Z 637 │ const listHeader = (() => { 2026-10-25T00:57:51.7005871Z 638 │ const children: ReactElement[] = []; 2026-10-25T00:57:51.7005921Z 639 │ 2026-10-25T00:57:51.7005981Z 640 │ if (error) { 2026-10-25T00:57:51.7006044Z 641 │ children.push( 2026-10-25T00:57:51.7006103Z 642 │ 2026-10-25T00:57:51.7006727Z 649 │ Review unavailable 2026-10-25T00:57:51.7006884Z 650 │ {error} 2026-10-25T00:57:51.7006945Z 651 │ , 2026-10-25T00:57:51.7006999Z 652 │ ); 2026-10-25T00:57:51.7007049Z 653 │ } 2026-10-25T00:57:51.7007100Z 654 │ 2026-10-25T00:57:51.7007170Z 655 │ if (parsedDiffNotice) { 2026-10-25T00:57:51.7007324Z 656 │ children.push(); 2026-10-25T00:57:51.7007376Z 657 │ } 2026-10-25T00:57:51.7007425Z 658 │ 2026-10-25T00:57:51.7007499Z 659 │ if (children.length === 0) { 2026-10-25T00:57:51.7007560Z 660 │ return null; 2026-10-25T00:57:51.7007613Z 661 │ } 2026-10-25T00:57:51.7007663Z 662 │ 2026-10-25T00:57:51.7007730Z 663 │ return <>{children}; 2026-10-25T00:57:51.7007783Z 664 │ })(); 2026-10-25T00:57:51.7007849Z 665 │ const headerSubtitle = [ 2026-10-25T00:57:51.7007977Z 666 │ headerDiffSummary.additions, 2026-10-25T00:57:51.7008122Z 667 │ headerDiffSummary.deletions, 2026-10-25T00:57:51.7008199Z 668 │ pendingReviewCommentCount > 0 2026-10-25T00:57:51.7008365Z 669 │ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}` 2026-10-25T00:57:51.7008422Z 670 │ : null, 2026-10-25T00:57:51.7008473Z 671 │ ] 2026-10-25T00:57:51.7008535Z 672 │ .filter(Boolean) 2026-10-25T00:57:51.7008594Z 673 │ .join(" · "); 2026-10-25T00:57:51.7008725Z 674 │ const headerTitleText = selectedSection?.title ?? "Review changes"; 2026-10-25T00:57:51.7008774Z 675 │ 2026-10-25T00:57:51.7008831Z 676 │ return ( 2026-10-25T00:57:51.7008884Z 677 │ <> 2026-10-25T00:57:51.7008946Z 678 │ 2026-10-25T00:57:51.7010227Z 694 │ 2026-10-25T00:57:51.7010289Z 695 │ 2026-10-25T00:57:51.7010408Z 696 │ 2026-10-25T00:57:51.7010487Z 697 │ {showConnectionNotice ? ( 2026-10-25T00:57:51.7010623Z 698 │ 2026-10-25T00:57:51.7010709Z 699 │ 2026-10-25T00:57:51.7011687Z 711 │ 2026-10-25T00:57:51.7011840Z 712 │ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? ( 2026-10-25T00:57:51.7011900Z 713 │ 2026-10-25T00:57:51.7012441Z 719 │ 2026-10-25T00:57:51.7012786Z 723 │ {listHeader} 2026-10-25T00:57:51.7012901Z 724 │ 2026-10-25T00:57:51.7012981Z 725 │ { 2026-10-25T00:57:51.7015036Z  84 │ │ const fetchImplementation = options.fetchImplementation ?? fetch; 2026-10-25T00:57:51.7015166Z  85 │ │ const connections = new Map(); 2026-10-25T00:57:51.7015233Z  86 │ │ 2026-10-25T00:57:51.7015441Z  87 │ │ const connectionFor = (connectionId: string): Effect.Effect => 2026-10-25T00:57:51.7015539Z  88 │ │ Effect.suspend(() => { 2026-10-25T00:57:51.7015671Z  89 │ │ const connection = connections.get(connectionId); 2026-10-25T00:57:51.7015828Z  90 │ │ return connection === undefined 2026-10-25T00:57:51.7016110Z  91 │ │ ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`)) 2026-10-25T00:57:51.7016219Z  92 │ │ : Effect.succeed(connection); 2026-10-25T00:57:51.7016291Z  93 │ │ }); 2026-10-25T00:57:51.7016359Z  94 │ │ 2026-10-25T00:57:51.7016443Z  95 │ │ const send = ( 2026-10-25T00:57:51.7016539Z  96 │ │ connection: Connection, 2026-10-25T00:57:51.7016628Z  97 │ │ message: unknown, 2026-10-25T00:57:51.7016783Z  98 │ │ ): Effect.Effect, AcpMcpOverAcpError> => 2026-10-25T00:57:51.7016895Z  99 │ │ connection.mutex.withPermits(1)( 2026-10-25T00:57:51.7017004Z 100 │ │ Effect.gen(function* () { 2026-10-25T00:57:51.7017125Z 101 │ │ const body = JSON.stringify(message); 2026-10-25T00:57:51.7017263Z 102 │ │ if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) { 2026-10-25T00:57:51.7017472Z 103 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB.")); 2026-10-25T00:57:51.7017548Z 104 │ │ } 2026-10-25T00:57:51.7017675Z 105 │ │ const response = yield* Effect.tryPromise({ 2026-10-25T00:57:51.7017774Z 106 │ │ try: (signal) => 2026-10-25T00:57:51.7017901Z 107 │ │ fetchImplementation(options.endpoint, { 2026-10-25T00:57:51.7018000Z 108 │ │ method: "POST", 2026-10-25T00:57:51.7018094Z 109 │ │ signal, 2026-10-25T00:57:51.7018192Z 110 │ │ headers: { 2026-10-25T00:57:51.7018316Z 111 │ │ "content-type": "application/json", 2026-10-25T00:57:51.7018455Z 112 │ │ accept: "application/json, text/event-stream", 2026-10-25T00:57:51.7018581Z 113 │ │ authorization: options.authorization, 2026-10-25T00:57:51.7018704Z 114 │ │ ...(connection.sessionId === null 2026-10-25T00:57:51.7018795Z 115 │ │ ? {} 2026-10-25T00:57:51.7018935Z 116 │ │ : { "mcp-session-id": connection.sessionId }), 2026-10-25T00:57:51.7019063Z 117 │ │ ...(connection.protocolVersion === null 2026-10-25T00:57:51.7019157Z 118 │ │ ? {} 2026-10-25T00:57:51.7019321Z 119 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-25T00:57:51.7019404Z 120 │ │ }, 2026-10-25T00:57:51.7019490Z 121 │ │ body, 2026-10-25T00:57:51.7019571Z 122 │ │ }), 2026-10-25T00:57:51.7019669Z 123 │ │ catch: bridgeError, 2026-10-25T00:57:51.7019748Z 124 │ │ }); 2026-10-25T00:57:51.7019954Z 125 │ │ connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId; 2026-10-25T00:57:51.7020049Z 126 │ │ if (!response.ok) { 2026-10-25T00:57:51.7020211Z 127 │ │ yield* Effect.promise( 2026-10-25T00:57:51.7020503Z 128 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-25T00:57:51.7020583Z 129 │ │ ); 2026-10-25T00:57:51.7020691Z 130 │ │ return yield* Effect.fail( 2026-10-25T00:57:51.7020896Z 131 │ │ new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`), 2026-10-25T00:57:51.7020973Z 132 │ │ ); 2026-10-25T00:57:51.7021048Z 133 │ │ } 2026-10-25T00:57:51.7021250Z 134 │ │ const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))]; 2026-10-25T00:57:51.7021366Z 135 │ │ for (const payload of payloads) { 2026-10-25T00:57:51.7021579Z 136 │ │ connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion; 2026-10-25T00:57:51.7021655Z 137 │ │ } 2026-10-25T00:57:51.7021751Z 138 │ │ return payloads; 2026-10-25T00:57:51.7021869Z 139 │ │ }).pipe(Effect.mapError(bridgeError)), 2026-10-25T00:57:51.7021941Z 140 │ │ ); 2026-10-25T00:57:51.7022009Z 141 │ │ 2026-10-25T00:57:51.7022177Z 142 │ │ const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* ( 2026-10-25T00:57:51.7022300Z 143 │ │ request: AcpSchema.DisconnectMcpRequest, 2026-10-25T00:57:51.7022478Z 144 │ │ ): Effect.fn.Return { 2026-10-25T00:57:51.7022639Z 145 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-25T00:57:51.7022763Z 146 │ │ connections.delete(request.connectionId); 2026-10-25T00:57:51.7022881Z 147 │ │ const sessionId = connection.sessionId; 2026-10-25T00:57:51.7022980Z 148 │ │ if (sessionId !== null) { 2026-10-25T00:57:51.7023105Z 149 │ │ const response = yield* Effect.tryPromise({ 2026-10-25T00:57:51.7023200Z 150 │ │ try: (signal) => 2026-10-25T00:57:51.7023337Z 151 │ │ fetchImplementation(options.endpoint, { 2026-10-25T00:57:51.7023472Z 152 │ │ method: "DELETE", 2026-10-25T00:57:51.7023559Z 153 │ │ signal, 2026-10-25T00:57:51.7023650Z 154 │ │ headers: { 2026-10-25T00:57:51.7023780Z 155 │ │ authorization: options.authorization, 2026-10-25T00:57:51.7023898Z 156 │ │ "mcp-session-id": sessionId, 2026-10-25T00:57:51.7024026Z 157 │ │ ...(connection.protocolVersion === null 2026-10-25T00:57:51.7024114Z 158 │ │ ? {} 2026-10-25T00:57:51.7024269Z 159 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-25T00:57:51.7024350Z 160 │ │ }, 2026-10-25T00:57:51.7024429Z 161 │ │ }), 2026-10-25T00:57:51.7024525Z 162 │ │ catch: bridgeError, 2026-10-25T00:57:51.7024600Z 163 │ │ }); 2026-10-25T00:57:51.7024780Z 164 │ │ if (!response.ok && response.status !== 404) { 2026-10-25T00:57:51.7024917Z 165 │ │ return yield* Effect.fail( 2026-10-25T00:57:51.7025023Z 166 │ │ new AcpMcpOverAcpError( 2026-10-25T00:57:51.7025200Z 167 │ │ `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`, 2026-10-25T00:57:51.7025278Z 168 │ │ ), 2026-10-25T00:57:51.7025355Z 169 │ │ ); 2026-10-25T00:57:51.7025428Z 170 │ │ } 2026-10-25T00:57:51.7025527Z 171 │ │ yield* Effect.promise( 2026-10-25T00:57:51.7025701Z 172 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-25T00:57:51.7025776Z 173 │ │ ); 2026-10-25T00:57:51.7025853Z 174 │ │ } 2026-10-25T00:57:51.7025936Z 175 │ │ return {}; 2026-10-25T00:57:51.7026008Z 176 │ │ }); 2026-10-25T00:57:51.7026074Z 177 │ │ 2026-10-25T00:57:51.7026151Z 178 │ │ return { 2026-10-25T00:57:51.7026316Z 179 │ │ connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) { 2026-10-25T00:57:51.7026432Z 180 │ │ if (request.serverId !== "t3-code") { 2026-10-25T00:57:51.7026537Z 181 │ │ return yield* Effect.fail( 2026-10-25T00:57:51.7026716Z 182 │ │ new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`), 2026-10-25T00:57:51.7026790Z 183 │ │ ); 2026-10-25T00:57:51.7026864Z 184 │ │ } 2026-10-25T00:57:51.7026992Z 185 │ │ if (connections.size >= MAX_CONNECTIONS) { 2026-10-25T00:57:51.7027197Z 186 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections.")); 2026-10-25T00:57:51.7027268Z 187 │ │ } 2026-10-25T00:57:51.7027419Z 188 │ │ const connectionId = yield* options.allocateConnectionId; 2026-10-25T00:57:51.7027532Z 189 │ │ connections.set(connectionId, { 2026-10-25T00:57:51.7027646Z 190 │ │ mutex: yield* Semaphore.make(1), 2026-10-25T00:57:51.7027741Z 191 │ │ sessionId: null, 2026-10-25T00:57:51.7027844Z 192 │ │ protocolVersion: null, 2026-10-25T00:57:51.7027940Z 193 │ │ nextRequestId: 0, 2026-10-25T00:57:51.7028022Z 194 │ │ }); 2026-10-25T00:57:51.7028124Z 195 │ │ return { connectionId }; 2026-10-25T00:57:51.7028197Z 196 │ │ }), 2026-10-25T00:57:51.7028367Z 197 │ │ message: Effect.fn("mcpOverAcpBridge.message")(function* (request) { 2026-10-25T00:57:51.7028525Z 198 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-25T00:57:51.7028642Z 199 │ │ const id = ++connection.nextRequestId; 2026-10-25T00:57:51.7028766Z 200 │ │ const payloads = yield* send(connection, { 2026-10-25T00:57:51.7028861Z 201 │ │ jsonrpc: "2.0", 2026-10-25T00:57:51.7028938Z 202 │ │ id, 2026-10-25T00:57:51.7029087Z 203 │ │ method: request.method, 2026-10-25T00:57:51.7029275Z 204 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-25T00:57:51.7029350Z 205 │ │ }); 2026-10-25T00:57:51.7029531Z 206 │ │ const response = payloads.find((payload) => asEnvelope(payload)?.id === id); 2026-10-25T00:57:51.7029647Z 207 │ │ const envelope = asEnvelope(response); 2026-10-25T00:57:51.7029747Z 208 │ │ if (envelope === null) { 2026-10-25T00:57:51.7029853Z 209 │ │ return yield* Effect.fail( 2026-10-25T00:57:51.7030033Z 210 │ │ new AcpMcpOverAcpError("MCP server did not return a matching response."), 2026-10-25T00:57:51.7030108Z 211 │ │ ); 2026-10-25T00:57:51.7030179Z 212 │ │ } 2026-10-25T00:57:51.7030299Z 213 │ │ if (envelope.error !== undefined) { 2026-10-25T00:57:51.7030491Z 214 │ │ return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error))); 2026-10-25T00:57:51.7030564Z 215 │ │ } 2026-10-25T00:57:51.7030728Z 216 │ │ return (envelope.result ?? null) as AcpSchema.MessageMcpResponse; 2026-10-25T00:57:51.7030800Z 217 │ │ }), 2026-10-25T00:57:51.7030985Z 218 │ │ notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) { 2026-10-25T00:57:51.7031141Z 219 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-25T00:57:51.7031241Z 220 │ │ yield* send(connection, { 2026-10-25T00:57:51.7031339Z 221 │ │ jsonrpc: "2.0", 2026-10-25T00:57:51.7031440Z 222 │ │ method: request.method, 2026-10-25T00:57:51.7031594Z 223 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-25T00:57:51.7031667Z 224 │ │ }); 2026-10-25T00:57:51.7031741Z 225 │ │ }), 2026-10-25T00:57:51.7031823Z 226 │ │ disconnect, 2026-10-25T00:57:51.7031929Z 227 │ │ dispose: Effect.suspend(() => 2026-10-25T00:57:51.7032021Z 228 │ │ Effect.forEach( 2026-10-25T00:57:51.7032123Z 229 │ │ [...connections.keys()], 2026-10-25T00:57:51.7032287Z 230 │ │ (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore), 2026-10-25T00:57:51.7032389Z 231 │ │ { discard: true }, 2026-10-25T00:57:51.7032467Z 232 │ │ ), 2026-10-25T00:57:51.7032541Z 233 │ │ ), 2026-10-25T00:57:51.7032613Z 234 │ │ }; 2026-10-25T00:57:51.7032736Z 235 │ ╰─▶ }); 2026-10-25T00:57:51.7032787Z ╰──── 2026-10-25T00:57:51.7033033Z  help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed. 2026-10-25T00:57:51.7033036Z 2026-10-25T00:57:51.7033239Z ⚠ eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used. 2026-10-25T00:57:51.7033379Z ╭─[infra/relay/src/http/Api.ts:69:13] 2026-10-25T00:57:51.7033516Z 68 │ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts"; 2026-10-25T00:57:51.7033675Z 69 │ import * as HookForwarder from "../hooks/HookForwarder.ts"; 2026-10-25T00:57:51.7033792Z ·  ──────┬────── 2026-10-25T00:57:51.7033934Z · ╰── 'HookForwarder' is imported here 2026-10-25T00:57:51.7034032Z 70 │ import * as HeldHooks from "../hooks/HeldHooks.ts"; 2026-10-25T00:57:51.7034082Z ╰──── 2026-10-25T00:57:51.7034176Z  help: Consider removing this import. 2026-10-25T00:57:51.7034178Z 2026-10-25T00:57:51.7034430Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T00:57:51.7034615Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:119:10] 2026-10-25T00:57:51.7034666Z 117 │ 2026-10-25T00:57:51.7034731Z 118 │ useEffect(() => { 2026-10-25T00:57:51.7034807Z ·  ────┬──── 2026-10-25T00:57:51.7034935Z · ╰── This is the containing effect 2026-10-25T00:57:51.7035013Z 119 │ void refreshNotifications(); 2026-10-25T00:57:51.7035100Z ·  ──────────┬───────── 2026-10-25T00:57:51.7035271Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.7035406Z 120 │ const subscription = AppState.addEventListener("change", (state) => { 2026-10-25T00:57:51.7035458Z ╰──── 2026-10-25T00:57:51.7036049Z  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-25T00:57:51.7036370Z  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-25T00:57:51.7036372Z 2026-10-25T00:57:51.7036623Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T00:57:51.7036804Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7] 2026-10-25T00:57:51.7036853Z 125 │ 2026-10-25T00:57:51.7036916Z 126 │ useEffect(() => { 2026-10-25T00:57:51.7036985Z ·  ────┬──── 2026-10-25T00:57:51.7037108Z · ╰── This is the containing effect 2026-10-25T00:57:51.7037174Z 127 │ if (!isLoaded) { 2026-10-25T00:57:51.7037268Z 128 │ setLiveActivityStatus("checking"); 2026-10-25T00:57:51.7037358Z ·  ──────────┬────────── 2026-10-25T00:57:51.7037521Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.7037584Z 129 │ return; 2026-10-25T00:57:51.7037633Z ╰──── 2026-10-25T00:57:51.7038217Z  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-25T00:57:51.7038531Z  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-25T00:57:51.7038534Z 2026-10-25T00:57:51.7038798Z ⚠ eslint(no-unused-vars): Function 'assertUserMessagesExclude' is declared but never used. 2026-10-25T00:57:51.7039049Z ╭─[apps/server/src/orchestration-v2/testkit/fixtures/shared.ts:1398:10] 2026-10-25T00:57:51.7039102Z 1397 │ 2026-10-25T00:57:51.7039186Z 1398 │ function assertUserMessagesExclude( 2026-10-25T00:57:51.7039286Z ·  ────────────┬──────────── 2026-10-25T00:57:51.7039450Z · ╰── 'assertUserMessagesExclude' is declared here 2026-10-25T00:57:51.7039556Z 1399 │ projection: OrchestrationV2ThreadProjection, 2026-10-25T00:57:51.7039611Z ╰──── 2026-10-25T00:57:51.7039711Z  help: Consider removing this declaration. 2026-10-25T00:57:51.7039713Z 2026-10-25T00:57:51.7040178Z ⚠ 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-25T00:57:51.7040310Z ╭─[packages/client-runtime/src/rpc/client.test.ts:131:9] 2026-10-25T00:57:51.7040370Z 130 │ ) { 2026-10-25T00:57:51.7040650Z 131 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T00:57:51.7040771Z 132 │ │ if (subscriptions.length >= count) { 2026-10-25T00:57:51.7040859Z 133 │ │ return; 2026-10-25T00:57:51.7040939Z 134 │ │ } 2026-10-25T00:57:51.7041044Z 135 │ │ yield* Effect.yieldNow; 2026-10-25T00:57:51.7041180Z 136 │ ╰─▶ } 2026-10-25T00:57:51.7041343Z 137 │ return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`)); 2026-10-25T00:57:51.7041393Z ╰──── 2026-10-25T00:57:51.7041395Z 2026-10-25T00:57:51.7041849Z ⚠ 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-25T00:57:51.7041978Z ╭─[packages/client-runtime/src/rpc/client.test.ts:252:7] 2026-10-25T00:57:51.7042134Z 251 │ yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient))); 2026-10-25T00:57:51.7042380Z 252 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) { 2026-10-25T00:57:51.7042546Z 253 │ │ yield* Effect.yieldNow; 2026-10-25T00:57:51.7042710Z 254 │ ╰─▶ } 2026-10-25T00:57:51.7042828Z 255 │ yield* SubscriptionRef.set(activeSession, Option.none()); 2026-10-25T00:57:51.7042879Z ╰──── 2026-10-25T00:57:51.7042882Z 2026-10-25T00:57:51.7043368Z ⚠ 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-25T00:57:51.7043494Z ╭─[packages/client-runtime/src/rpc/client.test.ts:258:7] 2026-10-25T00:57:51.7043547Z 257 │ 2026-10-25T00:57:51.7043794Z 258 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-25T00:57:51.7043898Z 259 │ │ yield* Effect.yieldNow; 2026-10-25T00:57:51.7044024Z 260 │ ╰─▶ } 2026-10-25T00:57:51.7044126Z 261 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-25T00:57:51.7044175Z ╰──── 2026-10-25T00:57:51.7044177Z 2026-10-25T00:57:51.7044624Z ⚠ 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-25T00:57:51.7044750Z ╭─[packages/client-runtime/src/rpc/client.test.ts:322:7] 2026-10-25T00:57:51.7044809Z 321 │ ); 2026-10-25T00:57:51.7045059Z 322 │ ╭─▶ for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) { 2026-10-25T00:57:51.7045162Z 323 │ │ yield* Effect.yieldNow; 2026-10-25T00:57:51.7045290Z 324 │ ╰─▶ } 2026-10-25T00:57:51.7045344Z 325 │ 2026-10-25T00:57:51.7045392Z ╰──── 2026-10-25T00:57:51.7045394Z 2026-10-25T00:57:51.7045838Z ⚠ 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-25T00:57:51.7045964Z ╭─[packages/client-runtime/src/rpc/client.test.ts:330:7] 2026-10-25T00:57:51.7046121Z 329 │ yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient))); 2026-10-25T00:57:51.7046366Z 330 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-25T00:57:51.7046466Z 331 │ │ yield* Effect.yieldNow; 2026-10-25T00:57:51.7046592Z 332 │ ╰─▶ } 2026-10-25T00:57:51.7046693Z 333 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-25T00:57:51.7046742Z ╰──── 2026-10-25T00:57:51.7046744Z 2026-10-25T00:57:51.7047189Z ⚠ 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-25T00:57:51.7047317Z ╭─[packages/client-runtime/src/rpc/session.test.ts:226:3] 2026-10-25T00:57:51.7047424Z 225 │ ) { 2026-10-25T00:57:51.7047652Z 226 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T00:57:51.7047759Z 227 │ │ const socket = sockets[index]; 2026-10-25T00:57:51.7047843Z 228 │ │ if (socket) { 2026-10-25T00:57:51.7047935Z 229 │ │ return socket; 2026-10-25T00:57:51.7048006Z 230 │ │ } 2026-10-25T00:57:51.7048103Z 231 │ │ yield* Effect.yieldNow; 2026-10-25T00:57:51.7048224Z 232 │ ╰─▶ } 2026-10-25T00:57:51.7048394Z 233 │ return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket.")); 2026-10-25T00:57:51.7048443Z ╰──── 2026-10-25T00:57:51.7048445Z 2026-10-25T00:57:51.7048897Z ⚠ 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-25T00:57:51.7049028Z ╭─[packages/client-runtime/src/rpc/session.test.ts:240:3] 2026-10-25T00:57:51.7049083Z 239 │ ) { 2026-10-25T00:57:51.7049279Z 240 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T00:57:51.7049487Z 241 │ │ const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index]; 2026-10-25T00:57:51.7049574Z 242 │ │ if (request) { 2026-10-25T00:57:51.7049666Z 243 │ │ return request; 2026-10-25T00:57:51.7049737Z 244 │ │ } 2026-10-25T00:57:51.7049841Z 245 │ │ yield* Effect.yieldNow; 2026-10-25T00:57:51.7049962Z 246 │ ╰─▶ } 2026-10-25T00:57:51.7050123Z 247 │ return yield* Effect.die(new Error("Expected the RPC protocol to send a request.")); 2026-10-25T00:57:51.7050174Z ╰──── 2026-10-25T00:57:51.7050176Z 2026-10-25T00:57:51.7050361Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-25T00:57:51.7050473Z ╭─[apps/mobile/src/lib/useHoverGesture.ts:8:15] 2026-10-25T00:57:51.7050527Z 7 │ () => 2026-10-25T00:57:51.7050590Z 8 │ Gesture.Hover() 2026-10-25T00:57:51.7050664Z ·  ──┬── 2026-10-25T00:57:51.7050796Z · ╰── `Hover` may be a component 2026-10-25T00:57:51.7050875Z 9 │ .manualActivation(true) 2026-10-25T00:57:51.7050928Z ╰──── 2026-10-25T00:57:51.7051204Z  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-25T00:57:51.7051644Z  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-25T00:57:51.7051647Z 2026-10-25T00:57:51.7051863Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-25T00:57:51.7052001Z ╭─[packages/client-runtime/src/operations/projects.ts:238:51] 2026-10-25T00:57:51.7052061Z 237 │ ): string { 2026-10-25T00:57:51.7052262Z 238 │ const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? ""; 2026-10-25T00:57:51.7052398Z ·  ────── 2026-10-25T00:57:51.7052527Z 239 │ return target.owner ? `${target.owner}/${folderName}` : folderName; 2026-10-25T00:57:51.7052577Z ╰──── 2026-10-25T00:57:51.7052742Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-25T00:57:51.7052745Z 2026-10-25T00:57:51.7052959Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-25T00:57:51.7053084Z ╭─[scripts/lib/cli-external-packages.test.ts:114:11] 2026-10-25T00:57:51.7053151Z 113 │ const declared = { 2026-10-25T00:57:51.7053240Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-25T00:57:51.7053376Z ·  ──────────────────────────────── 2026-10-25T00:57:51.7053486Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-25T00:57:51.7053539Z ╰──── 2026-10-25T00:57:51.7053798Z  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-25T00:57:51.7053800Z 2026-10-25T00:57:51.7054011Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-25T00:57:51.7054134Z ╭─[scripts/lib/cli-external-packages.test.ts:115:11] 2026-10-25T00:57:51.7054223Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-25T00:57:51.7054322Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-25T00:57:51.7054439Z ·  ──────────────────────────────────────── 2026-10-25T00:57:51.7054531Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-25T00:57:51.7054586Z ╰──── 2026-10-25T00:57:51.7054844Z  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-25T00:57:51.7054846Z 2026-10-25T00:57:51.7055057Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-25T00:57:51.7055176Z ╭─[scripts/lib/cli-external-packages.test.ts:116:11] 2026-10-25T00:57:51.7055275Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-25T00:57:51.7056739Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-25T00:57:51.7056864Z ·  ──────────────────────────────────── 2026-10-25T00:57:51.7056922Z 117 │ }; 2026-10-25T00:57:51.7056973Z ╰──── 2026-10-25T00:57:51.7057235Z  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-25T00:57:51.7057240Z 2026-10-25T00:57:51.7057465Z ⚠ eslint(no-unused-vars): Function 'resolveThreadWorkspaceCwd' is declared but never used. 2026-10-25T00:57:51.7057579Z ╭─[apps/server/src/checkpointing/Utils.ts:12:10] 2026-10-25T00:57:51.7057630Z 11 │ 2026-10-25T00:57:51.7057725Z 12 │ function resolveThreadWorkspaceCwd(input: { 2026-10-25T00:57:51.7057824Z ·  ────────────┬──────────── 2026-10-25T00:57:51.7057986Z · ╰── 'resolveThreadWorkspaceCwd' is declared here 2026-10-25T00:57:51.7058053Z 13 │ readonly thread: { 2026-10-25T00:57:51.7058102Z ╰──── 2026-10-25T00:57:51.7058203Z  help: Consider removing this declaration. 2026-10-25T00:57:51.7058205Z 2026-10-25T00:57:51.7058599Z ⚠ 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-25T00:57:51.7058768Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:50:18] 2026-10-25T00:57:51.7058925Z 49 │ for (const tool of ["sendMessage", "followupTask", "interruptAgent", "listAgents"]) { 2026-10-25T00:57:51.7059094Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-25T00:57:51.7059177Z ·  ───────── 2026-10-25T00:57:51.7059352Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-25T00:57:51.7059402Z ╰──── 2026-10-25T00:57:51.7059404Z 2026-10-25T00:57:51.7059732Z ⚠ 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-25T00:57:51.7059874Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:51:18] 2026-10-25T00:57:51.7060035Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-25T00:57:51.7060207Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-25T00:57:51.7060288Z ·  ───────── 2026-10-25T00:57:51.7060340Z 52 │ } 2026-10-25T00:57:51.7060387Z ╰──── 2026-10-25T00:57:51.7060389Z 2026-10-25T00:57:51.7060709Z ⚠ 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-25T00:57:51.7060850Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:55:5] 2026-10-25T00:57:51.7060916Z 54 │ assert.equal( 2026-10-25T00:57:51.7061084Z 55 │ Schema.is(CodexSchema.ServerNotification__CollabAgentToolCallStatus)("interrupted"), 2026-10-25T00:57:51.7061152Z ·  ───────── 2026-10-25T00:57:51.7061207Z 56 │ true, 2026-10-25T00:57:51.7061256Z ╰──── 2026-10-25T00:57:51.7061258Z 2026-10-25T00:57:51.7061575Z ⚠ 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-25T00:57:51.7061709Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:59:5] 2026-10-25T00:57:51.7061769Z 58 │ assert.equal( 2026-10-25T00:57:51.7061943Z 59 │ Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentToolCallStatus)("interrupted"), 2026-10-25T00:57:51.7062016Z ·  ───────── 2026-10-25T00:57:51.7062072Z 60 │ true, 2026-10-25T00:57:51.7062121Z ╰──── 2026-10-25T00:57:51.7062123Z 2026-10-25T00:57:51.7062441Z ⚠ 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-25T00:57:51.7062584Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:103:16] 2026-10-25T00:57:51.7062634Z 102 │ 2026-10-25T00:57:51.7062796Z 103 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse)(resumeResponse), true); 2026-10-25T00:57:51.7062878Z ·  ───────── 2026-10-25T00:57:51.7062931Z 104 │ }); 2026-10-25T00:57:51.7062978Z ╰──── 2026-10-25T00:57:51.7062981Z 2026-10-25T00:57:51.7063181Z ⚠ eslint(no-unused-vars): Function 'nonEmptyString' is declared but never used. 2026-10-25T00:57:51.7063470Z ╭─[packages/client-runtime/src/work-log/presentation.ts:237:10] 2026-10-25T00:57:51.7063558Z 236 │ 2026-10-25T00:57:51.7063670Z 237 │ function nonEmptyString(value: unknown): string | null { 2026-10-25T00:57:51.7063751Z ·  ───────┬────── 2026-10-25T00:57:51.7063891Z · ╰── 'nonEmptyString' is declared here 2026-10-25T00:57:51.7064028Z 238 │ return typeof value === "string" && value.trim().length > 0 ? value : null; 2026-10-25T00:57:51.7064077Z ╰──── 2026-10-25T00:57:51.7064180Z  help: Consider removing this declaration. 2026-10-25T00:57:51.7064182Z 2026-10-25T00:57:51.7064343Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T00:57:51.7064491Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:372:47] 2026-10-25T00:57:51.7064620Z 371 │ const { open, onOpenChange, onSnooze, timestampFormat } = props; 2026-10-25T00:57:51.7064772Z 372 │ const presets = open ? resolveSnoozePresets(new Date(), timestampFormat) : []; 2026-10-25T00:57:51.7064882Z ·  ─────┬──── 2026-10-25T00:57:51.7065040Z · ╰── Cannot call impure function 2026-10-25T00:57:51.7065097Z 373 │ return ( 2026-10-25T00:57:51.7065147Z ╰──── 2026-10-25T00:57:51.7065418Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T00:57:51.7065707Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T00:57:51.7065715Z 2026-10-25T00:57:51.7065878Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T00:57:51.7066017Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:853:39] 2026-10-25T00:57:51.7066107Z 852 │ if (snoozeGateClock.thread !== thread) { 2026-10-25T00:57:51.7066231Z 853 │ setSnoozeGateClock({ thread, now: new Date().toISOString() }); 2026-10-25T00:57:51.7066337Z ·  ─────┬──── 2026-10-25T00:57:51.7066486Z · ╰── Cannot call impure function 2026-10-25T00:57:51.7066539Z 854 │ } 2026-10-25T00:57:51.7066588Z ╰──── 2026-10-25T00:57:51.7066903Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T00:57:51.7067215Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T00:57:51.7067218Z 2026-10-25T00:57:51.7067410Z ⚠ eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used. 2026-10-25T00:57:51.7067500Z ╭─[apps/web/src/types.ts:22:3] 2026-10-25T00:57:51.7067570Z 21 │ EnvironmentThreadShell, 2026-10-25T00:57:51.7067633Z 22 │ ThreadRunSummary, 2026-10-25T00:57:51.7067709Z ·  ────────┬─────── 2026-10-25T00:57:51.7067845Z · ╰── 'ThreadRunSummary' is imported here 2026-10-25T00:57:51.7067913Z 23 │ ThreadRuntimeSummary, 2026-10-25T00:57:51.7067961Z ╰──── 2026-10-25T00:57:51.7068063Z  help: Consider removing this import. 2026-10-25T00:57:51.7068068Z 2026-10-25T00:57:51.7068227Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-25T00:57:51.7068410Z ╭─[packages/provider-opencode/src/server/OpenCodeRuntime.environment.test.ts:53:14] 2026-10-25T00:57:51.7068461Z 52 │ 2026-10-25T00:57:51.7068522Z 53 │ for (const {} of [ 2026-10-25T00:57:51.7068591Z ·  ── 2026-10-25T00:57:51.7068655Z 54 │ { healthy: true }, 2026-10-25T00:57:51.7068703Z ╰──── 2026-10-25T00:57:51.7068925Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-25T00:57:51.7068927Z 2026-10-25T00:57:51.7069113Z ⚠ eslint(no-unused-vars): Identifier 'Fiber' is imported but never used. 2026-10-25T00:57:51.7069210Z ╭─[apps/server/src/ws.ts:10:13] 2026-10-25T00:57:51.7069298Z  9 │ import * as Effect from "effect/Effect"; 2026-10-25T00:57:51.7069380Z 10 │ import * as Fiber from "effect/Fiber"; 2026-10-25T00:57:51.7069454Z ·  ──┬── 2026-10-25T00:57:51.7069579Z · ╰── 'Fiber' is imported here 2026-10-25T00:57:51.7069677Z 11 │ import * as FileSystem from "effect/FileSystem"; 2026-10-25T00:57:51.7069724Z ╰──── 2026-10-25T00:57:51.7069820Z  help: Consider removing this import. 2026-10-25T00:57:51.7069823Z 2026-10-25T00:57:51.7070014Z ⚠ eslint(no-unused-vars): Identifier 'Schedule' is imported but never used. 2026-10-25T00:57:51.7070103Z ╭─[apps/server/src/ws.ts:17:13] 2026-10-25T00:57:51.7070178Z 16 │ import * as Ref from "effect/Ref"; 2026-10-25T00:57:51.7070277Z 17 │ import * as Schedule from "effect/Schedule"; 2026-10-25T00:57:51.7070355Z ·  ────┬─── 2026-10-25T00:57:51.7070486Z · ╰── 'Schedule' is imported here 2026-10-25T00:57:51.7070568Z 18 │ import * as Schema from "effect/Schema"; 2026-10-25T00:57:51.7070618Z ╰──── 2026-10-25T00:57:51.7070710Z  help: Consider removing this import. 2026-10-25T00:57:51.7070712Z 2026-10-25T00:57:51.7071004Z ⚠ eslint(no-unused-vars): Variable 'projectSetupScriptRunner' is declared but never used. Unused variables should start with a '_'. 2026-10-25T00:57:51.7071099Z ╭─[apps/server/src/ws.ts:1292:13] 2026-10-25T00:57:51.7071251Z 1291 │ const usageLimitSources = yield* UsageLimitSources.UsageLimitSources; 2026-10-25T00:57:51.7071488Z 1292 │ const projectSetupScriptRunner = yield* ProjectSetupScriptRunner.ProjectSetupScriptRunner; 2026-10-25T00:57:51.7071618Z ·  ────────────┬─────────── 2026-10-25T00:57:51.7071781Z · ╰── 'projectSetupScriptRunner' is declared here 2026-10-25T00:57:51.7071943Z 1293 │ const worktreeSetupTracker = yield* WorktreeSetupTracker.WorktreeSetupTracker; 2026-10-25T00:57:51.7071993Z ╰──── 2026-10-25T00:57:51.7072093Z  help: Consider removing this declaration. 2026-10-25T00:57:51.7072096Z 2026-10-25T00:57:51.7072300Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-25T00:57:51.7072421Z ╭─[apps/web/src/lib/announce.browser.test.ts:41:46] 2026-10-25T00:57:51.7072471Z 40 │ 2026-10-25T00:57:51.7072576Z 41 │ expect(regionTexts()).toEqual([...first].reverse()); 2026-10-25T00:57:51.7072687Z ·  ─────── 2026-10-25T00:57:51.7072782Z 42 │ expect(regionTexts()).toContain("Claude"); 2026-10-25T00:57:51.7072831Z ╰──── 2026-10-25T00:57:51.7073083Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-25T00:57:51.7073086Z 2026-10-25T00:57:51.7073362Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T00:57:51.7073498Z ╭─[packages/provider-opencode/src/server/adapter.ts:3755:7] 2026-10-25T00:57:51.7073549Z 3754 │ 2026-10-25T00:57:51.7073741Z 3755 │ const layer: Layer.Layer = 2026-10-25T00:57:51.7073810Z ·  ──┬── 2026-10-25T00:57:51.7073934Z · ╰── 'layer' is declared here 2026-10-25T00:57:51.7074000Z 3756 │ Layer.effect( 2026-10-25T00:57:51.7074050Z ╰──── 2026-10-25T00:57:51.7074150Z  help: Consider removing this declaration. 2026-10-25T00:57:51.7074152Z 2026-10-25T00:57:51.7074331Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T00:57:51.7074498Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:555:70] 2026-10-25T00:57:51.7074576Z 554 │ assert.deepStrictEqual( 2026-10-25T00:57:51.7074735Z 555 │ (yield* Ref.get(fixture.syncCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-25T00:57:51.7074850Z ·  ┬ 2026-10-25T00:57:51.7075014Z · ╰── '_' is declared here 2026-10-25T00:57:51.7075076Z 556 │ [ 2026-10-25T00:57:51.7075125Z ╰──── 2026-10-25T00:57:51.7075222Z  help: Consider removing this parameter. 2026-10-25T00:57:51.7075224Z 2026-10-25T00:57:51.7075402Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T00:57:51.7075571Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:1155:70] 2026-10-25T00:57:51.7075650Z 1154 │ assert.deepStrictEqual( 2026-10-25T00:57:51.7075806Z 1155 │ (yield* Ref.get(fixture.linkCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-25T00:57:51.7075922Z ·  ┬ 2026-10-25T00:57:51.7076130Z · ╰── '_' is declared here 2026-10-25T00:57:51.7076217Z 1156 │ [ 2026-10-25T00:57:51.7076266Z ╰──── 2026-10-25T00:57:51.7076363Z  help: Consider removing this parameter. 2026-10-25T00:57:51.7076366Z 2026-10-25T00:57:51.7076819Z ⚠ 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-25T00:57:51.7076982Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7] 2026-10-25T00:57:51.7077080Z 565 │ let afterSequence = created[0]!.sequence; 2026-10-25T00:57:51.7077273Z 566 │ ╭─▶ for (let index = 1; index <= 32; index += 1) { 2026-10-25T00:57:51.7077374Z 567 │ │ const nextEvent = { 2026-10-25T00:57:51.7077527Z 568 │ │ id: EventId.make(`event:foundation-stream-race:${index}`), 2026-10-25T00:57:51.7077655Z 569 │ │ type: "thread.metadata-updated" as const, 2026-10-25T00:57:51.7077742Z 570 │ │ threadId, 2026-10-25T00:57:51.7077843Z 571 │ │ providerInstanceId, 2026-10-25T00:57:51.7077938Z 572 │ │ occurredAt: now, 2026-10-25T00:57:51.7078080Z 573 │ │ payload: { ...thread, title: `Race update ${index}` }, 2026-10-25T00:57:51.7078202Z 574 │ │ } satisfies OrchestrationV2DomainEvent; 2026-10-25T00:57:51.7078313Z 575 │ │ const reader = yield* eventSink 2026-10-25T00:57:51.7078436Z 576 │ │ .stream({ threadId, afterSequence }) 2026-10-25T00:57:51.7078564Z 577 │ │ .pipe(Stream.runHead, Effect.forkChild); 2026-10-25T00:57:51.7078664Z 578 │ │ yield* Effect.yieldNow; 2026-10-25T00:57:51.7078821Z 579 │ │ const written = yield* eventSink.write({ events: [nextEvent] }); 2026-10-25T00:57:51.7078945Z 580 │ │ const received = yield* Fiber.join(reader); 2026-10-25T00:57:51.7079055Z 581 │ │ if (Option.isNone(received)) { 2026-10-25T00:57:51.7079247Z 582 │ │ return yield* Effect.die("The event stream ended before delivering the live event."); 2026-10-25T00:57:51.7079323Z 583 │ │ } 2026-10-25T00:57:51.7079483Z 584 │ │ assert.equal(received.value.sequence, written[0]?.sequence); 2026-10-25T00:57:51.7079626Z 585 │ │ assert.equal(received.value.event.id, nextEvent.id); 2026-10-25T00:57:51.7079750Z 586 │ │ afterSequence = received.value.sequence; 2026-10-25T00:57:51.7079875Z 587 │ ╰─▶ } 2026-10-25T00:57:51.7079934Z 588 │ }), 2026-10-25T00:57:51.7079984Z ╰──── 2026-10-25T00:57:51.7079986Z 2026-10-25T00:57:51.7080435Z ⚠ 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-25T00:57:51.7080669Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:2327:9] 2026-10-25T00:57:51.7080807Z 2326 │ let settled = false; 2026-10-25T00:57:51.7081003Z 2327 │ ╭─▶ while (!settled) { 2026-10-25T00:57:51.7081157Z 2328 │ │ settled = (yield* outbox.listByCommandId(commandId)).every( 2026-10-25T00:57:51.7081283Z 2329 │ │ (effect) => effect.status === "succeeded", 2026-10-25T00:57:51.7081363Z 2330 │ │ ); 2026-10-25T00:57:51.7081483Z 2331 │ │ if (!settled) yield* Effect.yieldNow; 2026-10-25T00:57:51.7081617Z 2332 │ ╰─▶ } 2026-10-25T00:57:51.7081735Z 2333 │ }).pipe(Effect.provide(layerWorker), Effect.scoped); 2026-10-25T00:57:51.7081784Z ╰──── 2026-10-25T00:57:51.7081787Z 2026-10-25T00:57:51.7081988Z ⚠ eslint(no-unused-vars): Identifier 'Duration' is imported but never used. 2026-10-25T00:57:51.7082122Z ╭─[packages/provider-pi/src/server/adapter.test.ts:24:13] 2026-10-25T00:57:51.7082213Z 23 │ import * as Deferred from "effect/Deferred"; 2026-10-25T00:57:51.7082300Z 24 │ import * as Duration from "effect/Duration"; 2026-10-25T00:57:51.7082378Z ·  ────┬─── 2026-10-25T00:57:51.7082509Z · ╰── 'Duration' is imported here 2026-10-25T00:57:51.7082591Z 25 │ import * as Effect from "effect/Effect"; 2026-10-25T00:57:51.7082639Z ╰──── 2026-10-25T00:57:51.7082732Z  help: Consider removing this import. 2026-10-25T00:57:51.7082734Z 2026-10-25T00:57:51.7083010Z ⚠ eslint(no-unused-vars): Variable 'layerUnavailable' is declared but never used. Unused variables should start with a '_'. 2026-10-25T00:57:51.7083151Z ╭─[apps/server/src/orchestration-v2/Orchestrator.ts:12468:7] 2026-10-25T00:57:51.7083202Z 12467 │ 2026-10-25T00:57:51.7083366Z 12468 │ const layerUnavailable: Layer.Layer = Layer.succeed( 2026-10-25T00:57:51.7083450Z ·  ────────┬─────── 2026-10-25T00:57:51.7083594Z · ╰── 'layerUnavailable' is declared here 2026-10-25T00:57:51.7083659Z 12469 │ OrchestratorV2, 2026-10-25T00:57:51.7083710Z ╰──── 2026-10-25T00:57:51.7083811Z  help: Consider removing this declaration. 2026-10-25T00:57:51.7083813Z 2026-10-25T00:57:51.7084017Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-25T00:57:51.7084150Z ╭─[apps/web/src/lib/composerContextReferences.ts:90:40] 2026-10-25T00:57:51.7084228Z 89 │ let cursor = prompt.length; 2026-10-25T00:57:51.7084331Z 90 │ for (const occurrence of occurrences.reverse()) { 2026-10-25T00:57:51.7084432Z ·  ─────── 2026-10-25T00:57:51.7084509Z 91 │ let { start, end } = occurrence; 2026-10-25T00:57:51.7084559Z ╰──── 2026-10-25T00:57:51.7084810Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-25T00:57:51.7084813Z 2026-10-25T00:57:51.7085058Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T00:57:51.7085223Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10691:7] 2026-10-25T00:57:51.7085273Z 10690 │ 2026-10-25T00:57:51.7085393Z 10691 │ const layer: Layer.Layer< 2026-10-25T00:57:51.7085490Z ·  ──┬── 2026-10-25T00:57:51.7085608Z · ╰── 'layer' is declared here 2026-10-25T00:57:51.7085698Z 10692 │ ProviderAdapter.ProviderAdapterV2, 2026-10-25T00:57:51.7085748Z ╰──── 2026-10-25T00:57:51.7085848Z  help: Consider removing this declaration. 2026-10-25T00:57:51.7085851Z 2026-10-25T00:57:51.7086168Z ⚠ eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'. 2026-10-25T00:57:51.7086325Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1444:7] 2026-10-25T00:57:51.7086377Z 1443 │ 2026-10-25T00:57:51.7086491Z 1444 │ const layerCodexAppServerClientFactoryCommand = ( 2026-10-25T00:57:51.7086610Z ·  ───────────────────┬─────────────────── 2026-10-25T00:57:51.7086810Z · ╰── 'layerCodexAppServerClientFactoryCommand' is declared here 2026-10-25T00:57:51.7086924Z 1445 │ options: CodexClient.CodexAppServerClientOptions & { 2026-10-25T00:57:51.7086974Z ╰──── 2026-10-25T00:57:51.7087074Z  help: Consider removing this declaration. 2026-10-25T00:57:51.7087076Z 2026-10-25T00:57:51.7087319Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T00:57:51.7087475Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1680:7] 2026-10-25T00:57:51.7087525Z 1679 │ 2026-10-25T00:57:51.7087595Z 1680 │ const layer: Layer.Layer< 2026-10-25T00:57:51.7087666Z ·  ──┬── 2026-10-25T00:57:51.7087790Z · ╰── 'layer' is declared here 2026-10-25T00:57:51.7087879Z 1681 │ ProviderAdapter.ProviderAdapterV2, 2026-10-25T00:57:51.7087929Z ╰──── 2026-10-25T00:57:51.7088026Z  help: Consider removing this declaration. 2026-10-25T00:57:51.7088028Z 2026-10-25T00:57:51.7088244Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-25T00:57:51.7088409Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:2144:15] 2026-10-25T00:57:51.7088474Z 2143 │ assert.equal( 2026-10-25T00:57:51.7088616Z 2144 │ items.filter((item) => item.type === "assistant_message").at(-1)?.text, 2026-10-25T00:57:51.7088692Z ·  ────── 2026-10-25T00:57:51.7088812Z 2145 │ "authoritative answer", 2026-10-25T00:57:51.7088897Z ╰──── 2026-10-25T00:57:51.7089060Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-25T00:57:51.7089062Z 2026-10-25T00:57:51.7089514Z ⚠ 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-25T00:57:51.7089676Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:4246:7] 2026-10-25T00:57:51.7089852Z 4245 │ const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped); 2026-10-25T00:57:51.7090051Z 4246 │ ╭─▶ while (!responseLifecycle.includes("failed")) { 2026-10-25T00:57:51.7090160Z 4247 │ │ yield* Effect.yieldNow; 2026-10-25T00:57:51.7090290Z 4248 │ ╰─▶ } 2026-10-25T00:57:51.7090407Z 4249 │ const responseExit = yield* Fiber.join(responseFiber); 2026-10-25T00:57:51.7090456Z ╰──── 2026-10-25T00:57:51.7090459Z 2026-10-25T00:57:51.7090902Z ⚠ 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-25T00:57:51.7091064Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6357:9] 2026-10-25T00:57:51.7091151Z 6356 │ .pipe(Effect.forkScoped); 2026-10-25T00:57:51.7091332Z 6357 │ ╭─▶ while (promptGates.length < 1) { 2026-10-25T00:57:51.7091441Z 6358 │ │ yield* Effect.yieldNow; 2026-10-25T00:57:51.7091570Z 6359 │ ╰─▶ } 2026-10-25T00:57:51.7091735Z 6360 │ assert.isDefined(sessionUpdateHandler, "session update handler must be wired"); 2026-10-25T00:57:51.7091785Z ╰──── 2026-10-25T00:57:51.7091787Z 2026-10-25T00:57:51.7092233Z ⚠ 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-25T00:57:51.7092393Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6492:9] 2026-10-25T00:57:51.7092478Z 6491 │ .pipe(Effect.forkScoped); 2026-10-25T00:57:51.7092658Z 6492 │ ╭─▶ while (promptGates.length < 2) { 2026-10-25T00:57:51.7092764Z 6493 │ │ yield* Effect.yieldNow; 2026-10-25T00:57:51.7092893Z 6494 │ ╰─▶ } 2026-10-25T00:57:51.7093051Z 6495 │ if (sessionUpdateHandler === undefined || capturedMutation.current === null) { 2026-10-25T00:57:51.7093104Z ╰──── 2026-10-25T00:57:51.7093107Z 2026-10-25T00:57:51.7093311Z ⚠ eslint(no-unsafe-optional-chaining): Unsafe usage of optional chaining 2026-10-25T00:57:51.7093495Z ╭─[apps/server/src/orchestration-v2/ThreadLaunchService.test.ts:1850:8] 2026-10-25T00:57:51.7093558Z 1849 │ assert.equal( 2026-10-25T00:57:51.7093744Z 1850 │ (stored.context?.records[0] as { attachmentId: string }).attachmentId, 2026-10-25T00:57:51.7093873Z ·  ────────────────────────── 2026-10-25T00:57:51.7093950Z 1851 │ stored.attachments[0]?.id, 2026-10-25T00:57:51.7093999Z ╰──── 2026-10-25T00:57:51.7094163Z  help: If this short-circuits with 'undefined' the evaluation will throw TypeError 2026-10-25T00:57:51.7094166Z 2026-10-25T00:57:51.7094608Z ⚠ 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-25T00:57:51.7094741Z ╭─[packages/contracts/src/composerContext.test.ts:181:18] 2026-10-25T00:57:51.7094871Z 180 │ it("sends a message without the records the wire cannot carry", () => { 2026-10-25T00:57:51.7095052Z 181 │ const wire = Schema.encodeUnknownSync(Schema.toCodecJson(OrchestrationMessageContext))({ 2026-10-25T00:57:51.7095158Z ·  ──────────────────────── 2026-10-25T00:57:51.7095220Z 182 │ version: 1, 2026-10-25T00:57:51.7095268Z ╰──── 2026-10-25T00:57:51.7095270Z 2026-10-25T00:57:51.7095521Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T00:57:51.7095689Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:124:7] 2026-10-25T00:57:51.7095740Z 119 │ 2026-10-25T00:57:51.7095804Z 120 │ useEffect(() => { 2026-10-25T00:57:51.7095873Z ·  ────┬──── 2026-10-25T00:57:51.7096000Z · ╰── This is the containing effect 2026-10-25T00:57:51.7096079Z 121 │ if (orientationSettled) return; 2026-10-25T00:57:51.7096192Z 122 │ const orientation = getNativeShowcaseOrientation(); 2026-10-25T00:57:51.7096267Z 123 │ if (orientation === null) { 2026-10-25T00:57:51.7096345Z 124 │ setOrientationSettled(true); 2026-10-25T00:57:51.7096433Z ·  ──────────┬────────── 2026-10-25T00:57:51.7096600Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.7096661Z 125 │ return; 2026-10-25T00:57:51.7096712Z ╰──── 2026-10-25T00:57:51.7097298Z  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-25T00:57:51.7097618Z  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-25T00:57:51.7097623Z 2026-10-25T00:57:51.7097872Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T00:57:51.7098036Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:300:7] 2026-10-25T00:57:51.7098087Z 288 │ 2026-10-25T00:57:51.7098151Z 289 │ useEffect(() => { 2026-10-25T00:57:51.7098218Z ·  ────┬──── 2026-10-25T00:57:51.7098344Z · ╰── This is the containing effect 2026-10-25T00:57:51.7098400Z 290 │ if ( 2026-10-25T00:57:51.7098465Z 291 │ scene === null || 2026-10-25T00:57:51.7098538Z 292 │ requestedScene === null || 2026-10-25T00:57:51.7098664Z 293 │ scene !== requestedScene || 2026-10-25T00:57:51.7098756Z 294 │ !hasFixture || 2026-10-25T00:57:51.7098826Z 295 │ !orientationSettled || 2026-10-25T00:57:51.7098890Z 296 │ !themeApplied || 2026-10-25T00:57:51.7099003Z 297 │ (scene === "agent-activity" && !agentActivityStaged) || 2026-10-25T00:57:51.7099132Z 298 │ !isShowcaseNativeContentReady({ scene, themeId, renderSignal }) 2026-10-25T00:57:51.7099186Z 299 │ ) { 2026-10-25T00:57:51.7099253Z 300 │ setReadyScene(null); 2026-10-25T00:57:51.7099329Z ·  ──────┬────── 2026-10-25T00:57:51.7099494Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.7099552Z 301 │ return; 2026-10-25T00:57:51.7099600Z ╰──── 2026-10-25T00:57:51.7100185Z  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-25T00:57:51.7100503Z  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-25T00:57:51.7100505Z 2026-10-25T00:57:51.7100765Z ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'. 2026-10-25T00:57:51.7100930Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:129:9] 2026-10-25T00:57:51.7100995Z 128 │ let cancelled = false; 2026-10-25T00:57:51.7101085Z 129 │ let lastOutcome: string | null = null; 2026-10-25T00:57:51.7101166Z ·  ─────┬───── 2026-10-25T00:57:51.7101303Z · ╰── 'lastOutcome' is declared here 2026-10-25T00:57:51.7101474Z 130 │ void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), { 2026-10-25T00:57:51.7101523Z ╰──── 2026-10-25T00:57:51.7101624Z  help: Consider removing this declaration. 2026-10-25T00:57:51.7101627Z 2026-10-25T00:57:51.7101871Z ⚠ eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used. 2026-10-25T00:57:51.7102044Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:960:10] 2026-10-25T00:57:51.7102094Z 959 │ 2026-10-25T00:57:51.7102200Z 960 │ function layerClaudeAgentSdkReplayQueryRunner( 2026-10-25T00:57:51.7102317Z ·  ──────────────────┬───────────────── 2026-10-25T00:57:51.7102508Z · ╰── 'layerClaudeAgentSdkReplayQueryRunner' is declared here 2026-10-25T00:57:51.7102608Z 961 │ transcript: ClaudeAgentSdkReplayTranscript, 2026-10-25T00:57:51.7102657Z ╰──── 2026-10-25T00:57:51.7102758Z  help: Consider removing this declaration. 2026-10-25T00:57:51.7102760Z 2026-10-25T00:57:51.7103200Z ⚠ 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-25T00:57:51.7103347Z ╭─[packages/contracts/src/baseSchemas.test.ts:39:9] 2026-10-25T00:57:51.7103413Z 38 │ JSON.stringify( 2026-10-25T00:57:51.7103528Z 39 │ Schema.encodeUnknownSync(Schema.toCodecJson(Named))([ 2026-10-25T00:57:51.7103664Z ·  ──────────────────────── 2026-10-25T00:57:51.7103768Z 40 │ { name: "a" }, 2026-10-25T00:57:51.7103847Z ╰──── 2026-10-25T00:57:51.7103850Z 2026-10-25T00:57:51.7104025Z ⚠ react(immutability): This value cannot be modified 2026-10-25T00:57:51.7104179Z ╭─[apps/mobile/src/features/connection/ConnectionStatusDot.tsx:58:7] 2026-10-25T00:57:51.7104271Z 53 │ function usePulseAnimation(pulse: boolean) { 2026-10-25T00:57:51.7104361Z 54 │ const pulseProgress = useSharedValue(0); 2026-10-25T00:57:51.7104440Z ·  ──────┬────── 2026-10-25T00:57:51.7104576Z · ╰── `pulseProgress` originates here 2026-10-25T00:57:51.7104625Z 55 │ 2026-10-25T00:57:51.7104689Z 56 │ useEffect(() => { 2026-10-25T00:57:51.7104757Z 57 │ if (pulse) { 2026-10-25T00:57:51.7104842Z 58 │ pulseProgress.value = withRepeat( 2026-10-25T00:57:51.7104919Z ·  ──────┬────── 2026-10-25T00:57:51.7105057Z · ╰── `pulseProgress` cannot be modified 2026-10-25T00:57:51.7105123Z 59 │ withTiming(1, { 2026-10-25T00:57:51.7105172Z ╰──── 2026-10-25T00:57:51.7105433Z  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-25T00:57:51.7105731Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T00:57:51.7105734Z 2026-10-25T00:57:51.7105988Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T00:57:51.7106155Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:82:5] 2026-10-25T00:57:51.7106204Z 79 │ 2026-10-25T00:57:51.7106266Z 80 │ useEffect(() => { 2026-10-25T00:57:51.7106334Z ·  ────┬──── 2026-10-25T00:57:51.7106457Z · ╰── This is the containing effect 2026-10-25T00:57:51.7106577Z 81 │ const { host, code } = parsePairingUrl(connectionPairingUrl); 2026-10-25T00:57:51.7106643Z 82 │ setHostInput(host); 2026-10-25T00:57:51.7106716Z ·  ──────┬───── 2026-10-25T00:57:51.7106877Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.7106939Z 83 │ setCodeInput(code); 2026-10-25T00:57:51.7106989Z ╰──── 2026-10-25T00:57:51.7107582Z  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-25T00:57:51.7107898Z  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-25T00:57:51.7107901Z 2026-10-25T00:57:51.7108150Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T00:57:51.7108314Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:92:5] 2026-10-25T00:57:51.7108364Z 85 │ 2026-10-25T00:57:51.7108425Z 86 │ useEffect(() => { 2026-10-25T00:57:51.7108549Z ·  ────┬──── 2026-10-25T00:57:51.7108703Z · ╰── This is the containing effect 2026-10-25T00:57:51.7108789Z 87 │ if (routePairingUrl.length === 0) { 2026-10-25T00:57:51.7108846Z 88 │ return; 2026-10-25T00:57:51.7108900Z 89 │ } 2026-10-25T00:57:51.7108948Z 90 │ 2026-10-25T00:57:51.7109058Z 91 │ const { host, code } = parsePairingUrl(routePairingUrl); 2026-10-25T00:57:51.7109121Z 92 │ setHostInput(host); 2026-10-25T00:57:51.7109192Z ·  ──────┬───── 2026-10-25T00:57:51.7109352Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.7109416Z 93 │ setCodeInput(code); 2026-10-25T00:57:51.7109465Z ╰──── 2026-10-25T00:57:51.7110050Z  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-25T00:57:51.7110365Z  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-25T00:57:51.7110368Z 2026-10-25T00:57:51.7110620Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T00:57:51.7110784Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:98:7] 2026-10-25T00:57:51.7110837Z 95 │ 2026-10-25T00:57:51.7110897Z 96 │ useEffect(() => { 2026-10-25T00:57:51.7110965Z ·  ────┬──── 2026-10-25T00:57:51.7111091Z · ╰── This is the containing effect 2026-10-25T00:57:51.7111173Z 97 │ if (pairingConnectionError) { 2026-10-25T00:57:51.7111241Z 98 │ setIsSubmitting(false); 2026-10-25T00:57:51.7111318Z ·  ───────┬─────── 2026-10-25T00:57:51.7111482Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.7111534Z 99 │ } 2026-10-25T00:57:51.7111583Z ╰──── 2026-10-25T00:57:51.7112169Z  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-25T00:57:51.7112591Z  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-25T00:57:51.7112634Z 2026-10-25T00:57:51.7112835Z ⚠ eslint(no-unused-vars): Identifier 'openSettings' is imported but never used. 2026-10-25T00:57:51.7113001Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:35:10] 2026-10-25T00:57:51.7113129Z 34 │ import { splitEnvironmentSections } from "./environmentSections"; 2026-10-25T00:57:51.7113261Z 35 │ import { openSettings } from "../settings/settings-navigation"; 2026-10-25T00:57:51.7113338Z ·  ──────┬───── 2026-10-25T00:57:51.7113514Z · ╰── 'openSettings' is imported here 2026-10-25T00:57:51.7113642Z 36 │ import { leaveSettingsPage } from "../settings/settings-navigation"; 2026-10-25T00:57:51.7113692Z ╰──── 2026-10-25T00:57:51.7113793Z  help: Consider removing this import. 2026-10-25T00:57:51.7113798Z 2026-10-25T00:57:51.7113997Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-25T00:57:51.7114099Z ╭─[packages/contracts/src/rpc.ts:297:8] 2026-10-25T00:57:51.7114162Z 296 │ } from "./device.ts"; 2026-10-25T00:57:51.7114251Z 297 │ import {} from "./previewAutomation.ts"; 2026-10-25T00:57:51.7114318Z ·  ── 2026-10-25T00:57:51.7114373Z 298 │ import { 2026-10-25T00:57:51.7114423Z ╰──── 2026-10-25T00:57:51.7114501Z  help: Remove empty braces 2026-10-25T00:57:51.7114503Z 2026-10-25T00:57:51.7114863Z ⚠ 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-25T00:57:51.7114974Z ╭─[packages/contracts/src/auth.test.ts:17:12] 2026-10-25T00:57:51.7115125Z 16 │ it("decodes legacy review credentials without offering them in new grants", () => { 2026-10-25T00:57:51.7115285Z 17 │ expect(Schema.decodeUnknownSync(AuthEnvironmentScopes)(["review:write"])).toEqual([ 2026-10-25T00:57:51.7115383Z ·  ──────────────────────── 2026-10-25T00:57:51.7115446Z 18 │ "review:write", 2026-10-25T00:57:51.7115494Z ╰──── 2026-10-25T00:57:51.7115496Z 2026-10-25T00:57:51.7115846Z ⚠ 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-25T00:57:51.7115954Z ╭─[packages/contracts/src/auth.test.ts:20:18] 2026-10-25T00:57:51.7116008Z 19 │ ]); 2026-10-25T00:57:51.7116169Z 20 │ expect(() => Schema.decodeUnknownSync(AuthGrantScopes)(["review:write"])).toThrow(); 2026-10-25T00:57:51.7116278Z ·  ──────────────────────── 2026-10-25T00:57:51.7116403Z 21 │ expect(AuthStandardClientScopes).not.toContain("review:write"); 2026-10-25T00:57:51.7116451Z ╰──── 2026-10-25T00:57:51.7116454Z 2026-10-25T00:57:51.7116801Z ⚠ 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-25T00:57:51.7116908Z ╭─[packages/contracts/src/auth.test.ts:58:21] 2026-10-25T00:57:51.7117072Z 57 │ it("ignores unknown response permissions without falling back to broader scopes", () => { 2026-10-25T00:57:51.7117192Z 58 │ const session = Schema.decodeUnknownSync(AuthSessionState)({ 2026-10-25T00:57:51.7117346Z ·  ──────────────────────── 2026-10-25T00:57:51.7117440Z 59 │ authenticated: true, 2026-10-25T00:57:51.7117489Z ╰──── 2026-10-25T00:57:51.7117491Z 2026-10-25T00:57:51.7117728Z ⚠ eslint(no-unused-vars): Function 'normalizeTerminalContextSelection' is declared but never used. 2026-10-25T00:57:51.7117833Z ╭─[apps/web/src/lib/terminalContext.ts:56:10] 2026-10-25T00:57:51.7117882Z 55 │ 2026-10-25T00:57:51.7117978Z 56 │ function normalizeTerminalContextSelection( 2026-10-25T00:57:51.7118081Z ·  ────────────────┬──────────────── 2026-10-25T00:57:51.7118264Z · ╰── 'normalizeTerminalContextSelection' is declared here 2026-10-25T00:57:51.7118347Z 57 │ selection: TerminalContextSelection, 2026-10-25T00:57:51.7118395Z ╰──── 2026-10-25T00:57:51.7118503Z  help: Consider removing this declaration. 2026-10-25T00:57:51.7118509Z 2026-10-25T00:57:51.7118760Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T00:57:51.7118916Z ╭─[apps/server/src/orchestration-v2/ThreadPullRequestService.ts:410:7] 2026-10-25T00:57:51.7118968Z 409 │ 2026-10-25T00:57:51.7119093Z 410 │ const layer = Layer.effect(ThreadPullRequestServiceV2, make); 2026-10-25T00:57:51.7119159Z ·  ──┬── 2026-10-25T00:57:51.7119278Z · ╰── 'layer' is declared here 2026-10-25T00:57:51.7119328Z ╰──── 2026-10-25T00:57:51.7119428Z  help: Consider removing this declaration. 2026-10-25T00:57:51.7119430Z 2026-10-25T00:57:51.7119728Z ⚠ eslint(no-unused-vars): Variable 'layerFromProviderAdapter' is declared but never used. Unused variables should start with a '_'. 2026-10-25T00:57:51.7119886Z ╭─[apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts:346:7] 2026-10-25T00:57:51.7119937Z 345 │ 2026-10-25T00:57:51.7120036Z 346 │ const layerFromProviderAdapter: Layer.Layer< 2026-10-25T00:57:51.7120127Z ·  ────────────┬─────────── 2026-10-25T00:57:51.7120286Z · ╰── 'layerFromProviderAdapter' is declared here 2026-10-25T00:57:51.7120361Z 347 │ ProviderAdapterRegistryV2, 2026-10-25T00:57:51.7120410Z ╰──── 2026-10-25T00:57:51.7120588Z  help: Consider removing this declaration. 2026-10-25T00:57:51.7120590Z 2026-10-25T00:57:51.7120857Z ⚠ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'. 2026-10-25T00:57:51.7121003Z ╭─[apps/web/src/components/preview/PreviewPanelShell.tsx:61:9] 2026-10-25T00:57:51.7121054Z 60 │ ) { 2026-10-25T00:57:51.7121218Z 61 │ const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded"; 2026-10-25T00:57:51.7121294Z ·  ──────┬────── 2026-10-25T00:57:51.7121427Z · ╰── 'useDragRegion' is declared here 2026-10-25T00:57:51.7121514Z 62 │ const isInline = props.mode === "inline"; 2026-10-25T00:57:51.7121562Z ╰──── 2026-10-25T00:57:51.7121660Z  help: Consider removing this declaration. 2026-10-25T00:57:51.7121663Z 2026-10-25T00:57:51.7121911Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T00:57:51.7122138Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:643:5] 2026-10-25T00:57:51.7122226Z 638 │ 2026-10-25T00:57:51.7122289Z 639 │ useEffect(() => { 2026-10-25T00:57:51.7122356Z ·  ────┬──── 2026-10-25T00:57:51.7122479Z · ╰── This is the containing effect 2026-10-25T00:57:51.7122584Z 640 │ if (pendingLaunchEntry.key === launchTargetKey) { 2026-10-25T00:57:51.7122643Z 641 │ return; 2026-10-25T00:57:51.7122696Z 642 │ } 2026-10-25T00:57:51.7122768Z 643 │ setPendingLaunchEntry({ 2026-10-25T00:57:51.7122853Z ·  ──────────┬────────── 2026-10-25T00:57:51.7123019Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.7123087Z 644 │ key: launchTargetKey, 2026-10-25T00:57:51.7123144Z ╰──── 2026-10-25T00:57:51.7123773Z  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-25T00:57:51.7124085Z  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-25T00:57:51.7124088Z 2026-10-25T00:57:51.7124336Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T00:57:51.7124500Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5] 2026-10-25T00:57:51.7124550Z 648 │ 2026-10-25T00:57:51.7124617Z 649 │ useEffect(() => { 2026-10-25T00:57:51.7124686Z ·  ────┬──── 2026-10-25T00:57:51.7124809Z · ╰── This is the containing effect 2026-10-25T00:57:51.7124920Z 650 │ if (initialAttachGridEntry.key === launchTargetKey) { 2026-10-25T00:57:51.7124978Z 651 │ return; 2026-10-25T00:57:51.7125029Z 652 │ } 2026-10-25T00:57:51.7125109Z 653 │ setInitialAttachGridEntry({ 2026-10-25T00:57:51.7125199Z ·  ────────────┬──────────── 2026-10-25T00:57:51.7125366Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.7125433Z 654 │ key: launchTargetKey, 2026-10-25T00:57:51.7125482Z ╰──── 2026-10-25T00:57:51.7126073Z  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-25T00:57:51.7126388Z  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-25T00:57:51.7126391Z 2026-10-25T00:57:51.7126639Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T00:57:51.7126800Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7] 2026-10-25T00:57:51.7126850Z 743 │ 2026-10-25T00:57:51.7126913Z 744 │ useEffect(() => { 2026-10-25T00:57:51.7126982Z ·  ────┬──── 2026-10-25T00:57:51.7127156Z · ╰── This is the containing effect 2026-10-25T00:57:51.7127281Z 745 │ if (!routeEnvironmentId || !routeThreadId) { 2026-10-25T00:57:51.7127347Z 746 │ setLastGridSize({ 2026-10-25T00:57:51.7127426Z ·  ───────┬─────── 2026-10-25T00:57:51.7127587Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.7127666Z 747 │ cols: DEFAULT_TERMINAL_COLS, 2026-10-25T00:57:51.7127716Z ╰──── 2026-10-25T00:57:51.7128296Z  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-25T00:57:51.7128616Z  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-25T00:57:51.7128620Z 2026-10-25T00:57:51.7128814Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T00:57:51.7128981Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24] 2026-10-25T00:57:51.7129035Z 537 │ }); 2026-10-25T00:57:51.7129153Z 538 │ }, [terminal.buffer, terminal.buffer.length, terminalKey]); 2026-10-25T00:57:51.7129256Z ·  ───────────┬────────── 2026-10-25T00:57:51.7129494Z · ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead 2026-10-25T00:57:51.7129656Z 539 │ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null; 2026-10-25T00:57:51.7129709Z ╰──── 2026-10-25T00:57:51.7129996Z  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-25T00:57:51.7130299Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.7130302Z 2026-10-25T00:57:51.7130495Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T00:57:51.7130655Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7] 2026-10-25T00:57:51.7130748Z 708 │ sentInitialInputKeyRef.current = null; 2026-10-25T00:57:51.7130809Z 709 │ }, [terminalKey]); 2026-10-25T00:57:51.7130929Z ·  ─────┬───── 2026-10-25T00:57:51.7131103Z · ╰── Unnecessary dependency `terminalKey` 2026-10-25T00:57:51.7131153Z 710 │ 2026-10-25T00:57:51.7131201Z ╰──── 2026-10-25T00:57:51.7131485Z  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-25T00:57:51.7131789Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.7131792Z 2026-10-25T00:57:51.7131984Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T00:57:51.7132146Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52] 2026-10-25T00:57:51.7132203Z 799 │ }; 2026-10-25T00:57:51.7132379Z 800 │ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]); 2026-10-25T00:57:51.7132552Z ·  ────────────┬──────────── ─────┬───── 2026-10-25T00:57:51.7132774Z · │ ╰── Unnecessary dependency `terminalKey` 2026-10-25T00:57:51.7132976Z · ╰── Unnecessary dependency `terminal.lifecycleVersion` 2026-10-25T00:57:51.7133026Z 801 │ 2026-10-25T00:57:51.7133074Z ╰──── 2026-10-25T00:57:51.7133391Z  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-25T00:57:51.7133694Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.7133697Z 2026-10-25T00:57:51.7133835Z ⚠ react(refs): Cannot access refs during render 2026-10-25T00:57:51.7134001Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24] 2026-10-25T00:57:51.7134054Z 792 │ } 2026-10-25T00:57:51.7134156Z 793 │ const pasteSession = pasteSessionRef.current; 2026-10-25T00:57:51.7134265Z ·  ───────────┬─────────── 2026-10-25T00:57:51.7134422Z · ╰── Cannot access ref value during render 2026-10-25T00:57:51.7134472Z 794 │ 2026-10-25T00:57:51.7134525Z ╰──── 2026-10-25T00:57:51.7134987Z  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-25T00:57:51.7135270Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T00:57:51.7135272Z 2026-10-25T00:57:51.7135451Z ⚠ react(static-components): Cannot create components during render 2026-10-25T00:57:51.7135604Z ╭─[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10] 2026-10-25T00:57:51.7135687Z 196 │ const { onInput, onResize } = props; 2026-10-25T00:57:51.7135875Z 197 │ const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView(); 2026-10-25T00:57:51.7136030Z ·  ────────────────┬─────────────── 2026-10-25T00:57:51.7136209Z · ╰── The component is created during render here 2026-10-25T00:57:51.7136331Z 198 │ const hasNativeSurface = Boolean(NativeTerminalSurfaceView); 2026-10-25T00:57:51.7136382Z 199 │ 2026-10-25T00:57:51.7136446Z 200 │ useEffect(() => { 2026-10-25T00:57:51.7136532Z 201 │ terminalDebugLog("native:surface", { 2026-10-25T00:57:51.7136614Z 202 │ terminalKey: props.terminalKey, 2026-10-25T00:57:51.7136686Z 203 │ native: hasNativeSurface, 2026-10-25T00:57:51.7136815Z 204 │ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(), 2026-10-25T00:57:51.7136896Z 205 │ bufferLen: props.buffer.length, 2026-10-25T00:57:51.7136978Z 206 │ isRunning: props.isRunning, 2026-10-25T00:57:51.7137035Z 207 │ }); 2026-10-25T00:57:51.7137188Z 208 │ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]); 2026-10-25T00:57:51.7137273Z 209 │ const handleNativeInput = useCallback( 2026-10-25T00:57:51.7137383Z 210 │ (event: NativeSyntheticEvent) => { 2026-10-25T00:57:51.7137476Z 211 │ if (!props.isRunning || props.readOnly) { 2026-10-25T00:57:51.7137537Z 212 │ return; 2026-10-25T00:57:51.7137589Z 213 │ } 2026-10-25T00:57:51.7137673Z 214 │ terminalDebugLog("native:onInput", { 2026-10-25T00:57:51.7137818Z 215 │ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)), 2026-10-25T00:57:51.7137874Z 216 │ }); 2026-10-25T00:57:51.7137956Z 217 │ onInput(event.nativeEvent.data); 2026-10-25T00:57:51.7138008Z 218 │ }, 2026-10-25T00:57:51.7138108Z 219 │ [onInput, props.isRunning, props.readOnly], 2026-10-25T00:57:51.7138163Z 220 │ ); 2026-10-25T00:57:51.7138248Z 221 │ const handleNativeResize = useCallback( 2026-10-25T00:57:51.7138356Z 222 │ (event: NativeSyntheticEvent) => { 2026-10-25T00:57:51.7138417Z 223 │ onResize({ 2026-10-25T00:57:51.7138497Z 224 │ cols: event.nativeEvent.cols, 2026-10-25T00:57:51.7138575Z 225 │ rows: event.nativeEvent.rows, 2026-10-25T00:57:51.7138628Z 226 │ }); 2026-10-25T00:57:51.7138680Z 227 │ }, 2026-10-25T00:57:51.7138741Z 228 │ [onResize], 2026-10-25T00:57:51.7138792Z 229 │ ); 2026-10-25T00:57:51.7138842Z 230 │ 2026-10-25T00:57:51.7138921Z 231 │ if (NativeTerminalSurfaceView) { 2026-10-25T00:57:51.7138979Z 232 │ return ( 2026-10-25T00:57:51.7139052Z 233 │ 2026-10-25T00:57:51.7139134Z 234 │ void> = []; 2026-10-25T00:57:51.7149507Z 2617 │ │ const dispatcher: Scheduler.SchedulerDispatcher = { 2026-10-25T00:57:51.7149635Z 2618 │ │ scheduleTask: (task) => tasks.push(task), 2026-10-25T00:57:51.7149730Z 2619 │ │ flush: () => { 2026-10-25T00:57:51.7149849Z 2620 │ │ let task: (() => void) | undefined; 2026-10-25T00:57:51.7150040Z 2621 │ │ while ((task = tasks.shift()) !== undefined) task(); 2026-10-25T00:57:51.7150191Z 2622 │ │ }, 2026-10-25T00:57:51.7150269Z 2623 │ │ }; 2026-10-25T00:57:51.7150338Z 2624 │ │ 2026-10-25T00:57:51.7150494Z 2625 │ │ let requestFiber: Fiber.Fiber | undefined; 2026-10-25T00:57:51.7150596Z 2626 │ │ let requestChecks = 0; 2026-10-25T00:57:51.7150720Z 2627 │ │ const scheduler: Scheduler.Scheduler = { 2026-10-25T00:57:51.7150827Z 2628 │ │ executionMode: "async", 2026-10-25T00:57:51.7150944Z 2629 │ │ makeDispatcher: () => dispatcher, 2026-10-25T00:57:51.7151052Z 2630 │ │ shouldYield: (fiber) => { 2026-10-25T00:57:51.7151185Z 2631 │ │ if (fiber !== requestFiber) return false; 2026-10-25T00:57:51.7151291Z 2632 │ │ requestChecks += 1; 2026-10-25T00:57:51.7151430Z 2633 │ │ if (requestChecks !== interruptAt) return false; 2026-10-25T00:57:51.7151541Z 2634 │ │ fiber.interruptUnsafe(); 2026-10-25T00:57:51.7151634Z 2635 │ │ return true; 2026-10-25T00:57:51.7151713Z 2636 │ │ }, 2026-10-25T00:57:51.7151792Z 2637 │ │ }; 2026-10-25T00:57:51.7151860Z 2638 │ │ 2026-10-25T00:57:51.7151975Z 2639 │ │ const input: UsageSummaryInput = { 2026-10-25T00:57:51.7152067Z 2640 │ │ ...WINDOW, 2026-10-25T00:57:51.7152197Z 2641 │ │ sinceDay: UsageDay.make("2026-09-01"), 2026-10-25T00:57:51.7152390Z 2642 │ │ untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`), 2026-10-25T00:57:51.7152466Z 2643 │ │ }; 2026-10-25T00:57:51.7152575Z 2644 │ │ const first = yield* service 2026-10-25T00:57:51.7152677Z 2645 │ │ .readSummary(input) 2026-10-25T00:57:51.7152762Z 2646 │ │ .pipe( 2026-10-25T00:57:51.7152855Z 2647 │ │ Effect.exit, 2026-10-25T00:57:51.7153008Z 2648 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-25T00:57:51.7153110Z 2649 │ │ Effect.forkChild, 2026-10-25T00:57:51.7153193Z 2650 │ │ ); 2026-10-25T00:57:51.7153331Z 2651 │ │ requestFiber = first; 2026-10-25T00:57:51.7153433Z 2652 │ │ yield* Effect.yieldNow; 2026-10-25T00:57:51.7153532Z 2653 │ │ dispatcher.flush(); 2026-10-25T00:57:51.7153600Z 2654 │ │ 2026-10-25T00:57:51.7153744Z 2655 │ │ const second = yield* service.readSummary(input).pipe( 2026-10-25T00:57:51.7153839Z 2656 │ │ Effect.match({ 2026-10-25T00:57:51.7153959Z 2657 │ │ onFailure: (error) => error.reason, 2026-10-25T00:57:51.7154080Z 2658 │ │ onSuccess: () => "success" as const, 2026-10-25T00:57:51.7154159Z 2659 │ │ }), 2026-10-25T00:57:51.7154364Z 2660 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-25T00:57:51.7154530Z 2661 │ │ Effect.forkChild, 2026-10-25T00:57:51.7154608Z 2662 │ │ ); 2026-10-25T00:57:51.7154709Z 2663 │ │ yield* Effect.yieldNow; 2026-10-25T00:57:51.7154807Z 2664 │ │ dispatcher.flush(); 2026-10-25T00:57:51.7154928Z 2665 │ │ const secondExit = second.pollUnsafe(); 2026-10-25T00:57:51.7155040Z 2666 │ │ if (secondExit === undefined) { 2026-10-25T00:57:51.7155152Z 2667 │ │ second.interruptUnsafe(); 2026-10-25T00:57:51.7155258Z 2668 │ │ orphanedAt = interruptAt; 2026-10-25T00:57:51.7155344Z 2669 │ │ break; 2026-10-25T00:57:51.7155426Z 2670 │ │ } 2026-10-25T00:57:51.7155545Z 2671 │ │ if (Exit.isFailure(secondExit)) { 2026-10-25T00:57:51.7155695Z 2672 │ │ assert.fail("the matching request fiber was interrupted"); 2026-10-25T00:57:51.7155772Z 2673 │ │ } 2026-10-25T00:57:51.7155919Z 2674 │ │ assert.strictEqual(secondExit.value, "invalidWindow"); 2026-10-25T00:57:51.7156049Z 2675 │ ╰─▶ } 2026-10-25T00:57:51.7156101Z 2676 │ 2026-10-25T00:57:51.7156153Z ╰──── 2026-10-25T00:57:51.7156155Z 2026-10-25T00:57:51.7156351Z ⚠ eslint(no-unused-vars): Identifier 'identity' is imported but never used. 2026-10-25T00:57:51.7156450Z ╭─[apps/server/src/auth/http.ts:28:10] 2026-10-25T00:57:51.7156538Z 27 │ import * as Schema from "effect/Schema"; 2026-10-25T00:57:51.7156632Z 28 │ import { identity } from "effect/Function"; 2026-10-25T00:57:51.7156705Z ·  ────┬─── 2026-10-25T00:57:51.7156836Z · ╰── 'identity' is imported here 2026-10-25T00:57:51.7156914Z 29 │ import * as Layer from "effect/Layer"; 2026-10-25T00:57:51.7156963Z ╰──── 2026-10-25T00:57:51.7157057Z  help: Consider removing this import. 2026-10-25T00:57:51.7157059Z 2026-10-25T00:57:51.7157265Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-25T00:57:51.7157385Z ╭─[apps/mobile/src/lib/markdownDocument.ts:259:28] 2026-10-25T00:57:51.7157482Z 258 │ visit(parser.parse(markdown), false, false); 2026-10-25T00:57:51.7157612Z 259 │ for (const edit of edits.reverse()) 2026-10-25T00:57:51.7157760Z ·  ─────── 2026-10-25T00:57:51.7157918Z 260 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-25T00:57:51.7157968Z ╰──── 2026-10-25T00:57:51.7158223Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-25T00:57:51.7158226Z 2026-10-25T00:57:51.7158428Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-25T00:57:51.7158545Z ╭─[apps/mobile/src/lib/markdownDocument.ts:290:28] 2026-10-25T00:57:51.7158622Z 289 │ visit(parser.parse(markdown)); 2026-10-25T00:57:51.7158702Z 290 │ for (const edit of edits.reverse()) 2026-10-25T00:57:51.7158799Z ·  ─────── 2026-10-25T00:57:51.7158955Z 291 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-25T00:57:51.7159003Z ╰──── 2026-10-25T00:57:51.7159252Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-25T00:57:51.7159254Z 2026-10-25T00:57:51.7159456Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-25T00:57:51.7159572Z ╭─[apps/mobile/src/lib/markdownDocument.ts:344:38] 2026-10-25T00:57:51.7159647Z 343 │ visit(parser.parse(markdown)); 2026-10-25T00:57:51.7159748Z 344 │ for (const lineStart of lineStarts.reverse()) { 2026-10-25T00:57:51.7159848Z ·  ─────── 2026-10-25T00:57:51.7160011Z 345 │ // The header row may be a lazy line without its container markers (`>` or list indent), 2026-10-25T00:57:51.7160062Z ╰──── 2026-10-25T00:57:51.7160314Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-25T00:57:51.7160316Z 2026-10-25T00:57:51.7160979Z ⚠ 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-25T00:57:51.7161103Z ╭─[apps/server/src/auth/RpcAuthorization.ts:237:17] 2026-10-25T00:57:51.7161231Z 236 │ const requiredScopesForSettingsUpdate = (payload: unknown) => { 2026-10-25T00:57:51.7161359Z 237 │ const input = Schema.decodeUnknownSync(SettingsUpdate)(payload); 2026-10-25T00:57:51.7161461Z ·  ──────────────────────── 2026-10-25T00:57:51.7161602Z 238 │ const scopes = requiredScopesForServerSettingsPatch(input.patch); 2026-10-25T00:57:51.7161654Z ╰──── 2026-10-25T00:57:51.7161658Z 2026-10-25T00:57:51.7162011Z ⚠ 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-25T00:57:51.7162129Z ╭─[apps/server/src/auth/RpcAuthorization.ts:256:26] 2026-10-25T00:57:51.7162225Z 255 │ if (method === WS_METHODS.assetsCreateUrl) { 2026-10-25T00:57:51.7162375Z 256 │ const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload); 2026-10-25T00:57:51.7162483Z ·  ──────────────────────── 2026-10-25T00:57:51.7162541Z 257 │ return [ 2026-10-25T00:57:51.7162590Z ╰──── 2026-10-25T00:57:51.7162593Z 2026-10-25T00:57:51.7162984Z ⚠ 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-25T00:57:51.7163177Z ╭─[packages/effect-acp/src/schema.test.ts:18:12] 2026-10-25T00:57:51.7163378Z 17 │ const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } }; 2026-10-25T00:57:51.7163497Z 18 │ expect(Schema.is(V1.AvailableCommand)(command)).toBe(true); 2026-10-25T00:57:51.7163573Z ·  ───────── 2026-10-25T00:57:51.7163630Z 19 │ expect( 2026-10-25T00:57:51.7163682Z ╰──── 2026-10-25T00:57:51.7163684Z 2026-10-25T00:57:51.7164005Z ⚠ 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-25T00:57:51.7164124Z ╭─[packages/effect-acp/src/schema.test.ts:20:7] 2026-10-25T00:57:51.7164181Z 19 │ expect( 2026-10-25T00:57:51.7164346Z 20 │ Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }), 2026-10-25T00:57:51.7164416Z ·  ───────── 2026-10-25T00:57:51.7164477Z 21 │ ).toBe(true); 2026-10-25T00:57:51.7164525Z ╰──── 2026-10-25T00:57:51.7164527Z 2026-10-25T00:57:51.7164975Z ⚠ 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-25T00:57:51.7165091Z ╭─[packages/effect-acp/src/errors.test.ts:129:28] 2026-10-25T00:57:51.7165183Z 128 │ const secret = "acp-summary-secret"; 2026-10-25T00:57:51.7165294Z 129 │ const cause = yield* Schema.decodeUnknownEffect( 2026-10-25T00:57:51.7165408Z ·  ────────────────────────── 2026-10-25T00:57:51.7165476Z 130 │ Schema.Struct({ 2026-10-25T00:57:51.7165527Z ╰──── 2026-10-25T00:57:51.7165529Z 2026-10-25T00:57:51.7165693Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T00:57:51.7165807Z ╭─[apps/web/src/hooks/useThreadActions.ts:821:56] 2026-10-25T00:57:51.7165907Z 820 │ const resolved = resolveThreadTarget(target); 2026-10-25T00:57:51.7166061Z 821 │ if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) { 2026-10-25T00:57:51.7166177Z ·  ─────┬──── 2026-10-25T00:57:51.7166345Z · ╰── Cannot call impure function 2026-10-25T00:57:51.7166426Z 822 │ return AsyncResult.failure( 2026-10-25T00:57:51.7166476Z ╰──── 2026-10-25T00:57:51.7166746Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T00:57:51.7167035Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T00:57:51.7167041Z 2026-10-25T00:57:51.7167200Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T00:57:51.7167315Z ╭─[apps/web/src/hooks/useThreadActions.ts:709:46] 2026-10-25T00:57:51.7167384Z 708 │ const wokeAt = resolved 2026-10-25T00:57:51.7167517Z 709 │ ? threadWokeAt(resolved.thread, { now: new Date().toISOString() }) 2026-10-25T00:57:51.7167680Z ·  ─────┬──── 2026-10-25T00:57:51.7167896Z · ╰── Cannot call impure function 2026-10-25T00:57:51.7167958Z 710 │ : null; 2026-10-25T00:57:51.7168007Z ╰──── 2026-10-25T00:57:51.7168273Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T00:57:51.7168560Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T00:57:51.7168562Z 2026-10-25T00:57:51.7168757Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T00:57:51.7168899Z ╭─[apps/mobile/src/state/use-thread-outbox-drain.ts:1321:5] 2026-10-25T00:57:51.7168979Z 1320 │ queuedMessagesByThreadKey, 2026-10-25T00:57:51.7169041Z 1321 │ retryTick, 2026-10-25T00:57:51.7169112Z ·  ────┬──── 2026-10-25T00:57:51.7169251Z · ╰── Unnecessary dependency `retryTick` 2026-10-25T00:57:51.7169318Z 1322 │ restoreQueuedMessage, 2026-10-25T00:57:51.7169369Z ╰──── 2026-10-25T00:57:51.7169656Z  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-25T00:57:51.7169959Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T00:57:51.7169962Z 2026-10-25T00:57:51.7170218Z ⚠ unicorn(prefer-add-event-listener): Prefer `addEventListener()` over their `on`-function counterparts. 2026-10-25T00:57:51.7170359Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:12:14] 2026-10-25T00:57:51.7170508Z 11 │ addEventListener(_type: string, listener: (event: { data: string }) => void) { 2026-10-25T00:57:51.7170585Z 12 │ this.onmessage = listener; 2026-10-25T00:57:51.7170663Z ·  ───────── 2026-10-25T00:57:51.7170715Z 13 │ } 2026-10-25T00:57:51.7170764Z ╰──── 2026-10-25T00:57:51.7171077Z  help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on` replaces any previously registered handler. 2026-10-25T00:57:51.7171079Z 2026-10-25T00:57:51.7171284Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-25T00:57:51.7171421Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:16:9] 2026-10-25T00:57:51.7171485Z 15 │ constructor() { 2026-10-25T00:57:51.7171549Z 16 │ source = this; 2026-10-25T00:57:51.7171618Z ·  ────── 2026-10-25T00:57:51.7171670Z 17 │ } 2026-10-25T00:57:51.7171720Z ╰──── 2026-10-25T00:57:51.7171985Z  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-25T00:57:51.7171988Z 2026-10-25T00:57:51.7172212Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-25T00:57:51.7172371Z ╭─[apps/web/src/components/pullRequest/pullRequestList.logic.ts:262:9] 2026-10-25T00:57:51.7172431Z 261 │ ): boolean { 2026-10-25T00:57:51.7172629Z 262 │ const labels = entry.labels.map((label) => label.name.trim().toLowerCase()); 2026-10-25T00:57:51.7172856Z ·  ───────────────────────────────────────────────────────────────────── 2026-10-25T00:57:51.7172999Z 263 │ const holds = (label: string) => labels.includes(label.trim().toLowerCase()); 2026-10-25T00:57:51.7173048Z ╰──── 2026-10-25T00:57:51.7173124Z  help: Switch to `Set` 2026-10-25T00:57:51.7173126Z 2026-10-25T00:57:51.7173437Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-25T00:57:51.7173601Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:473:19] 2026-10-25T00:57:51.7173660Z 472 │ onFilters, 2026-10-25T00:57:51.7173727Z 473 │ authorOptions = [], 2026-10-25T00:57:51.7173808Z ·  ── 2026-10-25T00:57:51.7173877Z 474 │ labelOptions = [], 2026-10-25T00:57:51.7173925Z ╰──── 2026-10-25T00:57:51.7174237Z  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-25T00:57:51.7174239Z 2026-10-25T00:57:51.7174513Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-25T00:57:51.7174676Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:474:18] 2026-10-25T00:57:51.7174739Z 473 │ authorOptions = [], 2026-10-25T00:57:51.7174803Z 474 │ labelOptions = [], 2026-10-25T00:57:51.7174878Z ·  ── 2026-10-25T00:57:51.7174940Z 475 │ optionScope, 2026-10-25T00:57:51.7174993Z ╰──── 2026-10-25T00:57:51.7175303Z  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-25T00:57:51.7175306Z 2026-10-25T00:57:51.7175493Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T00:57:51.7175654Z ╭─[apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx:818:17] 2026-10-25T00:57:51.7175714Z 817 │
Date.now()); 2026-10-25T00:57:51.7178040Z 84 │ useEffect(() => { 2026-10-25T00:57:51.7178109Z ·  ────┬──── 2026-10-25T00:57:51.7178235Z · ╰── This is the containing effect 2026-10-25T00:57:51.7178320Z 85 │ if (!actionState.isRunning) return; 2026-10-25T00:57:51.7178384Z 86 │ setNowMs(Date.now()); 2026-10-25T00:57:51.7178454Z ·  ────┬─── 2026-10-25T00:57:51.7178622Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T00:57:51.7178749Z 87 │ const interval = setInterval(() => setNowMs(Date.now()), 1000); 2026-10-25T00:57:51.7178798Z ╰──── 2026-10-25T00:57:51.7179385Z  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-25T00:57:51.7179703Z  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-25T00:57:51.7179705Z 2026-10-25T00:57:51.7179921Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-25T00:57:51.7180055Z ╭─[apps/mobile/src/state/use-model-option-memory.ts:21:7] 2026-10-25T00:57:51.7180118Z 20 │ [instanceId]: { 2026-10-25T00:57:51.7180193Z 21 │ ...(state[instanceId] ?? {}), 2026-10-25T00:57:51.7180294Z ·  ──────────────────────────── 2026-10-25T00:57:51.7180360Z 22 │ [model]: options, 2026-10-25T00:57:51.7180409Z ╰──── 2026-10-25T00:57:51.7180669Z  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-25T00:57:51.7180671Z 2026-10-25T00:57:51.7181120Z ⚠ 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-25T00:57:51.7181291Z ╭─[packages/effect-acp/src/protocol.test.ts:500:31] 2026-10-25T00:57:51.7181406Z 499 │ 2026-10-25T00:57:51.7181520Z 500 │ const response = yield* Schema.decodeUnknownEffect( 2026-10-25T00:57:51.7181634Z ·  ────────────────────────── 2026-10-25T00:57:51.7181742Z 501 │ Schema.fromJsonString(JsonRpcErrorResponse), 2026-10-25T00:57:51.7181791Z ╰──── 2026-10-25T00:57:51.7181796Z 2026-10-25T00:57:51.7182157Z ⚠ 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-25T00:57:51.7182272Z ╭─[packages/effect-acp/src/client.ts:1270:11] 2026-10-25T00:57:51.7182419Z 1269 │ extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) => 2026-10-25T00:57:51.7182594Z 1270 │ Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe( 2026-10-25T00:57:51.7182699Z ·  ────────────────────────── 2026-10-25T00:57:51.7182840Z 1271 │ Effect.mapError(() => AcpError.AcpRequestError.invalidParams()), 2026-10-25T00:57:51.7182893Z ╰──── 2026-10-25T00:57:51.7182896Z 2026-10-25T00:57:51.7183389Z ⚠ 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-25T00:57:51.7183536Z ╭─[apps/server/src/background/HostPowerMonitor.test.ts:133:11] 2026-10-25T00:57:51.7183662Z 132 │ const monitor = yield* HostPowerMonitor.HostPowerMonitor; 2026-10-25T00:57:51.7183814Z 133 │ ╭─▶ for ( 2026-10-25T00:57:51.7183918Z 134 │ │ let attempt = 0; 2026-10-25T00:57:51.7184082Z 135 │ │ attempt < 100 && (yield* monitor.snapshot).onBattery !== "true"; 2026-10-25T00:57:51.7184177Z 136 │ │ attempt += 1 2026-10-25T00:57:51.7184258Z 137 │ │ ) { 2026-10-25T00:57:51.7184368Z 138 │ │ yield* Effect.yieldNow; 2026-10-25T00:57:51.7184500Z 139 │ ╰─▶ } 2026-10-25T00:57:51.7184620Z 140 │ expect((yield* monitor.snapshot).onBattery).toBe("true"); 2026-10-25T00:57:51.7184673Z ╰──── 2026-10-25T00:57:51.7184675Z 2026-10-25T00:57:51.7184878Z ⚠ eslint(no-unused-vars): Identifier 'HostProcess' is imported but never used. 2026-10-25T00:57:51.7185042Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:25:13] 2026-10-25T00:57:51.7185127Z 24 │ import * as Schema from "effect/Schema"; 2026-10-25T00:57:51.7185241Z 25 │ import * as HostProcess from "@t3tools/shared/HostProcess"; 2026-10-25T00:57:51.7185323Z ·  ─────┬───── 2026-10-25T00:57:51.7185461Z · ╰── 'HostProcess' is imported here 2026-10-25T00:57:51.7185511Z 26 │ 2026-10-25T00:57:51.7185563Z ╰──── 2026-10-25T00:57:51.7185660Z  help: Consider removing this import. 2026-10-25T00:57:51.7185662Z 2026-10-25T00:57:51.7185928Z ⚠ eslint(no-unused-vars): Variable 'serverConfig' is declared but never used. Unused variables should start with a '_'. 2026-10-25T00:57:51.7186208Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:124:11] 2026-10-25T00:57:51.7186347Z 123 │ const path = yield* Path.Path; 2026-10-25T00:57:51.7186462Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-25T00:57:51.7186542Z ·  ──────┬───── 2026-10-25T00:57:51.7186676Z · ╰── 'serverConfig' is declared here 2026-10-25T00:57:51.7186814Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-25T00:57:51.7186864Z ╰──── 2026-10-25T00:57:51.7186967Z  help: Consider removing this declaration. 2026-10-25T00:57:51.7186969Z 2026-10-25T00:57:51.7187237Z ⚠ eslint(no-unused-vars): Variable 'serverSettings' is declared but never used. Unused variables should start with a '_'. 2026-10-25T00:57:51.7187401Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:125:11] 2026-10-25T00:57:51.7187515Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-25T00:57:51.7187648Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-25T00:57:51.7187732Z ·  ───────┬────── 2026-10-25T00:57:51.7187873Z · ╰── 'serverSettings' is declared here 2026-10-25T00:57:51.7188004Z 126 │ const gitWorkflow = yield* GitWorkflowService.GitWorkflowService; 2026-10-25T00:57:51.7188054Z ╰──── 2026-10-25T00:57:51.7188155Z  help: Consider removing this declaration. 2026-10-25T00:57:51.7188157Z 2026-10-25T00:57:51.7188356Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-25T00:57:51.7188519Z ╭─[apps/server/src/sourceControl/SourceControlProviderRegistry.ts:15:13] 2026-10-25T00:57:51.7188598Z 14 │ } from "@t3tools/contracts"; 2026-10-25T00:57:51.7188689Z 15 │ import type {} from "@t3tools/contracts"; 2026-10-25T00:57:51.7188756Z ·  ── 2026-10-25T00:57:51.7188808Z 16 │ 2026-10-25T00:57:51.7188860Z ╰──── 2026-10-25T00:57:51.7188940Z  help: Remove empty braces 2026-10-25T00:57:51.7188943Z 2026-10-25T00:57:51.7189128Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T00:57:51.7189296Z ╭─[apps/web/src/components/pullRequest/PullRequestChecksPopover.tsx:88:15] 2026-10-25T00:57:51.7189356Z 87 │
  • approval.requestId, 2026-10-25T00:57:51.7190911Z 987 │ ╰─▶ ); 2026-10-25T00:57:51.7191111Z 988 │ const approvalResponding = approvalsToDecline.some((approval) => 2026-10-25T00:57:51.7191163Z ╰──── 2026-10-25T00:57:51.7191236Z  help: Switch to `Set` 2026-10-25T00:57:51.7191241Z 2026-10-25T00:57:51.7191404Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T00:57:51.7191547Z ╭─[apps/web/src/components/chat/useThreadLifecycle.tsx:178:58] 2026-10-25T00:57:51.7191655Z 177 │ if (snoozeClockState.shell !== activeThreadShell) { 2026-10-25T00:57:51.7191814Z 178 │ setSnoozeClockState({ shell: activeThreadShell, now: new Date().toISOString() }); 2026-10-25T00:57:51.7191933Z ·  ─────┬──── 2026-10-25T00:57:51.7192104Z · ╰── Cannot call impure function 2026-10-25T00:57:51.7192160Z 179 │ } 2026-10-25T00:57:51.7192211Z ╰──── 2026-10-25T00:57:51.7192484Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T00:57:51.7192775Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T00:57:51.7192778Z 2026-10-25T00:57:51.7192858Z Found 0 errors and 372 warnings in 5486 files (5.4s, 8 threads) 2026-10-25T00:57:51.7609658Z Post job cleanup. 2026-10-25T00:57:51.8190672Z Cache hit occurred on the primary key electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309, not saving cache. 2026-10-25T00:57:51.8252455Z Post job cleanup. 2026-10-25T00:57:51.8264670Z ##[start-action display=Cache full pnpm store;id=__01727676-7712-41d5-a60c-7d4efac6413b.__actions_cache] 2026-10-25T00:57:51.8560078Z Post job cleanup. 2026-10-25T00:57:51.9192579Z Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-fe33cf74552d68b43bd4929ad8f74b63f776b4470e2e3533f781441d5e4f188c, not saving cache. 2026-10-25T00:57:51.9221214Z ##[end-action id=__01727676-7712-41d5-a60c-7d4efac6413b.__actions_cache;outcome=success;conclusion=success;duration_ms=95] 2026-10-25T00:57:51.9223092Z ##[start-action display=Cache Vite+;id=__01727676-7712-41d5-a60c-7d4efac6413b.vp_cache] 2026-10-25T00:57:51.9242618Z Post job cleanup. 2026-10-25T00:57:51.9829156Z Cache hit occurred on the primary key vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0, not saving cache. 2026-10-25T00:57:51.9856243Z ##[end-action id=__01727676-7712-41d5-a60c-7d4efac6413b.vp_cache;outcome=success;conclusion=success;duration_ms=63] 2026-10-25T00:57:51.9897048Z Post job cleanup. 2026-10-25T00:57:52.0268529Z [command]/usr/local/bin/git version 2026-10-25T00:57:52.0296613Z git version 2.55.0 2026-10-25T00:57:52.0314216Z Temporarily overriding HOME='/home/runner/_work/_temp/d3c5d3f5-cd08-48d6-b2ba-81a53a59ceb1' before making global git config changes 2026-10-25T00:57:52.0314803Z Adding repository directory to the temporary git global config as a safe directory 2026-10-25T00:57:52.0317425Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-25T00:57:52.0337343Z Removing SSH command configuration 2026-10-25T00:57:52.0340401Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-25T00:57:52.0360785Z [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-25T00:57:52.0471363Z fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules 2026-10-25T00:57:52.0489028Z ##[warning]The process '/usr/local/bin/git' failed with exit code 128 2026-10-25T00:57:52.0525969Z A job completed hook has been configured by the self-hosted runner administrator 2026-10-25T00:57:52.0541105Z ##[group]Run '/job_completed.sh' 2026-10-25T00:57:52.0548300Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-25T00:57:52.0548464Z env: 2026-10-25T00:57:52.0548572Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 216 2026-10-25T00:57:52.0548717Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 361 2026-10-25T00:57:52.0548853Z BLACKSMITH_CHECK_RUN_ID: 121035433332 2026-10-25T00:57:52.0548990Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-25T00:57:52.0549127Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-25T00:57:52.0549258Z ##[endgroup] 2026-10-25T00:57:52.0616503Z Docker container cache not activated, skipping hash computation. 2026-10-25T00:57:52.0859518Z No active SSH sessions detected. Proceeding with shutdown immediately. 2026-10-25T00:57:52.0902894Z Cleaning up orphan processes