2026-10-23T17:02:41.6168653Z Current runner version: '2.337.0' 2026-10-23T17:02:41.6175618Z Runner name: 'blacksmith-8vcpu-ubuntu-2404-vppnrb2npdkejuse' 2026-10-23T17:02:41.6176797Z Runner group name: 'blacksmith scale sets - blacksmith-8vcpu-ubuntu-2404' 2026-10-23T17:02:41.6178294Z Machine name: 'ip-172-31-73-130' 2026-10-23T17:02:41.6181004Z ##[group]GITHUB_TOKEN Permissions 2026-10-23T17:02:41.6183430Z Contents: read 2026-10-23T17:02:41.6184080Z Metadata: read 2026-10-23T17:02:41.6184697Z ##[endgroup] 2026-10-23T17:02:41.6187027Z Secret source: None 2026-10-23T17:02:41.6188088Z Cache mode: write 2026-10-23T17:02:41.6189020Z Prepare workflow directory 2026-10-23T17:02:41.6550236Z Prepare all required actions 2026-10-23T17:02:41.6595733Z Getting action download info 2026-10-23T17:02:41.8079888Z Download action repository 'actions/checkout@v6' (SHA:d23441a48e516b6c34aea4fa41551a30e30af803) 2026-10-23T17:02:41.8972672Z Download action repository 'actions/cache@v6' (SHA:55cc8345863c7cc4c66a329aec7e433d2d1c52a9) 2026-10-23T17:02:42.0656832Z Setting BLACKSMITH_ACTIONS_RESULTS_URL to https://results-receiver.actions.githubusercontent.com/ 2026-10-23T17:02:42.0718930Z Complete job name: Lint 2026-10-23T17:02:42.1371873Z A job started hook has been configured by the self-hosted runner administrator 2026-10-23T17:02:42.1666042Z ##[group]Run '/setup.sh' 2026-10-23T17:02:42.1719269Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T17:02:42.1721005Z env: 2026-10-23T17:02:42.1721315Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 195 2026-10-23T17:02:42.1721722Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 729 2026-10-23T17:02:42.1722160Z BLACKSMITH_CHECK_RUN_ID: 120545088735 2026-10-23T17:02:42.1722609Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-23T17:02:42.1723059Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-23T17:02:42.1723541Z ##[endgroup] 2026-10-23T17:02:42.2285021Z Logging daemon started (blacksmithd for logs) 2026-10-23T17:02:42.2488988Z Results daemon started (blacksmithd for results) 2026-10-23T17:02:42.2798420Z Background adoption and SSH setup started (PID: 3155) 2026-10-23T17:02:42.2800734Z 2026-10-23T17:02:42.2801193Z ---------------------------------------- 2026-10-23T17:02:42.2802710Z View this job: https://app.blacksmith.sh/pingdotgg/runs/39991788139/jobs/120545088735 2026-10-23T17:02:42.2803582Z SSH Access (using your GitHub SSH key): 2026-10-23T17:02:42.2804484Z ssh -p 64002 runner@blacksmith-8vcpu-ubuntu-2404-vppnrb2npdkejuse.vm.blacksmith.sh 2026-10-23T17:02:42.2805120Z 2026-10-23T17:02:42.2805491Z No GitHub SSH key? Add one at: 2026-10-23T17:02:42.2806616Z https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account 2026-10-23T17:02:42.2807371Z 2026-10-23T17:02:42.2807617Z ---------------------------------------- 2026-10-23T17:02:42.2807974Z 2026-10-23T17:02:42.2808332Z VM ID: blacksmith-8vcpu-ubuntu-2404-vppnrb2npdkejuse 2026-10-23T17:02:42.2809068Z Host: production-152.236.40.164-x8664 2026-10-23T17:02:42.2809611Z Host Agent PID: 3236094 2026-10-23T17:02:42.2810211Z Host Agent Git SHA: af74fd76b 2026-10-23T17:02:42.2810828Z Host CPU Manufacturer: AuthenticAMD 2026-10-23T17:02:42.2811786Z Blacksmith Host Generation: gen 2 2026-10-23T17:02:42.2812611Z Petname: production-distinct-cod-484b02f9 2026-10-23T17:02:42.2813770Z Region: us-east 2026-10-23T17:02:42.2815180Z Rootfs Version: ubuntu24-full-x64-081926 2026-10-23T17:02:42.2827138Z OS Version: Ubuntu 24.04.4 LTS 2026-10-23T17:02:42.2827592Z 2026-10-23T17:02:42.2827802Z Enabling Blacksmith transparent cache 2026-10-23T17:02:42.3345966Z ##[group]Run actions/checkout@v6 2026-10-23T17:02:42.3346511Z with: 2026-10-23T17:02:42.3346893Z sparse-checkout: /* !/.repos/ !/apps/mobile/modules/t3-terminal/Vendor/**/*.a 2026-10-23T17:02:42.3347342Z sparse-checkout-cone-mode: false 2026-10-23T17:02:42.3347659Z repository: pingdotgg/t3code 2026-10-23T17:02:42.3349803Z token: *** 2026-10-23T17:02:42.3350053Z ssh-strict: true 2026-10-23T17:02:42.3350295Z ssh-user: git 2026-10-23T17:02:42.3350552Z persist-credentials: true 2026-10-23T17:02:42.3351337Z clean: true 2026-10-23T17:02:42.3351569Z fetch-depth: 1 2026-10-23T17:02:42.3351799Z fetch-tags: false 2026-10-23T17:02:42.3352106Z show-progress: true 2026-10-23T17:02:42.3352460Z lfs: false 2026-10-23T17:02:42.3352769Z submodules: false 2026-10-23T17:02:42.3353100Z set-safe-directory: true 2026-10-23T17:02:42.3353378Z allow-unsafe-pr-checkout: false 2026-10-23T17:02:42.3353657Z env: 2026-10-23T17:02:42.3353948Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 195 2026-10-23T17:02:42.3354258Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 729 2026-10-23T17:02:42.3354552Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T17:02:42.3354839Z ##[endgroup] 2026-10-23T17:02:42.5846336Z Syncing repository: pingdotgg/t3code 2026-10-23T17:02:42.5850366Z ##[group]Getting Git version info 2026-10-23T17:02:42.5851370Z Working directory is '/home/runner/_work/t3code/t3code' 2026-10-23T17:02:42.5853175Z [command]/usr/local/bin/git version 2026-10-23T17:02:42.6008238Z git version 2.55.0 2026-10-23T17:02:42.6032006Z ##[endgroup] 2026-10-23T17:02:42.6048005Z Temporarily overriding HOME='/home/runner/_work/_temp/5b4cbfa8-fe1d-44b4-a142-a61c20c2e7fc' before making global git config changes 2026-10-23T17:02:42.6049532Z Adding repository directory to the temporary git global config as a safe directory 2026-10-23T17:02:42.6054658Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-23T17:02:42.6145744Z Deleting the contents of '/home/runner/_work/t3code/t3code' 2026-10-23T17:02:42.6150062Z ##[group]Determining repository object format 2026-10-23T17:02:42.6152008Z ##[endgroup] 2026-10-23T17:02:42.6152869Z ##[group]Initializing the repository 2026-10-23T17:02:42.6157110Z [command]/usr/local/bin/git init /home/runner/_work/t3code/t3code 2026-10-23T17:02:42.6285480Z hint: Using 'master' as the name for the initial branch. This default branch name 2026-10-23T17:02:42.6287322Z hint: will change to "main" in Git 3.0. To configure the initial branch name 2026-10-23T17:02:42.6288711Z hint: to use in all of your new repositories, which will suppress this warning, 2026-10-23T17:02:42.6289586Z hint: call: 2026-10-23T17:02:42.6290048Z hint: 2026-10-23T17:02:42.6290755Z hint: git config --global init.defaultBranch 2026-10-23T17:02:42.6291428Z hint: 2026-10-23T17:02:42.6292097Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and 2026-10-23T17:02:42.6293089Z hint: 'development'. The just-created branch can be renamed via this command: 2026-10-23T17:02:42.6294035Z hint: 2026-10-23T17:02:42.6294518Z hint: git branch -m 2026-10-23T17:02:42.6295056Z hint: 2026-10-23T17:02:42.6295806Z hint: Disable this message with "git config set advice.defaultBranchName false" 2026-10-23T17:02:42.6296980Z Initialized empty Git repository in /home/runner/_work/t3code/t3code/.git/ 2026-10-23T17:02:42.6303947Z [command]/usr/local/bin/git remote add origin https://github.com/pingdotgg/t3code 2026-10-23T17:02:42.6399299Z ##[endgroup] 2026-10-23T17:02:42.6400294Z ##[group]Disabling automatic garbage collection 2026-10-23T17:02:42.6401212Z [command]/usr/local/bin/git config --local gc.auto 0 2026-10-23T17:02:42.6456014Z ##[endgroup] 2026-10-23T17:02:42.6456916Z ##[group]Setting up auth 2026-10-23T17:02:42.6457551Z Removing SSH command configuration 2026-10-23T17:02:42.6468619Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-23T17:02:42.6547838Z [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-23T17:02:42.6925416Z Removing HTTP extra header 2026-10-23T17:02:42.6936896Z [command]/usr/local/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader 2026-10-23T17:02:42.7008622Z [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-23T17:02:42.7288188Z Removing includeIf entries pointing to credentials config files 2026-10-23T17:02:42.7289385Z [command]/usr/local/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: 2026-10-23T17:02:42.7358258Z [command]/usr/local/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url 2026-10-23T17:02:42.7608963Z [command]/usr/local/bin/git config --file /home/runner/_work/_temp/git-credentials-664688c2-3cb0-4916-8696-de4ad5385f62.config http.https://github.com/.extraheader AUTHORIZATION: basic *** 2026-10-23T17:02:42.7690405Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git.path /home/runner/_work/_temp/git-credentials-664688c2-3cb0-4916-8696-de4ad5385f62.config 2026-10-23T17:02:42.7734685Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git/worktrees/*.path /home/runner/_work/_temp/git-credentials-664688c2-3cb0-4916-8696-de4ad5385f62.config 2026-10-23T17:02:42.7785674Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-664688c2-3cb0-4916-8696-de4ad5385f62.config 2026-10-23T17:02:42.7835587Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-664688c2-3cb0-4916-8696-de4ad5385f62.config 2026-10-23T17:02:42.7883780Z ##[endgroup] 2026-10-23T17:02:42.7884726Z ##[group]Fetching the repository 2026-10-23T17:02:42.7897371Z [command]/usr/local/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --filter=blob:none --depth=1 origin +6b6b5873aa83c04fcd1cb5d454558eeeaca1ec93:refs/remotes/pull/22029/merge 2026-10-23T17:02:43.1716590Z From https://github.com/pingdotgg/t3code 2026-10-23T17:02:43.1717798Z * [new ref] 6b6b5873aa83c04fcd1cb5d454558eeeaca1ec93 -> pull/22029/merge 2026-10-23T17:02:43.1795539Z ##[endgroup] 2026-10-23T17:02:43.1796931Z ##[group]Determining the checkout info 2026-10-23T17:02:43.1798370Z ##[endgroup] 2026-10-23T17:02:43.1799355Z ##[group]Setting up sparse checkout 2026-10-23T17:02:43.1807324Z [command]/usr/local/bin/git config core.sparseCheckout true 2026-10-23T17:02:43.1869460Z [command]/usr/local/bin/git rev-parse --git-path info/sparse-checkout 2026-10-23T17:02:43.1918469Z .git/info/sparse-checkout 2026-10-23T17:02:43.1932073Z ##[endgroup] 2026-10-23T17:02:43.1933462Z ##[group]Checking out the ref 2026-10-23T17:02:43.1940991Z [command]/usr/local/bin/git checkout --progress --force refs/remotes/pull/22029/merge 2026-10-23T17:02:50.8010262Z Updating files: 0% (1/6307) 2026-10-23T17:02:50.8063919Z Updating files: 1% (64/6307) 2026-10-23T17:02:50.8095083Z Updating files: 2% (127/6307) 2026-10-23T17:02:50.8136262Z Updating files: 3% (190/6307) 2026-10-23T17:02:50.8172504Z Updating files: 4% (253/6307) 2026-10-23T17:02:50.8229465Z Updating files: 5% (316/6307) 2026-10-23T17:02:50.8265925Z Updating files: 6% (379/6307) 2026-10-23T17:02:50.8361518Z Updating files: 7% (442/6307) 2026-10-23T17:02:50.8421533Z Updating files: 8% (505/6307) 2026-10-23T17:02:50.8452585Z Updating files: 9% (568/6307) 2026-10-23T17:02:50.8832381Z Updating files: 10% (631/6307) 2026-10-23T17:02:50.8847450Z Updating files: 11% (694/6307) 2026-10-23T17:02:50.8862159Z Updating files: 12% (757/6307) 2026-10-23T17:02:50.8881127Z Updating files: 13% (820/6307) 2026-10-23T17:02:50.8905343Z Updating files: 14% (883/6307) 2026-10-23T17:02:50.8928660Z Updating files: 15% (947/6307) 2026-10-23T17:02:50.8952789Z Updating files: 16% (1010/6307) 2026-10-23T17:02:50.8974978Z Updating files: 17% (1073/6307) 2026-10-23T17:02:50.9007519Z Updating files: 18% (1136/6307) 2026-10-23T17:02:50.9025788Z Updating files: 19% (1199/6307) 2026-10-23T17:02:50.9055611Z Updating files: 20% (1262/6307) 2026-10-23T17:02:50.9081331Z Updating files: 21% (1325/6307) 2026-10-23T17:02:50.9108116Z Updating files: 22% (1388/6307) 2026-10-23T17:02:50.9125688Z Updating files: 23% (1451/6307) 2026-10-23T17:02:50.9142473Z Updating files: 24% (1514/6307) 2026-10-23T17:02:50.9168009Z Updating files: 25% (1577/6307) 2026-10-23T17:02:50.9192250Z Updating files: 26% (1640/6307) 2026-10-23T17:02:50.9215996Z Updating files: 27% (1703/6307) 2026-10-23T17:02:50.9244234Z Updating files: 28% (1766/6307) 2026-10-23T17:02:50.9298199Z Updating files: 29% (1830/6307) 2026-10-23T17:02:50.9326513Z Updating files: 30% (1893/6307) 2026-10-23T17:02:50.9355862Z Updating files: 31% (1956/6307) 2026-10-23T17:02:50.9395267Z Updating files: 32% (2019/6307) 2026-10-23T17:02:50.9438947Z Updating files: 33% (2082/6307) 2026-10-23T17:02:50.9532893Z Updating files: 34% (2145/6307) 2026-10-23T17:02:50.9617309Z Updating files: 35% (2208/6307) 2026-10-23T17:02:50.9662175Z Updating files: 36% (2271/6307) 2026-10-23T17:02:50.9709738Z Updating files: 37% (2334/6307) 2026-10-23T17:02:50.9767460Z Updating files: 38% (2397/6307) 2026-10-23T17:02:50.9802723Z Updating files: 39% (2460/6307) 2026-10-23T17:02:50.9847694Z Updating files: 40% (2523/6307) 2026-10-23T17:02:50.9891175Z Updating files: 41% (2586/6307) 2026-10-23T17:02:50.9909882Z Updating files: 42% (2649/6307) 2026-10-23T17:02:50.9924148Z Updating files: 43% (2713/6307) 2026-10-23T17:02:50.9955248Z Updating files: 44% (2776/6307) 2026-10-23T17:02:50.9993233Z Updating files: 45% (2839/6307) 2026-10-23T17:02:51.0026055Z Updating files: 46% (2902/6307) 2026-10-23T17:02:51.0062030Z Updating files: 47% (2965/6307) 2026-10-23T17:02:51.0098727Z Updating files: 48% (3028/6307) 2026-10-23T17:02:51.0136002Z Updating files: 49% (3091/6307) 2026-10-23T17:02:51.0186026Z Updating files: 50% (3154/6307) 2026-10-23T17:02:51.0204779Z Updating files: 51% (3217/6307) 2026-10-23T17:02:51.0249163Z Updating files: 52% (3280/6307) 2026-10-23T17:02:51.0284272Z Updating files: 53% (3343/6307) 2026-10-23T17:02:51.0311334Z Updating files: 54% (3406/6307) 2026-10-23T17:02:51.0344919Z Updating files: 55% (3469/6307) 2026-10-23T17:02:51.0367264Z Updating files: 56% (3532/6307) 2026-10-23T17:02:51.0389841Z Updating files: 57% (3595/6307) 2026-10-23T17:02:51.0416676Z Updating files: 58% (3659/6307) 2026-10-23T17:02:51.0874483Z Updating files: 59% (3722/6307) 2026-10-23T17:02:51.0889965Z Updating files: 60% (3785/6307) 2026-10-23T17:02:51.0913306Z Updating files: 61% (3848/6307) 2026-10-23T17:02:51.0935918Z Updating files: 62% (3911/6307) 2026-10-23T17:02:51.0964579Z Updating files: 63% (3974/6307) 2026-10-23T17:02:51.0998326Z Updating files: 64% (4037/6307) 2026-10-23T17:02:51.1030956Z Updating files: 65% (4100/6307) 2026-10-23T17:02:51.1055902Z Updating files: 66% (4163/6307) 2026-10-23T17:02:51.1100565Z Updating files: 67% (4226/6307) 2026-10-23T17:02:51.1114661Z Updating files: 68% (4289/6307) 2026-10-23T17:02:51.1139525Z Updating files: 69% (4352/6307) 2026-10-23T17:02:51.1156190Z Updating files: 70% (4415/6307) 2026-10-23T17:02:51.1177975Z Updating files: 71% (4478/6307) 2026-10-23T17:02:51.1199229Z Updating files: 72% (4542/6307) 2026-10-23T17:02:51.1238118Z Updating files: 73% (4605/6307) 2026-10-23T17:02:51.1615449Z Updating files: 74% (4668/6307) 2026-10-23T17:02:51.1860571Z Updating files: 75% (4731/6307) 2026-10-23T17:02:51.1892726Z Updating files: 76% (4794/6307) 2026-10-23T17:02:51.1921114Z Updating files: 77% (4857/6307) 2026-10-23T17:02:51.1959137Z Updating files: 78% (4920/6307) 2026-10-23T17:02:51.1986719Z Updating files: 79% (4983/6307) 2026-10-23T17:02:51.2013591Z Updating files: 80% (5046/6307) 2026-10-23T17:02:51.2050480Z Updating files: 81% (5109/6307) 2026-10-23T17:02:51.2069610Z Updating files: 82% (5172/6307) 2026-10-23T17:02:51.2097997Z Updating files: 83% (5235/6307) 2026-10-23T17:02:51.2131257Z Updating files: 84% (5298/6307) 2026-10-23T17:02:51.2163254Z Updating files: 85% (5361/6307) 2026-10-23T17:02:51.2196542Z Updating files: 86% (5425/6307) 2026-10-23T17:02:51.2317665Z Updating files: 87% (5488/6307) 2026-10-23T17:02:51.2364940Z Updating files: 88% (5551/6307) 2026-10-23T17:02:51.2392090Z Updating files: 89% (5614/6307) 2026-10-23T17:02:51.2394940Z Updating files: 90% (5677/6307) 2026-10-23T17:02:51.2427855Z Updating files: 90% (5680/6307) 2026-10-23T17:02:51.2477110Z Updating files: 91% (5740/6307) 2026-10-23T17:02:51.2526197Z Updating files: 92% (5803/6307) 2026-10-23T17:02:51.2534694Z Updating files: 93% (5866/6307) 2026-10-23T17:02:51.2569770Z Updating files: 94% (5929/6307) 2026-10-23T17:02:51.2600393Z Updating files: 95% (5992/6307) 2026-10-23T17:02:51.2673545Z Updating files: 96% (6055/6307) 2026-10-23T17:02:51.2707192Z Updating files: 97% (6118/6307) 2026-10-23T17:02:51.2771287Z Updating files: 98% (6181/6307) 2026-10-23T17:02:51.2800820Z Updating files: 99% (6244/6307) 2026-10-23T17:02:51.2801094Z Updating files: 100% (6307/6307) 2026-10-23T17:02:51.2801272Z Updating files: 100% (6307/6307), done. 2026-10-23T17:02:51.3034339Z Note: switching to 'refs/remotes/pull/22029/merge'. 2026-10-23T17:02:51.3035057Z 2026-10-23T17:02:51.3035247Z You are in 'detached HEAD' state. You can look around, make experimental 2026-10-23T17:02:51.3035682Z changes and commit them, and you can discard any commits you make in this 2026-10-23T17:02:51.3036103Z state without impacting any branches by switching back to a branch. 2026-10-23T17:02:51.3036353Z 2026-10-23T17:02:51.3036527Z If you want to create a new branch to retain commits you create, you may 2026-10-23T17:02:51.3036977Z do so (now or later) by using -c with the switch command. Example: 2026-10-23T17:02:51.3037213Z 2026-10-23T17:02:51.3037337Z git switch -c 2026-10-23T17:02:51.3037485Z 2026-10-23T17:02:51.3037581Z Or undo this operation with: 2026-10-23T17:02:51.3037729Z 2026-10-23T17:02:51.3038030Z git switch - 2026-10-23T17:02:51.3038178Z 2026-10-23T17:02:51.3038378Z Turn off this advice by setting config variable advice.detachedHead to false 2026-10-23T17:02:51.3038926Z 2026-10-23T17:02:51.3039230Z HEAD is now at 6b6b587 Merge e1e024cb0126a66f3a29c963fd9fa421960dd501 into 66ee628e0875b2b735b199f42e6151e347833637 2026-10-23T17:02:51.3056860Z ##[endgroup] 2026-10-23T17:02:51.3128296Z [command]/usr/local/bin/git log -1 --format=%H 2026-10-23T17:02:51.3175360Z 6b6b5873aa83c04fcd1cb5d454558eeeaca1ec93 2026-10-23T17:02:51.3369109Z ##[group]Run files="$(git ls-files .github/pr-assets)" 2026-10-23T17:02:51.3369674Z files="$(git ls-files .github/pr-assets)" 2026-10-23T17:02:51.3370013Z if test -n "$files"; then 2026-10-23T17:02:51.3370441Z  printf 'PR evidence must be uploaded to GitHub, not committed:\n%s\n' "$files" >&2 2026-10-23T17:02:51.3370819Z  exit 1 2026-10-23T17:02:51.3371022Z fi 2026-10-23T17:02:51.3409018Z shell: /usr/bin/bash -e {0} 2026-10-23T17:02:51.3409278Z env: 2026-10-23T17:02:51.3409464Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 195 2026-10-23T17:02:51.3409698Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 729 2026-10-23T17:02:51.3409875Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T17:02:51.3410031Z ##[endgroup] 2026-10-23T17:02:51.3731343Z Prepare all required actions 2026-10-23T17:02:51.3731938Z Getting action download info 2026-10-23T17:02:51.4606510Z Download action repository 'voidzero-dev/setup-vp@v1' (SHA:250f29ce396baf5e8f24498e17c0dfdebabc26eb) 2026-10-23T17:02:51.6243301Z ##[group]Run ./.github/actions/setup-ci-deps 2026-10-23T17:02:51.6243517Z env: 2026-10-23T17:02:51.6243701Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 195 2026-10-23T17:02:51.6243885Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 729 2026-10-23T17:02:51.6244055Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T17:02:51.6244225Z ##[endgroup] 2026-10-23T17:02:51.6413705Z ##[start-action display=Resolve Vite+ version;id=__self.vp] 2026-10-23T17:02:51.6445269Z ##[group]Run echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-23T17:02:51.6445947Z echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-23T17:02:51.6446361Z echo "node=$(jq -r '.engines.node' package.json)" >> "$GITHUB_OUTPUT" 2026-10-23T17:02:51.6446630Z echo "pnpm=$(jq -r '.packageManager' package.json)" >> "$GITHUB_OUTPUT" 2026-10-23T17:02:51.6477143Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T17:02:51.6477350Z env: 2026-10-23T17:02:51.6477501Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 195 2026-10-23T17:02:51.6477675Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 729 2026-10-23T17:02:51.6477837Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T17:02:51.6477996Z ##[endgroup] 2026-10-23T17:02:51.6660943Z ##[end-action id=__self.vp;outcome=success;conclusion=success;duration_ms=24] 2026-10-23T17:02:51.6664880Z ##[start-action display=Cache Vite+;id=__self.vp_cache] 2026-10-23T17:02:51.6772625Z ##[group]Run actions/cache@v6 2026-10-23T17:02:51.6772872Z with: 2026-10-23T17:02:51.6773057Z path: ~/.vite-plus 2026-10-23T17:02:51.6773327Z key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-23T17:02:51.6773684Z enableCrossOsArchive: false 2026-10-23T17:02:51.6773912Z fail-on-cache-miss: false 2026-10-23T17:02:51.6774132Z lookup-only: false 2026-10-23T17:02:51.6774321Z save-always: false 2026-10-23T17:02:51.6774516Z env: 2026-10-23T17:02:51.6774700Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 195 2026-10-23T17:02:51.6774966Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 729 2026-10-23T17:02:51.6775237Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T17:02:51.6775483Z ##[endgroup] 2026-10-23T17:02:51.9712464Z Cache hit for: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-23T17:02:52.7525297Z Received 170349591 of 170349591 (100.0%), 223.2 MBs/sec 2026-10-23T17:02:52.7525729Z Cache Size: ~162 MB (170349591 B) 2026-10-23T17:02:52.7567056Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/0b99e22c-72e5-4a43-a7b6-a46d9855ce6d/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-23T17:02:53.9753598Z Cache restored successfully 2026-10-23T17:02:54.0132139Z Cache restored from key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-23T17:02:54.0374915Z ##[end-action id=__self.vp_cache;outcome=success;conclusion=success;duration_ms=2370] 2026-10-23T17:02:54.0380692Z ##[start-action display=Use cached Vite+;id=__self.__run] 2026-10-23T17:02:54.0437120Z ##[group]Run echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-23T17:02:54.0437625Z echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-23T17:02:54.0437907Z "$HOME/.vite-plus/bin/vp" env use "26.12.1" 2026-10-23T17:02:54.0504370Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T17:02:54.0504851Z env: 2026-10-23T17:02:54.0505192Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 195 2026-10-23T17:02:54.0505485Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 729 2026-10-23T17:02:54.0505925Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T17:02:54.0506222Z ##[endgroup] 2026-10-23T17:02:54.0645609Z Using Node.js v26.12.1 (resolved from 26.12.1) 2026-10-23T17:02:54.0668188Z ##[end-action id=__self.__run;outcome=success;conclusion=success;duration_ms=28] 2026-10-23T17:02:54.0673160Z ##[start-action display=Setup Vite+;id=__self.__voidzero-dev_setup-vp] 2026-10-23T17:02:54.0687256Z ##[end-action id=__self.__voidzero-dev_setup-vp;outcome=skipped;conclusion=skipped;duration_ms=0] 2026-10-23T17:02:54.0690597Z ##[start-action display=Resolve pnpm store path;id=__self.pnpm_store] 2026-10-23T17:02:54.0742781Z ##[group]Run store_path="$(vp pm cache dir)" 2026-10-23T17:02:54.0743074Z store_path="$(vp pm cache dir)" 2026-10-23T17:02:54.0743275Z echo "path=$store_path" >> "$GITHUB_OUTPUT" 2026-10-23T17:02:54.0782414Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T17:02:54.0782634Z env: 2026-10-23T17:02:54.0782819Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 195 2026-10-23T17:02:54.0783507Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 729 2026-10-23T17:02:54.0783693Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T17:02:54.0783864Z ##[endgroup] 2026-10-23T17:02:54.1226671Z ##[end-action id=__self.pnpm_store;outcome=success;conclusion=success;duration_ms=53] 2026-10-23T17:02:54.1230141Z ##[start-action display=Cache full pnpm store;id=__self.__actions_cache] 2026-10-23T17:02:54.3079973Z ##[group]Run actions/cache@v6 2026-10-23T17:02:54.3080240Z with: 2026-10-23T17:02:54.3080459Z path: /home/runner/.local/share/pnpm/store/v11 2026-10-23T17:02:54.3080937Z key: pnpm-full-v1-Linux-X64-2baa264059789b1dde4bbc8fdc5b8342f31f2fc8e6176e5c5e486efdd242b36c 2026-10-23T17:02:54.3081382Z restore-keys: pnpm-full-v1-Linux-X64- 2026-10-23T17:02:54.3081655Z enableCrossOsArchive: false 2026-10-23T17:02:54.3081888Z fail-on-cache-miss: false 2026-10-23T17:02:54.3082120Z lookup-only: false 2026-10-23T17:02:54.3082316Z save-always: false 2026-10-23T17:02:54.3082544Z env: 2026-10-23T17:02:54.3082739Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 195 2026-10-23T17:02:54.3083035Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 729 2026-10-23T17:02:54.3083302Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T17:02:54.3083537Z ##[endgroup] 2026-10-23T17:02:54.5763925Z Cache hit for: pnpm-full-v1-Linux-X64-2baa264059789b1dde4bbc8fdc5b8342f31f2fc8e6176e5c5e486efdd242b36c 2026-10-23T17:02:55.6272012Z Received 234881024 of 994615207 (23.6%), 221.8 MBs/sec 2026-10-23T17:02:56.7541500Z Received 536870912 of 994615207 (54.0%), 239.6 MBs/sec 2026-10-23T17:02:57.7689786Z Received 838860800 of 994615207 (84.3%), 253.8 MBs/sec 2026-10-23T17:02:58.4122493Z Received 994615207 of 994615207 (100.0%), 250.1 MBs/sec 2026-10-23T17:02:58.4122960Z Cache Size: ~949 MB (994615207 B) 2026-10-23T17:02:58.4260693Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/e6f1ae31-59b8-450a-92c4-f42e4244fc09/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-23T17:03:07.7300547Z Cache restored successfully 2026-10-23T17:03:07.8089972Z Cache restored from key: pnpm-full-v1-Linux-X64-2baa264059789b1dde4bbc8fdc5b8342f31f2fc8e6176e5c5e486efdd242b36c 2026-10-23T17:03:07.8244253Z ##[end-action id=__self.__actions_cache;outcome=success;conclusion=success;duration_ms=13701] 2026-10-23T17:03:07.8249426Z ##[start-action display=Install dependencies;id=__self.__run_2] 2026-10-23T17:03:07.8275127Z ##[group]Run vp install 2026-10-23T17:03:07.8275442Z vp install 2026-10-23T17:03:07.8324881Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T17:03:07.8325234Z env: 2026-10-23T17:03:07.8325479Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 195 2026-10-23T17:03:07.8325751Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 729 2026-10-23T17:03:07.8326087Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T17:03:07.8326374Z ##[endgroup] 2026-10-23T17:03:07.9167843Z Scope: all 33 workspace projects 2026-10-23T17:03:08.2020908Z ? Verifying lockfile against supply-chain policies (2088 entries)... 2026-10-23T17:03:08.7563721Z Packages are hard linked from the content-addressable store to the virtual store. 2026-10-23T17:03:08.7564135Z Content-addressable store is at: /home/runner/.local/share/pnpm/store/v11 2026-10-23T17:03:08.7564511Z Virtual store is at: node_modules/.pnpm 2026-10-23T17:03:13.4527951Z ✓ Lockfile passes supply-chain policies (2088 entries in 5.3s) 2026-10-23T17:03:13.4528500Z Lockfile is up to date, resolution step is skipped 2026-10-23T17:03:13.4832079Z Packages: +1721 2026-10-23T17:03:13.4832382Z ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2026-10-23T17:03:13.5428471Z Progress: resolved 1721, reused 1718, downloaded 0, added 1721, done 2026-10-23T17:03:14.8675987Z . prepare$ vp config --no-agent 2026-10-23T17:03:15.0445774Z . prepare: Done 2026-10-23T17:03:15.0470144Z 2026-10-23T17:03:15.0470449Z devDependencies: 2026-10-23T17:03:15.0470697Z + @coderabbitai/config 1.1.0 2026-10-23T17:03:15.0470948Z + @shadcn/lint 0.1.5 2026-10-23T17:03:15.0471159Z + @types/node 24.12.4 2026-10-23T17:03:15.0471373Z + knip 6.34.0 2026-10-23T17:03:15.0471617Z + typescript <- @tsc-rs/typescript 0.8.0 2026-10-23T17:03:15.0471873Z + vite-plus 1.3.0 2026-10-23T17:03:15.0471995Z 2026-10-23T17:03:15.0512729Z Done in 7.2s using pnpm v12.14.0 2026-10-23T17:03:15.0722283Z ##[end-action id=__self.__run_2;outcome=success;conclusion=success;duration_ms=7247] 2026-10-23T17:03:15.1729701Z ##[group]Run actions/cache@v6 2026-10-23T17:03:15.1729908Z with: 2026-10-23T17:03:15.1730041Z path: ~/.cache/electron 2026-10-23T17:03:15.1730289Z key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-23T17:03:15.1730531Z enableCrossOsArchive: false 2026-10-23T17:03:15.1730678Z fail-on-cache-miss: false 2026-10-23T17:03:15.1730818Z lookup-only: false 2026-10-23T17:03:15.1730940Z save-always: false 2026-10-23T17:03:15.1731062Z env: 2026-10-23T17:03:15.1731192Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 195 2026-10-23T17:03:15.1731358Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 729 2026-10-23T17:03:15.1731509Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T17:03:15.1731667Z ##[endgroup] 2026-10-23T17:03:15.4221792Z Cache hit for: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-23T17:03:15.6773878Z Received 122906203 of 122906203 (100.0%), 505.2 MBs/sec 2026-10-23T17:03:15.6774651Z Cache Size: ~117 MB (122906203 B) 2026-10-23T17:03:15.6906747Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/1aed3f9a-c3b3-4a3b-946d-376e24819002/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-23T17:03:15.8278908Z Cache restored successfully 2026-10-23T17:03:15.8545215Z Cache restored from key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-23T17:03:15.8799512Z ##[group]Run vp run --filter @t3tools/desktop ensure:electron 2026-10-23T17:03:15.8800097Z vp run --filter @t3tools/desktop ensure:electron 2026-10-23T17:03:15.8857875Z shell: /usr/bin/bash -e {0} 2026-10-23T17:03:15.8858205Z env: 2026-10-23T17:03:15.8858441Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 195 2026-10-23T17:03:15.8858701Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 729 2026-10-23T17:03:15.8858924Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T17:03:15.8859136Z ##[endgroup] 2026-10-23T17:03:16.2180321Z ~/apps/desktop$ node scripts/ensure-electron-runtime.mjs ⊘ cache disabled 2026-10-23T17:03:16.9847572Z /home/runner/_work/t3code/t3code/node_modules/.pnpm/electron@44.9.3_supports-color@8.1.1/node_modules/electron/dist/electron 2026-10-23T17:03:16.9875959Z 2026-10-23T17:03:17.0112593Z ##[group]Run vp run knip:check 2026-10-23T17:03:17.0112913Z vp run knip:check 2026-10-23T17:03:17.0153036Z shell: /usr/bin/bash -e {0} 2026-10-23T17:03:17.0153457Z env: 2026-10-23T17:03:17.0153720Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 195 2026-10-23T17:03:17.0153912Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 729 2026-10-23T17:03:17.0154117Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T17:03:17.0154431Z ##[endgroup] 2026-10-23T17:03:17.3301975Z $ knip --include files,dependencies --no-config-hints ⊘ cache disabled 2026-10-23T17:03:23.6751323Z 2026-10-23T17:03:23.6754388Z $ knip --workspace apps/server --workspace apps/desktop --workspace apps/web --workspace packages/client-runtime --workspace packages/contracts --workspace packages/effect-acp --workspace packages/effect-codex-app-server --workspace packages/shared --workspace packages/ssh --workspace packages/tailscale --workspace packages/provider-core --workspace packages/provider-acp --workspace packages/provider-acp-registry --workspace packages/provider-testing --workspace packages/provider-pi --workspace packages/provider-muse --workspace packages/provider-opencode --workspace packages/provider-cursor --workspace packages/provider-grok --workspace packages/source-control-core --workspace packages/source-control-azure-devops --workspace packages/source-control-bitbucket --workspace packages/source-control-forgejo --workspace packages/source-control-gitcafe --workspace packages/source-control-github --workspace packages/source-control-gitlab --workspace packages/source-control-testing --exports --preprocessor ./scripts/knip-schemas.ts --no-config-hints ⊘ cache disabled 2026-10-23T17:03:35.4133846Z 2026-10-23T17:03:35.4135410Z --- 2026-10-23T17:03:35.4135913Z vp run: 2/2 successful. (Run `vp run --last-details` for full details) 2026-10-23T17:03:35.4249008Z ##[group]Run vp run --filter @t3tools/source-control-github generate --check 2026-10-23T17:03:35.4249346Z vp run --filter @t3tools/source-control-github generate --check 2026-10-23T17:03:35.4280166Z shell: /usr/bin/bash -e {0} 2026-10-23T17:03:35.4280363Z env: 2026-10-23T17:03:35.4280528Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 195 2026-10-23T17:03:35.4280694Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 729 2026-10-23T17:03:35.4280848Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T17:03:35.4281004Z ##[endgroup] 2026-10-23T17:03:35.6390180Z ~/packages/source-control-github$ graphqlgen --check ⊘ cache disabled 2026-10-23T17:03:35.9515134Z 2026-10-23T17:03:35.9672673Z ##[group]Run vp run --filter t3 generate --check 2026-10-23T17:03:35.9673076Z vp run --filter t3 generate --check 2026-10-23T17:03:35.9700151Z shell: /usr/bin/bash -e {0} 2026-10-23T17:03:35.9700326Z env: 2026-10-23T17:03:35.9700475Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 195 2026-10-23T17:03:35.9700642Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 729 2026-10-23T17:03:35.9700825Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T17:03:35.9701081Z ##[endgroup] 2026-10-23T17:03:36.1964717Z ~/apps/server$ graphqlgen --check ⊘ cache disabled 2026-10-23T17:03:36.4007546Z 2026-10-23T17:03:36.4105636Z ##[group]Run vp check 2026-10-23T17:03:36.4105833Z vp check 2026-10-23T17:03:36.4132603Z shell: /usr/bin/bash -e {0} 2026-10-23T17:03:36.4132768Z env: 2026-10-23T17:03:36.4132904Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 195 2026-10-23T17:03:36.4133081Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 729 2026-10-23T17:03:36.4133287Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T17:03:36.4133541Z ##[endgroup] 2026-10-23T17:03:37.1563617Z pass: All 5664 files are correctly formatted (543ms, 8 threads) 2026-10-23T17:03:47.5822964Z warn: Lint warnings found 2026-10-23T17:03:47.5824997Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T17:03:47.5825430Z ╭─[apps/server/src/processRunner.test.ts:266:14] 2026-10-23T17:03:47.5825661Z 265 │ 2026-10-23T17:03:47.5825931Z 266 │ for (const {} of ["timeout", "success"] as const) { 2026-10-23T17:03:47.5826209Z ·  ── 2026-10-23T17:03:47.5826376Z 267 │ } 2026-10-23T17:03:47.5826517Z ╰──── 2026-10-23T17:03:47.5826849Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T17:03:47.5827121Z 2026-10-23T17:03:47.5827556Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T17:03:47.5828070Z ╭─[apps/server/src/serverRuntimeStartup.ts:728:7] 2026-10-23T17:03:47.5828315Z 727 │ 2026-10-23T17:03:47.5828491Z 728 │ const layer = layerWithOptions(); 2026-10-23T17:03:47.5828765Z ·  ──┬── 2026-10-23T17:03:47.5829018Z · ╰── 'layer' is declared here 2026-10-23T17:03:47.5829237Z ╰──── 2026-10-23T17:03:47.5829425Z  help: Consider removing this declaration. 2026-10-23T17:03:47.5829562Z 2026-10-23T17:03:47.5829883Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-23T17:03:47.5830357Z ╭─[apps/server/src/terminal/Manager.test.ts:731:31] 2026-10-23T17:03:47.5830583Z 730 │ ); 2026-10-23T17:03:47.5830863Z 731 │ const snapshot = events.filter((event) => event.type === "snapshot").at(-1)?.snapshot; 2026-10-23T17:03:47.5831229Z ·  ────── 2026-10-23T17:03:47.5831619Z 732 │ expect(snapshot?.history).toBe("aa😀\rEND"); 2026-10-23T17:03:47.5831808Z ╰──── 2026-10-23T17:03:47.5832109Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-23T17:03:47.5832309Z 2026-10-23T17:03:47.5832481Z ⚠ react(immutability): This value cannot be modified 2026-10-23T17:03:47.5832909Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5] 2026-10-23T17:03:47.5833160Z 90 │ }) { 2026-10-23T17:03:47.5833376Z 91 │ const rotation = useSharedValue(props.hidden ? 1 : 0); 2026-10-23T17:03:47.5833615Z ·  ────┬─── 2026-10-23T17:03:47.5834064Z · ╰── `rotation` originates here 2026-10-23T17:03:47.5834355Z 92 │ useLayoutEffect(() => { 2026-10-23T17:03:47.5834632Z 93 │ rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING); 2026-10-23T17:03:47.5834901Z ·  ────┬─── 2026-10-23T17:03:47.5835154Z · ╰── `rotation` cannot be modified 2026-10-23T17:03:47.5835404Z 94 │ }, [props.hidden, rotation]); 2026-10-23T17:03:47.5835576Z ╰──── 2026-10-23T17:03:47.5835954Z  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-23T17:03:47.5836626Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T17:03:47.5836949Z 2026-10-23T17:03:47.5837181Z ⚠ react(immutability): This value cannot be modified 2026-10-23T17:03:47.5837840Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:269:5] 2026-10-23T17:03:47.5838322Z 266 │ const variant = props.variant ?? "plain"; 2026-10-23T17:03:47.5838746Z 267 │ const loadingVisibility = useSharedValue(props.loading ? 1 : 0); 2026-10-23T17:03:47.5839042Z ·  ────────┬──────── 2026-10-23T17:03:47.5839331Z · ╰── `loadingVisibility` originates here 2026-10-23T17:03:47.5839657Z 268 │ useLayoutEffect(() => { 2026-10-23T17:03:47.5840023Z 269 │ loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING); 2026-10-23T17:03:47.5840360Z ·  ────────┬──────── 2026-10-23T17:03:47.5840657Z · ╰── `loadingVisibility` cannot be modified 2026-10-23T17:03:47.5840972Z 270 │ }, [loadingVisibility, props.loading]); 2026-10-23T17:03:47.5841188Z ╰──── 2026-10-23T17:03:47.5841545Z  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-23T17:03:47.5842221Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T17:03:47.5842594Z 2026-10-23T17:03:47.5842767Z ⚠ react(immutability): This value cannot be modified 2026-10-23T17:03:47.5843201Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:328:5] 2026-10-23T17:03:47.5843455Z 325 │ }) { 2026-10-23T17:03:47.5843714Z 326 │ const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0); 2026-10-23T17:03:47.5844045Z ·  ─────────┬───────── 2026-10-23T17:03:47.5844352Z · ╰── `recordingVisibility` originates here 2026-10-23T17:03:47.5844609Z 327 │ useLayoutEffect(() => { 2026-10-23T17:03:47.5844932Z 328 │ recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING); 2026-10-23T17:03:47.5845241Z ·  ─────────┬───────── 2026-10-23T17:03:47.5845590Z · ╰── `recordingVisibility` cannot be modified 2026-10-23T17:03:47.5845878Z 329 │ }, [props.phase, recordingVisibility]); 2026-10-23T17:03:47.5846119Z ╰──── 2026-10-23T17:03:47.5846637Z  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-23T17:03:47.5847349Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T17:03:47.5847720Z 2026-10-23T17:03:47.5847981Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T17:03:47.5848428Z ╭─[apps/mobile/src/components/ComposerContextSheet.tsx:267:25] 2026-10-23T17:03:47.5848729Z 266 │ {record.elements?.map((element, index) => ( 2026-10-23T17:03:47.5849095Z 267 │ 2026-10-23T17:03:47.5849536Z ·  ─────────────────────────────────────────────────────── 2026-10-23T17:03:47.5849874Z 268 │ (VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-23T17:03:47.5859390Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-23T17:03:47.5859918Z ·  ───────────┬────────── 2026-10-23T17:03:47.5860298Z · ╰── Cannot access ref value during render 2026-10-23T17:03:47.5860655Z 123 │ const sessionRef = useRef(null); 2026-10-23T17:03:47.5860905Z ╰──── 2026-10-23T17:03:47.5861655Z  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-23T17:03:47.5862731Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.5863048Z 2026-10-23T17:03:47.5863269Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.5863650Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8] 2026-10-23T17:03:47.5864205Z 125 │ 2026-10-23T17:03:47.5864559Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T17:03:47.5864825Z ·  ─────────┬──────── 2026-10-23T17:03:47.5865235Z · ╰── Cannot access ref value during render 2026-10-23T17:03:47.5865573Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-23T17:03:47.5865775Z ╰──── 2026-10-23T17:03:47.5866412Z  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-23T17:03:47.5867512Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.5867939Z 2026-10-23T17:03:47.5868225Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.5868712Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7] 2026-10-23T17:03:47.5869072Z 125 │ 2026-10-23T17:03:47.5869271Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T17:03:47.5869561Z ·  ─────────┬───────── 2026-10-23T17:03:47.5870022Z · ╰── Cannot access ref value during render 2026-10-23T17:03:47.5870302Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-23T17:03:47.5870497Z ╰──── 2026-10-23T17:03:47.5871210Z  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-23T17:03:47.5872167Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.5872523Z 2026-10-23T17:03:47.5872695Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.5873085Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31] 2026-10-23T17:03:47.5873367Z 125 │ 2026-10-23T17:03:47.5873574Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T17:03:47.5873916Z ·  ─────────┬───────── 2026-10-23T17:03:47.5874270Z · ╰── Cannot access ref value during render 2026-10-23T17:03:47.5874633Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-23T17:03:47.5874890Z ╰──── 2026-10-23T17:03:47.5875500Z  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-23T17:03:47.5876292Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.5876613Z 2026-10-23T17:03:47.5876856Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.5877261Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30] 2026-10-23T17:03:47.5877576Z 125 │ 2026-10-23T17:03:47.5877789Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T17:03:47.5878331Z ·  ──────────┬───────── 2026-10-23T17:03:47.5879009Z · ╰── Cannot access ref value during render 2026-10-23T17:03:47.5879320Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-23T17:03:47.5879521Z ╰──── 2026-10-23T17:03:47.5880249Z  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-23T17:03:47.5881575Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.5882067Z 2026-10-23T17:03:47.5882321Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.5882743Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46] 2026-10-23T17:03:47.5883090Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T17:03:47.5883539Z 127 │ ╭─▶ const recorder = createLazyVoiceRecorder({ 2026-10-23T17:03:47.5884101Z 128 │ │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-23T17:03:47.5884533Z 129 │ │ onStatus: (status: RecordingStatus) => { 2026-10-23T17:03:47.5884935Z 130 │ │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-23T17:03:47.5885282Z 131 │ │ isFinished: status.isFinished, 2026-10-23T17:03:47.5885740Z 132 │ │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-23T17:03:47.5886079Z 133 │ │ error: status.error, 2026-10-23T17:03:47.5886334Z 134 │ │ url: status.url, 2026-10-23T17:03:47.5886571Z 135 │ │ }); 2026-10-23T17:03:47.5886785Z 136 │ │ }, 2026-10-23T17:03:47.5887174Z 137 │ │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-23T17:03:47.5887646Z 138 │ │ selectInput: (inputs) => { 2026-10-23T17:03:47.5887982Z 139 │ │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-23T17:03:47.5888345Z 140 │ │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-23T17:03:47.5889102Z 141 │ │ const known = microphoneOrder(preferences.value.microphones); 2026-10-23T17:03:47.5889695Z 142 │ │ const order = rememberMicrophones(known, inputs); 2026-10-23T17:03:47.5890098Z 143 │ │ if (order !== known) { 2026-10-23T17:03:47.5890460Z 144 │ │ registry.set(updateMobilePreferencesAtom, { 2026-10-23T17:03:47.5890763Z 145 │ │ transform: (current) => ({ 2026-10-23T17:03:47.5891144Z 146 │ │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-23T17:03:47.5891464Z 147 │ │ }), 2026-10-23T17:03:47.5891907Z 148 │ │ }); 2026-10-23T17:03:47.5892174Z 149 │ │ } 2026-10-23T17:03:47.5936733Z 150 │ │ return preferredMicrophoneInput(inputs, order); 2026-10-23T17:03:47.5937081Z 151 │ │ }, 2026-10-23T17:03:47.5937376Z 152 │ ├─▶ }); 2026-10-23T17:03:47.5937874Z · ╰──── Passing a ref to a function may read its value during render 2026-10-23T17:03:47.5938253Z 153 │ recorderRef.current = recorder; 2026-10-23T17:03:47.5938454Z ╰──── 2026-10-23T17:03:47.5939073Z  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-23T17:03:47.5941311Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.5941946Z 2026-10-23T17:03:47.5942612Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.5942974Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16] 2026-10-23T17:03:47.5943251Z 152 │ }); 2026-10-23T17:03:47.5943443Z 153 │ recorderRef.current = recorder; 2026-10-23T17:03:47.5943725Z ·  ─────┬─────────┬─── 2026-10-23T17:03:47.5944055Z · │ ╰── Cannot update ref value during render 2026-10-23T17:03:47.5944399Z · ╰── This value is a ref 2026-10-23T17:03:47.5944691Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-23T17:03:47.5944905Z ╰──── 2026-10-23T17:03:47.5945512Z  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-23T17:03:47.5946379Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.5946679Z 2026-10-23T17:03:47.5946842Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.5947185Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48] 2026-10-23T17:03:47.5947457Z 153 │ recorderRef.current = recorder; 2026-10-23T17:03:47.5947849Z 154 │ ╭─▶ sessionRef.current = new VoiceInputSession({ 2026-10-23T17:03:47.5949235Z 155 │ │ recorder, 2026-10-23T17:03:47.5949742Z 156 │ │ getTranscriber: getLocalVoiceTranscriber, 2026-10-23T17:03:47.5950023Z 157 │ │ requestPermission: async () => { 2026-10-23T17:03:47.5950343Z 158 │ │ const permission = await requestRecordingPermissionsAsync(); 2026-10-23T17:03:47.5950717Z 159 │ │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-23T17:03:47.5951058Z 160 │ │ }, 2026-10-23T17:03:47.5951325Z 161 │ │ configureRecording: configureVoiceRecordingAudio, 2026-10-23T17:03:47.5951634Z 162 │ │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-23T17:03:47.5951933Z 163 │ │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-23T17:03:47.5952208Z 164 │ │ onStateChange: (nextState) => 2026-10-23T17:03:47.5952433Z 165 │ │ setState({ 2026-10-23T17:03:47.5952656Z 166 │ │ state: nextState, 2026-10-23T17:03:47.5952977Z 167 │ │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-23T17:03:47.5953283Z 168 │ │ label: sessionRef.current?.label ?? null, 2026-10-23T17:03:47.5953518Z 169 │ │ }), 2026-10-23T17:03:47.5953772Z 170 │ ├─▶ }); 2026-10-23T17:03:47.5954119Z · ╰──── Cannot access ref value during render 2026-10-23T17:03:47.5954386Z 171 │ } 2026-10-23T17:03:47.5954526Z ╰──── 2026-10-23T17:03:47.5955144Z  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-23T17:03:47.5955909Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.5956209Z 2026-10-23T17:03:47.5956382Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.5956710Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15] 2026-10-23T17:03:47.5956983Z 153 │ recorderRef.current = recorder; 2026-10-23T17:03:47.5957262Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-23T17:03:47.5959290Z ·  ─────┬────────┬─── 2026-10-23T17:03:47.5959834Z · │ ╰── Cannot update ref value during render 2026-10-23T17:03:47.5960207Z · ╰── This value is a ref 2026-10-23T17:03:47.5960446Z 155 │ recorder, 2026-10-23T17:03:47.5960610Z ╰──── 2026-10-23T17:03:47.5961173Z  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-23T17:03:47.5961928Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.5962222Z 2026-10-23T17:03:47.5962796Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.5963349Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7] 2026-10-23T17:03:47.5963649Z 184 │ return () => subscription.remove(); 2026-10-23T17:03:47.5963856Z 185 │ }, [controller]); 2026-10-23T17:03:47.5964091Z ·  ─────┬──── 2026-10-23T17:03:47.5964370Z · ╰── Cannot access ref value during render 2026-10-23T17:03:47.5964643Z 186 │ 2026-10-23T17:03:47.5964777Z ╰──── 2026-10-23T17:03:47.5965379Z  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-23T17:03:47.5966173Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.5966477Z 2026-10-23T17:03:47.5966649Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.5966989Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6] 2026-10-23T17:03:47.5967299Z 184 │ return () => subscription.remove(); 2026-10-23T17:03:47.5968120Z 185 │ }, [controller]); 2026-10-23T17:03:47.5968368Z ·  ──────┬───── 2026-10-23T17:03:47.5968664Z · ╰── Cannot access ref value during render 2026-10-23T17:03:47.5968896Z 186 │ 2026-10-23T17:03:47.5969044Z ╰──── 2026-10-23T17:03:47.5969591Z  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-23T17:03:47.5970385Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.5970722Z 2026-10-23T17:03:47.5970876Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.5971204Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6] 2026-10-23T17:03:47.5971435Z 191 │ }, 2026-10-23T17:03:47.5971591Z 192 │ [controller, recorder], 2026-10-23T17:03:47.5971770Z ·  ─────┬──── 2026-10-23T17:03:47.5972025Z · ╰── Cannot access ref value during render 2026-10-23T17:03:47.5972238Z 193 │ ); 2026-10-23T17:03:47.5972376Z ╰──── 2026-10-23T17:03:47.5972958Z  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-23T17:03:47.5973681Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.5973965Z 2026-10-23T17:03:47.5974114Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.5974481Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20] 2026-10-23T17:03:47.5974771Z 174 │ const controller = session.controller; 2026-10-23T17:03:47.5974981Z 175 │ const recorder = recorderRef.current; 2026-10-23T17:03:47.5975417Z ·  ─────────┬───────── 2026-10-23T17:03:47.5975803Z · ╰── Cannot access ref value during render 2026-10-23T17:03:47.5976023Z 176 │ 2026-10-23T17:03:47.5976150Z ╰──── 2026-10-23T17:03:47.5976739Z  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-23T17:03:47.5977482Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.5977759Z 2026-10-23T17:03:47.5977927Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.5978263Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5] 2026-10-23T17:03:47.5978505Z 191 │ }, 2026-10-23T17:03:47.5978678Z 192 │ [controller, recorder], 2026-10-23T17:03:47.5978876Z ·  ───────────┬────────── 2026-10-23T17:03:47.5979192Z · ╰── Cannot access ref value during render 2026-10-23T17:03:47.5979438Z 193 │ ); 2026-10-23T17:03:47.5979568Z ╰──── 2026-10-23T17:03:47.5980141Z  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-23T17:03:47.5980863Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.5981149Z 2026-10-23T17:03:47.5981306Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.5981679Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20] 2026-10-23T17:03:47.5981958Z 245 │ return () => clearInterval(intervalId); 2026-10-23T17:03:47.5982199Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-23T17:03:47.5982435Z ·  ─────┬──── 2026-10-23T17:03:47.5982711Z · ╰── Cannot access ref value during render 2026-10-23T17:03:47.5982936Z 247 │ 2026-10-23T17:03:47.5983058Z ╰──── 2026-10-23T17:03:47.5983655Z  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-23T17:03:47.5984408Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.5984693Z 2026-10-23T17:03:47.5984853Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.5985174Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6] 2026-10-23T17:03:47.5985446Z 245 │ return () => clearInterval(intervalId); 2026-10-23T17:03:47.5985700Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-23T17:03:47.5986020Z ·  ────────────────────────┬─────────────────────── 2026-10-23T17:03:47.5986543Z · ╰── Cannot access ref value during render 2026-10-23T17:03:47.5986846Z 247 │ 2026-10-23T17:03:47.5986970Z ╰──── 2026-10-23T17:03:47.5987514Z  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-23T17:03:47.5988290Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.5988575Z 2026-10-23T17:03:47.5988729Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.5989043Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5] 2026-10-23T17:03:47.5989297Z 260 │ setOwnerFocused, 2026-10-23T17:03:47.5989464Z 261 │ session, 2026-10-23T17:03:47.5989634Z ·  ───┬─── 2026-10-23T17:03:47.5989977Z · ╰── Cannot access ref value during render 2026-10-23T17:03:47.5990218Z 262 │ stop, 2026-10-23T17:03:47.5990352Z ╰──── 2026-10-23T17:03:47.5990890Z  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-23T17:03:47.5991626Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.5991950Z 2026-10-23T17:03:47.5992116Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.5992438Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10] 2026-10-23T17:03:47.5992679Z 250 │ 2026-10-23T17:03:47.5992905Z 251 │ ╭─▶ return { 2026-10-23T17:03:47.5993276Z 252 │ │ isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null, 2026-10-23T17:03:47.5993577Z 253 │ │ state, 2026-10-23T17:03:47.5993798Z 254 │ │ audioLevels, 2026-10-23T17:03:47.5994037Z 255 │ │ elapsedSeconds, 2026-10-23T17:03:47.5994308Z 256 │ │ isBusy: voiceInputBlocksSubmission(state), 2026-10-23T17:03:47.5994558Z 257 │ │ ownerKey, 2026-10-23T17:03:47.5994742Z 258 │ │ label, 2026-10-23T17:03:47.5994956Z 259 │ │ focusedOwners, 2026-10-23T17:03:47.5995182Z 260 │ │ setOwnerFocused, 2026-10-23T17:03:47.5995388Z 261 │ │ session, 2026-10-23T17:03:47.5995578Z 262 │ │ stop, 2026-10-23T17:03:47.5995764Z 263 │ │ cancel, 2026-10-23T17:03:47.5996047Z 264 │ ├─▶ }; 2026-10-23T17:03:47.5996414Z · ╰──── Cannot access ref value during render 2026-10-23T17:03:47.5996672Z 265 │ } 2026-10-23T17:03:47.5996797Z ╰──── 2026-10-23T17:03:47.5997516Z  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-23T17:03:47.5998363Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.5998824Z 2026-10-23T17:03:47.5998998Z ⚠ react(immutability): This value cannot be modified 2026-10-23T17:03:47.5999337Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-23T17:03:47.5999704Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-23T17:03:47.6000054Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-23T17:03:47.6000307Z ·  ─────┬───── 2026-10-23T17:03:47.6000572Z · ╰── `audioLevels` originates here 2026-10-23T17:03:47.6000884Z 123 │ const sessionRef = useRef(null); 2026-10-23T17:03:47.6001221Z 124 │ const recorderRef = useRef | null>(null); 2026-10-23T17:03:47.6001495Z 125 │ 2026-10-23T17:03:47.6001682Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T17:03:47.6001958Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-23T17:03:47.6002265Z 128 │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-23T17:03:47.6002540Z 129 │ onStatus: (status: RecordingStatus) => { 2026-10-23T17:03:47.6002798Z 130 │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-23T17:03:47.6003054Z 131 │ isFinished: status.isFinished, 2026-10-23T17:03:47.6003319Z 132 │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-23T17:03:47.6003571Z 133 │ error: status.error, 2026-10-23T17:03:47.6003761Z 134 │ url: status.url, 2026-10-23T17:03:47.6003936Z 135 │ }); 2026-10-23T17:03:47.6004081Z 136 │ }, 2026-10-23T17:03:47.6004326Z 137 │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-23T17:03:47.6004588Z 138 │ selectInput: (inputs) => { 2026-10-23T17:03:47.6004828Z 139 │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-23T17:03:47.6005103Z 140 │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-23T17:03:47.6005425Z 141 │ const known = microphoneOrder(preferences.value.microphones); 2026-10-23T17:03:47.6005702Z 142 │ const order = rememberMicrophones(known, inputs); 2026-10-23T17:03:47.6005911Z 143 │ if (order !== known) { 2026-10-23T17:03:47.6006127Z 144 │ registry.set(updateMobilePreferencesAtom, { 2026-10-23T17:03:47.6006607Z 145 │ transform: (current) => ({ 2026-10-23T17:03:47.6006985Z 146 │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-23T17:03:47.6007252Z 147 │ }), 2026-10-23T17:03:47.6007458Z 148 │ }); 2026-10-23T17:03:47.6007621Z 149 │ } 2026-10-23T17:03:47.6007816Z 150 │ return preferredMicrophoneInput(inputs, order); 2026-10-23T17:03:47.6008021Z 151 │ }, 2026-10-23T17:03:47.6008163Z 152 │ }); 2026-10-23T17:03:47.6008331Z 153 │ recorderRef.current = recorder; 2026-10-23T17:03:47.6008556Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-23T17:03:47.6008748Z 155 │ recorder, 2026-10-23T17:03:47.6008940Z 156 │ getTranscriber: getLocalVoiceTranscriber, 2026-10-23T17:03:47.6009158Z 157 │ requestPermission: async () => { 2026-10-23T17:03:47.6009425Z 158 │ const permission = await requestRecordingPermissionsAsync(); 2026-10-23T17:03:47.6009860Z 159 │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-23T17:03:47.6010116Z 160 │ }, 2026-10-23T17:03:47.6010305Z 161 │ configureRecording: configureVoiceRecordingAudio, 2026-10-23T17:03:47.6010556Z 162 │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-23T17:03:47.6010796Z 163 │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-23T17:03:47.6011016Z 164 │ onStateChange: (nextState) => 2026-10-23T17:03:47.6011202Z 165 │ setState({ 2026-10-23T17:03:47.6011381Z 166 │ state: nextState, 2026-10-23T17:03:47.6011607Z 167 │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-23T17:03:47.6011905Z 168 │ label: sessionRef.current?.label ?? null, 2026-10-23T17:03:47.6012124Z 169 │ }), 2026-10-23T17:03:47.6012283Z 170 │ }); 2026-10-23T17:03:47.6012433Z 171 │ } 2026-10-23T17:03:47.6012565Z 172 │ 2026-10-23T17:03:47.6012730Z 173 │ const session = sessionRef.current; 2026-10-23T17:03:47.6012939Z 174 │ const controller = session.controller; 2026-10-23T17:03:47.6013150Z 175 │ const recorder = recorderRef.current; 2026-10-23T17:03:47.6013322Z 176 │ 2026-10-23T17:03:47.6013465Z 177 │ useEffect(() => { 2026-10-23T17:03:47.6013725Z 178 │ const subscription = AppState.addEventListener("change", (nextState) => { 2026-10-23T17:03:47.6014083Z 179 │ // iOS reports `inactive` while its permission dialog is open. Only the 2026-10-23T17:03:47.6014407Z 180 │ // real background state cancels preparation; recorder status handles 2026-10-23T17:03:47.6014669Z 181 │ // calls and route interruptions during capture. 2026-10-23T17:03:47.6014963Z 182 │ if (nextState === "background") controller.appMovedToBackground(); 2026-10-23T17:03:47.6015190Z 183 │ }); 2026-10-23T17:03:47.6015365Z 184 │ return () => subscription.remove(); 2026-10-23T17:03:47.6015546Z 185 │ }, [controller]); 2026-10-23T17:03:47.6015703Z 186 │ 2026-10-23T17:03:47.6015833Z 187 │ useEffect( 2026-10-23T17:03:47.6015981Z 188 │ () => () => { 2026-10-23T17:03:47.6016200Z 189 │ controller.dispose(); 2026-10-23T17:03:47.6016393Z 190 │ recorder.release(); 2026-10-23T17:03:47.6016562Z 191 │ }, 2026-10-23T17:03:47.6016718Z 192 │ [controller, recorder], 2026-10-23T17:03:47.6016874Z 193 │ ); 2026-10-23T17:03:47.6017003Z 194 │ 2026-10-23T17:03:47.6017135Z 195 │ useEffect(() => { 2026-10-23T17:03:47.6017338Z 196 │ if (state.phase !== "recording") return; 2026-10-23T17:03:47.6017518Z 197 │ 2026-10-23T17:03:47.6017908Z 198 │ const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`; 2026-10-23T17:03:47.6018320Z 199 │ const activation = activateKeepAwakeAsync(tag); 2026-10-23T17:03:47.6018576Z 200 │ void activation.catch(() => {}); 2026-10-23T17:03:47.6018755Z 201 │ return () => { 2026-10-23T17:03:47.6019003Z 202 │ // Release after activation settles, even if the recording ends immediately. 2026-10-23T17:03:47.6019320Z 203 │ void activation.then(() => deactivateKeepAwake(tag)).catch(() => {}); 2026-10-23T17:03:47.6019559Z 204 │ }; 2026-10-23T17:03:47.6019778Z 205 │ }, [keepAwakeId, state.phase]); 2026-10-23T17:03:47.6019951Z 206 │ 2026-10-23T17:03:47.6020096Z 207 │ useEffect(() => { 2026-10-23T17:03:47.6020331Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-23T17:03:47.6020590Z 209 │ 2026-10-23T17:03:47.6020819Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-23T17:03:47.6021137Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-23T17:03:47.6021419Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-23T17:03:47.6021654Z ·  ─────┬───── 2026-10-23T17:03:47.6021931Z · ╰── `audioLevels` cannot be modified 2026-10-23T17:03:47.6022160Z 213 │ } 2026-10-23T17:03:47.6022291Z ╰──── 2026-10-23T17:03:47.6022645Z  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-23T17:03:47.6023319Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T17:03:47.6023634Z 2026-10-23T17:03:47.6023861Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T17:03:47.6024252Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-23T17:03:47.6024489Z 206 │ 2026-10-23T17:03:47.6024649Z 207 │ useEffect(() => { 2026-10-23T17:03:47.6024832Z ·  ───┬─── 2026-10-23T17:03:47.6025374Z · ╰── This function may (indirectly) reassign or modify `audioLevels` after render 2026-10-23T17:03:47.6025950Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-23T17:03:47.6026290Z 209 │ 2026-10-23T17:03:47.6026541Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-23T17:03:47.6026948Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-23T17:03:47.6027382Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-23T17:03:47.6027656Z ·  ─────┬───── 2026-10-23T17:03:47.6027963Z · ╰── This modifies `audioLevels` 2026-10-23T17:03:47.6028264Z 213 │ } 2026-10-23T17:03:47.6028404Z ╰──── 2026-10-23T17:03:47.6028839Z  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-23T17:03:47.6029526Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T17:03:47.6029941Z 2026-10-23T17:03:47.6030192Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-23T17:03:47.6030952Z ╭─[apps/mobile/src/lib/markdownDocument.ts:138:28] 2026-10-23T17:03:47.6031398Z 137 │ visit(parser.parse(markdown)); 2026-10-23T17:03:47.6031606Z 138 │ for (const edit of edits.reverse()) 2026-10-23T17:03:47.6031922Z ·  ─────── 2026-10-23T17:03:47.6032376Z 139 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-23T17:03:47.6032703Z ╰──── 2026-10-23T17:03:47.6033068Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-23T17:03:47.6033338Z 2026-10-23T17:03:47.6033609Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-23T17:03:47.6033964Z ╭─[apps/mobile/src/lib/markdownDocument.ts:169:28] 2026-10-23T17:03:47.6034200Z 168 │ visit(parser.parse(markdown)); 2026-10-23T17:03:47.6034417Z 169 │ for (const edit of edits.reverse()) 2026-10-23T17:03:47.6034635Z ·  ─────── 2026-10-23T17:03:47.6034994Z 170 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-23T17:03:47.6035243Z ╰──── 2026-10-23T17:03:47.6035640Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-23T17:03:47.6035902Z 2026-10-23T17:03:47.6036123Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-23T17:03:47.6036469Z ╭─[apps/mobile/src/lib/markdownDocument.ts:223:38] 2026-10-23T17:03:47.6036708Z 222 │ visit(parser.parse(markdown)); 2026-10-23T17:03:47.6036929Z 223 │ for (const lineStart of lineStarts.reverse()) { 2026-10-23T17:03:47.6037216Z ·  ─────── 2026-10-23T17:03:47.6037540Z 224 │ // The header row may be a lazy line without its container markers (`>` or list indent), 2026-10-23T17:03:47.6037773Z ╰──── 2026-10-23T17:03:47.6038100Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-23T17:03:47.6038364Z 2026-10-23T17:03:47.6039839Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T17:03:47.6040213Z ╭─[apps/mobile/src/components/ComposerEditor.tsx:82:6] 2026-10-23T17:03:47.6040438Z 81 │ }, 2026-10-23T17:03:47.6040609Z 82 │ [draftKey], 2026-10-23T17:03:47.6040782Z ·  ────┬─── 2026-10-23T17:03:47.6041039Z · ╰── Unnecessary dependency `draftKey` 2026-10-23T17:03:47.6041250Z 83 │ ); 2026-10-23T17:03:47.6041382Z ╰──── 2026-10-23T17:03:47.6041788Z  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-23T17:03:47.6042423Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6042724Z 2026-10-23T17:03:47.6043005Z ⚠ unicorn(prefer-add-event-listener): Prefer `addEventListener()` over their `on`-function counterparts. 2026-10-23T17:03:47.6043421Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:12:14] 2026-10-23T17:03:47.6044139Z 11 │ addEventListener(_type: string, listener: (event: { data: string }) => void) { 2026-10-23T17:03:47.6044519Z 12 │ this.onmessage = listener; 2026-10-23T17:03:47.6044718Z ·  ───────── 2026-10-23T17:03:47.6044888Z 13 │ } 2026-10-23T17:03:47.6045038Z ╰──── 2026-10-23T17:03:47.6045445Z  help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on` replaces any previously registered handler. 2026-10-23T17:03:47.6045759Z 2026-10-23T17:03:47.6045993Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-23T17:03:47.6046428Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:16:9] 2026-10-23T17:03:47.6046735Z 15 │ constructor() { 2026-10-23T17:03:47.6046996Z 16 │ source = this; 2026-10-23T17:03:47.6047270Z ·  ────── 2026-10-23T17:03:47.6047538Z 17 │ } 2026-10-23T17:03:47.6047803Z ╰──── 2026-10-23T17:03:47.6048338Z  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-23T17:03:47.6048758Z 2026-10-23T17:03:47.6049005Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-23T17:03:47.6049413Z ╭─[apps/mobile/src/lib/useHoverGesture.ts:8:15] 2026-10-23T17:03:47.6049654Z 7 │ () => 2026-10-23T17:03:47.6049868Z 8 │ Gesture.Hover() 2026-10-23T17:03:47.6050066Z ·  ──┬── 2026-10-23T17:03:47.6050354Z · ╰── `Hover` may be a component 2026-10-23T17:03:47.6050604Z 9 │ .manualActivation(true) 2026-10-23T17:03:47.6050824Z ╰──── 2026-10-23T17:03:47.6051210Z  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-23T17:03:47.6052026Z  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-23T17:03:47.6052502Z 2026-10-23T17:03:47.6052748Z ⚠ eslint(no-unused-vars): Function 'assertUserMessagesExclude' is declared but never used. 2026-10-23T17:03:47.6053158Z ╭─[apps/server/src/orchestration-v2/testkit/fixtures/shared.ts:1398:10] 2026-10-23T17:03:47.6053398Z 1397 │ 2026-10-23T17:03:47.6053579Z 1398 │ function assertUserMessagesExclude( 2026-10-23T17:03:47.6053821Z ·  ────────────┬──────────── 2026-10-23T17:03:47.6054158Z · ╰── 'assertUserMessagesExclude' is declared here 2026-10-23T17:03:47.6054482Z 1399 │ projection: OrchestrationV2ThreadProjection, 2026-10-23T17:03:47.6054680Z ╰──── 2026-10-23T17:03:47.6054856Z  help: Consider removing this declaration. 2026-10-23T17:03:47.6054985Z 2026-10-23T17:03:47.6055204Z ⚠ eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used. 2026-10-23T17:03:47.6055509Z ╭─[apps/web/src/types.ts:22:3] 2026-10-23T17:03:47.6055721Z 21 │ EnvironmentThreadShell, 2026-10-23T17:03:47.6055892Z 22 │ ThreadRunSummary, 2026-10-23T17:03:47.6056089Z ·  ────────┬─────── 2026-10-23T17:03:47.6056624Z · ╰── 'ThreadRunSummary' is imported here 2026-10-23T17:03:47.6056936Z 23 │ ThreadRuntimeSummary, 2026-10-23T17:03:47.6057102Z ╰──── 2026-10-23T17:03:47.6057278Z  help: Consider removing this import. 2026-10-23T17:03:47.6057407Z 2026-10-23T17:03:47.6057653Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-23T17:03:47.6058008Z ╭─[packages/shared/src/serverSettings.ts:346:9] 2026-10-23T17:03:47.6058258Z 345 │ const entry: ProjectSettingsOverrides = { 2026-10-23T17:03:47.6058562Z 346 │ ...(entries.get(projectId) ?? currentEntries[projectId] ?? {}), 2026-10-23T17:03:47.6058895Z ·  ────────────────────────────────────────────────────────────── 2026-10-23T17:03:47.6059128Z 347 │ }; 2026-10-23T17:03:47.6059269Z ╰──── 2026-10-23T17:03:47.6059621Z  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-23T17:03:47.6059934Z 2026-10-23T17:03:47.6060167Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in Array.prototype.reduce() 2026-10-23T17:03:47.6060558Z ╭─[packages/shared/src/serverSettings.ts:448:24] 2026-10-23T17:03:47.6060799Z 447 │ const favorites = 2026-10-23T17:03:47.6061019Z 448 │ setModelFavorites?.reduce((current, change) => { 2026-10-23T17:03:47.6061274Z ·  ───┬── 2026-10-23T17:03:47.6061529Z · ╰── For this reduce 2026-10-23T17:03:47.6061762Z 449 │ const exists = current.some( 2026-10-23T17:03:47.6062069Z 450 │ (favorite) => favorite.provider === change.provider && favorite.model === change.model, 2026-10-23T17:03:47.6062329Z 451 │ ); 2026-10-23T17:03:47.6062503Z 452 │ return change.favorite 2026-10-23T17:03:47.6062685Z 453 │ ? exists 2026-10-23T17:03:47.6062863Z 454 │ ? current 2026-10-23T17:03:47.6063138Z 455 │ : [...current, { provider: change.provider, model: change.model }] 2026-10-23T17:03:47.6063417Z ·  ─────┬──── 2026-10-23T17:03:47.6063659Z · ╰── From this spread 2026-10-23T17:03:47.6063884Z 456 │ : current.filter( 2026-10-23T17:03:47.6064034Z ╰──── 2026-10-23T17:03:47.6064319Z  help: Consider using `Object.assign()` or `Array.prototype.push()` to mutate the accumulator instead. 2026-10-23T17:03:47.6064712Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-23T17:03:47.6064886Z 2026-10-23T17:03:47.6065086Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-23T17:03:47.6065458Z ╭─[packages/shared/src/serverSettings.ts:466:3] 2026-10-23T17:03:47.6065658Z 464 │ null; 2026-10-23T17:03:47.6065859Z 465 │ let nextModelPreferences = initialModelPreferences; 2026-10-23T17:03:47.6066084Z ·  ──────────┬───────── 2026-10-23T17:03:47.6066327Z · ╰── From this accumulator 2026-10-23T17:03:47.6066577Z 466 │ for (const change of setModelsHidden ?? []) { 2026-10-23T17:03:47.6066788Z ·  ─┬─ 2026-10-23T17:03:47.6066997Z · ╰── For this loop 2026-10-23T17:03:47.6067325Z 467 │ const preferences = nextModelPreferences?.[change.provider] ?? { 2026-10-23T17:03:47.6067569Z 468 │ hiddenModels: [], 2026-10-23T17:03:47.6067922Z 469 │ modelOrder: [], 2026-10-23T17:03:47.6068204Z 470 │ }; 2026-10-23T17:03:47.6068508Z 471 │ const hiddenModels = preferences.hiddenModels.filter((model) => model !== change.model); 2026-10-23T17:03:47.6068833Z 472 │ if (change.hidden) hiddenModels.push(change.model); 2026-10-23T17:03:47.6069045Z 473 │ nextModelPreferences = { 2026-10-23T17:03:47.6069281Z 474 │ ...nextModelPreferences, 2026-10-23T17:03:47.6069499Z ·  ───────────┬─────────── 2026-10-23T17:03:47.6069838Z · ╰── From this spread 2026-10-23T17:03:47.6070104Z 475 │ [change.provider]: { ...preferences, hiddenModels }, 2026-10-23T17:03:47.6070305Z ╰──── 2026-10-23T17:03:47.6070531Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-23T17:03:47.6070883Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-23T17:03:47.6071053Z 2026-10-23T17:03:47.6071237Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T17:03:47.6071556Z ╭─[apps/web/src/hooks/useThreadActions.ts:821:56] 2026-10-23T17:03:47.6071804Z 820 │ const resolved = resolveThreadTarget(target); 2026-10-23T17:03:47.6072102Z 821 │ if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) { 2026-10-23T17:03:47.6072409Z ·  ─────┬──── 2026-10-23T17:03:47.6072795Z · ╰── Cannot call impure function 2026-10-23T17:03:47.6073068Z 822 │ return AsyncResult.failure( 2026-10-23T17:03:47.6073236Z ╰──── 2026-10-23T17:03:47.6073611Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T17:03:47.6074201Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T17:03:47.6074498Z 2026-10-23T17:03:47.6074710Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T17:03:47.6075051Z ╭─[apps/web/src/hooks/useThreadActions.ts:709:46] 2026-10-23T17:03:47.6075263Z 708 │ const wokeAt = resolved 2026-10-23T17:03:47.6075510Z 709 │ ? threadWokeAt(resolved.thread, { now: new Date().toISOString() }) 2026-10-23T17:03:47.6075799Z ·  ─────┬──── 2026-10-23T17:03:47.6076241Z · ╰── Cannot call impure function 2026-10-23T17:03:47.6076598Z 710 │ : null; 2026-10-23T17:03:47.6076764Z ╰──── 2026-10-23T17:03:47.6077145Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T17:03:47.6077721Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T17:03:47.6078012Z 2026-10-23T17:03:47.6078242Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-23T17:03:47.6078791Z ╭─[apps/mobile/src/Stack.tsx:1044:21] 2026-10-23T17:03:47.6079028Z 1043 │ } 2026-10-23T17:03:47.6079609Z ·  ───────────────────────────────────────────── 2026-10-23T17:03:47.6079872Z 1045 │ screenListeners={{ 2026-10-23T17:03:47.6080041Z ╰──── 2026-10-23T17:03:47.6080523Z  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-23T17:03:47.6080868Z 2026-10-23T17:03:47.6081149Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T17:03:47.6081636Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:335:7] 2026-10-23T17:03:47.6081894Z 330 │ }; 2026-10-23T17:03:47.6082029Z 331 │ useEffect(() => { 2026-10-23T17:03:47.6082206Z ·  ────┬──── 2026-10-23T17:03:47.6082439Z · ╰── This is the containing effect 2026-10-23T17:03:47.6082718Z 332 │ if (!guidesEnabled && section === "guide") { 2026-10-23T17:03:47.6082954Z 333 │ requestedSection.current = "overview"; 2026-10-23T17:03:47.6083265Z 334 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-23T17:03:47.6083562Z 335 │ setSection("overview"); 2026-10-23T17:03:47.6083763Z ·  ─────┬──── 2026-10-23T17:03:47.6084062Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6084303Z 336 │ } 2026-10-23T17:03:47.6084443Z ╰──── 2026-10-23T17:03:47.6085165Z  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-23T17:03:47.6086140Z  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-23T17:03:47.6086464Z 2026-10-23T17:03:47.6086677Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-23T17:03:47.6087071Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:337:6] 2026-10-23T17:03:47.6087362Z 332 │ if (!guidesEnabled && section === "guide") { 2026-10-23T17:03:47.6087596Z 333 │ requestedSection.current = "overview"; 2026-10-23T17:03:47.6087845Z ·  ────────┬─────── 2026-10-23T17:03:47.6088744Z · ╰── 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-23T17:03:47.6089429Z 334 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-23T17:03:47.6089860Z ·  ─────────┬───────── ──────┬────── 2026-10-23T17:03:47.6090529Z · │ ╰── 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-23T17:03:47.6091502Z · ╰── 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-23T17:03:47.6092004Z 335 │ setSection("overview"); 2026-10-23T17:03:47.6092168Z 336 │ } 2026-10-23T17:03:47.6092339Z 337 │ }, [guidesEnabled, section, insets.top]); 2026-10-23T17:03:47.6092609Z ·  ──────────────────┬───────────────── 2026-10-23T17:03:47.6092963Z · ╰── This dependency list is missing values used by the callback 2026-10-23T17:03:47.6093252Z 338 │ const tabContent = activityContent; 2026-10-23T17:03:47.6093433Z ╰──── 2026-10-23T17:03:47.6093693Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-23T17:03:47.6094201Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6094522Z 2026-10-23T17:03:47.6094780Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-23T17:03:47.6095191Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:873:6] 2026-10-23T17:03:47.6095459Z 856 │ if ( 2026-10-23T17:03:47.6095665Z 857 │ lastSelection.current.path === route.params.path && 2026-10-23T17:03:47.6095903Z ·  ──────┬────── 2026-10-23T17:03:47.6096475Z · ╰── 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-23T17:03:47.6097061Z 858 │ lastSelection.current.id === route.params.fileSelectionId 2026-10-23T17:03:47.6097281Z 859 │ ) 2026-10-23T17:03:47.6097437Z 860 │ return; 2026-10-23T17:03:47.6097700Z 861 │ lastSelection.current = { path: route.params.path, id: route.params.fileSelectionId }; 2026-10-23T17:03:47.6098038Z 862 │ if (route.params.focus) navigation.setParams({ focus: undefined }); 2026-10-23T17:03:47.6098286Z 863 │ setJumpPath(route.params.path); 2026-10-23T17:03:47.6098475Z 864 │ setSelectedRowId(null); 2026-10-23T17:03:47.6098664Z 865 │ jumpStarted.current = false; 2026-10-23T17:03:47.6098960Z 866 │ const file = data.files.find((entry) => entry.path === route.params.path); 2026-10-23T17:03:47.6099254Z 867 │ if (!file || !nativeView.current) return; 2026-10-23T17:03:47.6099469Z ·  ─────┬──── 2026-10-23T17:03:47.6100205Z · ╰── 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-23T17:03:47.6101047Z 868 │ setCollapsedIds((ids) => ids.filter((id) => id !== file.id)); 2026-10-23T17:03:47.6101290Z 869 │ jumpStarted.current = true; 2026-10-23T17:03:47.6101536Z 870 │ void nativeView.current.scrollToFile(file.id, false).catch(() => { 2026-10-23T17:03:47.6101781Z 871 │ jumpStarted.current = false; 2026-10-23T17:03:47.6101954Z 872 │ }); 2026-10-23T17:03:47.6102234Z 873 │ }, [route.params.path, route.params.fileSelectionId, route.params.focus, data.files, navigation]); 2026-10-23T17:03:47.6102656Z ·  ──────────────────────────────────────────────┬────────────────────────────────────────────── 2026-10-23T17:03:47.6103148Z · ╰── This dependency list is missing values used by the callback 2026-10-23T17:03:47.6103479Z 874 │ const appliedFilter = useRef(filter.hideTestFiles); 2026-10-23T17:03:47.6103683Z ╰──── 2026-10-23T17:03:47.6103934Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-23T17:03:47.6104432Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6104737Z 2026-10-23T17:03:47.6105052Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T17:03:47.6105502Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-23T17:03:47.6105740Z 259 │ .join("|"); 2026-10-23T17:03:47.6105894Z 260 │ useEffect(() => { 2026-10-23T17:03:47.6106057Z ·  ────┬──── 2026-10-23T17:03:47.6106287Z · ╰── This is the containing effect 2026-10-23T17:03:47.6106491Z 261 │ stop(); 2026-10-23T17:03:47.6106660Z ·  ──┬─ 2026-10-23T17:03:47.6106957Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6107196Z 262 │ }, [orderVersion]); 2026-10-23T17:03:47.6107352Z ╰──── 2026-10-23T17:03:47.6108035Z  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-23T17:03:47.6108980Z  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-23T17:03:47.6109298Z 2026-10-23T17:03:47.6109517Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T17:03:47.6109949Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-23T17:03:47.6110189Z 260 │ useEffect(() => { 2026-10-23T17:03:47.6110384Z 261 │ stop(); 2026-10-23T17:03:47.6110546Z ·  ──┬─ 2026-10-23T17:03:47.6110787Z · ╰── Missing dependency `stop` 2026-10-23T17:03:47.6110996Z 262 │ }, [orderVersion]); 2026-10-23T17:03:47.6111183Z ·  ──────┬───── 2026-10-23T17:03:47.6111553Z · ╰── Unnecessary dependency `orderVersion` 2026-10-23T17:03:47.6111879Z 263 │ useEffect( 2026-10-23T17:03:47.6112029Z ╰──── 2026-10-23T17:03:47.6112567Z  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-23T17:03:47.6113296Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6113599Z 2026-10-23T17:03:47.6113757Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.6114092Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9] 2026-10-23T17:03:47.6114378Z 95 │ const latest = useRef(props); 2026-10-23T17:03:47.6114576Z 96 │ latest.current = props; 2026-10-23T17:03:47.6114795Z ·  ───┬──────┬─── 2026-10-23T17:03:47.6115098Z · │ ╰── Cannot update ref value during render 2026-10-23T17:03:47.6115396Z · ╰── This value is a ref 2026-10-23T17:03:47.6115606Z 97 │ const gesture = useMemo( 2026-10-23T17:03:47.6115755Z ╰──── 2026-10-23T17:03:47.6116340Z  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-23T17:03:47.6117104Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.6117394Z 2026-10-23T17:03:47.6117553Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.6117877Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18] 2026-10-23T17:03:47.6118144Z 103 │ .runOnJS(true) 2026-10-23T17:03:47.6118358Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-23T17:03:47.6118874Z ·  ───────────────┬────────────── 2026-10-23T17:03:47.6119223Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T17:03:47.6119606Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-23T17:03:47.6119860Z ╰──── 2026-10-23T17:03:47.6120702Z  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-23T17:03:47.6121529Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.6121832Z 2026-10-23T17:03:47.6121993Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.6122362Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19] 2026-10-23T17:03:47.6122652Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-23T17:03:47.6122906Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-23T17:03:47.6123220Z ·  ──────────────────────────┬───────────────────────── 2026-10-23T17:03:47.6123590Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T17:03:47.6123926Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-23T17:03:47.6124169Z ╰──── 2026-10-23T17:03:47.6124721Z  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-23T17:03:47.6125452Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.6125744Z 2026-10-23T17:03:47.6125935Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.6126282Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16] 2026-10-23T17:03:47.6126603Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-23T17:03:47.6126877Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-23T17:03:47.6127172Z ·  ──────────────────────────┬───────────────────────── 2026-10-23T17:03:47.6127526Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T17:03:47.6127902Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-23T17:03:47.6128108Z ╰──── 2026-10-23T17:03:47.6128653Z  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-23T17:03:47.6129377Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.6129727Z 2026-10-23T17:03:47.6129913Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.6130266Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21] 2026-10-23T17:03:47.6130587Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-23T17:03:47.6130867Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-23T17:03:47.6131182Z ·  ───────────────────────┬────────────────────── 2026-10-23T17:03:47.6131723Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T17:03:47.6132111Z 108 │ [props.disabled], 2026-10-23T17:03:47.6132280Z ╰──── 2026-10-23T17:03:47.6132921Z  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-23T17:03:47.6133665Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.6133965Z 2026-10-23T17:03:47.6134130Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.6134476Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:249:9] 2026-10-23T17:03:47.6134789Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-23T17:03:47.6135066Z 249 │ latest.current = { rows, planners, moveThread }; 2026-10-23T17:03:47.6135352Z ·  ───┬──────┬─── 2026-10-23T17:03:47.6135661Z · │ ╰── Cannot update ref value during render 2026-10-23T17:03:47.6135978Z · ╰── This value is a ref 2026-10-23T17:03:47.6136175Z 250 │ 2026-10-23T17:03:47.6136308Z ╰──── 2026-10-23T17:03:47.6136869Z  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-23T17:03:47.6154170Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.6154627Z 2026-10-23T17:03:47.6154889Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.6155223Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:247:22] 2026-10-23T17:03:47.6155530Z 246 │ const [preview, setPreview] = useState(null); 2026-10-23T17:03:47.6155795Z 247 │ const translateY = useRef(new Animated.Value(0)).current; 2026-10-23T17:03:47.6156073Z ·  ──────────────────┬────────────────── 2026-10-23T17:03:47.6156441Z · ╰── Cannot access ref value during render 2026-10-23T17:03:47.6156755Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-23T17:03:47.6156965Z ╰──── 2026-10-23T17:03:47.6157518Z  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-23T17:03:47.6158276Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.6158958Z 2026-10-23T17:03:47.6159144Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T17:03:47.6159507Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:324:16] 2026-10-23T17:03:47.6159794Z 323 │ update(0); 2026-10-23T17:03:47.6160406Z 324 │ let last = performance.now(); 2026-10-23T17:03:47.6160750Z ·  ────────┬──────── 2026-10-23T17:03:47.6161058Z · ╰── Cannot call impure function 2026-10-23T17:03:47.6161286Z 325 │ const tick = () => { 2026-10-23T17:03:47.6161456Z ╰──── 2026-10-23T17:03:47.6161837Z  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-23T17:03:47.6162450Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T17:03:47.6162743Z 2026-10-23T17:03:47.6162989Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-23T17:03:47.6163372Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15] 2026-10-23T17:03:47.6163614Z  98 │ () => 2026-10-23T17:03:47.6163771Z  99 │ Gesture.Pan() 2026-10-23T17:03:47.6163944Z ·  ─┬─ 2026-10-23T17:03:47.6164182Z · ╰── `Pan` may be a component 2026-10-23T17:03:47.6164418Z 100 │ .enabled(!props.disabled) 2026-10-23T17:03:47.6164575Z ╰──── 2026-10-23T17:03:47.6164965Z  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-23T17:03:47.6165711Z  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-23T17:03:47.6166135Z 2026-10-23T17:03:47.6166336Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-23T17:03:47.6166696Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5] 2026-10-23T17:03:47.6166994Z 103 │ .runOnJS(true) 2026-10-23T17:03:47.6167208Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-23T17:03:47.6167429Z ·  ───┬── 2026-10-23T17:03:47.6168001Z · ╰── 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-23T17:03:47.6168543Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-23T17:03:47.6168856Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-23T17:03:47.6169174Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-23T17:03:47.6169394Z 108 │ [props.disabled], 2026-10-23T17:03:47.6169581Z ·  ────────┬─────── 2026-10-23T17:03:47.6169959Z · ╰── This dependency list is missing values used by the callback 2026-10-23T17:03:47.6170212Z 109 │ ); 2026-10-23T17:03:47.6170337Z ╰──── 2026-10-23T17:03:47.6170618Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-23T17:03:47.6171202Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6171517Z 2026-10-23T17:03:47.6171874Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T17:03:47.6172252Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:372:47] 2026-10-23T17:03:47.6172552Z 371 │ const { open, onOpenChange, onSnooze, timestampFormat } = props; 2026-10-23T17:03:47.6172909Z 372 │ const presets = open ? resolveSnoozePresets(new Date(), timestampFormat) : []; 2026-10-23T17:03:47.6173219Z ·  ─────┬──── 2026-10-23T17:03:47.6173515Z · ╰── Cannot call impure function 2026-10-23T17:03:47.6173750Z 373 │ return ( 2026-10-23T17:03:47.6173882Z ╰──── 2026-10-23T17:03:47.6174232Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T17:03:47.6174857Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T17:03:47.6175168Z 2026-10-23T17:03:47.6175347Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T17:03:47.6175669Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:853:39] 2026-10-23T17:03:47.6175937Z 852 │ if (snoozeGateClock.thread !== thread) { 2026-10-23T17:03:47.6176190Z 853 │ setSnoozeGateClock({ thread, now: new Date().toISOString() }); 2026-10-23T17:03:47.6176457Z ·  ─────┬──── 2026-10-23T17:03:47.6176803Z · ╰── Cannot call impure function 2026-10-23T17:03:47.6177033Z 854 │ } 2026-10-23T17:03:47.6177163Z ╰──── 2026-10-23T17:03:47.6177511Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T17:03:47.6178080Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T17:03:47.6178373Z 2026-10-23T17:03:47.6178592Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T17:03:47.6179001Z ╭─[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:116:34] 2026-10-23T17:03:47.6179282Z 115 │ return [...commands]; 2026-10-23T17:03:47.6179623Z 116 │ }, [activeThreadRef, pathname, registrationVersion, navigation]); 2026-10-23T17:03:47.6179940Z ·  ─────────┬───────── 2026-10-23T17:03:47.6180364Z · ╰── Unnecessary dependency `registrationVersion` 2026-10-23T17:03:47.6180706Z 117 │ 2026-10-23T17:03:47.6180846Z ╰──── 2026-10-23T17:03:47.6181229Z  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-23T17:03:47.6181858Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6182167Z 2026-10-23T17:03:47.6182319Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.6182700Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39] 2026-10-23T17:03:47.6182935Z 276 │ 2026-10-23T17:03:47.6183218Z 277 │ ╭─▶ return createElement(RawNativeView, { 2026-10-23T17:03:47.6183510Z 278 │ │ ...nativeProps, 2026-10-23T17:03:47.6183782Z 279 │ │ refreshEnabled: props.onPullToRefresh !== undefined, 2026-10-23T17:03:47.6184042Z 280 │ │ ref: nativeRef, 2026-10-23T17:03:47.6184298Z 281 │ ├─▶ }); 2026-10-23T17:03:47.6184738Z · ╰──── Passing a ref to a function may read its value during render 2026-10-23T17:03:47.6185029Z 282 │ } 2026-10-23T17:03:47.6185157Z ╰──── 2026-10-23T17:03:47.6185705Z  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-23T17:03:47.6186729Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.6187020Z 2026-10-23T17:03:47.6187495Z ⚠ 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-23T17:03:47.6188037Z ╭─[apps/server/src/assets/AssetAccess.test.ts:1043:32] 2026-10-23T17:03:47.6188373Z 1042 │ expect(error._tag).toBe("AssetGitHubMediaUrlValidationError"); 2026-10-23T17:03:47.6188759Z 1043 │ const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(AssetAccessError))(error); 2026-10-23T17:03:47.6189090Z ·  ─────────────────── 2026-10-23T17:03:47.6189318Z 1044 │ expect(encoded).not.toContain(url); 2026-10-23T17:03:47.6189493Z ╰──── 2026-10-23T17:03:47.6189553Z 2026-10-23T17:03:47.6190116Z ⚠ 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-23T17:03:47.6190708Z ╭─[packages/shared/src/atomicWrite.test.ts:139:5] 2026-10-23T17:03:47.6190928Z 138 │ Effect.gen(function* () { 2026-10-23T17:03:47.6191236Z 139 │ ╭─▶ while (fiber.pollUnsafe() === undefined) { 2026-10-23T17:03:47.6191674Z 140 │ │ yield* TestClock.adjust("100 millis"); 2026-10-23T17:03:47.6192262Z 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-23T17:03:47.6192790Z 142 │ │ yield* Effect.promise(() => new Promise((resolve) => setImmediate(resolve))); 2026-10-23T17:03:47.6193148Z 143 │ ╰─▶ } 2026-10-23T17:03:47.6193397Z 144 │ return yield* Fiber.join(fiber); 2026-10-23T17:03:47.6193578Z ╰──── 2026-10-23T17:03:47.6193640Z 2026-10-23T17:03:47.6193848Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T17:03:47.6194165Z ╭─[packages/shared/src/qrCode.ts:458:44] 2026-10-23T17:03:47.6194375Z 457 │ ): Array { 2026-10-23T17:03:47.6194618Z 458 │ let result: Array = divisor.map((_) => 0); 2026-10-23T17:03:47.6194915Z ·  ┬ 2026-10-23T17:03:47.6195195Z · ╰── '_' is declared here 2026-10-23T17:03:47.6195476Z 459 │ for (const b of data) { 2026-10-23T17:03:47.6195645Z ╰──── 2026-10-23T17:03:47.6195819Z  help: Consider removing this parameter. 2026-10-23T17:03:47.6195944Z 2026-10-23T17:03:47.6196209Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-23T17:03:47.6196587Z ╭─[packages/shared/src/composerContextLegacySend.ts:19:45] 2026-10-23T17:03:47.6196875Z 18 │ const occurrences = collectComposerContextReferences(text); 2026-10-23T17:03:47.6197144Z 19 │ for (const occurrence of [...occurrences].reverse()) { 2026-10-23T17:03:47.6197389Z ·  ─────── 2026-10-23T17:03:47.6197639Z 20 │ const record = recordsById.get(occurrence.contextId); 2026-10-23T17:03:47.6197828Z ╰──── 2026-10-23T17:03:47.6198162Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-23T17:03:47.6198419Z 2026-10-23T17:03:47.6198902Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T17:03:47.6199269Z ╭─[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9] 2026-10-23T17:03:47.6199529Z 35 │ { 2026-10-23T17:03:47.6201889Z ·  ────┬──── 2026-10-23T17:03:47.6202113Z · ╰── This is the containing effect 2026-10-23T17:03:47.6202349Z 152 │ if (!controlledSelectedPath) { 2026-10-23T17:03:47.6202554Z 153 │ return; 2026-10-23T17:03:47.6202945Z 154 │ } 2026-10-23T17:03:47.6203207Z 155 │ setExpandedPaths((current) => { 2026-10-23T17:03:47.6203407Z ·  ────────┬─────── 2026-10-23T17:03:47.6203690Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6203998Z 156 │ const ancestors = ancestorPaths(controlledSelectedPath); 2026-10-23T17:03:47.6204248Z ╰──── 2026-10-23T17:03:47.6204986Z  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-23T17:03:47.6205903Z  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-23T17:03:47.6206226Z 2026-10-23T17:03:47.6206474Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-23T17:03:47.6206865Z ╭─[apps/web/src/lib/composerContextReferences.ts:90:40] 2026-10-23T17:03:47.6207094Z 89 │ let cursor = prompt.length; 2026-10-23T17:03:47.6207314Z 90 │ for (const occurrence of occurrences.reverse()) { 2026-10-23T17:03:47.6207546Z ·  ─────── 2026-10-23T17:03:47.6207756Z 91 │ let { start, end } = occurrence; 2026-10-23T17:03:47.6207914Z ╰──── 2026-10-23T17:03:47.6208257Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-23T17:03:47.6208564Z 2026-10-23T17:03:47.6208797Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T17:03:47.6209167Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7] 2026-10-23T17:03:47.6209432Z 256 │ return () => cancelAnimationFrame(frame); 2026-10-23T17:03:47.6209645Z 257 │ }, [props.path, targetIndex]); 2026-10-23T17:03:47.6209897Z ·  ─────┬──── 2026-10-23T17:03:47.6210185Z · ╰── Unnecessary dependency `props.path` 2026-10-23T17:03:47.6210439Z 258 │ 2026-10-23T17:03:47.6210574Z ╰──── 2026-10-23T17:03:47.6211040Z  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-23T17:03:47.6211688Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6211998Z 2026-10-23T17:03:47.6212222Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T17:03:47.6212608Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23] 2026-10-23T17:03:47.6212881Z 292 │ 2026-10-23T17:03:47.6215764Z ·  ─────────── 2026-10-23T17:03:47.6215990Z 310 │ {body} 2026-10-23T17:03:47.6216154Z ╰──── 2026-10-23T17:03:47.6216381Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-23T17:03:47.6216549Z 2026-10-23T17:03:47.6216723Z ⚠ react(immutability): This value cannot be modified 2026-10-23T17:03:47.6217051Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:174:5] 2026-10-23T17:03:47.6217387Z 170 │ const expandedAngle = props.collapsedDirection === "right" ? 90 : 180; 2026-10-23T17:03:47.6217701Z 171 │ const rotation = useSharedValue(props.expanded ? expandedAngle : 0); 2026-10-23T17:03:47.6217938Z ·  ────┬─── 2026-10-23T17:03:47.6218228Z · ╰── `rotation` originates here 2026-10-23T17:03:47.6218446Z 172 │ 2026-10-23T17:03:47.6218603Z 173 │ useLayoutEffect(() => { 2026-10-23T17:03:47.6218843Z 174 │ rotation.value = withTiming(props.expanded ? expandedAngle : 0, { 2026-10-23T17:03:47.6219084Z ·  ────┬─── 2026-10-23T17:03:47.6219318Z · ╰── `rotation` cannot be modified 2026-10-23T17:03:47.6219573Z 175 │ duration: THREAD_DISCLOSURE_TRANSITION_MS, 2026-10-23T17:03:47.6219762Z ╰──── 2026-10-23T17:03:47.6220173Z  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-23T17:03:47.6220773Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T17:03:47.6221078Z 2026-10-23T17:03:47.6221283Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T17:03:47.6221637Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:1246:23] 2026-10-23T17:03:47.6221888Z 1245 │ { 2026-10-23T17:03:47.6228056Z 68 │ progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING); 2026-10-23T17:03:47.6229516Z ·  ────┬─── 2026-10-23T17:03:47.6229878Z · ╰── `progress` cannot be modified 2026-10-23T17:03:47.6230169Z 69 │ }, [expanded, progress]); 2026-10-23T17:03:47.6230381Z ╰──── 2026-10-23T17:03:47.6230740Z  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-23T17:03:47.6231365Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T17:03:47.6231685Z 2026-10-23T17:03:47.6231870Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T17:03:47.6232240Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:697:76] 2026-10-23T17:03:47.6232618Z 696 │ const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() })); 2026-10-23T17:03:47.6233101Z 697 │ if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() }); 2026-10-23T17:03:47.6233454Z ·  ─────┬──── 2026-10-23T17:03:47.6233828Z · ╰── Cannot call impure function 2026-10-23T17:03:47.6234164Z 698 │ const snoozeGateNow = new Date(snoozeGateClock.now).toISOString(); 2026-10-23T17:03:47.6234422Z ╰──── 2026-10-23T17:03:47.6234807Z  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-23T17:03:47.6235405Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T17:03:47.6235747Z 2026-10-23T17:03:47.6236069Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T17:03:47.6236511Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:718:71] 2026-10-23T17:03:47.6236773Z 717 │ const snoozePresets = useMemo( 2026-10-23T17:03:47.6237084Z 718 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-23T17:03:47.6237415Z ·  ─────┬──── 2026-10-23T17:03:47.6237775Z · ╰── Cannot call impure function 2026-10-23T17:03:47.6238106Z 719 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-23T17:03:47.6238306Z ╰──── 2026-10-23T17:03:47.6238908Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T17:03:47.6239494Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T17:03:47.6239833Z 2026-10-23T17:03:47.6240075Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T17:03:47.6240443Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:719:6] 2026-10-23T17:03:47.6240794Z 718 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-23T17:03:47.6241106Z 719 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-23T17:03:47.6241345Z ·  ────────────┬─────────── 2026-10-23T17:03:47.6241661Z · ╰── Unnecessary dependency `props.snoozePresetMinute` 2026-10-23T17:03:47.6241910Z 720 │ ); 2026-10-23T17:03:47.6242090Z ╰──── 2026-10-23T17:03:47.6242506Z  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-23T17:03:47.6243139Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6243447Z 2026-10-23T17:03:47.6243648Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T17:03:47.6244012Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:765:7] 2026-10-23T17:03:47.6244262Z 764 │ thread.pinnedAt, 2026-10-23T17:03:47.6244479Z 765 │ variant, 2026-10-23T17:03:47.6244669Z ·  ───┬─── 2026-10-23T17:03:47.6244921Z · ╰── Unnecessary dependency `variant` 2026-10-23T17:03:47.6245148Z 766 │ ], 2026-10-23T17:03:47.6245284Z ╰──── 2026-10-23T17:03:47.6245679Z  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-23T17:03:47.6246299Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6246604Z 2026-10-23T17:03:47.6246846Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T17:03:47.6247227Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1215:21] 2026-10-23T17:03:47.6247617Z 1214 │ {providerDrivers.slice(0, -1).map((driver, index) => ( 2026-10-23T17:03:47.6247869Z 1215 │ 2026-10-23T17:03:47.6248001Z ·  ────────────────────────── 2026-10-23T17:03:47.6248114Z 1216 │ 2026-10-23T17:03:47.6248175Z ╰──── 2026-10-23T17:03:47.6248333Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-23T17:03:47.6248335Z 2026-10-23T17:03:47.6248516Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T17:03:47.6248658Z ╭─[apps/web/src/components/CustomSnoozeDialog.tsx:140:58] 2026-10-23T17:03:47.6248852Z 139 │ {...(weekStartsOn === undefined ? {} : { weekStartsOn })} 2026-10-23T17:03:47.6249031Z 140 │ disabled={{ before: new Date(new Date().setHours(0, 0, 0, 0)) }} 2026-10-23T17:03:47.6249167Z ·  ─────┬──── 2026-10-23T17:03:47.6249355Z · ╰── Cannot call impure function 2026-10-23T17:03:47.6249457Z 141 │ onSelect={(selected) => { 2026-10-23T17:03:47.6249524Z ╰──── 2026-10-23T17:03:47.6249875Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T17:03:47.6250186Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T17:03:47.6250189Z 2026-10-23T17:03:47.6250588Z ⚠ 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-23T17:03:47.6250729Z ╭─[packages/shared/src/otelEnvironment.ts:146:14] 2026-10-23T17:03:47.6250796Z 145 │ name, 2026-10-23T17:03:47.6250986Z 146 │ (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()), 2026-10-23T17:03:47.6251110Z ·  ────────────────────────── 2026-10-23T17:03:47.6251236Z 147 │ `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`, 2026-10-23T17:03:47.6251302Z ╰──── 2026-10-23T17:03:47.6251304Z 2026-10-23T17:03:47.6251597Z ⚠ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'. 2026-10-23T17:03:47.6251759Z ╭─[apps/web/src/components/preview/PreviewPanelShell.tsx:61:9] 2026-10-23T17:03:47.6251820Z 60 │ ) { 2026-10-23T17:03:47.6251995Z 61 │ const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded"; 2026-10-23T17:03:47.6252087Z ·  ──────┬────── 2026-10-23T17:03:47.6252236Z · ╰── 'useDragRegion' is declared here 2026-10-23T17:03:47.6252329Z 62 │ const isInline = props.mode === "inline"; 2026-10-23T17:03:47.6252390Z ╰──── 2026-10-23T17:03:47.6252505Z  help: Consider removing this declaration. 2026-10-23T17:03:47.6252508Z 2026-10-23T17:03:47.6252808Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T17:03:47.6253090Z ╭─[apps/mobile/src/features/threads/use-worktree-setup.ts:30:40] 2026-10-23T17:03:47.6253369Z 28 │ const snapshot = resolveWorktreeSetupSnapshot(input.threadId, query.data, live); 2026-10-23T17:03:47.6253443Z 29 │ useEffect(() => { 2026-10-23T17:03:47.6253523Z ·  ────┬──── 2026-10-23T17:03:47.6253656Z · ╰── This is the containing effect 2026-10-23T17:03:47.6253787Z 30 │ if (snapshot && snapshot !== live) setHeld({ key, snapshot }); 2026-10-23T17:03:47.6253903Z ·  ───┬─── 2026-10-23T17:03:47.6254112Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6254188Z 31 │ }, [key, live, snapshot]); 2026-10-23T17:03:47.6254248Z ╰──── 2026-10-23T17:03:47.6254892Z  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-23T17:03:47.6255293Z  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-23T17:03:47.6255297Z 2026-10-23T17:03:47.6255466Z ⚠ react(immutability): This value cannot be modified 2026-10-23T17:03:47.6255637Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:111:5] 2026-10-23T17:03:47.6255706Z 107 │ ); 2026-10-23T17:03:47.6255868Z 108 │ const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0); 2026-10-23T17:03:47.6255970Z ·  ─────────┬──────── 2026-10-23T17:03:47.6256128Z · ╰── `separationProgress` originates here 2026-10-23T17:03:47.6256193Z 109 │ 2026-10-23T17:03:47.6256277Z 110 │ useEffect(() => { 2026-10-23T17:03:47.6256459Z 111 │ separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING); 2026-10-23T17:03:47.6256546Z ·  ─────────┬──────── 2026-10-23T17:03:47.6256736Z · ╰── `separationProgress` cannot be modified 2026-10-23T17:03:47.6256866Z 112 │ }, [props.showScrollToEnd, separationProgress]); 2026-10-23T17:03:47.6256929Z ╰──── 2026-10-23T17:03:47.6257210Z  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-23T17:03:47.6257546Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T17:03:47.6257552Z 2026-10-23T17:03:47.6257736Z ⚠ react(immutability): This value cannot be modified 2026-10-23T17:03:47.6257941Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-23T17:03:47.6258073Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-23T17:03:47.6258212Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-23T17:03:47.6258319Z ·  ──────┬───── 2026-10-23T17:03:47.6258489Z · ╰── `capsuleWidth` originates here 2026-10-23T17:03:47.6258631Z 130 │ const measuredWidthRef = useRef(null); 2026-10-23T17:03:47.6258887Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-23T17:03:47.6259101Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-23T17:03:47.6259261Z 133 │ if (width === measuredWidthRef.current) { 2026-10-23T17:03:47.6259368Z 134 │ return; 2026-10-23T17:03:47.6259435Z 135 │ } 2026-10-23T17:03:47.6259581Z 136 │ const first = measuredWidthRef.current === null; 2026-10-23T17:03:47.6259700Z 137 │ measuredWidthRef.current = width; 2026-10-23T17:03:47.6259855Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-23T17:03:47.6259959Z ·  ──────┬───── 2026-10-23T17:03:47.6260123Z · ╰── `capsuleWidth` cannot be modified 2026-10-23T17:03:47.6260204Z 139 │ }; 2026-10-23T17:03:47.6260265Z ╰──── 2026-10-23T17:03:47.6260556Z  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-23T17:03:47.6260884Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T17:03:47.6260887Z 2026-10-23T17:03:47.6261060Z ⚠ react(immutability): This value cannot be modified 2026-10-23T17:03:47.6261241Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-23T17:03:47.6261363Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-23T17:03:47.6261500Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-23T17:03:47.6261594Z ·  ──────┬───── 2026-10-23T17:03:47.6261755Z · ╰── `capsuleWidth` originates here 2026-10-23T17:03:47.6261879Z 130 │ const measuredWidthRef = useRef(null); 2026-10-23T17:03:47.6262017Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-23T17:03:47.6262196Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-23T17:03:47.6262309Z 133 │ if (width === measuredWidthRef.current) { 2026-10-23T17:03:47.6262385Z 134 │ return; 2026-10-23T17:03:47.6262459Z 135 │ } 2026-10-23T17:03:47.6262587Z 136 │ const first = measuredWidthRef.current === null; 2026-10-23T17:03:47.6262693Z 137 │ measuredWidthRef.current = width; 2026-10-23T17:03:47.6262850Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-23T17:03:47.6262923Z 139 │ }; 2026-10-23T17:03:47.6263037Z 140 │ const hasStatus = props.status !== null; 2026-10-23T17:03:47.6263203Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-23T17:03:47.6263287Z 142 │ useEffect(() => { 2026-10-23T17:03:47.6263380Z 143 │ if (!hasStatus) { 2026-10-23T17:03:47.6263477Z 144 │ measuredWidthRef.current = null; 2026-10-23T17:03:47.6263569Z 145 │ capsuleWidth.value = null; 2026-10-23T17:03:47.6263651Z ·  ──────┬───── 2026-10-23T17:03:47.6263804Z · ╰── `capsuleWidth` cannot be modified 2026-10-23T17:03:47.6263868Z 146 │ } 2026-10-23T17:03:47.6263923Z ╰──── 2026-10-23T17:03:47.6264198Z  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-23T17:03:47.6264547Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T17:03:47.6264551Z 2026-10-23T17:03:47.6264886Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T17:03:47.6265127Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-23T17:03:47.6265265Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-23T17:03:47.6265338Z 142 │ useEffect(() => { 2026-10-23T17:03:47.6265423Z ·  ───┬─── 2026-10-23T17:03:47.6265661Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-23T17:03:47.6265735Z 143 │ if (!hasStatus) { 2026-10-23T17:03:47.6265839Z 144 │ measuredWidthRef.current = null; 2026-10-23T17:03:47.6265932Z 145 │ capsuleWidth.value = null; 2026-10-23T17:03:47.6266026Z ·  ──────┬───── 2026-10-23T17:03:47.6266222Z · ╰── This modifies `capsuleWidth` 2026-10-23T17:03:47.6266302Z 146 │ } 2026-10-23T17:03:47.6266382Z ╰──── 2026-10-23T17:03:47.6266743Z  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-23T17:03:47.6267055Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T17:03:47.6267064Z 2026-10-23T17:03:47.6267266Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T17:03:47.6267443Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-23T17:03:47.6267615Z 130 │ const measuredWidthRef = useRef(null); 2026-10-23T17:03:47.6267757Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-23T17:03:47.6267886Z ·  ───────────────┬─────────────── 2026-10-23T17:03:47.6268139Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-23T17:03:47.6268265Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-23T17:03:47.6268377Z 133 │ if (width === measuredWidthRef.current) { 2026-10-23T17:03:47.6268448Z 134 │ return; 2026-10-23T17:03:47.6268512Z 135 │ } 2026-10-23T17:03:47.6268628Z 136 │ const first = measuredWidthRef.current === null; 2026-10-23T17:03:47.6268726Z 137 │ measuredWidthRef.current = width; 2026-10-23T17:03:47.6269211Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-23T17:03:47.6269409Z ·  ──────┬───── 2026-10-23T17:03:47.6269557Z · ╰── This modifies `capsuleWidth` 2026-10-23T17:03:47.6269622Z 139 │ }; 2026-10-23T17:03:47.6269714Z ╰──── 2026-10-23T17:03:47.6270076Z  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-23T17:03:47.6270399Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T17:03:47.6270402Z 2026-10-23T17:03:47.6270652Z ⚠ eslint(no-unneeded-ternary): Unnecessary use of boolean literals in conditional expression 2026-10-23T17:03:47.6270787Z ╭─[packages/shared/src/serverSettings.test.ts:35:7] 2026-10-23T17:03:47.6270985Z 34 │ const fallback = fallbackTextGenerationModelSelection(providerInstances, (instanceId) => 2026-10-23T17:03:47.6271092Z 35 │ instanceId === configured ? true : false, 2026-10-23T17:03:47.6271223Z ·  ──────────────────────────────────────── 2026-10-23T17:03:47.6271288Z 36 │ ); 2026-10-23T17:03:47.6271347Z ╰──── 2026-10-23T17:03:47.6271520Z  help: Remove this ternary operator 2026-10-23T17:03:47.6271524Z 2026-10-23T17:03:47.6271746Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-23T17:03:47.6271916Z ╭─[apps/mobile/src/features/threads/ThreadQueueControl.tsx:602:27] 2026-10-23T17:03:47.6272099Z 601 │ const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success)); 2026-10-23T17:03:47.6272197Z 602 │ const gesture = Gesture.Pan() 2026-10-23T17:03:47.6272304Z ·  ─┬─ 2026-10-23T17:03:47.6272462Z · ╰── `Pan` may be a component 2026-10-23T17:03:47.6272553Z 603 │ .enabled(!props.disabled) 2026-10-23T17:03:47.6272625Z ╰──── 2026-10-23T17:03:47.6272920Z  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-23T17:03:47.6273384Z  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-23T17:03:47.6273387Z 2026-10-23T17:03:47.6273597Z ⚠ eslint(no-unused-vars): Identifier 'Fiber' is imported but never used. 2026-10-23T17:03:47.6273725Z ╭─[apps/server/src/ws.ts:10:13] 2026-10-23T17:03:47.6273834Z  9 │ import * as Effect from "effect/Effect"; 2026-10-23T17:03:47.6273937Z 10 │ import * as Fiber from "effect/Fiber"; 2026-10-23T17:03:47.6274052Z ·  ──┬── 2026-10-23T17:03:47.6274225Z · ╰── 'Fiber' is imported here 2026-10-23T17:03:47.6274354Z 11 │ import * as FileSystem from "effect/FileSystem"; 2026-10-23T17:03:47.6274419Z ╰──── 2026-10-23T17:03:47.6274519Z  help: Consider removing this import. 2026-10-23T17:03:47.6274522Z 2026-10-23T17:03:47.6274736Z ⚠ eslint(no-unused-vars): Identifier 'Schedule' is imported but never used. 2026-10-23T17:03:47.6274848Z ╭─[apps/server/src/ws.ts:17:13] 2026-10-23T17:03:47.6275043Z 16 │ import * as Ref from "effect/Ref"; 2026-10-23T17:03:47.6275192Z 17 │ import * as Schedule from "effect/Schedule"; 2026-10-23T17:03:47.6275287Z ·  ────┬─── 2026-10-23T17:03:47.6275444Z · ╰── 'Schedule' is imported here 2026-10-23T17:03:47.6275549Z 18 │ import * as Schema from "effect/Schema"; 2026-10-23T17:03:47.6275618Z ╰──── 2026-10-23T17:03:47.6275740Z  help: Consider removing this import. 2026-10-23T17:03:47.6275743Z 2026-10-23T17:03:47.6276063Z ⚠ eslint(no-unused-vars): Variable 'projectSetupScriptRunner' is declared but never used. Unused variables should start with a '_'. 2026-10-23T17:03:47.6276176Z ╭─[apps/server/src/ws.ts:1285:13] 2026-10-23T17:03:47.6276344Z 1284 │ const usageLimitSources = yield* UsageLimitSources.UsageLimitSources; 2026-10-23T17:03:47.6276558Z 1285 │ const projectSetupScriptRunner = yield* ProjectSetupScriptRunner.ProjectSetupScriptRunner; 2026-10-23T17:03:47.6276717Z ·  ────────────┬─────────── 2026-10-23T17:03:47.6276918Z · ╰── 'projectSetupScriptRunner' is declared here 2026-10-23T17:03:47.6277106Z 1286 │ const worktreeSetupTracker = yield* WorktreeSetupTracker.WorktreeSetupTracker; 2026-10-23T17:03:47.6277161Z ╰──── 2026-10-23T17:03:47.6277282Z  help: Consider removing this declaration. 2026-10-23T17:03:47.6277286Z 2026-10-23T17:03:47.6277560Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T17:03:47.6277732Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:40:5] 2026-10-23T17:03:47.6277855Z 37 │ const [initialized, setInitialized] = useState(false); 2026-10-23T17:03:47.6277940Z 38 │ useLayoutEffect(() => { 2026-10-23T17:03:47.6278032Z ·  ───────┬─────── 2026-10-23T17:03:47.6278173Z · ╰── This is the containing effect 2026-10-23T17:03:47.6278238Z 39 │ reset(); 2026-10-23T17:03:47.6278317Z 40 │ setInitialized(true); 2026-10-23T17:03:47.6278400Z ·  ───────┬────── 2026-10-23T17:03:47.6278822Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6278914Z 41 │ }, [reset]); 2026-10-23T17:03:47.6278985Z ╰──── 2026-10-23T17:03:47.6279633Z  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-23T17:03:47.6280013Z  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-23T17:03:47.6280016Z 2026-10-23T17:03:47.6280285Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T17:03:47.6280444Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:93:5] 2026-10-23T17:03:47.6280502Z 88 │ 2026-10-23T17:03:47.6280572Z 89 │ useEffect(() => { 2026-10-23T17:03:47.6280652Z ·  ────┬──── 2026-10-23T17:03:47.6280787Z · ╰── This is the containing effect 2026-10-23T17:03:47.6281211Z 90 │ if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return; 2026-10-23T17:03:47.6281397Z 91 │ const branchName = initialProjectRef.branch; 2026-10-23T17:03:47.6281469Z 92 │ let active = true; 2026-10-23T17:03:47.6281565Z 93 │ setPendingCheckouts((count) => count + 1); 2026-10-23T17:03:47.6281658Z ·  ─────────┬───────── 2026-10-23T17:03:47.6281843Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6282006Z 94 │ // Serialize replacements: ignoring a stale result cannot undo its Git mutation. 2026-10-23T17:03:47.6282060Z ╰──── 2026-10-23T17:03:47.6282673Z  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-23T17:03:47.6283043Z  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-23T17:03:47.6283047Z 2026-10-23T17:03:47.6283282Z ⚠ eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used. 2026-10-23T17:03:47.6283391Z ╭─[infra/relay/src/http/Api.ts:69:13] 2026-10-23T17:03:47.6283531Z 68 │ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts"; 2026-10-23T17:03:47.6283652Z 69 │ import * as HookForwarder from "../hooks/HookForwarder.ts"; 2026-10-23T17:03:47.6283745Z ·  ──────┬────── 2026-10-23T17:03:47.6283901Z · ╰── 'HookForwarder' is imported here 2026-10-23T17:03:47.6284007Z 70 │ import * as HeldHooks from "../hooks/HeldHooks.ts"; 2026-10-23T17:03:47.6284065Z ╰──── 2026-10-23T17:03:47.6284170Z  help: Consider removing this import. 2026-10-23T17:03:47.6284173Z 2026-10-23T17:03:47.6284470Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-23T17:03:47.6284654Z ╭─[apps/web/src/components/settings/SettingInheritance.tsx:163:24] 2026-10-23T17:03:47.6284739Z 162 │ keys, 2026-10-23T17:03:47.6284825Z 163 │ overridingProjects = [], 2026-10-23T17:03:47.6284928Z ·  ── 2026-10-23T17:03:47.6285001Z 164 │ onClearOverrides, 2026-10-23T17:03:47.6285059Z ╰──── 2026-10-23T17:03:47.6285399Z  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-23T17:03:47.6285404Z 2026-10-23T17:03:47.6285667Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T17:03:47.6285851Z ╭─[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:60:5] 2026-10-23T17:03:47.6285907Z 58 │ 2026-10-23T17:03:47.6285979Z 59 │ useEffect(() => { 2026-10-23T17:03:47.6286054Z ·  ────┬──── 2026-10-23T17:03:47.6286184Z · ╰── This is the containing effect 2026-10-23T17:03:47.6286277Z 60 │ setMountedModes((current) => { 2026-10-23T17:03:47.6286365Z ·  ───────┬─────── 2026-10-23T17:03:47.6286664Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6286821Z 61 │ if (current.has(props.mode)) { 2026-10-23T17:03:47.6286883Z ╰──── 2026-10-23T17:03:47.6287491Z  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-23T17:03:47.6287820Z  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-23T17:03:47.6287823Z 2026-10-23T17:03:47.6288040Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-23T17:03:47.6288169Z ╭─[apps/web/src/contextMenuFallback.test.ts:38:9] 2026-10-23T17:03:47.6288253Z 37 │ get isConnected() { 2026-10-23T17:03:47.6288353Z 38 │ let current: FakeElement | null = this; 2026-10-23T17:03:47.6288436Z ·  ─────── 2026-10-23T17:03:47.6288543Z 39 │ while (current?.parent) { 2026-10-23T17:03:47.6288618Z ╰──── 2026-10-23T17:03:47.6288915Z  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-23T17:03:47.6288918Z 2026-10-23T17:03:47.6289097Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T17:03:47.6289240Z ╭─[apps/web/src/components/CommandPalette.tsx:1996:20] 2026-10-23T17:03:47.6289363Z 1995 │ title: inferProjectTitleFromPath(destinationPath), 2026-10-23T17:03:47.6289473Z 1996 │ createdAt: new Date().toISOString(), 2026-10-23T17:03:47.6289577Z ·  ─────┬──── 2026-10-23T17:03:47.6289800Z · ╰── Cannot call impure function 2026-10-23T17:03:47.6289920Z 1997 │ remoteUrl: addProjectCloneFlow.remoteUrl, 2026-10-23T17:03:47.6289982Z ╰──── 2026-10-23T17:03:47.6290276Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T17:03:47.6290621Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T17:03:47.6290625Z 2026-10-23T17:03:47.6290854Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T17:03:47.6291017Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:772:7] 2026-10-23T17:03:47.6291128Z 771 │ if (settingsSheetPresentation.isActive) { 2026-10-23T17:03:47.6291264Z 772 │ settingsRoutePresentation.present(settingsRouteSession); 2026-10-23T17:03:47.6291361Z ·  ────────────┬──────────── 2026-10-23T17:03:47.6291542Z · ╰── Missing dependency `settingsRoutePresentation` 2026-10-23T17:03:47.6291605Z 773 │ } 2026-10-23T17:03:47.6291814Z 774 │ }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]); 2026-10-23T17:03:47.6291929Z ·  ────────────────┬──────────────── 2026-10-23T17:03:47.6292346Z · ╰── Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead 2026-10-23T17:03:47.6292493Z 775 │ 2026-10-23T17:03:47.6292566Z ╰──── 2026-10-23T17:03:47.6293005Z  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-23T17:03:47.6293328Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6293331Z 2026-10-23T17:03:47.6293496Z ⚠ react(immutability): This value cannot be modified 2026-10-23T17:03:47.6293649Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:390:5] 2026-10-23T17:03:47.6293819Z 386 │ typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0; 2026-10-23T17:03:47.6293959Z 387 │ const animatedBorderRadius = useSharedValue(targetBorderRadius); 2026-10-23T17:03:47.6294062Z ·  ──────────┬───────── 2026-10-23T17:03:47.6294225Z · ╰── `animatedBorderRadius` originates here 2026-10-23T17:03:47.6294398Z 388 │ const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android"; 2026-10-23T17:03:47.6294470Z 389 │ useLayoutEffect(() => { 2026-10-23T17:03:47.6294608Z 390 │ animatedBorderRadius.value = shouldAnimate 2026-10-23T17:03:47.6294720Z ·  ──────────┬───────── 2026-10-23T17:03:47.6294896Z · ╰── `animatedBorderRadius` cannot be modified 2026-10-23T17:03:47.6294989Z 391 │ ? withTiming(targetBorderRadius, { 2026-10-23T17:03:47.6295048Z ╰──── 2026-10-23T17:03:47.6295331Z  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-23T17:03:47.6295645Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T17:03:47.6295648Z 2026-10-23T17:03:47.6295863Z ⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used. 2026-10-23T17:03:47.6296004Z ╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10] 2026-10-23T17:03:47.6296066Z 21 │ 2026-10-23T17:03:47.6296240Z 22 │ function summarizePayload(payload: unknown): Readonly> { 2026-10-23T17:03:47.6296340Z ·  ────────┬─────── 2026-10-23T17:03:47.6296615Z · ╰── 'summarizePayload' is declared here 2026-10-23T17:03:47.6296802Z 23 │ if (payload === null) return { valueType: "null" }; 2026-10-23T17:03:47.6296862Z ╰──── 2026-10-23T17:03:47.6296976Z  help: Consider removing this declaration. 2026-10-23T17:03:47.6296979Z 2026-10-23T17:03:47.6297175Z ⚠ eslint(require-yield): This generator function does not have `yield` 2026-10-23T17:03:47.6297328Z ╭─[packages/provider-acp/src/server/mcpOverAcpBridge.ts:81:78] 2026-10-23T17:03:47.6297387Z  80 │ 2026-10-23T17:03:47.6297666Z  81 │ ╭─▶ export const makeAcpMcpOverAcpBridge = Effect.fn("AcpMcpOverAcpBridge.make")(function* ( 2026-10-23T17:03:47.6297788Z  82 │ │ options: AcpMcpOverAcpBridgeOptions, 2026-10-23T17:03:47.6297919Z  83 │ │ ): Effect.fn.Return { 2026-10-23T17:03:47.6298096Z  84 │ │ const fetchImplementation = options.fetchImplementation ?? fetch; 2026-10-23T17:03:47.6298239Z  85 │ │ const connections = new Map(); 2026-10-23T17:03:47.6298323Z  86 │ │ 2026-10-23T17:03:47.6298581Z  87 │ │ const connectionFor = (connectionId: string): Effect.Effect => 2026-10-23T17:03:47.6298697Z  88 │ │ Effect.suspend(() => { 2026-10-23T17:03:47.6298841Z  89 │ │ const connection = connections.get(connectionId); 2026-10-23T17:03:47.6298957Z  90 │ │ return connection === undefined 2026-10-23T17:03:47.6299171Z  91 │ │ ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`)) 2026-10-23T17:03:47.6299297Z  92 │ │ : Effect.succeed(connection); 2026-10-23T17:03:47.6299380Z  93 │ │ }); 2026-10-23T17:03:47.6299454Z  94 │ │ 2026-10-23T17:03:47.6299541Z  95 │ │ const send = ( 2026-10-23T17:03:47.6299666Z  96 │ │ connection: Connection, 2026-10-23T17:03:47.6299791Z  97 │ │ message: unknown, 2026-10-23T17:03:47.6299956Z  98 │ │ ): Effect.Effect, AcpMcpOverAcpError> => 2026-10-23T17:03:47.6300072Z  99 │ │ connection.mutex.withPermits(1)( 2026-10-23T17:03:47.6300216Z 100 │ │ Effect.gen(function* () { 2026-10-23T17:03:47.6300367Z 101 │ │ const body = JSON.stringify(message); 2026-10-23T17:03:47.6300531Z 102 │ │ if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) { 2026-10-23T17:03:47.6300747Z 103 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB.")); 2026-10-23T17:03:47.6300837Z 104 │ │ } 2026-10-23T17:03:47.6300982Z 105 │ │ const response = yield* Effect.tryPromise({ 2026-10-23T17:03:47.6301086Z 106 │ │ try: (signal) => 2026-10-23T17:03:47.6301219Z 107 │ │ fetchImplementation(options.endpoint, { 2026-10-23T17:03:47.6301334Z 108 │ │ method: "POST", 2026-10-23T17:03:47.6301437Z 109 │ │ signal, 2026-10-23T17:03:47.6301542Z 110 │ │ headers: { 2026-10-23T17:03:47.6301762Z 111 │ │ "content-type": "application/json", 2026-10-23T17:03:47.6301957Z 112 │ │ accept: "application/json, text/event-stream", 2026-10-23T17:03:47.6302135Z 113 │ │ authorization: options.authorization, 2026-10-23T17:03:47.6302286Z 114 │ │ ...(connection.sessionId === null 2026-10-23T17:03:47.6302390Z 115 │ │ ? {} 2026-10-23T17:03:47.6302544Z 116 │ │ : { "mcp-session-id": connection.sessionId }), 2026-10-23T17:03:47.6302687Z 117 │ │ ...(connection.protocolVersion === null 2026-10-23T17:03:47.6302790Z 118 │ │ ? {} 2026-10-23T17:03:47.6302958Z 119 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-23T17:03:47.6303057Z 120 │ │ }, 2026-10-23T17:03:47.6303158Z 121 │ │ body, 2026-10-23T17:03:47.6303251Z 122 │ │ }), 2026-10-23T17:03:47.6303355Z 123 │ │ catch: bridgeError, 2026-10-23T17:03:47.6303442Z 124 │ │ }); 2026-10-23T17:03:47.6303662Z 125 │ │ connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId; 2026-10-23T17:03:47.6303769Z 126 │ │ if (!response.ok) { 2026-10-23T17:03:47.6303884Z 127 │ │ yield* Effect.promise( 2026-10-23T17:03:47.6304116Z 128 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-23T17:03:47.6304221Z 129 │ │ ); 2026-10-23T17:03:47.6304340Z 130 │ │ return yield* Effect.fail( 2026-10-23T17:03:47.6304554Z 131 │ │ new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`), 2026-10-23T17:03:47.6304635Z 132 │ │ ); 2026-10-23T17:03:47.6304720Z 133 │ │ } 2026-10-23T17:03:47.6304934Z 134 │ │ const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))]; 2026-10-23T17:03:47.6305062Z 135 │ │ for (const payload of payloads) { 2026-10-23T17:03:47.6305277Z 136 │ │ connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion; 2026-10-23T17:03:47.6305360Z 137 │ │ } 2026-10-23T17:03:47.6305472Z 138 │ │ return payloads; 2026-10-23T17:03:47.6305604Z 139 │ │ }).pipe(Effect.mapError(bridgeError)), 2026-10-23T17:03:47.6305681Z 140 │ │ ); 2026-10-23T17:03:47.6305800Z 141 │ │ 2026-10-23T17:03:47.6305991Z 142 │ │ const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* ( 2026-10-23T17:03:47.6306125Z 143 │ │ request: AcpSchema.DisconnectMcpRequest, 2026-10-23T17:03:47.6306313Z 144 │ │ ): Effect.fn.Return { 2026-10-23T17:03:47.6306487Z 145 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-23T17:03:47.6306618Z 146 │ │ connections.delete(request.connectionId); 2026-10-23T17:03:47.6306844Z 147 │ │ const sessionId = connection.sessionId; 2026-10-23T17:03:47.6307001Z 148 │ │ if (sessionId !== null) { 2026-10-23T17:03:47.6307140Z 149 │ │ const response = yield* Effect.tryPromise({ 2026-10-23T17:03:47.6307247Z 150 │ │ try: (signal) => 2026-10-23T17:03:47.6307387Z 151 │ │ fetchImplementation(options.endpoint, { 2026-10-23T17:03:47.6307489Z 152 │ │ method: "DELETE", 2026-10-23T17:03:47.6307611Z 153 │ │ signal, 2026-10-23T17:03:47.6307730Z 154 │ │ headers: { 2026-10-23T17:03:47.6307880Z 155 │ │ authorization: options.authorization, 2026-10-23T17:03:47.6307999Z 156 │ │ "mcp-session-id": sessionId, 2026-10-23T17:03:47.6308147Z 157 │ │ ...(connection.protocolVersion === null 2026-10-23T17:03:47.6308247Z 158 │ │ ? {} 2026-10-23T17:03:47.6308417Z 159 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-23T17:03:47.6308505Z 160 │ │ }, 2026-10-23T17:03:47.6308592Z 161 │ │ }), 2026-10-23T17:03:47.6308697Z 162 │ │ catch: bridgeError, 2026-10-23T17:03:47.6308788Z 163 │ │ }); 2026-10-23T17:03:47.6308927Z 164 │ │ if (!response.ok && response.status !== 404) { 2026-10-23T17:03:47.6309048Z 165 │ │ return yield* Effect.fail( 2026-10-23T17:03:47.6309169Z 166 │ │ new AcpMcpOverAcpError( 2026-10-23T17:03:47.6309361Z 167 │ │ `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`, 2026-10-23T17:03:47.6309483Z 168 │ │ ), 2026-10-23T17:03:47.6309579Z 169 │ │ ); 2026-10-23T17:03:47.6309663Z 170 │ │ } 2026-10-23T17:03:47.6309812Z 171 │ │ yield* Effect.promise( 2026-10-23T17:03:47.6310000Z 172 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-23T17:03:47.6310084Z 173 │ │ ); 2026-10-23T17:03:47.6310167Z 174 │ │ } 2026-10-23T17:03:47.6310263Z 175 │ │ return {}; 2026-10-23T17:03:47.6310346Z 176 │ │ }); 2026-10-23T17:03:47.6310425Z 177 │ │ 2026-10-23T17:03:47.6310513Z 178 │ │ return { 2026-10-23T17:03:47.6310689Z 179 │ │ connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) { 2026-10-23T17:03:47.6310815Z 180 │ │ if (request.serverId !== "t3-code") { 2026-10-23T17:03:47.6310926Z 181 │ │ return yield* Effect.fail( 2026-10-23T17:03:47.6311119Z 182 │ │ new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`), 2026-10-23T17:03:47.6311233Z 183 │ │ ); 2026-10-23T17:03:47.6311332Z 184 │ │ } 2026-10-23T17:03:47.6311461Z 185 │ │ if (connections.size >= MAX_CONNECTIONS) { 2026-10-23T17:03:47.6311789Z 186 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections.")); 2026-10-23T17:03:47.6311913Z 187 │ │ } 2026-10-23T17:03:47.6312073Z 188 │ │ const connectionId = yield* options.allocateConnectionId; 2026-10-23T17:03:47.6312193Z 189 │ │ connections.set(connectionId, { 2026-10-23T17:03:47.6312320Z 190 │ │ mutex: yield* Semaphore.make(1), 2026-10-23T17:03:47.6312422Z 191 │ │ sessionId: null, 2026-10-23T17:03:47.6312532Z 192 │ │ protocolVersion: null, 2026-10-23T17:03:47.6312636Z 193 │ │ nextRequestId: 0, 2026-10-23T17:03:47.6312721Z 194 │ │ }); 2026-10-23T17:03:47.6312834Z 195 │ │ return { connectionId }; 2026-10-23T17:03:47.6312921Z 196 │ │ }), 2026-10-23T17:03:47.6313122Z 197 │ │ message: Effect.fn("mcpOverAcpBridge.message")(function* (request) { 2026-10-23T17:03:47.6313306Z 198 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-23T17:03:47.6313446Z 199 │ │ const id = ++connection.nextRequestId; 2026-10-23T17:03:47.6313579Z 200 │ │ const payloads = yield* send(connection, { 2026-10-23T17:03:47.6313679Z 201 │ │ jsonrpc: "2.0", 2026-10-23T17:03:47.6313764Z 202 │ │ id, 2026-10-23T17:03:47.6313877Z 203 │ │ method: request.method, 2026-10-23T17:03:47.6314043Z 204 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-23T17:03:47.6314121Z 205 │ │ }); 2026-10-23T17:03:47.6314327Z 206 │ │ const response = payloads.find((payload) => asEnvelope(payload)?.id === id); 2026-10-23T17:03:47.6314458Z 207 │ │ const envelope = asEnvelope(response); 2026-10-23T17:03:47.6314567Z 208 │ │ if (envelope === null) { 2026-10-23T17:03:47.6314678Z 209 │ │ return yield* Effect.fail( 2026-10-23T17:03:47.6314898Z 210 │ │ new AcpMcpOverAcpError("MCP server did not return a matching response."), 2026-10-23T17:03:47.6315005Z 211 │ │ ); 2026-10-23T17:03:47.6315085Z 212 │ │ } 2026-10-23T17:03:47.6315217Z 213 │ │ if (envelope.error !== undefined) { 2026-10-23T17:03:47.6315423Z 214 │ │ return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error))); 2026-10-23T17:03:47.6315507Z 215 │ │ } 2026-10-23T17:03:47.6315690Z 216 │ │ return (envelope.result ?? null) as AcpSchema.MessageMcpResponse; 2026-10-23T17:03:47.6315772Z 217 │ │ }), 2026-10-23T17:03:47.6315973Z 218 │ │ notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) { 2026-10-23T17:03:47.6316143Z 219 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-23T17:03:47.6316258Z 220 │ │ yield* send(connection, { 2026-10-23T17:03:47.6316363Z 221 │ │ jsonrpc: "2.0", 2026-10-23T17:03:47.6316468Z 222 │ │ method: request.method, 2026-10-23T17:03:47.6316749Z 223 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-23T17:03:47.6316967Z 224 │ │ }); 2026-10-23T17:03:47.6317083Z 225 │ │ }), 2026-10-23T17:03:47.6317183Z 226 │ │ disconnect, 2026-10-23T17:03:47.6317329Z 227 │ │ dispose: Effect.suspend(() => 2026-10-23T17:03:47.6317440Z 228 │ │ Effect.forEach( 2026-10-23T17:03:47.6317566Z 229 │ │ [...connections.keys()], 2026-10-23T17:03:47.6317747Z 230 │ │ (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore), 2026-10-23T17:03:47.6317875Z 231 │ │ { discard: true }, 2026-10-23T17:03:47.6317978Z 232 │ │ ), 2026-10-23T17:03:47.6318079Z 233 │ │ ), 2026-10-23T17:03:47.6318170Z 234 │ │ }; 2026-10-23T17:03:47.6318329Z 235 │ ╰─▶ }); 2026-10-23T17:03:47.6318397Z ╰──── 2026-10-23T17:03:47.6318991Z  help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed. 2026-10-23T17:03:47.6318995Z 2026-10-23T17:03:47.6319275Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T17:03:47.6319465Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:361:7] 2026-10-23T17:03:47.6319626Z 355 │ }, [cancelledIncomingShareId, navigation, props.incomingShareId]); 2026-10-23T17:03:47.6319798Z 356 │ useEffect(() => { 2026-10-23T17:03:47.6319911Z ·  ────┬──── 2026-10-23T17:03:47.6320095Z · ╰── This is the containing effect 2026-10-23T17:03:47.6320207Z 357 │ if (!isReturningToProjectPicker) { 2026-10-23T17:03:47.6320300Z 358 │ return; 2026-10-23T17:03:47.6320364Z 359 │ } 2026-10-23T17:03:47.6320485Z 360 │ if (requestedInitialProjectAvailable) { 2026-10-23T17:03:47.6320606Z 361 │ setIsReturningToProjectPicker(false); 2026-10-23T17:03:47.6320740Z ·  ──────────────┬────────────── 2026-10-23T17:03:47.6320934Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6321024Z 362 │ return; 2026-10-23T17:03:47.6321094Z ╰──── 2026-10-23T17:03:47.6321721Z  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-23T17:03:47.6322063Z  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-23T17:03:47.6322072Z 2026-10-23T17:03:47.6322374Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T17:03:47.6322555Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:504:9] 2026-10-23T17:03:47.6322637Z 447 │ 2026-10-23T17:03:47.6322716Z 448 │ useEffect(() => { 2026-10-23T17:03:47.6322790Z ·  ────┬──── 2026-10-23T17:03:47.6322931Z · ╰── This is the containing effect 2026-10-23T17:03:47.6323273Z 449 │ if (props.pendingTaskId || props.draftId) { 2026-10-23T17:03:47.6323428Z 450 │ return; 2026-10-23T17:03:47.6323489Z 451 │ } 2026-10-23T17:03:47.6323638Z 452 │ if (lastInitialProjectRefRef.current !== props.initialProjectRef) { 2026-10-23T17:03:47.6323774Z 453 │ lastInitialProjectRefRef.current = props.initialProjectRef; 2026-10-23T17:03:47.6323888Z 454 │ appliedInitialProjectKeyRef.current = null; 2026-10-23T17:03:47.6323945Z 455 │ } 2026-10-23T17:03:47.6324095Z 456 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-23T17:03:47.6324230Z 457 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-23T17:03:47.6324365Z 458 │ if (initialEnvironmentId && initialProjectId) { 2026-10-23T17:03:47.6324470Z 459 │ const directProject = 2026-10-23T17:03:47.6324551Z 460 │ projects.find( 2026-10-23T17:03:47.6324641Z 461 │ (project) => 2026-10-23T17:03:47.6324826Z 462 │ project.environmentId === initialEnvironmentId && project.id === initialProjectId, 2026-10-23T17:03:47.6324901Z 463 │ ) ?? null; 2026-10-23T17:03:47.6324963Z 464 │ 2026-10-23T17:03:47.6325043Z 465 │ if (directProject) { 2026-10-23T17:03:47.6325183Z 466 │ // Apply the route's project once. Re-applying on every change would 2026-10-23T17:03:47.6325337Z 467 │ // instantly revert environment/project switches made in the picker. 2026-10-23T17:03:47.6325510Z 468 │ const directProjectKey = `${directProject.environmentId}:${directProject.id}`; 2026-10-23T17:03:47.6325658Z 469 │ if (appliedInitialProjectKeyRef.current === directProjectKey) { 2026-10-23T17:03:47.6325723Z 470 │ return; 2026-10-23T17:03:47.6325796Z 471 │ } 2026-10-23T17:03:47.6325914Z 472 │ if (props.initialProjectRef?.branch) { 2026-10-23T17:03:47.6325987Z 473 │ if ( 2026-10-23T17:03:47.6326135Z 474 │ selectedProject?.environmentId !== directProject.environmentId || 2026-10-23T17:03:47.6326245Z 475 │ selectedProject.id !== directProject.id 2026-10-23T17:03:47.6326316Z 476 │ ) { 2026-10-23T17:03:47.6326411Z 477 │ setProject(directProject); 2026-10-23T17:03:47.6326505Z 478 │ return; 2026-10-23T17:03:47.6326599Z 479 │ } 2026-10-23T17:03:47.6326696Z 480 │ if (!flow.draftKey) return; 2026-10-23T17:03:47.6326853Z 481 │ // The route completes checkout before mounting this composer. Local 2026-10-23T17:03:47.6326998Z 482 │ // mode reuses an existing worktree; worktree mode would create another. 2026-10-23T17:03:47.6327134Z 483 │ updateComposerDraftSettings(flow.draftKey, { 2026-10-23T17:03:47.6327334Z 484 │ workspaceSelection: { 2026-10-23T17:03:47.6327500Z 485 │ mode: "local", 2026-10-23T17:03:47.6327608Z 486 │ branch: props.initialProjectRef.branch, 2026-10-23T17:03:47.6327753Z 487 │ worktreePath: props.initialProjectRef.worktreePath ?? null, 2026-10-23T17:03:47.6327848Z 488 │ startFromOrigin: false, 2026-10-23T17:03:47.6327927Z 489 │ }, 2026-10-23T17:03:47.6327993Z 490 │ }); 2026-10-23T17:03:47.6328062Z 491 │ } 2026-10-23T17:03:47.6328196Z 492 │ appliedInitialProjectKeyRef.current = directProjectKey; 2026-10-23T17:03:47.6328269Z 493 │ if ( 2026-10-23T17:03:47.6328455Z 494 │ selectedProject?.environmentId === directProject.environmentId && 2026-10-23T17:03:47.6328574Z 495 │ selectedProject.id === directProject.id 2026-10-23T17:03:47.6328667Z 496 │ ) { 2026-10-23T17:03:47.6328754Z 497 │ return; 2026-10-23T17:03:47.6328821Z 498 │ } 2026-10-23T17:03:47.6328919Z 499 │ setProject(directProject); 2026-10-23T17:03:47.6329000Z 500 │ return; 2026-10-23T17:03:47.6329060Z 501 │ } 2026-10-23T17:03:47.6329134Z 502 │ 2026-10-23T17:03:47.6329230Z 503 │ if (projects.length > 0) { 2026-10-23T17:03:47.6329345Z 504 │ setIsReturningToProjectPicker(true); 2026-10-23T17:03:47.6329466Z ·  ──────────────┬────────────── 2026-10-23T17:03:47.6329699Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6329775Z 505 │ } 2026-10-23T17:03:47.6329843Z ╰──── 2026-10-23T17:03:47.6330468Z  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-23T17:03:47.6330807Z  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-23T17:03:47.6330811Z 2026-10-23T17:03:47.6331124Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T17:03:47.6331309Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:604:5] 2026-10-23T17:03:47.6331381Z 545 │ 2026-10-23T17:03:47.6331449Z 546 │ useEffect(() => { 2026-10-23T17:03:47.6331531Z ·  ────┬──── 2026-10-23T17:03:47.6331677Z · ╰── This is the containing effect 2026-10-23T17:03:47.6331781Z 547 │ const shareId = props.incomingShareId; 2026-10-23T17:03:47.6331867Z 548 │ const draftKey = flow.draftKey; 2026-10-23T17:03:47.6331976Z 549 │ const destinationProject = selectedProject; 2026-10-23T17:03:47.6332129Z 550 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-23T17:03:47.6332265Z 551 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-23T17:03:47.6332355Z 552 │ const selectedProjectMatchesRoute = 2026-10-23T17:03:47.6332444Z 553 │ !initialEnvironmentId || 2026-10-23T17:03:47.6332520Z 554 │ !initialProjectId || 2026-10-23T17:03:47.6332653Z 555 │ (destinationProject?.environmentId === initialEnvironmentId && 2026-10-23T17:03:47.6332758Z 556 │ destinationProject.id === initialProjectId); 2026-10-23T17:03:47.6332913Z 557 │ if ( 2026-10-23T17:03:47.6333085Z 558 │ !shareId || 2026-10-23T17:03:47.6333157Z 559 │ !draftKey || 2026-10-23T17:03:47.6333241Z 560 │ !destinationProject || 2026-10-23T17:03:47.6333337Z 561 │ !selectedProjectMatchesRoute || 2026-10-23T17:03:47.6333437Z 562 │ cancelledIncomingShareId === shareId 2026-10-23T17:03:47.6333495Z 563 │ ) { 2026-10-23T17:03:47.6333562Z 564 │ return; 2026-10-23T17:03:47.6333624Z 565 │ } 2026-10-23T17:03:47.6333729Z 566 │ const importKey = `${shareId}:${draftKey}`; 2026-10-23T17:03:47.6333788Z 567 │ if ( 2026-10-23T17:03:47.6333906Z 568 │ startedShareImportKeyRef.current === importKey || 2026-10-23T17:03:47.6334021Z 569 │ cancellingShareImportKeyRef.current === importKey 2026-10-23T17:03:47.6334083Z 570 │ ) { 2026-10-23T17:03:47.6334145Z 571 │ return; 2026-10-23T17:03:47.6334210Z 572 │ } 2026-10-23T17:03:47.6334268Z 573 │ 2026-10-23T17:03:47.6334350Z 574 │ if (!incomingShare) { 2026-10-23T17:03:47.6334544Z 575 │ if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) { 2026-10-23T17:03:47.6334676Z 576 │ alertedUnavailableIncomingShareIdRef.current = shareId; 2026-10-23T17:03:47.6334746Z 577 │ Dialog.alert( 2026-10-23T17:03:47.6334862Z 578 │ "Shared content unavailable", 2026-10-23T17:03:47.6335058Z 579 │ "The shared content is no longer in the inbox. You can continue editing this task draft.", 2026-10-23T17:03:47.6335135Z 580 │ ); 2026-10-23T17:03:47.6335194Z 581 │ } 2026-10-23T17:03:47.6335261Z 582 │ return; 2026-10-23T17:03:47.6335319Z 583 │ } 2026-10-23T17:03:47.6335375Z 584 │ 2026-10-23T17:03:47.6335436Z 585 │ if ( 2026-10-23T17:03:47.6335602Z 586 │ incomingShare.attachments.some((attachment) => attachment.type === "file") && 2026-10-23T17:03:47.6335712Z 587 │ selectedEnvironmentServerConfig === null 2026-10-23T17:03:47.6335774Z 588 │ ) { 2026-10-23T17:03:47.6335843Z 589 │ return; 2026-10-23T17:03:47.6335899Z 590 │ } 2026-10-23T17:03:47.6335959Z 591 │ 2026-10-23T17:03:47.6336103Z 592 │ if (alertedUnavailableIncomingShareIdRef.current === shareId) { 2026-10-23T17:03:47.6336231Z 593 │ alertedUnavailableIncomingShareIdRef.current = null; 2026-10-23T17:03:47.6336292Z 594 │ } 2026-10-23T17:03:47.6336414Z 595 │ startedShareImportKeyRef.current = importKey; 2026-10-23T17:03:47.6336497Z 596 │ const draftBackup = 2026-10-23T17:03:47.6336695Z 597 │ shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey); 2026-10-23T17:03:47.6336838Z 598 │ shareImportDraftBackupRef.current.set(importKey, draftBackup); 2026-10-23T17:03:47.6336941Z 599 │ const importToken = Symbol(importKey); 2026-10-23T17:03:47.6337030Z 600 │ let didReserveShare = false; 2026-10-23T17:03:47.6337113Z 601 │ let didConsumeShare = false; 2026-10-23T17:03:47.6337194Z 602 │ let needsDraftRestore = false; 2026-10-23T17:03:47.6337325Z 603 │ activeShareImportTokenRef.current = importToken; 2026-10-23T17:03:47.6337414Z 604 │ setImportingShareKey(importKey); 2026-10-23T17:03:47.6337534Z ·  ──────────┬───────── 2026-10-23T17:03:47.6337758Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6337838Z 605 │ void (async () => { 2026-10-23T17:03:47.6337909Z ╰──── 2026-10-23T17:03:47.6417727Z  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-23T17:03:47.6418814Z  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-23T17:03:47.6418853Z 2026-10-23T17:03:47.6419258Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T17:03:47.6419458Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:524:5] 2026-10-23T17:03:47.6419562Z 523 │ props.initialProjectRef, 2026-10-23T17:03:47.6419646Z 524 │ props.incomingShareId, 2026-10-23T17:03:47.6419826Z ·  ──────────┬────────── 2026-10-23T17:03:47.6420042Z · ╰── Unnecessary dependency `props.incomingShareId` 2026-10-23T17:03:47.6420127Z 525 │ props.pendingTaskId, 2026-10-23T17:03:47.6420187Z ╰──── 2026-10-23T17:03:47.6420504Z  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-23T17:03:47.6420834Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6420837Z 2026-10-23T17:03:47.6421068Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T17:03:47.6421232Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:543:5] 2026-10-23T17:03:47.6421362Z 542 │ loadedBranchesProjectKeyRef.current = projectKey; 2026-10-23T17:03:47.6421449Z 543 │ flow.loadBranches(); 2026-10-23T17:03:47.6421531Z ·  ──┬─ 2026-10-23T17:03:47.6421732Z · ╰── Missing dependency `flow` 2026-10-23T17:03:47.6421827Z 544 │ }, [flow.loadBranches, selectedProject]); 2026-10-23T17:03:47.6421940Z ·  ────────┬──────── 2026-10-23T17:03:47.6422154Z · ╰── Overly precise dependency `flow.loadBranches`, use `flow` instead 2026-10-23T17:03:47.6422216Z 545 │ 2026-10-23T17:03:47.6422271Z ╰──── 2026-10-23T17:03:47.6422706Z  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-23T17:03:47.6423035Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6423043Z 2026-10-23T17:03:47.6423256Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T17:03:47.6423423Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:766:5] 2026-10-23T17:03:47.6423494Z 765 │ flow.draftKey, 2026-10-23T17:03:47.6423581Z 766 │ hasImportedIncomingShare, 2026-10-23T17:03:47.6423702Z ·  ────────────┬─────────── 2026-10-23T17:03:47.6423902Z · ╰── Unnecessary dependency `hasImportedIncomingShare` 2026-10-23T17:03:47.6423980Z 767 │ incomingShare, 2026-10-23T17:03:47.6424299Z 768 │ isIncomingShareInboxLoading, 2026-10-23T17:03:47.6424471Z ·  ─────────────┬───────────── 2026-10-23T17:03:47.6424666Z · ╰── Unnecessary dependency `isIncomingShareInboxLoading` 2026-10-23T17:03:47.6424750Z 769 │ isIncomingShareUnavailable, 2026-10-23T17:03:47.6424828Z 770 │ props.incomingShareId, 2026-10-23T17:03:47.6424933Z 771 │ props.initialProjectRef?.environmentId, 2026-10-23T17:03:47.6425029Z 772 │ props.initialProjectRef?.projectId, 2026-10-23T17:03:47.6425112Z 773 │ releaseShareReservation, 2026-10-23T17:03:47.6425192Z 774 │ reserveShare, 2026-10-23T17:03:47.6425285Z 775 │ selectedEnvironmentServerConfig, 2026-10-23T17:03:47.6425364Z 776 │ selectedProject, 2026-10-23T17:03:47.6425434Z 777 │ shareImportAttempt, 2026-10-23T17:03:47.6425527Z ·  ─────────┬──────── 2026-10-23T17:03:47.6425714Z · ╰── Unnecessary dependency `shareImportAttempt` 2026-10-23T17:03:47.6425775Z 778 │ ]); 2026-10-23T17:03:47.6425837Z ╰──── 2026-10-23T17:03:47.6426197Z  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-23T17:03:47.6426528Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6426531Z 2026-10-23T17:03:47.6426804Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T17:03:47.6426970Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:444:5] 2026-10-23T17:03:47.6427054Z 434 │ : null; 2026-10-23T17:03:47.6427140Z 435 │ useEffect(() => { 2026-10-23T17:03:47.6427229Z ·  ────┬──── 2026-10-23T17:03:47.6427361Z · ╰── This is the containing effect 2026-10-23T17:03:47.6427431Z 436 │ if ( 2026-10-23T17:03:47.6427518Z 437 │ props.active === false || 2026-10-23T17:03:47.6427603Z 438 │ activeDraftKey !== null || 2026-10-23T17:03:47.6427690Z 439 │ editingPendingTask !== null || 2026-10-23T17:03:47.6427773Z 440 │ selectedProject === null 2026-10-23T17:03:47.6427836Z 441 │ ) { 2026-10-23T17:03:47.6427906Z 442 │ return; 2026-10-23T17:03:47.6427963Z 443 │ } 2026-10-23T17:03:47.6428051Z 444 │ setActiveDraftKey( 2026-10-23T17:03:47.6428146Z ·  ────────┬──────── 2026-10-23T17:03:47.6428334Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6428426Z 445 │ createNewTaskDraft({ 2026-10-23T17:03:47.6428530Z ╰──── 2026-10-23T17:03:47.6429176Z  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-23T17:03:47.6429506Z  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-23T17:03:47.6429510Z 2026-10-23T17:03:47.6429810Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-23T17:03:47.6430114Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1244:36] 2026-10-23T17:03:47.6430320Z 1243 │ 2026-10-23T17:03:47.6430526Z 1244 │ {props.children} 2026-10-23T17:03:47.6430651Z ·  ───────────── 2026-10-23T17:03:47.6430728Z 1245 │ 2026-10-23T17:03:47.6430793Z ╰──── 2026-10-23T17:03:47.6431071Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-23T17:03:47.6431251Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-23T17:03:47.6431254Z 2026-10-23T17:03:47.6431734Z ⚠ 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-23T17:03:47.6431871Z ╭─[packages/effect-acp/src/protocol.test.ts:500:31] 2026-10-23T17:03:47.6431931Z 499 │ 2026-10-23T17:03:47.6432071Z 500 │ const response = yield* Schema.decodeUnknownEffect( 2026-10-23T17:03:47.6432193Z ·  ────────────────────────── 2026-10-23T17:03:47.6432314Z 501 │ Schema.fromJsonString(JsonRpcErrorResponse), 2026-10-23T17:03:47.6432375Z ╰──── 2026-10-23T17:03:47.6432377Z 2026-10-23T17:03:47.6432579Z ⚠ eslint(no-unused-vars): Identifier 'Image' is imported but never used. 2026-10-23T17:03:47.6432727Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:17:10] 2026-10-23T17:03:47.6432877Z 16 │ import type { NativeSyntheticEvent, ViewProps } from "react-native"; 2026-10-23T17:03:47.6433005Z 17 │ import { Image, Platform, StyleSheet } from "react-native"; 2026-10-23T17:03:47.6433120Z ·  ──┬── 2026-10-23T17:03:47.6433264Z · ╰── 'Image' is imported here 2026-10-23T17:03:47.6433330Z 18 │ 2026-10-23T17:03:47.6433413Z ╰──── 2026-10-23T17:03:47.6433525Z  help: Consider removing this import. 2026-10-23T17:03:47.6433528Z 2026-10-23T17:03:47.6433737Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-23T17:03:47.6433885Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:227:6] 2026-10-23T17:03:47.6434056Z 223 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-23T17:03:47.6434159Z 224 │ nativeEventSnapshotsRef.current, 2026-10-23T17:03:47.6434260Z ·  ───────────┬─────────── 2026-10-23T17:03:47.6434744Z · ╰── 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-23T17:03:47.6434827Z 225 │ mostRecentEventCount, 2026-10-23T17:03:47.6434896Z 226 │ ); 2026-10-23T17:03:47.6435025Z 227 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-23T17:03:47.6435159Z ·  ──────────────────────────┬────────────────────────── 2026-10-23T17:03:47.6435408Z · ╰── This dependency list is missing values used by the callback 2026-10-23T17:03:47.6435626Z 228 │ const assumedValue = props.value; 2026-10-23T17:03:47.6435767Z ╰──── 2026-10-23T17:03:47.6435941Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-23T17:03:47.6436269Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6436272Z 2026-10-23T17:03:47.6436496Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T17:03:47.6436646Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:235:7] 2026-10-23T17:03:47.6436797Z 234 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-23T17:03:47.6436887Z 235 │ nativeEventSnapshotsRef.current, 2026-10-23T17:03:47.6436988Z ·  ───────────┬─────────── 2026-10-23T17:03:47.6437498Z · ╰── 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-23T17:03:47.6437588Z 236 │ controlledEventCount, 2026-10-23T17:03:47.6437666Z 237 │ assumedValue, 2026-10-23T17:03:47.6437731Z 238 │ ); 2026-10-23T17:03:47.6437894Z 239 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-23T17:03:47.6438051Z ·  ───────────┬────────── 2026-10-23T17:03:47.6438270Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-23T17:03:47.6438377Z 240 │ const acceptNativeEvent = useCallback( 2026-10-23T17:03:47.6438438Z ╰──── 2026-10-23T17:03:47.6439147Z  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-23T17:03:47.6439497Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6439508Z 2026-10-23T17:03:47.6439736Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.6439969Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:160:29] 2026-10-23T17:03:47.6440164Z 159 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T17:03:47.6440523Z 160 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T17:03:47.6440697Z ·  ─────────────┬──────────── 2026-10-23T17:03:47.6440875Z · ╰── Cannot access ref value during render 2026-10-23T17:03:47.6440944Z 161 │ }); 2026-10-23T17:03:47.6441004Z ╰──── 2026-10-23T17:03:47.6441485Z  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-23T17:03:47.6441835Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.6441839Z 2026-10-23T17:03:47.6442017Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.6442181Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:160:29] 2026-10-23T17:03:47.6442312Z 159 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T17:03:47.6442427Z 160 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T17:03:47.6442559Z ·  ─────────────┬──────────── 2026-10-23T17:03:47.6442781Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T17:03:47.6442847Z 161 │ }); 2026-10-23T17:03:47.6442902Z ╰──── 2026-10-23T17:03:47.6443385Z  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-23T17:03:47.6443682Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.6443684Z 2026-10-23T17:03:47.6443863Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.6444032Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:23] 2026-10-23T17:03:47.6444091Z 161 │ }); 2026-10-23T17:03:47.6444214Z 162 │ confirmedTokensRef.current = tokens; 2026-10-23T17:03:47.6444349Z ·  ─────────┬────────────┬─── 2026-10-23T17:03:47.6444550Z · │ ╰── Cannot update ref value during render 2026-10-23T17:03:47.6444678Z · ╰── This value is a ref 2026-10-23T17:03:47.6444761Z 163 │ return JSON.stringify( 2026-10-23T17:03:47.6444823Z ╰──── 2026-10-23T17:03:47.6445289Z  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-23T17:03:47.6445584Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.6445586Z 2026-10-23T17:03:47.6445747Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.6445901Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:204:5] 2026-10-23T17:03:47.6445984Z 203 │ mostRecentEventCount, 2026-10-23T17:03:47.6446212Z 204 │ nativeEventSnapshotsRef.current, 2026-10-23T17:03:47.6446403Z ·  ───────────────┬─────────────── 2026-10-23T17:03:47.6446604Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T17:03:47.6446673Z 205 │ ); 2026-10-23T17:03:47.6446726Z ╰──── 2026-10-23T17:03:47.6447204Z  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-23T17:03:47.6447501Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.6447504Z 2026-10-23T17:03:47.6447660Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.6447829Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:210:5] 2026-10-23T17:03:47.6447902Z 209 │ mostRecentEventCount, 2026-10-23T17:03:47.6447997Z 210 │ nativeEventSnapshotsRef.current, 2026-10-23T17:03:47.6448113Z ·  ───────────────┬─────────────── 2026-10-23T17:03:47.6448344Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T17:03:47.6448417Z 211 │ ); 2026-10-23T17:03:47.6448485Z ╰──── 2026-10-23T17:03:47.6448970Z  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-23T17:03:47.6449276Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.6449283Z 2026-10-23T17:03:47.6449478Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-23T17:03:47.6449623Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:195:6] 2026-10-23T17:03:47.6449822Z 159 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T17:03:47.6449941Z 160 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T17:03:47.6450059Z ·  ─────────┬──────── 2026-10-23T17:03:47.6450565Z · ╰── 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-23T17:03:47.6450651Z 161 │ }); 2026-10-23T17:03:47.6450766Z 162 │ confirmedTokensRef.current = tokens; 2026-10-23T17:03:47.6450860Z 163 │ return JSON.stringify( 2026-10-23T17:03:47.6451024Z 164 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-23T17:03:47.6451105Z 165 │ const record = 2026-10-23T17:03:47.6451194Z 166 │ token.type === "context" 2026-10-23T17:03:47.6451369Z 167 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-23T17:03:47.6451436Z 168 │ : undefined; 2026-10-23T17:03:47.6451554Z 169 │ const presentation = contextChipPresentation( 2026-10-23T17:03:47.6451676Z 170 │ token.type === "context" ? token.kind : token.type, 2026-10-23T17:03:47.6451838Z 171 │ record, 2026-10-23T17:03:47.6451940Z 172 │ ); 2026-10-23T17:03:47.6452038Z 173 │ const icon = contextChipIcon( 2026-10-23T17:03:47.6452116Z 174 │ presentation, 2026-10-23T17:03:47.6452268Z 175 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-23T17:03:47.6452331Z 176 │ ); 2026-10-23T17:03:47.6452405Z 177 │ return { 2026-10-23T17:03:47.6452486Z 178 │ type: token.type, 2026-10-23T17:03:47.6452574Z 179 │ source: token.source, 2026-10-23T17:03:47.6452660Z 180 │ start: token.start, 2026-10-23T17:03:47.6452766Z 181 │ end: token.end, 2026-10-23T17:03:47.6452893Z 182 │ accent: presentation.accent, 2026-10-23T17:03:47.6452965Z 183 │ label: 2026-10-23T17:03:47.6453059Z 184 │ token.type === "skill" 2026-10-23T17:03:47.6453185Z 185 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-23T17:03:47.6453275Z 186 │ : token.type === "context" 2026-10-23T17:03:47.6453520Z 187 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-23T17:03:47.6453611Z 188 │ : basename(token.value), 2026-10-23T17:03:47.6453764Z 189 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-23T17:03:47.6453869Z 190 │ iconUri: contextChipIconUri(icon), 2026-10-23T17:03:47.6453966Z 191 │ tintsIcon: icon.kind === "chip", 2026-10-23T17:03:47.6454026Z 192 │ }; 2026-10-23T17:03:47.6454097Z 193 │ }), 2026-10-23T17:03:47.6454160Z 194 │ ); 2026-10-23T17:03:47.6454263Z 195 │ }, [props.value, props.context, skillLabels]); 2026-10-23T17:03:47.6454398Z ·  ────────────────────┬──────────────────── 2026-10-23T17:03:47.6454610Z · ╰── This dependency list is missing values used by the callback 2026-10-23T17:03:47.6454761Z 196 │ // Every render resolves against the snapshot history, so a render whose 2026-10-23T17:03:47.6454825Z ╰──── 2026-10-23T17:03:47.6455080Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-23T17:03:47.6455419Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6455422Z 2026-10-23T17:03:47.6455622Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-23T17:03:47.6455782Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:257:5] 2026-10-23T17:03:47.6455926Z 249 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-23T17:03:47.6456039Z 250 │ nativeEventSnapshotsRef.current.push({ 2026-10-23T17:03:47.6456147Z ·  ───────────┬─────────── 2026-10-23T17:03:47.6456621Z · ╰── 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-23T17:03:47.6456725Z 251 │ eventCount: acknowledgedEventCount, 2026-10-23T17:03:47.6456795Z 252 │ value, 2026-10-23T17:03:47.6456895Z 253 │ selection: nextSelection, 2026-10-23T17:03:47.6456963Z 254 │ }); 2026-10-23T17:03:47.6457050Z 255 │ return acknowledgedEventCount; 2026-10-23T17:03:47.6457255Z 256 │ }, 2026-10-23T17:03:47.6457409Z 257 │ [], 2026-10-23T17:03:47.6457511Z ·  ─┬ 2026-10-23T17:03:47.6457709Z · ╰── This dependency list is missing values used by the callback 2026-10-23T17:03:47.6457775Z 258 │ ); 2026-10-23T17:03:47.6457838Z ╰──── 2026-10-23T17:03:47.6458053Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-23T17:03:47.6458363Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6458374Z 2026-10-23T17:03:47.6458624Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-23T17:03:47.6458800Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:290:50] 2026-10-23T17:03:47.6458881Z 289 │ return ( 2026-10-23T17:03:47.6459025Z 290 │ 2026-10-23T17:03:47.6459153Z ·  ───────────── 2026-10-23T17:03:47.6459241Z 291 │ {props.children} 2026-10-23T17:03:47.6459303Z ╰──── 2026-10-23T17:03:47.6459570Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-23T17:03:47.6459742Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-23T17:03:47.6459745Z 2026-10-23T17:03:47.6460028Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-23T17:03:47.6460233Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:654:44] 2026-10-23T17:03:47.6460305Z 653 │ return ( 2026-10-23T17:03:47.6460430Z 654 │ 2026-10-23T17:03:47.6460562Z ·  ───────────── 2026-10-23T17:03:47.6460641Z 655 │ {props.children} 2026-10-23T17:03:47.6460703Z ╰──── 2026-10-23T17:03:47.6460932Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-23T17:03:47.6461074Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-23T17:03:47.6461077Z 2026-10-23T17:03:47.6461322Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-23T17:03:47.6461574Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1462:55] 2026-10-23T17:03:47.6461760Z 1461 │ return ( 2026-10-23T17:03:47.6461975Z 1462 │ 2026-10-23T17:03:47.6462137Z ·  ──────────────────── 2026-10-23T17:03:47.6462249Z 1463 │ 2026-10-23T17:03:47.6463549Z 1269 │ Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe( 2026-10-23T17:03:47.6463668Z ·  ────────────────────────── 2026-10-23T17:03:47.6463846Z 1270 │ Effect.mapError(() => AcpError.AcpRequestError.invalidParams()), 2026-10-23T17:03:47.6463909Z ╰──── 2026-10-23T17:03:47.6463912Z 2026-10-23T17:03:47.6464146Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-23T17:03:47.6464296Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:229:6] 2026-10-23T17:03:47.6464472Z 225 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-23T17:03:47.6464569Z 226 │ nativeEventSnapshotsRef.current, 2026-10-23T17:03:47.6464669Z ·  ───────────┬─────────── 2026-10-23T17:03:47.6465141Z · ╰── 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-23T17:03:47.6465225Z 227 │ mostRecentEventCount, 2026-10-23T17:03:47.6465287Z 228 │ ); 2026-10-23T17:03:47.6465414Z 229 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-23T17:03:47.6465557Z ·  ──────────────────────────┬────────────────────────── 2026-10-23T17:03:47.6465795Z · ╰── This dependency list is missing values used by the callback 2026-10-23T17:03:47.6465932Z 230 │ const assumedValue = props.value; 2026-10-23T17:03:47.6465986Z ╰──── 2026-10-23T17:03:47.6466173Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-23T17:03:47.6466500Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6466503Z 2026-10-23T17:03:47.6466723Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T17:03:47.6466860Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:237:7] 2026-10-23T17:03:47.6467013Z 236 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-23T17:03:47.6467187Z 237 │ nativeEventSnapshotsRef.current, 2026-10-23T17:03:47.6467341Z ·  ───────────┬─────────── 2026-10-23T17:03:47.6467850Z · ╰── 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-23T17:03:47.6467930Z 238 │ controlledEventCount, 2026-10-23T17:03:47.6468021Z 239 │ assumedValue, 2026-10-23T17:03:47.6468084Z 240 │ ); 2026-10-23T17:03:47.6468251Z 241 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-23T17:03:47.6468388Z ·  ───────────┬────────── 2026-10-23T17:03:47.6468617Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-23T17:03:47.6468721Z 242 │ const acceptNativeEvent = useCallback( 2026-10-23T17:03:47.6468783Z ╰──── 2026-10-23T17:03:47.6469208Z  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-23T17:03:47.6469529Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6469533Z 2026-10-23T17:03:47.6469753Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.6469918Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:162:29] 2026-10-23T17:03:47.6470063Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T17:03:47.6470185Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T17:03:47.6470322Z ·  ─────────────┬──────────── 2026-10-23T17:03:47.6470501Z · ╰── Cannot access ref value during render 2026-10-23T17:03:47.6470563Z 163 │ }); 2026-10-23T17:03:47.6470617Z ╰──── 2026-10-23T17:03:47.6471102Z  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-23T17:03:47.6471404Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.6471412Z 2026-10-23T17:03:47.6471567Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.6471753Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:162:29] 2026-10-23T17:03:47.6471888Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T17:03:47.6472007Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T17:03:47.6472132Z ·  ─────────────┬──────────── 2026-10-23T17:03:47.6472395Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T17:03:47.6472461Z 163 │ }); 2026-10-23T17:03:47.6472523Z ╰──── 2026-10-23T17:03:47.6473104Z  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-23T17:03:47.6473447Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.6473450Z 2026-10-23T17:03:47.6473599Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.6473748Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:23] 2026-10-23T17:03:47.6473813Z 163 │ }); 2026-10-23T17:03:47.6473915Z 164 │ confirmedTokensRef.current = tokens; 2026-10-23T17:03:47.6474042Z ·  ─────────┬────────────┬─── 2026-10-23T17:03:47.6474275Z · │ ╰── Cannot update ref value during render 2026-10-23T17:03:47.6474419Z · ╰── This value is a ref 2026-10-23T17:03:47.6474506Z 165 │ return JSON.stringify( 2026-10-23T17:03:47.6474560Z ╰──── 2026-10-23T17:03:47.6475032Z  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-23T17:03:47.6475331Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.6475333Z 2026-10-23T17:03:47.6475481Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.6475667Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:206:5] 2026-10-23T17:03:47.6475772Z 205 │ mostRecentEventCount, 2026-10-23T17:03:47.6475869Z 206 │ nativeEventSnapshotsRef.current, 2026-10-23T17:03:47.6475989Z ·  ───────────────┬─────────────── 2026-10-23T17:03:47.6476235Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T17:03:47.6476300Z 207 │ ); 2026-10-23T17:03:47.6476360Z ╰──── 2026-10-23T17:03:47.6476837Z  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-23T17:03:47.6477142Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.6477147Z 2026-10-23T17:03:47.6477296Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.6477429Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:212:5] 2026-10-23T17:03:47.6477513Z 211 │ mostRecentEventCount, 2026-10-23T17:03:47.6477603Z 212 │ nativeEventSnapshotsRef.current, 2026-10-23T17:03:47.6477714Z ·  ───────────────┬─────────────── 2026-10-23T17:03:47.6477905Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T17:03:47.6477998Z 213 │ ); 2026-10-23T17:03:47.6478064Z ╰──── 2026-10-23T17:03:47.6478959Z  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-23T17:03:47.6479316Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.6479324Z 2026-10-23T17:03:47.6479514Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-23T17:03:47.6479656Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:197:6] 2026-10-23T17:03:47.6479834Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T17:03:47.6479954Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T17:03:47.6480066Z ·  ─────────┬──────── 2026-10-23T17:03:47.6480543Z · ╰── 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-23T17:03:47.6480609Z 163 │ }); 2026-10-23T17:03:47.6480710Z 164 │ confirmedTokensRef.current = tokens; 2026-10-23T17:03:47.6480819Z 165 │ return JSON.stringify( 2026-10-23T17:03:47.6481006Z 166 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-23T17:03:47.6481091Z 167 │ const record = 2026-10-23T17:03:47.6481176Z 168 │ token.type === "context" 2026-10-23T17:03:47.6481338Z 169 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-23T17:03:47.6481412Z 170 │ : undefined; 2026-10-23T17:03:47.6481530Z 171 │ const presentation = contextChipPresentation( 2026-10-23T17:03:47.6481653Z 172 │ token.type === "context" ? token.kind : token.type, 2026-10-23T17:03:47.6481722Z 173 │ record, 2026-10-23T17:03:47.6481786Z 174 │ ); 2026-10-23T17:03:47.6481876Z 175 │ const icon = contextChipIcon( 2026-10-23T17:03:47.6481952Z 176 │ presentation, 2026-10-23T17:03:47.6482095Z 177 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-23T17:03:47.6482161Z 178 │ ); 2026-10-23T17:03:47.6482231Z 179 │ return { 2026-10-23T17:03:47.6482311Z 180 │ type: token.type, 2026-10-23T17:03:47.6482386Z 181 │ source: token.source, 2026-10-23T17:03:47.6482471Z 182 │ start: token.start, 2026-10-23T17:03:47.6482544Z 183 │ end: token.end, 2026-10-23T17:03:47.6482664Z 184 │ accent: presentation.accent, 2026-10-23T17:03:47.6482746Z 185 │ label: 2026-10-23T17:03:47.6482924Z 186 │ token.type === "skill" 2026-10-23T17:03:47.6483072Z 187 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-23T17:03:47.6483156Z 188 │ : token.type === "context" 2026-10-23T17:03:47.6483393Z 189 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-23T17:03:47.6483478Z 190 │ : basename(token.value), 2026-10-23T17:03:47.6483625Z 191 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-23T17:03:47.6483724Z 192 │ iconUri: contextChipIconUri(icon), 2026-10-23T17:03:47.6483812Z 193 │ tintsIcon: icon.kind === "chip", 2026-10-23T17:03:47.6483883Z 194 │ }; 2026-10-23T17:03:47.6483945Z 195 │ }), 2026-10-23T17:03:47.6484004Z 196 │ ); 2026-10-23T17:03:47.6484117Z 197 │ }, [props.value, props.context, skillLabels]); 2026-10-23T17:03:47.6484244Z ·  ────────────────────┬──────────────────── 2026-10-23T17:03:47.6484484Z · ╰── This dependency list is missing values used by the callback 2026-10-23T17:03:47.6484641Z 198 │ // Every render resolves against the snapshot history, so a render whose 2026-10-23T17:03:47.6484713Z ╰──── 2026-10-23T17:03:47.6484932Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-23T17:03:47.6485254Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6485258Z 2026-10-23T17:03:47.6485454Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-23T17:03:47.6485593Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:259:5] 2026-10-23T17:03:47.6485731Z 251 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-23T17:03:47.6485837Z 252 │ nativeEventSnapshotsRef.current.push({ 2026-10-23T17:03:47.6485937Z ·  ───────────┬─────────── 2026-10-23T17:03:47.6486438Z · ╰── 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-23T17:03:47.6486556Z 253 │ eventCount: acknowledgedEventCount, 2026-10-23T17:03:47.6486627Z 254 │ value, 2026-10-23T17:03:47.6486719Z 255 │ selection: nextSelection, 2026-10-23T17:03:47.6486782Z 256 │ }); 2026-10-23T17:03:47.6486873Z 257 │ return acknowledgedEventCount; 2026-10-23T17:03:47.6486940Z 258 │ }, 2026-10-23T17:03:47.6487001Z 259 │ [], 2026-10-23T17:03:47.6487071Z ·  ─┬ 2026-10-23T17:03:47.6487263Z · ╰── This dependency list is missing values used by the callback 2026-10-23T17:03:47.6487334Z 260 │ ); 2026-10-23T17:03:47.6487393Z ╰──── 2026-10-23T17:03:47.6487599Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-23T17:03:47.6487917Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6487920Z 2026-10-23T17:03:47.6488417Z ⚠ 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-23T17:03:47.6488586Z ╭─[packages/effect-acp/src/schema.test.ts:18:12] 2026-10-23T17:03:47.6488753Z 17 │ const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } }; 2026-10-23T17:03:47.6488881Z 18 │ expect(Schema.is(V1.AvailableCommand)(command)).toBe(true); 2026-10-23T17:03:47.6488964Z ·  ───────── 2026-10-23T17:03:47.6489032Z 19 │ expect( 2026-10-23T17:03:47.6489085Z ╰──── 2026-10-23T17:03:47.6489094Z 2026-10-23T17:03:47.6489427Z ⚠ 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-23T17:03:47.6489553Z ╭─[packages/effect-acp/src/schema.test.ts:20:7] 2026-10-23T17:03:47.6489623Z 19 │ expect( 2026-10-23T17:03:47.6489861Z 20 │ Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }), 2026-10-23T17:03:47.6489952Z ·  ───────── 2026-10-23T17:03:47.6490023Z 21 │ ).toBe(true); 2026-10-23T17:03:47.6490082Z ╰──── 2026-10-23T17:03:47.6490084Z 2026-10-23T17:03:47.6490568Z ⚠ 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-23T17:03:47.6490697Z ╭─[packages/effect-acp/src/errors.test.ts:129:28] 2026-10-23T17:03:47.6490809Z 128 │ const secret = "acp-summary-secret"; 2026-10-23T17:03:47.6490945Z 129 │ const cause = yield* Schema.decodeUnknownEffect( 2026-10-23T17:03:47.6491086Z ·  ────────────────────────── 2026-10-23T17:03:47.6491166Z 130 │ Schema.Struct({ 2026-10-23T17:03:47.6491239Z ╰──── 2026-10-23T17:03:47.6491242Z 2026-10-23T17:03:47.6491402Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.6491540Z ╭─[apps/mobile/src/native/StackHeader.tsx:184:9] 2026-10-23T17:03:47.6491620Z 183 │ "options", 2026-10-23T17:03:47.6491732Z 184 │ latestOptionFunctionsRef.current, 2026-10-23T17:03:47.6491859Z ·  ────────────────┬─────────────── 2026-10-23T17:03:47.6492073Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T17:03:47.6492172Z 185 │ optionFunctionWrappersRef.current, 2026-10-23T17:03:47.6492270Z ╰──── 2026-10-23T17:03:47.6492794Z  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-23T17:03:47.6493111Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.6493114Z 2026-10-23T17:03:47.6493290Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.6493413Z ╭─[apps/mobile/src/native/StackHeader.tsx:185:9] 2026-10-23T17:03:47.6493517Z 184 │ latestOptionFunctionsRef.current, 2026-10-23T17:03:47.6493627Z 185 │ optionFunctionWrappersRef.current, 2026-10-23T17:03:47.6493756Z ·  ────────────────┬──────────────── 2026-10-23T17:03:47.6494063Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T17:03:47.6494238Z 186 │ ) as NativeStackNavigationOptions) 2026-10-23T17:03:47.6494310Z ╰──── 2026-10-23T17:03:47.6494804Z  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-23T17:03:47.6495151Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.6495155Z 2026-10-23T17:03:47.6495438Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T17:03:47.6495594Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2109:5] 2026-10-23T17:03:47.6495664Z 2107 │ ); 2026-10-23T17:03:47.6495739Z 2108 │ useEffect(() => { 2026-10-23T17:03:47.6495816Z ·  ────┬──── 2026-10-23T17:03:47.6495957Z · ╰── This is the containing effect 2026-10-23T17:03:47.6496035Z 2109 │ setExpandedVideo(null); 2026-10-23T17:03:47.6496127Z ·  ────────┬─────── 2026-10-23T17:03:47.6496300Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6496387Z 2110 │ setExpandedFile(null); 2026-10-23T17:03:47.6496443Z ╰──── 2026-10-23T17:03:47.6497101Z  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-23T17:03:47.6497458Z  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-23T17:03:47.6497468Z 2026-10-23T17:03:47.6497705Z ⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used. 2026-10-23T17:03:47.6497843Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:62:10] 2026-10-23T17:03:47.6497990Z 61 │ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets"; 2026-10-23T17:03:47.6498137Z 62 │ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks"; 2026-10-23T17:03:47.6498247Z ·  ───────────┬─────────── 2026-10-23T17:03:47.6498428Z · ╰── 'isMarkdownFileLinkLabel' is imported here 2026-10-23T17:03:47.6498596Z 63 │ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments"; 2026-10-23T17:03:47.6498660Z ╰──── 2026-10-23T17:03:47.6498758Z  help: Consider removing this import. 2026-10-23T17:03:47.6498761Z 2026-10-23T17:03:47.6498976Z ⚠ eslint(no-unused-vars): Identifier 'createContext' is imported but never used. 2026-10-23T17:03:47.6499140Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:88:3] 2026-10-23T17:03:47.6499224Z 87 │ import { 2026-10-23T17:03:47.6499290Z 88 │ createContext, 2026-10-23T17:03:47.6499385Z ·  ──────┬────── 2026-10-23T17:03:47.6499616Z · ╰── 'createContext' is imported here 2026-10-23T17:03:47.6499738Z 89 │ memo, 2026-10-23T17:03:47.6499791Z ╰──── 2026-10-23T17:03:47.6499902Z  help: Consider removing this import. 2026-10-23T17:03:47.6499905Z 2026-10-23T17:03:47.6500128Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-23T17:03:47.6500271Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:103:3] 2026-10-23T17:03:47.6500334Z 102 │ import { 2026-10-23T17:03:47.6500412Z 103 │ ActivityIndicator, 2026-10-23T17:03:47.6500503Z ·  ────────┬──────── 2026-10-23T17:03:47.6500655Z · ╰── 'ActivityIndicator' is imported here 2026-10-23T17:03:47.6500714Z 104 │ Image, 2026-10-23T17:03:47.6500777Z ╰──── 2026-10-23T17:03:47.6500881Z  help: Consider removing this import. 2026-10-23T17:03:47.6500890Z 2026-10-23T17:03:47.6501107Z ⚠ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used. 2026-10-23T17:03:47.6501265Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:110:3] 2026-10-23T17:03:47.6501366Z 109 │ Pressable, 2026-10-23T17:03:47.6501444Z 110 │ ScrollView, 2026-10-23T17:03:47.6501545Z ·  ─────┬──── 2026-10-23T17:03:47.6501683Z · ╰── 'ScrollView' is imported here 2026-10-23T17:03:47.6501763Z 111 │ StyleSheet, 2026-10-23T17:03:47.6501830Z ╰──── 2026-10-23T17:03:47.6501939Z  help: Consider removing this import. 2026-10-23T17:03:47.6501946Z 2026-10-23T17:03:47.6502151Z ⚠ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used. 2026-10-23T17:03:47.6502313Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:112:11] 2026-10-23T17:03:47.6502394Z 111 │ StyleSheet, 2026-10-23T17:03:47.6502478Z 112 │ Text as NativeText, 2026-10-23T17:03:47.6502566Z ·  ─────┬──── 2026-10-23T17:03:47.6502722Z · ╰── 'NativeText' is imported here 2026-10-23T17:03:47.6502800Z 113 │ type ColorValue, 2026-10-23T17:03:47.6502867Z ╰──── 2026-10-23T17:03:47.6502967Z  help: Consider removing this import. 2026-10-23T17:03:47.6502969Z 2026-10-23T17:03:47.6503194Z ⚠ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used. 2026-10-23T17:03:47.6503337Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:134:10] 2026-10-23T17:03:47.6503632Z 133 │ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic"; 2026-10-23T17:03:47.6503814Z 134 │ import { tryOpenExternalUrl } from "../../lib/openExternalUrl"; 2026-10-23T17:03:47.6503952Z ·  ─────────┬──────── 2026-10-23T17:03:47.6504133Z · ╰── 'tryOpenExternalUrl' is imported here 2026-10-23T17:03:47.6504301Z 135 │ import { downloadAndShareAttachment } from "../../lib/attachmentDownload"; 2026-10-23T17:03:47.6504354Z ╰──── 2026-10-23T17:03:47.6504458Z  help: Consider removing this import. 2026-10-23T17:03:47.6504461Z 2026-10-23T17:03:47.6504684Z ⚠ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used. 2026-10-23T17:03:47.6504821Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:137:10] 2026-10-23T17:03:47.6504959Z 136 │ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks"; 2026-10-23T17:03:47.6505089Z 137 │ import { faviconUrlForOrigin } from "@t3tools/shared/favicon"; 2026-10-23T17:03:47.6505189Z ·  ─────────┬───────── 2026-10-23T17:03:47.6505346Z · ╰── 'faviconUrlForOrigin' is imported here 2026-10-23T17:03:47.6505409Z 138 │ import { 2026-10-23T17:03:47.6505462Z ╰──── 2026-10-23T17:03:47.6505561Z  help: Consider removing this import. 2026-10-23T17:03:47.6505563Z 2026-10-23T17:03:47.6505818Z ⚠ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used. 2026-10-23T17:03:47.6505970Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:151:10] 2026-10-23T17:03:47.6506117Z 150 │ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile"; 2026-10-23T17:03:47.6506261Z 151 │ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer"; 2026-10-23T17:03:47.6506358Z ·  ────────┬─────── 2026-10-23T17:03:47.6506519Z · ╰── 'MediaVideoPlayer' is imported here 2026-10-23T17:03:47.6506658Z 152 │ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia"; 2026-10-23T17:03:47.6506719Z ╰──── 2026-10-23T17:03:47.6506817Z  help: Consider removing this import. 2026-10-23T17:03:47.6506820Z 2026-10-23T17:03:47.6507049Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used. 2026-10-23T17:03:47.6507183Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:155:3] 2026-10-23T17:03:47.6507269Z 154 │ attachmentVideoPreviewSource, 2026-10-23T17:03:47.6507346Z 155 │ mediaVideoPreviewUri, 2026-10-23T17:03:47.6507439Z ·  ──────────┬───────── 2026-10-23T17:03:47.6507635Z · ╰── 'mediaVideoPreviewUri' is imported here 2026-10-23T17:03:47.6507716Z 156 │ mediaVideoThumbnailKey, 2026-10-23T17:03:47.6507785Z ╰──── 2026-10-23T17:03:47.6507893Z  help: Consider removing this import. 2026-10-23T17:03:47.6507896Z 2026-10-23T17:03:47.6508121Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used. 2026-10-23T17:03:47.6508260Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:156:3] 2026-10-23T17:03:47.6508339Z 155 │ mediaVideoPreviewUri, 2026-10-23T17:03:47.6508414Z 156 │ mediaVideoThumbnailKey, 2026-10-23T17:03:47.6508504Z ·  ───────────┬────────── 2026-10-23T17:03:47.6508751Z · ╰── 'mediaVideoThumbnailKey' is imported here 2026-10-23T17:03:47.6508871Z 157 │ type MediaVideoPreviewSource, 2026-10-23T17:03:47.6508931Z ╰──── 2026-10-23T17:03:47.6509029Z  help: Consider removing this import. 2026-10-23T17:03:47.6509032Z 2026-10-23T17:03:47.6509269Z ⚠ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used. 2026-10-23T17:03:47.6509440Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:157:8] 2026-10-23T17:03:47.6509547Z 156 │ mediaVideoThumbnailKey, 2026-10-23T17:03:47.6509631Z 157 │ type MediaVideoPreviewSource, 2026-10-23T17:03:47.6509791Z ·  ───────────┬─────────── 2026-10-23T17:03:47.6509985Z · ╰── 'MediaVideoPreviewSource' is imported here 2026-10-23T17:03:47.6510083Z 158 │ } from "../../lib/videoPreviewSource"; 2026-10-23T17:03:47.6510144Z ╰──── 2026-10-23T17:03:47.6510251Z  help: Consider removing this import. 2026-10-23T17:03:47.6510254Z 2026-10-23T17:03:47.6510499Z ⚠ eslint(no-unused-vars): Type 'ReviewDiffTheme' is imported but never used. 2026-10-23T17:03:47.6510648Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:165:15] 2026-10-23T17:03:47.6510834Z 164 │ import { parseReviewCommentMessageSegments } from "../review/reviewCommentSelection"; 2026-10-23T17:03:47.6510980Z 165 │ import type { ReviewDiffTheme } from "../review/shikiReviewHighlighter"; 2026-10-23T17:03:47.6511087Z ·  ───────┬─────── 2026-10-23T17:03:47.6511252Z · ╰── 'ReviewDiffTheme' is imported here 2026-10-23T17:03:47.6511337Z 166 │ import { 2026-10-23T17:03:47.6511394Z ╰──── 2026-10-23T17:03:47.6511521Z  help: Consider removing this import. 2026-10-23T17:03:47.6511527Z 2026-10-23T17:03:47.6511775Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used. 2026-10-23T17:03:47.6511978Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:180:3] 2026-10-23T17:03:47.6512050Z 179 │ import { 2026-10-23T17:03:47.6512160Z 180 │ resolveMarkdownFontSizes, 2026-10-23T17:03:47.6512275Z ·  ────────────┬─────────── 2026-10-23T17:03:47.6512448Z · ╰── 'resolveMarkdownFontSizes' is imported here 2026-10-23T17:03:47.6512543Z 181 │ resolveNativeMarkdownTypography, 2026-10-23T17:03:47.6512620Z ╰──── 2026-10-23T17:03:47.6512732Z  help: Consider removing this import. 2026-10-23T17:03:47.6512735Z 2026-10-23T17:03:47.6512976Z ⚠ eslint(no-unused-vars): Identifier 'markdownLinkIconSource' is imported but never used. 2026-10-23T17:03:47.6513116Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:185:10] 2026-10-23T17:03:47.6513262Z 184 │ import { PierreEntryIcon } from "../../components/PierreEntryIcon"; 2026-10-23T17:03:47.6513407Z 185 │ import { markdownLinkIconSource } from "../../lib/markdownLinkIcons"; 2026-10-23T17:03:47.6513525Z ·  ───────────┬────────── 2026-10-23T17:03:47.6513697Z · ╰── 'markdownLinkIconSource' is imported here 2026-10-23T17:03:47.6513769Z 186 │ import { 2026-10-23T17:03:47.6513832Z ╰──── 2026-10-23T17:03:47.6513938Z  help: Consider removing this import. 2026-10-23T17:03:47.6513940Z 2026-10-23T17:03:47.6514329Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used. 2026-10-23T17:03:47.6514592Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:188:3] 2026-10-23T17:03:47.6514704Z 187 │ normalizeNativeMarkdownUrl, 2026-10-23T17:03:47.6514816Z 188 │ resolveMarkdownInlineCodePresentation, 2026-10-23T17:03:47.6514950Z ·  ──────────────────┬────────────────── 2026-10-23T17:03:47.6515171Z · ╰── 'resolveMarkdownInlineCodePresentation' is imported here 2026-10-23T17:03:47.6515264Z 189 │ resolveMarkdownLinkIcon, 2026-10-23T17:03:47.6515337Z ╰──── 2026-10-23T17:03:47.6515439Z  help: Consider removing this import. 2026-10-23T17:03:47.6515442Z 2026-10-23T17:03:47.6515683Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownLinkIcon' is imported but never used. 2026-10-23T17:03:47.6515842Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:189:3] 2026-10-23T17:03:47.6515961Z 188 │ resolveMarkdownInlineCodePresentation, 2026-10-23T17:03:47.6516044Z 189 │ resolveMarkdownLinkIcon, 2026-10-23T17:03:47.6516154Z ·  ───────────┬─────────── 2026-10-23T17:03:47.6516329Z · ╰── 'resolveMarkdownLinkIcon' is imported here 2026-10-23T17:03:47.6516438Z 190 │ resolveMarkdownLinkPresentation, 2026-10-23T17:03:47.6516495Z ╰──── 2026-10-23T17:03:47.6516615Z  help: Consider removing this import. 2026-10-23T17:03:47.6516621Z 2026-10-23T17:03:47.6516867Z ⚠ eslint(no-unused-vars): Identifier 'useMarkdownCodeHighlight' is imported but never used. 2026-10-23T17:03:47.6517011Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:228:10] 2026-10-23T17:03:47.6517139Z 227 │ import { ThreadMcpApp } from "./McpAppWebView"; 2026-10-23T17:03:47.6517299Z 228 │ import { useMarkdownCodeHighlight } from "./markdownCodeHighlightState"; 2026-10-23T17:03:47.6517450Z ·  ────────────┬─────────── 2026-10-23T17:03:47.6517671Z · ╰── 'useMarkdownCodeHighlight' is imported here 2026-10-23T17:03:47.6517773Z 229 │ import { 2026-10-23T17:03:47.6517833Z ╰──── 2026-10-23T17:03:47.6517942Z  help: Consider removing this import. 2026-10-23T17:03:47.6517945Z 2026-10-23T17:03:47.6518182Z ⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used. 2026-10-23T17:03:47.6518332Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:232:3] 2026-10-23T17:03:47.6518413Z 231 │ useAssetUrl, 2026-10-23T17:03:47.6518794Z 232 │ useAssetUrlState, 2026-10-23T17:03:47.6518891Z ·  ────────┬─────── 2026-10-23T17:03:47.6519052Z · ╰── 'useAssetUrlState' is imported here 2026-10-23T17:03:47.6519124Z 233 │ useRefreshAssetUrl, 2026-10-23T17:03:47.6519194Z ╰──── 2026-10-23T17:03:47.6519309Z  help: Consider removing this import. 2026-10-23T17:03:47.6519312Z 2026-10-23T17:03:47.6519532Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T17:03:47.6519732Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2111:7] 2026-10-23T17:03:47.6519837Z 2110 │ setExpandedFile(null); 2026-10-23T17:03:47.6520020Z 2111 │ }, [props.environmentId, props.threadId, props.contentPresentation.kind]); 2026-10-23T17:03:47.6521066Z ·  ─────────┬───────── ───────┬────── ───────────────┬────────────── 2026-10-23T17:03:47.6521473Z · │ │ ╰── Unnecessary dependency `props.contentPresentation.kind` 2026-10-23T17:03:47.6521686Z · │ ╰── Unnecessary dependency `props.threadId` 2026-10-23T17:03:47.6521869Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-23T17:03:47.6522032Z 2112 │ const horizontalPadding = props.layoutVariant === "split" ? 20 : 16; 2026-10-23T17:03:47.6522104Z ╰──── 2026-10-23T17:03:47.6522420Z  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-23T17:03:47.6522784Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6522790Z 2026-10-23T17:03:47.6523041Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T17:03:47.6523216Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2578:7] 2026-10-23T17:03:47.6523343Z 2577 │ reportHeaderMaterialVisibility(false); 2026-10-23T17:03:47.6523475Z 2578 │ }, [feedThreadKey, reportHeaderMaterialVisibility]); 2026-10-23T17:03:47.6523574Z ·  ──────┬────── 2026-10-23T17:03:47.6523739Z · ╰── Unnecessary dependency `feedThreadKey` 2026-10-23T17:03:47.6523805Z 2579 │ 2026-10-23T17:03:47.6523869Z ╰──── 2026-10-23T17:03:47.6524184Z  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-23T17:03:47.6524519Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6524522Z 2026-10-23T17:03:47.6524730Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T17:03:47.6524867Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2594:7] 2026-10-23T17:03:47.6524939Z 2593 │ } 2026-10-23T17:03:47.6525081Z 2594 │ }, [listMountKey, props.contentInsetEndAdjustment, listRef]); 2026-10-23T17:03:47.6525170Z ·  ──────┬───── 2026-10-23T17:03:47.6525469Z · ╰── Unnecessary dependency `listMountKey` 2026-10-23T17:03:47.6525618Z 2595 │ 2026-10-23T17:03:47.6525683Z ╰──── 2026-10-23T17:03:47.6526016Z  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-23T17:03:47.6526345Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6526347Z 2026-10-23T17:03:47.6526564Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T17:03:47.6526720Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2751:7] 2026-10-23T17:03:47.6526796Z 2750 │ } 2026-10-23T17:03:47.6526993Z 2751 │ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]); 2026-10-23T17:03:47.6527218Z ·  ───────┬─────── ─────────┬──────── ────────┬─────── 2026-10-23T17:03:47.6527492Z · │ │ ╰── Unnecessary dependency `expandedWorkRows` 2026-10-23T17:03:47.6527724Z · │ ╰── Unnecessary dependency `expandedWorkGroups` 2026-10-23T17:03:47.6527886Z · ╰── Unnecessary dependency `expandedTurnIds` 2026-10-23T17:03:47.6527941Z 2752 │ 2026-10-23T17:03:47.6528031Z ╰──── 2026-10-23T17:03:47.6528376Z  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-23T17:03:47.6528711Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6528714Z 2026-10-23T17:03:47.6528904Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T17:03:47.6529057Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:603:9] 2026-10-23T17:03:47.6529134Z 602 │ }; 2026-10-23T17:03:47.6529270Z 603 │ }, [props.environmentId, attachment.id, httpBaseUrl]), 2026-10-23T17:03:47.6529482Z ·  ─────────┬───────── ──────┬────── ─────┬───── 2026-10-23T17:03:47.6529806Z · │ │ ╰── Unnecessary dependency `httpBaseUrl` 2026-10-23T17:03:47.6530023Z · │ ╰── Unnecessary dependency `attachment.id` 2026-10-23T17:03:47.6530213Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-23T17:03:47.6530286Z 604 │ ); 2026-10-23T17:03:47.6530345Z ╰──── 2026-10-23T17:03:47.6530676Z  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-23T17:03:47.6531054Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6531058Z 2026-10-23T17:03:47.6531398Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T17:03:47.6531639Z ╭─[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:370:7] 2026-10-23T17:03:47.6531741Z 369 │ mountedRef.current = false; 2026-10-23T17:03:47.6531841Z 370 │ flow.setBranchQuery(""); 2026-10-23T17:03:47.6531924Z ·  ──┬─ 2026-10-23T17:03:47.6532080Z · ╰── Missing dependency `flow` 2026-10-23T17:03:47.6532143Z 371 │ }; 2026-10-23T17:03:47.6532236Z 372 │ }, [flow.setBranchQuery]); 2026-10-23T17:03:47.6532340Z ·  ─────────┬───────── 2026-10-23T17:03:47.6532553Z · ╰── Overly precise dependency `flow.setBranchQuery`, use `flow` instead 2026-10-23T17:03:47.6532612Z 373 │ 2026-10-23T17:03:47.6532673Z ╰──── 2026-10-23T17:03:47.6533118Z  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-23T17:03:47.6533480Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6533485Z 2026-10-23T17:03:47.6533735Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-23T17:03:47.6533911Z ╭─[apps/web/src/components/pullRequest/pullRequestList.logic.ts:187:9] 2026-10-23T17:03:47.6533984Z 186 │ ): boolean { 2026-10-23T17:03:47.6534148Z 187 │ const labels = entry.labels.map((label) => label.name.trim().toLowerCase()); 2026-10-23T17:03:47.6534321Z ·  ───────────────────────────────────────────────────────────────────── 2026-10-23T17:03:47.6534497Z 188 │ const holds = (label: string) => labels.includes(label.trim().toLowerCase()); 2026-10-23T17:03:47.6534557Z ╰──── 2026-10-23T17:03:47.6534647Z  help: Switch to `Set` 2026-10-23T17:03:47.6534650Z 2026-10-23T17:03:47.6534853Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T17:03:47.6535030Z ╭─[apps/web/src/components/pullRequest/PullRequestChecksPopover.tsx:88:15] 2026-10-23T17:03:47.6535106Z 87 │
  • { 2026-10-23T17:03:47.6536542Z ·  ────┬──── 2026-10-23T17:03:47.6536676Z · ╰── This is the containing effect 2026-10-23T17:03:47.6536775Z 285 │ setNow(new Date().toISOString()); 2026-10-23T17:03:47.6536862Z ·  ───┬── 2026-10-23T17:03:47.6537147Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6537373Z 286 │ const id = setInterval(() => setNow(new Date().toISOString()), 60_000); 2026-10-23T17:03:47.6537442Z ╰──── 2026-10-23T17:03:47.6538098Z  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-23T17:03:47.6538464Z  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-23T17:03:47.6538468Z 2026-10-23T17:03:47.6538699Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T17:03:47.6538866Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:365:25] 2026-10-23T17:03:47.6539014Z 364 │ // range) the boundary string is identical and the chain would die. 2026-10-23T17:03:47.6539116Z 365 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-23T17:03:47.6539234Z ·  ───────┬────── 2026-10-23T17:03:47.6539407Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-23T17:03:47.6539532Z 366 │ const listItems = ((): readonly SidebarListItem[] => { 2026-10-23T17:03:47.6539598Z ╰──── 2026-10-23T17:03:47.6539978Z  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-23T17:03:47.6540298Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6540310Z 2026-10-23T17:03:47.6540478Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T17:03:47.6540700Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:356:53] 2026-10-23T17:03:47.6540818Z 355 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-23T17:03:47.6540996Z 356 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-23T17:03:47.6541132Z ·  ─────┬──── 2026-10-23T17:03:47.6541313Z · ╰── Cannot call impure function 2026-10-23T17:03:47.6541515Z 357 │ const id = setTimeout(() => { 2026-10-23T17:03:47.6541643Z ╰──── 2026-10-23T17:03:47.6541935Z  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-23T17:03:47.6542240Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T17:03:47.6542243Z 2026-10-23T17:03:47.6542457Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-23T17:03:47.6542605Z ╭─[packages/client-runtime/src/state/filesystem.ts:3:8] 2026-10-23T17:03:47.6542682Z 2 │ AuthFilesystemReadScope, 2026-10-23T17:03:47.6542764Z 3 │ type AuthSessionState, 2026-10-23T17:03:47.6542865Z ·  ────────┬─────── 2026-10-23T17:03:47.6543071Z · ╰── 'AuthSessionState' is imported here 2026-10-23T17:03:47.6543158Z 4 │ type FilesystemBrowseEntry, 2026-10-23T17:03:47.6543232Z ╰──── 2026-10-23T17:03:47.6543343Z  help: Consider removing this import. 2026-10-23T17:03:47.6543347Z 2026-10-23T17:03:47.6543839Z ⚠ 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-23T17:03:47.6544005Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1228:7] 2026-10-23T17:03:47.6544104Z 1227 │ yield* harness.replaceSession; 2026-10-23T17:03:47.6544342Z 1228 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T17:03:47.6544513Z 1229 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) { 2026-10-23T17:03:47.6544613Z 1230 │ │ break; 2026-10-23T17:03:47.6544699Z 1231 │ │ } 2026-10-23T17:03:47.6544817Z 1232 │ │ yield* Effect.yieldNow; 2026-10-23T17:03:47.6544971Z 1233 │ ╰─▶ } 2026-10-23T17:03:47.6545069Z 1234 │ yield* Queue.offer( 2026-10-23T17:03:47.6545131Z ╰──── 2026-10-23T17:03:47.6545134Z 2026-10-23T17:03:47.6545690Z ⚠ 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-23T17:03:47.6545898Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1337:7] 2026-10-23T17:03:47.6546015Z 1336 │ yield* harness.replaceSession; 2026-10-23T17:03:47.6546249Z 1337 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T17:03:47.6546416Z 1338 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break; 2026-10-23T17:03:47.6546554Z 1339 │ │ yield* Effect.yieldNow; 2026-10-23T17:03:47.6546716Z 1340 │ ╰─▶ } 2026-10-23T17:03:47.6546878Z 1341 │ expect(yield* Ref.get(harness.subscriptionCount)).toBe(2); 2026-10-23T17:03:47.6546937Z ╰──── 2026-10-23T17:03:47.6546940Z 2026-10-23T17:03:47.6547279Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-23T17:03:47.6547526Z ╭─[packages/client-runtime/src/state/shell.ts:189:5] 2026-10-23T17:03:47.6547669Z 186 │ let waiting = yield* Ref.get(awaitingCompletion); 2026-10-23T17:03:47.6547754Z 187 │ let next = initial; 2026-10-23T17:03:47.6547860Z ·  ──┬─ 2026-10-23T17:03:47.6548019Z · ╰── From this accumulator 2026-10-23T17:03:47.6548133Z 188 │ let receivedSnapshot = false; 2026-10-23T17:03:47.6548232Z 189 │ for (const item of items) { 2026-10-23T17:03:47.6548329Z ·  ─┬─ 2026-10-23T17:03:47.6548498Z · ╰── For this loop 2026-10-23T17:03:47.6548632Z 190 │ if (item.kind === "synchronized") { 2026-10-23T17:03:47.6548706Z 191 │ waiting = false; 2026-10-23T17:03:47.6548850Z 192 │ if (Option.isSome(next.snapshot)) { 2026-10-23T17:03:47.6549001Z 193 │ next = { ...next, status: "live", error: Option.none() }; 2026-10-23T17:03:47.6549113Z ·  ───┬─── 2026-10-23T17:03:47.6549253Z · ╰── From this spread 2026-10-23T17:03:47.6549348Z 194 │ } 2026-10-23T17:03:47.6549429Z ╰──── 2026-10-23T17:03:47.6549618Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-23T17:03:47.6549835Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-23T17:03:47.6549839Z 2026-10-23T17:03:47.6550150Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T17:03:47.6550328Z ╭─[packages/provider-pi/src/server/adapter.ts:3405:7] 2026-10-23T17:03:47.6550409Z 3404 │ 2026-10-23T17:03:47.6550606Z 3405 │ const layer: Layer.Layer = 2026-10-23T17:03:47.6550709Z ·  ──┬── 2026-10-23T17:03:47.6550866Z · ╰── 'layer' is declared here 2026-10-23T17:03:47.6550949Z 3406 │ Layer.effect( 2026-10-23T17:03:47.6551009Z ╰──── 2026-10-23T17:03:47.6551134Z  help: Consider removing this declaration. 2026-10-23T17:03:47.6551137Z 2026-10-23T17:03:47.6551675Z ⚠ 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-23T17:03:47.6551867Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:169:7] 2026-10-23T17:03:47.6551943Z 168 │ }); 2026-10-23T17:03:47.6552172Z 169 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-23T17:03:47.6552392Z 170 │ │ if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break; 2026-10-23T17:03:47.6552518Z 171 │ │ yield* Effect.yieldNow; 2026-10-23T17:03:47.6552678Z 172 │ ╰─▶ } 2026-10-23T17:03:47.6552750Z 173 │ 2026-10-23T17:03:47.6552839Z ╰──── 2026-10-23T17:03:47.6552842Z 2026-10-23T17:03:47.6553442Z ⚠ 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-23T17:03:47.6553685Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:178:7] 2026-10-23T17:03:47.6553810Z 177 │ yield* Deferred.succeed(releaseSave, undefined); 2026-10-23T17:03:47.6554052Z 178 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-23T17:03:47.6554229Z 179 │ │ if ((yield* Ref.get(saved)).length > 0) break; 2026-10-23T17:03:47.6554365Z 180 │ │ yield* Effect.yieldNow; 2026-10-23T17:03:47.6554578Z 181 │ ╰─▶ } 2026-10-23T17:03:47.6554666Z 182 │ 2026-10-23T17:03:47.6554774Z ╰──── 2026-10-23T17:03:47.6554777Z 2026-10-23T17:03:47.6555288Z ⚠ 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-23T17:03:47.6555476Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7] 2026-10-23T17:03:47.6555633Z 306 │ yield* Deferred.succeed(releaseUnenrichedSave, undefined); 2026-10-23T17:03:47.6555864Z 307 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-23T17:03:47.6556024Z 308 │ │ const values = yield* Ref.get(saved); 2026-10-23T17:03:47.6556269Z 309 │ │ if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) { 2026-10-23T17:03:47.6556380Z 310 │ │ break; 2026-10-23T17:03:47.6556491Z 311 │ │ } 2026-10-23T17:03:47.6556632Z 312 │ │ yield* Effect.yieldNow; 2026-10-23T17:03:47.6556795Z 313 │ ╰─▶ } 2026-10-23T17:03:47.6556865Z 314 │ 2026-10-23T17:03:47.6556944Z ╰──── 2026-10-23T17:03:47.6556946Z 2026-10-23T17:03:47.6557180Z ⚠ eslint(no-unused-vars): Identifier 'Duration' is imported but never used. 2026-10-23T17:03:47.6557350Z ╭─[packages/provider-pi/src/server/adapter.test.ts:24:13] 2026-10-23T17:03:47.6557453Z 23 │ import * as Deferred from "effect/Deferred"; 2026-10-23T17:03:47.6557580Z 24 │ import * as Duration from "effect/Duration"; 2026-10-23T17:03:47.6557693Z ·  ────┬─── 2026-10-23T17:03:47.6557871Z · ╰── 'Duration' is imported here 2026-10-23T17:03:47.6557972Z 25 │ import * as Effect from "effect/Effect"; 2026-10-23T17:03:47.6558059Z ╰──── 2026-10-23T17:03:47.6558187Z  help: Consider removing this import. 2026-10-23T17:03:47.6558193Z 2026-10-23T17:03:47.6559105Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T17:03:47.6559301Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:512:5] 2026-10-23T17:03:47.6559389Z 510 │ }, []); 2026-10-23T17:03:47.6559481Z 511 │ useEffect(() => { 2026-10-23T17:03:47.6559584Z ·  ────┬──── 2026-10-23T17:03:47.6559747Z · ╰── This is the containing effect 2026-10-23T17:03:47.6559865Z 512 │ setKeyboardStateSuspect(false); 2026-10-23T17:03:47.6560341Z ·  ───────────┬─────────── 2026-10-23T17:03:47.6560962Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6561083Z 513 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-23T17:03:47.6561190Z ╰──── 2026-10-23T17:03:47.6561869Z  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-23T17:03:47.6562241Z  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-23T17:03:47.6562244Z 2026-10-23T17:03:47.6562528Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T17:03:47.6562691Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:872:7] 2026-10-23T17:03:47.6562865Z 869 │ const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0); 2026-10-23T17:03:47.6562943Z 870 │ useEffect(() => { 2026-10-23T17:03:47.6563029Z ·  ────┬──── 2026-10-23T17:03:47.6563161Z · ╰── This is the containing effect 2026-10-23T17:03:47.6563331Z 871 │ if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) { 2026-10-23T17:03:47.6563470Z 872 │ setLastKnownKeyboardHeight(liveKeyboardHeight); 2026-10-23T17:03:47.6563583Z ·  ─────────────┬──────────── 2026-10-23T17:03:47.6563788Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6563859Z 873 │ } 2026-10-23T17:03:47.6563930Z ╰──── 2026-10-23T17:03:47.6564606Z  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-23T17:03:47.6564948Z  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-23T17:03:47.6564951Z 2026-10-23T17:03:47.6565215Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T17:03:47.6565397Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1119:5] 2026-10-23T17:03:47.6565472Z 1117 │ 2026-10-23T17:03:47.6565564Z 1118 │ useEffect(() => { 2026-10-23T17:03:47.6565664Z ·  ────┬──── 2026-10-23T17:03:47.6565834Z · ╰── This is the containing effect 2026-10-23T17:03:47.6565929Z 1119 │ setAnchorMessageId(null); 2026-10-23T17:03:47.6566031Z ·  ─────────┬──────── 2026-10-23T17:03:47.6566212Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6566316Z 1120 │ setSubmittedMessageId(null); 2026-10-23T17:03:47.6566387Z ╰──── 2026-10-23T17:03:47.6567122Z  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-23T17:03:47.6567546Z  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-23T17:03:47.6567549Z 2026-10-23T17:03:47.6567766Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T17:03:47.6567950Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:513:7] 2026-10-23T17:03:47.6568064Z 512 │ setKeyboardStateSuspect(false); 2026-10-23T17:03:47.6568189Z 513 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-23T17:03:47.6568398Z ·  ────────┬──────── ─────────┬──────── 2026-10-23T17:03:47.6568659Z · │ ╰── Unnecessary dependency `liveKeyboardHeight` 2026-10-23T17:03:47.6568857Z · ╰── Unnecessary dependency `isKeyboardVisible` 2026-10-23T17:03:47.6569009Z 514 │ const handleOwnedInputFocusChange = (focused: boolean) => { 2026-10-23T17:03:47.6569085Z ╰──── 2026-10-23T17:03:47.6569395Z  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-23T17:03:47.6569766Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6569769Z 2026-10-23T17:03:47.6570010Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T17:03:47.6570187Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1067:7] 2026-10-23T17:03:47.6570281Z 1066 │ userInputInsetProgress.set(1); 2026-10-23T17:03:47.6570473Z 1067 │ }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]); 2026-10-23T17:03:47.6570598Z ·  ────────────┬─────────── 2026-10-23T17:03:47.6570808Z · ╰── Unnecessary dependency `activeUserInputRequestId` 2026-10-23T17:03:47.6570929Z 1068 │ const showContent = props.showContent ?? true; 2026-10-23T17:03:47.6571000Z ╰──── 2026-10-23T17:03:47.6571367Z  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-23T17:03:47.6572276Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6572282Z 2026-10-23T17:03:47.6572526Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T17:03:47.6572755Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1125:15] 2026-10-23T17:03:47.6572874Z 1124 │ freeze.set(false); 2026-10-23T17:03:47.6573025Z 1125 │ }, [freeze, selectedThreadKey]); 2026-10-23T17:03:47.6573201Z ·  ────────┬──────── 2026-10-23T17:03:47.6573419Z · ╰── Unnecessary dependency `selectedThreadKey` 2026-10-23T17:03:47.6573547Z 1126 │ 2026-10-23T17:03:47.6573648Z ╰──── 2026-10-23T17:03:47.6574254Z  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-23T17:03:47.6574697Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6574700Z 2026-10-23T17:03:47.6574936Z ⚠ react(immutability): This value cannot be modified 2026-10-23T17:03:47.6575148Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:955:5] 2026-10-23T17:03:47.6575329Z 950 │ const composerPopoverHeight = useSharedValue(0); 2026-10-23T17:03:47.6575475Z 951 │ const floatingControlCoverage = useSharedValue( 2026-10-23T17:03:47.6575892Z ·  ───────────┬─────────── 2026-10-23T17:03:47.6576123Z · ╰── `floatingControlCoverage` originates here 2026-10-23T17:03:47.6576309Z 952 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-23T17:03:47.6576483Z 953 │ ); 2026-10-23T17:03:47.6576580Z 954 │ useEffect(() => { 2026-10-23T17:03:47.6576746Z 955 │ floatingControlCoverage.value = withTiming( 2026-10-23T17:03:47.6576906Z ·  ───────────┬─────────── 2026-10-23T17:03:47.6577180Z · ╰── `floatingControlCoverage` cannot be modified 2026-10-23T17:03:47.6577361Z 956 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-23T17:03:47.6577474Z ╰──── 2026-10-23T17:03:47.6577795Z  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-23T17:03:47.6578159Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T17:03:47.6578164Z 2026-10-23T17:03:47.6578370Z ⚠ react(immutability): This value cannot be modified 2026-10-23T17:03:47.6578600Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:973:7] 2026-10-23T17:03:47.6578851Z 963 │ const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null; 2026-10-23T17:03:47.6579027Z 964 │ const combinedContentInsetEndAdjustment = useSharedValue( 2026-10-23T17:03:47.6579207Z ·  ────────────────┬──────────────── 2026-10-23T17:03:47.6579434Z · ╰── `combinedContentInsetEndAdjustment` originates here 2026-10-23T17:03:47.6579937Z 965 │ Math.max(0, estimatedOverlayHeight - nativeInsetOvercount), 2026-10-23T17:03:47.6580058Z 966 │ ); 2026-10-23T17:03:47.6580257Z 967 │ useAnimatedReaction( 2026-10-23T17:03:47.6580407Z 968 │ () => 2026-10-23T17:03:47.6580573Z 969 │ contentInsetEndAdjustment.value + 2026-10-23T17:03:47.6580706Z 970 │ floatingControlCoverage.value + 2026-10-23T17:03:47.6580959Z 971 │ (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0), 2026-10-23T17:03:47.6581034Z 972 │ (value) => { 2026-10-23T17:03:47.6581214Z 973 │ combinedContentInsetEndAdjustment.value = value; 2026-10-23T17:03:47.6581373Z ·  ────────────────┬──────────────── 2026-10-23T17:03:47.6581605Z · ╰── `combinedContentInsetEndAdjustment` cannot be modified 2026-10-23T17:03:47.6581685Z 974 │ }, 2026-10-23T17:03:47.6581819Z ╰──── 2026-10-23T17:03:47.6582184Z  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-23T17:03:47.6582544Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T17:03:47.6582548Z 2026-10-23T17:03:47.6582828Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T17:03:47.6583016Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:57:5] 2026-10-23T17:03:47.6583301Z 55 │ 2026-10-23T17:03:47.6583424Z 56 │ useEffect(() => { 2026-10-23T17:03:47.6583520Z ·  ────┬──── 2026-10-23T17:03:47.6583695Z · ╰── This is the containing effect 2026-10-23T17:03:47.6583813Z 57 │ setDecodedSize(null); 2026-10-23T17:03:47.6584007Z ·  ───────┬────── 2026-10-23T17:03:47.6584237Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6584340Z 58 │ }, [props.sourceKey]); 2026-10-23T17:03:47.6584423Z ╰──── 2026-10-23T17:03:47.6585134Z  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-23T17:03:47.6585519Z  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-23T17:03:47.6585522Z 2026-10-23T17:03:47.6585841Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T17:03:47.6586024Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5] 2026-10-23T17:03:47.6586155Z 59 │ 2026-10-23T17:03:47.6586308Z 60 │ useEffect(() => { 2026-10-23T17:03:47.6586442Z ·  ────┬──── 2026-10-23T17:03:47.6586595Z · ╰── This is the containing effect 2026-10-23T17:03:47.6586906Z 61 │ setFailedUri(null); 2026-10-23T17:03:47.6587063Z ·  ──────┬───── 2026-10-23T17:03:47.6587281Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6587380Z 62 │ }, [props.uri]); 2026-10-23T17:03:47.6587490Z ╰──── 2026-10-23T17:03:47.6588272Z  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-23T17:03:47.6588770Z  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-23T17:03:47.6588776Z 2026-10-23T17:03:47.6589060Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-23T17:03:47.6589236Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10] 2026-10-23T17:03:47.6589405Z 6 │ import { parse, SvgAst, type JsxAST } from "react-native-svg"; 2026-10-23T17:03:47.6589661Z 7 │ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native"; 2026-10-23T17:03:47.6589879Z ·  ────────┬──────── 2026-10-23T17:03:47.6590057Z · ╰── 'ActivityIndicator' is imported here 2026-10-23T17:03:47.6590165Z 8 │ 2026-10-23T17:03:47.6590277Z ╰──── 2026-10-23T17:03:47.6590445Z  help: Consider removing this import. 2026-10-23T17:03:47.6590448Z 2026-10-23T17:03:47.6590675Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T17:03:47.6591075Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7] 2026-10-23T17:03:47.6591227Z 57 │ setDecodedSize(null); 2026-10-23T17:03:47.6591392Z 58 │ }, [props.sourceKey]); 2026-10-23T17:03:47.6591517Z ·  ───────┬─────── 2026-10-23T17:03:47.6591735Z · ╰── Unnecessary dependency `props.sourceKey` 2026-10-23T17:03:47.6591844Z 59 │ 2026-10-23T17:03:47.6591976Z ╰──── 2026-10-23T17:03:47.6592308Z  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-23T17:03:47.6592683Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6592686Z 2026-10-23T17:03:47.6592950Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T17:03:47.6593185Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7] 2026-10-23T17:03:47.6593356Z 61 │ setFailedUri(null); 2026-10-23T17:03:47.6593445Z 62 │ }, [props.uri]); 2026-10-23T17:03:47.6593579Z ·  ────┬──── 2026-10-23T17:03:47.6593823Z · ╰── Unnecessary dependency `props.uri` 2026-10-23T17:03:47.6593945Z 63 │ 2026-10-23T17:03:47.6594035Z ╰──── 2026-10-23T17:03:47.6594386Z  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-23T17:03:47.6594960Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6594967Z 2026-10-23T17:03:47.6595208Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-23T17:03:47.6595582Z ╭─[apps/web/src/components/settings/ProviderSettingsPanel.logic.ts:4:8] 2026-10-23T17:03:47.6595757Z 3 │ AuthProvidersManageScope, 2026-10-23T17:03:47.6595881Z 4 │ type AuthSessionState, 2026-10-23T17:03:47.6596020Z ·  ────────┬─────── 2026-10-23T17:03:47.6596251Z · ╰── 'AuthSessionState' is imported here 2026-10-23T17:03:47.6596377Z 5 │ type EnvironmentId, 2026-10-23T17:03:47.6596488Z ╰──── 2026-10-23T17:03:47.6596647Z  help: Consider removing this import. 2026-10-23T17:03:47.6596650Z 2026-10-23T17:03:47.6597167Z ⚠ 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-23T17:03:47.6597365Z ╭─[packages/contracts/src/baseSchemas.test.ts:39:9] 2026-10-23T17:03:47.6597465Z 38 │ JSON.stringify( 2026-10-23T17:03:47.6597627Z 39 │ Schema.encodeUnknownSync(Schema.toCodecJson(Named))([ 2026-10-23T17:03:47.6597785Z ·  ──────────────────────── 2026-10-23T17:03:47.6597905Z 40 │ { name: "a" }, 2026-10-23T17:03:47.6598190Z ╰──── 2026-10-23T17:03:47.6598192Z 2026-10-23T17:03:47.6598770Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T17:03:47.6598955Z ╭─[packages/provider-grok/src/server/adapter.ts:408:7] 2026-10-23T17:03:47.6599046Z 407 │ 2026-10-23T17:03:47.6599150Z 408 │ const layer: Layer.Layer< 2026-10-23T17:03:47.6599266Z ·  ──┬── 2026-10-23T17:03:47.6599444Z · ╰── 'layer' is declared here 2026-10-23T17:03:47.6599587Z 409 │ ProviderAdapter.ProviderAdapterV2, 2026-10-23T17:03:47.6599650Z ╰──── 2026-10-23T17:03:47.6599877Z  help: Consider removing this declaration. 2026-10-23T17:03:47.6599881Z 2026-10-23T17:03:47.6600182Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T17:03:47.6600393Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:215:7] 2026-10-23T17:03:47.6600465Z 211 │ }; 2026-10-23T17:03:47.6600614Z 212 │ useEffect(() => { 2026-10-23T17:03:47.6600753Z ·  ────┬──── 2026-10-23T17:03:47.6600947Z · ╰── This is the containing effect 2026-10-23T17:03:47.6601143Z 213 │ const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null; 2026-10-23T17:03:47.6601244Z 214 │ if (inserted) { 2026-10-23T17:03:47.6601550Z 215 │ setSelection((current) => 2026-10-23T17:03:47.6601680Z ·  ──────┬───── 2026-10-23T17:03:47.6601882Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6602102Z 216 │ current.start === inserted.start && current.end === inserted.end ? current : inserted, 2026-10-23T17:03:47.6602211Z ╰──── 2026-10-23T17:03:47.6602928Z  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-23T17:03:47.6603511Z  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-23T17:03:47.6603581Z 2026-10-23T17:03:47.6603863Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T17:03:47.6604056Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:296:7] 2026-10-23T17:03:47.6604207Z 284 │ }, [hasWorkspaceSnapshot]); 2026-10-23T17:03:47.6604315Z 285 │ useEffect(() => { 2026-10-23T17:03:47.6604407Z ·  ────┬──── 2026-10-23T17:03:47.6604592Z · ╰── This is the containing effect 2026-10-23T17:03:47.6604827Z 286 │ if (!environmentId || !projectCwd || !selectedProviderInstanceId) return; 2026-10-23T17:03:47.6605058Z 287 │ const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`; 2026-10-23T17:03:47.6605179Z 288 │ const now = Date.now(); 2026-10-23T17:03:47.6605313Z 289 │ const lastRequest = workspaceRefreshKeyRef.current; 2026-10-23T17:03:47.6605574Z 290 │ if ( 2026-10-23T17:03:47.6605720Z 291 │ lastRequest?.key === key && 2026-10-23T17:03:47.6605906Z 292 │ now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS 2026-10-23T17:03:47.6605976Z 293 │ ) 2026-10-23T17:03:47.6606086Z 294 │ return; 2026-10-23T17:03:47.6606345Z 295 │ if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) { 2026-10-23T17:03:47.6606494Z 296 │ setWorkspaceRefreshRetry(null); 2026-10-23T17:03:47.6606610Z ·  ────────────┬─────────── 2026-10-23T17:03:47.6606866Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6606973Z 297 │ return; 2026-10-23T17:03:47.6607126Z ╰──── 2026-10-23T17:03:47.6607761Z  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-23T17:03:47.6608128Z  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-23T17:03:47.6608131Z 2026-10-23T17:03:47.6608377Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T17:03:47.6608593Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:326:5] 2026-10-23T17:03:47.6608702Z 325 │ }, [ 2026-10-23T17:03:47.6608922Z 326 │ draftMessage, 2026-10-23T17:03:47.6609352Z ·  ──────┬───── 2026-10-23T17:03:47.6609535Z · ╰── Unnecessary dependency `draftMessage` 2026-10-23T17:03:47.6609731Z 327 │ environmentId, 2026-10-23T17:03:47.6609811Z ╰──── 2026-10-23T17:03:47.6610165Z  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-23T17:03:47.6610513Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6610516Z 2026-10-23T17:03:47.6610824Z ⚠ eslint(no-unused-vars): Function 'promptResponseHasMissingXAiStopReason' is declared but never used. 2026-10-23T17:03:47.6611031Z ╭─[packages/provider-grok/src/server/xaiAcpExtension.ts:1620:10] 2026-10-23T17:03:47.6611139Z 1619 │ 2026-10-23T17:03:47.6611417Z 1620 │ function promptResponseHasMissingXAiStopReason(response: EffectAcpSchema.PromptResponse): boolean { 2026-10-23T17:03:47.6611573Z ·  ──────────────────┬────────────────── 2026-10-23T17:03:47.6611848Z · ╰── 'promptResponseHasMissingXAiStopReason' is declared here 2026-10-23T17:03:47.6611947Z 1621 │ const meta = response._meta; 2026-10-23T17:03:47.6612036Z ╰──── 2026-10-23T17:03:47.6612180Z  help: Consider removing this declaration. 2026-10-23T17:03:47.6612184Z 2026-10-23T17:03:47.6612409Z ⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`. 2026-10-23T17:03:47.6612572Z ╭─[apps/web/src/terminal/ghostty/core.ts:194:19] 2026-10-23T17:03:47.6612873Z 193 │ const count = Math.min(CHUNK_SIZE, graphemeLength - start); 2026-10-23T17:03:47.6613042Z 194 │ const codes = new Array(count); 2026-10-23T17:03:47.6613200Z ·  ──────────────────────── 2026-10-23T17:03:47.6613361Z 195 │ for (let index = 0; index < count; index += 1) { 2026-10-23T17:03:47.6613473Z ╰──── 2026-10-23T17:03:47.6613940Z  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-23T17:03:47.6613943Z 2026-10-23T17:03:47.6614243Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T17:03:47.6614437Z ╭─[packages/provider-opencode/src/server/adapter.ts:3755:7] 2026-10-23T17:03:47.6614526Z 3754 │ 2026-10-23T17:03:47.6614759Z 3755 │ const layer: Layer.Layer = 2026-10-23T17:03:47.6614865Z ·  ──┬── 2026-10-23T17:03:47.6615074Z · ╰── 'layer' is declared here 2026-10-23T17:03:47.6615175Z 3756 │ Layer.effect( 2026-10-23T17:03:47.6615292Z ╰──── 2026-10-23T17:03:47.6615434Z  help: Consider removing this declaration. 2026-10-23T17:03:47.6615437Z 2026-10-23T17:03:47.6615736Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T17:03:47.6615934Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:400:5] 2026-10-23T17:03:47.6616018Z 398 │ 2026-10-23T17:03:47.6616356Z 399 │ useEffect(() => { 2026-10-23T17:03:47.6616532Z ·  ────┬──── 2026-10-23T17:03:47.6616683Z · ╰── This is the containing effect 2026-10-23T17:03:47.6616817Z 400 │ setInspectorSelection((current) => { 2026-10-23T17:03:47.6616988Z ·  ──────────┬────────── 2026-10-23T17:03:47.6617245Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6617388Z 401 │ if (props.renderInspector === undefined) { 2026-10-23T17:03:47.6617449Z ╰──── 2026-10-23T17:03:47.6618125Z  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-23T17:03:47.6618496Z  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-23T17:03:47.6618499Z 2026-10-23T17:03:47.6618796Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-23T17:03:47.6619011Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:528:24] 2026-10-23T17:03:47.6619210Z 527 │ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top; 2026-10-23T17:03:47.6619456Z 528 │ ╭─▶ const GitInspector = () => ( 2026-10-23T17:03:47.6619588Z 529 │ │ 2026-10-23T17:03:47.6620592Z 534 │ ╰─▶ ); 2026-10-23T17:03:47.6620727Z 535 │ const FilesInspector = () => 2026-10-23T17:03:47.6620839Z ╰──── 2026-10-23T17:03:47.6621122Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-23T17:03:47.6621126Z 2026-10-23T17:03:47.6621374Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-23T17:03:47.6621567Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:535:26] 2026-10-23T17:03:47.6621639Z 534 │ ); 2026-10-23T17:03:47.6621890Z 535 │ ╭─▶ const FilesInspector = () => 2026-10-23T17:03:47.6622072Z 536 │ │ selectedThread !== null && selectedThreadCwd !== null ? ( 2026-10-23T17:03:47.6622221Z 537 │ │ 2026-10-23T17:03:47.6634676Z 545 │ ╰─▶ ) : null; 2026-10-23T17:03:47.6634852Z 546 │ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset); 2026-10-23T17:03:47.6634920Z ╰──── 2026-10-23T17:03:47.6635152Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-23T17:03:47.6635170Z 2026-10-23T17:03:47.6635402Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-23T17:03:47.6635549Z ╭─[apps/mobile/src/state/use-composer-drafts.ts:1022:15] 2026-10-23T17:03:47.6635640Z 1021 │ instanceId, 2026-10-23T17:03:47.6635796Z 1022 │ { ...(persisted.modelOptionMemory[instanceId] ?? {}), ...models }, 2026-10-23T17:03:47.6635951Z ·  ────────────────────────────────────────────────── 2026-10-23T17:03:47.6636031Z 1023 │ ]), 2026-10-23T17:03:47.6636093Z ╰──── 2026-10-23T17:03:47.6636372Z  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-23T17:03:47.6636375Z 2026-10-23T17:03:47.6636546Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T17:03:47.6636749Z ╭─[packages/provider-opencode/src/server/OpenCodeRuntime.environment.test.ts:53:14] 2026-10-23T17:03:47.6636811Z 52 │ 2026-10-23T17:03:47.6636887Z 53 │ for (const {} of [ 2026-10-23T17:03:47.6636974Z ·  ── 2026-10-23T17:03:47.6637062Z 54 │ { healthy: true }, 2026-10-23T17:03:47.6637139Z ╰──── 2026-10-23T17:03:47.6637379Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T17:03:47.6637382Z 2026-10-23T17:03:47.6637724Z ⚠ 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-23T17:03:47.6637880Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:50:18] 2026-10-23T17:03:47.6638054Z 49 │ for (const tool of ["sendMessage", "followupTask", "interruptAgent", "listAgents"]) { 2026-10-23T17:03:47.6638244Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-23T17:03:47.6638342Z ·  ───────── 2026-10-23T17:03:47.6638693Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-23T17:03:47.6638759Z ╰──── 2026-10-23T17:03:47.6638762Z 2026-10-23T17:03:47.6639115Z ⚠ 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-23T17:03:47.6639272Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:51:18] 2026-10-23T17:03:47.6639445Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-23T17:03:47.6639639Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-23T17:03:47.6639788Z ·  ───────── 2026-10-23T17:03:47.6639852Z 52 │ } 2026-10-23T17:03:47.6640192Z ╰──── 2026-10-23T17:03:47.6640264Z 2026-10-23T17:03:47.6640612Z ⚠ 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-23T17:03:47.6640760Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:55:5] 2026-10-23T17:03:47.6640835Z 54 │ assert.equal( 2026-10-23T17:03:47.6641014Z 55 │ Schema.is(CodexSchema.ServerNotification__CollabAgentToolCallStatus)("interrupted"), 2026-10-23T17:03:47.6641102Z ·  ───────── 2026-10-23T17:03:47.6641168Z 56 │ true, 2026-10-23T17:03:47.6641230Z ╰──── 2026-10-23T17:03:47.6641232Z 2026-10-23T17:03:47.6641569Z ⚠ 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-23T17:03:47.6641734Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:59:5] 2026-10-23T17:03:47.6641819Z 58 │ assert.equal( 2026-10-23T17:03:47.6642019Z 59 │ Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentToolCallStatus)("interrupted"), 2026-10-23T17:03:47.6642096Z ·  ───────── 2026-10-23T17:03:47.6642180Z 60 │ true, 2026-10-23T17:03:47.6642261Z ╰──── 2026-10-23T17:03:47.6642263Z 2026-10-23T17:03:47.6642616Z ⚠ 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-23T17:03:47.6642792Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:103:16] 2026-10-23T17:03:47.6642854Z 102 │ 2026-10-23T17:03:47.6643050Z 103 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse)(resumeResponse), true); 2026-10-23T17:03:47.6643149Z ·  ───────── 2026-10-23T17:03:47.6643222Z 104 │ }); 2026-10-23T17:03:47.6643279Z ╰──── 2026-10-23T17:03:47.6643282Z 2026-10-23T17:03:47.6643450Z ⚠ react(immutability): This value cannot be modified 2026-10-23T17:03:47.6643621Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-23T17:03:47.6643693Z  86 │ 2026-10-23T17:03:47.6643814Z  87 │ const cardCoverage = props.cardCoverage; 2026-10-23T17:03:47.6643928Z ·  ──────┬───── 2026-10-23T17:03:47.6644082Z · ╰── `cardCoverage` originates here 2026-10-23T17:03:47.6644191Z  88 │ const barHeightRef = useRef(0); 2026-10-23T17:03:47.6644281Z  89 │ const cardHeightRef = useRef(0); 2026-10-23T17:03:47.6644392Z  90 │ const cardHeight = useSharedValue(0); 2026-10-23T17:03:47.6644503Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-23T17:03:47.6644580Z  92 │ if (!cardCoverage) { 2026-10-23T17:03:47.6644664Z  93 │ return; 2026-10-23T17:03:47.6644734Z  94 │ } 2026-10-23T17:03:47.6644903Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-23T17:03:47.6645012Z  96 │ if (coverage === cardCoverage.value) { 2026-10-23T17:03:47.6645087Z  97 │ return; 2026-10-23T17:03:47.6645168Z  98 │ } 2026-10-23T17:03:47.6645259Z  99 │ if (cardCoverage.value === 0) { 2026-10-23T17:03:47.6645355Z 100 │ cardCoverage.value = coverage; 2026-10-23T17:03:47.6645460Z ·  ──────┬───── 2026-10-23T17:03:47.6645617Z · ╰── `cardCoverage` cannot be modified 2026-10-23T17:03:47.6645850Z 101 │ return; 2026-10-23T17:03:47.6645973Z ╰──── 2026-10-23T17:03:47.6646301Z  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-23T17:03:47.6646637Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T17:03:47.6646640Z 2026-10-23T17:03:47.6646821Z ⚠ react(immutability): This value cannot be modified 2026-10-23T17:03:47.6646997Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7] 2026-10-23T17:03:47.6647091Z  89 │ const cardHeightRef = useRef(0); 2026-10-23T17:03:47.6647196Z  90 │ const cardHeight = useSharedValue(0); 2026-10-23T17:03:47.6647300Z ·  ─────┬──── 2026-10-23T17:03:47.6647450Z · ╰── `cardHeight` originates here 2026-10-23T17:03:47.6647559Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-23T17:03:47.6647648Z  92 │ if (!cardCoverage) { 2026-10-23T17:03:47.6647732Z  93 │ return; 2026-10-23T17:03:47.6647795Z  94 │ } 2026-10-23T17:03:47.6647980Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-23T17:03:47.6648091Z  96 │ if (coverage === cardCoverage.value) { 2026-10-23T17:03:47.6648166Z  97 │ return; 2026-10-23T17:03:47.6648229Z  98 │ } 2026-10-23T17:03:47.6648344Z  99 │ if (cardCoverage.value === 0) { 2026-10-23T17:03:47.6648451Z 100 │ cardCoverage.value = coverage; 2026-10-23T17:03:47.6648529Z 101 │ return; 2026-10-23T17:03:47.6648590Z 102 │ } 2026-10-23T17:03:47.6648714Z 103 │ cardCoverage.value = withTiming(coverage, { 2026-10-23T17:03:47.6648832Z 104 │ duration: USER_INPUT_TOGGLE_DURATION_MS, 2026-10-23T17:03:47.6648934Z 105 │ easing: Easing.out(Easing.cubic), 2026-10-23T17:03:47.6648997Z 106 │ }); 2026-10-23T17:03:47.6649074Z 107 │ }, [cardCoverage]); 2026-10-23T17:03:47.6649183Z 108 │ const handleBarLayout = useCallback( 2026-10-23T17:03:47.6649302Z 109 │ (event: LayoutChangeEvent) => { 2026-10-23T17:03:47.6649457Z 110 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-23T17:03:47.6649580Z 111 │ notifyCoverage(); 2026-10-23T17:03:47.6649815Z 112 │ }, 2026-10-23T17:03:47.6649911Z 113 │ [notifyCoverage], 2026-10-23T17:03:47.6650042Z 114 │ ); 2026-10-23T17:03:47.6650200Z 115 │ const handleCardLayout = useCallback( 2026-10-23T17:03:47.6650340Z 116 │ (event: LayoutChangeEvent) => { 2026-10-23T17:03:47.6650602Z 117 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-23T17:03:47.6650855Z 118 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-23T17:03:47.6650993Z ·  ─────┬──── 2026-10-23T17:03:47.6651223Z · ╰── `cardHeight` cannot be modified 2026-10-23T17:03:47.6651334Z 119 │ notifyCoverage(); 2026-10-23T17:03:47.6651515Z ╰──── 2026-10-23T17:03:47.6651838Z  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-23T17:03:47.6652188Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T17:03:47.6652191Z 2026-10-23T17:03:47.6652446Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T17:03:47.6652619Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-23T17:03:47.6652743Z  90 │ const cardHeight = useSharedValue(0); 2026-10-23T17:03:47.6652882Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-23T17:03:47.6653025Z ·  ───┬─── 2026-10-23T17:03:47.6653300Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-23T17:03:47.6653422Z  92 │ if (!cardCoverage) { 2026-10-23T17:03:47.6653529Z  93 │ return; 2026-10-23T17:03:47.6653625Z  94 │ } 2026-10-23T17:03:47.6653790Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-23T17:03:47.6653929Z  96 │ if (coverage === cardCoverage.value) { 2026-10-23T17:03:47.6654041Z  97 │ return; 2026-10-23T17:03:47.6654128Z  98 │ } 2026-10-23T17:03:47.6654255Z  99 │ if (cardCoverage.value === 0) { 2026-10-23T17:03:47.6654414Z 100 │ cardCoverage.value = coverage; 2026-10-23T17:03:47.6654555Z ·  ──────┬───── 2026-10-23T17:03:47.6654752Z · ╰── This modifies `cardCoverage` 2026-10-23T17:03:47.6654839Z 101 │ return; 2026-10-23T17:03:47.6654932Z ╰──── 2026-10-23T17:03:47.6655312Z  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-23T17:03:47.6655656Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T17:03:47.6655662Z 2026-10-23T17:03:47.6655883Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T17:03:47.6656094Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-23T17:03:47.6656216Z  99 │ if (cardCoverage.value === 0) { 2026-10-23T17:03:47.6656345Z 100 │ cardCoverage.value = coverage; 2026-10-23T17:03:47.6656445Z ·  ──────┬───── 2026-10-23T17:03:47.6656625Z · ╰── This modifies `cardCoverage` 2026-10-23T17:03:47.6656712Z 101 │ return; 2026-10-23T17:03:47.6656805Z 102 │ } 2026-10-23T17:03:47.6656944Z 103 │ cardCoverage.value = withTiming(coverage, { 2026-10-23T17:03:47.6657090Z 104 │ duration: USER_INPUT_TOGGLE_DURATION_MS, 2026-10-23T17:03:47.6657324Z 105 │ easing: Easing.out(Easing.cubic), 2026-10-23T17:03:47.6657465Z 106 │ }); 2026-10-23T17:03:47.6657543Z 107 │ }, [cardCoverage]); 2026-10-23T17:03:47.6657637Z 108 │ const handleBarLayout = useCallback( 2026-10-23T17:03:47.6657737Z 109 │ (event: LayoutChangeEvent) => { 2026-10-23T17:03:47.6657871Z ·  ───────────────┬─────────────── 2026-10-23T17:03:47.6658115Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-23T17:03:47.6658263Z 110 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-23T17:03:47.6658344Z ╰──── 2026-10-23T17:03:47.6658720Z  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-23T17:03:47.6659063Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T17:03:47.6659086Z 2026-10-23T17:03:47.6659299Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T17:03:47.6659480Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7] 2026-10-23T17:03:47.6659585Z 115 │ const handleCardLayout = useCallback( 2026-10-23T17:03:47.6659694Z 116 │ (event: LayoutChangeEvent) => { 2026-10-23T17:03:47.6659838Z ·  ───────────────┬─────────────── 2026-10-23T17:03:47.6660092Z · ╰── This function may (indirectly) reassign or modify `cardHeight` after render 2026-10-23T17:03:47.6660250Z 117 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-23T17:03:47.6660381Z 118 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-23T17:03:47.6660458Z ·  ─────┬──── 2026-10-23T17:03:47.6660611Z · ╰── This modifies `cardHeight` 2026-10-23T17:03:47.6660698Z 119 │ notifyCoverage(); 2026-10-23T17:03:47.6660759Z ╰──── 2026-10-23T17:03:47.6661118Z  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-23T17:03:47.6661436Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T17:03:47.6661439Z 2026-10-23T17:03:47.6661745Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-23T17:03:47.6661953Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:387:19] 2026-10-23T17:03:47.6662023Z 386 │ onFilters, 2026-10-23T17:03:47.6662114Z 387 │ authorOptions = [], 2026-10-23T17:03:47.6662224Z ·  ── 2026-10-23T17:03:47.6662325Z 388 │ labelOptions = [], 2026-10-23T17:03:47.6662389Z ╰──── 2026-10-23T17:03:47.6662728Z  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-23T17:03:47.6662730Z 2026-10-23T17:03:47.6663035Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-23T17:03:47.6663341Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:388:18] 2026-10-23T17:03:47.6663486Z 387 │ authorOptions = [], 2026-10-23T17:03:47.6663556Z 388 │ labelOptions = [], 2026-10-23T17:03:47.6663685Z ·  ── 2026-10-23T17:03:47.6663793Z 389 │ host, 2026-10-23T17:03:47.6663857Z ╰──── 2026-10-23T17:03:47.6664308Z  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-23T17:03:47.6664313Z 2026-10-23T17:03:47.6664618Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T17:03:47.6664813Z ╭─[apps/mobile/src/state/use-thread-outbox-drain.ts:1315:5] 2026-10-23T17:03:47.6664925Z 1314 │ queuedMessagesByThreadKey, 2026-10-23T17:03:47.6665001Z 1315 │ retryTick, 2026-10-23T17:03:47.6665119Z ·  ────┬──── 2026-10-23T17:03:47.6665295Z · ╰── Unnecessary dependency `retryTick` 2026-10-23T17:03:47.6665407Z 1316 │ restoreQueuedMessage, 2026-10-23T17:03:47.6665461Z ╰──── 2026-10-23T17:03:47.6665793Z  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-23T17:03:47.6666213Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6666216Z 2026-10-23T17:03:47.6666479Z ⚠ eslint(no-control-regex): Unexpected control character 2026-10-23T17:03:47.6666724Z ╭─[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46] 2026-10-23T17:03:47.6666938Z 219 │ 2026-10-23T17:03:47.6667140Z 220 │ {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")} 2026-10-23T17:03:47.6667288Z ·  ──┬─ 2026-10-23T17:03:47.6667470Z · ╰── 'U+001B' is a control character. 2026-10-23T17:03:47.6667543Z 221 │ 2026-10-23T17:03:47.6667610Z ╰──── 2026-10-23T17:03:47.6667867Z  help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression. 2026-10-23T17:03:47.6667869Z 2026-10-23T17:03:47.6668264Z ⚠ eslint(no-unused-vars): Variable 'legacyCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-23T17:03:47.6668480Z ╭─[packages/provider-cursor/src/server/credentialStore.test.ts:15:7] 2026-10-23T17:03:47.6668571Z 14 │ 2026-10-23T17:03:47.6668653Z 15 │ const legacyCredentials = { 2026-10-23T17:03:47.6668764Z ·  ────────┬──────── 2026-10-23T17:03:47.6668970Z · ╰── 'legacyCredentials' is declared here 2026-10-23T17:03:47.6669077Z 16 │ version: 1 as const, 2026-10-23T17:03:47.6669138Z ╰──── 2026-10-23T17:03:47.6669291Z  help: Consider removing this declaration. 2026-10-23T17:03:47.6669294Z 2026-10-23T17:03:47.6669494Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T17:03:47.6669861Z ╭─[apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx:814:17] 2026-10-23T17:03:47.6670043Z 813 │
    startEditor(defaultEditor), [defaultEditor, startEditor]); 2026-10-23T17:03:47.6671920Z ·  ─────┬───── 2026-10-23T17:03:47.6672155Z · ╰── Unnecessary dependency `startEditor` 2026-10-23T17:03:47.6672294Z 101 │ const readEditor = useCallback( 2026-10-23T17:03:47.6672382Z ╰──── 2026-10-23T17:03:47.6672810Z  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-23T17:03:47.6673213Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6673221Z 2026-10-23T17:03:47.6673474Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T17:03:47.6673701Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:121:7] 2026-10-23T17:03:47.6673822Z 120 │ setEditor, 2026-10-23T17:03:47.6673898Z 121 │ startEditor, 2026-10-23T17:03:47.6673998Z ·  ─────┬───── 2026-10-23T17:03:47.6674222Z · ╰── Unnecessary dependency `startEditor` 2026-10-23T17:03:47.6674322Z 122 │ hasChanges, 2026-10-23T17:03:47.6674396Z ╰──── 2026-10-23T17:03:47.6674827Z  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-23T17:03:47.6675232Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6675240Z 2026-10-23T17:03:47.6675506Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-23T17:03:47.6675668Z ╭─[packages/contracts/src/rpc.ts:295:8] 2026-10-23T17:03:47.6675737Z 294 │ } from "./device.ts"; 2026-10-23T17:03:47.6675849Z 295 │ import {} from "./previewAutomation.ts"; 2026-10-23T17:03:47.6675968Z ·  ── 2026-10-23T17:03:47.6676071Z 296 │ import { 2026-10-23T17:03:47.6676126Z ╰──── 2026-10-23T17:03:47.6676252Z  help: Remove empty braces 2026-10-23T17:03:47.6676256Z 2026-10-23T17:03:47.6676695Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T17:03:47.6676972Z ╭─[apps/mobile/src/state/use-vcs-action-state.ts:86:5] 2026-10-23T17:03:47.6677099Z 83 │ const [nowMs, setNowMs] = useState(() => Date.now()); 2026-10-23T17:03:47.6677189Z 84 │ useEffect(() => { 2026-10-23T17:03:47.6677283Z ·  ────┬──── 2026-10-23T17:03:47.6677436Z · ╰── This is the containing effect 2026-10-23T17:03:47.6677530Z 85 │ if (!actionState.isRunning) return; 2026-10-23T17:03:47.6677630Z 86 │ setNowMs(Date.now()); 2026-10-23T17:03:47.6677724Z ·  ────┬─── 2026-10-23T17:03:47.6677950Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6678086Z 87 │ const interval = setInterval(() => setNowMs(Date.now()), 1000); 2026-10-23T17:03:47.6678155Z ╰──── 2026-10-23T17:03:47.6679144Z  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-23T17:03:47.6679490Z  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-23T17:03:47.6679493Z 2026-10-23T17:03:47.6679859Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-23T17:03:47.6680000Z ╭─[packages/provider-cursor/src/server/auth.ts:249:20] 2026-10-23T17:03:47.6680078Z 248 │ }, 2026-10-23T17:03:47.6680181Z 249 │ (effect, flow, stopSessions) => 2026-10-23T17:03:47.6680300Z ·  ──────┬───── 2026-10-23T17:03:47.6680455Z · ╰── 'stopSessions' is declared here 2026-10-23T17:03:47.6680542Z 250 │ effect.pipe( 2026-10-23T17:03:47.6680615Z ╰──── 2026-10-23T17:03:47.6680735Z  help: Consider removing this parameter. 2026-10-23T17:03:47.6680737Z 2026-10-23T17:03:47.6680949Z ⚠ eslint(no-unused-vars): Identifier 'HostProcess' is imported but never used. 2026-10-23T17:03:47.6681142Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:25:13] 2026-10-23T17:03:47.6681249Z 24 │ import * as Schema from "effect/Schema"; 2026-10-23T17:03:47.6681406Z 25 │ import * as HostProcess from "@t3tools/shared/HostProcess"; 2026-10-23T17:03:47.6681699Z ·  ─────┬───── 2026-10-23T17:03:47.6682008Z · ╰── 'HostProcess' is imported here 2026-10-23T17:03:47.6682112Z 26 │ 2026-10-23T17:03:47.6682175Z ╰──── 2026-10-23T17:03:47.6682307Z  help: Consider removing this import. 2026-10-23T17:03:47.6682314Z 2026-10-23T17:03:47.6682615Z ⚠ eslint(no-unused-vars): Variable 'serverConfig' is declared but never used. Unused variables should start with a '_'. 2026-10-23T17:03:47.6682873Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:124:11] 2026-10-23T17:03:47.6682994Z 123 │ const path = yield* Path.Path; 2026-10-23T17:03:47.6683167Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-23T17:03:47.6683289Z ·  ──────┬───── 2026-10-23T17:03:47.6683467Z · ╰── 'serverConfig' is declared here 2026-10-23T17:03:47.6683633Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-23T17:03:47.6683687Z ╰──── 2026-10-23T17:03:47.6683831Z  help: Consider removing this declaration. 2026-10-23T17:03:47.6683838Z 2026-10-23T17:03:47.6684222Z ⚠ eslint(no-unused-vars): Variable 'serverSettings' is declared but never used. Unused variables should start with a '_'. 2026-10-23T17:03:47.6684426Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:125:11] 2026-10-23T17:03:47.6684553Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-23T17:03:47.6684698Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-23T17:03:47.6684816Z ·  ───────┬────── 2026-10-23T17:03:47.6685004Z · ╰── 'serverSettings' is declared here 2026-10-23T17:03:47.6685195Z 126 │ const gitWorkflow = yield* GitWorkflowService.GitWorkflowService; 2026-10-23T17:03:47.6685256Z ╰──── 2026-10-23T17:03:47.6685407Z  help: Consider removing this declaration. 2026-10-23T17:03:47.6685410Z 2026-10-23T17:03:47.6685635Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T17:03:47.6685796Z ╭─[apps/mobile/src/state/thread-order.ts:29:7] 2026-10-23T17:03:47.6685894Z 28 │ getPendingThreadOrder(); 2026-10-23T17:03:47.6686021Z 29 │ }, [nowMinute, snoozeWakeTick]); 2026-10-23T17:03:47.6686191Z ·  ────┬──── ───────┬────── 2026-10-23T17:03:47.6686415Z · │ ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-23T17:03:47.6686567Z · ╰── Unnecessary dependency `nowMinute` 2026-10-23T17:03:47.6686654Z 30 │ return pending; 2026-10-23T17:03:47.6686746Z ╰──── 2026-10-23T17:03:47.6687096Z  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-23T17:03:47.6687529Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6687550Z 2026-10-23T17:03:47.6687998Z ⚠ 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-23T17:03:47.6688296Z ╭─[packages/contracts/src/auth.test.ts:17:12] 2026-10-23T17:03:47.6688627Z 16 │ it("decodes legacy review credentials without offering them in new grants", () => { 2026-10-23T17:03:47.6688865Z 17 │ expect(Schema.decodeUnknownSync(AuthEnvironmentScopes)(["review:write"])).toEqual([ 2026-10-23T17:03:47.6689004Z ·  ──────────────────────── 2026-10-23T17:03:47.6689144Z 18 │ "review:write", 2026-10-23T17:03:47.6689231Z ╰──── 2026-10-23T17:03:47.6689234Z 2026-10-23T17:03:47.6689749Z ⚠ 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-23T17:03:47.6689895Z ╭─[packages/contracts/src/auth.test.ts:20:18] 2026-10-23T17:03:47.6690017Z 19 │ ]); 2026-10-23T17:03:47.6690253Z 20 │ expect(() => Schema.decodeUnknownSync(AuthGrantScopes)(["review:write"])).toThrow(); 2026-10-23T17:03:47.6690442Z ·  ──────────────────────── 2026-10-23T17:03:47.6690612Z 21 │ expect(AuthStandardClientScopes).not.toContain("review:write"); 2026-10-23T17:03:47.6690700Z ╰──── 2026-10-23T17:03:47.6690702Z 2026-10-23T17:03:47.6691143Z ⚠ 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-23T17:03:47.6691304Z ╭─[packages/contracts/src/auth.test.ts:58:21] 2026-10-23T17:03:47.6691541Z 57 │ it("ignores unknown response permissions without falling back to broader scopes", () => { 2026-10-23T17:03:47.6691688Z 58 │ const session = Schema.decodeUnknownSync(AuthSessionState)({ 2026-10-23T17:03:47.6691851Z ·  ──────────────────────── 2026-10-23T17:03:47.6691965Z 59 │ authenticated: true, 2026-10-23T17:03:47.6692073Z ╰──── 2026-10-23T17:03:47.6692075Z 2026-10-23T17:03:47.6692412Z ⚠ eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used. 2026-10-23T17:03:47.6692691Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:960:10] 2026-10-23T17:03:47.6692793Z 959 │ 2026-10-23T17:03:47.6692942Z 960 │ function layerClaudeAgentSdkReplayQueryRunner( 2026-10-23T17:03:47.6693070Z ·  ──────────────────┬───────────────── 2026-10-23T17:03:47.6693367Z · ╰── 'layerClaudeAgentSdkReplayQueryRunner' is declared here 2026-10-23T17:03:47.6693505Z 961 │ transcript: ClaudeAgentSdkReplayTranscript, 2026-10-23T17:03:47.6693603Z ╰──── 2026-10-23T17:03:47.6693787Z  help: Consider removing this declaration. 2026-10-23T17:03:47.6693799Z 2026-10-23T17:03:47.6694173Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-23T17:03:47.6694420Z ╭─[apps/mobile/src/state/use-model-option-memory.ts:21:7] 2026-10-23T17:03:47.6694550Z 20 │ [instanceId]: { 2026-10-23T17:03:47.6694688Z 21 │ ...(state[instanceId] ?? {}), 2026-10-23T17:03:47.6694879Z ·  ──────────────────────────── 2026-10-23T17:03:47.6695024Z 22 │ [model]: options, 2026-10-23T17:03:47.6695146Z ╰──── 2026-10-23T17:03:47.6695598Z  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-23T17:03:47.6695601Z 2026-10-23T17:03:47.6696020Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T17:03:47.6696385Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10578:7] 2026-10-23T17:03:47.6696516Z 10577 │ 2026-10-23T17:03:47.6696662Z 10578 │ const layer: Layer.Layer< 2026-10-23T17:03:47.6696824Z ·  ──┬── 2026-10-23T17:03:47.6697057Z · ╰── 'layer' is declared here 2026-10-23T17:03:47.6697205Z 10579 │ ProviderAdapter.ProviderAdapterV2, 2026-10-23T17:03:47.6697264Z ╰──── 2026-10-23T17:03:47.6697403Z  help: Consider removing this declaration. 2026-10-23T17:03:47.6697407Z 2026-10-23T17:03:47.6697800Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-23T17:03:47.6698095Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:1998:15] 2026-10-23T17:03:47.6698176Z 1997 │ assert.equal( 2026-10-23T17:03:47.6698372Z 1998 │ items.filter((item) => item.type === "assistant_message").at(-1)?.text, 2026-10-23T17:03:47.6698519Z ·  ────── 2026-10-23T17:03:47.6698671Z 1999 │ "authoritative answer", 2026-10-23T17:03:47.6698782Z ╰──── 2026-10-23T17:03:47.6699033Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-23T17:03:47.6699036Z 2026-10-23T17:03:47.6699870Z ⚠ 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-23T17:03:47.6700072Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:3951:7] 2026-10-23T17:03:47.6701389Z 3950 │ const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped); 2026-10-23T17:03:47.6702221Z 3951 │ ╭─▶ while (!responseLifecycle.includes("failed")) { 2026-10-23T17:03:47.6702366Z 3952 │ │ yield* Effect.yieldNow; 2026-10-23T17:03:47.6702612Z 3953 │ ╰─▶ } 2026-10-23T17:03:47.6702819Z 3954 │ const responseExit = yield* Fiber.join(responseFiber); 2026-10-23T17:03:47.6702883Z ╰──── 2026-10-23T17:03:47.6702911Z 2026-10-23T17:03:47.6703555Z ⚠ 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-23T17:03:47.6703828Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6062:9] 2026-10-23T17:03:47.6703975Z 6061 │ .pipe(Effect.forkScoped); 2026-10-23T17:03:47.6704218Z 6062 │ ╭─▶ while (promptGates.length < 1) { 2026-10-23T17:03:47.6704404Z 6063 │ │ yield* Effect.yieldNow; 2026-10-23T17:03:47.6704589Z 6064 │ ╰─▶ } 2026-10-23T17:03:47.6704784Z 6065 │ assert.isDefined(sessionUpdateHandler, "session update handler must be wired"); 2026-10-23T17:03:47.6704851Z ╰──── 2026-10-23T17:03:47.6704855Z 2026-10-23T17:03:47.6706123Z ⚠ 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-23T17:03:47.6706493Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6197:9] 2026-10-23T17:03:47.6706604Z 6196 │ .pipe(Effect.forkScoped); 2026-10-23T17:03:47.6706813Z 6197 │ ╭─▶ while (promptGates.length < 2) { 2026-10-23T17:03:47.6706943Z 6198 │ │ yield* Effect.yieldNow; 2026-10-23T17:03:47.6707097Z 6199 │ ╰─▶ } 2026-10-23T17:03:47.6707328Z 6200 │ if (sessionUpdateHandler === undefined || capturedMutation.current === null) { 2026-10-23T17:03:47.6707447Z ╰──── 2026-10-23T17:03:47.6707452Z 2026-10-23T17:03:47.6707715Z ⚠ react(immutability): This value cannot be modified 2026-10-23T17:03:47.6707907Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:42:5] 2026-10-23T17:03:47.6707976Z 35 │ 2026-10-23T17:03:47.6708142Z 36 │ const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0); 2026-10-23T17:03:47.6708269Z ·  ────────┬──────── 2026-10-23T17:03:47.6708441Z · ╰── `inspectorProgress` originates here 2026-10-23T17:03:47.6708565Z 37 │ const { renderedInspectorWidth } = props; 2026-10-23T17:03:47.6708724Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-23T17:03:47.6708815Z 39 │ 2026-10-23T17:03:47.6708910Z 40 │ const onClosed = props.onClosed; 2026-10-23T17:03:47.6709006Z 41 │ useEffect(() => { 2026-10-23T17:03:47.6709127Z 42 │ inspectorProgress.value = withTiming( 2026-10-23T17:03:47.6709234Z ·  ────────┬──────── 2026-10-23T17:03:47.6709400Z · ╰── `inspectorProgress` cannot be modified 2026-10-23T17:03:47.6709500Z 43 │ inspectorVisible ? 1 : 0, 2026-10-23T17:03:47.6709578Z ╰──── 2026-10-23T17:03:47.6709974Z  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-23T17:03:47.6710349Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T17:03:47.6710353Z 2026-10-23T17:03:47.6710544Z ⚠ react(immutability): This value cannot be modified 2026-10-23T17:03:47.6710747Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:67:7] 2026-10-23T17:03:47.6710869Z 37 │ const { renderedInspectorWidth } = props; 2026-10-23T17:03:47.6711018Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-23T17:03:47.6711121Z ·  ──────────┬───────── 2026-10-23T17:03:47.6711306Z · ╰── `renderedContentWidth` originates here 2026-10-23T17:03:47.6711381Z 39 │ 2026-10-23T17:03:47.6711472Z 40 │ const onClosed = props.onClosed; 2026-10-23T17:03:47.6711555Z 41 │ useEffect(() => { 2026-10-23T17:03:47.6711663Z 42 │ inspectorProgress.value = withTiming( 2026-10-23T17:03:47.6711755Z 43 │ inspectorVisible ? 1 : 0, 2026-10-23T17:03:47.6711835Z 44 │ WORKSPACE_PANE_TIMING, 2026-10-23T17:03:47.6711921Z 45 │ (finished) => { 2026-10-23T17:03:47.6712410Z 46 │ if (finished === true && !inspectorVisible && onClosed !== undefined) { 2026-10-23T17:03:47.6712625Z 47 │ runOnJS(onClosed)(); 2026-10-23T17:03:47.6712696Z 48 │ } 2026-10-23T17:03:47.6712773Z 49 │ }, 2026-10-23T17:03:47.6712884Z 50 │ ); 2026-10-23T17:03:47.6713085Z 51 │ const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0; 2026-10-23T17:03:47.6713177Z 52 │ renderedInspectorWidth.set( 2026-10-23T17:03:47.6713448Z 53 │ resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING), 2026-10-23T17:03:47.6713536Z 54 │ ); 2026-10-23T17:03:47.6713608Z 55 │ }, [ 2026-10-23T17:03:47.6713683Z 56 │ inspectorProgress, 2026-10-23T17:03:47.6713771Z 57 │ inspectorVisible, 2026-10-23T17:03:47.6713850Z 58 │ inspectorWidth, 2026-10-23T17:03:47.6713934Z 59 │ onClosed, 2026-10-23T17:03:47.6714018Z 60 │ renderedInspectorWidth, 2026-10-23T17:03:47.6714111Z 61 │ resizing, 2026-10-23T17:03:47.6714188Z 62 │ ]); 2026-10-23T17:03:47.6714246Z 63 │ 2026-10-23T17:03:47.6714325Z 64 │ useEffect(() => { 2026-10-23T17:03:47.6714442Z 65 │ const targetWidth = inspectorWidth ?? 0; 2026-10-23T17:03:47.6714551Z 66 │ if (!inspectorVisible || resizing) { 2026-10-23T17:03:47.6714663Z 67 │ renderedContentWidth.value = targetWidth; 2026-10-23T17:03:47.6714779Z ·  ──────────┬───────── 2026-10-23T17:03:47.6714969Z · ╰── `renderedContentWidth` cannot be modified 2026-10-23T17:03:47.6715050Z 68 │ return; 2026-10-23T17:03:47.6715109Z ╰──── 2026-10-23T17:03:47.6715413Z  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-23T17:03:47.6715766Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T17:03:47.6715773Z 2026-10-23T17:03:47.6716211Z ⚠ eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'. 2026-10-23T17:03:47.6716448Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1444:7] 2026-10-23T17:03:47.6716511Z 1443 │ 2026-10-23T17:03:47.6716721Z 1444 │ const layerCodexAppServerClientFactoryCommand = ( 2026-10-23T17:03:47.6716872Z ·  ───────────────────┬─────────────────── 2026-10-23T17:03:47.6717104Z · ╰── 'layerCodexAppServerClientFactoryCommand' is declared here 2026-10-23T17:03:47.6717539Z 1445 │ options: CodexClient.CodexAppServerClientOptions & { 2026-10-23T17:03:47.6717759Z ╰──── 2026-10-23T17:03:47.6717951Z  help: Consider removing this declaration. 2026-10-23T17:03:47.6717955Z 2026-10-23T17:03:47.6718422Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T17:03:47.6718996Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1680:7] 2026-10-23T17:03:47.6719121Z 1679 │ 2026-10-23T17:03:47.6719234Z 1680 │ const layer: Layer.Layer< 2026-10-23T17:03:47.6719350Z ·  ──┬── 2026-10-23T17:03:47.6719504Z · ╰── 'layer' is declared here 2026-10-23T17:03:47.6719630Z 1681 │ ProviderAdapter.ProviderAdapterV2, 2026-10-23T17:03:47.6719748Z ╰──── 2026-10-23T17:03:47.6719895Z  help: Consider removing this declaration. 2026-10-23T17:03:47.6719907Z 2026-10-23T17:03:47.6720321Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeEffect(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const. 2026-10-23T17:03:47.6720496Z ╭─[apps/server/src/vcs/GitVcsDriverCore.test.ts:1786:34] 2026-10-23T17:03:47.6720671Z 1785 │ const stat = branch.files!.find((file) => file.path === path)!; 2026-10-23T17:03:47.6720850Z 1786 │ const request = yield* Schema.decodeEffect(ReviewDiffPreviewInput)({ 2026-10-23T17:03:47.6720981Z ·  ─────────────────── 2026-10-23T17:03:47.6721077Z 1787 │ cwd, 2026-10-23T17:03:47.6721156Z ╰──── 2026-10-23T17:03:47.6721162Z 2026-10-23T17:03:47.6721358Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.6721554Z ╭─[apps/mobile/src/features/home/thread-swipe-actions.tsx:494:27] 2026-10-23T17:03:47.6721630Z 493 │ > 2026-10-23T17:03:47.6721747Z 494 │ {props.children(close)} 2026-10-23T17:03:47.6721869Z ·  ──┬── 2026-10-23T17:03:47.6722052Z · ╰── Cannot access ref value during render 2026-10-23T17:03:47.6722155Z 495 │ 2026-10-23T17:03:47.6722238Z ╰──── 2026-10-23T17:03:47.6722767Z  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-23T17:03:47.6723112Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.6723118Z 2026-10-23T17:03:47.6723386Z ⚠ unicorn(prefer-string-starts-ends-with): Prefer String#startsWith over a regex with a caret. 2026-10-23T17:03:47.6723551Z ╭─[apps/server/src/vcs/GitVcsDriverCore.ts:509:11] 2026-10-23T17:03:47.6723689Z 508 │ GIT_DIAGNOSTIC_LINE_PATTERN.test(line) || 2026-10-23T17:03:47.6723866Z 509 │ (!/^remote:/.test(line) && SSH_TRANSPORT_REFUSAL_PATTERN.test(line)), 2026-10-23T17:03:47.6723973Z ·  ─────────────── 2026-10-23T17:03:47.6724059Z 510 │ ) 2026-10-23T17:03:47.6724152Z ╰──── 2026-10-23T17:03:47.6724345Z  help: Replace `/^remote:/.test(line)` with `line.startsWith('remote:')`. 2026-10-23T17:03:47.6724348Z 2026-10-23T17:03:47.6725066Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T17:03:47.6725436Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:542:25] 2026-10-23T17:03:47.6725644Z 541 │ // range) the boundary string is identical and the chain would die. 2026-10-23T17:03:47.6725786Z 542 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-23T17:03:47.6725898Z ·  ───────┬────── 2026-10-23T17:03:47.6726104Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-23T17:03:47.6726269Z 543 │ const v2SearchQuery = props.searchQuery.trim().toLocaleLowerCase(); 2026-10-23T17:03:47.6726336Z ╰──── 2026-10-23T17:03:47.6726678Z  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-23T17:03:47.6727020Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6727023Z 2026-10-23T17:03:47.6727213Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T17:03:47.6727363Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:533:53] 2026-10-23T17:03:47.6727467Z 532 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-23T17:03:47.6727644Z 533 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-23T17:03:47.6727788Z ·  ─────┬──── 2026-10-23T17:03:47.6727977Z · ╰── Cannot call impure function 2026-10-23T17:03:47.6728077Z 534 │ const id = setTimeout(() => { 2026-10-23T17:03:47.6728132Z ╰──── 2026-10-23T17:03:47.6728451Z  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-23T17:03:47.6728772Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T17:03:47.6728774Z 2026-10-23T17:03:47.6728959Z ⚠ eslint(no-empty-pattern): Empty array binding pattern 2026-10-23T17:03:47.6729134Z ╭─[apps/server/src/pullRequest/PullRequestService.test.ts:1475:12] 2026-10-23T17:03:47.6729192Z 1474 │ 2026-10-23T17:03:47.6729278Z 1475 │ for (const [] of [ 2026-10-23T17:03:47.6729366Z ·  ── 2026-10-23T17:03:47.6729456Z 1476 │ ["github", "github.com"], 2026-10-23T17:03:47.6729515Z ╰──── 2026-10-23T17:03:47.6729918Z  help: Passing non-iterable values (null, undefined, numbers, booleans, etc.) will result in a runtime error because these values are not iterable. 2026-10-23T17:03:47.6729922Z 2026-10-23T17:03:47.6730383Z ⚠ 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-23T17:03:47.6730550Z ╭─[apps/server/src/provider/acp/AntigravityProtocol.ts:263:20] 2026-10-23T17:03:47.6730640Z 262 │ ...(update._meta !== undefined 2026-10-23T17:03:47.6730829Z 263 │ ? { _meta: Schema.is(Schema.Record(Schema.String, Schema.Json))(meta) ? meta : null } 2026-10-23T17:03:47.6731138Z ·  ───────── 2026-10-23T17:03:47.6731342Z 264 │ : {}), 2026-10-23T17:03:47.6731426Z ╰──── 2026-10-23T17:03:47.6731436Z 2026-10-23T17:03:47.6731798Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-23T17:03:47.6731949Z ╭─[apps/server/src/telemetry/AnalyticsService.ts:340:7] 2026-10-23T17:03:47.6732014Z 339 │ 2026-10-23T17:03:47.6732132Z 340 │ const layerTest = AnalyticsService.layerTest; 2026-10-23T17:03:47.6732215Z ·  ────┬──── 2026-10-23T17:03:47.6732371Z · ╰── 'layerTest' is declared here 2026-10-23T17:03:47.6732430Z ╰──── 2026-10-23T17:03:47.6732543Z  help: Consider removing this declaration. 2026-10-23T17:03:47.6732554Z 2026-10-23T17:03:47.6732734Z ⚠ eslint(no-new): Do not use 'new' for side effects. 2026-10-23T17:03:47.6732887Z ╭─[apps/server/src/mcp/McpToolAccess.test.ts:168:3] 2026-10-23T17:03:47.6733019Z 167 │ // @ts-expect-error a declaration constructed directly 2026-10-23T17:03:47.6733131Z 168 │ new McpToolAccess.Declaration(unchecked); 2026-10-23T17:03:47.6733235Z ·  ───────────────────────────── 2026-10-23T17:03:47.6733382Z 169 │ // @ts-expect-error a handlers layer built outside McpToolAccess 2026-10-23T17:03:47.6733449Z ╰──── 2026-10-23T17:03:47.6733632Z  help: Assign the result of 'new' to a variable or compare it to a reference. 2026-10-23T17:03:47.6733635Z 2026-10-23T17:03:47.6733855Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-23T17:03:47.6734019Z ╭─[packages/client-runtime/src/state/usageAccess.ts:3:8] 2026-10-23T17:03:47.6734122Z 2 │ AuthDiagnosticsReadScope, 2026-10-23T17:03:47.6734211Z 3 │ type AuthSessionState, 2026-10-23T17:03:47.6734305Z ·  ────────┬─────── 2026-10-23T17:03:47.6734472Z · ╰── 'AuthSessionState' is imported here 2026-10-23T17:03:47.6734563Z 4 │ sessionGrantsScope, 2026-10-23T17:03:47.6734632Z ╰──── 2026-10-23T17:03:47.6734743Z  help: Consider removing this import. 2026-10-23T17:03:47.6734746Z 2026-10-23T17:03:47.6734995Z ⚠ eslint(no-unused-vars): Function 'nonEmptyString' is declared but never used. 2026-10-23T17:03:47.6735173Z ╭─[packages/client-runtime/src/work-log/presentation.ts:234:10] 2026-10-23T17:03:47.6735252Z 233 │ 2026-10-23T17:03:47.6735388Z 234 │ function nonEmptyString(value: unknown): string | null { 2026-10-23T17:03:47.6735498Z ·  ───────┬────── 2026-10-23T17:03:47.6735659Z · ╰── 'nonEmptyString' is declared here 2026-10-23T17:03:47.6735818Z 235 │ return typeof value === "string" && value.trim().length > 0 ? value : null; 2026-10-23T17:03:47.6735882Z ╰──── 2026-10-23T17:03:47.6736010Z  help: Consider removing this declaration. 2026-10-23T17:03:47.6736013Z 2026-10-23T17:03:47.6736290Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T17:03:47.6736467Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:223:31] 2026-10-23T17:03:47.6736584Z 222 │ ? snippetTokens.map((line, lineIndex) => ( 2026-10-23T17:03:47.6736699Z 223 │ 2026-10-23T17:03:47.6737336Z ·  ─────────────── 2026-10-23T17:03:47.6737610Z 224 │ {lineIndex > 0 ? "\n" : ""} 2026-10-23T17:03:47.6737669Z ╰──── 2026-10-23T17:03:47.6737838Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-23T17:03:47.6737841Z 2026-10-23T17:03:47.6738168Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T17:03:47.6738340Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25] 2026-10-23T17:03:47.6738425Z 226 │ { 2026-10-23T17:03:47.6739914Z ·  ────┬──── 2026-10-23T17:03:47.6740082Z · ╰── This is the containing effect 2026-10-23T17:03:47.6740187Z 106 │ clearReviewCommentTarget(); 2026-10-23T17:03:47.6740297Z 107 │ setPendingNativeCommentSelection(null); 2026-10-23T17:03:47.6740433Z ·  ────────────────┬─────────────── 2026-10-23T17:03:47.6740634Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6740719Z 108 │ }, [selectedSection?.id]); 2026-10-23T17:03:47.6740776Z ╰──── 2026-10-23T17:03:47.6742105Z  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-23T17:03:47.6742844Z  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-23T17:03:47.6742861Z 2026-10-23T17:03:47.6743665Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T17:03:47.6743984Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7] 2026-10-23T17:03:47.6744050Z 109 │ 2026-10-23T17:03:47.6744133Z 110 │ useEffect(() => { 2026-10-23T17:03:47.6744256Z ·  ────┬──── 2026-10-23T17:03:47.6744428Z · ╰── This is the containing effect 2026-10-23T17:03:47.6744534Z 111 │ if (activeCommentTarget === null) { 2026-10-23T17:03:47.6744666Z 112 │ setPendingNativeCommentSelection(null); 2026-10-23T17:03:47.6744788Z ·  ────────────────┬─────────────── 2026-10-23T17:03:47.6745001Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6745064Z 113 │ } 2026-10-23T17:03:47.6745133Z ╰──── 2026-10-23T17:03:47.6745825Z  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-23T17:03:47.6746227Z  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-23T17:03:47.6746232Z 2026-10-23T17:03:47.6746804Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T17:03:47.6747034Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7] 2026-10-23T17:03:47.6747151Z 107 │ setPendingNativeCommentSelection(null); 2026-10-23T17:03:47.6747246Z 108 │ }, [selectedSection?.id]); 2026-10-23T17:03:47.6747350Z ·  ─────────┬───────── 2026-10-23T17:03:47.6747527Z · ╰── Unnecessary dependency `selectedSection?.id` 2026-10-23T17:03:47.6747607Z 109 │ 2026-10-23T17:03:47.6747717Z ╰──── 2026-10-23T17:03:47.6748189Z  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-23T17:03:47.6748647Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6748654Z 2026-10-23T17:03:47.6749002Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T17:03:47.6749240Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:60:5] 2026-10-23T17:03:47.6749332Z 55 │ 2026-10-23T17:03:47.6749441Z 56 │ useEffect(() => { 2026-10-23T17:03:47.6749567Z ·  ────┬──── 2026-10-23T17:03:47.6749845Z · ╰── This is the containing effect 2026-10-23T17:03:47.6749930Z 57 │ scheduler.reset(); 2026-10-23T17:03:47.6750039Z 58 │ highlightedRowIdsRef.current = new Set(); 2026-10-23T17:03:47.6750137Z 59 │ visibleChunkIndexRef.current = 0; 2026-10-23T17:03:47.6750268Z 60 │ setVisibleRange({ firstRowIndex: 0, lastRowIndex: 80 }); 2026-10-23T17:03:47.6750367Z ·  ───────┬─────── 2026-10-23T17:03:47.6750544Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6750883Z 61 │ setTokensPatchJson(createEmptyTokenPatch(resetKey)); 2026-10-23T17:03:47.6750995Z ╰──── 2026-10-23T17:03:47.6751614Z  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-23T17:03:47.6752010Z  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-23T17:03:47.6752016Z 2026-10-23T17:03:47.6752271Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T17:03:47.6752485Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:63:7] 2026-10-23T17:03:47.6752576Z 62 │ return () => scheduler.cancel(); 2026-10-23T17:03:47.6752711Z 63 │ }, [enabled, resetKey, rows.length, scheduler]); 2026-10-23T17:03:47.6752902Z ·  ───┬─── ─────┬───── 2026-10-23T17:03:47.6753181Z · │ ╰── Unnecessary dependency `rows.length` 2026-10-23T17:03:47.6753334Z · ╰── Unnecessary dependency `enabled` 2026-10-23T17:03:47.6753408Z 64 │ 2026-10-23T17:03:47.6753487Z ╰──── 2026-10-23T17:03:47.6753793Z  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-23T17:03:47.6754122Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6754128Z 2026-10-23T17:03:47.6754397Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T17:03:47.6754593Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:454:7] 2026-10-23T17:03:47.6754680Z 453 │ showAuxiliaryPane("inspector"); 2026-10-23T17:03:47.6754804Z 454 │ }, [environmentId, showAuxiliaryPane, threadId]); 2026-10-23T17:03:47.6754958Z ·  ──────┬────── ────┬─── 2026-10-23T17:03:47.6755193Z · │ ╰── Unnecessary dependency `threadId` 2026-10-23T17:03:47.6755357Z · ╰── Unnecessary dependency `environmentId` 2026-10-23T17:03:47.6755469Z 455 │ const { 2026-10-23T17:03:47.6755531Z ╰──── 2026-10-23T17:03:47.6755880Z  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-23T17:03:47.6756214Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6756217Z 2026-10-23T17:03:47.6756473Z ⚠ react(static-components): Cannot create components during render 2026-10-23T17:03:47.6756675Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:725:20] 2026-10-23T17:03:47.6756761Z 492 │ // same check. 2026-10-23T17:03:47.6756942Z 493 │ const NativeReviewDiffView = resolveNativeReviewDiffView(); 2026-10-23T17:03:47.6757199Z ·  ─────────────┬───────────── 2026-10-23T17:03:47.6757524Z · ╰── The component is created during render here 2026-10-23T17:03:47.6757740Z 494 │ const nativeReviewDiffViewRef = useRef(null); 2026-10-23T17:03:47.6757940Z 495 │ const showcasedReviewDrawRef = useRef(null); 2026-10-23T17:03:47.6758088Z 496 │ const [isPullRefreshing, setIsPullRefreshing] = useState(false); 2026-10-23T17:03:47.6758241Z 497 │ const handlePullToRefresh = async () => { 2026-10-23T17:03:47.6758365Z 498 │ setIsPullRefreshing(true); 2026-10-23T17:03:47.6759244Z 499 │ await refreshSelectedSection(); 2026-10-23T17:03:47.6759326Z 500 │ setIsPullRefreshing(false); 2026-10-23T17:03:47.6759390Z 501 │ }; 2026-10-23T17:03:47.6759597Z 502 │ const reviewFileNavigatorRef = useRef(null); 2026-10-23T17:03:47.6759843Z 503 │ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : []; 2026-10-23T17:03:47.6759971Z 504 │ const fileVisibility = useReviewFileVisibility({ 2026-10-23T17:03:47.6760090Z 505 │ threadKey: reviewCache.threadKey, 2026-10-23T17:03:47.6760214Z 506 │ sectionId: selectedSection?.id ?? null, 2026-10-23T17:03:47.6760286Z 507 │ files: reviewFiles, 2026-10-23T17:03:47.6760397Z 508 │ cachedExpandedFileIds: selectedSection?.id 2026-10-23T17:03:47.6760541Z 509 │ ? reviewCache.expandedFileIdsBySection[selectedSection.id] 2026-10-23T17:03:47.6760611Z 510 │ : undefined, 2026-10-23T17:03:47.6760706Z 511 │ cachedViewedFileIds: selectedSection?.id 2026-10-23T17:03:47.6760843Z 512 │ ? reviewCache.viewedFileIdsBySection[selectedSection.id] 2026-10-23T17:03:47.6760915Z 513 │ : undefined, 2026-10-23T17:03:47.6760985Z 514 │ }); 2026-10-23T17:03:47.6761180Z 515 │ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility; 2026-10-23T17:03:47.6761314Z 516 │ const commentSelection = useReviewCommentSelectionController({ 2026-10-23T17:03:47.6761382Z 517 │ environmentId, 2026-10-23T17:03:47.6761460Z 518 │ threadId, 2026-10-23T17:03:47.6761525Z 519 │ selectedSection, 2026-10-23T17:03:47.6761603Z 520 │ nativeReviewDiffData, 2026-10-23T17:03:47.6761663Z 521 │ }); 2026-10-23T17:03:47.6761774Z 522 │ const nativeBridge = useNativeReviewDiffBridge({ 2026-10-23T17:03:47.6761860Z 523 │ threadKey: reviewCache.threadKey, 2026-10-23T17:03:47.6761956Z 524 │ sectionId: selectedSection?.id ?? null, 2026-10-23T17:03:47.6762043Z 525 │ diff: selectedSection?.diff, 2026-10-23T17:03:47.6762123Z 526 │ data: nativeReviewDiffData, 2026-10-23T17:03:47.6762196Z 527 │ collapsedFileIds, 2026-10-23T17:03:47.6762266Z 528 │ viewedFileIds, 2026-10-23T17:03:47.6762381Z 529 │ selectedRowIds: commentSelection.selectedRowIds, 2026-10-23T17:03:47.6762482Z 530 │ canHighlight: parsedDiff.kind === "files", 2026-10-23T17:03:47.6762543Z 531 │ }); 2026-10-23T17:03:47.6762624Z 532 │ const showcaseReviewKey = 2026-10-23T17:03:47.6762762Z 533 │ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection 2026-10-23T17:03:47.6762979Z 534 │ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}` 2026-10-23T17:03:47.6763044Z 535 │ : null; 2026-10-23T17:03:47.6763217Z 536 │ const handleNativeDebug = (event: NativeSyntheticEvent>) => { 2026-10-23T17:03:47.6763299Z 537 │ nativeBridge.onDebug(event); 2026-10-23T17:03:47.6763364Z 538 │ if ( 2026-10-23T17:03:47.6763639Z 539 │ showcaseReviewKey === null || 2026-10-23T17:03:47.6763833Z 540 │ showcasedReviewDrawRef.current === showcaseReviewKey || 2026-10-23T17:03:47.6763946Z 541 │ !isNativeReviewDiffDrawEvent(event.nativeEvent) 2026-10-23T17:03:47.6764002Z 542 │ ) { 2026-10-23T17:03:47.6764073Z 543 │ return; 2026-10-23T17:03:47.6764130Z 544 │ } 2026-10-23T17:03:47.6764250Z 545 │ showcasedReviewDrawRef.current = showcaseReviewKey; 2026-10-23T17:03:47.6764414Z 546 │ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId }); 2026-10-23T17:03:47.6764475Z 547 │ }; 2026-10-23T17:03:47.6764539Z 548 │ 2026-10-23T17:03:47.6764665Z 549 │ const handleSelectFile = async (fileId: string | null) => { 2026-10-23T17:03:47.6764747Z 550 │ loadVisibleFile(fileId, true); 2026-10-23T17:03:47.6764849Z 551 │ commentSelection.clearSelection(); 2026-10-23T17:03:47.6764983Z 552 │ if (fileId !== null && collapsedFileIds.includes(fileId)) { 2026-10-23T17:03:47.6765072Z 553 │ toggleExpandedFile(fileId); 2026-10-23T17:03:47.6765133Z 554 │ } 2026-10-23T17:03:47.6765253Z 555 │ const nativeView = nativeReviewDiffViewRef.current; 2026-10-23T17:03:47.6765329Z 556 │ if (!nativeView) return; 2026-10-23T17:03:47.6765431Z 557 │ const result = await settlePromise(() => 2026-10-23T17:03:47.6765605Z 558 │ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true), 2026-10-23T17:03:47.6765672Z 559 │ ); 2026-10-23T17:03:47.6765769Z 560 │ if (AsyncResult.isFailure(result)) { 2026-10-23T17:03:47.6765953Z 561 │ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result)); 2026-10-23T17:03:47.6766010Z 562 │ } 2026-10-23T17:03:47.6766071Z 563 │ }; 2026-10-23T17:03:47.6766166Z 564 │ const handleVisibleFileChange = ( 2026-10-23T17:03:47.6766305Z 565 │ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>, 2026-10-23T17:03:47.6766366Z 566 │ ) => { 2026-10-23T17:03:47.6766484Z 567 │ loadVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-23T17:03:47.6766660Z 568 │ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-23T17:03:47.6766722Z 569 │ }; 2026-10-23T17:03:47.6766801Z 570 │ const renderInspector = () => ( 2026-10-23T17:03:47.6766878Z 571 │ void handleSelectFile(fileId)} 2026-10-23T17:03:47.6767431Z 577 │ /> 2026-10-23T17:03:47.6767493Z 578 │ ); 2026-10-23T17:03:47.6767554Z 579 │ 2026-10-23T17:03:47.6767745Z 580 │ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => { 2026-10-23T17:03:47.6767832Z 581 │ const { fileId } = event.nativeEvent; 2026-10-23T17:03:47.6767904Z 582 │ if (fileId) { 2026-10-23T17:03:47.6767992Z 583 │ loadVisibleFile(fileId, true); 2026-10-23T17:03:47.6768074Z 584 │ toggleExpandedFile(fileId); 2026-10-23T17:03:47.6768131Z 585 │ } 2026-10-23T17:03:47.6768192Z 586 │ }; 2026-10-23T17:03:47.6768250Z 587 │ 2026-10-23T17:03:47.6768343Z 588 │ const handleNativeToggleViewedFile = ( 2026-10-23T17:03:47.6768466Z 589 │ event: NativeSyntheticEvent<{ readonly fileId?: string }>, 2026-10-23T17:03:47.6768612Z 590 │ ) => { 2026-10-23T17:03:47.6768750Z 591 │ const { fileId } = event.nativeEvent; 2026-10-23T17:03:47.6768822Z 592 │ if (fileId) { 2026-10-23T17:03:47.6768899Z 593 │ toggleViewedFile(fileId); 2026-10-23T17:03:47.6768963Z 594 │ } 2026-10-23T17:03:47.6769021Z 595 │ }; 2026-10-23T17:03:47.6769075Z 596 │ 2026-10-23T17:03:47.6769157Z 597 │ const parsedDiffNotice = 2026-10-23T17:03:47.6769332Z 598 │ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null; 2026-10-23T17:03:47.6769458Z 599 │ const hasCachedSelectedDiff = selectedSection?.diff != null; 2026-10-23T17:03:47.6769613Z 600 │ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null); 2026-10-23T17:03:47.6769807Z 601 │ const sectionMenu = buildReviewSectionMenu(reviewSections); 2026-10-23T17:03:47.6769981Z 602 │ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({ 2026-10-23T17:03:47.6770104Z 603 │ hasEnvironmentPresentation: environment.isReady, 2026-10-23T17:03:47.6770211Z 604 │ isEnvironmentConnected: isEnvironmentReady, 2026-10-23T17:03:47.6770294Z 605 │ hasCachedSelectedDiff, 2026-10-23T17:03:47.6770367Z 606 │ hasAnyCachedDiff, 2026-10-23T17:03:47.6770428Z 607 │ }); 2026-10-23T17:03:47.6770518Z 608 │ const handleRetryEnvironment = () => { 2026-10-23T17:03:47.6770613Z 609 │ void retryEnvironment(environmentId); 2026-10-23T17:03:47.6770675Z 610 │ }; 2026-10-23T17:03:47.6770774Z 611 │ const handleReturnToThread = () => { 2026-10-23T17:03:47.6770853Z 612 │ if (navigation.canGoBack()) { 2026-10-23T17:03:47.6770926Z 613 │ navigation.goBack(); 2026-10-23T17:03:47.6770996Z 614 │ return; 2026-10-23T17:03:47.6771054Z 615 │ } 2026-10-23T17:03:47.6771144Z 616 │ navigation.navigate("Thread", { 2026-10-23T17:03:47.6771241Z 617 │ environmentId: String(environmentId), 2026-10-23T17:03:47.6771324Z 618 │ threadId: String(threadId), 2026-10-23T17:03:47.6771386Z 619 │ }); 2026-10-23T17:03:47.6771439Z 620 │ }; 2026-10-23T17:03:47.6771523Z 621 │ const androidHeaderSubtitle = [ 2026-10-23T17:03:47.6771601Z 622 │ selectedSection?.title, 2026-10-23T17:03:47.6771681Z 623 │ headerDiffSummary.additions, 2026-10-23T17:03:47.6771774Z 624 │ headerDiffSummary.deletions, 2026-10-23T17:03:47.6771837Z 625 │ ] 2026-10-23T17:03:47.6771949Z 626 │ .filter((part): part is string => Boolean(part)) 2026-10-23T17:03:47.6772012Z 627 │ .join(" · "); 2026-10-23T17:03:47.6772068Z 628 │ 2026-10-23T17:03:47.6772160Z 629 │ const showChangedFilesPane = 2026-10-23T17:03:47.6772238Z 630 │ !showConnectionNotice && 2026-10-23T17:03:47.6772317Z 631 │ selectedSection !== null && 2026-10-23T17:03:47.6772404Z 632 │ parsedDiff.kind === "files" && 2026-10-23T17:03:47.6772488Z 633 │ NativeReviewDiffView !== null; 2026-10-23T17:03:47.6772662Z 634 │ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined); 2026-10-23T17:03:47.6772831Z 635 │ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane; 2026-10-23T17:03:47.6772894Z 636 │ 2026-10-23T17:03:47.6772974Z 637 │ const listHeader = (() => { 2026-10-23T17:03:47.6773068Z 638 │ const children: ReactElement[] = []; 2026-10-23T17:03:47.6773121Z 639 │ 2026-10-23T17:03:47.6773191Z 640 │ if (error) { 2026-10-23T17:03:47.6773266Z 641 │ children.push( 2026-10-23T17:03:47.6773333Z 642 │ 2026-10-23T17:03:47.6774215Z 649 │ Review unavailable 2026-10-23T17:03:47.6774377Z 650 │ {error} 2026-10-23T17:03:47.6774444Z 651 │ , 2026-10-23T17:03:47.6774511Z 652 │ ); 2026-10-23T17:03:47.6774572Z 653 │ } 2026-10-23T17:03:47.6774626Z 654 │ 2026-10-23T17:03:47.6774705Z 655 │ if (parsedDiffNotice) { 2026-10-23T17:03:47.6774881Z 656 │ children.push(); 2026-10-23T17:03:47.6774941Z 657 │ } 2026-10-23T17:03:47.6774995Z 658 │ 2026-10-23T17:03:47.6775078Z 659 │ if (children.length === 0) { 2026-10-23T17:03:47.6775146Z 660 │ return null; 2026-10-23T17:03:47.6775209Z 661 │ } 2026-10-23T17:03:47.6775262Z 662 │ 2026-10-23T17:03:47.6775336Z 663 │ return <>{children}; 2026-10-23T17:03:47.6775400Z 664 │ })(); 2026-10-23T17:03:47.6775469Z 665 │ const headerSubtitle = [ 2026-10-23T17:03:47.6775554Z 666 │ headerDiffSummary.additions, 2026-10-23T17:03:47.6775635Z 667 │ headerDiffSummary.deletions, 2026-10-23T17:03:47.6775723Z 668 │ pendingReviewCommentCount > 0 2026-10-23T17:03:47.6775896Z 669 │ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}` 2026-10-23T17:03:47.6775967Z 670 │ : null, 2026-10-23T17:03:47.6776026Z 671 │ ] 2026-10-23T17:03:47.6776103Z 672 │ .filter(Boolean) 2026-10-23T17:03:47.6776171Z 673 │ .join(" · "); 2026-10-23T17:03:47.6776314Z 674 │ const headerTitleText = selectedSection?.title ?? "Review changes"; 2026-10-23T17:03:47.6776379Z 675 │ 2026-10-23T17:03:47.6776441Z 676 │ return ( 2026-10-23T17:03:47.6776500Z 677 │ <> 2026-10-23T17:03:47.6776571Z 678 │ 2026-10-23T17:03:47.6777978Z 694 │ 2026-10-23T17:03:47.6778055Z 695 │ 2026-10-23T17:03:47.6778176Z 696 │ 2026-10-23T17:03:47.6778265Z 697 │ {showConnectionNotice ? ( 2026-10-23T17:03:47.6778502Z 698 │ 2026-10-23T17:03:47.6778689Z 699 │ 2026-10-23T17:03:47.6779839Z 711 │ 2026-10-23T17:03:47.6780003Z 712 │ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? ( 2026-10-23T17:03:47.6780078Z 713 │ 2026-10-23T17:03:47.6780567Z 719 │ 2026-10-23T17:03:47.6780952Z 723 │ {listHeader} 2026-10-23T17:03:47.6781086Z 724 │ 2026-10-23T17:03:47.6781179Z 725 │ { 2026-10-23T17:03:47.6785873Z ·  ────┬──── 2026-10-23T17:03:47.6786015Z · ╰── This is the containing effect 2026-10-23T17:03:47.6786124Z 102 │ if (!target || selectedLines.length === 0) { 2026-10-23T17:03:47.6786217Z 103 │ setHighlightedLinesById({}); 2026-10-23T17:03:47.6786316Z ·  ───────────┬─────────── 2026-10-23T17:03:47.6786500Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6786562Z 104 │ return; 2026-10-23T17:03:47.6786626Z ╰──── 2026-10-23T17:03:47.6787231Z  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-23T17:03:47.6787644Z  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-23T17:03:47.6787697Z 2026-10-23T17:03:47.6787970Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T17:03:47.6788141Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:643:5] 2026-10-23T17:03:47.6788199Z 638 │ 2026-10-23T17:03:47.6788269Z 639 │ useEffect(() => { 2026-10-23T17:03:47.6788353Z ·  ────┬──── 2026-10-23T17:03:47.6788483Z · ╰── This is the containing effect 2026-10-23T17:03:47.6788599Z 640 │ if (pendingLaunchEntry.key === launchTargetKey) { 2026-10-23T17:03:47.6788665Z 641 │ return; 2026-10-23T17:03:47.6788728Z 642 │ } 2026-10-23T17:03:47.6788810Z 643 │ setPendingLaunchEntry({ 2026-10-23T17:03:47.6788909Z ·  ──────────┬────────── 2026-10-23T17:03:47.6789084Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6789163Z 644 │ key: launchTargetKey, 2026-10-23T17:03:47.6789222Z ╰──── 2026-10-23T17:03:47.6789886Z  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-23T17:03:47.6790232Z  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-23T17:03:47.6790235Z 2026-10-23T17:03:47.6790511Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T17:03:47.6790695Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5] 2026-10-23T17:03:47.6790753Z 648 │ 2026-10-23T17:03:47.6790843Z 649 │ useEffect(() => { 2026-10-23T17:03:47.6790930Z ·  ────┬──── 2026-10-23T17:03:47.6791056Z · ╰── This is the containing effect 2026-10-23T17:03:47.6791189Z 650 │ if (initialAttachGridEntry.key === launchTargetKey) { 2026-10-23T17:03:47.6791272Z 651 │ return; 2026-10-23T17:03:47.6791356Z 652 │ } 2026-10-23T17:03:47.6791441Z 653 │ setInitialAttachGridEntry({ 2026-10-23T17:03:47.6791553Z ·  ────────────┬──────────── 2026-10-23T17:03:47.6791752Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6791846Z 654 │ key: launchTargetKey, 2026-10-23T17:03:47.6791908Z ╰──── 2026-10-23T17:03:47.6792532Z  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-23T17:03:47.6792877Z  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-23T17:03:47.6792884Z 2026-10-23T17:03:47.6793257Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T17:03:47.6793538Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7] 2026-10-23T17:03:47.6793595Z 743 │ 2026-10-23T17:03:47.6793684Z 744 │ useEffect(() => { 2026-10-23T17:03:47.6793779Z ·  ────┬──── 2026-10-23T17:03:47.6793934Z · ╰── This is the containing effect 2026-10-23T17:03:47.6794045Z 745 │ if (!routeEnvironmentId || !routeThreadId) { 2026-10-23T17:03:47.6794144Z 746 │ setLastGridSize({ 2026-10-23T17:03:47.6794260Z ·  ───────┬─────── 2026-10-23T17:03:47.6794456Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6794547Z 747 │ cols: DEFAULT_TERMINAL_COLS, 2026-10-23T17:03:47.6794630Z ╰──── 2026-10-23T17:03:47.6795245Z  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-23T17:03:47.6795574Z  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-23T17:03:47.6795576Z 2026-10-23T17:03:47.6795784Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T17:03:47.6795956Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24] 2026-10-23T17:03:47.6796027Z 537 │ }); 2026-10-23T17:03:47.6796170Z 538 │ }, [terminal.buffer, terminal.buffer.length, terminalKey]); 2026-10-23T17:03:47.6796300Z ·  ───────────┬────────── 2026-10-23T17:03:47.6796555Z · ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead 2026-10-23T17:03:47.6796736Z 539 │ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null; 2026-10-23T17:03:47.6796810Z ╰──── 2026-10-23T17:03:47.6797127Z  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-23T17:03:47.6797447Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6797450Z 2026-10-23T17:03:47.6797656Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T17:03:47.6797833Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7] 2026-10-23T17:03:47.6797946Z 708 │ sentInitialInputKeyRef.current = null; 2026-10-23T17:03:47.6798021Z 709 │ }, [terminalKey]); 2026-10-23T17:03:47.6798104Z ·  ─────┬───── 2026-10-23T17:03:47.6798263Z · ╰── Unnecessary dependency `terminalKey` 2026-10-23T17:03:47.6798334Z 710 │ 2026-10-23T17:03:47.6798401Z ╰──── 2026-10-23T17:03:47.6798852Z  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-23T17:03:47.6799354Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6799433Z 2026-10-23T17:03:47.6799648Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T17:03:47.6799865Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52] 2026-10-23T17:03:47.6799928Z 799 │ }; 2026-10-23T17:03:47.6800109Z 800 │ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]); 2026-10-23T17:03:47.6800306Z ·  ────────────┬──────────── ─────┬───── 2026-10-23T17:03:47.6800555Z · │ ╰── Unnecessary dependency `terminalKey` 2026-10-23T17:03:47.6800790Z · ╰── Unnecessary dependency `terminal.lifecycleVersion` 2026-10-23T17:03:47.6800853Z 801 │ 2026-10-23T17:03:47.6800930Z ╰──── 2026-10-23T17:03:47.6801230Z  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-23T17:03:47.6801557Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6801560Z 2026-10-23T17:03:47.6801716Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.6801889Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24] 2026-10-23T17:03:47.6801963Z 792 │ } 2026-10-23T17:03:47.6802089Z 793 │ const pasteSession = pasteSessionRef.current; 2026-10-23T17:03:47.6802223Z ·  ───────────┬─────────── 2026-10-23T17:03:47.6802397Z · ╰── Cannot access ref value during render 2026-10-23T17:03:47.6802474Z 794 │ 2026-10-23T17:03:47.6802563Z ╰──── 2026-10-23T17:03:47.6803050Z  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-23T17:03:47.6803353Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.6803355Z 2026-10-23T17:03:47.6803647Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T17:03:47.6803831Z ╭─[apps/mobile/src/features/terminal/terminalLaunchContext.ts:117:5] 2026-10-23T17:03:47.6804026Z 112 │ const [entry, setEntry] = useState(() => ({ key: input.targetKey, location: candidate })); 2026-10-23T17:03:47.6804113Z 113 │ useEffect(() => { 2026-10-23T17:03:47.6804200Z ·  ────┬──── 2026-10-23T17:03:47.6804398Z · ╰── This is the containing effect 2026-10-23T17:03:47.6804588Z 114 │ if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) { 2026-10-23T17:03:47.6804665Z 115 │ return; 2026-10-23T17:03:47.6804735Z 116 │ } 2026-10-23T17:03:47.6804881Z 117 │ setEntry({ key: input.targetKey, location: candidate }); 2026-10-23T17:03:47.6805091Z ·  ────┬─── 2026-10-23T17:03:47.6805331Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6805515Z 118 │ }, [candidate, entry.key, entry.location, input.targetKey]); 2026-10-23T17:03:47.6805597Z ╰──── 2026-10-23T17:03:47.6806213Z  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-23T17:03:47.6806553Z  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-23T17:03:47.6806556Z 2026-10-23T17:03:47.6806764Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T17:03:47.6806947Z ╭─[apps/mobile/src/features/terminal/TerminalContextSheet.tsx:72:15] 2026-10-23T17:03:47.6807030Z 71 │ { 2026-10-23T17:03:47.6808904Z 201 │ terminalDebugLog("native:surface", { 2026-10-23T17:03:47.6809005Z 202 │ terminalKey: props.terminalKey, 2026-10-23T17:03:47.6809092Z 203 │ native: hasNativeSurface, 2026-10-23T17:03:47.6809230Z 204 │ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(), 2026-10-23T17:03:47.6809410Z 205 │ bufferLen: props.buffer.length, 2026-10-23T17:03:47.6809558Z 206 │ isRunning: props.isRunning, 2026-10-23T17:03:47.6809621Z 207 │ }); 2026-10-23T17:03:47.6810110Z 208 │ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]); 2026-10-23T17:03:47.6810208Z 209 │ const handleNativeInput = useCallback( 2026-10-23T17:03:47.6810339Z 210 │ (event: NativeSyntheticEvent) => { 2026-10-23T17:03:47.6810447Z 211 │ if (!props.isRunning || props.readOnly) { 2026-10-23T17:03:47.6810522Z 212 │ return; 2026-10-23T17:03:47.6810581Z 213 │ } 2026-10-23T17:03:47.6810682Z 214 │ terminalDebugLog("native:onInput", { 2026-10-23T17:03:47.6810843Z 215 │ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)), 2026-10-23T17:03:47.6810906Z 216 │ }); 2026-10-23T17:03:47.6811015Z 217 │ onInput(event.nativeEvent.data); 2026-10-23T17:03:47.6811083Z 218 │ }, 2026-10-23T17:03:47.6811191Z 219 │ [onInput, props.isRunning, props.readOnly], 2026-10-23T17:03:47.6811250Z 220 │ ); 2026-10-23T17:03:47.6811358Z 221 │ const handleNativeResize = useCallback( 2026-10-23T17:03:47.6811489Z 222 │ (event: NativeSyntheticEvent) => { 2026-10-23T17:03:47.6811562Z 223 │ onResize({ 2026-10-23T17:03:47.6811647Z 224 │ cols: event.nativeEvent.cols, 2026-10-23T17:03:47.6811739Z 225 │ rows: event.nativeEvent.rows, 2026-10-23T17:03:47.6811805Z 226 │ }); 2026-10-23T17:03:47.6811873Z 227 │ }, 2026-10-23T17:03:47.6811941Z 228 │ [onResize], 2026-10-23T17:03:47.6812007Z 229 │ ); 2026-10-23T17:03:47.6812068Z 230 │ 2026-10-23T17:03:47.6812155Z 231 │ if (NativeTerminalSurfaceView) { 2026-10-23T17:03:47.6812233Z 232 │ return ( 2026-10-23T17:03:47.6812335Z 233 │ 2026-10-23T17:03:47.6812424Z 234 │ 2026-10-23T17:03:47.6815404Z ·  ──────┬───── 2026-10-23T17:03:47.6815561Z · ╰── 'stopSessions' is declared here 2026-10-23T17:03:47.6815637Z 286 │ effect.pipe( 2026-10-23T17:03:47.6815701Z ╰──── 2026-10-23T17:03:47.6815818Z  help: Consider removing this parameter. 2026-10-23T17:03:47.6815820Z 2026-10-23T17:03:47.6816017Z ⚠ eslint(no-unused-vars): Type 'Scope' is imported but never used. 2026-10-23T17:03:47.6816156Z ╭─[apps/server/src/provider/ProviderAuthService.ts:15:18] 2026-10-23T17:03:47.6816252Z 14 │ import * as Layer from "effect/Layer"; 2026-10-23T17:03:47.6816365Z 15 │ import type * as Scope from "effect/Scope"; 2026-10-23T17:03:47.6816454Z ·  ──┬── 2026-10-23T17:03:47.6816590Z · ╰── 'Scope' is imported here 2026-10-23T17:03:47.6816690Z 16 │ import * as Stream from "effect/Stream"; 2026-10-23T17:03:47.6816748Z ╰──── 2026-10-23T17:03:47.6816853Z  help: Consider removing this import. 2026-10-23T17:03:47.6816856Z 2026-10-23T17:03:47.6817118Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T17:03:47.6817305Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:123:7] 2026-10-23T17:03:47.6817369Z 118 │ 2026-10-23T17:03:47.6817442Z 119 │ useEffect(() => { 2026-10-23T17:03:47.6817515Z ·  ────┬──── 2026-10-23T17:03:47.6817659Z · ╰── This is the containing effect 2026-10-23T17:03:47.6817752Z 120 │ if (orientationSettled) return; 2026-10-23T17:03:47.6817880Z 121 │ const orientation = getNativeShowcaseOrientation(); 2026-10-23T17:03:47.6817959Z 122 │ if (orientation === null) { 2026-10-23T17:03:47.6818053Z 123 │ setOrientationSettled(true); 2026-10-23T17:03:47.6818156Z ·  ──────────┬────────── 2026-10-23T17:03:47.6818340Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6818402Z 124 │ return; 2026-10-23T17:03:47.6818465Z ╰──── 2026-10-23T17:03:47.6819082Z  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-23T17:03:47.6819425Z  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-23T17:03:47.6819427Z 2026-10-23T17:03:47.6819753Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T17:03:47.6819926Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:304:7] 2026-10-23T17:03:47.6819985Z 292 │ 2026-10-23T17:03:47.6820058Z 293 │ useEffect(() => { 2026-10-23T17:03:47.6820138Z ·  ────┬──── 2026-10-23T17:03:47.6820267Z · ╰── This is the containing effect 2026-10-23T17:03:47.6820412Z 294 │ if ( 2026-10-23T17:03:47.6820749Z 295 │ scene === null || 2026-10-23T17:03:47.6820835Z 296 │ requestedScene === null || 2026-10-23T17:03:47.6820913Z 297 │ scene !== requestedScene || 2026-10-23T17:03:47.6820991Z 298 │ !hasFixture || 2026-10-23T17:03:47.6821079Z 299 │ !orientationSettled || 2026-10-23T17:03:47.6821159Z 300 │ !themeApplied || 2026-10-23T17:03:47.6821287Z 301 │ (scene === "agent-activity" && !agentActivityStaged) || 2026-10-23T17:03:47.6821428Z 302 │ !isShowcaseNativeContentReady({ scene, themeId, renderSignal }) 2026-10-23T17:03:47.6827735Z 303 │ ) { 2026-10-23T17:03:47.6827847Z 304 │ setReadyScene(null); 2026-10-23T17:03:47.6827945Z ·  ──────┬────── 2026-10-23T17:03:47.6828146Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6828224Z 305 │ return; 2026-10-23T17:03:47.6828276Z ╰──── 2026-10-23T17:03:47.6828891Z  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-23T17:03:47.6829221Z  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-23T17:03:47.6829224Z 2026-10-23T17:03:47.6829508Z ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'. 2026-10-23T17:03:47.6829752Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:128:9] 2026-10-23T17:03:47.6829831Z 127 │ let cancelled = false; 2026-10-23T17:03:47.6829936Z 128 │ let lastOutcome: string | null = null; 2026-10-23T17:03:47.6830028Z ·  ─────┬───── 2026-10-23T17:03:47.6830174Z · ╰── 'lastOutcome' is declared here 2026-10-23T17:03:47.6830353Z 129 │ void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), { 2026-10-23T17:03:47.6830412Z ╰──── 2026-10-23T17:03:47.6830532Z  help: Consider removing this declaration. 2026-10-23T17:03:47.6830535Z 2026-10-23T17:03:47.6830802Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T17:03:47.6830999Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:119:10] 2026-10-23T17:03:47.6831056Z 117 │ 2026-10-23T17:03:47.6831134Z 118 │ useEffect(() => { 2026-10-23T17:03:47.6831213Z ·  ────┬──── 2026-10-23T17:03:47.6831353Z · ╰── This is the containing effect 2026-10-23T17:03:47.6831440Z 119 │ void refreshNotifications(); 2026-10-23T17:03:47.6831543Z ·  ──────────┬───────── 2026-10-23T17:03:47.6831737Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6831891Z 120 │ const subscription = AppState.addEventListener("change", (state) => { 2026-10-23T17:03:47.6831947Z ╰──── 2026-10-23T17:03:47.6832705Z  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-23T17:03:47.6833089Z  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-23T17:03:47.6833092Z 2026-10-23T17:03:47.6833357Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T17:03:47.6833550Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7] 2026-10-23T17:03:47.6833603Z 125 │ 2026-10-23T17:03:47.6833681Z 126 │ useEffect(() => { 2026-10-23T17:03:47.6833763Z ·  ────┬──── 2026-10-23T17:03:47.6833908Z · ╰── This is the containing effect 2026-10-23T17:03:47.6833983Z 127 │ if (!isLoaded) { 2026-10-23T17:03:47.6834085Z 128 │ setLiveActivityStatus("checking"); 2026-10-23T17:03:47.6834193Z ·  ──────────┬────────── 2026-10-23T17:03:47.6834381Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6834450Z 129 │ return; 2026-10-23T17:03:47.6834512Z ╰──── 2026-10-23T17:03:47.6835120Z  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-23T17:03:47.6835450Z  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-23T17:03:47.6835455Z 2026-10-23T17:03:47.6835941Z ⚠ 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-23T17:03:47.6836086Z ╭─[packages/client-runtime/src/rpc/client.test.ts:131:9] 2026-10-23T17:03:47.6836155Z 130 │ ) { 2026-10-23T17:03:47.6836393Z 131 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T17:03:47.6836535Z 132 │ │ if (subscriptions.length >= count) { 2026-10-23T17:03:47.6836627Z 133 │ │ return; 2026-10-23T17:03:47.6836736Z 134 │ │ } 2026-10-23T17:03:47.6836857Z 135 │ │ yield* Effect.yieldNow; 2026-10-23T17:03:47.6837002Z 136 │ ╰─▶ } 2026-10-23T17:03:47.6837181Z 137 │ return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`)); 2026-10-23T17:03:47.6837248Z ╰──── 2026-10-23T17:03:47.6837251Z 2026-10-23T17:03:47.6837724Z ⚠ 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-23T17:03:47.6837867Z ╭─[packages/client-runtime/src/rpc/client.test.ts:252:7] 2026-10-23T17:03:47.6838150Z 251 │ yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient))); 2026-10-23T17:03:47.6838470Z 252 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) { 2026-10-23T17:03:47.6838793Z 253 │ │ yield* Effect.yieldNow; 2026-10-23T17:03:47.6838935Z 254 │ ╰─▶ } 2026-10-23T17:03:47.6839067Z 255 │ yield* SubscriptionRef.set(activeSession, Option.none()); 2026-10-23T17:03:47.6839121Z ╰──── 2026-10-23T17:03:47.6839124Z 2026-10-23T17:03:47.6839591Z ⚠ 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-23T17:03:47.6839772Z ╭─[packages/client-runtime/src/rpc/client.test.ts:258:7] 2026-10-23T17:03:47.6839852Z 257 │ 2026-10-23T17:03:47.6840100Z 258 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-23T17:03:47.6840217Z 259 │ │ yield* Effect.yieldNow; 2026-10-23T17:03:47.6840355Z 260 │ ╰─▶ } 2026-10-23T17:03:47.6840473Z 261 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-23T17:03:47.6840530Z ╰──── 2026-10-23T17:03:47.6840535Z 2026-10-23T17:03:47.6840990Z ⚠ 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-23T17:03:47.6841128Z ╭─[packages/client-runtime/src/rpc/client.test.ts:322:7] 2026-10-23T17:03:47.6841201Z 321 │ ); 2026-10-23T17:03:47.6841472Z 322 │ ╭─▶ for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) { 2026-10-23T17:03:47.6841576Z 323 │ │ yield* Effect.yieldNow; 2026-10-23T17:03:47.6841716Z 324 │ ╰─▶ } 2026-10-23T17:03:47.6841786Z 325 │ 2026-10-23T17:03:47.6841852Z ╰──── 2026-10-23T17:03:47.6841855Z 2026-10-23T17:03:47.6842314Z ⚠ 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-23T17:03:47.6842647Z ╭─[packages/client-runtime/src/rpc/client.test.ts:330:7] 2026-10-23T17:03:47.6842893Z 329 │ yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient))); 2026-10-23T17:03:47.6843151Z 330 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-23T17:03:47.6843271Z 331 │ │ yield* Effect.yieldNow; 2026-10-23T17:03:47.6843404Z 332 │ ╰─▶ } 2026-10-23T17:03:47.6843525Z 333 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-23T17:03:47.6843591Z ╰──── 2026-10-23T17:03:47.6843594Z 2026-10-23T17:03:47.6844062Z ⚠ 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-23T17:03:47.6844210Z ╭─[packages/client-runtime/src/rpc/session.test.ts:226:3] 2026-10-23T17:03:47.6844277Z 225 │ ) { 2026-10-23T17:03:47.6844494Z 226 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T17:03:47.6844617Z 227 │ │ const socket = sockets[index]; 2026-10-23T17:03:47.6844717Z 228 │ │ if (socket) { 2026-10-23T17:03:47.6844814Z 229 │ │ return socket; 2026-10-23T17:03:47.6844894Z 230 │ │ } 2026-10-23T17:03:47.6845008Z 231 │ │ yield* Effect.yieldNow; 2026-10-23T17:03:47.6845139Z 232 │ ╰─▶ } 2026-10-23T17:03:47.6845331Z 233 │ return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket.")); 2026-10-23T17:03:47.6845403Z ╰──── 2026-10-23T17:03:47.6845406Z 2026-10-23T17:03:47.6845869Z ⚠ 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-23T17:03:47.6846010Z ╭─[packages/client-runtime/src/rpc/session.test.ts:240:3] 2026-10-23T17:03:47.6846069Z 239 │ ) { 2026-10-23T17:03:47.6846274Z 240 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T17:03:47.6846501Z 241 │ │ const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index]; 2026-10-23T17:03:47.6846602Z 242 │ │ if (request) { 2026-10-23T17:03:47.6846702Z 243 │ │ return request; 2026-10-23T17:03:47.6846792Z 244 │ │ } 2026-10-23T17:03:47.6846902Z 245 │ │ yield* Effect.yieldNow; 2026-10-23T17:03:47.6847052Z 246 │ ╰─▶ } 2026-10-23T17:03:47.6847221Z 247 │ return yield* Effect.die(new Error("Expected the RPC protocol to send a request.")); 2026-10-23T17:03:47.6847287Z ╰──── 2026-10-23T17:03:47.6847292Z 2026-10-23T17:03:47.6847530Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-23T17:03:47.6847681Z ╭─[packages/client-runtime/src/operations/projects.ts:228:51] 2026-10-23T17:03:47.6847758Z 227 │ ): string { 2026-10-23T17:03:47.6848008Z 228 │ const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? ""; 2026-10-23T17:03:47.6848166Z ·  ────── 2026-10-23T17:03:47.6848300Z 229 │ return target.owner ? `${target.owner}/${folderName}` : folderName; 2026-10-23T17:03:47.6848361Z ╰──── 2026-10-23T17:03:47.6848539Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-23T17:03:47.6848541Z 2026-10-23T17:03:47.6849008Z ⚠ 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-23T17:03:47.6849190Z ╭─[apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts:223:5] 2026-10-23T17:03:47.6849279Z 222 │ let idlePasses = 0; 2026-10-23T17:03:47.6849425Z 223 │ ╭─▶ for (;;) { 2026-10-23T17:03:47.6849567Z 224 │ │ yield* Effect.promise(() => Promise.resolve()); 2026-10-23T17:03:47.6849768Z 225 │ │ const pending = backgroundRuntime.pending.shift(); 2026-10-23T17:03:47.6849885Z 226 │ │ if (!pending) { 2026-10-23T17:03:47.6849984Z 227 │ │ idlePasses++; 2026-10-23T17:03:47.6850095Z 228 │ │ if (idlePasses >= 3) { 2026-10-23T17:03:47.6850188Z 229 │ │ return; 2026-10-23T17:03:47.6850273Z 230 │ │ } 2026-10-23T17:03:47.6850367Z 231 │ │ continue; 2026-10-23T17:03:47.6850463Z 232 │ │ } 2026-10-23T17:03:47.6850569Z 233 │ │ idlePasses = 0; 2026-10-23T17:03:47.6850696Z 234 │ │ const exit = yield* Effect.exit( 2026-10-23T17:03:47.6850908Z 235 │ │ pending.operation as Effect.Effect, 2026-10-23T17:03:47.6850992Z 236 │ │ ); 2026-10-23T17:03:47.6851118Z 237 │ │ yield* Effect.sync(() => { 2026-10-23T17:03:47.6851227Z 238 │ │ pending.resolve(exit); 2026-10-23T17:03:47.6851308Z 239 │ │ }); 2026-10-23T17:03:47.6851440Z 240 │ ╰─▶ } 2026-10-23T17:03:47.6851506Z 241 │ }, 2026-10-23T17:03:47.6851575Z ╰──── 2026-10-23T17:03:47.6851577Z 2026-10-23T17:03:47.6851843Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T17:03:47.6852029Z ╭─[apps/server/src/orchestration-v2/ThreadPullRequestService.ts:408:7] 2026-10-23T17:03:47.6852109Z 407 │ 2026-10-23T17:03:47.6852242Z 408 │ const layer = Layer.effect(ThreadPullRequestServiceV2, make); 2026-10-23T17:03:47.6852320Z ·  ──┬── 2026-10-23T17:03:47.6852458Z · ╰── 'layer' is declared here 2026-10-23T17:03:47.6852516Z ╰──── 2026-10-23T17:03:47.6852632Z  help: Consider removing this declaration. 2026-10-23T17:03:47.6852635Z 2026-10-23T17:03:47.6852840Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T17:03:47.6853091Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:215:7] 2026-10-23T17:03:47.6853195Z 214 │ } 2026-10-23T17:03:47.6853269Z 215 │ }, [wrappedRender]); 2026-10-23T17:03:47.6853350Z ·  ──────┬────── 2026-10-23T17:03:47.6853521Z · ╰── Unnecessary dependency `wrappedRender` 2026-10-23T17:03:47.6853584Z 216 │ 2026-10-23T17:03:47.6853653Z ╰──── 2026-10-23T17:03:47.6853957Z  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-23T17:03:47.6854280Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6854282Z 2026-10-23T17:03:47.6854539Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-23T17:03:47.6854707Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:817:35] 2026-10-23T17:03:47.6854779Z 816 │ > 2026-10-23T17:03:47.6854894Z 817 │ 2026-10-23T17:03:47.6855034Z ·  ──────────────────── 2026-10-23T17:03:47.6855141Z 818 │ 2026-10-23T17:03:47.6856218Z 832 │ 2026-10-23T17:03:47.6856351Z ·  ──────────────────── 2026-10-23T17:03:47.6856466Z 833 │ 2026-10-23T17:03:47.6856521Z ╰──── 2026-10-23T17:03:47.6856762Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-23T17:03:47.6856920Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-23T17:03:47.6856922Z 2026-10-23T17:03:47.6857203Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-23T17:03:47.6857334Z ╭─[apps/server/src/usage/UsageService.ts:169:7] 2026-10-23T17:03:47.6857392Z 168 │ 2026-10-23T17:03:47.6857486Z 169 │ const layerTest = Layer.succeed( 2026-10-23T17:03:47.6857573Z ·  ────┬──── 2026-10-23T17:03:47.6857712Z · ╰── 'layerTest' is declared here 2026-10-23T17:03:47.6857779Z 170 │ UsageService, 2026-10-23T17:03:47.6857837Z ╰──── 2026-10-23T17:03:47.6857952Z  help: Consider removing this declaration. 2026-10-23T17:03:47.6857955Z 2026-10-23T17:03:47.6858225Z ⚠ eslint(no-unused-vars): Variable 'layerDaemon' is declared but never used. Unused variables should start with a '_'. 2026-10-23T17:03:47.6858452Z ╭─[apps/server/src/orchestration-v2/EffectWorker.ts:914:7] 2026-10-23T17:03:47.6858607Z 913 │ 2026-10-23T17:03:47.6858806Z 914 │ const layerDaemon: Layer.Layer = Layer.effectDiscard( 2026-10-23T17:03:47.6858889Z ·  ─────┬───── 2026-10-23T17:03:47.6859028Z · ╰── 'layerDaemon' is declared here 2026-10-23T17:03:47.6859125Z 915 │ runDaemon.pipe(Effect.forkScoped), 2026-10-23T17:03:47.6859184Z ╰──── 2026-10-23T17:03:47.6859294Z  help: Consider removing this declaration. 2026-10-23T17:03:47.6859297Z 2026-10-23T17:03:47.6859802Z ⚠ 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-23T17:03:47.6859962Z ╭─[apps/server/src/usage/UsageService.test.ts:2383:7] 2026-10-23T17:03:47.6860080Z 2382 │ let orphanedAt: number | undefined; 2026-10-23T17:03:47.6860329Z 2383 │ ╭─▶ for (let interruptAt = 1; interruptAt <= 31; interruptAt += 1) { 2026-10-23T17:03:47.6860464Z 2384 │ │ const tasks: Array<() => void> = []; 2026-10-23T17:03:47.6860614Z 2385 │ │ const dispatcher: Scheduler.SchedulerDispatcher = { 2026-10-23T17:03:47.6860753Z 2386 │ │ scheduleTask: (task) => tasks.push(task), 2026-10-23T17:03:47.6860858Z 2387 │ │ flush: () => { 2026-10-23T17:03:47.6860989Z 2388 │ │ let task: (() => void) | undefined; 2026-10-23T17:03:47.6861145Z 2389 │ │ while ((task = tasks.shift()) !== undefined) task(); 2026-10-23T17:03:47.6861247Z 2390 │ │ }, 2026-10-23T17:03:47.6861338Z 2391 │ │ }; 2026-10-23T17:03:47.6861422Z 2392 │ │ 2026-10-23T17:03:47.6861587Z 2393 │ │ let requestFiber: Fiber.Fiber | undefined; 2026-10-23T17:03:47.6861705Z 2394 │ │ let requestChecks = 0; 2026-10-23T17:03:47.6861843Z 2395 │ │ const scheduler: Scheduler.Scheduler = { 2026-10-23T17:03:47.6861966Z 2396 │ │ executionMode: "async", 2026-10-23T17:03:47.6862088Z 2397 │ │ makeDispatcher: () => dispatcher, 2026-10-23T17:03:47.6862216Z 2398 │ │ shouldYield: (fiber) => { 2026-10-23T17:03:47.6862380Z 2399 │ │ if (fiber !== requestFiber) return false; 2026-10-23T17:03:47.6862504Z 2400 │ │ requestChecks += 1; 2026-10-23T17:03:47.6862650Z 2401 │ │ if (requestChecks !== interruptAt) return false; 2026-10-23T17:03:47.6862779Z 2402 │ │ fiber.interruptUnsafe(); 2026-10-23T17:03:47.6862886Z 2403 │ │ return true; 2026-10-23T17:03:47.6862976Z 2404 │ │ }, 2026-10-23T17:03:47.6863059Z 2405 │ │ }; 2026-10-23T17:03:47.6863144Z 2406 │ │ 2026-10-23T17:03:47.6863281Z 2407 │ │ const input: UsageSummaryInput = { 2026-10-23T17:03:47.6863385Z 2408 │ │ ...WINDOW, 2026-10-23T17:03:47.6863601Z 2409 │ │ sinceDay: UsageDay.make("2026-09-01"), 2026-10-23T17:03:47.6863869Z 2410 │ │ untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`), 2026-10-23T17:03:47.6863968Z 2411 │ │ }; 2026-10-23T17:03:47.6864096Z 2412 │ │ const first = yield* service 2026-10-23T17:03:47.6864203Z 2413 │ │ .readSummary(input) 2026-10-23T17:03:47.6864300Z 2414 │ │ .pipe( 2026-10-23T17:03:47.6864406Z 2415 │ │ Effect.exit, 2026-10-23T17:03:47.6864573Z 2416 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-23T17:03:47.6864681Z 2417 │ │ Effect.forkChild, 2026-10-23T17:03:47.6864778Z 2418 │ │ ); 2026-10-23T17:03:47.6864894Z 2419 │ │ requestFiber = first; 2026-10-23T17:03:47.6865008Z 2420 │ │ yield* Effect.yieldNow; 2026-10-23T17:03:47.6865110Z 2421 │ │ dispatcher.flush(); 2026-10-23T17:03:47.6865201Z 2422 │ │ 2026-10-23T17:03:47.6865359Z 2423 │ │ const second = yield* service.readSummary(input).pipe( 2026-10-23T17:03:47.6865475Z 2424 │ │ Effect.match({ 2026-10-23T17:03:47.6865603Z 2425 │ │ onFailure: (error) => error.reason, 2026-10-23T17:03:47.6865738Z 2426 │ │ onSuccess: () => "success" as const, 2026-10-23T17:03:47.6865831Z 2427 │ │ }), 2026-10-23T17:03:47.6866001Z 2428 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-23T17:03:47.6866109Z 2429 │ │ Effect.forkChild, 2026-10-23T17:03:47.6866198Z 2430 │ │ ); 2026-10-23T17:03:47.6866313Z 2431 │ │ yield* Effect.yieldNow; 2026-10-23T17:03:47.6866424Z 2432 │ │ dispatcher.flush(); 2026-10-23T17:03:47.6866553Z 2433 │ │ const secondExit = second.pollUnsafe(); 2026-10-23T17:03:47.6866673Z 2434 │ │ if (secondExit === undefined) { 2026-10-23T17:03:47.6866799Z 2435 │ │ second.interruptUnsafe(); 2026-10-23T17:03:47.6866919Z 2436 │ │ orphanedAt = interruptAt; 2026-10-23T17:03:47.6867016Z 2437 │ │ break; 2026-10-23T17:03:47.6867106Z 2438 │ │ } 2026-10-23T17:03:47.6867231Z 2439 │ │ if (Exit.isFailure(secondExit)) { 2026-10-23T17:03:47.6867400Z 2440 │ │ assert.fail("the matching request fiber was interrupted"); 2026-10-23T17:03:47.6867492Z 2441 │ │ } 2026-10-23T17:03:47.6867647Z 2442 │ │ assert.strictEqual(secondExit.value, "invalidWindow"); 2026-10-23T17:03:47.6867793Z 2443 │ ╰─▶ } 2026-10-23T17:03:47.6867864Z 2444 │ 2026-10-23T17:03:47.6867927Z ╰──── 2026-10-23T17:03:47.6867931Z 2026-10-23T17:03:47.6868523Z ⚠ 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-23T17:03:47.6868727Z ╭─[apps/server/src/serverSettings.test.ts:1741:32] 2026-10-23T17:03:47.6868905Z 1740 │ const model = createModelSelection(ProviderInstanceId.make("codex"), "gpt-5.5"); 2026-10-23T17:03:47.6869100Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-23T17:03:47.6869217Z ·  ─────────────────── 2026-10-23T17:03:47.6869346Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-23T17:03:47.6869412Z ╰──── 2026-10-23T17:03:47.6869416Z 2026-10-23T17:03:47.6869903Z ⚠ 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-23T17:03:47.6870046Z ╭─[apps/server/src/serverSettings.test.ts:1742:34] 2026-10-23T17:03:47.6870234Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-23T17:03:47.6870360Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-23T17:03:47.6870485Z ·  ─────────────────── 2026-10-23T17:03:47.6870613Z 1743 │ Schema.fromJsonString(Schema.Array(ProjectScript)), 2026-10-23T17:03:47.6870668Z ╰──── 2026-10-23T17:03:47.6870672Z 2026-10-23T17:03:47.6870908Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-23T17:03:47.6871046Z ╭─[scripts/lib/cli-external-packages.test.ts:114:11] 2026-10-23T17:03:47.6871128Z 113 │ const declared = { 2026-10-23T17:03:47.6871237Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-23T17:03:47.6871368Z ·  ──────────────────────────────── 2026-10-23T17:03:47.6871492Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-23T17:03:47.6871558Z ╰──── 2026-10-23T17:03:47.6871836Z  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-23T17:03:47.6871838Z 2026-10-23T17:03:47.6872071Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-23T17:03:47.6872223Z ╭─[scripts/lib/cli-external-packages.test.ts:115:11] 2026-10-23T17:03:47.6872321Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-23T17:03:47.6872428Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-23T17:03:47.6872648Z ·  ──────────────────────────────────────── 2026-10-23T17:03:47.6872829Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-23T17:03:47.6872899Z ╰──── 2026-10-23T17:03:47.6873165Z  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-23T17:03:47.6873175Z 2026-10-23T17:03:47.6873398Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-23T17:03:47.6873545Z ╭─[scripts/lib/cli-external-packages.test.ts:116:11] 2026-10-23T17:03:47.6873655Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-23T17:03:47.6873769Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-23T17:03:47.6873894Z ·  ──────────────────────────────────── 2026-10-23T17:03:47.6873976Z 117 │ }; 2026-10-23T17:03:47.6874050Z ╰──── 2026-10-23T17:03:47.6874326Z  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-23T17:03:47.6874329Z 2026-10-23T17:03:47.6874630Z ⚠ eslint(no-unused-vars): Variable 'layerFromProviderAdapter' is declared but never used. Unused variables should start with a '_'. 2026-10-23T17:03:47.6874807Z ╭─[apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts:346:7] 2026-10-23T17:03:47.6874873Z 345 │ 2026-10-23T17:03:47.6875005Z 346 │ const layerFromProviderAdapter: Layer.Layer< 2026-10-23T17:03:47.6875118Z ·  ────────────┬─────────── 2026-10-23T17:03:47.6875308Z · ╰── 'layerFromProviderAdapter' is declared here 2026-10-23T17:03:47.6875409Z 347 │ ProviderAdapterRegistryV2, 2026-10-23T17:03:47.6875487Z ╰──── 2026-10-23T17:03:47.6875593Z  help: Consider removing this declaration. 2026-10-23T17:03:47.6875596Z 2026-10-23T17:03:47.6876092Z ⚠ 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-23T17:03:47.6876263Z ╭─[apps/server/src/project/ProjectEnrichmentService.test.ts:28:3] 2026-10-23T17:03:47.6876336Z 27 │ ) { 2026-10-23T17:03:47.6876567Z 28 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T17:03:47.6876723Z 29 │ │ const available = yield* service.peek(workspaceRoot); 2026-10-23T17:03:47.6876873Z 30 │ │ if (predicate(available)) return available; 2026-10-23T17:03:47.6876987Z 31 │ │ yield* Effect.yieldNow; 2026-10-23T17:03:47.6877125Z 32 │ ╰─▶ } 2026-10-23T17:03:47.6877311Z 33 │ return yield* Effect.die(`Project metadata for ${workspaceRoot} was not resolved in time.`); 2026-10-23T17:03:47.6877393Z ╰──── 2026-10-23T17:03:47.6877398Z 2026-10-23T17:03:47.6877865Z ⚠ 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-23T17:03:47.6878017Z ╭─[packages/contracts/src/composerContext.test.ts:181:18] 2026-10-23T17:03:47.6878323Z 180 │ it("sends a message without the records the wire cannot carry", () => { 2026-10-23T17:03:47.6879320Z 181 │ const wire = Schema.encodeUnknownSync(Schema.toCodecJson(OrchestrationMessageContext))({ 2026-10-23T17:03:47.6879437Z ·  ──────────────────────── 2026-10-23T17:03:47.6879513Z 182 │ version: 1, 2026-10-23T17:03:47.6879567Z ╰──── 2026-10-23T17:03:47.6879576Z 2026-10-23T17:03:47.6880089Z ⚠ 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-23T17:03:47.6880232Z ╭─[apps/server/src/project/ProjectService.test.ts:94:3] 2026-10-23T17:03:47.6880299Z 93 │ ) { 2026-10-23T17:03:47.6880511Z 94 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T17:03:47.6880696Z 95 │ │ const project = Option.getOrThrow(yield* service.getById(projectId)); 2026-10-23T17:03:47.6880834Z 96 │ │ if (predicate(project)) return project; 2026-10-23T17:03:47.6880951Z 97 │ │ yield* Effect.yieldNow; 2026-10-23T17:03:47.6881090Z 98 │ ╰─▶ } 2026-10-23T17:03:47.6881244Z 99 │ return yield* Effect.die(`Project ${projectId} was not enriched in time.`); 2026-10-23T17:03:47.6881309Z ╰──── 2026-10-23T17:03:47.6881311Z 2026-10-23T17:03:47.6881776Z ⚠ 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-23T17:03:47.6881952Z ╭─[packages/client-runtime/src/connection/supervisor.test.ts:135:3] 2026-10-23T17:03:47.6882073Z 134 │ let lastState = yield* SubscriptionRef.get(state); 2026-10-23T17:03:47.6882291Z 135 │ ╭─▶ for (let iteration = 0; iteration < 100; iteration += 1) { 2026-10-23T17:03:47.6882442Z 136 │ │ lastState = yield* SubscriptionRef.get(state); 2026-10-23T17:03:47.6882577Z 137 │ │ if (predicate(lastState)) { 2026-10-23T17:03:47.6882701Z 138 │ │ return lastState; 2026-10-23T17:03:47.6882781Z 139 │ │ } 2026-10-23T17:03:47.6882899Z 140 │ │ yield* Effect.yieldNow; 2026-10-23T17:03:47.6883042Z 141 │ ╰─▶ } 2026-10-23T17:03:47.6883135Z 142 │ return yield* Effect.die( 2026-10-23T17:03:47.6883193Z ╰──── 2026-10-23T17:03:47.6883196Z 2026-10-23T17:03:47.6883472Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T17:03:47.6883613Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:60:5] 2026-10-23T17:03:47.6883679Z 57 │ 2026-10-23T17:03:47.6883748Z 58 │ useEffect(() => { 2026-10-23T17:03:47.6883836Z ·  ────┬──── 2026-10-23T17:03:47.6883978Z · ╰── This is the containing effect 2026-10-23T17:03:47.6884095Z 59 │ const controller = new AbortController(); 2026-10-23T17:03:47.6884178Z 60 │ setLoadState("pending"); 2026-10-23T17:03:47.6884266Z ·  ──────┬───── 2026-10-23T17:03:47.6884581Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6884824Z 61 │ // A renewed signature is used on Retry, not as a reason to reset the native player. 2026-10-23T17:03:47.6884874Z ╰──── 2026-10-23T17:03:47.6885508Z  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-23T17:03:47.6885844Z  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-23T17:03:47.6885847Z 2026-10-23T17:03:47.6886059Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T17:03:47.6886206Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:71:7] 2026-10-23T17:03:47.6886297Z 70 │ return () => controller.abort(); 2026-10-23T17:03:47.6886408Z 71 │ }, [player, props.playRequested, attempt]); 2026-10-23T17:03:47.6886603Z ·  ───┬── ─────────┬───────── ───┬─── 2026-10-23T17:03:47.6886846Z · │ │ ╰── Unnecessary dependency `attempt` 2026-10-23T17:03:47.6887052Z · │ ╰── Unnecessary dependency `props.playRequested` 2026-10-23T17:03:47.6887204Z · ╰── Unnecessary dependency `player_0` 2026-10-23T17:03:47.6887276Z 72 │ 2026-10-23T17:03:47.6887362Z ╰──── 2026-10-23T17:03:47.6887668Z  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-23T17:03:47.6887991Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6887993Z 2026-10-23T17:03:47.6888254Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T17:03:47.6888391Z ╭─[apps/mobile/src/components/ProjectFavicon.tsx:158:5] 2026-10-23T17:03:47.6888586Z 153 │ const [activeFaviconRequest, setActiveFaviconRequest] = useState(null); 2026-10-23T17:03:47.6888657Z 154 │ useLayoutEffect(() => { 2026-10-23T17:03:47.6888741Z ·  ───────┬─────── 2026-10-23T17:03:47.6888881Z · ╰── This is the containing effect 2026-10-23T17:03:47.6888975Z 155 │ if (faviconRequest === null) return; 2026-10-23T17:03:47.6889028Z 156 │ 2026-10-23T17:03:47.6889165Z 157 │ const endRequest = beginProjectFaviconRequest(faviconRequest); 2026-10-23T17:03:47.6889265Z 158 │ setActiveFaviconRequest(faviconRequest); 2026-10-23T17:03:47.6889360Z ·  ───────────┬─────────── 2026-10-23T17:03:47.6889533Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6889607Z 159 │ return endRequest; 2026-10-23T17:03:47.6889708Z ╰──── 2026-10-23T17:03:47.6890393Z  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-23T17:03:47.6890759Z  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-23T17:03:47.6890761Z 2026-10-23T17:03:47.6891019Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T17:03:47.6891158Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:68:5] 2026-10-23T17:03:47.6891277Z 66 │ const { id: attachmentId, fileUri } = attachment; 2026-10-23T17:03:47.6891352Z 67 │ useEffect(() => { 2026-10-23T17:03:47.6891425Z ·  ────┬──── 2026-10-23T17:03:47.6891563Z · ╰── This is the containing effect 2026-10-23T17:03:47.6891638Z 68 │ setUri(null); 2026-10-23T17:03:47.6891712Z ·  ───┬── 2026-10-23T17:03:47.6891874Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6891943Z 69 │ setError(null); 2026-10-23T17:03:47.6892001Z ╰──── 2026-10-23T17:03:47.6892594Z  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-23T17:03:47.6892915Z  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-23T17:03:47.6892922Z 2026-10-23T17:03:47.6893127Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T17:03:47.6893273Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:91:7] 2026-10-23T17:03:47.6893337Z 90 │ }; 2026-10-23T17:03:47.6893420Z 91 │ }, [attachmentId, fileUri]); 2026-10-23T17:03:47.6893539Z ·  ──────┬───── ───┬─── 2026-10-23T17:03:47.6893724Z · │ ╰── Unnecessary dependency `fileUri` 2026-10-23T17:03:47.6893873Z · ╰── Unnecessary dependency `attachmentId` 2026-10-23T17:03:47.6894017Z 92 │ const mimeType = videoMimeType(attachment) ?? attachment.mimeType; 2026-10-23T17:03:47.6894067Z ╰──── 2026-10-23T17:03:47.6894445Z  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-23T17:03:47.6894814Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6894817Z 2026-10-23T17:03:47.6895037Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T17:03:47.6895187Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:213:34] 2026-10-23T17:03:47.6895255Z 212 │ useEffect(() => { 2026-10-23T17:03:47.6895371Z 213 │ if (!isFocused && hasSource) props.onRequestClose(); 2026-10-23T17:03:47.6895475Z ·  ──┬── 2026-10-23T17:03:47.6895635Z · ╰── Missing dependency `props` 2026-10-23T17:03:47.6895743Z 214 │ }, [isFocused, hasSource, props.onRequestClose]); 2026-10-23T17:03:47.6895860Z ·  ──────────┬───────── 2026-10-23T17:03:47.6896094Z · ╰── Overly precise dependency `props.onRequestClose`, use `props` instead 2026-10-23T17:03:47.6896170Z 215 │ const { source } = props; 2026-10-23T17:03:47.6896221Z ╰──── 2026-10-23T17:03:47.6896664Z  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-23T17:03:47.6896983Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6896988Z 2026-10-23T17:03:47.6897162Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T17:03:47.6897306Z ╭─[apps/server/src/process/externalLauncher.test.ts:186:12] 2026-10-23T17:03:47.6897364Z 185 │ 2026-10-23T17:03:47.6897474Z 186 │ for (const {} of ["darwin", "linux"] as const) { 2026-10-23T17:03:47.6897554Z ·  ── 2026-10-23T17:03:47.6897607Z 187 │ } 2026-10-23T17:03:47.6897665Z ╰──── 2026-10-23T17:03:47.6897904Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T17:03:47.6897907Z 2026-10-23T17:03:47.6898079Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T17:03:47.6898227Z ╭─[apps/server/src/process/externalLauncher.test.ts:189:12] 2026-10-23T17:03:47.6898286Z 188 │ 2026-10-23T17:03:47.6898354Z 189 │ for (const {} of [ 2026-10-23T17:03:47.6898425Z ·  ── 2026-10-23T17:03:47.6898520Z 190 │ { kind: "browser", folderVerb: "none" }, 2026-10-23T17:03:47.6898574Z ╰──── 2026-10-23T17:03:47.6898810Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T17:03:47.6898812Z 2026-10-23T17:03:47.6898981Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T17:03:47.6899128Z ╭─[apps/server/src/process/externalLauncher.test.ts:311:12] 2026-10-23T17:03:47.6899184Z 310 │ 2026-10-23T17:03:47.6899321Z 311 │ for (const {} of ["rejected", "spawn-error", "stalled"] as const) { 2026-10-23T17:03:47.6899553Z ·  ── 2026-10-23T17:03:47.6899712Z 312 │ } 2026-10-23T17:03:47.6899768Z ╰──── 2026-10-23T17:03:47.6900009Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T17:03:47.6900013Z 2026-10-23T17:03:47.6900185Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T17:03:47.6900326Z ╭─[apps/server/src/process/externalLauncher.test.ts:314:12] 2026-10-23T17:03:47.6900379Z 313 │ 2026-10-23T17:03:47.6900456Z 314 │ for (const {} of [ 2026-10-23T17:03:47.6900533Z ·  ── 2026-10-23T17:03:47.6900595Z 315 │ { 2026-10-23T17:03:47.6900647Z ╰──── 2026-10-23T17:03:47.6900875Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T17:03:47.6900882Z 2026-10-23T17:03:47.6901146Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T17:03:47.6901298Z ╭─[apps/mobile/src/components/VideoPreviewModal.ios.tsx:63:55] 2026-10-23T17:03:47.6901358Z 61 │ }, []); 2026-10-23T17:03:47.6901428Z 62 │ useEffect(() => { 2026-10-23T17:03:47.6901509Z ·  ────┬──── 2026-10-23T17:03:47.6901641Z · ╰── This is the containing effect 2026-10-23T17:03:47.6901797Z 63 │ if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl); 2026-10-23T17:03:47.6901934Z ·  ───────┬────── 2026-10-23T17:03:47.6902149Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6902237Z 64 │ }, [playbackUrl, resolvedUrl]); 2026-10-23T17:03:47.6902288Z ╰──── 2026-10-23T17:03:47.6902896Z  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-23T17:03:47.6903224Z  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-23T17:03:47.6903227Z 2026-10-23T17:03:47.6903384Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.6903545Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:152:27] 2026-10-23T17:03:47.6903730Z 151 │ 2026-10-23T17:03:47.6903819Z 152 │ {props.children(open)} 2026-10-23T17:03:47.6903913Z ·  ──┬─ 2026-10-23T17:03:47.6904090Z · ╰── Cannot access ref value during render 2026-10-23T17:03:47.6904152Z 153 │ 2026-10-23T17:03:47.6904211Z ╰──── 2026-10-23T17:03:47.6904688Z  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-23T17:03:47.6905062Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.6905109Z 2026-10-23T17:03:47.6905308Z ⚠ react(memo-dependencies): Found missing/extra memoization dependencies 2026-10-23T17:03:47.6905461Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:140:9] 2026-10-23T17:03:47.6905552Z 139 │ if (action.id !== undefined) { 2026-10-23T17:03:47.6905646Z 140 │ props.onPressAction?.({ 2026-10-23T17:03:47.6905725Z ·  ──┬── 2026-10-23T17:03:47.6905856Z · ╰── Missing dependency `props` 2026-10-23T17:03:47.6905958Z 141 │ nativeEvent: { event: action.id }, 2026-10-23T17:03:47.6906109Z 142 │ } as Parameters>[0]); 2026-10-23T17:03:47.6906173Z 143 │ } 2026-10-23T17:03:47.6906235Z 144 │ }, 2026-10-23T17:03:47.6906327Z 145 │ [close, props.onPressAction], 2026-10-23T17:03:47.6906429Z ·  ─────────┬───────── 2026-10-23T17:03:47.6906650Z · ╰── Overly precise dependency `props.onPressAction`, use `props` instead 2026-10-23T17:03:47.6906708Z 146 │ ); 2026-10-23T17:03:47.6906765Z ╰──── 2026-10-23T17:03:47.6907249Z  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-23T17:03:47.6907566Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T17:03:47.6907573Z 2026-10-23T17:03:47.6907727Z ⚠ react(refs): Cannot access refs during render 2026-10-23T17:03:47.6907849Z ╭─[apps/mobile/src/components/ui/Menu.tsx:54:36] 2026-10-23T17:03:47.6908050Z 53 │ const child = children as ReactElement>; 2026-10-23T17:03:47.6908243Z 54 │ ╭─▶ children = cloneElement(child, { 2026-10-23T17:03:47.6908360Z 55 │ │ onTouchStart: (event) => { 2026-10-23T17:03:47.6908521Z 56 │ │ // Reset for a new touch, not onPressIn, which also fires when a 2026-10-23T17:03:47.6908699Z 57 │ │ // finger moves out of the row and back during the same gesture. 2026-10-23T17:03:47.6908846Z 58 │ │ menuPress.current.isPreparing = false; 2026-10-23T17:03:47.6909038Z 59 │ │ menuPress.current.suppressPress = menuPress.current.isOpen; 2026-10-23T17:03:47.6909155Z 60 │ │ pendingPress.current = null; 2026-10-23T17:03:47.6909293Z 61 │ │ child.props.onTouchStart?.(event); 2026-10-23T17:03:47.6909384Z 62 │ │ }, 2026-10-23T17:03:47.6909493Z 63 │ │ onPress: (event) => { 2026-10-23T17:03:47.6909715Z 64 │ │ // Accessibility clicks have no touch identifier and must not inherit 2026-10-23T17:03:47.6909870Z 65 │ │ // cancellation from a previous physical gesture. 2026-10-23T17:03:47.6910050Z 66 │ │ const isTouch = typeof event.nativeEvent.identifier === "number"; 2026-10-23T17:03:47.6910609Z 67 │ │ if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) { 2026-10-23T17:03:47.6910776Z 68 │ │ return; 2026-10-23T17:03:47.6910869Z 69 │ │ } 2026-10-23T17:03:47.6911024Z 70 │ │ if (isTouch && menuPress.current.isPreparing) { 2026-10-23T17:03:47.6911202Z 71 │ │ // A release can arrive between native menu preparation and display. 2026-10-23T17:03:47.6911374Z 72 │ │ // Let UIKit's display/cancel callback decide this press's outcome. 2026-10-23T17:03:47.6911483Z 73 │ │ event.persist(); 2026-10-23T17:03:47.6911658Z 74 │ │ pendingPress.current = () => child.props.onPress?.(event); 2026-10-23T17:03:47.6911753Z 75 │ │ return; 2026-10-23T17:03:47.6911846Z 76 │ │ } 2026-10-23T17:03:47.6911981Z 77 │ │ child.props.onPress?.(event); 2026-10-23T17:03:47.6912072Z 78 │ │ }, 2026-10-23T17:03:47.6912214Z 79 │ ├─▶ }); 2026-10-23T17:03:47.6912456Z · ╰──── Passing a ref to a function may read its value during render 2026-10-23T17:03:47.6912561Z 80 │ menuProps.onMenuInteractionStart = () => { 2026-10-23T17:03:47.6912625Z ╰──── 2026-10-23T17:03:47.6913101Z  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-23T17:03:47.6913410Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T17:03:47.6913415Z 2026-10-23T17:03:47.6913619Z ⚠ eslint(no-unsafe-optional-chaining): Unsafe usage of optional chaining 2026-10-23T17:03:47.6913796Z ╭─[apps/server/src/orchestration-v2/ThreadLaunchService.test.ts:1783:8] 2026-10-23T17:03:47.6913878Z 1782 │ assert.equal( 2026-10-23T17:03:47.6914043Z 1783 │ (stored.context?.records[0] as { attachmentId: string }).attachmentId, 2026-10-23T17:03:47.6914154Z ·  ────────────────────────── 2026-10-23T17:03:47.6914246Z 1784 │ stored.attachments[0]?.id, 2026-10-23T17:03:47.6914312Z ╰──── 2026-10-23T17:03:47.6914494Z  help: If this short-circuits with 'undefined' the evaluation will throw TypeError 2026-10-23T17:03:47.6914504Z 2026-10-23T17:03:47.6914721Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-23T17:03:47.6914893Z ╭─[apps/server/src/sourceControl/SourceControlProviderRegistry.ts:15:13] 2026-10-23T17:03:47.6914973Z 14 │ } from "@t3tools/contracts"; 2026-10-23T17:03:47.6915073Z 15 │ import type {} from "@t3tools/contracts"; 2026-10-23T17:03:47.6915150Z ·  ── 2026-10-23T17:03:47.6915330Z 16 │ import { detectSourceControlProviderFromRemoteUrl } from "@t3tools/shared/sourceControl"; 2026-10-23T17:03:47.6915392Z ╰──── 2026-10-23T17:03:47.6915522Z  help: Remove empty braces 2026-10-23T17:03:47.6915526Z 2026-10-23T17:03:47.6915777Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T17:03:47.6916003Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:121:27] 2026-10-23T17:03:47.6916272Z 120 │ const scope = makeScope(options.capabilities ?? new Set(["preview", "worktree"])); 2026-10-23T17:03:47.6916370Z 121 │ const dispatch = vi.fn((_: unknown) => 2026-10-23T17:03:47.6916462Z ·  ┬ 2026-10-23T17:03:47.6916604Z · ╰── '_' is declared here 2026-10-23T17:03:47.6916715Z 122 │ (options.dispatchGate ?? Effect.void).pipe( 2026-10-23T17:03:47.6916778Z ╰──── 2026-10-23T17:03:47.6916922Z  help: Consider removing this parameter. 2026-10-23T17:03:47.6916925Z 2026-10-23T17:03:47.6917138Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T17:03:47.6917287Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:134:39] 2026-10-23T17:03:47.6917360Z 133 │ ); 2026-10-23T17:03:47.6917476Z 134 │ const listLocalBranchNames = vi.fn((_: string) => 2026-10-23T17:03:47.6917578Z ·  ┬ 2026-10-23T17:03:47.6917731Z · ╰── '_' is declared here 2026-10-23T17:03:47.6917809Z 135 │ Effect.succeed( 2026-10-23T17:03:47.6917876Z ╰──── 2026-10-23T17:03:47.6917989Z  help: Consider removing this parameter. 2026-10-23T17:03:47.6917992Z 2026-10-23T17:03:47.6918257Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T17:03:47.6918653Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:178:31] 2026-10-23T17:03:47.6918737Z 177 │ }); 2026-10-23T17:03:47.6918856Z 178 │ const sendToThread = vi.fn((_: unknown) => { 2026-10-23T17:03:47.6918978Z ·  ┬ 2026-10-23T17:03:47.6919139Z · ╰── '_' is declared here 2026-10-23T17:03:47.6919255Z 179 │ switch (options.continuation ?? "queued") { 2026-10-23T17:03:47.6919310Z ╰──── 2026-10-23T17:03:47.6919436Z  help: Consider removing this parameter. 2026-10-23T17:03:47.6919438Z 2026-10-23T17:03:47.6919630Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T17:03:47.6919872Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:203:33] 2026-10-23T17:03:47.6919942Z 202 │ ); 2026-10-23T17:03:47.6920084Z 203 │ const removeWorktree = vi.fn((_: unknown) => 2026-10-23T17:03:47.6920190Z ·  ┬ 2026-10-23T17:03:47.6920336Z · ╰── '_' is declared here 2026-10-23T17:03:47.6920422Z 204 │ options.removeWorktreeFails 2026-10-23T17:03:47.6920490Z ╰──── 2026-10-23T17:03:47.6920600Z  help: Consider removing this parameter. 2026-10-23T17:03:47.6920603Z 2026-10-23T17:03:47.6920789Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T17:03:47.6920927Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:208:36] 2026-10-23T17:03:47.6920989Z 207 │ ); 2026-10-23T17:03:47.6921105Z 208 │ const deleteLocalBranch = vi.fn((_: unknown) => 2026-10-23T17:03:47.6921211Z ·  ┬ 2026-10-23T17:03:47.6921352Z · ╰── '_' is declared here 2026-10-23T17:03:47.6921656Z 209 │ options.deleteLocalBranchFails 2026-10-23T17:03:47.6921776Z ╰──── 2026-10-23T17:03:47.6921891Z  help: Consider removing this parameter. 2026-10-23T17:03:47.6921894Z 2026-10-23T17:03:47.6922080Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T17:03:47.6922220Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:213:42] 2026-10-23T17:03:47.6922281Z 212 │ ); 2026-10-23T17:03:47.6922406Z 213 │ const fetchWorktreeBaseCommit = vi.fn((_: unknown) => 2026-10-23T17:03:47.6922510Z ·  ┬ 2026-10-23T17:03:47.6922660Z · ╰── '_' is declared here 2026-10-23T17:03:47.6922752Z 214 │ options.fetchWorktreeBaseFails 2026-10-23T17:03:47.6922810Z ╰──── 2026-10-23T17:03:47.6922916Z  help: Consider removing this parameter. 2026-10-23T17:03:47.6922926Z 2026-10-23T17:03:47.6923114Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T17:03:47.6923260Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:254:30] 2026-10-23T17:03:47.6923330Z 253 │ ); 2026-10-23T17:03:47.6923429Z 254 │ const localStatus = vi.fn((_: unknown) => 2026-10-23T17:03:47.6923519Z ·  ┬ 2026-10-23T17:03:47.6923659Z · ╰── '_' is declared here 2026-10-23T17:03:47.6923732Z 255 │ Effect.succeed({ 2026-10-23T17:03:47.6923786Z ╰──── 2026-10-23T17:03:47.6923892Z  help: Consider removing this parameter. 2026-10-23T17:03:47.6923894Z 2026-10-23T17:03:47.6924090Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T17:03:47.6924231Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:264:32] 2026-10-23T17:03:47.6924291Z 263 │ ); 2026-10-23T17:03:47.6924443Z 264 │ const refreshStatus = vi.fn((_: string) => Effect.die("refreshStatus stub")); 2026-10-23T17:03:47.6924541Z ·  ┬ 2026-10-23T17:03:47.6924686Z · ╰── '_' is declared here 2026-10-23T17:03:47.6924838Z 265 │ const runForThread = vi.fn((input: { readonly worktreePath: string }) => { 2026-10-23T17:03:47.6924889Z ╰──── 2026-10-23T17:03:47.6925000Z  help: Consider removing this parameter. 2026-10-23T17:03:47.6925003Z 2026-10-23T17:03:47.6925310Z ⚠ eslint(no-unused-vars): Variable 'revokeActiveMcpThread' is declared but never used. Unused variables should start with a '_'. 2026-10-23T17:03:47.6925443Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:218:7] 2026-10-23T17:03:47.6925499Z 217 │ 2026-10-23T17:03:47.6925655Z 218 │ const revokeActiveMcpThread = (threadId: ThreadId): Effect.Effect => 2026-10-23T17:03:47.6925761Z ·  ──────────┬────────── 2026-10-23T17:03:47.6925922Z · ╰── 'revokeActiveMcpThread' is declared here 2026-10-23T17:03:47.6926110Z 219 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeThread(threadId) : Effect.void; 2026-10-23T17:03:47.6926167Z ╰──── 2026-10-23T17:03:47.6926276Z  help: Consider removing this declaration. 2026-10-23T17:03:47.6926279Z 2026-10-23T17:03:47.6926673Z ⚠ eslint(no-unused-vars): Variable 'revokeAllActiveMcpCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-23T17:03:47.6926835Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:221:7] 2026-10-23T17:03:47.6926899Z 220 │ 2026-10-23T17:03:47.6927042Z 221 │ const revokeAllActiveMcpCredentials = (): Effect.Effect => 2026-10-23T17:03:47.6927168Z ·  ──────────────┬────────────── 2026-10-23T17:03:47.6927344Z · ╰── 'revokeAllActiveMcpCredentials' is declared here 2026-10-23T17:03:47.6927511Z 222 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void; 2026-10-23T17:03:47.6927572Z ╰──── 2026-10-23T17:03:47.6927679Z  help: Consider removing this declaration. 2026-10-23T17:03:47.6927682Z 2026-10-23T17:03:47.6927891Z ⚠ eslint(no-unused-vars): Function 'describeSchedule' is declared but never used. 2026-10-23T17:03:47.6928021Z ╭─[apps/server/src/scheduledTasks/Schedule.ts:79:10] 2026-10-23T17:03:47.6928087Z 78 │ 2026-10-23T17:03:47.6928231Z 79 │ function describeSchedule(schedule: ScheduledTaskSchedule): string { 2026-10-23T17:03:47.6928334Z ·  ────────┬─────── 2026-10-23T17:03:47.6928488Z · ╰── 'describeSchedule' is declared here 2026-10-23T17:03:47.6928605Z 80 │ if (schedule.type === "webhook") return "On webhook"; 2026-10-23T17:03:47.6928665Z ╰──── 2026-10-23T17:03:47.6928776Z  help: Consider removing this declaration. 2026-10-23T17:03:47.6928779Z 2026-10-23T17:03:47.6929247Z ⚠ 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-23T17:03:47.6929441Z ╭─[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:521:13] 2026-10-23T17:03:47.6929534Z 520 │ })).delivery; 2026-10-23T17:03:47.6929786Z 521 │ ╭─▶ while (delivery.outcome === "accepted") { 2026-10-23T17:03:47.6929908Z 522 │ │ yield* Effect.yieldNow; 2026-10-23T17:03:47.6930068Z 523 │ │ delivery = (yield* service.getWebhookDelivery({ 2026-10-23T17:03:47.6930180Z 524 │ │ id: task.id, 2026-10-23T17:03:47.6930299Z 525 │ │ deliveryId: deliveryId!, 2026-10-23T17:03:47.6930401Z 526 │ │ })).delivery; 2026-10-23T17:03:47.6930620Z 527 │ ╰─▶ } 2026-10-23T17:03:47.6930788Z 528 │ assert.equal(delivery.outcome, "dispatch_failed"); 2026-10-23T17:03:47.6930851Z ╰──── 2026-10-23T17:03:47.6930853Z 2026-10-23T17:03:47.6931143Z ⚠ eslint(no-unused-vars): Variable 'layerUnavailable' is declared but never used. Unused variables should start with a '_'. 2026-10-23T17:03:47.6931293Z ╭─[apps/server/src/orchestration-v2/Orchestrator.ts:12340:7] 2026-10-23T17:03:47.6931355Z 12339 │ 2026-10-23T17:03:47.6931509Z 12340 │ const layerUnavailable: Layer.Layer = Layer.succeed( 2026-10-23T17:03:47.6931609Z ·  ────────┬─────── 2026-10-23T17:03:47.6931757Z · ╰── 'layerUnavailable' is declared here 2026-10-23T17:03:47.6931846Z 12341 │ OrchestratorV2, 2026-10-23T17:03:47.6931909Z ╰──── 2026-10-23T17:03:47.6932029Z  help: Consider removing this declaration. 2026-10-23T17:03:47.6932034Z 2026-10-23T17:03:47.6932500Z ⚠ 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-23T17:03:47.6932679Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7] 2026-10-23T17:03:47.6932793Z 565 │ let afterSequence = created[0]!.sequence; 2026-10-23T17:03:47.6932997Z 566 │ ╭─▶ for (let index = 1; index <= 32; index += 1) { 2026-10-23T17:03:47.6933099Z 567 │ │ const nextEvent = { 2026-10-23T17:03:47.6933276Z 568 │ │ id: EventId.make(`event:foundation-stream-race:${index}`), 2026-10-23T17:03:47.6933514Z 569 │ │ type: "thread.metadata-updated" as const, 2026-10-23T17:03:47.6933642Z 570 │ │ threadId, 2026-10-23T17:03:47.6933757Z 571 │ │ providerInstanceId, 2026-10-23T17:03:47.6933863Z 572 │ │ occurredAt: now, 2026-10-23T17:03:47.6934029Z 573 │ │ payload: { ...thread, title: `Race update ${index}` }, 2026-10-23T17:03:47.6934164Z 574 │ │ } satisfies OrchestrationV2DomainEvent; 2026-10-23T17:03:47.6934282Z 575 │ │ const reader = yield* eventSink 2026-10-23T17:03:47.6934406Z 576 │ │ .stream({ threadId, afterSequence }) 2026-10-23T17:03:47.6934549Z 577 │ │ .pipe(Stream.runHead, Effect.forkChild); 2026-10-23T17:03:47.6934668Z 578 │ │ yield* Effect.yieldNow; 2026-10-23T17:03:47.6934837Z 579 │ │ const written = yield* eventSink.write({ events: [nextEvent] }); 2026-10-23T17:03:47.6934980Z 580 │ │ const received = yield* Fiber.join(reader); 2026-10-23T17:03:47.6935113Z 581 │ │ if (Option.isNone(received)) { 2026-10-23T17:03:47.6935324Z 582 │ │ return yield* Effect.die("The event stream ended before delivering the live event."); 2026-10-23T17:03:47.6935441Z 583 │ │ } 2026-10-23T17:03:47.6935604Z 584 │ │ assert.equal(received.value.sequence, written[0]?.sequence); 2026-10-23T17:03:47.6935762Z 585 │ │ assert.equal(received.value.event.id, nextEvent.id); 2026-10-23T17:03:47.6936001Z 586 │ │ afterSequence = received.value.sequence; 2026-10-23T17:03:47.6936207Z 587 │ ╰─▶ } 2026-10-23T17:03:47.6936275Z 588 │ }), 2026-10-23T17:03:47.6936344Z ╰──── 2026-10-23T17:03:47.6936347Z 2026-10-23T17:03:47.6936812Z ⚠ 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-23T17:03:47.6936990Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:2327:9] 2026-10-23T17:03:47.6937073Z 2326 │ let settled = false; 2026-10-23T17:03:47.6937236Z 2327 │ ╭─▶ while (!settled) { 2026-10-23T17:03:47.6937406Z 2328 │ │ settled = (yield* outbox.listByCommandId(commandId)).every( 2026-10-23T17:03:47.6937548Z 2329 │ │ (effect) => effect.status === "succeeded", 2026-10-23T17:03:47.6937636Z 2330 │ │ ); 2026-10-23T17:03:47.6937760Z 2331 │ │ if (!settled) yield* Effect.yieldNow; 2026-10-23T17:03:47.6937908Z 2332 │ ╰─▶ } 2026-10-23T17:03:47.6938036Z 2333 │ }).pipe(Effect.provide(layerWorker), Effect.scoped); 2026-10-23T17:03:47.6938095Z ╰──── 2026-10-23T17:03:47.6938097Z 2026-10-23T17:03:47.6938303Z ⚠ typescript(no-extraneous-class): Unexpected class with only a constructor. 2026-10-23T17:03:47.6938439Z ╭─[apps/desktop/src/preview/Manager.test.ts:158:18] 2026-10-23T17:03:47.6938550Z 157 │ BrowserWindow: browserWindowConstructor, 2026-10-23T17:03:47.6938715Z 158 │ ╭─▶ ClipboardItem: class { 2026-10-23T17:03:47.6938845Z 159 │ │ constructor(data: Record) { 2026-10-23T17:03:47.6938975Z 160 │ │ clipboardItemConstructor(data); 2026-10-23T17:03:47.6939071Z 161 │ │ } 2026-10-23T17:03:47.6939201Z 162 │ ╰─▶ }, 2026-10-23T17:03:47.6939268Z 163 │ clipboard: { 2026-10-23T17:03:47.6939332Z ╰──── 2026-10-23T17:03:47.6939508Z  help: Try replacing this class with a standalone function or deleting it entirely 2026-10-23T17:03:47.6939511Z 2026-10-23T17:03:47.6939751Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T17:03:47.6939937Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:555:70] 2026-10-23T17:03:47.6940021Z 554 │ assert.deepStrictEqual( 2026-10-23T17:03:47.6940205Z 555 │ (yield* Ref.get(fixture.syncCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-23T17:03:47.6940342Z ·  ┬ 2026-10-23T17:03:47.6940517Z · ╰── '_' is declared here 2026-10-23T17:03:47.6940589Z 556 │ [ 2026-10-23T17:03:47.6940648Z ╰──── 2026-10-23T17:03:47.6940761Z  help: Consider removing this parameter. 2026-10-23T17:03:47.6940763Z 2026-10-23T17:03:47.6941037Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T17:03:47.6941272Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:1155:70] 2026-10-23T17:03:47.6941361Z 1154 │ assert.deepStrictEqual( 2026-10-23T17:03:47.6941539Z 1155 │ (yield* Ref.get(fixture.linkCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-23T17:03:47.6941667Z ·  ┬ 2026-10-23T17:03:47.6941832Z · ╰── '_' is declared here 2026-10-23T17:03:47.6941908Z 1156 │ [ 2026-10-23T17:03:47.6941968Z ╰──── 2026-10-23T17:03:47.6942073Z  help: Consider removing this parameter. 2026-10-23T17:03:47.6942075Z 2026-10-23T17:03:47.6942308Z ⚠ eslint(no-unused-vars): Function 'resolveThreadWorkspaceCwd' is declared but never used. 2026-10-23T17:03:47.6942441Z ╭─[apps/server/src/checkpointing/Utils.ts:12:10] 2026-10-23T17:03:47.6942505Z 11 │ 2026-10-23T17:03:47.6942612Z 12 │ function resolveThreadWorkspaceCwd(input: { 2026-10-23T17:03:47.6942721Z ·  ────────────┬──────────── 2026-10-23T17:03:47.6942903Z · ╰── 'resolveThreadWorkspaceCwd' is declared here 2026-10-23T17:03:47.6942982Z 13 │ readonly thread: { 2026-10-23T17:03:47.6943044Z ╰──── 2026-10-23T17:03:47.6943150Z  help: Consider removing this declaration. 2026-10-23T17:03:47.6943153Z 2026-10-23T17:03:47.6943546Z ⚠ 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-23T17:03:47.6943680Z ╭─[apps/server/src/auth/RpcAuthorization.ts:236:17] 2026-10-23T17:03:47.6943824Z 235 │ const requiredScopesForSettingsUpdate = (payload: unknown) => { 2026-10-23T17:03:47.6943965Z 236 │ const input = Schema.decodeUnknownSync(SettingsUpdate)(payload); 2026-10-23T17:03:47.6944078Z ·  ──────────────────────── 2026-10-23T17:03:47.6944231Z 237 │ const scopes = requiredScopesForServerSettingsPatch(input.patch); 2026-10-23T17:03:47.6944293Z ╰──── 2026-10-23T17:03:47.6944298Z 2026-10-23T17:03:47.6944680Z ⚠ 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-23T17:03:47.6944803Z ╭─[apps/server/src/auth/RpcAuthorization.ts:255:26] 2026-10-23T17:03:47.6944929Z 254 │ if (method === WS_METHODS.assetsCreateUrl) { 2026-10-23T17:03:47.6945094Z 255 │ const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload); 2026-10-23T17:03:47.6945213Z ·  ──────────────────────── 2026-10-23T17:03:47.6945276Z 256 │ return [ 2026-10-23T17:03:47.6945341Z ╰──── 2026-10-23T17:03:47.6945345Z 2026-10-23T17:03:47.6945529Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T17:03:47.6945681Z ╭─[apps/web/src/components/chat/useThreadLifecycle.tsx:178:58] 2026-10-23T17:03:47.6945793Z 177 │ if (snoozeClockState.shell !== activeThreadShell) { 2026-10-23T17:03:47.6945969Z 178 │ setSnoozeClockState({ shell: activeThreadShell, now: new Date().toISOString() }); 2026-10-23T17:03:47.6946184Z ·  ─────┬──── 2026-10-23T17:03:47.6946410Z · ╰── Cannot call impure function 2026-10-23T17:03:47.6946467Z 179 │ } 2026-10-23T17:03:47.6946530Z ╰──── 2026-10-23T17:03:47.6946822Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T17:03:47.6947135Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T17:03:47.6947137Z 2026-10-23T17:03:47.6947345Z ⚠ eslint(no-unused-vars): Identifier 'identity' is imported but never used. 2026-10-23T17:03:47.6947451Z ╭─[apps/server/src/auth/http.ts:28:10] 2026-10-23T17:03:47.6947558Z 27 │ import * as Schema from "effect/Schema"; 2026-10-23T17:03:47.6947657Z 28 │ import { identity } from "effect/Function"; 2026-10-23T17:03:47.6947742Z ·  ────┬─── 2026-10-23T17:03:47.6947876Z · ╰── 'identity' is imported here 2026-10-23T17:03:47.6947969Z 29 │ import * as Layer from "effect/Layer"; 2026-10-23T17:03:47.6948033Z ╰──── 2026-10-23T17:03:47.6948141Z  help: Consider removing this import. 2026-10-23T17:03:47.6948144Z 2026-10-23T17:03:47.6948611Z ⚠ 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-23T17:03:47.6948770Z ╭─[apps/server/src/background/HostPowerMonitor.test.ts:133:11] 2026-10-23T17:03:47.6948915Z 132 │ const monitor = yield* HostPowerMonitor.HostPowerMonitor; 2026-10-23T17:03:47.6949069Z 133 │ ╭─▶ for ( 2026-10-23T17:03:47.6949180Z 134 │ │ let attempt = 0; 2026-10-23T17:03:47.6949357Z 135 │ │ attempt < 100 && (yield* monitor.snapshot).onBattery !== "true"; 2026-10-23T17:03:47.6949462Z 136 │ │ attempt += 1 2026-10-23T17:03:47.6949549Z 137 │ │ ) { 2026-10-23T17:03:47.6949714Z 138 │ │ yield* Effect.yieldNow; 2026-10-23T17:03:47.6949856Z 139 │ ╰─▶ } 2026-10-23T17:03:47.6949986Z 140 │ expect((yield* monitor.snapshot).onBattery).toBe("true"); 2026-10-23T17:03:47.6950051Z ╰──── 2026-10-23T17:03:47.6950056Z 2026-10-23T17:03:47.6950298Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-23T17:03:47.6950435Z ╭─[apps/web/src/components/chat/useComposerSend.ts:985:13] 2026-10-23T17:03:47.6950562Z 984 │ const changedBeforeDecline = draftChangedSinceSend(); 2026-10-23T17:03:47.6950804Z 985 │ ╭─▶ const pendingIdsBeforeDecline = pendingApprovalsRef.current.map( 2026-10-23T17:03:47.6950933Z 986 │ │ (approval) => approval.requestId, 2026-10-23T17:03:47.6951068Z 987 │ ╰─▶ ); 2026-10-23T17:03:47.6951215Z 988 │ const approvalResponding = approvalsToDecline.some((approval) => 2026-10-23T17:03:47.6951378Z ╰──── 2026-10-23T17:03:47.6951515Z  help: Switch to `Set` 2026-10-23T17:03:47.6951517Z 2026-10-23T17:03:47.6951678Z ⚠ react(immutability): This value cannot be modified 2026-10-23T17:03:47.6951842Z ╭─[apps/mobile/src/features/connection/ConnectionStatusDot.tsx:58:7] 2026-10-23T17:03:47.6951946Z 53 │ function usePulseAnimation(pulse: boolean) { 2026-10-23T17:03:47.6952050Z 54 │ const pulseProgress = useSharedValue(0); 2026-10-23T17:03:47.6952134Z ·  ──────┬────── 2026-10-23T17:03:47.6952290Z · ╰── `pulseProgress` originates here 2026-10-23T17:03:47.6952348Z 55 │ 2026-10-23T17:03:47.6952418Z 56 │ useEffect(() => { 2026-10-23T17:03:47.6952481Z 57 │ if (pulse) { 2026-10-23T17:03:47.6952573Z 58 │ pulseProgress.value = withRepeat( 2026-10-23T17:03:47.6952666Z ·  ──────┬────── 2026-10-23T17:03:47.6952819Z · ╰── `pulseProgress` cannot be modified 2026-10-23T17:03:47.6952888Z 59 │ withTiming(1, { 2026-10-23T17:03:47.6952950Z ╰──── 2026-10-23T17:03:47.6953221Z  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-23T17:03:47.6953538Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T17:03:47.6953541Z 2026-10-23T17:03:47.6953810Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T17:03:47.6953987Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:79:5] 2026-10-23T17:03:47.6954049Z 76 │ 2026-10-23T17:03:47.6954119Z 77 │ useEffect(() => { 2026-10-23T17:03:47.6954198Z ·  ────┬──── 2026-10-23T17:03:47.6954326Z · ╰── This is the containing effect 2026-10-23T17:03:47.6954457Z 78 │ const { host, code } = parsePairingUrl(connectionPairingUrl); 2026-10-23T17:03:47.6954535Z 79 │ setHostInput(host); 2026-10-23T17:03:47.6954613Z ·  ──────┬───── 2026-10-23T17:03:47.6954783Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6954860Z 80 │ setCodeInput(code); 2026-10-23T17:03:47.6954918Z ╰──── 2026-10-23T17:03:47.6955610Z  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-23T17:03:47.6955980Z  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-23T17:03:47.6955983Z 2026-10-23T17:03:47.6956248Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T17:03:47.6956422Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:89:5] 2026-10-23T17:03:47.6956480Z 82 │ 2026-10-23T17:03:47.6956542Z 83 │ useEffect(() => { 2026-10-23T17:03:47.6956625Z ·  ────┬──── 2026-10-23T17:03:47.6956761Z · ╰── This is the containing effect 2026-10-23T17:03:47.6956860Z 84 │ if (routePairingUrl.length === 0) { 2026-10-23T17:03:47.6956920Z 85 │ return; 2026-10-23T17:03:47.6956982Z 86 │ } 2026-10-23T17:03:47.6957040Z 87 │ 2026-10-23T17:03:47.6957159Z 88 │ const { host, code } = parsePairingUrl(routePairingUrl); 2026-10-23T17:03:47.6957227Z 89 │ setHostInput(host); 2026-10-23T17:03:47.6957309Z ·  ──────┬───── 2026-10-23T17:03:47.6957487Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6957561Z 90 │ setCodeInput(code); 2026-10-23T17:03:47.6957612Z ╰──── 2026-10-23T17:03:47.6958240Z  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-23T17:03:47.6958752Z  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-23T17:03:47.6958754Z 2026-10-23T17:03:47.6959023Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T17:03:47.6959195Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:95:7] 2026-10-23T17:03:47.6959250Z 92 │ 2026-10-23T17:03:47.6959323Z 93 │ useEffect(() => { 2026-10-23T17:03:47.6959405Z ·  ────┬──── 2026-10-23T17:03:47.6959537Z · ╰── This is the containing effect 2026-10-23T17:03:47.6959623Z 94 │ if (pairingConnectionError) { 2026-10-23T17:03:47.6959757Z 95 │ setIsSubmitting(false); 2026-10-23T17:03:47.6959848Z ·  ───────┬─────── 2026-10-23T17:03:47.6960030Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T17:03:47.6960084Z 96 │ } 2026-10-23T17:03:47.6960153Z ╰──── 2026-10-23T17:03:47.6960774Z  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-23T17:03:47.6961321Z  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-23T17:03:47.6961384Z 2026-10-23T17:03:47.6961493Z Found 0 errors and 362 warnings in 5398 files (10.4s, 8 threads) 2026-10-23T17:03:47.7763539Z Post job cleanup. 2026-10-23T17:03:47.8811861Z Cache hit occurred on the primary key electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309, not saving cache. 2026-10-23T17:03:47.8975542Z Post job cleanup. 2026-10-23T17:03:47.8999387Z ##[start-action display=Cache full pnpm store;id=__933c87a0-9980-4ab4-bfb2-bb4e9bcb8cdc.__actions_cache] 2026-10-23T17:03:47.9572060Z Post job cleanup. 2026-10-23T17:03:48.0600466Z Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-2baa264059789b1dde4bbc8fdc5b8342f31f2fc8e6176e5c5e486efdd242b36c, not saving cache. 2026-10-23T17:03:48.0655353Z ##[end-action id=__933c87a0-9980-4ab4-bfb2-bb4e9bcb8cdc.__actions_cache;outcome=success;conclusion=success;duration_ms=165] 2026-10-23T17:03:48.0658169Z ##[start-action display=Cache Vite+;id=__933c87a0-9980-4ab4-bfb2-bb4e9bcb8cdc.vp_cache] 2026-10-23T17:03:48.0688709Z Post job cleanup. 2026-10-23T17:03:48.1621556Z 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-23T17:03:48.1677841Z ##[end-action id=__933c87a0-9980-4ab4-bfb2-bb4e9bcb8cdc.vp_cache;outcome=success;conclusion=success;duration_ms=101] 2026-10-23T17:03:48.1744687Z Post job cleanup. 2026-10-23T17:03:48.2424079Z [command]/usr/local/bin/git version 2026-10-23T17:03:48.2478216Z git version 2.55.0 2026-10-23T17:03:48.2516769Z Temporarily overriding HOME='/home/runner/_work/_temp/f7680194-ee8f-420f-b149-a806695ed6d8' before making global git config changes 2026-10-23T17:03:48.2517418Z Adding repository directory to the temporary git global config as a safe directory 2026-10-23T17:03:48.2523164Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-23T17:03:48.2575386Z Removing SSH command configuration 2026-10-23T17:03:48.2586059Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-23T17:03:48.2670915Z [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-23T17:03:48.2897975Z fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules 2026-10-23T17:03:48.2934010Z ##[warning]The process '/usr/local/bin/git' failed with exit code 128 2026-10-23T17:03:48.3013700Z A job completed hook has been configured by the self-hosted runner administrator 2026-10-23T17:03:48.3062112Z ##[group]Run '/job_completed.sh' 2026-10-23T17:03:48.3098074Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T17:03:48.3098328Z env: 2026-10-23T17:03:48.3098479Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 195 2026-10-23T17:03:48.3098652Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 729 2026-10-23T17:03:48.3098808Z BLACKSMITH_CHECK_RUN_ID: 120545088735 2026-10-23T17:03:48.3098971Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-23T17:03:48.3099156Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-23T17:03:48.3099324Z ##[endgroup] 2026-10-23T17:03:48.3250039Z Docker container cache not activated, skipping hash computation. 2026-10-23T17:03:48.3650398Z No active SSH sessions detected. Proceeding with shutdown immediately. 2026-10-23T17:03:48.3736862Z Cleaning up orphan processes