2026-10-24T20:53:55.3003070Z Current runner version: '2.338.1' 2026-10-24T20:53:55.3006702Z Runner name: 'blacksmith-8vcpu-ubuntu-2404-xiavmz7wxng3gbth' 2026-10-24T20:53:55.3007489Z Runner group name: 'blacksmith scale sets - blacksmith-8vcpu-ubuntu-2404' 2026-10-24T20:53:55.3008259Z Machine name: 'ip-172-31-73-130' 2026-10-24T20:53:55.3009913Z ##[group]GITHUB_TOKEN Permissions 2026-10-24T20:53:55.3011310Z Contents: read 2026-10-24T20:53:55.3011719Z Metadata: read 2026-10-24T20:53:55.3012200Z ##[endgroup] 2026-10-24T20:53:55.3013540Z Secret source: Actions 2026-10-24T20:53:55.3014269Z Cache mode: write 2026-10-24T20:53:55.3014970Z Prepare workflow directory 2026-10-24T20:53:55.3199009Z Prepare all required actions 2026-10-24T20:53:55.3225503Z Getting action download info 2026-10-24T20:53:55.4467461Z Download action repository 'actions/checkout@v6' (SHA:d23441a48e516b6c34aea4fa41551a30e30af803) 2026-10-24T20:53:55.4786988Z Download action repository 'actions/cache@v6' (SHA:55cc8345863c7cc4c66a329aec7e433d2d1c52a9) 2026-10-24T20:53:55.6005666Z Setting BLACKSMITH_ACTIONS_RESULTS_URL to https://results-receiver.actions.githubusercontent.com/ 2026-10-24T20:53:55.6043668Z Complete job name: Lint 2026-10-24T20:53:55.6424004Z A job started hook has been configured by the self-hosted runner administrator 2026-10-24T20:53:55.6525999Z ##[group]Run '/setup.sh' 2026-10-24T20:53:55.6544482Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T20:53:55.6544891Z env: 2026-10-24T20:53:55.6545116Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 160 2026-10-24T20:53:55.6545407Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 347 2026-10-24T20:53:55.6545727Z BLACKSMITH_CHECK_RUN_ID: 120984969685 2026-10-24T20:53:55.6546008Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-24T20:53:55.6546282Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-24T20:53:55.6546541Z ##[endgroup] 2026-10-24T20:53:55.6780043Z Logging daemon started (blacksmithd for logs) 2026-10-24T20:53:55.6870539Z Results daemon started (blacksmithd for results) 2026-10-24T20:53:55.7006866Z Background adoption and SSH setup started (PID: 3174) 2026-10-24T20:53:55.7008195Z 2026-10-24T20:53:55.7009349Z ---------------------------------------- 2026-10-24T20:53:55.7010011Z View this job: https://app.blacksmith.sh/pingdotgg/runs/40131829321/jobs/120984969685 2026-10-24T20:53:55.7010461Z SSH Access (using your GitHub SSH key): 2026-10-24T20:53:55.7010897Z ssh -p 64000 runner@blacksmith-8vcpu-ubuntu-2404-xiavmz7wxng3gbth.vm.blacksmith.sh 2026-10-24T20:53:55.7011212Z 2026-10-24T20:53:55.7011322Z No GitHub SSH key? Add one at: 2026-10-24T20:53:55.7011815Z https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account 2026-10-24T20:53:55.7012214Z 2026-10-24T20:53:55.7012322Z ---------------------------------------- 2026-10-24T20:53:55.7012503Z 2026-10-24T20:53:55.7012648Z VM ID: blacksmith-8vcpu-ubuntu-2404-xiavmz7wxng3gbth 2026-10-24T20:53:55.7012968Z Host: production-152.236.46.145-x8664 2026-10-24T20:53:55.7013247Z Host Agent PID: 826166 2026-10-24T20:53:55.7013488Z Host Agent Git SHA: 1637818df 2026-10-24T20:53:55.7013760Z Host CPU Manufacturer: AuthenticAMD 2026-10-24T20:53:55.7014040Z Blacksmith Host Generation: gen 2 2026-10-24T20:53:55.7014325Z Petname: production-light-shark-f69e03b2 2026-10-24T20:53:55.7014612Z Region: us-east 2026-10-24T20:53:55.7014848Z Rootfs Version: ubuntu24-full-x64-081926 2026-10-24T20:53:55.7022364Z OS Version: Ubuntu 24.04.4 LTS 2026-10-24T20:53:55.7022615Z 2026-10-24T20:53:55.7022738Z Enabling Blacksmith transparent cache 2026-10-24T20:53:55.7239817Z ##[group]Run actions/checkout@v6 2026-10-24T20:53:55.7240111Z with: 2026-10-24T20:53:55.7240436Z sparse-checkout: /* !/.repos/ !/apps/mobile/modules/t3-terminal/Vendor/**/*.a 2026-10-24T20:53:55.7240828Z sparse-checkout-cone-mode: false 2026-10-24T20:53:55.7241103Z repository: pingdotgg/t3code 2026-10-24T20:53:55.7243096Z token: *** 2026-10-24T20:53:55.7243307Z ssh-strict: true 2026-10-24T20:53:55.7243528Z ssh-user: git 2026-10-24T20:53:55.7243750Z persist-credentials: true 2026-10-24T20:53:55.7244187Z clean: true 2026-10-24T20:53:55.7244398Z fetch-depth: 1 2026-10-24T20:53:55.7244612Z fetch-tags: false 2026-10-24T20:53:55.7244838Z show-progress: true 2026-10-24T20:53:55.7245061Z lfs: false 2026-10-24T20:53:55.7245270Z submodules: false 2026-10-24T20:53:55.7245495Z set-safe-directory: true 2026-10-24T20:53:55.7245799Z allow-unsafe-pr-checkout: false 2026-10-24T20:53:55.7246057Z env: 2026-10-24T20:53:55.7246294Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 160 2026-10-24T20:53:55.7246579Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 347 2026-10-24T20:53:55.7246858Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:53:55.7247118Z ##[endgroup] 2026-10-24T20:53:55.8285446Z Syncing repository: pingdotgg/t3code 2026-10-24T20:53:55.8286722Z ##[group]Getting Git version info 2026-10-24T20:53:55.8287081Z Working directory is '/home/runner/_work/t3code/t3code' 2026-10-24T20:53:55.8287689Z [command]/usr/local/bin/git version 2026-10-24T20:53:55.8357353Z git version 2.55.0 2026-10-24T20:53:55.8367564Z ##[endgroup] 2026-10-24T20:53:55.8374046Z Temporarily overriding HOME='/home/runner/_work/_temp/19c85763-c546-4130-a9a2-f2f92fa5d50c' before making global git config changes 2026-10-24T20:53:55.8374695Z Adding repository directory to the temporary git global config as a safe directory 2026-10-24T20:53:55.8376974Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-24T20:53:55.8415656Z Deleting the contents of '/home/runner/_work/t3code/t3code' 2026-10-24T20:53:55.8417362Z ##[group]Determining repository object format 2026-10-24T20:53:55.8418436Z ##[endgroup] 2026-10-24T20:53:55.8418812Z ##[group]Initializing the repository 2026-10-24T20:53:55.8420608Z [command]/usr/local/bin/git init /home/runner/_work/t3code/t3code 2026-10-24T20:53:55.8459411Z hint: Using 'master' as the name for the initial branch. This default branch name 2026-10-24T20:53:55.8459879Z hint: will change to "main" in Git 3.0. To configure the initial branch name 2026-10-24T20:53:55.8460354Z hint: to use in all of your new repositories, which will suppress this warning, 2026-10-24T20:53:55.8460717Z hint: call: 2026-10-24T20:53:55.8460934Z hint: 2026-10-24T20:53:55.8461209Z hint: git config --global init.defaultBranch 2026-10-24T20:53:55.8461522Z hint: 2026-10-24T20:53:55.8461817Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and 2026-10-24T20:53:55.8462271Z hint: 'development'. The just-created branch can be renamed via this command: 2026-10-24T20:53:55.8462644Z hint: 2026-10-24T20:53:55.8462866Z hint: git branch -m 2026-10-24T20:53:55.8463108Z hint: 2026-10-24T20:53:55.8463424Z hint: Disable this message with "git config set advice.defaultBranchName false" 2026-10-24T20:53:55.8463906Z Initialized empty Git repository in /home/runner/_work/t3code/t3code/.git/ 2026-10-24T20:53:55.8465066Z [command]/usr/local/bin/git remote add origin https://github.com/pingdotgg/t3code 2026-10-24T20:53:55.8497871Z ##[endgroup] 2026-10-24T20:53:55.8498274Z ##[group]Disabling automatic garbage collection 2026-10-24T20:53:55.8499671Z [command]/usr/local/bin/git config --local gc.auto 0 2026-10-24T20:53:55.8526699Z ##[endgroup] 2026-10-24T20:53:55.8527062Z ##[group]Setting up auth 2026-10-24T20:53:55.8527450Z Removing SSH command configuration 2026-10-24T20:53:55.8530888Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-24T20:53:55.8559497Z [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-24T20:53:55.8706364Z Removing HTTP extra header 2026-10-24T20:53:55.8709142Z [command]/usr/local/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader 2026-10-24T20:53:55.8731709Z [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-24T20:53:55.8846075Z Removing includeIf entries pointing to credentials config files 2026-10-24T20:53:55.8848980Z [command]/usr/local/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: 2026-10-24T20:53:55.8875138Z [command]/usr/local/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url 2026-10-24T20:53:55.8991845Z [command]/usr/local/bin/git config --file /home/runner/_work/_temp/git-credentials-636f47d0-0711-41fc-b913-948dfa6043fd.config http.https://github.com/.extraheader AUTHORIZATION: basic *** 2026-10-24T20:53:55.9037945Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git.path /home/runner/_work/_temp/git-credentials-636f47d0-0711-41fc-b913-948dfa6043fd.config 2026-10-24T20:53:55.9063372Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git/worktrees/*.path /home/runner/_work/_temp/git-credentials-636f47d0-0711-41fc-b913-948dfa6043fd.config 2026-10-24T20:53:55.9085580Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-636f47d0-0711-41fc-b913-948dfa6043fd.config 2026-10-24T20:53:55.9105473Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-636f47d0-0711-41fc-b913-948dfa6043fd.config 2026-10-24T20:53:55.9123749Z ##[endgroup] 2026-10-24T20:53:55.9124115Z ##[group]Fetching the repository 2026-10-24T20:53:55.9128143Z [command]/usr/local/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --filter=blob:none --depth=1 origin +be1d0667320de371db76221d011a65ca7adb2bfe:refs/remotes/origin/main 2026-10-24T20:53:56.1636029Z From https://github.com/pingdotgg/t3code 2026-10-24T20:53:56.1659951Z * [new ref] be1d0667320de371db76221d011a65ca7adb2bfe -> origin/main 2026-10-24T20:53:56.1665563Z [command]/usr/local/bin/git branch --list --remote origin/main 2026-10-24T20:53:56.1690157Z origin/main 2026-10-24T20:53:56.1694308Z [command]/usr/local/bin/git rev-parse refs/remotes/origin/main 2026-10-24T20:53:56.1716711Z be1d0667320de371db76221d011a65ca7adb2bfe 2026-10-24T20:53:56.1719047Z ##[endgroup] 2026-10-24T20:53:56.1719814Z ##[group]Determining the checkout info 2026-10-24T20:53:56.1720694Z ##[endgroup] 2026-10-24T20:53:56.1721524Z ##[group]Setting up sparse checkout 2026-10-24T20:53:56.1722287Z [command]/usr/local/bin/git config core.sparseCheckout true 2026-10-24T20:53:56.1744471Z [command]/usr/local/bin/git rev-parse --git-path info/sparse-checkout 2026-10-24T20:53:56.1762481Z .git/info/sparse-checkout 2026-10-24T20:53:56.1766367Z ##[endgroup] 2026-10-24T20:53:56.1767341Z ##[group]Checking out the ref 2026-10-24T20:53:56.1768963Z [command]/usr/local/bin/git checkout --progress --force -B main refs/remotes/origin/main 2026-10-24T20:54:03.1014743Z Updating files: 0% (1/6402) 2026-10-24T20:54:03.1046053Z Updating files: 1% (65/6402) 2026-10-24T20:54:03.1064557Z Updating files: 2% (129/6402) 2026-10-24T20:54:03.1087209Z Updating files: 3% (193/6402) 2026-10-24T20:54:03.1109918Z Updating files: 4% (257/6402) 2026-10-24T20:54:03.1143279Z Updating files: 5% (321/6402) 2026-10-24T20:54:03.1167301Z Updating files: 6% (385/6402) 2026-10-24T20:54:03.1226488Z Updating files: 7% (449/6402) 2026-10-24T20:54:03.1260687Z Updating files: 8% (513/6402) 2026-10-24T20:54:03.1287829Z Updating files: 9% (577/6402) 2026-10-24T20:54:03.1606240Z Updating files: 10% (641/6402) 2026-10-24T20:54:03.1623555Z Updating files: 11% (705/6402) 2026-10-24T20:54:03.1634903Z Updating files: 12% (769/6402) 2026-10-24T20:54:03.1651172Z Updating files: 13% (833/6402) 2026-10-24T20:54:03.1668881Z Updating files: 14% (897/6402) 2026-10-24T20:54:03.1688249Z Updating files: 15% (961/6402) 2026-10-24T20:54:03.1708095Z Updating files: 16% (1025/6402) 2026-10-24T20:54:03.1723876Z Updating files: 17% (1089/6402) 2026-10-24T20:54:03.1744039Z Updating files: 18% (1153/6402) 2026-10-24T20:54:03.1759982Z Updating files: 19% (1217/6402) 2026-10-24T20:54:03.1785827Z Updating files: 20% (1281/6402) 2026-10-24T20:54:03.1803452Z Updating files: 21% (1345/6402) 2026-10-24T20:54:03.1823679Z Updating files: 22% (1409/6402) 2026-10-24T20:54:03.1837904Z Updating files: 23% (1473/6402) 2026-10-24T20:54:03.1852531Z Updating files: 24% (1537/6402) 2026-10-24T20:54:03.1869132Z Updating files: 25% (1601/6402) 2026-10-24T20:54:03.1884928Z Updating files: 26% (1665/6402) 2026-10-24T20:54:03.1899542Z Updating files: 27% (1729/6402) 2026-10-24T20:54:03.1920574Z Updating files: 28% (1793/6402) 2026-10-24T20:54:03.1956371Z Updating files: 29% (1857/6402) 2026-10-24T20:54:03.1978257Z Updating files: 30% (1921/6402) 2026-10-24T20:54:03.1987930Z Updating files: 31% (1985/6402) 2026-10-24T20:54:03.2003738Z Updating files: 31% (2003/6402) 2026-10-24T20:54:03.2035968Z Updating files: 32% (2049/6402) 2026-10-24T20:54:03.2066516Z Updating files: 33% (2113/6402) 2026-10-24T20:54:03.2141411Z Updating files: 34% (2177/6402) 2026-10-24T20:54:03.2204201Z Updating files: 35% (2241/6402) 2026-10-24T20:54:03.2243555Z Updating files: 36% (2305/6402) 2026-10-24T20:54:03.2277184Z Updating files: 37% (2369/6402) 2026-10-24T20:54:03.2326416Z Updating files: 38% (2433/6402) 2026-10-24T20:54:03.2356122Z Updating files: 39% (2497/6402) 2026-10-24T20:54:03.2388177Z Updating files: 40% (2561/6402) 2026-10-24T20:54:03.2416928Z Updating files: 41% (2625/6402) 2026-10-24T20:54:03.2432934Z Updating files: 42% (2689/6402) 2026-10-24T20:54:03.2443665Z Updating files: 43% (2753/6402) 2026-10-24T20:54:03.2475491Z Updating files: 44% (2817/6402) 2026-10-24T20:54:03.2505230Z Updating files: 45% (2881/6402) 2026-10-24T20:54:03.2534393Z Updating files: 46% (2945/6402) 2026-10-24T20:54:03.2561773Z Updating files: 47% (3009/6402) 2026-10-24T20:54:03.2591835Z Updating files: 48% (3073/6402) 2026-10-24T20:54:03.2632637Z Updating files: 49% (3137/6402) 2026-10-24T20:54:03.2663730Z Updating files: 50% (3201/6402) 2026-10-24T20:54:03.2680545Z Updating files: 51% (3266/6402) 2026-10-24T20:54:03.2718845Z Updating files: 52% (3330/6402) 2026-10-24T20:54:03.2749354Z Updating files: 53% (3394/6402) 2026-10-24T20:54:03.2772222Z Updating files: 54% (3458/6402) 2026-10-24T20:54:03.2795119Z Updating files: 55% (3522/6402) 2026-10-24T20:54:03.2812650Z Updating files: 56% (3586/6402) 2026-10-24T20:54:03.2833590Z Updating files: 57% (3650/6402) 2026-10-24T20:54:03.2852711Z Updating files: 58% (3714/6402) 2026-10-24T20:54:03.3246799Z Updating files: 59% (3778/6402) 2026-10-24T20:54:03.3262564Z Updating files: 60% (3842/6402) 2026-10-24T20:54:03.3282971Z Updating files: 61% (3906/6402) 2026-10-24T20:54:03.3302148Z Updating files: 62% (3970/6402) 2026-10-24T20:54:03.3326619Z Updating files: 63% (4034/6402) 2026-10-24T20:54:03.3354589Z Updating files: 64% (4098/6402) 2026-10-24T20:54:03.3375923Z Updating files: 65% (4162/6402) 2026-10-24T20:54:03.3394202Z Updating files: 66% (4226/6402) 2026-10-24T20:54:03.3418810Z Updating files: 67% (4290/6402) 2026-10-24T20:54:03.3434254Z Updating files: 68% (4354/6402) 2026-10-24T20:54:03.3453260Z Updating files: 69% (4418/6402) 2026-10-24T20:54:03.3466941Z Updating files: 70% (4482/6402) 2026-10-24T20:54:03.3486613Z Updating files: 71% (4546/6402) 2026-10-24T20:54:03.3500866Z Updating files: 72% (4610/6402) 2026-10-24T20:54:03.3551258Z Updating files: 73% (4674/6402) 2026-10-24T20:54:03.3982835Z Updating files: 74% (4738/6402) 2026-10-24T20:54:03.4007737Z Updating files: 75% (4802/6402) 2026-10-24T20:54:03.4031857Z Updating files: 76% (4866/6402) 2026-10-24T20:54:03.4057623Z Updating files: 77% (4930/6402) 2026-10-24T20:54:03.4080912Z Updating files: 78% (4994/6402) 2026-10-24T20:54:03.4098518Z Updating files: 79% (5058/6402) 2026-10-24T20:54:03.4121961Z Updating files: 80% (5122/6402) 2026-10-24T20:54:03.4138950Z Updating files: 81% (5186/6402) 2026-10-24T20:54:03.4158183Z Updating files: 82% (5250/6402) 2026-10-24T20:54:03.4181392Z Updating files: 83% (5314/6402) 2026-10-24T20:54:03.4208882Z Updating files: 84% (5378/6402) 2026-10-24T20:54:03.4227025Z Updating files: 85% (5442/6402) 2026-10-24T20:54:03.4254052Z Updating files: 86% (5506/6402) 2026-10-24T20:54:03.4330664Z Updating files: 87% (5570/6402) 2026-10-24T20:54:03.4362416Z Updating files: 88% (5634/6402) 2026-10-24T20:54:03.4383234Z Updating files: 89% (5698/6402) 2026-10-24T20:54:03.4413271Z Updating files: 90% (5762/6402) 2026-10-24T20:54:03.4443323Z Updating files: 91% (5826/6402) 2026-10-24T20:54:03.4459772Z Updating files: 92% (5890/6402) 2026-10-24T20:54:03.4482900Z Updating files: 93% (5954/6402) 2026-10-24T20:54:03.4504734Z Updating files: 94% (6018/6402) 2026-10-24T20:54:03.4529811Z Updating files: 95% (6082/6402) 2026-10-24T20:54:03.4592821Z Updating files: 96% (6146/6402) 2026-10-24T20:54:03.4617318Z Updating files: 97% (6210/6402) 2026-10-24T20:54:03.4666483Z Updating files: 98% (6274/6402) 2026-10-24T20:54:03.4687635Z Updating files: 99% (6338/6402) 2026-10-24T20:54:03.4687902Z Updating files: 100% (6402/6402) 2026-10-24T20:54:03.4688165Z Updating files: 100% (6402/6402), done. 2026-10-24T20:54:03.4850916Z Switched to a new branch 'main' 2026-10-24T20:54:03.4851799Z branch 'main' set up to track 'origin/main'. 2026-10-24T20:54:03.4866054Z ##[endgroup] 2026-10-24T20:54:03.4899884Z [command]/usr/local/bin/git log -1 --format=%H 2026-10-24T20:54:03.4927409Z be1d0667320de371db76221d011a65ca7adb2bfe 2026-10-24T20:54:03.5007594Z ##[group]Run files="$(git ls-files .github/pr-assets)" 2026-10-24T20:54:03.5007858Z files="$(git ls-files .github/pr-assets)" 2026-10-24T20:54:03.5008126Z if test -n "$files"; then 2026-10-24T20:54:03.5008386Z  printf 'PR evidence must be uploaded to GitHub, not committed:\n%s\n' "$files" >&2 2026-10-24T20:54:03.5008631Z  exit 1 2026-10-24T20:54:03.5008771Z fi 2026-10-24T20:54:03.5030200Z shell: /usr/bin/bash -e {0} 2026-10-24T20:54:03.5030361Z env: 2026-10-24T20:54:03.5030516Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 160 2026-10-24T20:54:03.5030699Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 347 2026-10-24T20:54:03.5030871Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:54:03.5031035Z ##[endgroup] 2026-10-24T20:54:03.5198991Z Prepare all required actions 2026-10-24T20:54:03.5199375Z Getting action download info 2026-10-24T20:54:03.6058472Z Download action repository 'voidzero-dev/setup-vp@v1' (SHA:250f29ce396baf5e8f24498e17c0dfdebabc26eb) 2026-10-24T20:54:03.7005616Z ##[group]Run ./.github/actions/setup-ci-deps 2026-10-24T20:54:03.7005804Z env: 2026-10-24T20:54:03.7005948Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 160 2026-10-24T20:54:03.7006129Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 347 2026-10-24T20:54:03.7006303Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:54:03.7006469Z ##[endgroup] 2026-10-24T20:54:03.7086673Z ##[start-action display=Resolve Vite+ version;id=__self.vp] 2026-10-24T20:54:03.7100460Z ##[group]Run echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-24T20:54:03.7100855Z echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-24T20:54:03.7101192Z echo "node=$(jq -r '.engines.node' package.json)" >> "$GITHUB_OUTPUT" 2026-10-24T20:54:03.7101465Z echo "pnpm=$(jq -r '.packageManager' package.json)" >> "$GITHUB_OUTPUT" 2026-10-24T20:54:03.7121107Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T20:54:03.7121303Z env: 2026-10-24T20:54:03.7121445Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 160 2026-10-24T20:54:03.7121618Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 347 2026-10-24T20:54:03.7121789Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:54:03.7121953Z ##[endgroup] 2026-10-24T20:54:03.7203920Z ##[end-action id=__self.vp;outcome=success;conclusion=success;duration_ms=11] 2026-10-24T20:54:03.7205396Z ##[start-action display=Cache Vite+;id=__self.vp_cache] 2026-10-24T20:54:03.7248630Z ##[group]Run actions/cache@v6 2026-10-24T20:54:03.7248947Z with: 2026-10-24T20:54:03.7249079Z path: ~/.vite-plus 2026-10-24T20:54:03.7249269Z key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T20:54:03.7249496Z enableCrossOsArchive: false 2026-10-24T20:54:03.7249654Z fail-on-cache-miss: false 2026-10-24T20:54:03.7249807Z lookup-only: false 2026-10-24T20:54:03.7249943Z save-always: false 2026-10-24T20:54:03.7250079Z env: 2026-10-24T20:54:03.7250213Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 160 2026-10-24T20:54:03.7250387Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 347 2026-10-24T20:54:03.7250556Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:54:03.7250715Z ##[endgroup] 2026-10-24T20:54:03.9229878Z Cache hit for: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T20:54:04.3207425Z Received 170349591 of 170349591 (100.0%), 433.2 MBs/sec 2026-10-24T20:54:04.3208628Z Cache Size: ~162 MB (170349591 B) 2026-10-24T20:54:04.3234290Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/a6cde79c-d230-4429-9791-d8ec42c00e19/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T20:54:05.0473531Z Cache restored successfully 2026-10-24T20:54:05.0616938Z Cache restored from key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T20:54:05.0702452Z ##[end-action id=__self.vp_cache;outcome=success;conclusion=success;duration_ms=1349] 2026-10-24T20:54:05.0704974Z ##[start-action display=Use cached Vite+;id=__self.__run] 2026-10-24T20:54:05.0724024Z ##[group]Run echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-24T20:54:05.0724257Z echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-24T20:54:05.0724434Z "$HOME/.vite-plus/bin/vp" env use "26.12.1" 2026-10-24T20:54:05.0747325Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T20:54:05.0747497Z env: 2026-10-24T20:54:05.0747619Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 160 2026-10-24T20:54:05.0747770Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 347 2026-10-24T20:54:05.0747922Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:54:05.0748103Z ##[endgroup] 2026-10-24T20:54:05.0794527Z Using Node.js v26.12.1 (resolved from 26.12.1) 2026-10-24T20:54:05.0805438Z ##[end-action id=__self.__run;outcome=success;conclusion=success;duration_ms=9] 2026-10-24T20:54:05.0807510Z ##[start-action display=Setup Vite+;id=__self.__voidzero-dev_setup-vp] 2026-10-24T20:54:05.0812918Z ##[end-action id=__self.__voidzero-dev_setup-vp;outcome=skipped;conclusion=skipped;duration_ms=0] 2026-10-24T20:54:05.0814245Z ##[start-action display=Resolve pnpm store path;id=__self.pnpm_store] 2026-10-24T20:54:05.0825234Z ##[group]Run store_path="$(vp pm cache dir)" 2026-10-24T20:54:05.0825432Z store_path="$(vp pm cache dir)" 2026-10-24T20:54:05.0825600Z echo "path=$store_path" >> "$GITHUB_OUTPUT" 2026-10-24T20:54:05.0850306Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T20:54:05.0850487Z env: 2026-10-24T20:54:05.0850610Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 160 2026-10-24T20:54:05.0850776Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 347 2026-10-24T20:54:05.0850921Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:54:05.0851057Z ##[endgroup] 2026-10-24T20:54:05.1007975Z ##[end-action id=__self.pnpm_store;outcome=success;conclusion=success;duration_ms=19] 2026-10-24T20:54:05.1009452Z ##[start-action display=Cache full pnpm store;id=__self.__actions_cache] 2026-10-24T20:54:05.1353667Z ##[group]Run actions/cache@v6 2026-10-24T20:54:05.1353799Z with: 2026-10-24T20:54:05.1353929Z path: /home/runner/.local/share/pnpm/store/v11 2026-10-24T20:54:05.1354192Z key: pnpm-full-v1-Linux-X64-bab31c3827e90e1352d302da4c761fd1b91963ae565f5f0ea70972d0942af1f6 2026-10-24T20:54:05.1354455Z restore-keys: pnpm-full-v1-Linux-X64- 2026-10-24T20:54:05.1354610Z enableCrossOsArchive: false 2026-10-24T20:54:05.1354769Z fail-on-cache-miss: false 2026-10-24T20:54:05.1354973Z lookup-only: false 2026-10-24T20:54:05.1355136Z save-always: false 2026-10-24T20:54:05.1355375Z env: 2026-10-24T20:54:05.1355555Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 160 2026-10-24T20:54:05.1355929Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 347 2026-10-24T20:54:05.1356144Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:54:05.1356337Z ##[endgroup] 2026-10-24T20:54:05.3299189Z Cache hit for: pnpm-full-v1-Linux-X64-bab31c3827e90e1352d302da4c761fd1b91963ae565f5f0ea70972d0942af1f6 2026-10-24T20:54:06.3486378Z Received 704643072 of 995395870 (70.8%), 670.7 MBs/sec 2026-10-24T20:54:06.7826047Z Received 995395870 of 995395870 (100.0%), 661.1 MBs/sec 2026-10-24T20:54:06.7827310Z Cache Size: ~949 MB (995395870 B) 2026-10-24T20:54:06.7880550Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/68b639e8-be4b-45c5-85dc-e0acd63eedc3/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T20:54:12.5205815Z Cache restored successfully 2026-10-24T20:54:12.5685031Z Cache restored from key: pnpm-full-v1-Linux-X64-bab31c3827e90e1352d302da4c761fd1b91963ae565f5f0ea70972d0942af1f6 2026-10-24T20:54:12.5754420Z ##[end-action id=__self.__actions_cache;outcome=success;conclusion=success;duration_ms=7474] 2026-10-24T20:54:12.5756568Z ##[start-action display=Install dependencies;id=__self.__run_2] 2026-10-24T20:54:12.5767504Z ##[group]Run vp install 2026-10-24T20:54:12.5767701Z vp install 2026-10-24T20:54:12.5788078Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T20:54:12.5788251Z env: 2026-10-24T20:54:12.5788371Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 160 2026-10-24T20:54:12.5788524Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 347 2026-10-24T20:54:12.5788681Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:54:12.5788820Z ##[endgroup] 2026-10-24T20:54:12.6205521Z Scope: all 34 workspace projects 2026-10-24T20:54:12.7126844Z ? Verifying lockfile against supply-chain policies (2088 entries)... 2026-10-24T20:54:13.0536821Z Packages are hard linked from the content-addressable store to the virtual store. 2026-10-24T20:54:13.0537167Z Content-addressable store is at: /home/runner/.local/share/pnpm/store/v11 2026-10-24T20:54:13.0537392Z Virtual store is at: node_modules/.pnpm 2026-10-24T20:54:15.2466904Z ✓ Lockfile passes supply-chain policies (2088 entries in 2.5s) 2026-10-24T20:54:15.2467192Z Lockfile is up to date, resolution step is skipped 2026-10-24T20:54:15.2645186Z Packages: +1721 2026-10-24T20:54:15.2645425Z ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2026-10-24T20:54:15.3039801Z Progress: resolved 1721, reused 1718, downloaded 0, added 1721, done 2026-10-24T20:54:16.3748493Z . prepare$ vp config --no-agent 2026-10-24T20:54:16.4937691Z . prepare: Done 2026-10-24T20:54:16.4953335Z 2026-10-24T20:54:16.4953757Z devDependencies: 2026-10-24T20:54:16.4953966Z + @coderabbitai/config 1.1.0 2026-10-24T20:54:16.4954112Z + @shadcn/lint 0.1.5 2026-10-24T20:54:16.4954306Z + @types/node 24.12.4 2026-10-24T20:54:16.4954449Z + knip 6.34.0 2026-10-24T20:54:16.4954591Z + typescript <- @tsc-rs/typescript 0.8.0 2026-10-24T20:54:16.4954751Z + vite-plus 1.3.0 2026-10-24T20:54:16.4954823Z 2026-10-24T20:54:16.4974636Z Done in 3.9s using pnpm v12.14.0 2026-10-24T20:54:16.5238377Z ##[end-action id=__self.__run_2;outcome=success;conclusion=success;duration_ms=3948] 2026-10-24T20:54:16.5775309Z ##[group]Run actions/cache@v6 2026-10-24T20:54:16.5775469Z with: 2026-10-24T20:54:16.5775595Z path: ~/.cache/electron 2026-10-24T20:54:16.5775833Z key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T20:54:16.5776090Z enableCrossOsArchive: false 2026-10-24T20:54:16.5776242Z fail-on-cache-miss: false 2026-10-24T20:54:16.5776376Z lookup-only: false 2026-10-24T20:54:16.5776497Z save-always: false 2026-10-24T20:54:16.5776611Z env: 2026-10-24T20:54:16.5776728Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 160 2026-10-24T20:54:16.5776881Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 347 2026-10-24T20:54:16.5777042Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:54:16.5777187Z ##[endgroup] 2026-10-24T20:54:16.7724750Z Cache hit for: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T20:54:16.9360514Z Received 122906203 of 122906203 (100.0%), 802.8 MBs/sec 2026-10-24T20:54:16.9361315Z Cache Size: ~117 MB (122906203 B) 2026-10-24T20:54:16.9380519Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/c7c67df5-8618-40d5-b3f9-658fe2bc0624/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T20:54:17.0275264Z Cache restored successfully 2026-10-24T20:54:17.0400742Z Cache restored from key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T20:54:17.0508823Z ##[group]Run vp run --filter @t3tools/desktop ensure:electron 2026-10-24T20:54:17.0509079Z vp run --filter @t3tools/desktop ensure:electron 2026-10-24T20:54:17.0531357Z shell: /usr/bin/bash -e {0} 2026-10-24T20:54:17.0531514Z env: 2026-10-24T20:54:17.0531814Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 160 2026-10-24T20:54:17.0531987Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 347 2026-10-24T20:54:17.0532141Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:54:17.0532289Z ##[endgroup] 2026-10-24T20:54:17.2272033Z ~/apps/desktop$ node scripts/ensure-electron-runtime.mjs ⊘ cache disabled 2026-10-24T20:54:17.8402178Z /home/runner/_work/t3code/t3code/node_modules/.pnpm/electron@44.9.3_supports-color@8.1.1/node_modules/electron/dist/electron 2026-10-24T20:54:17.8424800Z 2026-10-24T20:54:17.8521914Z ##[group]Run vp run knip:check 2026-10-24T20:54:17.8522104Z vp run knip:check 2026-10-24T20:54:17.8543416Z shell: /usr/bin/bash -e {0} 2026-10-24T20:54:17.8543546Z env: 2026-10-24T20:54:17.8543664Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 160 2026-10-24T20:54:17.8543821Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 347 2026-10-24T20:54:17.8543968Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:54:17.8544110Z ##[endgroup] 2026-10-24T20:54:18.0087894Z $ knip --include files,dependencies --no-config-hints ⊘ cache disabled 2026-10-24T20:54:22.0631166Z 2026-10-24T20:54:22.0634295Z $ knip --workspace apps/server --workspace apps/desktop --workspace apps/web --workspace packages/client-runtime --workspace packages/contracts --workspace packages/effect-acp --workspace packages/effect-codex-app-server --workspace packages/shared --workspace packages/ssh --workspace packages/tailscale --workspace packages/provider-core --workspace packages/provider-acp --workspace packages/provider-acp-registry --workspace packages/provider-testing --workspace packages/provider-pi --workspace packages/provider-muse --workspace packages/provider-opencode --workspace packages/provider-cursor --workspace packages/provider-grok --workspace packages/source-control-core --workspace packages/source-control-definitions --workspace packages/source-control-azure-devops --workspace packages/source-control-bitbucket --workspace packages/source-control-forgejo --workspace packages/source-control-gitcafe --workspace packages/source-control-github --workspace packages/source-control-gitlab --workspace packages/source-control-testing --exports --preprocessor ./scripts/knip-schemas.ts --no-config-hints ⊘ cache disabled 2026-10-24T20:54:31.0493475Z 2026-10-24T20:54:31.0494604Z --- 2026-10-24T20:54:31.0494929Z vp run: 2/2 successful. (Run `vp run --last-details` for full details) 2026-10-24T20:54:31.0583901Z ##[group]Run vp run --filter @t3tools/source-control-github generate --check 2026-10-24T20:54:31.0584224Z vp run --filter @t3tools/source-control-github generate --check 2026-10-24T20:54:31.0605273Z shell: /usr/bin/bash -e {0} 2026-10-24T20:54:31.0605409Z env: 2026-10-24T20:54:31.0605525Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 160 2026-10-24T20:54:31.0605685Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 347 2026-10-24T20:54:31.0605834Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:54:31.0605976Z ##[endgroup] 2026-10-24T20:54:31.2140259Z ~/packages/source-control-github$ graphqlgen --check ⊘ cache disabled 2026-10-24T20:54:31.4203073Z 2026-10-24T20:54:31.4300107Z ##[group]Run vp run --filter t3 generate --check 2026-10-24T20:54:31.4300343Z vp run --filter t3 generate --check 2026-10-24T20:54:31.4321143Z shell: /usr/bin/bash -e {0} 2026-10-24T20:54:31.4321275Z env: 2026-10-24T20:54:31.4321409Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 160 2026-10-24T20:54:31.4321566Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 347 2026-10-24T20:54:31.4321714Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:54:31.4321856Z ##[endgroup] 2026-10-24T20:54:31.5866205Z ~/apps/server$ graphqlgen --check ⊘ cache disabled 2026-10-24T20:54:31.7519611Z 2026-10-24T20:54:31.7611777Z ##[group]Run vp check 2026-10-24T20:54:31.7611946Z vp check 2026-10-24T20:54:31.7633504Z shell: /usr/bin/bash -e {0} 2026-10-24T20:54:31.7633639Z env: 2026-10-24T20:54:31.7633755Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 160 2026-10-24T20:54:31.7633912Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 347 2026-10-24T20:54:31.7634058Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:54:31.7634199Z ##[endgroup] 2026-10-24T20:54:32.3250473Z pass: All 5751 files are correctly formatted (410ms, 8 threads) 2026-10-24T20:54:37.8500644Z warn: Lint warnings found 2026-10-24T20:54:37.8502129Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T20:54:37.8502651Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:473:19] 2026-10-24T20:54:37.8502911Z 472 │ onFilters, 2026-10-24T20:54:37.8503074Z 473 │ authorOptions = [], 2026-10-24T20:54:37.8503275Z ·  ── 2026-10-24T20:54:37.8503447Z 474 │ labelOptions = [], 2026-10-24T20:54:37.8503598Z ╰──── 2026-10-24T20:54:37.8504021Z  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-24T20:54:37.8504333Z 2026-10-24T20:54:37.8504651Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T20:54:37.8505109Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:474:18] 2026-10-24T20:54:37.8505360Z 473 │ authorOptions = [], 2026-10-24T20:54:37.8505518Z 474 │ labelOptions = [], 2026-10-24T20:54:37.8505688Z ·  ── 2026-10-24T20:54:37.8505854Z 475 │ optionScope, 2026-10-24T20:54:37.8505995Z ╰──── 2026-10-24T20:54:37.8506414Z  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-24T20:54:37.8506724Z 2026-10-24T20:54:37.8507095Z ⚠ 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-24T20:54:37.8507579Z ╭─[apps/server/src/vcs/GitVcsDriverCore.test.ts:1786:34] 2026-10-24T20:54:37.8507900Z 1785 │ const stat = branch.files!.find((file) => file.path === path)!; 2026-10-24T20:54:37.8508221Z 1786 │ const request = yield* Schema.decodeEffect(ReviewDiffPreviewInput)({ 2026-10-24T20:54:37.8508515Z ·  ─────────────────── 2026-10-24T20:54:37.8508709Z 1787 │ cwd, 2026-10-24T20:54:37.8508855Z ╰──── 2026-10-24T20:54:37.8508919Z 2026-10-24T20:54:37.8509119Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T20:54:37.8509435Z ╭─[apps/mobile/src/lib/useHoverGesture.ts:8:15] 2026-10-24T20:54:37.8509630Z 7 │ () => 2026-10-24T20:54:37.8509777Z 8 │ Gesture.Hover() 2026-10-24T20:54:37.8509958Z ·  ──┬── 2026-10-24T20:54:37.8510207Z · ╰── `Hover` may be a component 2026-10-24T20:54:37.8510430Z 9 │ .manualActivation(true) 2026-10-24T20:54:37.8510585Z ╰──── 2026-10-24T20:54:37.8510936Z  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-24T20:54:37.8511703Z  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-24T20:54:37.8512138Z 2026-10-24T20:54:37.8512362Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T20:54:37.8512835Z ╭─[apps/mobile/src/lib/markdownDocument.ts:259:28] 2026-10-24T20:54:37.8513121Z 258 │ visit(parser.parse(markdown), false, false); 2026-10-24T20:54:37.8513338Z 259 │ for (const edit of edits.reverse()) 2026-10-24T20:54:37.8513547Z ·  ─────── 2026-10-24T20:54:37.8513831Z 260 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-24T20:54:37.8514061Z ╰──── 2026-10-24T20:54:37.8514395Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T20:54:37.8514655Z 2026-10-24T20:54:37.8514873Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T20:54:37.8515216Z ╭─[apps/mobile/src/lib/markdownDocument.ts:290:28] 2026-10-24T20:54:37.8515447Z 289 │ visit(parser.parse(markdown)); 2026-10-24T20:54:37.8515648Z 290 │ for (const edit of edits.reverse()) 2026-10-24T20:54:37.8515855Z ·  ─────── 2026-10-24T20:54:37.8516613Z 291 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-24T20:54:37.8516846Z ╰──── 2026-10-24T20:54:37.8517170Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T20:54:37.8517426Z 2026-10-24T20:54:37.8517643Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T20:54:37.8517973Z ╭─[apps/mobile/src/lib/markdownDocument.ts:344:38] 2026-10-24T20:54:37.8518193Z 343 │ visit(parser.parse(markdown)); 2026-10-24T20:54:37.8518409Z 344 │ for (const lineStart of lineStarts.reverse()) { 2026-10-24T20:54:37.8519097Z ·  ─────── 2026-10-24T20:54:37.8519384Z 345 │ // The header row may be a lazy line without its container markers (`>` or list indent), 2026-10-24T20:54:37.8519614Z ╰──── 2026-10-24T20:54:37.8519938Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T20:54:37.8520191Z 2026-10-24T20:54:37.8520401Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:54:37.8520722Z ╭─[apps/mobile/src/state/thread-order.ts:29:7] 2026-10-24T20:54:37.8520931Z 28 │ getPendingThreadOrder(); 2026-10-24T20:54:37.8521111Z 29 │ }, [nowMinute, snoozeWakeTick]); 2026-10-24T20:54:37.8521353Z ·  ────┬──── ───────┬────── 2026-10-24T20:54:37.8521703Z · │ ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T20:54:37.8522032Z · ╰── Unnecessary dependency `nowMinute` 2026-10-24T20:54:37.8522325Z 30 │ return pending; 2026-10-24T20:54:37.8522490Z ╰──── 2026-10-24T20:54:37.8522852Z  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-24T20:54:37.8523464Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.8523770Z 2026-10-24T20:54:37.8524148Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:54:37.8524577Z ╭─[packages/provider-grok/src/server/adapter.ts:408:7] 2026-10-24T20:54:37.8524779Z 407 │ 2026-10-24T20:54:37.8524920Z 408 │ const layer: Layer.Layer< 2026-10-24T20:54:37.8525115Z ·  ──┬── 2026-10-24T20:54:37.8525334Z · ╰── 'layer' is declared here 2026-10-24T20:54:37.8525566Z 409 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T20:54:37.8525734Z ╰──── 2026-10-24T20:54:37.8525904Z  help: Consider removing this declaration. 2026-10-24T20:54:37.8526029Z 2026-10-24T20:54:37.8526334Z ⚠ eslint(no-unused-vars): Function 'promptResponseHasMissingXAiStopReason' is declared but never used. 2026-10-24T20:54:37.8526746Z ╭─[packages/provider-grok/src/server/xaiAcpExtension.ts:1620:10] 2026-10-24T20:54:37.8526981Z 1619 │ 2026-10-24T20:54:37.8527273Z 1620 │ function promptResponseHasMissingXAiStopReason(response: EffectAcpSchema.PromptResponse): boolean { 2026-10-24T20:54:37.8527614Z ·  ──────────────────┬────────────────── 2026-10-24T20:54:37.8527947Z · ╰── 'promptResponseHasMissingXAiStopReason' is declared here 2026-10-24T20:54:37.8528225Z 1621 │ const meta = response._meta; 2026-10-24T20:54:37.8528385Z ╰──── 2026-10-24T20:54:37.8528551Z  help: Consider removing this declaration. 2026-10-24T20:54:37.8528675Z 2026-10-24T20:54:37.8528914Z ⚠ eslint(no-unneeded-ternary): Unnecessary use of boolean literals in conditional expression 2026-10-24T20:54:37.8529268Z ╭─[packages/shared/src/serverSettings.test.ts:35:7] 2026-10-24T20:54:37.8529609Z 34 │ const fallback = fallbackTextGenerationModelSelection(providerInstances, (instanceId) => 2026-10-24T20:54:37.8529905Z 35 │ instanceId === configured ? true : false, 2026-10-24T20:54:37.8530142Z ·  ──────────────────────────────────────── 2026-10-24T20:54:37.8530322Z 36 │ ); 2026-10-24T20:54:37.8530449Z ╰──── 2026-10-24T20:54:37.8530606Z  help: Remove this ternary operator 2026-10-24T20:54:37.8530723Z 2026-10-24T20:54:37.8530937Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T20:54:37.8531290Z ╭─[packages/shared/src/composerContextLegacySend.ts:19:45] 2026-10-24T20:54:37.8531572Z 18 │ const occurrences = collectComposerContextReferences(text); 2026-10-24T20:54:37.8531828Z 19 │ for (const occurrence of [...occurrences].reverse()) { 2026-10-24T20:54:37.8532078Z ·  ─────── 2026-10-24T20:54:37.8532324Z 20 │ const record = recordsById.get(occurrence.contextId); 2026-10-24T20:54:37.8532510Z ╰──── 2026-10-24T20:54:37.8532838Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T20:54:37.8533095Z 2026-10-24T20:54:37.8533358Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.8533746Z ╭─[apps/mobile/src/state/use-vcs-action-state.ts:86:5] 2026-10-24T20:54:37.8534000Z 83 │ const [nowMs, setNowMs] = useState(() => Date.now()); 2026-10-24T20:54:37.8534198Z 84 │ useEffect(() => { 2026-10-24T20:54:37.8534360Z ·  ────┬──── 2026-10-24T20:54:37.8534673Z · ╰── This is the containing effect 2026-10-24T20:54:37.8534950Z 85 │ if (!actionState.isRunning) return; 2026-10-24T20:54:37.8535133Z 86 │ setNowMs(Date.now()); 2026-10-24T20:54:37.8535297Z ·  ────┬─── 2026-10-24T20:54:37.8535555Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.8535858Z 87 │ const interval = setInterval(() => setNowMs(Date.now()), 1000); 2026-10-24T20:54:37.8536054Z ╰──── 2026-10-24T20:54:37.8536769Z  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-24T20:54:37.8537665Z  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-24T20:54:37.8537981Z 2026-10-24T20:54:37.8538195Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-24T20:54:37.8538529Z ╭─[apps/web/src/contextMenuFallback.test.ts:38:9] 2026-10-24T20:54:37.8538738Z 37 │ get isConnected() { 2026-10-24T20:54:37.8538925Z 38 │ let current: FakeElement | null = this; 2026-10-24T20:54:37.8539111Z ·  ─────── 2026-10-24T20:54:37.8539277Z 39 │ while (current?.parent) { 2026-10-24T20:54:37.8539429Z ╰──── 2026-10-24T20:54:37.8539766Z  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-24T20:54:37.8540033Z 2026-10-24T20:54:37.8540251Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T20:54:37.8540590Z ╭─[packages/client-runtime/src/state/filesystem.ts:3:8] 2026-10-24T20:54:37.8540810Z 2 │ AuthFilesystemReadScope, 2026-10-24T20:54:37.8540978Z 3 │ type AuthSessionState, 2026-10-24T20:54:37.8541157Z ·  ────────┬─────── 2026-10-24T20:54:37.8541406Z · ╰── 'AuthSessionState' is imported here 2026-10-24T20:54:37.8541635Z 4 │ type FilesystemBrowseEntry, 2026-10-24T20:54:37.8541786Z ╰──── 2026-10-24T20:54:37.8541951Z  help: Consider removing this import. 2026-10-24T20:54:37.8542069Z 2026-10-24T20:54:37.8542333Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.8542728Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:60:5] 2026-10-24T20:54:37.8542936Z 57 │ 2026-10-24T20:54:37.8543068Z 58 │ useEffect(() => { 2026-10-24T20:54:37.8543233Z ·  ────┬──── 2026-10-24T20:54:37.8543452Z · ╰── This is the containing effect 2026-10-24T20:54:37.8543692Z 59 │ const controller = new AbortController(); 2026-10-24T20:54:37.8543881Z 60 │ setLoadState("pending"); 2026-10-24T20:54:37.8544057Z ·  ──────┬───── 2026-10-24T20:54:37.8544321Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.8544656Z 61 │ // A renewed signature is used on Retry, not as a reason to reset the native player. 2026-10-24T20:54:37.8544877Z ╰──── 2026-10-24T20:54:37.8545621Z  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-24T20:54:37.8546564Z  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-24T20:54:37.8546878Z 2026-10-24T20:54:37.8547089Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:54:37.8547428Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:71:7] 2026-10-24T20:54:37.8547665Z 70 │ return () => controller.abort(); 2026-10-24T20:54:37.8547872Z 71 │ }, [player, props.playRequested, attempt]); 2026-10-24T20:54:37.8548173Z ·  ───┬── ─────────┬───────── ───┬─── 2026-10-24T20:54:37.8548567Z · │ │ ╰── Unnecessary dependency `attempt` 2026-10-24T20:54:37.8548982Z · │ ╰── Unnecessary dependency `props.playRequested` 2026-10-24T20:54:37.8549314Z · ╰── Unnecessary dependency `player_0` 2026-10-24T20:54:37.8549521Z 72 │ 2026-10-24T20:54:37.8549637Z ╰──── 2026-10-24T20:54:37.8549998Z  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-24T20:54:37.8550609Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.8550917Z 2026-10-24T20:54:37.8551127Z ⚠ eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used. 2026-10-24T20:54:37.8551422Z ╭─[apps/web/src/types.ts:22:3] 2026-10-24T20:54:37.8551611Z 21 │ EnvironmentThreadShell, 2026-10-24T20:54:37.8551772Z 22 │ ThreadRunSummary, 2026-10-24T20:54:37.8551942Z ·  ────────┬─────── 2026-10-24T20:54:37.8552183Z · ╰── 'ThreadRunSummary' is imported here 2026-10-24T20:54:37.8552402Z 23 │ ThreadRuntimeSummary, 2026-10-24T20:54:37.8552551Z ╰──── 2026-10-24T20:54:37.8552710Z  help: Consider removing this import. 2026-10-24T20:54:37.8552830Z 2026-10-24T20:54:37.8553106Z ⚠ eslint(no-unsafe-optional-chaining): Unsafe usage of optional chaining 2026-10-24T20:54:37.8553522Z ╭─[apps/server/src/orchestration-v2/ThreadLaunchService.test.ts:1783:8] 2026-10-24T20:54:37.8553767Z 1782 │ assert.equal( 2026-10-24T20:54:37.8554004Z 1783 │ (stored.context?.records[0] as { attachmentId: string }).attachmentId, 2026-10-24T20:54:37.8554274Z ·  ────────────────────────── 2026-10-24T20:54:37.8554475Z 1784 │ stored.attachments[0]?.id, 2026-10-24T20:54:37.8554639Z ╰──── 2026-10-24T20:54:37.8554877Z  help: If this short-circuits with 'undefined' the evaluation will throw TypeError 2026-10-24T20:54:37.8555060Z 2026-10-24T20:54:37.8555327Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.8555761Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:79:5] 2026-10-24T20:54:37.8556002Z 76 │ 2026-10-24T20:54:37.8556130Z 77 │ useEffect(() => { 2026-10-24T20:54:37.8556331Z ·  ────┬──── 2026-10-24T20:54:37.8556555Z · ╰── This is the containing effect 2026-10-24T20:54:37.8556824Z 78 │ const { host, code } = parsePairingUrl(connectionPairingUrl); 2026-10-24T20:54:37.8557042Z 79 │ setHostInput(host); 2026-10-24T20:54:37.8557210Z ·  ──────┬───── 2026-10-24T20:54:37.8557477Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.8557716Z 80 │ setCodeInput(code); 2026-10-24T20:54:37.8557862Z ╰──── 2026-10-24T20:54:37.8558608Z  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-24T20:54:37.8559492Z  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-24T20:54:37.8559806Z 2026-10-24T20:54:37.8560069Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.8560497Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:89:5] 2026-10-24T20:54:37.8560767Z 82 │ 2026-10-24T20:54:37.8560896Z 83 │ useEffect(() => { 2026-10-24T20:54:37.8561059Z ·  ────┬──── 2026-10-24T20:54:37.8561282Z · ╰── This is the containing effect 2026-10-24T20:54:37.8561521Z 84 │ if (routePairingUrl.length === 0) { 2026-10-24T20:54:37.8561693Z 85 │ return; 2026-10-24T20:54:37.8561832Z 86 │ } 2026-10-24T20:54:37.8561953Z 87 │ 2026-10-24T20:54:37.8562131Z 88 │ const { host, code } = parsePairingUrl(routePairingUrl); 2026-10-24T20:54:37.8562338Z 89 │ setHostInput(host); 2026-10-24T20:54:37.8562505Z ·  ──────┬───── 2026-10-24T20:54:37.8562770Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.8563006Z 90 │ setCodeInput(code); 2026-10-24T20:54:37.8563152Z ╰──── 2026-10-24T20:54:37.8563910Z  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-24T20:54:37.8564891Z  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-24T20:54:37.8565212Z 2026-10-24T20:54:37.8565474Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.8565897Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:95:7] 2026-10-24T20:54:37.8566126Z 92 │ 2026-10-24T20:54:37.8566292Z 93 │ useEffect(() => { 2026-10-24T20:54:37.8566451Z ·  ────┬──── 2026-10-24T20:54:37.8566679Z · ╰── This is the containing effect 2026-10-24T20:54:37.8566910Z 94 │ if (pairingConnectionError) { 2026-10-24T20:54:37.8567097Z 95 │ setIsSubmitting(false); 2026-10-24T20:54:37.8567291Z ·  ───────┬─────── 2026-10-24T20:54:37.8567582Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.8567813Z 96 │ } 2026-10-24T20:54:37.8567934Z ╰──── 2026-10-24T20:54:37.8568702Z  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-24T20:54:37.8569607Z  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-24T20:54:37.8569920Z 2026-10-24T20:54:37.8570406Z ⚠ 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-24T20:54:37.8570961Z ╭─[packages/shared/src/atomicWrite.test.ts:139:5] 2026-10-24T20:54:37.8571179Z 138 │ Effect.gen(function* () { 2026-10-24T20:54:37.8571480Z 139 │ ╭─▶ while (fiber.pollUnsafe() === undefined) { 2026-10-24T20:54:37.8571794Z 140 │ │ yield* TestClock.adjust("100 millis"); 2026-10-24T20:54:37.8572274Z 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-24T20:54:37.8572774Z 142 │ │ yield* Effect.promise(() => new Promise((resolve) => setImmediate(resolve))); 2026-10-24T20:54:37.8573102Z 143 │ ╰─▶ } 2026-10-24T20:54:37.8573333Z 144 │ return yield* Fiber.join(fiber); 2026-10-24T20:54:37.8573498Z ╰──── 2026-10-24T20:54:37.8573556Z 2026-10-24T20:54:37.8573825Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.8574227Z ╭─[apps/mobile/src/components/VideoPreviewModal.ios.tsx:63:55] 2026-10-24T20:54:37.8574445Z 61 │ }, []); 2026-10-24T20:54:37.8574586Z 62 │ useEffect(() => { 2026-10-24T20:54:37.8574745Z ·  ────┬──── 2026-10-24T20:54:37.8575041Z · ╰── This is the containing effect 2026-10-24T20:54:37.8575372Z 63 │ if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl); 2026-10-24T20:54:37.8575657Z ·  ───────┬────── 2026-10-24T20:54:37.8576001Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.8576315Z 64 │ }, [playbackUrl, resolvedUrl]); 2026-10-24T20:54:37.8576475Z ╰──── 2026-10-24T20:54:37.8577147Z  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-24T20:54:37.8578028Z  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-24T20:54:37.8578337Z 2026-10-24T20:54:37.8578503Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:54:37.8578829Z ╭─[apps/mobile/src/features/connection/ConnectionStatusDot.tsx:58:7] 2026-10-24T20:54:37.8579096Z 53 │ function usePulseAnimation(pulse: boolean) { 2026-10-24T20:54:37.8579318Z 54 │ const pulseProgress = useSharedValue(0); 2026-10-24T20:54:37.8579514Z ·  ──────┬────── 2026-10-24T20:54:37.8579758Z · ╰── `pulseProgress` originates here 2026-10-24T20:54:37.8579966Z 55 │ 2026-10-24T20:54:37.8580101Z 56 │ useEffect(() => { 2026-10-24T20:54:37.8580260Z 57 │ if (pulse) { 2026-10-24T20:54:37.8580443Z 58 │ pulseProgress.value = withRepeat( 2026-10-24T20:54:37.8580633Z ·  ──────┬────── 2026-10-24T20:54:37.8580876Z · ╰── `pulseProgress` cannot be modified 2026-10-24T20:54:37.8581091Z 59 │ withTiming(1, { 2026-10-24T20:54:37.8581232Z ╰──── 2026-10-24T20:54:37.8581572Z  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-24T20:54:37.8582154Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:54:37.8582452Z 2026-10-24T20:54:37.8582667Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T20:54:37.8583008Z ╭─[packages/client-runtime/src/state/usageAccess.ts:3:8] 2026-10-24T20:54:37.8583234Z 2 │ AuthDiagnosticsReadScope, 2026-10-24T20:54:37.8583401Z 3 │ type AuthSessionState, 2026-10-24T20:54:37.8583581Z ·  ────────┬─────── 2026-10-24T20:54:37.8583829Z · ╰── 'AuthSessionState' is imported here 2026-10-24T20:54:37.8584051Z 4 │ sessionGrantsScope, 2026-10-24T20:54:37.8584193Z ╰──── 2026-10-24T20:54:37.8584354Z  help: Consider removing this import. 2026-10-24T20:54:37.8584470Z 2026-10-24T20:54:37.8584621Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:54:37.8584898Z ╭─[apps/mobile/src/components/ui/Menu.tsx:54:36] 2026-10-24T20:54:37.8585295Z 53 │ const child = children as ReactElement>; 2026-10-24T20:54:37.8585700Z 54 │ ╭─▶ children = cloneElement(child, { 2026-10-24T20:54:37.8585980Z 55 │ │ onTouchStart: (event) => { 2026-10-24T20:54:37.8586303Z 56 │ │ // Reset for a new touch, not onPressIn, which also fires when a 2026-10-24T20:54:37.8586631Z 57 │ │ // finger moves out of the row and back during the same gesture. 2026-10-24T20:54:37.8586931Z 58 │ │ menuPress.current.isPreparing = false; 2026-10-24T20:54:37.8587245Z 59 │ │ menuPress.current.suppressPress = menuPress.current.isOpen; 2026-10-24T20:54:37.8587533Z 60 │ │ pendingPress.current = null; 2026-10-24T20:54:37.8587797Z 61 │ │ child.props.onTouchStart?.(event); 2026-10-24T20:54:37.8588016Z 62 │ │ }, 2026-10-24T20:54:37.8588222Z 63 │ │ onPress: (event) => { 2026-10-24T20:54:37.8588511Z 64 │ │ // Accessibility clicks have no touch identifier and must not inherit 2026-10-24T20:54:37.8588828Z 65 │ │ // cancellation from a previous physical gesture. 2026-10-24T20:54:37.8589146Z 66 │ │ const isTouch = typeof event.nativeEvent.identifier === "number"; 2026-10-24T20:54:37.8589527Z 67 │ │ if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) { 2026-10-24T20:54:37.8589814Z 68 │ │ return; 2026-10-24T20:54:37.8590006Z 69 │ │ } 2026-10-24T20:54:37.8590259Z 70 │ │ if (isTouch && menuPress.current.isPreparing) { 2026-10-24T20:54:37.8590592Z 71 │ │ // A release can arrive between native menu preparation and display. 2026-10-24T20:54:37.8590937Z 72 │ │ // Let UIKit's display/cancel callback decide this press's outcome. 2026-10-24T20:54:37.8591232Z 73 │ │ event.persist(); 2026-10-24T20:54:37.8591530Z 74 │ │ pendingPress.current = () => child.props.onPress?.(event); 2026-10-24T20:54:37.8591791Z 75 │ │ return; 2026-10-24T20:54:37.8591975Z 76 │ │ } 2026-10-24T20:54:37.8592194Z 77 │ │ child.props.onPress?.(event); 2026-10-24T20:54:37.8592403Z 78 │ │ }, 2026-10-24T20:54:37.8592644Z 79 │ ├─▶ }); 2026-10-24T20:54:37.8593034Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T20:54:37.8593371Z 80 │ menuProps.onMenuInteractionStart = () => { 2026-10-24T20:54:37.8593549Z ╰──── 2026-10-24T20:54:37.8594085Z  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-24T20:54:37.8594811Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:54:37.8595098Z 2026-10-24T20:54:37.8595481Z ⚠ eslint(no-unused-vars): Variable 'layerUnavailable' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:54:37.8595956Z ╭─[apps/server/src/orchestration-v2/Orchestrator.ts:12395:7] 2026-10-24T20:54:37.8596209Z 12394 │ 2026-10-24T20:54:37.8596422Z 12395 │ const layerUnavailable: Layer.Layer = Layer.succeed( 2026-10-24T20:54:37.8596678Z ·  ────────┬─────── 2026-10-24T20:54:37.8596936Z · ╰── 'layerUnavailable' is declared here 2026-10-24T20:54:37.8597166Z 12396 │ OrchestratorV2, 2026-10-24T20:54:37.8597310Z ╰──── 2026-10-24T20:54:37.8597482Z  help: Consider removing this declaration. 2026-10-24T20:54:37.8597603Z 2026-10-24T20:54:37.8597780Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:54:37.8598093Z ╭─[apps/web/src/hooks/useThreadActions.ts:821:56] 2026-10-24T20:54:37.8598342Z 820 │ const resolved = resolveThreadTarget(target); 2026-10-24T20:54:37.8598703Z 821 │ if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) { 2026-10-24T20:54:37.8599003Z ·  ─────┬──── 2026-10-24T20:54:37.8599313Z · ╰── Cannot call impure function 2026-10-24T20:54:37.8599565Z 822 │ return AsyncResult.failure( 2026-10-24T20:54:37.8599722Z ╰──── 2026-10-24T20:54:37.8600069Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T20:54:37.8600643Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:54:37.8600934Z 2026-10-24T20:54:37.8601109Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:54:37.8601405Z ╭─[apps/web/src/hooks/useThreadActions.ts:709:46] 2026-10-24T20:54:37.8601616Z 708 │ const wokeAt = resolved 2026-10-24T20:54:37.8601855Z 709 │ ? threadWokeAt(resolved.thread, { now: new Date().toISOString() }) 2026-10-24T20:54:37.8602130Z ·  ─────┬──── 2026-10-24T20:54:37.8602422Z · ╰── Cannot call impure function 2026-10-24T20:54:37.8602650Z 710 │ : null; 2026-10-24T20:54:37.8602784Z ╰──── 2026-10-24T20:54:37.8603134Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T20:54:37.8603700Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:54:37.8603986Z 2026-10-24T20:54:37.8604253Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.8604681Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:333:7] 2026-10-24T20:54:37.8604921Z 328 │ }; 2026-10-24T20:54:37.8605057Z 329 │ useEffect(() => { 2026-10-24T20:54:37.8605222Z ·  ────┬──── 2026-10-24T20:54:37.8605448Z · ╰── This is the containing effect 2026-10-24T20:54:37.8605696Z 330 │ if (!guidesEnabled && section === "guide") { 2026-10-24T20:54:37.8606014Z 331 │ requestedSection.current = "overview"; 2026-10-24T20:54:37.8606399Z 332 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-24T20:54:37.8606653Z 333 │ setSection("overview"); 2026-10-24T20:54:37.8606829Z ·  ─────┬──── 2026-10-24T20:54:37.8607103Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.8607333Z 334 │ } 2026-10-24T20:54:37.8607461Z ╰──── 2026-10-24T20:54:37.8608127Z  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-24T20:54:37.8609007Z  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-24T20:54:37.8609322Z 2026-10-24T20:54:37.8609537Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T20:54:37.8609924Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:335:6] 2026-10-24T20:54:37.8610204Z 330 │ if (!guidesEnabled && section === "guide") { 2026-10-24T20:54:37.8610426Z 331 │ requestedSection.current = "overview"; 2026-10-24T20:54:37.8610630Z ·  ────────┬─────── 2026-10-24T20:54:37.8611200Z · ╰── 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-24T20:54:37.8611777Z 332 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-24T20:54:37.8612121Z ·  ─────────┬───────── ──────┬────── 2026-10-24T20:54:37.8612796Z · │ ╰── 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-24T20:54:37.8613697Z · ╰── 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-24T20:54:37.8614282Z 333 │ setSection("overview"); 2026-10-24T20:54:37.8614475Z 334 │ } 2026-10-24T20:54:37.8614641Z 335 │ }, [guidesEnabled, section, insets.top]); 2026-10-24T20:54:37.8614883Z ·  ──────────────────┬───────────────── 2026-10-24T20:54:37.8615206Z · ╰── This dependency list is missing values used by the callback 2026-10-24T20:54:37.8615491Z 336 │ const tabContent = activityContent; 2026-10-24T20:54:37.8615658Z ╰──── 2026-10-24T20:54:37.8615896Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T20:54:37.8616425Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.8616733Z 2026-10-24T20:54:37.8616953Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T20:54:37.8617344Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:877:6] 2026-10-24T20:54:37.8617587Z 860 │ if ( 2026-10-24T20:54:37.8617779Z 861 │ lastSelection.current.path === route.params.path && 2026-10-24T20:54:37.8618004Z ·  ──────┬────── 2026-10-24T20:54:37.8618548Z · ╰── 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-24T20:54:37.8619080Z 862 │ lastSelection.current.id === route.params.fileSelectionId 2026-10-24T20:54:37.8619282Z 863 │ ) 2026-10-24T20:54:37.8619417Z 864 │ return; 2026-10-24T20:54:37.8636039Z 865 │ lastSelection.current = { path: route.params.path, id: route.params.fileSelectionId }; 2026-10-24T20:54:37.8636411Z 866 │ if (route.params.focus) navigation.setParams({ focus: undefined }); 2026-10-24T20:54:37.8636654Z 867 │ setJumpPath(route.params.path); 2026-10-24T20:54:37.8636837Z 868 │ setSelectedRowId(null); 2026-10-24T20:54:37.8637006Z 869 │ jumpStarted.current = false; 2026-10-24T20:54:37.8637256Z 870 │ const file = data.files.find((entry) => entry.path === route.params.path); 2026-10-24T20:54:37.8637509Z 871 │ if (!file || !nativeView.current) return; 2026-10-24T20:54:37.8637718Z ·  ─────┬──── 2026-10-24T20:54:37.8638280Z · ╰── 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-24T20:54:37.8639809Z 872 │ setCollapsedIds((ids) => ids.filter((id) => id !== file.id)); 2026-10-24T20:54:37.8640033Z 873 │ jumpStarted.current = true; 2026-10-24T20:54:37.8640274Z 874 │ void nativeView.current.scrollToFile(file.id, false).catch(() => { 2026-10-24T20:54:37.8640509Z 875 │ jumpStarted.current = false; 2026-10-24T20:54:37.8640668Z 876 │ }); 2026-10-24T20:54:37.8640934Z 877 │ }, [route.params.path, route.params.fileSelectionId, route.params.focus, data.files, navigation]); 2026-10-24T20:54:37.8641363Z ·  ──────────────────────────────────────────────┬────────────────────────────────────────────── 2026-10-24T20:54:37.8641789Z · ╰── This dependency list is missing values used by the callback 2026-10-24T20:54:37.8642115Z 878 │ const appliedFilter = useRef(filter.hideTestFiles); 2026-10-24T20:54:37.8642436Z ╰──── 2026-10-24T20:54:37.8642722Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T20:54:37.8643224Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.8643530Z 2026-10-24T20:54:37.8643911Z ⚠ 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-24T20:54:37.8644372Z ╭─[packages/contracts/src/auth.test.ts:17:12] 2026-10-24T20:54:37.8644671Z 16 │ it("decodes legacy review credentials without offering them in new grants", () => { 2026-10-24T20:54:37.8645020Z 17 │ expect(Schema.decodeUnknownSync(AuthEnvironmentScopes)(["review:write"])).toEqual([ 2026-10-24T20:54:37.8645312Z ·  ──────────────────────── 2026-10-24T20:54:37.8645497Z 18 │ "review:write", 2026-10-24T20:54:37.8645641Z ╰──── 2026-10-24T20:54:37.8645698Z 2026-10-24T20:54:37.8646072Z ⚠ 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-24T20:54:37.8646571Z ╭─[packages/contracts/src/auth.test.ts:20:18] 2026-10-24T20:54:37.8646758Z 19 │ ]); 2026-10-24T20:54:37.8646995Z 20 │ expect(() => Schema.decodeUnknownSync(AuthGrantScopes)(["review:write"])).toThrow(); 2026-10-24T20:54:37.8647283Z ·  ──────────────────────── 2026-10-24T20:54:37.8647536Z 21 │ expect(AuthStandardClientScopes).not.toContain("review:write"); 2026-10-24T20:54:37.8647738Z ╰──── 2026-10-24T20:54:37.8647806Z 2026-10-24T20:54:37.8648175Z ⚠ 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-24T20:54:37.8648627Z ╭─[packages/contracts/src/auth.test.ts:58:21] 2026-10-24T20:54:37.8648924Z 57 │ it("ignores unknown response permissions without falling back to broader scopes", () => { 2026-10-24T20:54:37.8649235Z 58 │ const session = Schema.decodeUnknownSync(AuthSessionState)({ 2026-10-24T20:54:37.8649488Z ·  ──────────────────────── 2026-10-24T20:54:37.8649683Z 59 │ authenticated: true, 2026-10-24T20:54:37.8649825Z ╰──── 2026-10-24T20:54:37.8649884Z 2026-10-24T20:54:37.8650124Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T20:54:37.8650497Z ╭─[packages/client-runtime/src/operations/projects.ts:238:51] 2026-10-24T20:54:37.8650718Z 237 │ ): string { 2026-10-24T20:54:37.8650957Z 238 │ const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? ""; 2026-10-24T20:54:37.8651245Z ·  ────── 2026-10-24T20:54:37.8651508Z 239 │ return target.owner ? `${target.owner}/${folderName}` : folderName; 2026-10-24T20:54:37.8651713Z ╰──── 2026-10-24T20:54:37.8651947Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T20:54:37.8652127Z 2026-10-24T20:54:37.8652302Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:54:37.8652629Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:372:47] 2026-10-24T20:54:37.8653019Z 371 │ const { open, onOpenChange, onSnooze, timestampFormat } = props; 2026-10-24T20:54:37.8653358Z 372 │ const presets = open ? resolveSnoozePresets(new Date(), timestampFormat) : []; 2026-10-24T20:54:37.8653642Z ·  ─────┬──── 2026-10-24T20:54:37.8653940Z · ╰── Cannot call impure function 2026-10-24T20:54:37.8654163Z 373 │ return ( 2026-10-24T20:54:37.8654295Z ╰──── 2026-10-24T20:54:37.8654641Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T20:54:37.8655218Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:54:37.8655515Z 2026-10-24T20:54:37.8655690Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:54:37.8656014Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:853:39] 2026-10-24T20:54:37.8656306Z 852 │ if (snoozeGateClock.thread !== thread) { 2026-10-24T20:54:37.8656557Z 853 │ setSnoozeGateClock({ thread, now: new Date().toISOString() }); 2026-10-24T20:54:37.8656816Z ·  ─────┬──── 2026-10-24T20:54:37.8657103Z · ╰── Cannot call impure function 2026-10-24T20:54:37.8657316Z 854 │ } 2026-10-24T20:54:37.8657438Z ╰──── 2026-10-24T20:54:37.8657778Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T20:54:37.8658353Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:54:37.8658641Z 2026-10-24T20:54:37.8658791Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:54:37.8659107Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:152:27] 2026-10-24T20:54:37.8659454Z 151 │ 2026-10-24T20:54:37.8659724Z 152 │ {props.children(open)} 2026-10-24T20:54:37.8659923Z ·  ──┬─ 2026-10-24T20:54:37.8660199Z · ╰── Cannot access ref value during render 2026-10-24T20:54:37.8660425Z 153 │ 2026-10-24T20:54:37.8660569Z ╰──── 2026-10-24T20:54:37.8661107Z  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-24T20:54:37.8661833Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:54:37.8662113Z 2026-10-24T20:54:37.8662318Z ⚠ react(memo-dependencies): Found missing/extra memoization dependencies 2026-10-24T20:54:37.8662669Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:140:9] 2026-10-24T20:54:37.8662913Z 139 │ if (action.id !== undefined) { 2026-10-24T20:54:37.8663101Z 140 │ props.onPressAction?.({ 2026-10-24T20:54:37.8663357Z ·  ──┬── 2026-10-24T20:54:37.8663627Z · ╰── Missing dependency `props` 2026-10-24T20:54:37.8663905Z 141 │ nativeEvent: { event: action.id }, 2026-10-24T20:54:37.8664171Z 142 │ } as Parameters>[0]); 2026-10-24T20:54:37.8664392Z 143 │ } 2026-10-24T20:54:37.8664520Z 144 │ }, 2026-10-24T20:54:37.8664677Z 145 │ [close, props.onPressAction], 2026-10-24T20:54:37.8664880Z ·  ─────────┬───────── 2026-10-24T20:54:37.8665210Z · ╰── Overly precise dependency `props.onPressAction`, use `props` instead 2026-10-24T20:54:37.8665474Z 146 │ ); 2026-10-24T20:54:37.8665597Z ╰──── 2026-10-24T20:54:37.8666149Z  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-24T20:54:37.8666951Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.8667253Z 2026-10-24T20:54:37.8667718Z ⚠ 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-24T20:54:37.8668267Z ╭─[packages/contracts/src/baseSchemas.test.ts:39:9] 2026-10-24T20:54:37.8668479Z 38 │ JSON.stringify( 2026-10-24T20:54:37.8668700Z 39 │ Schema.encodeUnknownSync(Schema.toCodecJson(Named))([ 2026-10-24T20:54:37.8668940Z ·  ──────────────────────── 2026-10-24T20:54:37.8669124Z 40 │ { name: "a" }, 2026-10-24T20:54:37.8669265Z ╰──── 2026-10-24T20:54:37.8669325Z 2026-10-24T20:54:37.8669501Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:54:37.8669812Z ╭─[apps/web/src/components/CustomSnoozeDialog.tsx:140:58] 2026-10-24T20:54:37.8670103Z 139 │ {...(weekStartsOn === undefined ? {} : { weekStartsOn })} 2026-10-24T20:54:37.8670399Z 140 │ disabled={{ before: new Date(new Date().setHours(0, 0, 0, 0)) }} 2026-10-24T20:54:37.8670683Z ·  ─────┬──── 2026-10-24T20:54:37.8671074Z · ╰── Cannot call impure function 2026-10-24T20:54:37.8671384Z 141 │ onSelect={(selected) => { 2026-10-24T20:54:37.8671554Z ╰──── 2026-10-24T20:54:37.8671895Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T20:54:37.8672468Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:54:37.8672755Z 2026-10-24T20:54:37.8672970Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-24T20:54:37.8673285Z ╭─[packages/contracts/src/rpc.ts:297:8] 2026-10-24T20:54:37.8673478Z 296 │ } from "./device.ts"; 2026-10-24T20:54:37.8673667Z 297 │ import {} from "./previewAutomation.ts"; 2026-10-24T20:54:37.8673851Z ·  ── 2026-10-24T20:54:37.8673996Z 298 │ import { 2026-10-24T20:54:37.8674117Z ╰──── 2026-10-24T20:54:37.8674259Z  help: Remove empty braces 2026-10-24T20:54:37.8674362Z 2026-10-24T20:54:37.8674843Z ⚠ 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-24T20:54:37.8675419Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:169:7] 2026-10-24T20:54:37.8675640Z 168 │ }); 2026-10-24T20:54:37.8675928Z 169 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T20:54:37.8676373Z 170 │ │ if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break; 2026-10-24T20:54:37.8676688Z 171 │ │ yield* Effect.yieldNow; 2026-10-24T20:54:37.8676948Z 172 │ ╰─▶ } 2026-10-24T20:54:37.8677151Z 173 │ 2026-10-24T20:54:37.8677270Z ╰──── 2026-10-24T20:54:37.8677330Z 2026-10-24T20:54:37.8677802Z ⚠ 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-24T20:54:37.8678372Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:178:7] 2026-10-24T20:54:37.8678715Z 177 │ yield* Deferred.succeed(releaseSave, undefined); 2026-10-24T20:54:37.8679052Z 178 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T20:54:37.8679386Z 179 │ │ if ((yield* Ref.get(saved)).length > 0) break; 2026-10-24T20:54:37.8679638Z 180 │ │ yield* Effect.yieldNow; 2026-10-24T20:54:37.8679900Z 181 │ ╰─▶ } 2026-10-24T20:54:37.8680096Z 182 │ 2026-10-24T20:54:37.8680218Z ╰──── 2026-10-24T20:54:37.8680275Z 2026-10-24T20:54:37.8680743Z ⚠ 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-24T20:54:37.8681317Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7] 2026-10-24T20:54:37.8681696Z 306 │ yield* Deferred.succeed(releaseUnenrichedSave, undefined); 2026-10-24T20:54:37.8682082Z 307 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T20:54:37.8682394Z 308 │ │ const values = yield* Ref.get(saved); 2026-10-24T20:54:37.8682738Z 309 │ │ if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) { 2026-10-24T20:54:37.8683025Z 310 │ │ break; 2026-10-24T20:54:37.8683216Z 311 │ │ } 2026-10-24T20:54:37.8683424Z 312 │ │ yield* Effect.yieldNow; 2026-10-24T20:54:37.8683685Z 313 │ ╰─▶ } 2026-10-24T20:54:37.8683880Z 314 │ 2026-10-24T20:54:37.8683997Z ╰──── 2026-10-24T20:54:37.8684065Z 2026-10-24T20:54:37.8684537Z ⚠ 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-24T20:54:37.8685109Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1680:7] 2026-10-24T20:54:37.8685371Z 1679 │ yield* harness.replaceSession; 2026-10-24T20:54:37.8685692Z 1680 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T20:54:37.8686049Z 1681 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) { 2026-10-24T20:54:37.8686346Z 1682 │ │ break; 2026-10-24T20:54:37.8686537Z 1683 │ │ } 2026-10-24T20:54:37.8686750Z 1684 │ │ yield* Effect.yieldNow; 2026-10-24T20:54:37.8687013Z 1685 │ ╰─▶ } 2026-10-24T20:54:37.8687229Z 1686 │ yield* Queue.offer( 2026-10-24T20:54:37.8687381Z ╰──── 2026-10-24T20:54:37.8687437Z 2026-10-24T20:54:37.8687903Z ⚠ 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-24T20:54:37.8688477Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1789:7] 2026-10-24T20:54:37.8688725Z 1788 │ yield* harness.replaceSession; 2026-10-24T20:54:37.8689048Z 1789 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T20:54:37.8689409Z 1790 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break; 2026-10-24T20:54:37.8689686Z 1791 │ │ yield* Effect.yieldNow; 2026-10-24T20:54:37.8689939Z 1792 │ ╰─▶ } 2026-10-24T20:54:37.8690211Z 1793 │ expect(yield* Ref.get(harness.subscriptionCount)).toBe(2); 2026-10-24T20:54:37.8690409Z ╰──── 2026-10-24T20:54:37.8690467Z 2026-10-24T20:54:37.8690664Z ⚠ eslint(no-unused-vars): Identifier 'Arr' is imported but never used. 2026-10-24T20:54:37.8690985Z ╭─[packages/client-runtime/src/state/threadSort.ts:4:13] 2026-10-24T20:54:37.8691248Z 3 │ import type { EnvironmentThreadShell } from "./models.ts"; 2026-10-24T20:54:37.8691538Z 4 │ import * as Arr from "effect/Array"; 2026-10-24T20:54:37.8691749Z ·  ─┬─ 2026-10-24T20:54:37.8691963Z · ╰── 'Arr' is imported here 2026-10-24T20:54:37.8692179Z 5 │ import * as Order from "effect/Order"; 2026-10-24T20:54:37.8692335Z ╰──── 2026-10-24T20:54:37.8692490Z  help: Consider removing this import. 2026-10-24T20:54:37.8692606Z 2026-10-24T20:54:37.8692803Z ⚠ eslint(no-unused-vars): Identifier 'Order' is imported but never used. 2026-10-24T20:54:37.8693124Z ╭─[packages/client-runtime/src/state/threadSort.ts:5:13] 2026-10-24T20:54:37.8693346Z 4 │ import * as Arr from "effect/Array"; 2026-10-24T20:54:37.8693528Z 5 │ import * as Order from "effect/Order"; 2026-10-24T20:54:37.8693710Z ·  ──┬── 2026-10-24T20:54:37.8693941Z · ╰── 'Order' is imported here 2026-10-24T20:54:37.8694137Z 6 │ 2026-10-24T20:54:37.8694245Z ╰──── 2026-10-24T20:54:37.8694399Z  help: Consider removing this import. 2026-10-24T20:54:37.8694513Z 2026-10-24T20:54:37.8694686Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:54:37.8694973Z ╭─[apps/web/src/components/Sidebar.tsx:1136:11] 2026-10-24T20:54:37.8695201Z 1135 │ foldSearchQuery(threadSearchQuery), 2026-10-24T20:54:37.8695382Z 1136 │ Date.now(), 2026-10-24T20:54:37.8695551Z ·  ─────┬──── 2026-10-24T20:54:37.8695784Z · ╰── Cannot call impure function 2026-10-24T20:54:37.8696067Z 1137 │ // A list filter, as on mobile: a pick would move rows unexplained. 2026-10-24T20:54:37.8696315Z ╰──── 2026-10-24T20:54:37.8696669Z  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-24T20:54:37.8697246Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:54:37.8697531Z 2026-10-24T20:54:37.8697751Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T20:54:37.8698064Z ╭─[apps/mobile/src/Stack.tsx:1079:21] 2026-10-24T20:54:37.8698248Z 1078 │ } 2026-10-24T20:54:37.8698746Z ·  ───────────────────────────────────────────── 2026-10-24T20:54:37.8698970Z 1080 │ screenOptions={({ route }) => 2026-10-24T20:54:37.8699130Z ╰──── 2026-10-24T20:54:37.8699550Z  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-24T20:54:37.8699885Z 2026-10-24T20:54:37.8700093Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T20:54:37.8700438Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:231:6] 2026-10-24T20:54:37.8700757Z 227 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-24T20:54:37.8701027Z 228 │ nativeEventSnapshotsRef.current, 2026-10-24T20:54:37.8701231Z ·  ───────────┬─────────── 2026-10-24T20:54:37.8701883Z · ╰── 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-24T20:54:37.8702412Z 229 │ mostRecentEventCount, 2026-10-24T20:54:37.8702561Z 230 │ ); 2026-10-24T20:54:37.8702752Z 231 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-24T20:54:37.8703035Z ·  ──────────────────────────┬────────────────────────── 2026-10-24T20:54:37.8703375Z · ╰── This dependency list is missing values used by the callback 2026-10-24T20:54:37.8703652Z 232 │ const assumedValue = props.value; 2026-10-24T20:54:37.8703805Z ╰──── 2026-10-24T20:54:37.8704033Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T20:54:37.8704530Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.8704834Z 2026-10-24T20:54:37.8705054Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T20:54:37.8705405Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:239:7] 2026-10-24T20:54:37.8705701Z 238 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-24T20:54:37.8705950Z 239 │ nativeEventSnapshotsRef.current, 2026-10-24T20:54:37.8706154Z ·  ───────────┬─────────── 2026-10-24T20:54:37.8706765Z · ╰── 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-24T20:54:37.8707255Z 240 │ controlledEventCount, 2026-10-24T20:54:37.8707412Z 241 │ assumedValue, 2026-10-24T20:54:37.8707552Z 242 │ ); 2026-10-24T20:54:37.8707778Z 243 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-24T20:54:37.8708087Z ·  ───────────┬────────── 2026-10-24T20:54:37.8708434Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-24T20:54:37.8708717Z 244 │ const acceptNativeEvent = useCallback( 2026-10-24T20:54:37.8708876Z ╰──── 2026-10-24T20:54:37.8709366Z  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-24T20:54:37.8710069Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.8710377Z 2026-10-24T20:54:37.8710527Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:54:37.8710816Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29] 2026-10-24T20:54:37.8711090Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T20:54:37.8711344Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T20:54:37.8711599Z ·  ─────────────┬──────────── 2026-10-24T20:54:37.8711979Z · ╰── Cannot access ref value during render 2026-10-24T20:54:37.8712235Z 165 │ }); 2026-10-24T20:54:37.8712353Z ╰──── 2026-10-24T20:54:37.8712883Z  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-24T20:54:37.8713605Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:54:37.8713886Z 2026-10-24T20:54:37.8714034Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:54:37.8714322Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29] 2026-10-24T20:54:37.8714599Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T20:54:37.8714853Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T20:54:37.8715104Z ·  ─────────────┬──────────── 2026-10-24T20:54:37.8715439Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T20:54:37.8715690Z 165 │ }); 2026-10-24T20:54:37.8715808Z ╰──── 2026-10-24T20:54:37.8716367Z  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-24T20:54:37.8717091Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:54:37.8717374Z 2026-10-24T20:54:37.8717523Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:54:37.8717813Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:166:23] 2026-10-24T20:54:37.8718016Z 165 │ }); 2026-10-24T20:54:37.8718171Z 166 │ confirmedTokensRef.current = tokens; 2026-10-24T20:54:37.8718406Z ·  ─────────┬────────────┬─── 2026-10-24T20:54:37.8718787Z · │ ╰── Cannot update ref value during render 2026-10-24T20:54:37.8719081Z · ╰── This value is a ref 2026-10-24T20:54:37.8719281Z 167 │ return JSON.stringify( 2026-10-24T20:54:37.8719423Z ╰──── 2026-10-24T20:54:37.8720040Z  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-24T20:54:37.8720803Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:54:37.8721083Z 2026-10-24T20:54:37.8721233Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:54:37.8721523Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:208:5] 2026-10-24T20:54:37.8721741Z 207 │ mostRecentEventCount, 2026-10-24T20:54:37.8721921Z 208 │ nativeEventSnapshotsRef.current, 2026-10-24T20:54:37.8722137Z ·  ───────────────┬─────────────── 2026-10-24T20:54:37.8722513Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T20:54:37.8722753Z 209 │ ); 2026-10-24T20:54:37.8722867Z ╰──── 2026-10-24T20:54:37.8723391Z  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-24T20:54:37.8724105Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:54:37.8724384Z 2026-10-24T20:54:37.8724531Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:54:37.8724819Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:214:5] 2026-10-24T20:54:37.8725041Z 213 │ mostRecentEventCount, 2026-10-24T20:54:37.8725220Z 214 │ nativeEventSnapshotsRef.current, 2026-10-24T20:54:37.8725432Z ·  ───────────────┬─────────────── 2026-10-24T20:54:37.8725731Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T20:54:37.8725972Z 215 │ ); 2026-10-24T20:54:37.8726084Z ╰──── 2026-10-24T20:54:37.8726639Z  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-24T20:54:37.8727350Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:54:37.8727632Z 2026-10-24T20:54:37.8727828Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T20:54:37.8728157Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:199:6] 2026-10-24T20:54:37.8728429Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T20:54:37.8728684Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T20:54:37.8728931Z ·  ─────────┬──────── 2026-10-24T20:54:37.8729528Z · ╰── 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-24T20:54:37.8730005Z 165 │ }); 2026-10-24T20:54:37.8730245Z 166 │ confirmedTokensRef.current = tokens; 2026-10-24T20:54:37.8730468Z 167 │ return JSON.stringify( 2026-10-24T20:54:37.8730728Z 168 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-24T20:54:37.8730974Z 169 │ const record = 2026-10-24T20:54:37.8731142Z 170 │ token.type === "context" 2026-10-24T20:54:37.8731410Z 171 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-24T20:54:37.8731649Z 172 │ : undefined; 2026-10-24T20:54:37.8731845Z 173 │ const presentation = contextChipPresentation( 2026-10-24T20:54:37.8732084Z 174 │ token.type === "context" ? token.kind : token.type, 2026-10-24T20:54:37.8732274Z 175 │ record, 2026-10-24T20:54:37.8732416Z 176 │ ); 2026-10-24T20:54:37.8732574Z 177 │ const icon = contextChipIcon( 2026-10-24T20:54:37.8732751Z 178 │ presentation, 2026-10-24T20:54:37.8732992Z 179 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-24T20:54:37.8733212Z 180 │ ); 2026-10-24T20:54:37.8733345Z 181 │ return { 2026-10-24T20:54:37.8733495Z 182 │ type: token.type, 2026-10-24T20:54:37.8733663Z 183 │ source: token.source, 2026-10-24T20:54:37.8733832Z 184 │ start: token.start, 2026-10-24T20:54:37.8733995Z 185 │ end: token.end, 2026-10-24T20:54:37.8734236Z 186 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-24T20:54:37.8734460Z 187 │ label: 2026-10-24T20:54:37.8734618Z 188 │ token.type === "skill" 2026-10-24T20:54:37.8734831Z 189 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-24T20:54:37.8735044Z 190 │ : token.type === "context" 2026-10-24T20:54:37.8735396Z 191 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-24T20:54:37.8735719Z 192 │ : basename(token.value), 2026-10-24T20:54:37.8735969Z 193 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-24T20:54:37.8736263Z 194 │ iconUri: contextChipIconUri(icon), 2026-10-24T20:54:37.8736465Z 195 │ tintsIcon: icon.kind === "chip", 2026-10-24T20:54:37.8736637Z 196 │ }; 2026-10-24T20:54:37.8736767Z 197 │ }), 2026-10-24T20:54:37.8736894Z 198 │ ); 2026-10-24T20:54:37.8737097Z 199 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-24T20:54:37.8737411Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-24T20:54:37.8737779Z · ╰── This dependency list is missing values used by the callback 2026-10-24T20:54:37.8738125Z 200 │ // Every render resolves against the snapshot history, so a render whose 2026-10-24T20:54:37.8738332Z ╰──── 2026-10-24T20:54:37.8738602Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T20:54:37.8739129Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.8739430Z 2026-10-24T20:54:37.8739623Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T20:54:37.8739948Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:261:5] 2026-10-24T20:54:37.8740317Z 253 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-24T20:54:37.8740602Z 254 │ nativeEventSnapshotsRef.current.push({ 2026-10-24T20:54:37.8740822Z ·  ───────────┬─────────── 2026-10-24T20:54:37.8741396Z · ╰── 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-24T20:54:37.8741903Z 255 │ eventCount: acknowledgedEventCount, 2026-10-24T20:54:37.8742078Z 256 │ value, 2026-10-24T20:54:37.8742237Z 257 │ selection: nextSelection, 2026-10-24T20:54:37.8742399Z 258 │ }); 2026-10-24T20:54:37.8742553Z 259 │ return acknowledgedEventCount; 2026-10-24T20:54:37.8742721Z 260 │ }, 2026-10-24T20:54:37.8742844Z 261 │ [], 2026-10-24T20:54:37.8742992Z ·  ─┬ 2026-10-24T20:54:37.8743265Z · ╰── This dependency list is missing values used by the callback 2026-10-24T20:54:37.8743505Z 262 │ ); 2026-10-24T20:54:37.8743622Z ╰──── 2026-10-24T20:54:37.8743887Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T20:54:37.8744413Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.8744712Z 2026-10-24T20:54:37.8745177Z ⚠ 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-24T20:54:37.8745737Z ╭─[packages/contracts/src/composerContext.test.ts:181:18] 2026-10-24T20:54:37.8746031Z 180 │ it("sends a message without the records the wire cannot carry", () => { 2026-10-24T20:54:37.8746396Z 181 │ const wire = Schema.encodeUnknownSync(Schema.toCodecJson(OrchestrationMessageContext))({ 2026-10-24T20:54:37.8746697Z ·  ──────────────────────── 2026-10-24T20:54:37.8746879Z 182 │ version: 1, 2026-10-24T20:54:37.8747011Z ╰──── 2026-10-24T20:54:37.8747073Z 2026-10-24T20:54:37.8747224Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:54:37.8747499Z ╭─[apps/mobile/src/native/StackHeader.tsx:185:9] 2026-10-24T20:54:37.8747700Z 184 │ "options", 2026-10-24T20:54:37.8747881Z 185 │ latestOptionFunctionsRef.current, 2026-10-24T20:54:37.8748108Z ·  ────────────────┬─────────────── 2026-10-24T20:54:37.8748430Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T20:54:37.8748723Z 186 │ optionFunctionWrappersRef.current, 2026-10-24T20:54:37.8748892Z ╰──── 2026-10-24T20:54:37.8749425Z  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-24T20:54:37.8750145Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:54:37.8750428Z 2026-10-24T20:54:37.8750577Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:54:37.8750930Z ╭─[apps/mobile/src/native/StackHeader.tsx:186:9] 2026-10-24T20:54:37.8751190Z 185 │ latestOptionFunctionsRef.current, 2026-10-24T20:54:37.8751400Z 186 │ optionFunctionWrappersRef.current, 2026-10-24T20:54:37.8751628Z ·  ────────────────┬──────────────── 2026-10-24T20:54:37.8751937Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T20:54:37.8752220Z 187 │ ) as NativeStackNavigationOptions) 2026-10-24T20:54:37.8752386Z ╰──── 2026-10-24T20:54:37.8752914Z  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-24T20:54:37.8753638Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:54:37.8753927Z 2026-10-24T20:54:37.8754125Z ⚠ eslint(require-yield): This generator function does not have `yield` 2026-10-24T20:54:37.8754463Z ╭─[packages/provider-acp/src/server/mcpOverAcpBridge.ts:81:78] 2026-10-24T20:54:37.8754678Z  80 │ 2026-10-24T20:54:37.8755020Z  81 │ ╭─▶ export const makeAcpMcpOverAcpBridge = Effect.fn("AcpMcpOverAcpBridge.make")(function* ( 2026-10-24T20:54:37.8755405Z  82 │ │ options: AcpMcpOverAcpBridgeOptions, 2026-10-24T20:54:37.8755664Z  83 │ │ ): Effect.fn.Return { 2026-10-24T20:54:37.8755972Z  84 │ │ const fetchImplementation = options.fetchImplementation ?? fetch; 2026-10-24T20:54:37.8756325Z  85 │ │ const connections = new Map(); 2026-10-24T20:54:37.8756550Z  86 │ │ 2026-10-24T20:54:37.8756859Z  87 │ │ const connectionFor = (connectionId: string): Effect.Effect => 2026-10-24T20:54:37.8757180Z  88 │ │ Effect.suspend(() => { 2026-10-24T20:54:37.8757436Z  89 │ │ const connection = connections.get(connectionId); 2026-10-24T20:54:37.8757699Z  90 │ │ return connection === undefined 2026-10-24T20:54:37.8758039Z  91 │ │ ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`)) 2026-10-24T20:54:37.8758365Z  92 │ │ : Effect.succeed(connection); 2026-10-24T20:54:37.8758743Z  93 │ │ }); 2026-10-24T20:54:37.8758959Z  94 │ │ 2026-10-24T20:54:37.8759139Z  95 │ │ const send = ( 2026-10-24T20:54:37.8759344Z  96 │ │ connection: Connection, 2026-10-24T20:54:37.8759556Z  97 │ │ message: unknown, 2026-10-24T20:54:37.8759828Z  98 │ │ ): Effect.Effect, AcpMcpOverAcpError> => 2026-10-24T20:54:37.8760116Z  99 │ │ connection.mutex.withPermits(1)( 2026-10-24T20:54:37.8760356Z 100 │ │ Effect.gen(function* () { 2026-10-24T20:54:37.8760606Z 101 │ │ const body = JSON.stringify(message); 2026-10-24T20:54:37.8760886Z 102 │ │ if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) { 2026-10-24T20:54:37.8761265Z 103 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB.")); 2026-10-24T20:54:37.8761560Z 104 │ │ } 2026-10-24T20:54:37.8761797Z 105 │ │ const response = yield* Effect.tryPromise({ 2026-10-24T20:54:37.8762044Z 106 │ │ try: (signal) => 2026-10-24T20:54:37.8762295Z 107 │ │ fetchImplementation(options.endpoint, { 2026-10-24T20:54:37.8762545Z 108 │ │ method: "POST", 2026-10-24T20:54:37.8762758Z 109 │ │ signal, 2026-10-24T20:54:37.8762968Z 110 │ │ headers: { 2026-10-24T20:54:37.8763211Z 111 │ │ "content-type": "application/json", 2026-10-24T20:54:37.8763508Z 112 │ │ accept: "application/json, text/event-stream", 2026-10-24T20:54:37.8763798Z 113 │ │ authorization: options.authorization, 2026-10-24T20:54:37.8764073Z 114 │ │ ...(connection.sessionId === null 2026-10-24T20:54:37.8764308Z 115 │ │ ? {} 2026-10-24T20:54:37.8764570Z 116 │ │ : { "mcp-session-id": connection.sessionId }), 2026-10-24T20:54:37.8764857Z 117 │ │ ...(connection.protocolVersion === null 2026-10-24T20:54:37.8765098Z 118 │ │ ? {} 2026-10-24T20:54:37.8765379Z 119 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-24T20:54:37.8765638Z 120 │ │ }, 2026-10-24T20:54:37.8765839Z 121 │ │ body, 2026-10-24T20:54:37.8766041Z 122 │ │ }), 2026-10-24T20:54:37.8766290Z 123 │ │ catch: bridgeError, 2026-10-24T20:54:37.8766500Z 124 │ │ }); 2026-10-24T20:54:37.8766821Z 125 │ │ connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId; 2026-10-24T20:54:37.8767142Z 126 │ │ if (!response.ok) { 2026-10-24T20:54:37.8767369Z 127 │ │ yield* Effect.promise( 2026-10-24T20:54:37.8767679Z 128 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-24T20:54:37.8767949Z 129 │ │ ); 2026-10-24T20:54:37.8768162Z 130 │ │ return yield* Effect.fail( 2026-10-24T20:54:37.8768566Z 131 │ │ new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`), 2026-10-24T20:54:37.8768888Z 132 │ │ ); 2026-10-24T20:54:37.8769068Z 133 │ │ } 2026-10-24T20:54:37.8769384Z 134 │ │ const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))]; 2026-10-24T20:54:37.8769718Z 135 │ │ for (const payload of payloads) { 2026-10-24T20:54:37.8770073Z 136 │ │ connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion; 2026-10-24T20:54:37.8770372Z 137 │ │ } 2026-10-24T20:54:37.8770571Z 138 │ │ return payloads; 2026-10-24T20:54:37.8770825Z 139 │ │ }).pipe(Effect.mapError(bridgeError)), 2026-10-24T20:54:37.8771047Z 140 │ │ ); 2026-10-24T20:54:37.8771219Z 141 │ │ 2026-10-24T20:54:37.8771490Z 142 │ │ const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* ( 2026-10-24T20:54:37.8771807Z 143 │ │ request: AcpSchema.DisconnectMcpRequest, 2026-10-24T20:54:37.8772139Z 144 │ │ ): Effect.fn.Return { 2026-10-24T20:54:37.8772499Z 145 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T20:54:37.8772797Z 146 │ │ connections.delete(request.connectionId); 2026-10-24T20:54:37.8773067Z 147 │ │ const sessionId = connection.sessionId; 2026-10-24T20:54:37.8773315Z 148 │ │ if (sessionId !== null) { 2026-10-24T20:54:37.8773572Z 149 │ │ const response = yield* Effect.tryPromise({ 2026-10-24T20:54:37.8773818Z 150 │ │ try: (signal) => 2026-10-24T20:54:37.8774065Z 151 │ │ fetchImplementation(options.endpoint, { 2026-10-24T20:54:37.8774314Z 152 │ │ method: "DELETE", 2026-10-24T20:54:37.8774524Z 153 │ │ signal, 2026-10-24T20:54:37.8774728Z 154 │ │ headers: { 2026-10-24T20:54:37.8774971Z 155 │ │ authorization: options.authorization, 2026-10-24T20:54:37.8775243Z 156 │ │ "mcp-session-id": sessionId, 2026-10-24T20:54:37.8775514Z 157 │ │ ...(connection.protocolVersion === null 2026-10-24T20:54:37.8775764Z 158 │ │ ? {} 2026-10-24T20:54:37.8776047Z 159 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-24T20:54:37.8776341Z 160 │ │ }, 2026-10-24T20:54:37.8776527Z 161 │ │ }), 2026-10-24T20:54:37.8776734Z 162 │ │ catch: bridgeError, 2026-10-24T20:54:37.8776926Z 163 │ │ }); 2026-10-24T20:54:37.8777161Z 164 │ │ if (!response.ok && response.status !== 404) { 2026-10-24T20:54:37.8777417Z 165 │ │ return yield* Effect.fail( 2026-10-24T20:54:37.8777652Z 166 │ │ new AcpMcpOverAcpError( 2026-10-24T20:54:37.8778040Z 167 │ │ `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`, 2026-10-24T20:54:37.8778340Z 168 │ │ ), 2026-10-24T20:54:37.8778519Z 169 │ │ ); 2026-10-24T20:54:37.8778694Z 170 │ │ } 2026-10-24T20:54:37.8778899Z 171 │ │ yield* Effect.promise( 2026-10-24T20:54:37.8779201Z 172 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-24T20:54:37.8779462Z 173 │ │ ); 2026-10-24T20:54:37.8779640Z 174 │ │ } 2026-10-24T20:54:37.8779823Z 175 │ │ return {}; 2026-10-24T20:54:37.8779999Z 176 │ │ }); 2026-10-24T20:54:37.8780160Z 177 │ │ 2026-10-24T20:54:37.8780331Z 178 │ │ return { 2026-10-24T20:54:37.8780615Z 179 │ │ connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) { 2026-10-24T20:54:37.8780925Z 180 │ │ if (request.serverId !== "t3-code") { 2026-10-24T20:54:37.8781169Z 181 │ │ return yield* Effect.fail( 2026-10-24T20:54:37.8781488Z 182 │ │ new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`), 2026-10-24T20:54:37.8781756Z 183 │ │ ); 2026-10-24T20:54:37.8781931Z 184 │ │ } 2026-10-24T20:54:37.8782157Z 185 │ │ if (connections.size >= MAX_CONNECTIONS) { 2026-10-24T20:54:37.8782517Z 186 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections.")); 2026-10-24T20:54:37.8782801Z 187 │ │ } 2026-10-24T20:54:37.8783063Z 188 │ │ const connectionId = yield* options.allocateConnectionId; 2026-10-24T20:54:37.8783347Z 189 │ │ connections.set(connectionId, { 2026-10-24T20:54:37.8783598Z 190 │ │ mutex: yield* Semaphore.make(1), 2026-10-24T20:54:37.8783826Z 191 │ │ sessionId: null, 2026-10-24T20:54:37.8784050Z 192 │ │ protocolVersion: null, 2026-10-24T20:54:37.8784274Z 193 │ │ nextRequestId: 0, 2026-10-24T20:54:37.8784469Z 194 │ │ }); 2026-10-24T20:54:37.8784677Z 195 │ │ return { connectionId }; 2026-10-24T20:54:37.8784871Z 196 │ │ }), 2026-10-24T20:54:37.8785149Z 197 │ │ message: Effect.fn("mcpOverAcpBridge.message")(function* (request) { 2026-10-24T20:54:37.8785496Z 198 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T20:54:37.8785792Z 199 │ │ const id = ++connection.nextRequestId; 2026-10-24T20:54:37.8786059Z 200 │ │ const payloads = yield* send(connection, { 2026-10-24T20:54:37.8786329Z 201 │ │ jsonrpc: "2.0", 2026-10-24T20:54:37.8786527Z 202 │ │ id, 2026-10-24T20:54:37.8786738Z 203 │ │ method: request.method, 2026-10-24T20:54:37.8787022Z 204 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-24T20:54:37.8787268Z 205 │ │ }); 2026-10-24T20:54:37.8787624Z 206 │ │ const response = payloads.find((payload) => asEnvelope(payload)?.id === id); 2026-10-24T20:54:37.8787979Z 207 │ │ const envelope = asEnvelope(response); 2026-10-24T20:54:37.8788217Z 208 │ │ if (envelope === null) { 2026-10-24T20:54:37.8788450Z 209 │ │ return yield* Effect.fail( 2026-10-24T20:54:37.8788765Z 210 │ │ new AcpMcpOverAcpError("MCP server did not return a matching response."), 2026-10-24T20:54:37.8789033Z 211 │ │ ); 2026-10-24T20:54:37.8789209Z 212 │ │ } 2026-10-24T20:54:37.8789421Z 213 │ │ if (envelope.error !== undefined) { 2026-10-24T20:54:37.8789757Z 214 │ │ return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error))); 2026-10-24T20:54:37.8790030Z 215 │ │ } 2026-10-24T20:54:37.8790308Z 216 │ │ return (envelope.result ?? null) as AcpSchema.MessageMcpResponse; 2026-10-24T20:54:37.8790564Z 217 │ │ }), 2026-10-24T20:54:37.8790856Z 218 │ │ notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) { 2026-10-24T20:54:37.8791213Z 219 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T20:54:37.8791488Z 220 │ │ yield* send(connection, { 2026-10-24T20:54:37.8791709Z 221 │ │ jsonrpc: "2.0", 2026-10-24T20:54:37.8791928Z 222 │ │ method: request.method, 2026-10-24T20:54:37.8792208Z 223 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-24T20:54:37.8792453Z 224 │ │ }); 2026-10-24T20:54:37.8792631Z 225 │ │ }), 2026-10-24T20:54:37.8792821Z 226 │ │ disconnect, 2026-10-24T20:54:37.8793036Z 227 │ │ dispose: Effect.suspend(() => 2026-10-24T20:54:37.8793260Z 228 │ │ Effect.forEach( 2026-10-24T20:54:37.8793487Z 229 │ │ [...connections.keys()], 2026-10-24T20:54:37.8793788Z 230 │ │ (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore), 2026-10-24T20:54:37.8794066Z 231 │ │ { discard: true }, 2026-10-24T20:54:37.8794260Z 232 │ │ ), 2026-10-24T20:54:37.8794437Z 233 │ │ ), 2026-10-24T20:54:37.8794606Z 234 │ │ }; 2026-10-24T20:54:37.8794842Z 235 │ ╰─▶ }); 2026-10-24T20:54:37.8795036Z ╰──── 2026-10-24T20:54:37.8795352Z  help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed. 2026-10-24T20:54:37.8795595Z 2026-10-24T20:54:37.8795800Z ⚠ eslint(no-unused-vars): Type 'EnvironmentId' is imported but never used. 2026-10-24T20:54:37.8796142Z ╭─[packages/client-runtime/src/state/sharedSettings.ts:2:3] 2026-10-24T20:54:37.8796495Z 1 │ import type { 2026-10-24T20:54:37.8796636Z 2 │ EnvironmentId, 2026-10-24T20:54:37.8796794Z ·  ──────┬────── 2026-10-24T20:54:37.8797025Z · ╰── 'EnvironmentId' is imported here 2026-10-24T20:54:37.8797259Z 3 │ ExecutionEnvironmentCapabilities, 2026-10-24T20:54:37.8797417Z ╰──── 2026-10-24T20:54:37.8797646Z  help: Consider removing this import. 2026-10-24T20:54:37.8797800Z 2026-10-24T20:54:37.8798015Z ⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used. 2026-10-24T20:54:37.8798365Z ╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10] 2026-10-24T20:54:37.8798654Z 21 │ 2026-10-24T20:54:37.8798881Z 22 │ function summarizePayload(payload: unknown): Readonly> { 2026-10-24T20:54:37.8799140Z ·  ────────┬─────── 2026-10-24T20:54:37.8799397Z · ╰── 'summarizePayload' is declared here 2026-10-24T20:54:37.8799652Z 23 │ if (payload === null) return { valueType: "null" }; 2026-10-24T20:54:37.8799823Z ╰──── 2026-10-24T20:54:37.8799986Z  help: Consider removing this declaration. 2026-10-24T20:54:37.8800106Z 2026-10-24T20:54:37.8800397Z ⚠ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:54:37.8800814Z ╭─[apps/web/src/components/preview/PreviewPanelShell.tsx:61:9] 2026-10-24T20:54:37.8801029Z 60 │ ) { 2026-10-24T20:54:37.8801264Z 61 │ const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded"; 2026-10-24T20:54:37.8801521Z ·  ──────┬────── 2026-10-24T20:54:37.8801767Z · ╰── 'useDragRegion' is declared here 2026-10-24T20:54:37.8802004Z 62 │ const isInline = props.mode === "inline"; 2026-10-24T20:54:37.8802170Z ╰──── 2026-10-24T20:54:37.8802334Z  help: Consider removing this declaration. 2026-10-24T20:54:37.8802456Z 2026-10-24T20:54:37.8802695Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T20:54:37.8803049Z ╭─[apps/server/src/terminal/Manager.test.ts:731:31] 2026-10-24T20:54:37.8803248Z 730 │ ); 2026-10-24T20:54:37.8803494Z 731 │ const snapshot = events.filter((event) => event.type === "snapshot").at(-1)?.snapshot; 2026-10-24T20:54:37.8803779Z ·  ────── 2026-10-24T20:54:37.8804009Z 732 │ expect(snapshot?.history).toBe("aa😀\rEND"); 2026-10-24T20:54:37.8804187Z ╰──── 2026-10-24T20:54:37.8804418Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T20:54:37.8804598Z 2026-10-24T20:54:37.8804873Z ⚠ unicorn(prefer-add-event-listener): Prefer `addEventListener()` over their `on`-function counterparts. 2026-10-24T20:54:37.8805277Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:12:14] 2026-10-24T20:54:37.8805596Z 11 │ addEventListener(_type: string, listener: (event: { data: string }) => void) { 2026-10-24T20:54:37.8805844Z 12 │ this.onmessage = listener; 2026-10-24T20:54:37.8806028Z ·  ───────── 2026-10-24T20:54:37.8806222Z 13 │ } 2026-10-24T20:54:37.8806344Z ╰──── 2026-10-24T20:54:37.8806728Z  help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on` replaces any previously registered handler. 2026-10-24T20:54:37.8812370Z 2026-10-24T20:54:37.8812603Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-24T20:54:37.8812956Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:16:9] 2026-10-24T20:54:37.8813315Z 15 │ constructor() { 2026-10-24T20:54:37.8813517Z 16 │ source = this; 2026-10-24T20:54:37.8813676Z ·  ────── 2026-10-24T20:54:37.8813819Z 17 │ } 2026-10-24T20:54:37.8813935Z ╰──── 2026-10-24T20:54:37.8814267Z  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-24T20:54:37.8814524Z 2026-10-24T20:54:37.8814710Z ⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`. 2026-10-24T20:54:37.8815014Z ╭─[apps/web/src/terminal/ghostty/core.ts:194:19] 2026-10-24T20:54:37.8815273Z 193 │ const count = Math.min(CHUNK_SIZE, graphemeLength - start); 2026-10-24T20:54:37.8815503Z 194 │ const codes = new Array(count); 2026-10-24T20:54:37.8815797Z ·  ──────────────────────── 2026-10-24T20:54:37.8816028Z 195 │ for (let index = 0; index < count; index += 1) { 2026-10-24T20:54:37.8816235Z ╰──── 2026-10-24T20:54:37.8816720Z  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-24T20:54:37.8817102Z 2026-10-24T20:54:37.8817312Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:54:37.8817663Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7] 2026-10-24T20:54:37.8817918Z 256 │ return () => cancelAnimationFrame(frame); 2026-10-24T20:54:37.8818112Z 257 │ }, [props.path, targetIndex]); 2026-10-24T20:54:37.8818293Z ·  ─────┬──── 2026-10-24T20:54:37.8818541Z · ╰── Unnecessary dependency `props.path` 2026-10-24T20:54:37.8818753Z 258 │ 2026-10-24T20:54:37.8818864Z ╰──── 2026-10-24T20:54:37.8819224Z  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-24T20:54:37.8819824Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.8820124Z 2026-10-24T20:54:37.8820323Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T20:54:37.8820669Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23] 2026-10-24T20:54:37.8820899Z 292 │ 2026-10-24T20:54:37.8823262Z ·  ─────────── 2026-10-24T20:54:37.8823438Z 310 │ {body} 2026-10-24T20:54:37.8823580Z ╰──── 2026-10-24T20:54:37.8823789Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T20:54:37.8823946Z 2026-10-24T20:54:37.8824164Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T20:54:37.8824497Z ╭─[apps/web/src/lib/announce.browser.test.ts:41:46] 2026-10-24T20:54:37.8824687Z 40 │ 2026-10-24T20:54:37.8824858Z 41 │ expect(regionTexts()).toEqual([...first].reverse()); 2026-10-24T20:54:37.8825096Z ·  ─────── 2026-10-24T20:54:37.8825312Z 42 │ expect(regionTexts()).toContain("Claude"); 2026-10-24T20:54:37.8825476Z ╰──── 2026-10-24T20:54:37.8825796Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T20:54:37.8826054Z 2026-10-24T20:54:37.8826348Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.8826741Z ╭─[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5] 2026-10-24T20:54:37.8826944Z 150 │ 2026-10-24T20:54:37.8827068Z 151 │ useEffect(() => { 2026-10-24T20:54:37.8827227Z ·  ────┬──── 2026-10-24T20:54:37.8827449Z · ╰── This is the containing effect 2026-10-24T20:54:37.8827673Z 152 │ if (!controlledSelectedPath) { 2026-10-24T20:54:37.8827839Z 153 │ return; 2026-10-24T20:54:37.8827974Z 154 │ } 2026-10-24T20:54:37.8828124Z 155 │ setExpandedPaths((current) => { 2026-10-24T20:54:37.8828312Z ·  ────────┬─────── 2026-10-24T20:54:37.8828588Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.8828889Z 156 │ const ancestors = ancestorPaths(controlledSelectedPath); 2026-10-24T20:54:37.8829079Z ╰──── 2026-10-24T20:54:37.8829745Z  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-24T20:54:37.8830614Z  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-24T20:54:37.8830925Z 2026-10-24T20:54:37.8831209Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T20:54:37.8831586Z ╭─[apps/web/src/lib/composerContextReferences.ts:90:40] 2026-10-24T20:54:37.8831808Z 89 │ let cursor = prompt.length; 2026-10-24T20:54:37.8832010Z 90 │ for (const occurrence of occurrences.reverse()) { 2026-10-24T20:54:37.8832238Z ·  ─────── 2026-10-24T20:54:37.8832433Z 91 │ let { start, end } = occurrence; 2026-10-24T20:54:37.8832585Z ╰──── 2026-10-24T20:54:37.8832906Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T20:54:37.8833161Z 2026-10-24T20:54:37.8833410Z ⚠ eslint(no-unused-vars): Function 'normalizeTerminalContextSelection' is declared but never used. 2026-10-24T20:54:37.8833771Z ╭─[apps/web/src/lib/terminalContext.ts:56:10] 2026-10-24T20:54:37.8833955Z 55 │ 2026-10-24T20:54:37.8834115Z 56 │ function normalizeTerminalContextSelection( 2026-10-24T20:54:37.8834343Z ·  ────────────────┬──────────────── 2026-10-24T20:54:37.8834657Z · ╰── 'normalizeTerminalContextSelection' is declared here 2026-10-24T20:54:37.8834931Z 57 │ selection: TerminalContextSelection, 2026-10-24T20:54:37.8835091Z ╰──── 2026-10-24T20:54:37.8835252Z  help: Consider removing this declaration. 2026-10-24T20:54:37.8835375Z 2026-10-24T20:54:37.8835608Z ⚠ eslint(no-unused-vars): Function 'resolveThreadWorkspaceCwd' is declared but never used. 2026-10-24T20:54:37.8835945Z ╭─[apps/server/src/checkpointing/Utils.ts:12:10] 2026-10-24T20:54:37.8836129Z 11 │ 2026-10-24T20:54:37.8836324Z 12 │ function resolveThreadWorkspaceCwd(input: { 2026-10-24T20:54:37.8836549Z ·  ────────────┬──────────── 2026-10-24T20:54:37.8836829Z · ╰── 'resolveThreadWorkspaceCwd' is declared here 2026-10-24T20:54:37.8837061Z 13 │ readonly thread: { 2026-10-24T20:54:37.8837197Z ╰──── 2026-10-24T20:54:37.8837355Z  help: Consider removing this declaration. 2026-10-24T20:54:37.8837474Z 2026-10-24T20:54:37.8837953Z ⚠ 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-24T20:54:37.8838594Z ╭─[apps/server/src/background/HostPowerMonitor.test.ts:133:11] 2026-10-24T20:54:37.8838897Z 132 │ const monitor = yield* HostPowerMonitor.HostPowerMonitor; 2026-10-24T20:54:37.8839195Z 133 │ ╭─▶ for ( 2026-10-24T20:54:37.8839446Z 134 │ │ let attempt = 0; 2026-10-24T20:54:37.8839733Z 135 │ │ attempt < 100 && (yield* monitor.snapshot).onBattery !== "true"; 2026-10-24T20:54:37.8840003Z 136 │ │ attempt += 1 2026-10-24T20:54:37.8840200Z 137 │ │ ) { 2026-10-24T20:54:37.8840414Z 138 │ │ yield* Effect.yieldNow; 2026-10-24T20:54:37.8840676Z 139 │ ╰─▶ } 2026-10-24T20:54:37.8840946Z 140 │ expect((yield* monitor.snapshot).onBattery).toBe("true"); 2026-10-24T20:54:37.8841136Z ╰──── 2026-10-24T20:54:37.8841194Z 2026-10-24T20:54:37.8841511Z ⚠ eslint(no-unused-vars): Function 'assertUserMessagesExclude' is declared but never used. 2026-10-24T20:54:37.8841939Z ╭─[apps/server/src/orchestration-v2/testkit/fixtures/shared.ts:1398:10] 2026-10-24T20:54:37.8842164Z 1397 │ 2026-10-24T20:54:37.8842313Z 1398 │ function assertUserMessagesExclude( 2026-10-24T20:54:37.8842529Z ·  ────────────┬──────────── 2026-10-24T20:54:37.8842807Z · ╰── 'assertUserMessagesExclude' is declared here 2026-10-24T20:54:37.8843084Z 1399 │ projection: OrchestrationV2ThreadProjection, 2026-10-24T20:54:37.8843262Z ╰──── 2026-10-24T20:54:37.8843424Z  help: Consider removing this declaration. 2026-10-24T20:54:37.8843545Z 2026-10-24T20:54:37.8843925Z ⚠ 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-24T20:54:37.8844393Z ╭─[apps/server/src/auth/RpcAuthorization.ts:237:17] 2026-10-24T20:54:37.8844672Z 236 │ const requiredScopesForSettingsUpdate = (payload: unknown) => { 2026-10-24T20:54:37.8844954Z 237 │ const input = Schema.decodeUnknownSync(SettingsUpdate)(payload); 2026-10-24T20:54:37.8845207Z ·  ──────────────────────── 2026-10-24T20:54:37.8845459Z 238 │ const scopes = requiredScopesForServerSettingsPatch(input.patch); 2026-10-24T20:54:37.8845663Z ╰──── 2026-10-24T20:54:37.8845719Z 2026-10-24T20:54:37.8846086Z ⚠ 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-24T20:54:37.8846590Z ╭─[apps/server/src/auth/RpcAuthorization.ts:256:26] 2026-10-24T20:54:37.8846830Z 255 │ if (method === WS_METHODS.assetsCreateUrl) { 2026-10-24T20:54:37.8847108Z 256 │ const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload); 2026-10-24T20:54:37.8847387Z ·  ──────────────────────── 2026-10-24T20:54:37.8847571Z 257 │ return [ 2026-10-24T20:54:37.8847696Z ╰──── 2026-10-24T20:54:37.8847755Z 2026-10-24T20:54:37.8847956Z ⚠ eslint(no-unused-vars): Identifier 'identity' is imported but never used. 2026-10-24T20:54:37.8848255Z ╭─[apps/server/src/auth/http.ts:28:10] 2026-10-24T20:54:37.8848460Z 27 │ import * as Schema from "effect/Schema"; 2026-10-24T20:54:37.8848657Z 28 │ import { identity } from "effect/Function"; 2026-10-24T20:54:37.8848847Z ·  ────┬─── 2026-10-24T20:54:37.8849078Z · ╰── 'identity' is imported here 2026-10-24T20:54:37.8849302Z 29 │ import * as Layer from "effect/Layer"; 2026-10-24T20:54:37.8849459Z ╰──── 2026-10-24T20:54:37.8849611Z  help: Consider removing this import. 2026-10-24T20:54:37.8849725Z 2026-10-24T20:54:37.8849987Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:54:37.8850375Z ╭─[packages/provider-opencode/src/server/adapter.ts:3755:7] 2026-10-24T20:54:37.8850580Z 3754 │ 2026-10-24T20:54:37.8850846Z 3755 │ const layer: Layer.Layer = 2026-10-24T20:54:37.8851127Z ·  ──┬── 2026-10-24T20:54:37.8851414Z · ╰── 'layer' is declared here 2026-10-24T20:54:37.8851657Z 3756 │ Layer.effect( 2026-10-24T20:54:37.8851789Z ╰──── 2026-10-24T20:54:37.8851950Z  help: Consider removing this declaration. 2026-10-24T20:54:37.8852068Z 2026-10-24T20:54:37.8852238Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T20:54:37.8852598Z ╭─[packages/provider-opencode/src/server/OpenCodeRuntime.environment.test.ts:53:14] 2026-10-24T20:54:37.8852839Z 52 │ 2026-10-24T20:54:37.8852964Z 53 │ for (const {} of [ 2026-10-24T20:54:37.8853118Z ·  ── 2026-10-24T20:54:37.8853271Z 54 │ { healthy: true }, 2026-10-24T20:54:37.8853406Z ╰──── 2026-10-24T20:54:37.8853692Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T20:54:37.8853925Z 2026-10-24T20:54:37.8854203Z ⚠ eslint(no-unused-vars): Variable 'layerDaemon' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:54:37.8854594Z ╭─[apps/server/src/orchestration-v2/EffectWorker.ts:914:7] 2026-10-24T20:54:37.8854793Z 913 │ 2026-10-24T20:54:37.8855041Z 914 │ const layerDaemon: Layer.Layer = Layer.effectDiscard( 2026-10-24T20:54:37.8855314Z ·  ─────┬───── 2026-10-24T20:54:37.8855544Z · ╰── 'layerDaemon' is declared here 2026-10-24T20:54:37.8855771Z 915 │ runDaemon.pipe(Effect.forkScoped), 2026-10-24T20:54:37.8855928Z ╰──── 2026-10-24T20:54:37.8856085Z  help: Consider removing this declaration. 2026-10-24T20:54:37.8856230Z 2026-10-24T20:54:37.8856474Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-24T20:54:37.8856867Z ╭─[apps/web/src/components/pullRequest/pullRequestList.logic.ts:262:9] 2026-10-24T20:54:37.8857098Z 261 │ ): boolean { 2026-10-24T20:54:37.8857324Z 262 │ const labels = entry.labels.map((label) => label.name.trim().toLowerCase()); 2026-10-24T20:54:37.8857652Z ·  ───────────────────────────────────────────────────────────────────── 2026-10-24T20:54:37.8857954Z 263 │ const holds = (label: string) => labels.includes(label.trim().toLowerCase()); 2026-10-24T20:54:37.8858161Z ╰──── 2026-10-24T20:54:37.8858295Z  help: Switch to `Set` 2026-10-24T20:54:37.8858392Z 2026-10-24T20:54:37.8858589Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T20:54:37.8859018Z ╭─[apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx:818:17] 2026-10-24T20:54:37.8859286Z 817 │
2026-10-24T20:54:37.8866906Z ·  ──────┬───── 2026-10-24T20:54:37.8867158Z · ╰── 'stopSessions' is declared here 2026-10-24T20:54:37.8867370Z 250 │ effect.pipe( 2026-10-24T20:54:37.8867503Z ╰──── 2026-10-24T20:54:37.8867659Z  help: Consider removing this parameter. 2026-10-24T20:54:37.8867777Z 2026-10-24T20:54:37.8868114Z ⚠ 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-24T20:54:37.8868565Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:50:18] 2026-10-24T20:54:37.8868946Z 49 │ for (const tool of ["sendMessage", "followupTask", "interruptAgent", "listAgents"]) { 2026-10-24T20:54:37.8869318Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-24T20:54:37.8869580Z ·  ───────── 2026-10-24T20:54:37.8869861Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-24T20:54:37.8870099Z ╰──── 2026-10-24T20:54:37.8870154Z 2026-10-24T20:54:37.8870489Z ⚠ 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-24T20:54:37.8870939Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:51:18] 2026-10-24T20:54:37.8871260Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-24T20:54:37.8871621Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-24T20:54:37.8871894Z ·  ───────── 2026-10-24T20:54:37.8872045Z 52 │ } 2026-10-24T20:54:37.8872154Z ╰──── 2026-10-24T20:54:37.8872208Z 2026-10-24T20:54:37.8872539Z ⚠ 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-24T20:54:37.8872982Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:55:5] 2026-10-24T20:54:37.8873198Z 54 │ assert.equal( 2026-10-24T20:54:37.8873447Z 55 │ Schema.is(CodexSchema.ServerNotification__CollabAgentToolCallStatus)("interrupted"), 2026-10-24T20:54:37.8873697Z ·  ───────── 2026-10-24T20:54:37.8873839Z 56 │ true, 2026-10-24T20:54:37.8873962Z ╰──── 2026-10-24T20:54:37.8874019Z 2026-10-24T20:54:37.8874351Z ⚠ 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-24T20:54:37.8874796Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:59:5] 2026-10-24T20:54:37.8875006Z 58 │ assert.equal( 2026-10-24T20:54:37.8875266Z 59 │ Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentToolCallStatus)("interrupted"), 2026-10-24T20:54:37.8875523Z ·  ───────── 2026-10-24T20:54:37.8875664Z 60 │ true, 2026-10-24T20:54:37.8875780Z ╰──── 2026-10-24T20:54:37.8875834Z 2026-10-24T20:54:37.8876204Z ⚠ 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-24T20:54:37.8876660Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:103:16] 2026-10-24T20:54:37.8876871Z 102 │ 2026-10-24T20:54:37.8877102Z 103 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse)(resumeResponse), true); 2026-10-24T20:54:37.8877364Z ·  ───────── 2026-10-24T20:54:37.8877516Z 104 │ }); 2026-10-24T20:54:37.8877629Z ╰──── 2026-10-24T20:54:37.8877685Z 2026-10-24T20:54:37.8877909Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T20:54:37.8878243Z ╭─[packages/shared/src/serverSettings.ts:346:9] 2026-10-24T20:54:37.8878478Z 345 │ const entry: ProjectSettingsOverrides = { 2026-10-24T20:54:37.8878780Z 346 │ ...(entries.get(projectId) ?? currentEntries[projectId] ?? {}), 2026-10-24T20:54:37.8879149Z ·  ────────────────────────────────────────────────────────────── 2026-10-24T20:54:37.8879392Z 347 │ }; 2026-10-24T20:54:37.8879509Z ╰──── 2026-10-24T20:54:37.8879835Z  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-24T20:54:37.8880092Z 2026-10-24T20:54:37.8880311Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in Array.prototype.reduce() 2026-10-24T20:54:37.8880644Z ╭─[packages/shared/src/serverSettings.ts:448:24] 2026-10-24T20:54:37.8880839Z 447 │ const favorites = 2026-10-24T20:54:37.8881031Z 448 │ setModelFavorites?.reduce((current, change) => { 2026-10-24T20:54:37.8881241Z ·  ───┬── 2026-10-24T20:54:37.8881476Z · ╰── For this reduce 2026-10-24T20:54:37.8881691Z 449 │ const exists = current.some( 2026-10-24T20:54:37.8881967Z 450 │ (favorite) => favorite.provider === change.provider && favorite.model === change.model, 2026-10-24T20:54:37.8882198Z 451 │ ); 2026-10-24T20:54:37.8882337Z 452 │ return change.favorite 2026-10-24T20:54:37.8882489Z 453 │ ? exists 2026-10-24T20:54:37.8882628Z 454 │ ? current 2026-10-24T20:54:37.8882846Z 455 │ : [...current, { provider: change.provider, model: change.model }] 2026-10-24T20:54:37.8883075Z ·  ─────┬──── 2026-10-24T20:54:37.8883293Z · ╰── From this spread 2026-10-24T20:54:37.8883487Z 456 │ : current.filter( 2026-10-24T20:54:37.8883624Z ╰──── 2026-10-24T20:54:37.8883892Z  help: Consider using `Object.assign()` or `Array.prototype.push()` to mutate the accumulator instead. 2026-10-24T20:54:37.8884262Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T20:54:37.8884266Z 2026-10-24T20:54:37.8884455Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-24T20:54:37.8884574Z ╭─[packages/shared/src/serverSettings.ts:466:3] 2026-10-24T20:54:37.8884633Z 464 │ null; 2026-10-24T20:54:37.8884750Z 465 │ let nextModelPreferences = initialModelPreferences; 2026-10-24T20:54:37.8884841Z ·  ──────────┬───────── 2026-10-24T20:54:37.8884968Z · ╰── From this accumulator 2026-10-24T20:54:37.8885071Z 466 │ for (const change of setModelsHidden ?? []) { 2026-10-24T20:54:37.8885139Z ·  ─┬─ 2026-10-24T20:54:37.8885253Z · ╰── For this loop 2026-10-24T20:54:37.8885391Z 467 │ const preferences = nextModelPreferences?.[change.provider] ?? { 2026-10-24T20:54:37.8885460Z 468 │ hiddenModels: [], 2026-10-24T20:54:37.8885528Z 469 │ modelOrder: [], 2026-10-24T20:54:37.8885583Z 470 │ }; 2026-10-24T20:54:37.8885766Z 471 │ const hiddenModels = preferences.hiddenModels.filter((model) => model !== change.model); 2026-10-24T20:54:37.8885878Z 472 │ if (change.hidden) hiddenModels.push(change.model); 2026-10-24T20:54:37.8885952Z 473 │ nextModelPreferences = { 2026-10-24T20:54:37.8886029Z 474 │ ...nextModelPreferences, 2026-10-24T20:54:37.8886126Z ·  ───────────┬─────────── 2026-10-24T20:54:37.8886294Z · ╰── From this spread 2026-10-24T20:54:37.8886477Z 475 │ [change.provider]: { ...preferences, hiddenModels }, 2026-10-24T20:54:37.8886560Z ╰──── 2026-10-24T20:54:37.8886718Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-24T20:54:37.8886876Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T20:54:37.8886879Z 2026-10-24T20:54:37.8887153Z ⚠ eslint(no-unused-vars): Variable 'claudeCaps' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:54:37.8887264Z ╭─[packages/shared/src/model.test.ts:36:7] 2026-10-24T20:54:37.8887317Z 35 │ 2026-10-24T20:54:37.8887450Z 36 │ const claudeCaps: ModelCapabilities = createModelCapabilities({ 2026-10-24T20:54:37.8887526Z ·  ─────┬──── 2026-10-24T20:54:37.8887662Z · ╰── 'claudeCaps' is declared here 2026-10-24T20:54:37.8887738Z 37 │ optionDescriptors: [ 2026-10-24T20:54:37.8887793Z ╰──── 2026-10-24T20:54:37.8887898Z  help: Consider removing this declaration. 2026-10-24T20:54:37.8887901Z 2026-10-24T20:54:37.8888159Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:54:37.8888325Z ╭─[apps/server/src/orchestration-v2/ThreadPullRequestService.ts:410:7] 2026-10-24T20:54:37.8888379Z 409 │ 2026-10-24T20:54:37.8888507Z 410 │ const layer = Layer.effect(ThreadPullRequestServiceV2, make); 2026-10-24T20:54:37.8888578Z ·  ──┬── 2026-10-24T20:54:37.8888704Z · ╰── 'layer' is declared here 2026-10-24T20:54:37.8888757Z ╰──── 2026-10-24T20:54:37.8888860Z  help: Consider removing this declaration. 2026-10-24T20:54:37.8888868Z 2026-10-24T20:54:37.8889245Z ⚠ 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-24T20:54:37.8889367Z ╭─[packages/shared/src/otelEnvironment.ts:146:14] 2026-10-24T20:54:37.8889426Z 145 │ name, 2026-10-24T20:54:37.8889568Z 146 │ (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()), 2026-10-24T20:54:37.8889675Z ·  ────────────────────────── 2026-10-24T20:54:37.8889797Z 147 │ `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`, 2026-10-24T20:54:37.8889849Z ╰──── 2026-10-24T20:54:37.8889852Z 2026-10-24T20:54:37.8890049Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T20:54:37.8890284Z ╭─[apps/web/src/components/pullRequest/PullRequestChecksPopover.tsx:88:15] 2026-10-24T20:54:37.8890386Z 87 │
  • { 2026-10-24T20:54:37.8901542Z 458 │ let result: Array = divisor.map((_) => 0); 2026-10-24T20:54:37.8901645Z ·  ┬ 2026-10-24T20:54:37.8901797Z · ╰── '_' is declared here 2026-10-24T20:54:37.8901869Z 459 │ for (const b of data) { 2026-10-24T20:54:37.8901921Z ╰──── 2026-10-24T20:54:37.8902025Z  help: Consider removing this parameter. 2026-10-24T20:54:37.8902027Z 2026-10-24T20:54:37.8902257Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T20:54:37.8902398Z ╭─[apps/mobile/src/state/use-model-option-memory.ts:21:7] 2026-10-24T20:54:37.8902464Z 20 │ [instanceId]: { 2026-10-24T20:54:37.8902545Z 21 │ ...(state[instanceId] ?? {}), 2026-10-24T20:54:37.8902649Z ·  ──────────────────────────── 2026-10-24T20:54:37.8902719Z 22 │ [model]: options, 2026-10-24T20:54:37.8902770Z ╰──── 2026-10-24T20:54:37.8903039Z  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-24T20:54:37.8903041Z 2026-10-24T20:54:37.8903209Z ⚠ eslint(no-empty-pattern): Empty array binding pattern 2026-10-24T20:54:37.8903369Z ╭─[apps/server/src/pullRequest/PullRequestService.test.ts:1437:12] 2026-10-24T20:54:37.8903429Z 1436 │ 2026-10-24T20:54:37.8903501Z 1437 │ for (const [] of [ 2026-10-24T20:54:37.8903573Z ·  ── 2026-10-24T20:54:37.8903647Z 1438 │ ["github", "github.com"], 2026-10-24T20:54:37.8903699Z ╰──── 2026-10-24T20:54:37.8903981Z  help: Passing non-iterable values (null, undefined, numbers, booleans, etc.) will result in a runtime error because these values are not iterable. 2026-10-24T20:54:37.8903984Z 2026-10-24T20:54:37.8904244Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.8904432Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:107:5] 2026-10-24T20:54:37.8904486Z 104 │ 2026-10-24T20:54:37.8904550Z 105 │ useEffect(() => { 2026-10-24T20:54:37.8904623Z ·  ────┬──── 2026-10-24T20:54:37.8904823Z · ╰── This is the containing effect 2026-10-24T20:54:37.8904941Z 106 │ clearReviewCommentTarget(); 2026-10-24T20:54:37.8905040Z 107 │ setPendingNativeCommentSelection(null); 2026-10-24T20:54:37.8905150Z ·  ────────────────┬─────────────── 2026-10-24T20:54:37.8905330Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.8905404Z 108 │ }, [selectedSection?.id]); 2026-10-24T20:54:37.8905455Z ╰──── 2026-10-24T20:54:37.8906061Z  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-24T20:54:37.8906430Z  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-24T20:54:37.8906435Z 2026-10-24T20:54:37.8906693Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.8906881Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7] 2026-10-24T20:54:37.8906933Z 109 │ 2026-10-24T20:54:37.8906998Z 110 │ useEffect(() => { 2026-10-24T20:54:37.8907069Z ·  ────┬──── 2026-10-24T20:54:37.8907201Z · ╰── This is the containing effect 2026-10-24T20:54:37.8907289Z 111 │ if (activeCommentTarget === null) { 2026-10-24T20:54:37.8907399Z 112 │ setPendingNativeCommentSelection(null); 2026-10-24T20:54:37.8907512Z ·  ────────────────┬─────────────── 2026-10-24T20:54:37.8907693Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.8907750Z 113 │ } 2026-10-24T20:54:37.8907803Z ╰──── 2026-10-24T20:54:37.8908404Z  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-24T20:54:37.8908728Z  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-24T20:54:37.8908731Z 2026-10-24T20:54:37.8908986Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:54:37.8909217Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7] 2026-10-24T20:54:37.8909319Z 107 │ setPendingNativeCommentSelection(null); 2026-10-24T20:54:37.8909391Z 108 │ }, [selectedSection?.id]); 2026-10-24T20:54:37.8909480Z ·  ─────────┬───────── 2026-10-24T20:54:37.8909645Z · ╰── Unnecessary dependency `selectedSection?.id` 2026-10-24T20:54:37.8909699Z 109 │ 2026-10-24T20:54:37.8909751Z ╰──── 2026-10-24T20:54:37.8910046Z  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-24T20:54:37.8910369Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.8910374Z 2026-10-24T20:54:37.8910576Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:54:37.8910713Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:454:7] 2026-10-24T20:54:37.8910799Z 453 │ showAuxiliaryPane("inspector"); 2026-10-24T20:54:37.8910907Z 454 │ }, [environmentId, showAuxiliaryPane, threadId]); 2026-10-24T20:54:37.8911055Z ·  ──────┬────── ────┬─── 2026-10-24T20:54:37.8911258Z · │ ╰── Unnecessary dependency `threadId` 2026-10-24T20:54:37.8911418Z · ╰── Unnecessary dependency `environmentId` 2026-10-24T20:54:37.8911481Z 455 │ const { 2026-10-24T20:54:37.8911533Z ╰──── 2026-10-24T20:54:37.8911826Z  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-24T20:54:37.8912137Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.8912139Z 2026-10-24T20:54:37.8912326Z ⚠ react(static-components): Cannot create components during render 2026-10-24T20:54:37.8912462Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:725:20] 2026-10-24T20:54:37.8912526Z 492 │ // same check. 2026-10-24T20:54:37.8912658Z 493 │ const NativeReviewDiffView = resolveNativeReviewDiffView(); 2026-10-24T20:54:37.8912785Z ·  ─────────────┬───────────── 2026-10-24T20:54:37.8912969Z · ╰── The component is created during render here 2026-10-24T20:54:37.8913127Z 494 │ const nativeReviewDiffViewRef = useRef(null); 2026-10-24T20:54:37.8913252Z 495 │ const showcasedReviewDrawRef = useRef(null); 2026-10-24T20:54:37.8913386Z 496 │ const [isPullRefreshing, setIsPullRefreshing] = useState(false); 2026-10-24T20:54:37.8913477Z 497 │ const handlePullToRefresh = async () => { 2026-10-24T20:54:37.8913557Z 498 │ setIsPullRefreshing(true); 2026-10-24T20:54:37.8913642Z 499 │ await refreshSelectedSection(); 2026-10-24T20:54:37.8913720Z 500 │ setIsPullRefreshing(false); 2026-10-24T20:54:37.8913776Z 501 │ }; 2026-10-24T20:54:37.8913977Z 502 │ const reviewFileNavigatorRef = useRef(null); 2026-10-24T20:54:37.8914158Z 503 │ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : []; 2026-10-24T20:54:37.8914267Z 504 │ const fileVisibility = useReviewFileVisibility({ 2026-10-24T20:54:37.8914353Z 505 │ threadKey: reviewCache.threadKey, 2026-10-24T20:54:37.8914443Z 506 │ sectionId: selectedSection?.id ?? null, 2026-10-24T20:54:37.8914513Z 507 │ files: reviewFiles, 2026-10-24T20:54:37.8914617Z 508 │ cachedExpandedFileIds: selectedSection?.id 2026-10-24T20:54:37.8914750Z 509 │ ? reviewCache.expandedFileIdsBySection[selectedSection.id] 2026-10-24T20:54:37.8914817Z 510 │ : undefined, 2026-10-24T20:54:37.8914914Z 511 │ cachedViewedFileIds: selectedSection?.id 2026-10-24T20:54:37.8915040Z 512 │ ? reviewCache.viewedFileIdsBySection[selectedSection.id] 2026-10-24T20:54:37.8915108Z 513 │ : undefined, 2026-10-24T20:54:37.8915166Z 514 │ }); 2026-10-24T20:54:37.8915358Z 515 │ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility; 2026-10-24T20:54:37.8915494Z 516 │ const commentSelection = useReviewCommentSelectionController({ 2026-10-24T20:54:37.8915557Z 517 │ environmentId, 2026-10-24T20:54:37.8915621Z 518 │ threadId, 2026-10-24T20:54:37.8915690Z 519 │ selectedSection, 2026-10-24T20:54:37.8915761Z 520 │ nativeReviewDiffData, 2026-10-24T20:54:37.8915819Z 521 │ }); 2026-10-24T20:54:37.8915926Z 522 │ const nativeBridge = useNativeReviewDiffBridge({ 2026-10-24T20:54:37.8916014Z 523 │ threadKey: reviewCache.threadKey, 2026-10-24T20:54:37.8916103Z 524 │ sectionId: selectedSection?.id ?? null, 2026-10-24T20:54:37.8916217Z 525 │ diff: selectedSection?.diff, 2026-10-24T20:54:37.8916300Z 526 │ data: nativeReviewDiffData, 2026-10-24T20:54:37.8916372Z 527 │ collapsedFileIds, 2026-10-24T20:54:37.8916436Z 528 │ viewedFileIds, 2026-10-24T20:54:37.8916548Z 529 │ selectedRowIds: commentSelection.selectedRowIds, 2026-10-24T20:54:37.8916647Z 530 │ canHighlight: parsedDiff.kind === "files", 2026-10-24T20:54:37.8916703Z 531 │ }); 2026-10-24T20:54:37.8916775Z 532 │ const showcaseReviewKey = 2026-10-24T20:54:37.8916910Z 533 │ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection 2026-10-24T20:54:37.8917121Z 534 │ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}` 2026-10-24T20:54:37.8917183Z 535 │ : null; 2026-10-24T20:54:37.8917351Z 536 │ const handleNativeDebug = (event: NativeSyntheticEvent>) => { 2026-10-24T20:54:37.8917433Z 537 │ nativeBridge.onDebug(event); 2026-10-24T20:54:37.8917499Z 538 │ if ( 2026-10-24T20:54:37.8917583Z 539 │ showcaseReviewKey === null || 2026-10-24T20:54:37.8917706Z 540 │ showcasedReviewDrawRef.current === showcaseReviewKey || 2026-10-24T20:54:37.8917819Z 541 │ !isNativeReviewDiffDrawEvent(event.nativeEvent) 2026-10-24T20:54:37.8917877Z 542 │ ) { 2026-10-24T20:54:37.8917939Z 543 │ return; 2026-10-24T20:54:37.8917993Z 544 │ } 2026-10-24T20:54:37.8918108Z 545 │ showcasedReviewDrawRef.current = showcaseReviewKey; 2026-10-24T20:54:37.8918275Z 546 │ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId }); 2026-10-24T20:54:37.8918331Z 547 │ }; 2026-10-24T20:54:37.8918384Z 548 │ 2026-10-24T20:54:37.8918504Z 549 │ const handleSelectFile = async (fileId: string | null) => { 2026-10-24T20:54:37.8918653Z 550 │ loadVisibleFile(fileId, true); 2026-10-24T20:54:37.8918819Z 551 │ commentSelection.clearSelection(); 2026-10-24T20:54:37.8918990Z 552 │ if (fileId !== null && collapsedFileIds.includes(fileId)) { 2026-10-24T20:54:37.8919073Z 553 │ toggleExpandedFile(fileId); 2026-10-24T20:54:37.8919127Z 554 │ } 2026-10-24T20:54:37.8919240Z 555 │ const nativeView = nativeReviewDiffViewRef.current; 2026-10-24T20:54:37.8919313Z 556 │ if (!nativeView) return; 2026-10-24T20:54:37.8919409Z 557 │ const result = await settlePromise(() => 2026-10-24T20:54:37.8919586Z 558 │ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true), 2026-10-24T20:54:37.8919642Z 559 │ ); 2026-10-24T20:54:37.8919733Z 560 │ if (AsyncResult.isFailure(result)) { 2026-10-24T20:54:37.8919916Z 561 │ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result)); 2026-10-24T20:54:37.8919971Z 562 │ } 2026-10-24T20:54:37.8920033Z 563 │ }; 2026-10-24T20:54:37.8920122Z 564 │ const handleVisibleFileChange = ( 2026-10-24T20:54:37.8920256Z 565 │ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>, 2026-10-24T20:54:37.8920315Z 566 │ ) => { 2026-10-24T20:54:37.8920424Z 567 │ loadVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-24T20:54:37.8920596Z 568 │ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-24T20:54:37.8920651Z 569 │ }; 2026-10-24T20:54:37.8920733Z 570 │ const renderInspector = () => ( 2026-10-24T20:54:37.8920802Z 571 │ void handleSelectFile(fileId)} 2026-10-24T20:54:37.8921332Z 577 │ /> 2026-10-24T20:54:37.8921387Z 578 │ ); 2026-10-24T20:54:37.8921439Z 579 │ 2026-10-24T20:54:37.8921626Z 580 │ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => { 2026-10-24T20:54:37.8921716Z 581 │ const { fileId } = event.nativeEvent; 2026-10-24T20:54:37.8921781Z 582 │ if (fileId) { 2026-10-24T20:54:37.8921862Z 583 │ loadVisibleFile(fileId, true); 2026-10-24T20:54:37.8921943Z 584 │ toggleExpandedFile(fileId); 2026-10-24T20:54:37.8921998Z 585 │ } 2026-10-24T20:54:37.8922051Z 586 │ }; 2026-10-24T20:54:37.8922105Z 587 │ 2026-10-24T20:54:37.8922196Z 588 │ const handleNativeToggleViewedFile = ( 2026-10-24T20:54:37.8922327Z 589 │ event: NativeSyntheticEvent<{ readonly fileId?: string }>, 2026-10-24T20:54:37.8922386Z 590 │ ) => { 2026-10-24T20:54:37.8922477Z 591 │ const { fileId } = event.nativeEvent; 2026-10-24T20:54:37.8922541Z 592 │ if (fileId) { 2026-10-24T20:54:37.8922619Z 593 │ toggleViewedFile(fileId); 2026-10-24T20:54:37.8922671Z 594 │ } 2026-10-24T20:54:37.8922728Z 595 │ }; 2026-10-24T20:54:37.8922783Z 596 │ 2026-10-24T20:54:37.8922858Z 597 │ const parsedDiffNotice = 2026-10-24T20:54:37.8923022Z 598 │ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null; 2026-10-24T20:54:37.8923148Z 599 │ const hasCachedSelectedDiff = selectedSection?.diff != null; 2026-10-24T20:54:37.8923309Z 600 │ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null); 2026-10-24T20:54:37.8923432Z 601 │ const sectionMenu = buildReviewSectionMenu(reviewSections); 2026-10-24T20:54:37.8923656Z 602 │ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({ 2026-10-24T20:54:37.8923799Z 603 │ hasEnvironmentPresentation: environment.isReady, 2026-10-24T20:54:37.8923901Z 604 │ isEnvironmentConnected: isEnvironmentReady, 2026-10-24T20:54:37.8923974Z 605 │ hasCachedSelectedDiff, 2026-10-24T20:54:37.8924041Z 606 │ hasAnyCachedDiff, 2026-10-24T20:54:37.8924095Z 607 │ }); 2026-10-24T20:54:37.8924184Z 608 │ const handleRetryEnvironment = () => { 2026-10-24T20:54:37.8924271Z 609 │ void retryEnvironment(environmentId); 2026-10-24T20:54:37.8924325Z 610 │ }; 2026-10-24T20:54:37.8924412Z 611 │ const handleReturnToThread = () => { 2026-10-24T20:54:37.8924494Z 612 │ if (navigation.canGoBack()) { 2026-10-24T20:54:37.8924564Z 613 │ navigation.goBack(); 2026-10-24T20:54:37.8924627Z 614 │ return; 2026-10-24T20:54:37.8924692Z 615 │ } 2026-10-24T20:54:37.8924777Z 616 │ navigation.navigate("Thread", { 2026-10-24T20:54:37.8924867Z 617 │ environmentId: String(environmentId), 2026-10-24T20:54:37.8924947Z 618 │ threadId: String(threadId), 2026-10-24T20:54:37.8925005Z 619 │ }); 2026-10-24T20:54:37.8925062Z 620 │ }; 2026-10-24T20:54:37.8925143Z 621 │ const androidHeaderSubtitle = [ 2026-10-24T20:54:37.8925217Z 622 │ selectedSection?.title, 2026-10-24T20:54:37.8925299Z 623 │ headerDiffSummary.additions, 2026-10-24T20:54:37.8925379Z 624 │ headerDiffSummary.deletions, 2026-10-24T20:54:37.8925433Z 625 │ ] 2026-10-24T20:54:37.8925541Z 626 │ .filter((part): part is string => Boolean(part)) 2026-10-24T20:54:37.8925605Z 627 │ .join(" · "); 2026-10-24T20:54:37.8925659Z 628 │ 2026-10-24T20:54:37.8925740Z 629 │ const showChangedFilesPane = 2026-10-24T20:54:37.8925820Z 630 │ !showConnectionNotice && 2026-10-24T20:54:37.8925899Z 631 │ selectedSection !== null && 2026-10-24T20:54:37.8925978Z 632 │ parsedDiff.kind === "files" && 2026-10-24T20:54:37.8926059Z 633 │ NativeReviewDiffView !== null; 2026-10-24T20:54:37.8926271Z 634 │ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined); 2026-10-24T20:54:37.8926448Z 635 │ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane; 2026-10-24T20:54:37.8926501Z 636 │ 2026-10-24T20:54:37.8926574Z 637 │ const listHeader = (() => { 2026-10-24T20:54:37.8926661Z 638 │ const children: ReactElement[] = []; 2026-10-24T20:54:37.8926714Z 639 │ 2026-10-24T20:54:37.8926776Z 640 │ if (error) { 2026-10-24T20:54:37.8926844Z 641 │ children.push( 2026-10-24T20:54:37.8926906Z 642 │ 2026-10-24T20:54:37.8927576Z 649 │ Review unavailable 2026-10-24T20:54:37.8927737Z 650 │ {error} 2026-10-24T20:54:37.8927800Z 651 │ , 2026-10-24T20:54:37.8927856Z 652 │ ); 2026-10-24T20:54:37.8927911Z 653 │ } 2026-10-24T20:54:37.8927964Z 654 │ 2026-10-24T20:54:37.8928035Z 655 │ if (parsedDiffNotice) { 2026-10-24T20:54:37.8928262Z 656 │ children.push(); 2026-10-24T20:54:37.8928352Z 657 │ } 2026-10-24T20:54:37.8928405Z 658 │ 2026-10-24T20:54:37.8928481Z 659 │ if (children.length === 0) { 2026-10-24T20:54:37.8928546Z 660 │ return null; 2026-10-24T20:54:37.8928602Z 661 │ } 2026-10-24T20:54:37.8928656Z 662 │ 2026-10-24T20:54:37.8928728Z 663 │ return <>{children}; 2026-10-24T20:54:37.8928785Z 664 │ })(); 2026-10-24T20:54:37.8928857Z 665 │ const headerSubtitle = [ 2026-10-24T20:54:37.8928938Z 666 │ headerDiffSummary.additions, 2026-10-24T20:54:37.8929016Z 667 │ headerDiffSummary.deletions, 2026-10-24T20:54:37.8929098Z 668 │ pendingReviewCommentCount > 0 2026-10-24T20:54:37.8929273Z 669 │ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}` 2026-10-24T20:54:37.8929336Z 670 │ : null, 2026-10-24T20:54:37.8929396Z 671 │ ] 2026-10-24T20:54:37.8929467Z 672 │ .filter(Boolean) 2026-10-24T20:54:37.8929531Z 673 │ .join(" · "); 2026-10-24T20:54:37.8929666Z 674 │ const headerTitleText = selectedSection?.title ?? "Review changes"; 2026-10-24T20:54:37.8929720Z 675 │ 2026-10-24T20:54:37.8929780Z 676 │ return ( 2026-10-24T20:54:37.8929837Z 677 │ <> 2026-10-24T20:54:37.8929901Z 678 │ 2026-10-24T20:54:37.8931241Z 694 │ 2026-10-24T20:54:37.8931308Z 695 │ 2026-10-24T20:54:37.8931431Z 696 │ 2026-10-24T20:54:37.8931513Z 697 │ {showConnectionNotice ? ( 2026-10-24T20:54:37.8931662Z 698 │ 2026-10-24T20:54:37.8931758Z 699 │ 2026-10-24T20:54:37.8932880Z 711 │ 2026-10-24T20:54:37.8933041Z 712 │ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? ( 2026-10-24T20:54:37.8933101Z 713 │ 2026-10-24T20:54:37.8933546Z 719 │ 2026-10-24T20:54:37.8933916Z 723 │ {listHeader} 2026-10-24T20:54:37.8934039Z 724 │ 2026-10-24T20:54:37.8934122Z 725 │ void> = []; 2026-10-24T20:54:37.8936394Z 2617 │ │ const dispatcher: Scheduler.SchedulerDispatcher = { 2026-10-24T20:54:37.8936535Z 2618 │ │ scheduleTask: (task) => tasks.push(task), 2026-10-24T20:54:37.8936640Z 2619 │ │ flush: () => { 2026-10-24T20:54:37.8936766Z 2620 │ │ let task: (() => void) | undefined; 2026-10-24T20:54:37.8936918Z 2621 │ │ while ((task = tasks.shift()) !== undefined) task(); 2026-10-24T20:54:37.8936999Z 2622 │ │ }, 2026-10-24T20:54:37.8937082Z 2623 │ │ }; 2026-10-24T20:54:37.8937154Z 2624 │ │ 2026-10-24T20:54:37.8937319Z 2625 │ │ let requestFiber: Fiber.Fiber | undefined; 2026-10-24T20:54:37.8937426Z 2626 │ │ let requestChecks = 0; 2026-10-24T20:54:37.8937625Z 2627 │ │ const scheduler: Scheduler.Scheduler = { 2026-10-24T20:54:37.8937779Z 2628 │ │ executionMode: "async", 2026-10-24T20:54:37.8937903Z 2629 │ │ makeDispatcher: () => dispatcher, 2026-10-24T20:54:37.8938016Z 2630 │ │ shouldYield: (fiber) => { 2026-10-24T20:54:37.8938154Z 2631 │ │ if (fiber !== requestFiber) return false; 2026-10-24T20:54:37.8938262Z 2632 │ │ requestChecks += 1; 2026-10-24T20:54:37.8938409Z 2633 │ │ if (requestChecks !== interruptAt) return false; 2026-10-24T20:54:37.8938524Z 2634 │ │ fiber.interruptUnsafe(); 2026-10-24T20:54:37.8938624Z 2635 │ │ return true; 2026-10-24T20:54:37.8938712Z 2636 │ │ }, 2026-10-24T20:54:37.8938797Z 2637 │ │ }; 2026-10-24T20:54:37.8938868Z 2638 │ │ 2026-10-24T20:54:37.8938992Z 2639 │ │ const input: UsageSummaryInput = { 2026-10-24T20:54:37.8939086Z 2640 │ │ ...WINDOW, 2026-10-24T20:54:37.8939219Z 2641 │ │ sinceDay: UsageDay.make("2026-09-01"), 2026-10-24T20:54:37.8939412Z 2642 │ │ untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`), 2026-10-24T20:54:37.8939494Z 2643 │ │ }; 2026-10-24T20:54:37.8939609Z 2644 │ │ const first = yield* service 2026-10-24T20:54:37.8939717Z 2645 │ │ .readSummary(input) 2026-10-24T20:54:37.8939805Z 2646 │ │ .pipe( 2026-10-24T20:54:37.8939912Z 2647 │ │ Effect.exit, 2026-10-24T20:54:37.8940078Z 2648 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-24T20:54:37.8940184Z 2649 │ │ Effect.forkChild, 2026-10-24T20:54:37.8940265Z 2650 │ │ ); 2026-10-24T20:54:37.8940371Z 2651 │ │ requestFiber = first; 2026-10-24T20:54:37.8940479Z 2652 │ │ yield* Effect.yieldNow; 2026-10-24T20:54:37.8940583Z 2653 │ │ dispatcher.flush(); 2026-10-24T20:54:37.8940653Z 2654 │ │ 2026-10-24T20:54:37.8940808Z 2655 │ │ const second = yield* service.readSummary(input).pipe( 2026-10-24T20:54:37.8940907Z 2656 │ │ Effect.match({ 2026-10-24T20:54:37.8941041Z 2657 │ │ onFailure: (error) => error.reason, 2026-10-24T20:54:37.8941169Z 2658 │ │ onSuccess: () => "success" as const, 2026-10-24T20:54:37.8941254Z 2659 │ │ }), 2026-10-24T20:54:37.8941412Z 2660 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-24T20:54:37.8941517Z 2661 │ │ Effect.forkChild, 2026-10-24T20:54:37.8941596Z 2662 │ │ ); 2026-10-24T20:54:37.8941703Z 2663 │ │ yield* Effect.yieldNow; 2026-10-24T20:54:37.8941805Z 2664 │ │ dispatcher.flush(); 2026-10-24T20:54:37.8941934Z 2665 │ │ const secondExit = second.pollUnsafe(); 2026-10-24T20:54:37.8942112Z 2666 │ │ if (secondExit === undefined) { 2026-10-24T20:54:37.8942261Z 2667 │ │ second.interruptUnsafe(); 2026-10-24T20:54:37.8942375Z 2668 │ │ orphanedAt = interruptAt; 2026-10-24T20:54:37.8942465Z 2669 │ │ break; 2026-10-24T20:54:37.8942545Z 2670 │ │ } 2026-10-24T20:54:37.8942666Z 2671 │ │ if (Exit.isFailure(secondExit)) { 2026-10-24T20:54:37.8942827Z 2672 │ │ assert.fail("the matching request fiber was interrupted"); 2026-10-24T20:54:37.8942908Z 2673 │ │ } 2026-10-24T20:54:37.8943062Z 2674 │ │ assert.strictEqual(secondExit.value, "invalidWindow"); 2026-10-24T20:54:37.8943198Z 2675 │ ╰─▶ } 2026-10-24T20:54:37.8943262Z 2676 │ 2026-10-24T20:54:37.8943322Z ╰──── 2026-10-24T20:54:37.8943325Z 2026-10-24T20:54:37.8943523Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T20:54:37.8943675Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:223:31] 2026-10-24T20:54:37.8943783Z 222 │ ? snippetTokens.map((line, lineIndex) => ( 2026-10-24T20:54:37.8943878Z 223 │ 2026-10-24T20:54:37.8943988Z ·  ─────────────── 2026-10-24T20:54:37.8944081Z 224 │ {lineIndex > 0 ? "\n" : ""} 2026-10-24T20:54:37.8944135Z ╰──── 2026-10-24T20:54:37.8944285Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T20:54:37.8944287Z 2026-10-24T20:54:37.8944491Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T20:54:37.8944647Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25] 2026-10-24T20:54:37.8944726Z 226 │ { 2026-10-24T20:54:37.8950122Z ·  ────┬──── 2026-10-24T20:54:37.8950253Z · ╰── This is the containing effect 2026-10-24T20:54:37.8950356Z 102 │ if (!target || selectedLines.length === 0) { 2026-10-24T20:54:37.8950441Z 103 │ setHighlightedLinesById({}); 2026-10-24T20:54:37.8950600Z ·  ───────────┬─────────── 2026-10-24T20:54:37.8950809Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.8950874Z 104 │ return; 2026-10-24T20:54:37.8950927Z ╰──── 2026-10-24T20:54:37.8951529Z  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-24T20:54:37.8951860Z  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-24T20:54:37.8951863Z 2026-10-24T20:54:37.8952108Z ⚠ unicorn(prefer-string-starts-ends-with): Prefer String#startsWith over a regex with a caret. 2026-10-24T20:54:37.8952236Z ╭─[apps/server/src/vcs/GitVcsDriverCore.ts:517:11] 2026-10-24T20:54:37.8952341Z 516 │ GIT_DIAGNOSTIC_LINE_PATTERN.test(line) || 2026-10-24T20:54:37.8952480Z 517 │ (!/^remote:/.test(line) && SSH_TRANSPORT_REFUSAL_PATTERN.test(line)), 2026-10-24T20:54:37.8952565Z ·  ─────────────── 2026-10-24T20:54:37.8952622Z 518 │ ) 2026-10-24T20:54:37.8952676Z ╰──── 2026-10-24T20:54:37.8952832Z  help: Replace `/^remote:/.test(line)` with `line.startsWith('remote:')`. 2026-10-24T20:54:37.8952835Z 2026-10-24T20:54:37.8953314Z ⚠ 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-24T20:54:37.8953477Z ╭─[packages/client-runtime/src/connection/supervisor.test.ts:135:3] 2026-10-24T20:54:37.8953590Z 134 │ let lastState = yield* SubscriptionRef.get(state); 2026-10-24T20:54:37.8953806Z 135 │ ╭─▶ for (let iteration = 0; iteration < 100; iteration += 1) { 2026-10-24T20:54:37.8953945Z 136 │ │ lastState = yield* SubscriptionRef.get(state); 2026-10-24T20:54:37.8954052Z 137 │ │ if (predicate(lastState)) { 2026-10-24T20:54:37.8954150Z 138 │ │ return lastState; 2026-10-24T20:54:37.8954225Z 139 │ │ } 2026-10-24T20:54:37.8954330Z 140 │ │ yield* Effect.yieldNow; 2026-10-24T20:54:37.8954464Z 141 │ ╰─▶ } 2026-10-24T20:54:37.8954544Z 142 │ return yield* Effect.die( 2026-10-24T20:54:37.8954596Z ╰──── 2026-10-24T20:54:37.8954598Z 2026-10-24T20:54:37.8954976Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownEffect(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const. 2026-10-24T20:54:37.8955104Z ╭─[apps/server/src/assets/AssetAccess.test.ts:975:35] 2026-10-24T20:54:37.8955256Z 974 │ // Every client and server release spells the resource this way on the wire. 2026-10-24T20:54:37.8955415Z 975 │ const { resource } = yield* Schema.decodeUnknownEffect(AssetCreateUrlInput)({ 2026-10-24T20:54:37.8955540Z ·  ────────────────────────── 2026-10-24T20:54:37.8955719Z 976 │ resource: { _tag: "github-media", cwd: "/repo", url }, 2026-10-24T20:54:37.8955804Z ╰──── 2026-10-24T20:54:37.8955806Z 2026-10-24T20:54:37.8956286Z ⚠ 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-24T20:54:37.8956416Z ╭─[apps/server/src/assets/AssetAccess.test.ts:1012:32] 2026-10-24T20:54:37.8956556Z 1011 │ expect(error._tag).toBe("AssetGitHubMediaUrlValidationError"); 2026-10-24T20:54:37.8956745Z 1012 │ const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(AssetAccessError))(error); 2026-10-24T20:54:37.8956863Z ·  ─────────────────── 2026-10-24T20:54:37.8956958Z 1013 │ expect(encoded).not.toContain(url); 2026-10-24T20:54:37.8957011Z ╰──── 2026-10-24T20:54:37.8957020Z 2026-10-24T20:54:37.8957285Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:54:37.8957415Z ╭─[packages/provider-pi/src/server/adapter.ts:3405:7] 2026-10-24T20:54:37.8957470Z 3404 │ 2026-10-24T20:54:37.8957662Z 3405 │ const layer: Layer.Layer = 2026-10-24T20:54:37.8957733Z ·  ──┬── 2026-10-24T20:54:37.8957861Z · ╰── 'layer' is declared here 2026-10-24T20:54:37.8957930Z 3406 │ Layer.effect( 2026-10-24T20:54:37.8957983Z ╰──── 2026-10-24T20:54:37.8958087Z  help: Consider removing this declaration. 2026-10-24T20:54:37.8958090Z 2026-10-24T20:54:37.8958358Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.8958609Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:60:5] 2026-10-24T20:54:37.8958667Z 55 │ 2026-10-24T20:54:37.8995663Z 56 │ useEffect(() => { 2026-10-24T20:54:37.8995753Z ·  ────┬──── 2026-10-24T20:54:37.8995920Z · ╰── This is the containing effect 2026-10-24T20:54:37.8995991Z 57 │ scheduler.reset(); 2026-10-24T20:54:37.8996096Z 58 │ highlightedRowIdsRef.current = new Set(); 2026-10-24T20:54:37.8996222Z 59 │ visibleChunkIndexRef.current = 0; 2026-10-24T20:54:37.8996344Z 60 │ setVisibleRange({ firstRowIndex: 0, lastRowIndex: 80 }); 2026-10-24T20:54:37.8996427Z ·  ───────┬─────── 2026-10-24T20:54:37.8996630Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.8996753Z 61 │ setTokensPatchJson(createEmptyTokenPatch(resetKey)); 2026-10-24T20:54:37.8996809Z ╰──── 2026-10-24T20:54:37.8997419Z  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-24T20:54:37.8997760Z  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-24T20:54:37.8997764Z 2026-10-24T20:54:37.8997977Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:54:37.8998340Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:63:7] 2026-10-24T20:54:37.8998474Z 62 │ return () => scheduler.cancel(); 2026-10-24T20:54:37.8998653Z 63 │ }, [enabled, resetKey, rows.length, scheduler]); 2026-10-24T20:54:37.8998786Z ·  ───┬─── ─────┬───── 2026-10-24T20:54:37.8998984Z · │ ╰── Unnecessary dependency `rows.length` 2026-10-24T20:54:37.8999126Z · ╰── Unnecessary dependency `enabled` 2026-10-24T20:54:37.8999180Z 64 │ 2026-10-24T20:54:37.8999233Z ╰──── 2026-10-24T20:54:37.8999535Z  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-24T20:54:37.8999860Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.8999870Z 2026-10-24T20:54:37.9000042Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T20:54:37.9000165Z ╭─[apps/server/src/processRunner.test.ts:266:14] 2026-10-24T20:54:37.9000221Z 265 │ 2026-10-24T20:54:37.9000330Z 266 │ for (const {} of ["timeout", "success"] as const) { 2026-10-24T20:54:37.9000405Z ·  ── 2026-10-24T20:54:37.9000461Z 267 │ } 2026-10-24T20:54:37.9000514Z ╰──── 2026-10-24T20:54:37.9000747Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T20:54:37.9000749Z 2026-10-24T20:54:37.9000957Z ⚠ eslint(no-unused-vars): Identifier 'Duration' is imported but never used. 2026-10-24T20:54:37.9001098Z ╭─[packages/provider-pi/src/server/adapter.test.ts:24:13] 2026-10-24T20:54:37.9001196Z 23 │ import * as Deferred from "effect/Deferred"; 2026-10-24T20:54:37.9001290Z 24 │ import * as Duration from "effect/Duration"; 2026-10-24T20:54:37.9001371Z ·  ────┬─── 2026-10-24T20:54:37.9001508Z · ╰── 'Duration' is imported here 2026-10-24T20:54:37.9001595Z 25 │ import * as Effect from "effect/Effect"; 2026-10-24T20:54:37.9001647Z ╰──── 2026-10-24T20:54:37.9001747Z  help: Consider removing this import. 2026-10-24T20:54:37.9001749Z 2026-10-24T20:54:37.9002008Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.9002248Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:643:5] 2026-10-24T20:54:37.9002344Z 638 │ 2026-10-24T20:54:37.9002413Z 639 │ useEffect(() => { 2026-10-24T20:54:37.9002486Z ·  ────┬──── 2026-10-24T20:54:37.9002621Z · ╰── This is the containing effect 2026-10-24T20:54:37.9002733Z 640 │ if (pendingLaunchEntry.key === launchTargetKey) { 2026-10-24T20:54:37.9002798Z 641 │ return; 2026-10-24T20:54:37.9002854Z 642 │ } 2026-10-24T20:54:37.9002930Z 643 │ setPendingLaunchEntry({ 2026-10-24T20:54:37.9003022Z ·  ──────────┬────────── 2026-10-24T20:54:37.9003198Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.9003270Z 644 │ key: launchTargetKey, 2026-10-24T20:54:37.9003333Z ╰──── 2026-10-24T20:54:37.9003940Z  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-24T20:54:37.9004268Z  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-24T20:54:37.9004270Z 2026-10-24T20:54:37.9004527Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.9004695Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5] 2026-10-24T20:54:37.9004749Z 648 │ 2026-10-24T20:54:37.9004820Z 649 │ useEffect(() => { 2026-10-24T20:54:37.9004894Z ·  ────┬──── 2026-10-24T20:54:37.9005024Z · ╰── This is the containing effect 2026-10-24T20:54:37.9005140Z 650 │ if (initialAttachGridEntry.key === launchTargetKey) { 2026-10-24T20:54:37.9005202Z 651 │ return; 2026-10-24T20:54:37.9005258Z 652 │ } 2026-10-24T20:54:37.9005339Z 653 │ setInitialAttachGridEntry({ 2026-10-24T20:54:37.9005433Z ·  ────────────┬──────────── 2026-10-24T20:54:37.9005606Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.9005678Z 654 │ key: launchTargetKey, 2026-10-24T20:54:37.9005730Z ╰──── 2026-10-24T20:54:37.9006368Z  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-24T20:54:37.9006696Z  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-24T20:54:37.9006699Z 2026-10-24T20:54:37.9006958Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.9007126Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7] 2026-10-24T20:54:37.9007179Z 743 │ 2026-10-24T20:54:37.9007244Z 744 │ useEffect(() => { 2026-10-24T20:54:37.9007317Z ·  ────┬──── 2026-10-24T20:54:37.9007506Z · ╰── This is the containing effect 2026-10-24T20:54:37.9007636Z 745 │ if (!routeEnvironmentId || !routeThreadId) { 2026-10-24T20:54:37.9007706Z 746 │ setLastGridSize({ 2026-10-24T20:54:37.9007789Z ·  ───────┬─────── 2026-10-24T20:54:37.9007960Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.9008042Z 747 │ cols: DEFAULT_TERMINAL_COLS, 2026-10-24T20:54:37.9008095Z ╰──── 2026-10-24T20:54:37.9008689Z  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-24T20:54:37.9009015Z  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-24T20:54:37.9009020Z 2026-10-24T20:54:37.9009222Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:54:37.9009391Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24] 2026-10-24T20:54:37.9009448Z 537 │ }); 2026-10-24T20:54:37.9009576Z 538 │ }, [terminal.buffer, terminal.buffer.length, terminalKey]); 2026-10-24T20:54:37.9009688Z ·  ───────────┬────────── 2026-10-24T20:54:37.9009935Z · ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead 2026-10-24T20:54:37.9010105Z 539 │ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null; 2026-10-24T20:54:37.9010161Z ╰──── 2026-10-24T20:54:37.9010455Z  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-24T20:54:37.9010766Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.9010769Z 2026-10-24T20:54:37.9010970Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:54:37.9011138Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7] 2026-10-24T20:54:37.9011236Z 708 │ sentInitialInputKeyRef.current = null; 2026-10-24T20:54:37.9011302Z 709 │ }, [terminalKey]); 2026-10-24T20:54:37.9011386Z ·  ─────┬───── 2026-10-24T20:54:37.9011533Z · ╰── Unnecessary dependency `terminalKey` 2026-10-24T20:54:37.9011587Z 710 │ 2026-10-24T20:54:37.9011638Z ╰──── 2026-10-24T20:54:37.9011930Z  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-24T20:54:37.9012242Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.9012244Z 2026-10-24T20:54:37.9012443Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:54:37.9012611Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52] 2026-10-24T20:54:37.9012722Z 799 │ }; 2026-10-24T20:54:37.9012956Z 800 │ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]); 2026-10-24T20:54:37.9013140Z ·  ────────────┬──────────── ─────┬───── 2026-10-24T20:54:37.9013373Z · │ ╰── Unnecessary dependency `terminalKey` 2026-10-24T20:54:37.9013585Z · ╰── Unnecessary dependency `terminal.lifecycleVersion` 2026-10-24T20:54:37.9013637Z 801 │ 2026-10-24T20:54:37.9013690Z ╰──── 2026-10-24T20:54:37.9013988Z  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-24T20:54:37.9014305Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.9014307Z 2026-10-24T20:54:37.9014452Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:54:37.9014622Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24] 2026-10-24T20:54:37.9014677Z 792 │ } 2026-10-24T20:54:37.9014786Z 793 │ const pasteSession = pasteSessionRef.current; 2026-10-24T20:54:37.9014899Z ·  ───────────┬─────────── 2026-10-24T20:54:37.9015063Z · ╰── Cannot access ref value during render 2026-10-24T20:54:37.9015117Z 794 │ 2026-10-24T20:54:37.9015176Z ╰──── 2026-10-24T20:54:37.9015647Z  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-24T20:54:37.9015942Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:54:37.9015945Z 2026-10-24T20:54:37.9016140Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T20:54:37.9016327Z ╭─[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9] 2026-10-24T20:54:37.9016417Z 35 │ { 2026-10-24T20:54:37.9018177Z 201 │ terminalDebugLog("native:surface", { 2026-10-24T20:54:37.9018265Z 202 │ terminalKey: props.terminalKey, 2026-10-24T20:54:37.9018341Z 203 │ native: hasNativeSurface, 2026-10-24T20:54:37.9018477Z 204 │ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(), 2026-10-24T20:54:37.9018561Z 205 │ bufferLen: props.buffer.length, 2026-10-24T20:54:37.9018641Z 206 │ isRunning: props.isRunning, 2026-10-24T20:54:37.9018697Z 207 │ }); 2026-10-24T20:54:37.9018858Z 208 │ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]); 2026-10-24T20:54:37.9018957Z 209 │ const handleNativeInput = useCallback( 2026-10-24T20:54:37.9019078Z 210 │ (event: NativeSyntheticEvent) => { 2026-10-24T20:54:37.9019176Z 211 │ if (!props.isRunning || props.readOnly) { 2026-10-24T20:54:37.9019239Z 212 │ return; 2026-10-24T20:54:37.9019296Z 213 │ } 2026-10-24T20:54:37.9019386Z 214 │ terminalDebugLog("native:onInput", { 2026-10-24T20:54:37.9019537Z 215 │ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)), 2026-10-24T20:54:37.9019597Z 216 │ }); 2026-10-24T20:54:37.9019685Z 217 │ onInput(event.nativeEvent.data); 2026-10-24T20:54:37.9019742Z 218 │ }, 2026-10-24T20:54:37.9019840Z 219 │ [onInput, props.isRunning, props.readOnly], 2026-10-24T20:54:37.9019896Z 220 │ ); 2026-10-24T20:54:37.9019987Z 221 │ const handleNativeResize = useCallback( 2026-10-24T20:54:37.9020108Z 222 │ (event: NativeSyntheticEvent) => { 2026-10-24T20:54:37.9020175Z 223 │ onResize({ 2026-10-24T20:54:37.9020260Z 224 │ cols: event.nativeEvent.cols, 2026-10-24T20:54:37.9020344Z 225 │ rows: event.nativeEvent.rows, 2026-10-24T20:54:37.9020401Z 226 │ }); 2026-10-24T20:54:37.9020457Z 227 │ }, 2026-10-24T20:54:37.9020519Z 228 │ [onResize], 2026-10-24T20:54:37.9020574Z 229 │ ); 2026-10-24T20:54:37.9020626Z 230 │ 2026-10-24T20:54:37.9020709Z 231 │ if (NativeTerminalSurfaceView) { 2026-10-24T20:54:37.9020770Z 232 │ return ( 2026-10-24T20:54:37.9020847Z 233 │ 2026-10-24T20:54:37.9020927Z 234 │ ({ key: input.targetKey, location: candidate })); 2026-10-24T20:54:37.9023626Z 113 │ useEffect(() => { 2026-10-24T20:54:37.9023699Z ·  ────┬──── 2026-10-24T20:54:37.9023839Z · ╰── This is the containing effect 2026-10-24T20:54:37.9024007Z 114 │ if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) { 2026-10-24T20:54:37.9024070Z 115 │ return; 2026-10-24T20:54:37.9024127Z 116 │ } 2026-10-24T20:54:37.9024245Z 117 │ setEntry({ key: input.targetKey, location: candidate }); 2026-10-24T20:54:37.9024319Z ·  ────┬─── 2026-10-24T20:54:37.9024488Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.9024609Z 118 │ }, [candidate, entry.key, entry.location, input.targetKey]); 2026-10-24T20:54:37.9024661Z ╰──── 2026-10-24T20:54:37.9025271Z  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-24T20:54:37.9025602Z  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-24T20:54:37.9025605Z 2026-10-24T20:54:37.9025897Z ⚠ eslint(no-unused-vars): Variable 'revokeActiveMcpThread' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:54:37.9026026Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:218:7] 2026-10-24T20:54:37.9026080Z 217 │ 2026-10-24T20:54:37.9026258Z 218 │ const revokeActiveMcpThread = (threadId: ThreadId): Effect.Effect => 2026-10-24T20:54:37.9026352Z ·  ──────────┬────────── 2026-10-24T20:54:37.9026570Z · ╰── 'revokeActiveMcpThread' is declared here 2026-10-24T20:54:37.9026786Z 219 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeThread(threadId) : Effect.void; 2026-10-24T20:54:37.9026838Z ╰──── 2026-10-24T20:54:37.9026944Z  help: Consider removing this declaration. 2026-10-24T20:54:37.9026947Z 2026-10-24T20:54:37.9027254Z ⚠ eslint(no-unused-vars): Variable 'revokeAllActiveMcpCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:54:37.9027379Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:221:7] 2026-10-24T20:54:37.9027432Z 220 │ 2026-10-24T20:54:37.9027568Z 221 │ const revokeAllActiveMcpCredentials = (): Effect.Effect => 2026-10-24T20:54:37.9027672Z ·  ──────────────┬────────────── 2026-10-24T20:54:37.9027857Z · ╰── 'revokeAllActiveMcpCredentials' is declared here 2026-10-24T20:54:37.9028024Z 222 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void; 2026-10-24T20:54:37.9028077Z ╰──── 2026-10-24T20:54:37.9028182Z  help: Consider removing this declaration. 2026-10-24T20:54:37.9028184Z 2026-10-24T20:54:37.9028391Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-24T20:54:37.9028559Z ╭─[apps/server/src/sourceControl/SourceControlProviderRegistry.ts:15:13] 2026-10-24T20:54:37.9028633Z 14 │ } from "@t3tools/contracts"; 2026-10-24T20:54:37.9028725Z 15 │ import type {} from "@t3tools/contracts"; 2026-10-24T20:54:37.9028796Z ·  ── 2026-10-24T20:54:37.9028848Z 16 │ 2026-10-24T20:54:37.9028901Z ╰──── 2026-10-24T20:54:37.9028990Z  help: Remove empty braces 2026-10-24T20:54:37.9028995Z 2026-10-24T20:54:37.9029186Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T20:54:37.9029343Z ╭─[apps/mobile/src/features/terminal/TerminalContextSheet.tsx:72:15] 2026-10-24T20:54:37.9029410Z 71 │ 0 ? value : null; 2026-10-24T20:54:37.9032002Z ╰──── 2026-10-24T20:54:37.9032109Z  help: Consider removing this declaration. 2026-10-24T20:54:37.9032111Z 2026-10-24T20:54:37.9032297Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T20:54:37.9032434Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:121:27] 2026-10-24T20:54:37.9032598Z 120 │ const scope = makeScope(options.capabilities ?? new Set(["preview", "worktree"])); 2026-10-24T20:54:37.9032695Z 121 │ const dispatch = vi.fn((_: unknown) => 2026-10-24T20:54:37.9032781Z ·  ┬ 2026-10-24T20:54:37.9032913Z · ╰── '_' is declared here 2026-10-24T20:54:37.9033016Z 122 │ (options.dispatchGate ?? Effect.void).pipe( 2026-10-24T20:54:37.9033067Z ╰──── 2026-10-24T20:54:37.9033171Z  help: Consider removing this parameter. 2026-10-24T20:54:37.9033174Z 2026-10-24T20:54:37.9033356Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T20:54:37.9033493Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:134:39] 2026-10-24T20:54:37.9033549Z 133 │ ); 2026-10-24T20:54:37.9033657Z 134 │ const listLocalBranchNames = vi.fn((_: string) => 2026-10-24T20:54:37.9033761Z ·  ┬ 2026-10-24T20:54:37.9033905Z · ╰── '_' is declared here 2026-10-24T20:54:37.9033972Z 135 │ Effect.succeed( 2026-10-24T20:54:37.9034024Z ╰──── 2026-10-24T20:54:37.9034125Z  help: Consider removing this parameter. 2026-10-24T20:54:37.9034127Z 2026-10-24T20:54:37.9034308Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T20:54:37.9034443Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:178:31] 2026-10-24T20:54:37.9034499Z 177 │ }); 2026-10-24T20:54:37.9034598Z 178 │ const sendToThread = vi.fn((_: unknown) => { 2026-10-24T20:54:37.9034687Z ·  ┬ 2026-10-24T20:54:37.9034828Z · ╰── '_' is declared here 2026-10-24T20:54:37.9034930Z 179 │ switch (options.continuation ?? "queued") { 2026-10-24T20:54:37.9034981Z ╰──── 2026-10-24T20:54:37.9035083Z  help: Consider removing this parameter. 2026-10-24T20:54:37.9035085Z 2026-10-24T20:54:37.9035266Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T20:54:37.9035399Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:203:33] 2026-10-24T20:54:37.9035457Z 202 │ ); 2026-10-24T20:54:37.9035557Z 203 │ const removeWorktree = vi.fn((_: unknown) => 2026-10-24T20:54:37.9035649Z ·  ┬ 2026-10-24T20:54:37.9035787Z · ╰── '_' is declared here 2026-10-24T20:54:37.9035869Z 204 │ options.removeWorktreeFails 2026-10-24T20:54:37.9035920Z ╰──── 2026-10-24T20:54:37.9036084Z  help: Consider removing this parameter. 2026-10-24T20:54:37.9036120Z 2026-10-24T20:54:37.9036331Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T20:54:37.9036464Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:208:36] 2026-10-24T20:54:37.9036521Z 207 │ ); 2026-10-24T20:54:37.9036625Z 208 │ const deleteLocalBranch = vi.fn((_: unknown) => 2026-10-24T20:54:37.9036723Z ·  ┬ 2026-10-24T20:54:37.9036861Z · ╰── '_' is declared here 2026-10-24T20:54:37.9036948Z 209 │ options.deleteLocalBranchFails 2026-10-24T20:54:37.9036999Z ╰──── 2026-10-24T20:54:37.9037100Z  help: Consider removing this parameter. 2026-10-24T20:54:37.9037103Z 2026-10-24T20:54:37.9037288Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T20:54:37.9037426Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:213:42] 2026-10-24T20:54:37.9037481Z 212 │ ); 2026-10-24T20:54:37.9037595Z 213 │ const fetchWorktreeBaseCommit = vi.fn((_: unknown) => 2026-10-24T20:54:37.9037694Z ·  ┬ 2026-10-24T20:54:37.9037839Z · ╰── '_' is declared here 2026-10-24T20:54:37.9037925Z 214 │ options.fetchWorktreeBaseFails 2026-10-24T20:54:37.9037978Z ╰──── 2026-10-24T20:54:37.9038078Z  help: Consider removing this parameter. 2026-10-24T20:54:37.9038082Z 2026-10-24T20:54:37.9038265Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T20:54:37.9038402Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:254:30] 2026-10-24T20:54:37.9038456Z 253 │ ); 2026-10-24T20:54:37.9038604Z 254 │ const localStatus = vi.fn((_: unknown) => 2026-10-24T20:54:37.9038692Z ·  ┬ 2026-10-24T20:54:37.9038827Z · ╰── '_' is declared here 2026-10-24T20:54:37.9038896Z 255 │ Effect.succeed({ 2026-10-24T20:54:37.9038948Z ╰──── 2026-10-24T20:54:37.9039048Z  help: Consider removing this parameter. 2026-10-24T20:54:37.9039051Z 2026-10-24T20:54:37.9039231Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T20:54:37.9039365Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:264:32] 2026-10-24T20:54:37.9039424Z 263 │ ); 2026-10-24T20:54:37.9039578Z 264 │ const refreshStatus = vi.fn((_: string) => Effect.die("refreshStatus stub")); 2026-10-24T20:54:37.9039670Z ·  ┬ 2026-10-24T20:54:37.9039806Z · ╰── '_' is declared here 2026-10-24T20:54:37.9039953Z 265 │ const runForThread = vi.fn((input: { readonly worktreePath: string }) => { 2026-10-24T20:54:37.9040004Z ╰──── 2026-10-24T20:54:37.9040105Z  help: Consider removing this parameter. 2026-10-24T20:54:37.9040107Z 2026-10-24T20:54:37.9040367Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.9040503Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:68:5] 2026-10-24T20:54:37.9040686Z 66 │ const { id: attachmentId, fileUri } = attachment; 2026-10-24T20:54:37.9040793Z 67 │ useEffect(() => { 2026-10-24T20:54:37.9040866Z ·  ────┬──── 2026-10-24T20:54:37.9040997Z · ╰── This is the containing effect 2026-10-24T20:54:37.9041061Z 68 │ setUri(null); 2026-10-24T20:54:37.9041134Z ·  ───┬── 2026-10-24T20:54:37.9041300Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.9041365Z 69 │ setError(null); 2026-10-24T20:54:37.9041416Z ╰──── 2026-10-24T20:54:37.9042025Z  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-24T20:54:37.9042351Z  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-24T20:54:37.9042354Z 2026-10-24T20:54:37.9042557Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:54:37.9042694Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:91:7] 2026-10-24T20:54:37.9042748Z 90 │ }; 2026-10-24T20:54:37.9042824Z 91 │ }, [attachmentId, fileUri]); 2026-10-24T20:54:37.9042945Z ·  ──────┬───── ───┬─── 2026-10-24T20:54:37.9043128Z · │ ╰── Unnecessary dependency `fileUri` 2026-10-24T20:54:37.9043283Z · ╰── Unnecessary dependency `attachmentId` 2026-10-24T20:54:37.9043422Z 92 │ const mimeType = videoMimeType(attachment) ?? attachment.mimeType; 2026-10-24T20:54:37.9043475Z ╰──── 2026-10-24T20:54:37.9043769Z  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-24T20:54:37.9044080Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.9044084Z 2026-10-24T20:54:37.9044297Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T20:54:37.9044437Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:213:34] 2026-10-24T20:54:37.9044504Z 212 │ useEffect(() => { 2026-10-24T20:54:37.9044624Z 213 │ if (!isFocused && hasSource) props.onRequestClose(); 2026-10-24T20:54:37.9044727Z ·  ──┬── 2026-10-24T20:54:37.9044877Z · ╰── Missing dependency `props` 2026-10-24T20:54:37.9044984Z 214 │ }, [isFocused, hasSource, props.onRequestClose]); 2026-10-24T20:54:37.9045098Z ·  ──────────┬───────── 2026-10-24T20:54:37.9045327Z · ╰── Overly precise dependency `props.onRequestClose`, use `props` instead 2026-10-24T20:54:37.9045400Z 215 │ const { source } = props; 2026-10-24T20:54:37.9045453Z ╰──── 2026-10-24T20:54:37.9045932Z  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-24T20:54:37.9046307Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.9046312Z 2026-10-24T20:54:37.9046569Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.9046703Z ╭─[apps/mobile/src/components/ProjectFavicon.tsx:172:5] 2026-10-24T20:54:37.9046893Z 167 │ const [activeFaviconRequest, setActiveFaviconRequest] = useState(null); 2026-10-24T20:54:37.9046966Z 168 │ useLayoutEffect(() => { 2026-10-24T20:54:37.9047044Z ·  ───────┬─────── 2026-10-24T20:54:37.9047178Z · ╰── This is the containing effect 2026-10-24T20:54:37.9047276Z 169 │ if (faviconRequest === null) return; 2026-10-24T20:54:37.9047337Z 170 │ 2026-10-24T20:54:37.9047471Z 171 │ const endRequest = beginProjectFaviconRequest(faviconRequest); 2026-10-24T20:54:37.9047570Z 172 │ setActiveFaviconRequest(faviconRequest); 2026-10-24T20:54:37.9047661Z ·  ───────────┬─────────── 2026-10-24T20:54:37.9047834Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.9047902Z 173 │ return endRequest; 2026-10-24T20:54:37.9047955Z ╰──── 2026-10-24T20:54:37.9048558Z  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-24T20:54:37.9048883Z  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-24T20:54:37.9048885Z 2026-10-24T20:54:37.9049081Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T20:54:37.9049228Z ╭─[apps/mobile/src/components/ComposerContextSheet.tsx:272:25] 2026-10-24T20:54:37.9049339Z 271 │ {record.elements?.map((element, index) => ( 2026-10-24T20:54:37.9049509Z 272 │ 2026-10-24T20:54:37.9049666Z ·  ─────────────────────────────────────────────────────── 2026-10-24T20:54:37.9049741Z 273 │ { 2026-10-24T20:54:37.9068847Z 167 │ const record = 2026-10-24T20:54:37.9068927Z 168 │ token.type === "context" 2026-10-24T20:54:37.9069151Z 169 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-24T20:54:37.9069246Z 170 │ : undefined; 2026-10-24T20:54:37.9069357Z 171 │ const presentation = contextChipPresentation( 2026-10-24T20:54:37.9069467Z 172 │ token.type === "context" ? token.kind : token.type, 2026-10-24T20:54:37.9069531Z 173 │ record, 2026-10-24T20:54:37.9069592Z 174 │ ); 2026-10-24T20:54:37.9069678Z 175 │ const icon = contextChipIcon( 2026-10-24T20:54:37.9069745Z 176 │ presentation, 2026-10-24T20:54:37.9069890Z 177 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-24T20:54:37.9069949Z 178 │ ); 2026-10-24T20:54:37.9070014Z 179 │ return { 2026-10-24T20:54:37.9070085Z 180 │ type: token.type, 2026-10-24T20:54:37.9070161Z 181 │ source: token.source, 2026-10-24T20:54:37.9070241Z 182 │ start: token.start, 2026-10-24T20:54:37.9070310Z 183 │ end: token.end, 2026-10-24T20:54:37.9070461Z 184 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-24T20:54:37.9070523Z 185 │ label: 2026-10-24T20:54:37.9070602Z 186 │ token.type === "skill" 2026-10-24T20:54:37.9070711Z 187 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-24T20:54:37.9070796Z 188 │ : token.type === "context" 2026-10-24T20:54:37.9071034Z 189 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-24T20:54:37.9071118Z 190 │ : basename(token.value), 2026-10-24T20:54:37.9071263Z 191 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-24T20:54:37.9071356Z 192 │ iconUri: contextChipIconUri(icon), 2026-10-24T20:54:37.9071451Z 193 │ tintsIcon: icon.kind === "chip", 2026-10-24T20:54:37.9071513Z 194 │ }; 2026-10-24T20:54:37.9071571Z 195 │ }), 2026-10-24T20:54:37.9071627Z 196 │ ); 2026-10-24T20:54:37.9071762Z 197 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-24T20:54:37.9071916Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-24T20:54:37.9072121Z · ╰── This dependency list is missing values used by the callback 2026-10-24T20:54:37.9072260Z 198 │ // Every render resolves against the snapshot history, so a render whose 2026-10-24T20:54:37.9072313Z ╰──── 2026-10-24T20:54:37.9072521Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T20:54:37.9072846Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.9072852Z 2026-10-24T20:54:37.9073039Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T20:54:37.9073183Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:259:5] 2026-10-24T20:54:37.9073315Z 251 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-24T20:54:37.9073420Z 252 │ nativeEventSnapshotsRef.current.push({ 2026-10-24T20:54:37.9073513Z ·  ───────────┬─────────── 2026-10-24T20:54:37.9074027Z · ╰── 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-24T20:54:37.9074150Z 253 │ eventCount: acknowledgedEventCount, 2026-10-24T20:54:37.9074214Z 254 │ value, 2026-10-24T20:54:37.9074296Z 255 │ selection: nextSelection, 2026-10-24T20:54:37.9074354Z 256 │ }); 2026-10-24T20:54:37.9074439Z 257 │ return acknowledgedEventCount; 2026-10-24T20:54:37.9074495Z 258 │ }, 2026-10-24T20:54:37.9074552Z 259 │ [], 2026-10-24T20:54:37.9074622Z ·  ─┬ 2026-10-24T20:54:37.9074804Z · ╰── This dependency list is missing values used by the callback 2026-10-24T20:54:37.9074859Z 260 │ ); 2026-10-24T20:54:37.9074911Z ╰──── 2026-10-24T20:54:37.9075116Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T20:54:37.9075437Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.9075444Z 2026-10-24T20:54:37.9075611Z ⚠ eslint(no-control-regex): Unexpected control character 2026-10-24T20:54:37.9075807Z ╭─[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46] 2026-10-24T20:54:37.9075947Z 219 │ 2026-10-24T20:54:37.9076091Z 220 │ {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")} 2026-10-24T20:54:37.9076236Z ·  ──┬─ 2026-10-24T20:54:37.9076404Z · ╰── 'U+001B' is a control character. 2026-10-24T20:54:37.9076475Z 221 │ 2026-10-24T20:54:37.9076530Z ╰──── 2026-10-24T20:54:37.9076762Z  help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression. 2026-10-24T20:54:37.9076764Z 2026-10-24T20:54:37.9077024Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.9077209Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:119:10] 2026-10-24T20:54:37.9077265Z 117 │ 2026-10-24T20:54:37.9077332Z 118 │ useEffect(() => { 2026-10-24T20:54:37.9077405Z ·  ────┬──── 2026-10-24T20:54:37.9077537Z · ╰── This is the containing effect 2026-10-24T20:54:37.9077619Z 119 │ void refreshNotifications(); 2026-10-24T20:54:37.9077716Z ·  ──────────┬───────── 2026-10-24T20:54:37.9077896Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.9078039Z 120 │ const subscription = AppState.addEventListener("change", (state) => { 2026-10-24T20:54:37.9078092Z ╰──── 2026-10-24T20:54:37.9078759Z  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-24T20:54:37.9079083Z  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-24T20:54:37.9079085Z 2026-10-24T20:54:37.9079410Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.9079634Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7] 2026-10-24T20:54:37.9079690Z 125 │ 2026-10-24T20:54:37.9079755Z 126 │ useEffect(() => { 2026-10-24T20:54:37.9079827Z ·  ────┬──── 2026-10-24T20:54:37.9079956Z · ╰── This is the containing effect 2026-10-24T20:54:37.9080022Z 127 │ if (!isLoaded) { 2026-10-24T20:54:37.9080114Z 128 │ setLiveActivityStatus("checking"); 2026-10-24T20:54:37.9080205Z ·  ──────────┬────────── 2026-10-24T20:54:37.9080378Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.9080448Z 129 │ return; 2026-10-24T20:54:37.9080505Z ╰──── 2026-10-24T20:54:37.9081102Z  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-24T20:54:37.9081424Z  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-24T20:54:37.9081426Z 2026-10-24T20:54:37.9081892Z ⚠ 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-24T20:54:37.9082079Z ╭─[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:521:13] 2026-10-24T20:54:37.9082154Z 520 │ })).delivery; 2026-10-24T20:54:37.9082354Z 521 │ ╭─▶ while (delivery.outcome === "accepted") { 2026-10-24T20:54:37.9082471Z 522 │ │ yield* Effect.yieldNow; 2026-10-24T20:54:37.9082618Z 523 │ │ delivery = (yield* service.getWebhookDelivery({ 2026-10-24T20:54:37.9082720Z 524 │ │ id: task.id, 2026-10-24T20:54:37.9082839Z 525 │ │ deliveryId: deliveryId!, 2026-10-24T20:54:37.9082938Z 526 │ │ })).delivery; 2026-10-24T20:54:37.9083085Z 527 │ ╰─▶ } 2026-10-24T20:54:37.9083206Z 528 │ assert.equal(delivery.outcome, "dispatch_failed"); 2026-10-24T20:54:37.9083258Z ╰──── 2026-10-24T20:54:37.9083261Z 2026-10-24T20:54:37.9083472Z ⚠ eslint(no-unused-vars): Function 'describeSchedule' is declared but never used. 2026-10-24T20:54:37.9083598Z ╭─[apps/server/src/scheduledTasks/Schedule.ts:79:10] 2026-10-24T20:54:37.9083653Z 78 │ 2026-10-24T20:54:37.9083789Z 79 │ function describeSchedule(schedule: ScheduledTaskSchedule): string { 2026-10-24T20:54:37.9083877Z ·  ────────┬─────── 2026-10-24T20:54:37.9084026Z · ╰── 'describeSchedule' is declared here 2026-10-24T20:54:37.9084136Z 80 │ if (schedule.type === "webhook") return "On webhook"; 2026-10-24T20:54:37.9084190Z ╰──── 2026-10-24T20:54:37.9084353Z  help: Consider removing this declaration. 2026-10-24T20:54:37.9084390Z 2026-10-24T20:54:37.9084572Z ⚠ eslint(no-unused-vars): Type 'Scope' is imported but never used. 2026-10-24T20:54:37.9084711Z ╭─[apps/server/src/provider/ProviderAuthService.ts:15:18] 2026-10-24T20:54:37.9084799Z 14 │ import * as Layer from "effect/Layer"; 2026-10-24T20:54:37.9084893Z 15 │ import type * as Scope from "effect/Scope"; 2026-10-24T20:54:37.9084973Z ·  ──┬── 2026-10-24T20:54:37.9085110Z · ╰── 'Scope' is imported here 2026-10-24T20:54:37.9085197Z 16 │ import * as Stream from "effect/Stream"; 2026-10-24T20:54:37.9085250Z ╰──── 2026-10-24T20:54:37.9085348Z  help: Consider removing this import. 2026-10-24T20:54:37.9085351Z 2026-10-24T20:54:37.9085638Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-24T20:54:37.9085771Z ╭─[apps/server/src/provider/AntigravityAuth.ts:285:20] 2026-10-24T20:54:37.9085829Z 284 │ }, 2026-10-24T20:54:37.9085910Z 285 │ (effect, flow, stopSessions) => 2026-10-24T20:54:37.9086004Z ·  ──────┬───── 2026-10-24T20:54:37.9086152Z · ╰── 'stopSessions' is declared here 2026-10-24T20:54:37.9086257Z 286 │ effect.pipe( 2026-10-24T20:54:37.9086308Z ╰──── 2026-10-24T20:54:37.9086412Z  help: Consider removing this parameter. 2026-10-24T20:54:37.9086415Z 2026-10-24T20:54:37.9086615Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:54:37.9086781Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:155:7] 2026-10-24T20:54:37.9086841Z 154 │ } 2026-10-24T20:54:37.9086910Z 155 │ }, [wrappedRender]); 2026-10-24T20:54:37.9086991Z ·  ──────┬────── 2026-10-24T20:54:37.9087142Z · ╰── Unnecessary dependency `wrappedRender` 2026-10-24T20:54:37.9087195Z 156 │ 2026-10-24T20:54:37.9087249Z ╰──── 2026-10-24T20:54:37.9087546Z  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-24T20:54:37.9087857Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.9087860Z 2026-10-24T20:54:37.9088108Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T20:54:37.9088271Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:800:42] 2026-10-24T20:54:37.9088329Z 799 │ > 2026-10-24T20:54:37.9088461Z 800 │ 2026-10-24T20:54:37.9088588Z ·  ──────────────────── 2026-10-24T20:54:37.9088688Z 801 │ 2026-10-24T20:54:37.9088741Z ╰──── 2026-10-24T20:54:37.9088967Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T20:54:37.9089106Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T20:54:37.9089109Z 2026-10-24T20:54:37.9089322Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:54:37.9089507Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-24T20:54:37.9089561Z 83 │ 2026-10-24T20:54:37.9089655Z 84 │ const cardCoverage = props.cardCoverage; 2026-10-24T20:54:37.9089734Z ·  ──────┬───── 2026-10-24T20:54:37.9089870Z · ╰── `cardCoverage` originates here 2026-10-24T20:54:37.9089952Z 85 │ const barHeightRef = useRef(0); 2026-10-24T20:54:37.9090032Z 86 │ const cardHeightRef = useRef(0); 2026-10-24T20:54:37.9090116Z 87 │ const cardHeight = useSharedValue(0); 2026-10-24T20:54:37.9090209Z 88 │ const notifyCoverage = useCallback(() => { 2026-10-24T20:54:37.9090278Z 89 │ if (!cardCoverage) { 2026-10-24T20:54:37.9090339Z 90 │ return; 2026-10-24T20:54:37.9090400Z 91 │ } 2026-10-24T20:54:37.9090567Z 92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-24T20:54:37.9090670Z 93 │ // feed inset and floating controls trailing it. 2026-10-24T20:54:37.9090832Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T20:54:37.9090909Z ·  ──────┬───── 2026-10-24T20:54:37.9091047Z · ╰── `cardCoverage` cannot be modified 2026-10-24T20:54:37.9091114Z 95 │ }, [cardCoverage]); 2026-10-24T20:54:37.9091167Z ╰──── 2026-10-24T20:54:37.9091461Z  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-24T20:54:37.9091777Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:54:37.9091782Z 2026-10-24T20:54:37.9091940Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:54:37.9092096Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:106:7] 2026-10-24T20:54:37.9092178Z  86 │ const cardHeightRef = useRef(0); 2026-10-24T20:54:37.9092264Z  87 │ const cardHeight = useSharedValue(0); 2026-10-24T20:54:37.9092344Z ·  ─────┬──── 2026-10-24T20:54:37.9092481Z · ╰── `cardHeight` originates here 2026-10-24T20:54:37.9092576Z  88 │ const notifyCoverage = useCallback(() => { 2026-10-24T20:54:37.9092644Z  89 │ if (!cardCoverage) { 2026-10-24T20:54:37.9092706Z  90 │ return; 2026-10-24T20:54:37.9092816Z  91 │ } 2026-10-24T20:54:37.9093010Z  92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-24T20:54:37.9093114Z  93 │ // feed inset and floating controls trailing it. 2026-10-24T20:54:37.9093274Z  94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T20:54:37.9093342Z  95 │ }, [cardCoverage]); 2026-10-24T20:54:37.9093426Z  96 │ const handleBarLayout = useCallback( 2026-10-24T20:54:37.9093510Z  97 │ (event: LayoutChangeEvent) => { 2026-10-24T20:54:37.9093634Z  98 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T20:54:37.9093702Z  99 │ notifyCoverage(); 2026-10-24T20:54:37.9093758Z 100 │ }, 2026-10-24T20:54:37.9093827Z 101 │ [notifyCoverage], 2026-10-24T20:54:37.9093883Z 102 │ ); 2026-10-24T20:54:37.9093970Z 103 │ const handleCardLayout = useCallback( 2026-10-24T20:54:37.9094058Z 104 │ (event: LayoutChangeEvent) => { 2026-10-24T20:54:37.9094188Z 105 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T20:54:37.9094302Z 106 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-24T20:54:37.9094380Z ·  ─────┬──── 2026-10-24T20:54:37.9094518Z · ╰── `cardHeight` cannot be modified 2026-10-24T20:54:37.9094588Z 107 │ notifyCoverage(); 2026-10-24T20:54:37.9094641Z ╰──── 2026-10-24T20:54:37.9094908Z  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-24T20:54:37.9095216Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:54:37.9095224Z 2026-10-24T20:54:37.9095428Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T20:54:37.9095584Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-24T20:54:37.9095670Z 87 │ const cardHeight = useSharedValue(0); 2026-10-24T20:54:37.9095762Z 88 │ const notifyCoverage = useCallback(() => { 2026-10-24T20:54:37.9095865Z ·  ───┬─── 2026-10-24T20:54:37.9096105Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-24T20:54:37.9096206Z 89 │ if (!cardCoverage) { 2026-10-24T20:54:37.9096268Z 90 │ return; 2026-10-24T20:54:37.9096322Z 91 │ } 2026-10-24T20:54:37.9096493Z 92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-24T20:54:37.9096599Z 93 │ // feed inset and floating controls trailing it. 2026-10-24T20:54:37.9096758Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T20:54:37.9096834Z ·  ──────┬───── 2026-10-24T20:54:37.9096968Z · ╰── This modifies `cardCoverage` 2026-10-24T20:54:37.9097038Z 95 │ }, [cardCoverage]); 2026-10-24T20:54:37.9097091Z ╰──── 2026-10-24T20:54:37.9097434Z  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-24T20:54:37.9097741Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:54:37.9097810Z 2026-10-24T20:54:37.9098044Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T20:54:37.9098199Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-24T20:54:37.9098300Z 93 │ // feed inset and floating controls trailing it. 2026-10-24T20:54:37.9098460Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T20:54:37.9098537Z ·  ──────┬───── 2026-10-24T20:54:37.9098670Z · ╰── This modifies `cardCoverage` 2026-10-24T20:54:37.9098735Z 95 │ }, [cardCoverage]); 2026-10-24T20:54:37.9098822Z 96 │ const handleBarLayout = useCallback( 2026-10-24T20:54:37.9098904Z 97 │ (event: LayoutChangeEvent) => { 2026-10-24T20:54:37.9099016Z ·  ───────────────┬─────────────── 2026-10-24T20:54:37.9099241Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-24T20:54:37.9099365Z 98 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T20:54:37.9099418Z ╰──── 2026-10-24T20:54:37.9099754Z  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-24T20:54:37.9100060Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:54:37.9100063Z 2026-10-24T20:54:37.9100260Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T20:54:37.9100424Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:106:7] 2026-10-24T20:54:37.9100516Z 103 │ const handleCardLayout = useCallback( 2026-10-24T20:54:37.9100600Z 104 │ (event: LayoutChangeEvent) => { 2026-10-24T20:54:37.9100707Z ·  ───────────────┬─────────────── 2026-10-24T20:54:37.9100928Z · ╰── This function may (indirectly) reassign or modify `cardHeight` after render 2026-10-24T20:54:37.9101058Z 105 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T20:54:37.9101175Z 106 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-24T20:54:37.9101251Z ·  ─────┬──── 2026-10-24T20:54:37.9101383Z · ╰── This modifies `cardHeight` 2026-10-24T20:54:37.9101452Z 107 │ notifyCoverage(); 2026-10-24T20:54:37.9101511Z ╰──── 2026-10-24T20:54:37.9101849Z  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-24T20:54:37.9102155Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:54:37.9102158Z 2026-10-24T20:54:37.9102316Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:54:37.9102480Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:42:5] 2026-10-24T20:54:37.9102534Z 35 │ 2026-10-24T20:54:37.9102674Z 36 │ const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0); 2026-10-24T20:54:37.9102762Z ·  ────────┬──────── 2026-10-24T20:54:37.9102982Z · ╰── `inspectorProgress` originates here 2026-10-24T20:54:37.9103111Z 37 │ const { renderedInspectorWidth } = props; 2026-10-24T20:54:37.9103245Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-24T20:54:37.9103299Z 39 │ 2026-10-24T20:54:37.9103380Z 40 │ const onClosed = props.onClosed; 2026-10-24T20:54:37.9103446Z 41 │ useEffect(() => { 2026-10-24T20:54:37.9103536Z 42 │ inspectorProgress.value = withTiming( 2026-10-24T20:54:37.9103619Z ·  ────────┬──────── 2026-10-24T20:54:37.9103769Z · ╰── `inspectorProgress` cannot be modified 2026-10-24T20:54:37.9103848Z 43 │ inspectorVisible ? 1 : 0, 2026-10-24T20:54:37.9103899Z ╰──── 2026-10-24T20:54:37.9104172Z  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-24T20:54:37.9104479Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:54:37.9104482Z 2026-10-24T20:54:37.9104638Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:54:37.9104796Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:67:7] 2026-10-24T20:54:37.9104890Z 37 │ const { renderedInspectorWidth } = props; 2026-10-24T20:54:37.9105023Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-24T20:54:37.9105115Z ·  ──────────┬───────── 2026-10-24T20:54:37.9105270Z · ╰── `renderedContentWidth` originates here 2026-10-24T20:54:37.9105329Z 39 │ 2026-10-24T20:54:37.9105412Z 40 │ const onClosed = props.onClosed; 2026-10-24T20:54:37.9105478Z 41 │ useEffect(() => { 2026-10-24T20:54:37.9105567Z 42 │ inspectorProgress.value = withTiming( 2026-10-24T20:54:37.9105644Z 43 │ inspectorVisible ? 1 : 0, 2026-10-24T20:54:37.9105717Z 44 │ WORKSPACE_PANE_TIMING, 2026-10-24T20:54:37.9105783Z 45 │ (finished) => { 2026-10-24T20:54:37.9105923Z 46 │ if (finished === true && !inspectorVisible && onClosed !== undefined) { 2026-10-24T20:54:37.9105997Z 47 │ runOnJS(onClosed)(); 2026-10-24T20:54:37.9106055Z 48 │ } 2026-10-24T20:54:37.9106112Z 49 │ }, 2026-10-24T20:54:37.9106194Z 50 │ ); 2026-10-24T20:54:37.9106328Z 51 │ const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0; 2026-10-24T20:54:37.9106408Z 52 │ renderedInspectorWidth.set( 2026-10-24T20:54:37.9106559Z 53 │ resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING), 2026-10-24T20:54:37.9106616Z 54 │ ); 2026-10-24T20:54:37.9106672Z 55 │ }, [ 2026-10-24T20:54:37.9106741Z 56 │ inspectorProgress, 2026-10-24T20:54:37.9106806Z 57 │ inspectorVisible, 2026-10-24T20:54:37.9106870Z 58 │ inspectorWidth, 2026-10-24T20:54:37.9106933Z 59 │ onClosed, 2026-10-24T20:54:37.9107006Z 60 │ renderedInspectorWidth, 2026-10-24T20:54:37.9107065Z 61 │ resizing, 2026-10-24T20:54:37.9107120Z 62 │ ]); 2026-10-24T20:54:37.9107173Z 63 │ 2026-10-24T20:54:37.9107237Z 64 │ useEffect(() => { 2026-10-24T20:54:37.9107329Z 65 │ const targetWidth = inspectorWidth ?? 0; 2026-10-24T20:54:37.9107415Z 66 │ if (!inspectorVisible || resizing) { 2026-10-24T20:54:37.9107514Z 67 │ renderedContentWidth.value = targetWidth; 2026-10-24T20:54:37.9107672Z ·  ──────────┬───────── 2026-10-24T20:54:37.9107872Z · ╰── `renderedContentWidth` cannot be modified 2026-10-24T20:54:37.9107934Z 68 │ return; 2026-10-24T20:54:37.9107988Z ╰──── 2026-10-24T20:54:37.9108253Z  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-24T20:54:37.9108559Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:54:37.9108561Z 2026-10-24T20:54:37.9109013Z ⚠ 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-24T20:54:37.9109148Z ╭─[apps/server/src/serverSettings.test.ts:1741:32] 2026-10-24T20:54:37.9109327Z 1740 │ const model = createModelSelection(ProviderInstanceId.make("codex"), "gpt-5.5"); 2026-10-24T20:54:37.9109515Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-24T20:54:37.9109631Z ·  ─────────────────── 2026-10-24T20:54:37.9109743Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-24T20:54:37.9109797Z ╰──── 2026-10-24T20:54:37.9109800Z 2026-10-24T20:54:37.9110250Z ⚠ 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-24T20:54:37.9110379Z ╭─[apps/server/src/serverSettings.test.ts:1742:34] 2026-10-24T20:54:37.9110567Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-24T20:54:37.9110678Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-24T20:54:37.9110795Z ·  ─────────────────── 2026-10-24T20:54:37.9110913Z 1743 │ Schema.fromJsonString(Schema.Array(ProjectScript)), 2026-10-24T20:54:37.9110968Z ╰──── 2026-10-24T20:54:37.9110971Z 2026-10-24T20:54:37.9111129Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:54:37.9111277Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:174:5] 2026-10-24T20:54:37.9111420Z 170 │ const expandedAngle = props.collapsedDirection === "right" ? 90 : 180; 2026-10-24T20:54:37.9111565Z 171 │ const rotation = useSharedValue(props.expanded ? expandedAngle : 0); 2026-10-24T20:54:37.9111647Z ·  ────┬─── 2026-10-24T20:54:37.9111781Z · ╰── `rotation` originates here 2026-10-24T20:54:37.9111836Z 172 │ 2026-10-24T20:54:37.9111907Z 173 │ useLayoutEffect(() => { 2026-10-24T20:54:37.9112043Z 174 │ rotation.value = withTiming(props.expanded ? expandedAngle : 0, { 2026-10-24T20:54:37.9112120Z ·  ────┬─── 2026-10-24T20:54:37.9112252Z · ╰── `rotation` cannot be modified 2026-10-24T20:54:37.9112355Z 175 │ duration: THREAD_DISCLOSURE_TRANSITION_MS, 2026-10-24T20:54:37.9112408Z ╰──── 2026-10-24T20:54:37.9112674Z  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-24T20:54:37.9113041Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:54:37.9113081Z 2026-10-24T20:54:37.9113277Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T20:54:37.9113430Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:1246:23] 2026-10-24T20:54:37.9113501Z 1245 │ decodeJson(message)).filter(isRpcRequest)[index]; 2026-10-24T20:54:37.9117027Z 242 │ │ if (request) { 2026-10-24T20:54:37.9117129Z 243 │ │ return request; 2026-10-24T20:54:37.9117207Z 244 │ │ } 2026-10-24T20:54:37.9117313Z 245 │ │ yield* Effect.yieldNow; 2026-10-24T20:54:37.9117439Z 246 │ ╰─▶ } 2026-10-24T20:54:37.9117611Z 247 │ return yield* Effect.die(new Error("Expected the RPC protocol to send a request.")); 2026-10-24T20:54:37.9117669Z ╰──── 2026-10-24T20:54:37.9117672Z 2026-10-24T20:54:37.9118144Z ⚠ 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-24T20:54:37.9118283Z ╭─[packages/client-runtime/src/rpc/client.test.ts:131:9] 2026-10-24T20:54:37.9118347Z 130 │ ) { 2026-10-24T20:54:37.9118608Z 131 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T20:54:37.9118739Z 132 │ │ if (subscriptions.length >= count) { 2026-10-24T20:54:37.9118834Z 133 │ │ return; 2026-10-24T20:54:37.9118918Z 134 │ │ } 2026-10-24T20:54:37.9119032Z 135 │ │ yield* Effect.yieldNow; 2026-10-24T20:54:37.9119177Z 136 │ ╰─▶ } 2026-10-24T20:54:37.9119352Z 137 │ return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`)); 2026-10-24T20:54:37.9119406Z ╰──── 2026-10-24T20:54:37.9119409Z 2026-10-24T20:54:37.9119875Z ⚠ 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-24T20:54:37.9120012Z ╭─[packages/client-runtime/src/rpc/client.test.ts:252:7] 2026-10-24T20:54:37.9120179Z 251 │ yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient))); 2026-10-24T20:54:37.9120435Z 252 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) { 2026-10-24T20:54:37.9120547Z 253 │ │ yield* Effect.yieldNow; 2026-10-24T20:54:37.9120686Z 254 │ ╰─▶ } 2026-10-24T20:54:37.9120818Z 255 │ yield* SubscriptionRef.set(activeSession, Option.none()); 2026-10-24T20:54:37.9120874Z ╰──── 2026-10-24T20:54:37.9120876Z 2026-10-24T20:54:37.9121337Z ⚠ 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-24T20:54:37.9121472Z ╭─[packages/client-runtime/src/rpc/client.test.ts:258:7] 2026-10-24T20:54:37.9121531Z 257 │ 2026-10-24T20:54:37.9121866Z 258 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-24T20:54:37.9122021Z 259 │ │ yield* Effect.yieldNow; 2026-10-24T20:54:37.9122153Z 260 │ ╰─▶ } 2026-10-24T20:54:37.9122267Z 261 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-24T20:54:37.9122324Z ╰──── 2026-10-24T20:54:37.9122326Z 2026-10-24T20:54:37.9122792Z ⚠ 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-24T20:54:37.9122927Z ╭─[packages/client-runtime/src/rpc/client.test.ts:322:7] 2026-10-24T20:54:37.9122994Z 321 │ ); 2026-10-24T20:54:37.9123260Z 322 │ ╭─▶ for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) { 2026-10-24T20:54:37.9123375Z 323 │ │ yield* Effect.yieldNow; 2026-10-24T20:54:37.9123510Z 324 │ ╰─▶ } 2026-10-24T20:54:37.9123600Z 325 │ 2026-10-24T20:54:37.9123691Z ╰──── 2026-10-24T20:54:37.9123694Z 2026-10-24T20:54:37.9124184Z ⚠ 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-24T20:54:37.9124338Z ╭─[packages/client-runtime/src/rpc/client.test.ts:330:7] 2026-10-24T20:54:37.9124596Z 329 │ yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient))); 2026-10-24T20:54:37.9124886Z 330 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-24T20:54:37.9125030Z 331 │ │ yield* Effect.yieldNow; 2026-10-24T20:54:37.9125185Z 332 │ ╰─▶ } 2026-10-24T20:54:37.9125330Z 333 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-24T20:54:37.9125427Z ╰──── 2026-10-24T20:54:37.9125430Z 2026-10-24T20:54:37.9125650Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T20:54:37.9125856Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:100:85] 2026-10-24T20:54:37.9125970Z  99 │ const startEditor = startScheduledTaskEditor; 2026-10-24T20:54:37.9126258Z 100 │ const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]); 2026-10-24T20:54:37.9126442Z ·  ─────┬───── 2026-10-24T20:54:37.9126685Z · ╰── Unnecessary dependency `startEditor` 2026-10-24T20:54:37.9126783Z 101 │ const readEditor = useCallback( 2026-10-24T20:54:37.9126872Z ╰──── 2026-10-24T20:54:37.9127232Z  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-24T20:54:37.9127584Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.9127587Z 2026-10-24T20:54:37.9127874Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T20:54:37.9128076Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:121:7] 2026-10-24T20:54:37.9128194Z 120 │ setEditor, 2026-10-24T20:54:37.9128298Z 121 │ startEditor, 2026-10-24T20:54:37.9128405Z ·  ─────┬───── 2026-10-24T20:54:37.9128567Z · ╰── Unnecessary dependency `startEditor` 2026-10-24T20:54:37.9128665Z 122 │ hasChanges, 2026-10-24T20:54:37.9128759Z ╰──── 2026-10-24T20:54:37.9129110Z  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-24T20:54:37.9129448Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.9129473Z 2026-10-24T20:54:37.9129742Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.9129989Z ╭─[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:60:5] 2026-10-24T20:54:37.9130080Z 58 │ 2026-10-24T20:54:37.9130177Z 59 │ useEffect(() => { 2026-10-24T20:54:37.9130268Z ·  ────┬──── 2026-10-24T20:54:37.9130437Z · ╰── This is the containing effect 2026-10-24T20:54:37.9130572Z 60 │ setMountedModes((current) => { 2026-10-24T20:54:37.9130687Z ·  ───────┬─────── 2026-10-24T20:54:37.9130879Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.9130991Z 61 │ if (current.has(props.mode)) { 2026-10-24T20:54:37.9131101Z ╰──── 2026-10-24T20:54:37.9131736Z  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-24T20:54:37.9132089Z  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-24T20:54:37.9132092Z 2026-10-24T20:54:37.9132575Z ⚠ 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-24T20:54:37.9132798Z ╭─[apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts:223:5] 2026-10-24T20:54:37.9132911Z 222 │ let idlePasses = 0; 2026-10-24T20:54:37.9133088Z 223 │ ╭─▶ for (;;) { 2026-10-24T20:54:37.9133260Z 224 │ │ yield* Effect.promise(() => Promise.resolve()); 2026-10-24T20:54:37.9133415Z 225 │ │ const pending = backgroundRuntime.pending.shift(); 2026-10-24T20:54:37.9133570Z 226 │ │ if (!pending) { 2026-10-24T20:54:37.9133700Z 227 │ │ idlePasses++; 2026-10-24T20:54:37.9133841Z 228 │ │ if (idlePasses >= 3) { 2026-10-24T20:54:37.9133944Z 229 │ │ return; 2026-10-24T20:54:37.9134126Z 230 │ │ } 2026-10-24T20:54:37.9134289Z 231 │ │ continue; 2026-10-24T20:54:37.9134402Z 232 │ │ } 2026-10-24T20:54:37.9134512Z 233 │ │ idlePasses = 0; 2026-10-24T20:54:37.9134655Z 234 │ │ const exit = yield* Effect.exit( 2026-10-24T20:54:37.9134920Z 235 │ │ pending.operation as Effect.Effect, 2026-10-24T20:54:37.9135033Z 236 │ │ ); 2026-10-24T20:54:37.9135163Z 237 │ │ yield* Effect.sync(() => { 2026-10-24T20:54:37.9135313Z 238 │ │ pending.resolve(exit); 2026-10-24T20:54:37.9135430Z 239 │ │ }); 2026-10-24T20:54:37.9135614Z 240 │ ╰─▶ } 2026-10-24T20:54:37.9135696Z 241 │ }, 2026-10-24T20:54:37.9135779Z ╰──── 2026-10-24T20:54:37.9135782Z 2026-10-24T20:54:37.9136066Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.9136305Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-24T20:54:37.9136385Z 259 │ .join("|"); 2026-10-24T20:54:37.9136489Z 260 │ useEffect(() => { 2026-10-24T20:54:37.9136593Z ·  ────┬──── 2026-10-24T20:54:37.9136759Z · ╰── This is the containing effect 2026-10-24T20:54:37.9136844Z 261 │ stop(); 2026-10-24T20:54:37.9136950Z ·  ──┬─ 2026-10-24T20:54:37.9137152Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.9137245Z 262 │ }, [orderVersion]); 2026-10-24T20:54:37.9137323Z ╰──── 2026-10-24T20:54:37.9137965Z  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-24T20:54:37.9138324Z  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-24T20:54:37.9138327Z 2026-10-24T20:54:37.9138574Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T20:54:37.9138772Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-24T20:54:37.9138886Z 260 │ useEffect(() => { 2026-10-24T20:54:37.9138961Z 261 │ stop(); 2026-10-24T20:54:37.9139063Z ·  ──┬─ 2026-10-24T20:54:37.9139213Z · ╰── Missing dependency `stop` 2026-10-24T20:54:37.9139334Z 262 │ }, [orderVersion]); 2026-10-24T20:54:37.9139429Z ·  ──────┬───── 2026-10-24T20:54:37.9139610Z · ╰── Unnecessary dependency `orderVersion` 2026-10-24T20:54:37.9139703Z 263 │ useEffect( 2026-10-24T20:54:37.9139763Z ╰──── 2026-10-24T20:54:37.9140236Z  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-24T20:54:37.9140642Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.9140677Z 2026-10-24T20:54:37.9140860Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:54:37.9141051Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9] 2026-10-24T20:54:37.9141164Z 95 │ const latest = useRef(props); 2026-10-24T20:54:37.9141279Z 96 │ latest.current = props; 2026-10-24T20:54:37.9141423Z ·  ───┬──────┬─── 2026-10-24T20:54:37.9141640Z · │ ╰── Cannot update ref value during render 2026-10-24T20:54:37.9141810Z · ╰── This value is a ref 2026-10-24T20:54:37.9141914Z 97 │ const gesture = useMemo( 2026-10-24T20:54:37.9142010Z ╰──── 2026-10-24T20:54:37.9142521Z  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-24T20:54:37.9142845Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:54:37.9142847Z 2026-10-24T20:54:37.9143025Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:54:37.9143234Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18] 2026-10-24T20:54:37.9143340Z 103 │ .runOnJS(true) 2026-10-24T20:54:37.9143483Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T20:54:37.9143640Z ·  ───────────────┬────────────── 2026-10-24T20:54:37.9143864Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T20:54:37.9144035Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T20:54:37.9144126Z ╰──── 2026-10-24T20:54:37.9144620Z  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-24T20:54:37.9144939Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:54:37.9144971Z 2026-10-24T20:54:37.9145139Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:54:37.9145342Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19] 2026-10-24T20:54:37.9145478Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T20:54:37.9145647Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T20:54:37.9145815Z ·  ──────────────────────────┬───────────────────────── 2026-10-24T20:54:37.9146062Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T20:54:37.9146255Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T20:54:37.9146335Z ╰──── 2026-10-24T20:54:37.9146892Z  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-24T20:54:37.9147267Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:54:37.9147270Z 2026-10-24T20:54:37.9147451Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:54:37.9147646Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16] 2026-10-24T20:54:37.9147821Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T20:54:37.9147967Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T20:54:37.9148148Z ·  ──────────────────────────┬───────────────────────── 2026-10-24T20:54:37.9148392Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T20:54:37.9148545Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T20:54:37.9148657Z ╰──── 2026-10-24T20:54:37.9149137Z  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-24T20:54:37.9149461Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:54:37.9149464Z 2026-10-24T20:54:37.9149646Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:54:37.9149846Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21] 2026-10-24T20:54:37.9150009Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T20:54:37.9150150Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T20:54:37.9150321Z ·  ───────────────────────┬────────────────────── 2026-10-24T20:54:37.9150559Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T20:54:37.9150678Z 108 │ [props.disabled], 2026-10-24T20:54:37.9150747Z ╰──── 2026-10-24T20:54:37.9151304Z  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-24T20:54:37.9151667Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:54:37.9151670Z 2026-10-24T20:54:37.9151851Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:54:37.9152058Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:249:9] 2026-10-24T20:54:37.9152195Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-24T20:54:37.9152340Z 249 │ latest.current = { rows, planners, moveThread }; 2026-10-24T20:54:37.9152474Z ·  ───┬──────┬─── 2026-10-24T20:54:37.9152715Z · │ ╰── Cannot update ref value during render 2026-10-24T20:54:37.9152854Z · ╰── This value is a ref 2026-10-24T20:54:37.9152946Z 250 │ 2026-10-24T20:54:37.9153033Z ╰──── 2026-10-24T20:54:37.9153533Z  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-24T20:54:37.9153849Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:54:37.9153875Z 2026-10-24T20:54:37.9154036Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:54:37.9154230Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:247:22] 2026-10-24T20:54:37.9154381Z 246 │ const [preview, setPreview] = useState(null); 2026-10-24T20:54:37.9154561Z 247 │ const translateY = useRef(new Animated.Value(0)).current; 2026-10-24T20:54:37.9154709Z ·  ──────────────────┬────────────────── 2026-10-24T20:54:37.9154915Z · ╰── Cannot access ref value during render 2026-10-24T20:54:37.9155060Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-24T20:54:37.9155152Z ╰──── 2026-10-24T20:54:37.9155648Z  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-24T20:54:37.9155982Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:54:37.9155987Z 2026-10-24T20:54:37.9156231Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:54:37.9156423Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:324:16] 2026-10-24T20:54:37.9156554Z 323 │ update(0); 2026-10-24T20:54:37.9156653Z 324 │ let last = performance.now(); 2026-10-24T20:54:37.9156785Z ·  ────────┬──────── 2026-10-24T20:54:37.9156963Z · ╰── Cannot call impure function 2026-10-24T20:54:37.9157073Z 325 │ const tick = () => { 2026-10-24T20:54:37.9157154Z ╰──── 2026-10-24T20:54:37.9157550Z  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-24T20:54:37.9157909Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:54:37.9157911Z 2026-10-24T20:54:37.9158126Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T20:54:37.9158337Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15] 2026-10-24T20:54:37.9158413Z  98 │ () => 2026-10-24T20:54:37.9158597Z  99 │ Gesture.Pan() 2026-10-24T20:54:37.9158708Z ·  ─┬─ 2026-10-24T20:54:37.9158874Z · ╰── `Pan` may be a component 2026-10-24T20:54:37.9158977Z 100 │ .enabled(!props.disabled) 2026-10-24T20:54:37.9159068Z ╰──── 2026-10-24T20:54:37.9159382Z  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-24T20:54:37.9159853Z  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-24T20:54:37.9159855Z 2026-10-24T20:54:37.9160088Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T20:54:37.9160262Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5] 2026-10-24T20:54:37.9160367Z 103 │ .runOnJS(true) 2026-10-24T20:54:37.9160499Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T20:54:37.9160625Z ·  ───┬── 2026-10-24T20:54:37.9161081Z · ╰── 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-24T20:54:37.9161244Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T20:54:37.9161404Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T20:54:37.9161552Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T20:54:37.9161680Z 108 │ [props.disabled], 2026-10-24T20:54:37.9161778Z ·  ────────┬─────── 2026-10-24T20:54:37.9162000Z · ╰── This dependency list is missing values used by the callback 2026-10-24T20:54:37.9162095Z 109 │ ); 2026-10-24T20:54:37.9162186Z ╰──── 2026-10-24T20:54:37.9162412Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T20:54:37.9162762Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.9162765Z 2026-10-24T20:54:37.9162982Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-24T20:54:37.9163132Z ╭─[packages/client-runtime/src/state/shell.ts:189:5] 2026-10-24T20:54:37.9163267Z 186 │ let waiting = yield* Ref.get(awaitingCompletion); 2026-10-24T20:54:37.9163378Z 187 │ let next = initial; 2026-10-24T20:54:37.9163480Z ·  ──┬─ 2026-10-24T20:54:37.9163705Z · ╰── From this accumulator 2026-10-24T20:54:37.9163833Z 188 │ let receivedSnapshot = false; 2026-10-24T20:54:37.9163963Z 189 │ for (const item of items) { 2026-10-24T20:54:37.9164064Z ·  ─┬─ 2026-10-24T20:54:37.9164201Z · ╰── For this loop 2026-10-24T20:54:37.9164306Z 190 │ if (item.kind === "synchronized") { 2026-10-24T20:54:37.9164411Z 191 │ waiting = false; 2026-10-24T20:54:37.9164541Z 192 │ if (Option.isSome(next.snapshot)) { 2026-10-24T20:54:37.9164694Z 193 │ next = { ...next, status: "live", error: Option.none() }; 2026-10-24T20:54:37.9164796Z ·  ───┬─── 2026-10-24T20:54:37.9164956Z · ╰── From this spread 2026-10-24T20:54:37.9165068Z 194 │ } 2026-10-24T20:54:37.9165152Z ╰──── 2026-10-24T20:54:37.9165330Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-24T20:54:37.9165525Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T20:54:37.9165528Z 2026-10-24T20:54:37.9165757Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T20:54:37.9165947Z ╭─[apps/mobile/src/features/threads/ThreadQueueControl.tsx:602:27] 2026-10-24T20:54:37.9166151Z 601 │ const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success)); 2026-10-24T20:54:37.9166291Z 602 │ const gesture = Gesture.Pan() 2026-10-24T20:54:37.9166407Z ·  ─┬─ 2026-10-24T20:54:37.9166599Z · ╰── `Pan` may be a component 2026-10-24T20:54:37.9166717Z 603 │ .enabled(!props.disabled) 2026-10-24T20:54:37.9166787Z ╰──── 2026-10-24T20:54:37.9167095Z  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-24T20:54:37.9167572Z  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-24T20:54:37.9167574Z 2026-10-24T20:54:37.9167871Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.9168056Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:406:5] 2026-10-24T20:54:37.9168131Z 404 │ 2026-10-24T20:54:37.9168229Z 405 │ useEffect(() => { 2026-10-24T20:54:37.9168355Z ·  ────┬──── 2026-10-24T20:54:37.9168516Z · ╰── This is the containing effect 2026-10-24T20:54:37.9168628Z 406 │ setInspectorSelection((current) => { 2026-10-24T20:54:37.9168754Z ·  ──────────┬────────── 2026-10-24T20:54:37.9168966Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.9169108Z 407 │ if (props.renderInspector === undefined) { 2026-10-24T20:54:37.9169175Z ╰──── 2026-10-24T20:54:37.9169871Z  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-24T20:54:37.9170245Z  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-24T20:54:37.9173711Z 2026-10-24T20:54:37.9173953Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T20:54:37.9174110Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:534:24] 2026-10-24T20:54:37.9174275Z 533 │ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top; 2026-10-24T20:54:37.9174450Z 534 │ ╭─▶ const GitInspector = () => ( 2026-10-24T20:54:37.9174548Z 535 │ │ 2026-10-24T20:54:37.9175189Z 540 │ ╰─▶ ); 2026-10-24T20:54:37.9175276Z 541 │ const FilesInspector = () => 2026-10-24T20:54:37.9175332Z ╰──── 2026-10-24T20:54:37.9175553Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-24T20:54:37.9175555Z 2026-10-24T20:54:37.9175774Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T20:54:37.9175933Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:541:26] 2026-10-24T20:54:37.9175997Z 540 │ ); 2026-10-24T20:54:37.9176195Z 541 │ ╭─▶ const FilesInspector = () => 2026-10-24T20:54:37.9176346Z 542 │ │ selectedThread !== null && selectedThreadCwd !== null ? ( 2026-10-24T20:54:37.9176458Z 543 │ │ 2026-10-24T20:54:37.9177454Z 551 │ ╰─▶ ) : null; 2026-10-24T20:54:37.9177610Z 552 │ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset); 2026-10-24T20:54:37.9177663Z ╰──── 2026-10-24T20:54:37.9177880Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-24T20:54:37.9177883Z 2026-10-24T20:54:37.9178146Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.9178308Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:444:5] 2026-10-24T20:54:37.9178448Z 434 │ : null; 2026-10-24T20:54:37.9178552Z 435 │ useEffect(() => { 2026-10-24T20:54:37.9178631Z ·  ────┬──── 2026-10-24T20:54:37.9178766Z · ╰── This is the containing effect 2026-10-24T20:54:37.9178826Z 436 │ if ( 2026-10-24T20:54:37.9178904Z 437 │ props.active === false || 2026-10-24T20:54:37.9178983Z 438 │ activeDraftKey !== null || 2026-10-24T20:54:37.9179069Z 439 │ editingPendingTask !== null || 2026-10-24T20:54:37.9179147Z 440 │ selectedProject === null 2026-10-24T20:54:37.9179207Z 441 │ ) { 2026-10-24T20:54:37.9179270Z 442 │ return; 2026-10-24T20:54:37.9179327Z 443 │ } 2026-10-24T20:54:37.9179398Z 444 │ setActiveDraftKey( 2026-10-24T20:54:37.9179482Z ·  ────────┬──────── 2026-10-24T20:54:37.9179665Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.9179745Z 445 │ createNewTaskDraft({ 2026-10-24T20:54:37.9179800Z ╰──── 2026-10-24T20:54:37.9180404Z  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-24T20:54:37.9180730Z  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-24T20:54:37.9180733Z 2026-10-24T20:54:37.9180979Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T20:54:37.9181153Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1244:36] 2026-10-24T20:54:37.9181266Z 1243 │ 2026-10-24T20:54:37.9181463Z 1244 │ {props.children} 2026-10-24T20:54:37.9181578Z ·  ───────────── 2026-10-24T20:54:37.9181655Z 1245 │ 2026-10-24T20:54:37.9181710Z ╰──── 2026-10-24T20:54:37.9181934Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T20:54:37.9182076Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T20:54:37.9182079Z 2026-10-24T20:54:37.9182353Z ⚠ eslint(no-unused-vars): Identifier 'HostProcess' is imported but never used. 2026-10-24T20:54:37.9182550Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:25:13] 2026-10-24T20:54:37.9182640Z 24 │ import * as Schema from "effect/Schema"; 2026-10-24T20:54:37.9182761Z 25 │ import * as HostProcess from "@t3tools/shared/HostProcess"; 2026-10-24T20:54:37.9182845Z ·  ─────┬───── 2026-10-24T20:54:37.9182988Z · ╰── 'HostProcess' is imported here 2026-10-24T20:54:37.9183043Z 26 │ 2026-10-24T20:54:37.9183097Z ╰──── 2026-10-24T20:54:37.9183197Z  help: Consider removing this import. 2026-10-24T20:54:37.9183200Z 2026-10-24T20:54:37.9183478Z ⚠ eslint(no-unused-vars): Variable 'serverConfig' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:54:37.9183651Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:124:11] 2026-10-24T20:54:37.9183739Z 123 │ const path = yield* Path.Path; 2026-10-24T20:54:37.9183859Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-24T20:54:37.9183944Z ·  ──────┬───── 2026-10-24T20:54:37.9184086Z · ╰── 'serverConfig' is declared here 2026-10-24T20:54:37.9184231Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-24T20:54:37.9184286Z ╰──── 2026-10-24T20:54:37.9184393Z  help: Consider removing this declaration. 2026-10-24T20:54:37.9184396Z 2026-10-24T20:54:37.9184673Z ⚠ eslint(no-unused-vars): Variable 'serverSettings' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:54:37.9184843Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:125:11] 2026-10-24T20:54:37.9184963Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-24T20:54:37.9185106Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-24T20:54:37.9185193Z ·  ───────┬────── 2026-10-24T20:54:37.9185339Z · ╰── 'serverSettings' is declared here 2026-10-24T20:54:37.9185481Z 126 │ const gitWorkflow = yield* GitWorkflowService.GitWorkflowService; 2026-10-24T20:54:37.9185535Z ╰──── 2026-10-24T20:54:37.9185640Z  help: Consider removing this declaration. 2026-10-24T20:54:37.9185643Z 2026-10-24T20:54:37.9185846Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:54:37.9186017Z ╭─[apps/mobile/src/features/workspace/WorkspaceToolbar.ios.tsx:114:33] 2026-10-24T20:54:37.9186120Z 113 │ return () => cancelAnimationFrame(frame); 2026-10-24T20:54:37.9186248Z 114 │ }, [restoreSearch, tabActive, bottomSearch]); 2026-10-24T20:54:37.9186353Z ·  ──────┬───── 2026-10-24T20:54:37.9186523Z · ╰── Unnecessary dependency `bottomSearch` 2026-10-24T20:54:37.9186630Z 115 │ const composeButton = nativeToolbarCompose ? ( 2026-10-24T20:54:37.9186683Z ╰──── 2026-10-24T20:54:37.9186980Z  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-24T20:54:37.9187361Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.9187396Z 2026-10-24T20:54:37.9187600Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T20:54:37.9187767Z ╭─[apps/web/src/components/settings/ProviderSettingsPanel.logic.ts:4:8] 2026-10-24T20:54:37.9187844Z 3 │ AuthProvidersManageScope, 2026-10-24T20:54:37.9187914Z 4 │ type AuthSessionState, 2026-10-24T20:54:37.9188000Z ·  ────────┬─────── 2026-10-24T20:54:37.9188147Z · ╰── 'AuthSessionState' is imported here 2026-10-24T20:54:37.9188216Z 5 │ type EnvironmentId, 2026-10-24T20:54:37.9188268Z ╰──── 2026-10-24T20:54:37.9188367Z  help: Consider removing this import. 2026-10-24T20:54:37.9188370Z 2026-10-24T20:54:37.9188594Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T20:54:37.9188744Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:773:7] 2026-10-24T20:54:37.9188846Z 772 │ if (settingsSheetPresentation.isActive) { 2026-10-24T20:54:37.9188981Z 773 │ settingsRoutePresentation.present(settingsRouteSession); 2026-10-24T20:54:37.9189080Z ·  ────────────┬──────────── 2026-10-24T20:54:37.9189253Z · ╰── Missing dependency `settingsRoutePresentation` 2026-10-24T20:54:37.9189309Z 774 │ } 2026-10-24T20:54:37.9189516Z 775 │ }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]); 2026-10-24T20:54:37.9189625Z ·  ────────────────┬──────────────── 2026-10-24T20:54:37.9189917Z · ╰── Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead 2026-10-24T20:54:37.9189975Z 776 │ 2026-10-24T20:54:37.9190027Z ╰──── 2026-10-24T20:54:37.9190450Z  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-24T20:54:37.9190766Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.9190769Z 2026-10-24T20:54:37.9190926Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:54:37.9191070Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:391:5] 2026-10-24T20:54:37.9191238Z 387 │ typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0; 2026-10-24T20:54:37.9191379Z 388 │ const animatedBorderRadius = useSharedValue(targetBorderRadius); 2026-10-24T20:54:37.9191473Z ·  ──────────┬───────── 2026-10-24T20:54:37.9191629Z · ╰── `animatedBorderRadius` originates here 2026-10-24T20:54:37.9191793Z 389 │ const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android"; 2026-10-24T20:54:37.9191864Z 390 │ useLayoutEffect(() => { 2026-10-24T20:54:37.9191966Z 391 │ animatedBorderRadius.value = shouldAnimate 2026-10-24T20:54:37.9192054Z ·  ──────────┬───────── 2026-10-24T20:54:37.9192214Z · ╰── `animatedBorderRadius` cannot be modified 2026-10-24T20:54:37.9192306Z 392 │ ? withTiming(targetBorderRadius, { 2026-10-24T20:54:37.9192423Z ╰──── 2026-10-24T20:54:37.9192719Z  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-24T20:54:37.9193026Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:54:37.9193029Z 2026-10-24T20:54:37.9193288Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.9193453Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:217:7] 2026-10-24T20:54:37.9193509Z 213 │ }; 2026-10-24T20:54:37.9193575Z 214 │ useEffect(() => { 2026-10-24T20:54:37.9193648Z ·  ────┬──── 2026-10-24T20:54:37.9193784Z · ╰── This is the containing effect 2026-10-24T20:54:37.9193961Z 215 │ const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null; 2026-10-24T20:54:37.9194027Z 216 │ if (inserted) { 2026-10-24T20:54:37.9194105Z 217 │ setSelection((current) => 2026-10-24T20:54:37.9194185Z ·  ──────┬───── 2026-10-24T20:54:37.9194357Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.9194530Z 218 │ current.start === inserted.start && current.end === inserted.end ? current : inserted, 2026-10-24T20:54:37.9194584Z ╰──── 2026-10-24T20:54:37.9195192Z  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-24T20:54:37.9195520Z  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-24T20:54:37.9195523Z 2026-10-24T20:54:37.9195779Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.9195942Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:298:7] 2026-10-24T20:54:37.9196021Z 286 │ }, [hasWorkspaceSnapshot]); 2026-10-24T20:54:37.9196087Z 287 │ useEffect(() => { 2026-10-24T20:54:37.9196189Z ·  ────┬──── 2026-10-24T20:54:37.9196320Z · ╰── This is the containing effect 2026-10-24T20:54:37.9196478Z 288 │ if (!environmentId || !projectCwd || !selectedProviderInstanceId) return; 2026-10-24T20:54:37.9196632Z 289 │ const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`; 2026-10-24T20:54:37.9196703Z 290 │ const now = Date.now(); 2026-10-24T20:54:37.9196818Z 291 │ const lastRequest = workspaceRefreshKeyRef.current; 2026-10-24T20:54:37.9196879Z 292 │ if ( 2026-10-24T20:54:37.9196959Z 293 │ lastRequest?.key === key && 2026-10-24T20:54:37.9197099Z 294 │ now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS 2026-10-24T20:54:37.9197154Z 295 │ ) 2026-10-24T20:54:37.9197216Z 296 │ return; 2026-10-24T20:54:37.9197391Z 297 │ if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) { 2026-10-24T20:54:37.9197481Z 298 │ setWorkspaceRefreshRetry(null); 2026-10-24T20:54:37.9197637Z ·  ────────────┬─────────── 2026-10-24T20:54:37.9197853Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.9197916Z 299 │ return; 2026-10-24T20:54:37.9197968Z ╰──── 2026-10-24T20:54:37.9198700Z  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-24T20:54:37.9199022Z  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-24T20:54:37.9199025Z 2026-10-24T20:54:37.9199232Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:54:37.9199400Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:328:5] 2026-10-24T20:54:37.9199455Z 327 │ }, [ 2026-10-24T20:54:37.9199521Z 328 │ draftMessage, 2026-10-24T20:54:37.9199601Z ·  ──────┬───── 2026-10-24T20:54:37.9199748Z · ╰── Unnecessary dependency `draftMessage` 2026-10-24T20:54:37.9199814Z 329 │ environmentId, 2026-10-24T20:54:37.9199868Z ╰──── 2026-10-24T20:54:37.9200161Z  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-24T20:54:37.9200473Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.9200480Z 2026-10-24T20:54:37.9200687Z ⚠ typescript(no-extraneous-class): Unexpected class with only a constructor. 2026-10-24T20:54:37.9200813Z ╭─[apps/desktop/src/preview/Manager.test.ts:158:18] 2026-10-24T20:54:37.9200916Z 157 │ BrowserWindow: browserWindowConstructor, 2026-10-24T20:54:37.9201081Z 158 │ ╭─▶ ClipboardItem: class { 2026-10-24T20:54:37.9201213Z 159 │ │ constructor(data: Record) { 2026-10-24T20:54:37.9201332Z 160 │ │ clipboardItemConstructor(data); 2026-10-24T20:54:37.9201409Z 161 │ │ } 2026-10-24T20:54:37.9201537Z 162 │ ╰─▶ }, 2026-10-24T20:54:37.9201603Z 163 │ clipboard: { 2026-10-24T20:54:37.9201660Z ╰──── 2026-10-24T20:54:37.9201834Z  help: Try replacing this class with a standalone function or deleting it entirely 2026-10-24T20:54:37.9201837Z 2026-10-24T20:54:37.9202093Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.9202248Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:570:5] 2026-10-24T20:54:37.9202307Z 568 │ }, []); 2026-10-24T20:54:37.9202374Z 569 │ useEffect(() => { 2026-10-24T20:54:37.9202447Z ·  ────┬──── 2026-10-24T20:54:37.9202577Z · ╰── This is the containing effect 2026-10-24T20:54:37.9202665Z 570 │ setKeyboardStateSuspect(false); 2026-10-24T20:54:37.9202758Z ·  ───────────┬─────────── 2026-10-24T20:54:37.9203007Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.9203156Z 571 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-24T20:54:37.9203208Z ╰──── 2026-10-24T20:54:37.9203807Z  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-24T20:54:37.9204130Z  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-24T20:54:37.9204133Z 2026-10-24T20:54:37.9204392Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.9204546Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:966:7] 2026-10-24T20:54:37.9204705Z 963 │ const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0); 2026-10-24T20:54:37.9204772Z 964 │ useEffect(() => { 2026-10-24T20:54:37.9204845Z ·  ────┬──── 2026-10-24T20:54:37.9204976Z · ╰── This is the containing effect 2026-10-24T20:54:37.9205134Z 965 │ if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) { 2026-10-24T20:54:37.9205250Z 966 │ setLastKnownKeyboardHeight(liveKeyboardHeight); 2026-10-24T20:54:37.9205350Z ·  ─────────────┬──────────── 2026-10-24T20:54:37.9205528Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.9205590Z 967 │ } 2026-10-24T20:54:37.9205645Z ╰──── 2026-10-24T20:54:37.9206265Z  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-24T20:54:37.9206584Z  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-24T20:54:37.9206587Z 2026-10-24T20:54:37.9206843Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.9206997Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1222:5] 2026-10-24T20:54:37.9207108Z 1220 │ 2026-10-24T20:54:37.9207206Z 1221 │ useEffect(() => { 2026-10-24T20:54:37.9207281Z ·  ────┬──── 2026-10-24T20:54:37.9207412Z · ╰── This is the containing effect 2026-10-24T20:54:37.9207491Z 1222 │ setAnchorMessageId(null); 2026-10-24T20:54:37.9207577Z ·  ─────────┬──────── 2026-10-24T20:54:37.9207752Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.9207834Z 1223 │ setSubmittedMessageId(null); 2026-10-24T20:54:37.9207888Z ╰──── 2026-10-24T20:54:37.9208492Z  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-24T20:54:37.9208817Z  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-24T20:54:37.9208819Z 2026-10-24T20:54:37.9209021Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:54:37.9209171Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:571:7] 2026-10-24T20:54:37.9209257Z 570 │ setKeyboardStateSuspect(false); 2026-10-24T20:54:37.9209357Z 571 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-24T20:54:37.9209501Z ·  ────────┬──────── ─────────┬──────── 2026-10-24T20:54:37.9209716Z · │ ╰── Unnecessary dependency `liveKeyboardHeight` 2026-10-24T20:54:37.9209880Z · ╰── Unnecessary dependency `isKeyboardVisible` 2026-10-24T20:54:37.9210010Z 572 │ const handleOwnedInputFocusChange = (focused: boolean) => { 2026-10-24T20:54:37.9210062Z ╰──── 2026-10-24T20:54:37.9210356Z  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-24T20:54:37.9210667Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.9210669Z 2026-10-24T20:54:37.9210869Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:54:37.9211029Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1170:7] 2026-10-24T20:54:37.9211119Z 1169 │ userInputInsetProgress.set(1); 2026-10-24T20:54:37.9211283Z 1170 │ }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]); 2026-10-24T20:54:37.9211380Z ·  ────────────┬─────────── 2026-10-24T20:54:37.9211560Z · ╰── Unnecessary dependency `activeUserInputRequestId` 2026-10-24T20:54:37.9211668Z 1171 │ const showContent = props.showContent ?? true; 2026-10-24T20:54:37.9211721Z ╰──── 2026-10-24T20:54:37.9212012Z  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-24T20:54:37.9212379Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.9212416Z 2026-10-24T20:54:37.9212615Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:54:37.9212772Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1228:15] 2026-10-24T20:54:37.9212841Z 1227 │ freeze.set(false); 2026-10-24T20:54:37.9212924Z 1228 │ }, [freeze, selectedThreadKey]); 2026-10-24T20:54:37.9213021Z ·  ────────┬──────── 2026-10-24T20:54:37.9213187Z · ╰── Unnecessary dependency `selectedThreadKey` 2026-10-24T20:54:37.9213241Z 1229 │ 2026-10-24T20:54:37.9213294Z ╰──── 2026-10-24T20:54:37.9213592Z  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-24T20:54:37.9213909Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.9213911Z 2026-10-24T20:54:37.9214069Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:54:37.9214222Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1058:5] 2026-10-24T20:54:37.9214335Z 1053 │ const composerPopoverHeight = useSharedValue(0); 2026-10-24T20:54:37.9214444Z 1054 │ const floatingControlCoverage = useSharedValue( 2026-10-24T20:54:37.9214542Z ·  ───────────┬─────────── 2026-10-24T20:54:37.9214705Z · ╰── `floatingControlCoverage` originates here 2026-10-24T20:54:37.9214841Z 1055 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-24T20:54:37.9214900Z 1056 │ ); 2026-10-24T20:54:37.9214967Z 1057 │ useEffect(() => { 2026-10-24T20:54:37.9215073Z 1058 │ floatingControlCoverage.value = withTiming( 2026-10-24T20:54:37.9215168Z ·  ───────────┬─────────── 2026-10-24T20:54:37.9215332Z · ╰── `floatingControlCoverage` cannot be modified 2026-10-24T20:54:37.9215462Z 1059 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-24T20:54:37.9215514Z ╰──── 2026-10-24T20:54:37.9215780Z  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-24T20:54:37.9216092Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:54:37.9216097Z 2026-10-24T20:54:37.9216283Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:54:37.9216434Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1076:7] 2026-10-24T20:54:37.9216623Z 1066 │ const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null; 2026-10-24T20:54:37.9216750Z 1067 │ const combinedContentInsetEndAdjustment = useSharedValue( 2026-10-24T20:54:37.9216864Z ·  ────────────────┬──────────────── 2026-10-24T20:54:37.9217053Z · ╰── `combinedContentInsetEndAdjustment` originates here 2026-10-24T20:54:37.9217186Z 1068 │ Math.max(0, estimatedOverlayHeight - nativeInsetOvercount), 2026-10-24T20:54:37.9217242Z 1069 │ ); 2026-10-24T20:54:37.9217375Z 1070 │ useAnimatedReaction( 2026-10-24T20:54:37.9217476Z 1071 │ () => 2026-10-24T20:54:37.9217572Z 1072 │ contentInsetEndAdjustment.value + 2026-10-24T20:54:37.9217663Z 1073 │ floatingControlCoverage.value + 2026-10-24T20:54:37.9217865Z 1074 │ (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0), 2026-10-24T20:54:37.9217929Z 1075 │ (value) => { 2026-10-24T20:54:37.9218047Z 1076 │ combinedContentInsetEndAdjustment.value = value; 2026-10-24T20:54:37.9218161Z ·  ────────────────┬──────────────── 2026-10-24T20:54:37.9218354Z · ╰── `combinedContentInsetEndAdjustment` cannot be modified 2026-10-24T20:54:37.9218411Z 1077 │ }, 2026-10-24T20:54:37.9218465Z ╰──── 2026-10-24T20:54:37.9218736Z  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-24T20:54:37.9219046Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:54:37.9219049Z 2026-10-24T20:54:37.9219306Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.9219468Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:40:5] 2026-10-24T20:54:37.9219580Z 37 │ const [initialized, setInitialized] = useState(false); 2026-10-24T20:54:37.9219651Z 38 │ useLayoutEffect(() => { 2026-10-24T20:54:37.9219731Z ·  ───────┬─────── 2026-10-24T20:54:37.9219865Z · ╰── This is the containing effect 2026-10-24T20:54:37.9219934Z 39 │ reset(); 2026-10-24T20:54:37.9220008Z 40 │ setInitialized(true); 2026-10-24T20:54:37.9220087Z ·  ───────┬────── 2026-10-24T20:54:37.9220255Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.9220320Z 41 │ }, [reset]); 2026-10-24T20:54:37.9220374Z ╰──── 2026-10-24T20:54:37.9220970Z  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-24T20:54:37.9221292Z  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-24T20:54:37.9221300Z 2026-10-24T20:54:37.9221557Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.9221717Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:93:5] 2026-10-24T20:54:37.9221772Z 88 │ 2026-10-24T20:54:37.9221839Z 89 │ useEffect(() => { 2026-10-24T20:54:37.9221910Z ·  ────┬──── 2026-10-24T20:54:37.9222039Z · ╰── This is the containing effect 2026-10-24T20:54:37.9222200Z 90 │ if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return; 2026-10-24T20:54:37.9222306Z 91 │ const branchName = initialProjectRef.branch; 2026-10-24T20:54:37.9222372Z 92 │ let active = true; 2026-10-24T20:54:37.9222468Z 93 │ setPendingCheckouts((count) => count + 1); 2026-10-24T20:54:37.9222618Z ·  ─────────┬───────── 2026-10-24T20:54:37.9222826Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.9222981Z 94 │ // Serialize replacements: ignoring a stale result cannot undo its Git mutation. 2026-10-24T20:54:37.9223034Z ╰──── 2026-10-24T20:54:37.9223631Z  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-24T20:54:37.9223951Z  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-24T20:54:37.9223954Z 2026-10-24T20:54:37.9224145Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T20:54:37.9224321Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:555:70] 2026-10-24T20:54:37.9224404Z 554 │ assert.deepStrictEqual( 2026-10-24T20:54:37.9224572Z 555 │ (yield* Ref.get(fixture.syncCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-24T20:54:37.9224696Z ·  ┬ 2026-10-24T20:54:37.9224862Z · ╰── '_' is declared here 2026-10-24T20:54:37.9224924Z 556 │ [ 2026-10-24T20:54:37.9224980Z ╰──── 2026-10-24T20:54:37.9225086Z  help: Consider removing this parameter. 2026-10-24T20:54:37.9225088Z 2026-10-24T20:54:37.9225277Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T20:54:37.9225456Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:1155:70] 2026-10-24T20:54:37.9225540Z 1154 │ assert.deepStrictEqual( 2026-10-24T20:54:37.9225706Z 1155 │ (yield* Ref.get(fixture.linkCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-24T20:54:37.9225828Z ·  ┬ 2026-10-24T20:54:37.9225994Z · ╰── '_' is declared here 2026-10-24T20:54:37.9226058Z 1156 │ [ 2026-10-24T20:54:37.9226110Z ╰──── 2026-10-24T20:54:37.9226240Z  help: Consider removing this parameter. 2026-10-24T20:54:37.9226243Z 2026-10-24T20:54:37.9226557Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.9226896Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:361:7] 2026-10-24T20:54:37.9227036Z 355 │ }, [cancelledIncomingShareId, navigation, props.incomingShareId]); 2026-10-24T20:54:37.9227103Z 356 │ useEffect(() => { 2026-10-24T20:54:37.9227178Z ·  ────┬──── 2026-10-24T20:54:37.9227309Z · ╰── This is the containing effect 2026-10-24T20:54:37.9227401Z 357 │ if (!isReturningToProjectPicker) { 2026-10-24T20:54:37.9227463Z 358 │ return; 2026-10-24T20:54:37.9227519Z 359 │ } 2026-10-24T20:54:37.9227619Z 360 │ if (requestedInitialProjectAvailable) { 2026-10-24T20:54:37.9227721Z 361 │ setIsReturningToProjectPicker(false); 2026-10-24T20:54:37.9227848Z ·  ──────────────┬────────────── 2026-10-24T20:54:37.9228024Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.9228086Z 362 │ return; 2026-10-24T20:54:37.9228140Z ╰──── 2026-10-24T20:54:37.9228738Z  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-24T20:54:37.9229061Z  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-24T20:54:37.9229064Z 2026-10-24T20:54:37.9229326Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.9229484Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:504:9] 2026-10-24T20:54:37.9229538Z 447 │ 2026-10-24T20:54:37.9229603Z 448 │ useEffect(() => { 2026-10-24T20:54:37.9229677Z ·  ────┬──── 2026-10-24T20:54:37.9229808Z · ╰── This is the containing effect 2026-10-24T20:54:37.9229913Z 449 │ if (props.pendingTaskId || props.draftId) { 2026-10-24T20:54:37.9229973Z 450 │ return; 2026-10-24T20:54:37.9230028Z 451 │ } 2026-10-24T20:54:37.9230173Z 452 │ if (lastInitialProjectRefRef.current !== props.initialProjectRef) { 2026-10-24T20:54:37.9230306Z 453 │ lastInitialProjectRefRef.current = props.initialProjectRef; 2026-10-24T20:54:37.9230420Z 454 │ appliedInitialProjectKeyRef.current = null; 2026-10-24T20:54:37.9230479Z 455 │ } 2026-10-24T20:54:37.9230622Z 456 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-24T20:54:37.9230751Z 457 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-24T20:54:37.9230856Z 458 │ if (initialEnvironmentId && initialProjectId) { 2026-10-24T20:54:37.9230929Z 459 │ const directProject = 2026-10-24T20:54:37.9230998Z 460 │ projects.find( 2026-10-24T20:54:37.9231066Z 461 │ (project) => 2026-10-24T20:54:37.9231242Z 462 │ project.environmentId === initialEnvironmentId && project.id === initialProjectId, 2026-10-24T20:54:37.9231307Z 463 │ ) ?? null; 2026-10-24T20:54:37.9231361Z 464 │ 2026-10-24T20:54:37.9231431Z 465 │ if (directProject) { 2026-10-24T20:54:37.9231633Z 466 │ // Apply the route's project once. Re-applying on every change would 2026-10-24T20:54:37.9231803Z 467 │ // instantly revert environment/project switches made in the picker. 2026-10-24T20:54:37.9231967Z 468 │ const directProjectKey = `${directProject.environmentId}:${directProject.id}`; 2026-10-24T20:54:37.9232107Z 469 │ if (appliedInitialProjectKeyRef.current === directProjectKey) { 2026-10-24T20:54:37.9232169Z 470 │ return; 2026-10-24T20:54:37.9232228Z 471 │ } 2026-10-24T20:54:37.9232327Z 472 │ if (props.initialProjectRef?.branch) { 2026-10-24T20:54:37.9232389Z 473 │ if ( 2026-10-24T20:54:37.9232533Z 474 │ selectedProject?.environmentId !== directProject.environmentId || 2026-10-24T20:54:37.9232636Z 475 │ selectedProject.id !== directProject.id 2026-10-24T20:54:37.9232698Z 476 │ ) { 2026-10-24T20:54:37.9232789Z 477 │ setProject(directProject); 2026-10-24T20:54:37.9232855Z 478 │ return; 2026-10-24T20:54:37.9232915Z 479 │ } 2026-10-24T20:54:37.9232998Z 480 │ if (!flow.draftKey) return; 2026-10-24T20:54:37.9233140Z 481 │ // The route completes checkout before mounting this composer. Local 2026-10-24T20:54:37.9233287Z 482 │ // mode reuses an existing worktree; worktree mode would create another. 2026-10-24T20:54:37.9233398Z 483 │ updateComposerDraftSettings(flow.draftKey, { 2026-10-24T20:54:37.9233479Z 484 │ workspaceSelection: { 2026-10-24T20:54:37.9233549Z 485 │ mode: "local", 2026-10-24T20:54:37.9233657Z 486 │ branch: props.initialProjectRef.branch, 2026-10-24T20:54:37.9233795Z 487 │ worktreePath: props.initialProjectRef.worktreePath ?? null, 2026-10-24T20:54:37.9233885Z 488 │ startFromOrigin: false, 2026-10-24T20:54:37.9233946Z 489 │ }, 2026-10-24T20:54:37.9234007Z 490 │ }); 2026-10-24T20:54:37.9234068Z 491 │ } 2026-10-24T20:54:37.9234197Z 492 │ appliedInitialProjectKeyRef.current = directProjectKey; 2026-10-24T20:54:37.9234256Z 493 │ if ( 2026-10-24T20:54:37.9234399Z 494 │ selectedProject?.environmentId === directProject.environmentId && 2026-10-24T20:54:37.9234499Z 495 │ selectedProject.id === directProject.id 2026-10-24T20:54:37.9234558Z 496 │ ) { 2026-10-24T20:54:37.9234620Z 497 │ return; 2026-10-24T20:54:37.9234679Z 498 │ } 2026-10-24T20:54:37.9234760Z 499 │ setProject(directProject); 2026-10-24T20:54:37.9234822Z 500 │ return; 2026-10-24T20:54:37.9234877Z 501 │ } 2026-10-24T20:54:37.9234930Z 502 │ 2026-10-24T20:54:37.9235015Z 503 │ if (projects.length > 0) { 2026-10-24T20:54:37.9235116Z 504 │ setIsReturningToProjectPicker(true); 2026-10-24T20:54:37.9235225Z ·  ──────────────┬────────────── 2026-10-24T20:54:37.9235407Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.9235464Z 505 │ } 2026-10-24T20:54:37.9235516Z ╰──── 2026-10-24T20:54:37.9236114Z  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-24T20:54:37.9236540Z  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-24T20:54:37.9236573Z 2026-10-24T20:54:37.9236832Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.9236985Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:604:5] 2026-10-24T20:54:37.9237040Z 545 │ 2026-10-24T20:54:37.9237105Z 546 │ useEffect(() => { 2026-10-24T20:54:37.9237180Z ·  ────┬──── 2026-10-24T20:54:37.9237311Z · ╰── This is the containing effect 2026-10-24T20:54:37.9237405Z 547 │ const shareId = props.incomingShareId; 2026-10-24T20:54:37.9237490Z 548 │ const draftKey = flow.draftKey; 2026-10-24T20:54:37.9237592Z 549 │ const destinationProject = selectedProject; 2026-10-24T20:54:37.9237740Z 550 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-24T20:54:37.9237872Z 551 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-24T20:54:37.9237964Z 552 │ const selectedProjectMatchesRoute = 2026-10-24T20:54:37.9238042Z 553 │ !initialEnvironmentId || 2026-10-24T20:54:37.9238115Z 554 │ !initialProjectId || 2026-10-24T20:54:37.9238249Z 555 │ (destinationProject?.environmentId === initialEnvironmentId && 2026-10-24T20:54:37.9238358Z 556 │ destinationProject.id === initialProjectId); 2026-10-24T20:54:37.9238417Z 557 │ if ( 2026-10-24T20:54:37.9238482Z 558 │ !shareId || 2026-10-24T20:54:37.9238703Z 559 │ !draftKey || 2026-10-24T20:54:37.9238778Z 560 │ !destinationProject || 2026-10-24T20:54:37.9238866Z 561 │ !selectedProjectMatchesRoute || 2026-10-24T20:54:37.9238958Z 562 │ cancelledIncomingShareId === shareId 2026-10-24T20:54:37.9239020Z 563 │ ) { 2026-10-24T20:54:37.9239085Z 564 │ return; 2026-10-24T20:54:37.9239140Z 565 │ } 2026-10-24T20:54:37.9239238Z 566 │ const importKey = `${shareId}:${draftKey}`; 2026-10-24T20:54:37.9239295Z 567 │ if ( 2026-10-24T20:54:37.9239408Z 568 │ startedShareImportKeyRef.current === importKey || 2026-10-24T20:54:37.9239520Z 569 │ cancellingShareImportKeyRef.current === importKey 2026-10-24T20:54:37.9239578Z 570 │ ) { 2026-10-24T20:54:37.9239638Z 571 │ return; 2026-10-24T20:54:37.9239695Z 572 │ } 2026-10-24T20:54:37.9239748Z 573 │ 2026-10-24T20:54:37.9239817Z 574 │ if (!incomingShare) { 2026-10-24T20:54:37.9240016Z 575 │ if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) { 2026-10-24T20:54:37.9240149Z 576 │ alertedUnavailableIncomingShareIdRef.current = shareId; 2026-10-24T20:54:37.9240222Z 577 │ Dialog.alert( 2026-10-24T20:54:37.9240309Z 578 │ "Shared content unavailable", 2026-10-24T20:54:37.9240487Z 579 │ "The shared content is no longer in the inbox. You can continue editing this task draft.", 2026-10-24T20:54:37.9240548Z 580 │ ); 2026-10-24T20:54:37.9240603Z 581 │ } 2026-10-24T20:54:37.9240663Z 582 │ return; 2026-10-24T20:54:37.9240719Z 583 │ } 2026-10-24T20:54:37.9240772Z 584 │ 2026-10-24T20:54:37.9240829Z 585 │ if ( 2026-10-24T20:54:37.9240991Z 586 │ incomingShare.attachments.some((attachment) => attachment.type === "file") && 2026-10-24T20:54:37.9241095Z 587 │ selectedEnvironmentServerConfig === null 2026-10-24T20:54:37.9241151Z 588 │ ) { 2026-10-24T20:54:37.9241211Z 589 │ return; 2026-10-24T20:54:37.9241265Z 590 │ } 2026-10-24T20:54:37.9241396Z 591 │ 2026-10-24T20:54:37.9241578Z 592 │ if (alertedUnavailableIncomingShareIdRef.current === shareId) { 2026-10-24T20:54:37.9241701Z 593 │ alertedUnavailableIncomingShareIdRef.current = null; 2026-10-24T20:54:37.9241756Z 594 │ } 2026-10-24T20:54:37.9241864Z 595 │ startedShareImportKeyRef.current = importKey; 2026-10-24T20:54:37.9241934Z 596 │ const draftBackup = 2026-10-24T20:54:37.9242122Z 597 │ shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey); 2026-10-24T20:54:37.9242260Z 598 │ shareImportDraftBackupRef.current.set(importKey, draftBackup); 2026-10-24T20:54:37.9242351Z 599 │ const importToken = Symbol(importKey); 2026-10-24T20:54:37.9242430Z 600 │ let didReserveShare = false; 2026-10-24T20:54:37.9242507Z 601 │ let didConsumeShare = false; 2026-10-24T20:54:37.9242587Z 602 │ let needsDraftRestore = false; 2026-10-24T20:54:37.9242707Z 603 │ activeShareImportTokenRef.current = importToken; 2026-10-24T20:54:37.9242794Z 604 │ setImportingShareKey(importKey); 2026-10-24T20:54:37.9242881Z ·  ──────────┬───────── 2026-10-24T20:54:37.9243055Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.9243124Z 605 │ void (async () => { 2026-10-24T20:54:37.9243176Z ╰──── 2026-10-24T20:54:37.9243772Z  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-24T20:54:37.9244103Z  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-24T20:54:37.9244109Z 2026-10-24T20:54:37.9244312Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:54:37.9244465Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:524:5] 2026-10-24T20:54:37.9244543Z 523 │ props.initialProjectRef, 2026-10-24T20:54:37.9244615Z 524 │ props.incomingShareId, 2026-10-24T20:54:37.9244705Z ·  ──────────┬────────── 2026-10-24T20:54:37.9244874Z · ╰── Unnecessary dependency `props.incomingShareId` 2026-10-24T20:54:37.9244947Z 525 │ props.pendingTaskId, 2026-10-24T20:54:37.9244999Z ╰──── 2026-10-24T20:54:37.9245298Z  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-24T20:54:37.9245614Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.9245617Z 2026-10-24T20:54:37.9245832Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T20:54:37.9245984Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:543:5] 2026-10-24T20:54:37.9246100Z 542 │ loadedBranchesProjectKeyRef.current = projectKey; 2026-10-24T20:54:37.9246200Z 543 │ flow.loadBranches(); 2026-10-24T20:54:37.9246270Z ·  ──┬─ 2026-10-24T20:54:37.9246395Z · ╰── Missing dependency `flow` 2026-10-24T20:54:37.9246489Z 544 │ }, [flow.loadBranches, selectedProject]); 2026-10-24T20:54:37.9246633Z ·  ────────┬──────── 2026-10-24T20:54:37.9246867Z · ╰── Overly precise dependency `flow.loadBranches`, use `flow` instead 2026-10-24T20:54:37.9246922Z 545 │ 2026-10-24T20:54:37.9246973Z ╰──── 2026-10-24T20:54:37.9247393Z  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-24T20:54:37.9247705Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.9247707Z 2026-10-24T20:54:37.9247910Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:54:37.9248068Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:766:5] 2026-10-24T20:54:37.9248136Z 765 │ flow.draftKey, 2026-10-24T20:54:37.9248214Z 766 │ hasImportedIncomingShare, 2026-10-24T20:54:37.9248307Z ·  ────────────┬─────────── 2026-10-24T20:54:37.9248482Z · ╰── Unnecessary dependency `hasImportedIncomingShare` 2026-10-24T20:54:37.9248547Z 767 │ incomingShare, 2026-10-24T20:54:37.9248630Z 768 │ isIncomingShareInboxLoading, 2026-10-24T20:54:37.9248728Z ·  ─────────────┬───────────── 2026-10-24T20:54:37.9248910Z · ╰── Unnecessary dependency `isIncomingShareInboxLoading` 2026-10-24T20:54:37.9248991Z 769 │ isIncomingShareUnavailable, 2026-10-24T20:54:37.9249065Z 770 │ props.incomingShareId, 2026-10-24T20:54:37.9249168Z 771 │ props.initialProjectRef?.environmentId, 2026-10-24T20:54:37.9249260Z 772 │ props.initialProjectRef?.projectId, 2026-10-24T20:54:37.9249334Z 773 │ releaseShareReservation, 2026-10-24T20:54:37.9249399Z 774 │ reserveShare, 2026-10-24T20:54:37.9249486Z 775 │ selectedEnvironmentServerConfig, 2026-10-24T20:54:37.9249553Z 776 │ selectedProject, 2026-10-24T20:54:37.9249625Z 777 │ shareImportAttempt, 2026-10-24T20:54:37.9249711Z ·  ─────────┬──────── 2026-10-24T20:54:37.9249876Z · ╰── Unnecessary dependency `shareImportAttempt` 2026-10-24T20:54:37.9249932Z 778 │ ]); 2026-10-24T20:54:37.9249984Z ╰──── 2026-10-24T20:54:37.9250348Z  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-24T20:54:37.9250698Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.9250701Z 2026-10-24T20:54:37.9250937Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-24T20:54:37.9251074Z ╭─[apps/web/src/components/chat/useComposerSend.ts:985:13] 2026-10-24T20:54:37.9251200Z 984 │ const changedBeforeDecline = draftChangedSinceSend(); 2026-10-24T20:54:37.9251444Z 985 │ ╭─▶ const pendingIdsBeforeDecline = pendingApprovalsRef.current.map( 2026-10-24T20:54:37.9251567Z 986 │ │ (approval) => approval.requestId, 2026-10-24T20:54:37.9251708Z 987 │ ╰─▶ ); 2026-10-24T20:54:37.9251853Z 988 │ const approvalResponding = approvalsToDecline.some((approval) => 2026-10-24T20:54:37.9251905Z ╰──── 2026-10-24T20:54:37.9251983Z  help: Switch to `Set` 2026-10-24T20:54:37.9251986Z 2026-10-24T20:54:37.9252241Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.9252405Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:279:5] 2026-10-24T20:54:37.9252526Z 277 │ const [snoozeWakeTick, bumpSnoozeWakeTick] = useState(0); 2026-10-24T20:54:37.9252594Z 278 │ useEffect(() => { 2026-10-24T20:54:37.9252665Z ·  ────┬──── 2026-10-24T20:54:37.9252798Z · ╰── This is the containing effect 2026-10-24T20:54:37.9252889Z 279 │ setNow(new Date().toISOString()); 2026-10-24T20:54:37.9252963Z ·  ───┬── 2026-10-24T20:54:37.9253127Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.9253267Z 280 │ const id = setInterval(() => setNow(new Date().toISOString()), 60_000); 2026-10-24T20:54:37.9253320Z ╰──── 2026-10-24T20:54:37.9253918Z  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-24T20:54:37.9254249Z  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-24T20:54:37.9254254Z 2026-10-24T20:54:37.9254483Z ⚠ eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used. 2026-10-24T20:54:37.9254648Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:13:8] 2026-10-24T20:54:37.9254719Z 12 │ threadSearchMatchKey, 2026-10-24T20:54:37.9254807Z 13 │ type EnvironmentThreadSearchMatch, 2026-10-24T20:54:37.9254912Z ·  ──────────────┬───────────── 2026-10-24T20:54:37.9255089Z · ╰── 'EnvironmentThreadSearchMatch' is imported here 2026-10-24T20:54:37.9255200Z 14 │ } from "@t3tools/client-runtime/state/thread-search"; 2026-10-24T20:54:37.9255254Z ╰──── 2026-10-24T20:54:37.9255352Z  help: Consider removing this import. 2026-10-24T20:54:37.9255357Z 2026-10-24T20:54:37.9255618Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:54:37.9255815Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:359:25] 2026-10-24T20:54:37.9255948Z 358 │ // range) the boundary string is identical and the chain would die. 2026-10-24T20:54:37.9256039Z 359 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-24T20:54:37.9256143Z ·  ───────┬────── 2026-10-24T20:54:37.9256337Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T20:54:37.9256452Z 360 │ const listItems = ((): readonly SidebarListItem[] => { 2026-10-24T20:54:37.9256505Z ╰──── 2026-10-24T20:54:37.9256802Z  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-24T20:54:37.9257118Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.9257120Z 2026-10-24T20:54:37.9257290Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:54:37.9257456Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:350:53] 2026-10-24T20:54:37.9257542Z 349 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-24T20:54:37.9257701Z 350 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-24T20:54:37.9257823Z ·  ─────┬──── 2026-10-24T20:54:37.9257994Z · ╰── Cannot call impure function 2026-10-24T20:54:37.9258077Z 351 │ const id = setTimeout(() => { 2026-10-24T20:54:37.9258128Z ╰──── 2026-10-24T20:54:37.9258414Z  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-24T20:54:37.9258709Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:54:37.9258712Z 2026-10-24T20:54:37.9258926Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T20:54:37.9259095Z ╭─[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:249:7] 2026-10-24T20:54:37.9259177Z 248 │ mountedRef.current = false; 2026-10-24T20:54:37.9259259Z 249 │ flow.setBranchQuery(""); 2026-10-24T20:54:37.9259332Z ·  ──┬─ 2026-10-24T20:54:37.9259457Z · ╰── Missing dependency `flow` 2026-10-24T20:54:37.9259516Z 250 │ }; 2026-10-24T20:54:37.9259591Z 251 │ }, [flow.setBranchQuery]); 2026-10-24T20:54:37.9259679Z ·  ─────────┬───────── 2026-10-24T20:54:37.9259883Z · ╰── Overly precise dependency `flow.setBranchQuery`, use `flow` instead 2026-10-24T20:54:37.9259938Z 252 │ 2026-10-24T20:54:37.9259989Z ╰──── 2026-10-24T20:54:37.9260411Z  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-24T20:54:37.9260785Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.9260825Z 2026-10-24T20:54:37.9261158Z ⚠ eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:54:37.9261324Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1444:7] 2026-10-24T20:54:37.9261380Z 1443 │ 2026-10-24T20:54:37.9261499Z 1444 │ const layerCodexAppServerClientFactoryCommand = ( 2026-10-24T20:54:37.9261618Z ·  ───────────────────┬─────────────────── 2026-10-24T20:54:37.9261825Z · ╰── 'layerCodexAppServerClientFactoryCommand' is declared here 2026-10-24T20:54:37.9261955Z 1445 │ options: CodexClient.CodexAppServerClientOptions & { 2026-10-24T20:54:37.9262013Z ╰──── 2026-10-24T20:54:37.9262118Z  help: Consider removing this declaration. 2026-10-24T20:54:37.9262121Z 2026-10-24T20:54:37.9262379Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:54:37.9262541Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1680:7] 2026-10-24T20:54:37.9262597Z 1679 │ 2026-10-24T20:54:37.9262669Z 1680 │ const layer: Layer.Layer< 2026-10-24T20:54:37.9262741Z ·  ──┬── 2026-10-24T20:54:37.9262867Z · ╰── 'layer' is declared here 2026-10-24T20:54:37.9262962Z 1681 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T20:54:37.9263014Z ╰──── 2026-10-24T20:54:37.9263123Z  help: Consider removing this declaration. 2026-10-24T20:54:37.9263128Z 2026-10-24T20:54:37.9263388Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.9263525Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2195:5] 2026-10-24T20:54:37.9263581Z 2193 │ ); 2026-10-24T20:54:37.9263649Z 2194 │ useEffect(() => { 2026-10-24T20:54:37.9263721Z ·  ────┬──── 2026-10-24T20:54:37.9263853Z · ╰── This is the containing effect 2026-10-24T20:54:37.9263927Z 2195 │ setExpandedVideo(null); 2026-10-24T20:54:37.9264010Z ·  ────────┬─────── 2026-10-24T20:54:37.9264183Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.9264263Z 2196 │ setExpandedFile(null); 2026-10-24T20:54:37.9264318Z ╰──── 2026-10-24T20:54:37.9264916Z  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-24T20:54:37.9265238Z  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-24T20:54:37.9265241Z 2026-10-24T20:54:37.9265497Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.9265634Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2700:9] 2026-10-24T20:54:37.9265823Z 2691 │ const stopFollowingEnd = useEffectEvent(() => setEndFollow(false)); 2026-10-24T20:54:37.9265920Z 2692 │ useEffect(() => { 2026-10-24T20:54:37.9265994Z ·  ────┬──── 2026-10-24T20:54:37.9266125Z · ╰── This is the containing effect 2026-10-24T20:54:37.9266280Z 2693 │ if (!jumpToMessageId || loadedListKey !== listMountKey) return; 2026-10-24T20:54:37.9266378Z 2694 │ const index = presentedFeed.findIndex( 2026-10-24T20:54:37.9266515Z 2695 │ (entry) => entry.type === "message" && entry.id === jumpToMessageId, 2026-10-24T20:54:37.9266573Z 2696 │ ); 2026-10-24T20:54:37.9266643Z 2697 │ if (index === -1) { 2026-10-24T20:54:37.9266776Z 2698 │ const runId = messageFoldRunId(props.feed, jumpToMessageId); 2026-10-24T20:54:37.9266881Z 2699 │ if (runId && !expandedTurnIds.has(runId)) { 2026-10-24T20:54:37.9266984Z 2700 │ setInteractionState((current) => ({ 2026-10-24T20:54:37.9267079Z ·  ─────────┬───────── 2026-10-24T20:54:37.9267257Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.9267324Z 2701 │ ...current, 2026-10-24T20:54:37.9267378Z ╰──── 2026-10-24T20:54:37.9267976Z  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-24T20:54:37.9268299Z  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-24T20:54:37.9268306Z 2026-10-24T20:54:37.9268537Z ⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used. 2026-10-24T20:54:37.9268670Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:70:10] 2026-10-24T20:54:37.9268809Z 69 │ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets"; 2026-10-24T20:54:37.9268948Z 70 │ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks"; 2026-10-24T20:54:37.9269047Z ·  ───────────┬─────────── 2026-10-24T20:54:37.9269214Z · ╰── 'isMarkdownFileLinkLabel' is imported here 2026-10-24T20:54:37.9269372Z 71 │ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments"; 2026-10-24T20:54:37.9269424Z ╰──── 2026-10-24T20:54:37.9269523Z  help: Consider removing this import. 2026-10-24T20:54:37.9269532Z 2026-10-24T20:54:37.9269741Z ⚠ eslint(no-unused-vars): Identifier 'createContext' is imported but never used. 2026-10-24T20:54:37.9269873Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:96:3] 2026-10-24T20:54:37.9269931Z 95 │ import { 2026-10-24T20:54:37.9269996Z 96 │ createContext, 2026-10-24T20:54:37.9270072Z ·  ──────┬────── 2026-10-24T20:54:37.9270208Z · ╰── 'createContext' is imported here 2026-10-24T20:54:37.9270264Z 97 │ memo, 2026-10-24T20:54:37.9270316Z ╰──── 2026-10-24T20:54:37.9270413Z  help: Consider removing this import. 2026-10-24T20:54:37.9270416Z 2026-10-24T20:54:37.9270628Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-24T20:54:37.9270823Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:112:3] 2026-10-24T20:54:37.9270918Z 111 │ import { 2026-10-24T20:54:37.9270986Z 112 │ ActivityIndicator, 2026-10-24T20:54:37.9271071Z ·  ────────┬──────── 2026-10-24T20:54:37.9271214Z · ╰── 'ActivityIndicator' is imported here 2026-10-24T20:54:37.9271273Z 113 │ Image, 2026-10-24T20:54:37.9271325Z ╰──── 2026-10-24T20:54:37.9271422Z  help: Consider removing this import. 2026-10-24T20:54:37.9271425Z 2026-10-24T20:54:37.9271624Z ⚠ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used. 2026-10-24T20:54:37.9271759Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:119:3] 2026-10-24T20:54:37.9271823Z 118 │ Pressable, 2026-10-24T20:54:37.9271886Z 119 │ ScrollView, 2026-10-24T20:54:37.9271966Z ·  ─────┬──── 2026-10-24T20:54:37.9272102Z · ╰── 'ScrollView' is imported here 2026-10-24T20:54:37.9272165Z 120 │ StyleSheet, 2026-10-24T20:54:37.9272218Z ╰──── 2026-10-24T20:54:37.9272314Z  help: Consider removing this import. 2026-10-24T20:54:37.9272316Z 2026-10-24T20:54:37.9272516Z ⚠ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used. 2026-10-24T20:54:37.9272652Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:121:11] 2026-10-24T20:54:37.9272714Z 120 │ StyleSheet, 2026-10-24T20:54:37.9272780Z 121 │ Text as NativeText, 2026-10-24T20:54:37.9272863Z ·  ─────┬──── 2026-10-24T20:54:37.9273001Z · ╰── 'NativeText' is imported here 2026-10-24T20:54:37.9273074Z 122 │ type ColorValue, 2026-10-24T20:54:37.9273128Z ╰──── 2026-10-24T20:54:37.9273226Z  help: Consider removing this import. 2026-10-24T20:54:37.9273229Z 2026-10-24T20:54:37.9273444Z ⚠ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used. 2026-10-24T20:54:37.9273576Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:144:10] 2026-10-24T20:54:37.9273714Z 143 │ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic"; 2026-10-24T20:54:37.9273840Z 144 │ import { tryOpenExternalUrl } from "../../lib/openExternalUrl"; 2026-10-24T20:54:37.9273932Z ·  ─────────┬──────── 2026-10-24T20:54:37.9274087Z · ╰── 'tryOpenExternalUrl' is imported here 2026-10-24T20:54:37.9274293Z 145 │ import { downloadAndShareAttachment } from "../../lib/attachmentDownload"; 2026-10-24T20:54:37.9274376Z ╰──── 2026-10-24T20:54:37.9274474Z  help: Consider removing this import. 2026-10-24T20:54:37.9274476Z 2026-10-24T20:54:37.9274695Z ⚠ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used. 2026-10-24T20:54:37.9274829Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:147:10] 2026-10-24T20:54:37.9274964Z 146 │ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks"; 2026-10-24T20:54:37.9275089Z 147 │ import { faviconUrlForOrigin } from "@t3tools/shared/favicon"; 2026-10-24T20:54:37.9275180Z ·  ─────────┬───────── 2026-10-24T20:54:37.9275336Z · ╰── 'faviconUrlForOrigin' is imported here 2026-10-24T20:54:37.9275395Z 148 │ import { 2026-10-24T20:54:37.9275447Z ╰──── 2026-10-24T20:54:37.9275550Z  help: Consider removing this import. 2026-10-24T20:54:37.9275558Z 2026-10-24T20:54:37.9275771Z ⚠ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used. 2026-10-24T20:54:37.9275902Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:161:10] 2026-10-24T20:54:37.9276052Z 160 │ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile"; 2026-10-24T20:54:37.9276219Z 161 │ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer"; 2026-10-24T20:54:37.9276307Z ·  ────────┬─────── 2026-10-24T20:54:37.9276456Z · ╰── 'MediaVideoPlayer' is imported here 2026-10-24T20:54:37.9276596Z 162 │ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia"; 2026-10-24T20:54:37.9276648Z ╰──── 2026-10-24T20:54:37.9276753Z  help: Consider removing this import. 2026-10-24T20:54:37.9276758Z 2026-10-24T20:54:37.9276979Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used. 2026-10-24T20:54:37.9277111Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:165:3] 2026-10-24T20:54:37.9277194Z 164 │ attachmentVideoPreviewSource, 2026-10-24T20:54:37.9277267Z 165 │ mediaVideoPreviewUri, 2026-10-24T20:54:37.9277351Z ·  ──────────┬───────── 2026-10-24T20:54:37.9277503Z · ╰── 'mediaVideoPreviewUri' is imported here 2026-10-24T20:54:37.9277577Z 166 │ mediaVideoThumbnailKey, 2026-10-24T20:54:37.9277628Z ╰──── 2026-10-24T20:54:37.9277723Z  help: Consider removing this import. 2026-10-24T20:54:37.9277725Z 2026-10-24T20:54:37.9277955Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used. 2026-10-24T20:54:37.9278089Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:166:3] 2026-10-24T20:54:37.9278162Z 165 │ mediaVideoPreviewUri, 2026-10-24T20:54:37.9278236Z 166 │ mediaVideoThumbnailKey, 2026-10-24T20:54:37.9278324Z ·  ───────────┬────────── 2026-10-24T20:54:37.9278482Z · ╰── 'mediaVideoThumbnailKey' is imported here 2026-10-24T20:54:37.9278725Z 167 │ type MediaVideoPreviewSource, 2026-10-24T20:54:37.9278778Z ╰──── 2026-10-24T20:54:37.9278874Z  help: Consider removing this import. 2026-10-24T20:54:37.9278877Z 2026-10-24T20:54:37.9279090Z ⚠ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used. 2026-10-24T20:54:37.9279296Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:167:8] 2026-10-24T20:54:37.9279410Z 166 │ mediaVideoThumbnailKey, 2026-10-24T20:54:37.9279490Z 167 │ type MediaVideoPreviewSource, 2026-10-24T20:54:37.9279587Z ·  ───────────┬─────────── 2026-10-24T20:54:37.9279750Z · ╰── 'MediaVideoPreviewSource' is imported here 2026-10-24T20:54:37.9279841Z 168 │ } from "../../lib/videoPreviewSource"; 2026-10-24T20:54:37.9279893Z ╰──── 2026-10-24T20:54:37.9279990Z  help: Consider removing this import. 2026-10-24T20:54:37.9279992Z 2026-10-24T20:54:37.9280191Z ⚠ eslint(no-unused-vars): Type 'ReviewDiffTheme' is imported but never used. 2026-10-24T20:54:37.9280325Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:175:15] 2026-10-24T20:54:37.9280507Z 174 │ import { parseReviewCommentMessageSegments } from "../review/reviewCommentSelection"; 2026-10-24T20:54:37.9280651Z 175 │ import type { ReviewDiffTheme } from "../review/shikiReviewHighlighter"; 2026-10-24T20:54:37.9280743Z ·  ───────┬─────── 2026-10-24T20:54:37.9280893Z · ╰── 'ReviewDiffTheme' is imported here 2026-10-24T20:54:37.9280952Z 176 │ import { 2026-10-24T20:54:37.9281004Z ╰──── 2026-10-24T20:54:37.9281100Z  help: Consider removing this import. 2026-10-24T20:54:37.9281102Z 2026-10-24T20:54:37.9281332Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used. 2026-10-24T20:54:37.9281463Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:190:3] 2026-10-24T20:54:37.9281524Z 189 │ import { 2026-10-24T20:54:37.9281607Z 190 │ resolveMarkdownFontSizes, 2026-10-24T20:54:37.9281701Z ·  ────────────┬─────────── 2026-10-24T20:54:37.9281859Z · ╰── 'resolveMarkdownFontSizes' is imported here 2026-10-24T20:54:37.9281949Z 191 │ resolveNativeMarkdownTypography, 2026-10-24T20:54:37.9282001Z ╰──── 2026-10-24T20:54:37.9282096Z  help: Consider removing this import. 2026-10-24T20:54:37.9282099Z 2026-10-24T20:54:37.9282356Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used. 2026-10-24T20:54:37.9282488Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:197:3] 2026-10-24T20:54:37.9282567Z 196 │ normalizeNativeMarkdownUrl, 2026-10-24T20:54:37.9282663Z 197 │ resolveMarkdownInlineCodePresentation, 2026-10-24T20:54:37.9282779Z ·  ──────────────────┬────────────────── 2026-10-24T20:54:37.9282978Z · ╰── 'resolveMarkdownInlineCodePresentation' is imported here 2026-10-24T20:54:37.9283064Z 198 │ resolveMarkdownLinkPresentation, 2026-10-24T20:54:37.9283117Z ╰──── 2026-10-24T20:54:37.9283212Z  help: Consider removing this import. 2026-10-24T20:54:37.9283215Z 2026-10-24T20:54:37.9283444Z ⚠ eslint(no-unused-vars): Identifier 'useMarkdownCodeHighlight' is imported but never used. 2026-10-24T20:54:37.9283579Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:242:10] 2026-10-24T20:54:37.9283682Z 241 │ import { ThreadMcpApp } from "./McpAppWebView"; 2026-10-24T20:54:37.9283830Z 242 │ import { useMarkdownCodeHighlight } from "./markdownCodeHighlightState"; 2026-10-24T20:54:37.9283983Z ·  ────────────┬─────────── 2026-10-24T20:54:37.9284183Z · ╰── 'useMarkdownCodeHighlight' is imported here 2026-10-24T20:54:37.9284245Z 243 │ import { 2026-10-24T20:54:37.9284297Z ╰──── 2026-10-24T20:54:37.9284394Z  help: Consider removing this import. 2026-10-24T20:54:37.9284396Z 2026-10-24T20:54:37.9284609Z ⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used. 2026-10-24T20:54:37.9284741Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:246:3] 2026-10-24T20:54:37.9284807Z 245 │ useAssetUrl, 2026-10-24T20:54:37.9284875Z 246 │ useAssetUrlState, 2026-10-24T20:54:37.9284956Z ·  ────────┬─────── 2026-10-24T20:54:37.9285099Z · ╰── 'useAssetUrlState' is imported here 2026-10-24T20:54:37.9285175Z 247 │ useRefreshAssetUrl, 2026-10-24T20:54:37.9285230Z ╰──── 2026-10-24T20:54:37.9285325Z  help: Consider removing this import. 2026-10-24T20:54:37.9285328Z 2026-10-24T20:54:37.9285529Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:54:37.9285666Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2197:7] 2026-10-24T20:54:37.9285741Z 2196 │ setExpandedFile(null); 2026-10-24T20:54:37.9285902Z 2197 │ }, [props.environmentId, props.threadId, props.contentPresentation.kind]); 2026-10-24T20:54:37.9286128Z ·  ─────────┬───────── ───────┬────── ───────────────┬────────────── 2026-10-24T20:54:37.9286458Z · │ │ ╰── Unnecessary dependency `props.contentPresentation.kind` 2026-10-24T20:54:37.9286658Z · │ ╰── Unnecessary dependency `props.threadId` 2026-10-24T20:54:37.9286822Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-24T20:54:37.9286965Z 2198 │ const horizontalPadding = props.layoutVariant === "split" ? 20 : 16; 2026-10-24T20:54:37.9287018Z ╰──── 2026-10-24T20:54:37.9287315Z  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-24T20:54:37.9287631Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.9287634Z 2026-10-24T20:54:37.9287839Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:54:37.9287978Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2669:7] 2026-10-24T20:54:37.9288077Z 2668 │ reportHeaderMaterialVisibility(false); 2026-10-24T20:54:37.9288191Z 2669 │ }, [feedThreadKey, reportHeaderMaterialVisibility]); 2026-10-24T20:54:37.9288273Z ·  ──────┬────── 2026-10-24T20:54:37.9288424Z · ╰── Unnecessary dependency `feedThreadKey` 2026-10-24T20:54:37.9288480Z 2670 │ 2026-10-24T20:54:37.9288532Z ╰──── 2026-10-24T20:54:37.9288824Z  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-24T20:54:37.9289196Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.9289235Z 2026-10-24T20:54:37.9289435Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:54:37.9289570Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2685:7] 2026-10-24T20:54:37.9289627Z 2684 │ } 2026-10-24T20:54:37.9289760Z 2685 │ }, [listMountKey, props.contentInsetEndAdjustment, listRef]); 2026-10-24T20:54:37.9289839Z ·  ──────┬───── 2026-10-24T20:54:37.9289989Z · ╰── Unnecessary dependency `listMountKey` 2026-10-24T20:54:37.9290135Z 2686 │ // Opening at a message: its run unfolds, the list stops following the end 2026-10-24T20:54:37.9290187Z ╰──── 2026-10-24T20:54:37.9290490Z  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-24T20:54:37.9290804Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.9290806Z 2026-10-24T20:54:37.9291005Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:54:37.9291141Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2881:7] 2026-10-24T20:54:37.9291199Z 2880 │ } 2026-10-24T20:54:37.9291383Z 2881 │ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]); 2026-10-24T20:54:37.9291590Z ·  ───────┬─────── ─────────┬──────── ────────┬─────── 2026-10-24T20:54:37.9291848Z · │ │ ╰── Unnecessary dependency `expandedWorkRows` 2026-10-24T20:54:37.9292053Z · │ ╰── Unnecessary dependency `expandedWorkGroups` 2026-10-24T20:54:37.9292208Z · ╰── Unnecessary dependency `expandedTurnIds` 2026-10-24T20:54:37.9292263Z 2882 │ 2026-10-24T20:54:37.9292315Z ╰──── 2026-10-24T20:54:37.9292609Z  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-24T20:54:37.9292982Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.9293017Z 2026-10-24T20:54:37.9293201Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T20:54:37.9293335Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:627:9] 2026-10-24T20:54:37.9293394Z 626 │ }; 2026-10-24T20:54:37.9293511Z 627 │ }, [props.environmentId, attachment.id, httpBaseUrl]), 2026-10-24T20:54:37.9293704Z ·  ─────────┬───────── ──────┬────── ─────┬───── 2026-10-24T20:54:37.9293948Z · │ │ ╰── Unnecessary dependency `httpBaseUrl` 2026-10-24T20:54:37.9294152Z · │ ╰── Unnecessary dependency `attachment.id` 2026-10-24T20:54:37.9294323Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-24T20:54:37.9294380Z 628 │ ); 2026-10-24T20:54:37.9294433Z ╰──── 2026-10-24T20:54:37.9294745Z  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-24T20:54:37.9295057Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.9295059Z 2026-10-24T20:54:37.9295320Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.9295481Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:57:5] 2026-10-24T20:54:37.9295538Z 55 │ 2026-10-24T20:54:37.9295605Z 56 │ useEffect(() => { 2026-10-24T20:54:37.9295678Z ·  ────┬──── 2026-10-24T20:54:37.9295807Z · ╰── This is the containing effect 2026-10-24T20:54:37.9295878Z 57 │ setDecodedSize(null); 2026-10-24T20:54:37.9295956Z ·  ───────┬────── 2026-10-24T20:54:37.9296126Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.9296223Z 58 │ }, [props.sourceKey]); 2026-10-24T20:54:37.9296275Z ╰──── 2026-10-24T20:54:37.9296882Z  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-24T20:54:37.9297209Z  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-24T20:54:37.9297212Z 2026-10-24T20:54:37.9297472Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.9297625Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5] 2026-10-24T20:54:37.9297679Z 59 │ 2026-10-24T20:54:37.9297744Z 60 │ useEffect(() => { 2026-10-24T20:54:37.9297816Z ·  ────┬──── 2026-10-24T20:54:37.9297944Z · ╰── This is the containing effect 2026-10-24T20:54:37.9298013Z 61 │ setFailedUri(null); 2026-10-24T20:54:37.9298146Z ·  ──────┬───── 2026-10-24T20:54:37.9298346Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.9298412Z 62 │ }, [props.uri]); 2026-10-24T20:54:37.9298466Z ╰──── 2026-10-24T20:54:37.9299065Z  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-24T20:54:37.9299388Z  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-24T20:54:37.9299390Z 2026-10-24T20:54:37.9299611Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-24T20:54:37.9299766Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10] 2026-10-24T20:54:37.9299891Z 6 │ import { parse, SvgAst, type JsxAST } from "react-native-svg"; 2026-10-24T20:54:37.9300071Z 7 │ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native"; 2026-10-24T20:54:37.9300161Z ·  ────────┬──────── 2026-10-24T20:54:37.9300312Z · ╰── 'ActivityIndicator' is imported here 2026-10-24T20:54:37.9300365Z 8 │ 2026-10-24T20:54:37.9300420Z ╰──── 2026-10-24T20:54:37.9300519Z  help: Consider removing this import. 2026-10-24T20:54:37.9300521Z 2026-10-24T20:54:37.9300722Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:54:37.9300879Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7] 2026-10-24T20:54:37.9300951Z 57 │ setDecodedSize(null); 2026-10-24T20:54:37.9301021Z 58 │ }, [props.sourceKey]); 2026-10-24T20:54:37.9301104Z ·  ───────┬─────── 2026-10-24T20:54:37.9301257Z · ╰── Unnecessary dependency `props.sourceKey` 2026-10-24T20:54:37.9301310Z 59 │ 2026-10-24T20:54:37.9301362Z ╰──── 2026-10-24T20:54:37.9301657Z  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-24T20:54:37.9301966Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.9301968Z 2026-10-24T20:54:37.9302172Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:54:37.9302325Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7] 2026-10-24T20:54:37.9302394Z 61 │ setFailedUri(null); 2026-10-24T20:54:37.9302460Z 62 │ }, [props.uri]); 2026-10-24T20:54:37.9302535Z ·  ────┬──── 2026-10-24T20:54:37.9302679Z · ╰── Unnecessary dependency `props.uri` 2026-10-24T20:54:37.9302732Z 63 │ 2026-10-24T20:54:37.9302785Z ╰──── 2026-10-24T20:54:37.9303076Z  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-24T20:54:37.9303445Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.9303480Z 2026-10-24T20:54:37.9303649Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:54:37.9303811Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:698:76] 2026-10-24T20:54:37.9303992Z 697 │ const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() })); 2026-10-24T20:54:37.9304161Z 698 │ if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() }); 2026-10-24T20:54:37.9304300Z ·  ─────┬──── 2026-10-24T20:54:37.9304484Z · ╰── Cannot call impure function 2026-10-24T20:54:37.9304629Z 699 │ const snoozeGateNow = new Date(snoozeGateClock.now).toISOString(); 2026-10-24T20:54:37.9304684Z ╰──── 2026-10-24T20:54:37.9304969Z  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-24T20:54:37.9305266Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:54:37.9305269Z 2026-10-24T20:54:37.9305435Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:54:37.9305593Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:719:71] 2026-10-24T20:54:37.9305676Z 718 │ const snoozePresets = useMemo( 2026-10-24T20:54:37.9305860Z 719 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-24T20:54:37.9305998Z ·  ─────┬──── 2026-10-24T20:54:37.9306205Z · ╰── Cannot call impure function 2026-10-24T20:54:37.9306323Z 720 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-24T20:54:37.9306377Z ╰──── 2026-10-24T20:54:37.9306654Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T20:54:37.9306949Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:54:37.9306951Z 2026-10-24T20:54:37.9307135Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T20:54:37.9307295Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:720:6] 2026-10-24T20:54:37.9307471Z 719 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-24T20:54:37.9307587Z 720 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-24T20:54:37.9307682Z ·  ────────────┬─────────── 2026-10-24T20:54:37.9307857Z · ╰── Unnecessary dependency `props.snoozePresetMinute` 2026-10-24T20:54:37.9307914Z 721 │ ); 2026-10-24T20:54:37.9307967Z ╰──── 2026-10-24T20:54:37.9308280Z  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-24T20:54:37.9308663Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.9308700Z 2026-10-24T20:54:37.9308880Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T20:54:37.9309039Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:766:7] 2026-10-24T20:54:37.9309111Z 765 │ thread.pinnedAt, 2026-10-24T20:54:37.9309173Z 766 │ variant, 2026-10-24T20:54:37.9309248Z ·  ───┬─── 2026-10-24T20:54:37.9309384Z · ╰── Unnecessary dependency `variant` 2026-10-24T20:54:37.9309441Z 767 │ ], 2026-10-24T20:54:37.9309492Z ╰──── 2026-10-24T20:54:37.9309810Z  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-24T20:54:37.9310125Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.9310127Z 2026-10-24T20:54:37.9310323Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T20:54:37.9310484Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1216:21] 2026-10-24T20:54:37.9310612Z 1215 │ {providerDrivers.slice(0, -1).map((driver, index) => ( 2026-10-24T20:54:37.9310748Z 1216 │ 2026-10-24T20:54:37.9310863Z ·  ────────────────────────── 2026-10-24T20:54:37.9310979Z 1217 │ 2026-10-24T20:54:37.9311034Z ╰──── 2026-10-24T20:54:37.9311183Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T20:54:37.9311186Z 2026-10-24T20:54:37.9311429Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T20:54:37.9311584Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:290:50] 2026-10-24T20:54:37.9311644Z 289 │ return ( 2026-10-24T20:54:37.9311781Z 290 │ 2026-10-24T20:54:37.9311902Z ·  ───────────── 2026-10-24T20:54:37.9311971Z 291 │ {props.children} 2026-10-24T20:54:37.9312022Z ╰──── 2026-10-24T20:54:37.9312306Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T20:54:37.9312480Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T20:54:37.9312483Z 2026-10-24T20:54:37.9312724Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T20:54:37.9312877Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:654:44] 2026-10-24T20:54:37.9312939Z 653 │ return ( 2026-10-24T20:54:37.9313063Z 654 │ 2026-10-24T20:54:37.9313181Z ·  ───────────── 2026-10-24T20:54:37.9313249Z 655 │ {props.children} 2026-10-24T20:54:37.9313301Z ╰──── 2026-10-24T20:54:37.9313528Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T20:54:37.9313669Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T20:54:37.9313672Z 2026-10-24T20:54:37.9313910Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T20:54:37.9314068Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1462:55] 2026-10-24T20:54:37.9314132Z 1461 │ return ( 2026-10-24T20:54:37.9314297Z 1462 │ 2026-10-24T20:54:37.9314431Z ·  ──────────────────── 2026-10-24T20:54:37.9314530Z 1463 │ { 2026-10-24T20:54:37.9322686Z 111 │ separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING); 2026-10-24T20:54:37.9322773Z ·  ─────────┬──────── 2026-10-24T20:54:37.9322925Z · ╰── `separationProgress` cannot be modified 2026-10-24T20:54:37.9323035Z 112 │ }, [props.showScrollToEnd, separationProgress]); 2026-10-24T20:54:37.9323089Z ╰──── 2026-10-24T20:54:37.9323357Z  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-24T20:54:37.9323669Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:54:37.9323681Z 2026-10-24T20:54:37.9323840Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:54:37.9324004Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-24T20:54:37.9324118Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-24T20:54:37.9324238Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-24T20:54:37.9324319Z ·  ──────┬───── 2026-10-24T20:54:37.9324458Z · ╰── `capsuleWidth` originates here 2026-10-24T20:54:37.9324570Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T20:54:37.9324687Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T20:54:37.9324795Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T20:54:37.9324899Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T20:54:37.9324966Z 134 │ return; 2026-10-24T20:54:37.9325023Z 135 │ } 2026-10-24T20:54:37.9325129Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T20:54:37.9325217Z 137 │ measuredWidthRef.current = width; 2026-10-24T20:54:37.9325361Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T20:54:37.9325439Z ·  ──────┬───── 2026-10-24T20:54:37.9325578Z · ╰── `capsuleWidth` cannot be modified 2026-10-24T20:54:37.9325633Z 139 │ }; 2026-10-24T20:54:37.9325686Z ╰──── 2026-10-24T20:54:37.9325949Z  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-24T20:54:37.9326292Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:54:37.9326300Z 2026-10-24T20:54:37.9326459Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:54:37.9326624Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-24T20:54:37.9326737Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-24T20:54:37.9326852Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-24T20:54:37.9326933Z ·  ──────┬───── 2026-10-24T20:54:37.9327070Z · ╰── `capsuleWidth` originates here 2026-10-24T20:54:37.9327181Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T20:54:37.9327364Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T20:54:37.9327500Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T20:54:37.9327597Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T20:54:37.9327658Z 134 │ return; 2026-10-24T20:54:37.9327713Z 135 │ } 2026-10-24T20:54:37.9327819Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T20:54:37.9327909Z 137 │ measuredWidthRef.current = width; 2026-10-24T20:54:37.9328051Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T20:54:37.9328104Z 139 │ }; 2026-10-24T20:54:37.9328197Z 140 │ const hasStatus = props.status !== null; 2026-10-24T20:54:37.9328331Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-24T20:54:37.9328399Z 142 │ useEffect(() => { 2026-10-24T20:54:37.9328465Z 143 │ if (!hasStatus) { 2026-10-24T20:54:37.9328559Z 144 │ measuredWidthRef.current = null; 2026-10-24T20:54:37.9328644Z 145 │ capsuleWidth.value = null; 2026-10-24T20:54:37.9328722Z ·  ──────┬───── 2026-10-24T20:54:37.9328864Z · ╰── `capsuleWidth` cannot be modified 2026-10-24T20:54:37.9328920Z 146 │ } 2026-10-24T20:54:37.9328973Z ╰──── 2026-10-24T20:54:37.9329235Z  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-24T20:54:37.9329538Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:54:37.9329542Z 2026-10-24T20:54:37.9329747Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T20:54:37.9329913Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-24T20:54:37.9330049Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-24T20:54:37.9330116Z 142 │ useEffect(() => { 2026-10-24T20:54:37.9330194Z ·  ───┬─── 2026-10-24T20:54:37.9330416Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-24T20:54:37.9330484Z 143 │ if (!hasStatus) { 2026-10-24T20:54:37.9330574Z 144 │ measuredWidthRef.current = null; 2026-10-24T20:54:37.9330652Z 145 │ capsuleWidth.value = null; 2026-10-24T20:54:37.9330729Z ·  ──────┬───── 2026-10-24T20:54:37.9330865Z · ╰── This modifies `capsuleWidth` 2026-10-24T20:54:37.9330926Z 146 │ } 2026-10-24T20:54:37.9330980Z ╰──── 2026-10-24T20:54:37.9331321Z  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-24T20:54:37.9331627Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:54:37.9331629Z 2026-10-24T20:54:37.9331830Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T20:54:37.9331992Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-24T20:54:37.9332106Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T20:54:37.9332282Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T20:54:37.9332448Z ·  ───────────────┬─────────────── 2026-10-24T20:54:37.9332689Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-24T20:54:37.9332795Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T20:54:37.9332893Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T20:54:37.9332955Z 134 │ return; 2026-10-24T20:54:37.9333009Z 135 │ } 2026-10-24T20:54:37.9333116Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T20:54:37.9333204Z 137 │ measuredWidthRef.current = width; 2026-10-24T20:54:37.9333348Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T20:54:37.9333424Z ·  ──────┬───── 2026-10-24T20:54:37.9333564Z · ╰── This modifies `capsuleWidth` 2026-10-24T20:54:37.9333622Z 139 │ }; 2026-10-24T20:54:37.9333676Z ╰──── 2026-10-24T20:54:37.9334012Z  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-24T20:54:37.9334316Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:54:37.9334319Z 2026-10-24T20:54:37.9334576Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.9334727Z ╭─[apps/mobile/src/features/threads/use-worktree-setup.ts:30:40] 2026-10-24T20:54:37.9334895Z 28 │ const snapshot = resolveWorktreeSetupSnapshot(input.threadId, query.data, live); 2026-10-24T20:54:37.9334962Z 29 │ useEffect(() => { 2026-10-24T20:54:37.9335034Z ·  ────┬──── 2026-10-24T20:54:37.9335164Z · ╰── This is the containing effect 2026-10-24T20:54:37.9335290Z 30 │ if (snapshot && snapshot !== live) setHeld({ key, snapshot }); 2026-10-24T20:54:37.9335394Z ·  ───┬─── 2026-10-24T20:54:37.9335587Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.9335663Z 31 │ }, [key, live, snapshot]); 2026-10-24T20:54:37.9335717Z ╰──── 2026-10-24T20:54:37.9336403Z  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-24T20:54:37.9336758Z  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-24T20:54:37.9336760Z 2026-10-24T20:54:37.9336930Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:54:37.9337081Z ╭─[apps/web/src/components/chat/useThreadLifecycle.tsx:178:58] 2026-10-24T20:54:37.9337196Z 177 │ if (snoozeClockState.shell !== activeThreadShell) { 2026-10-24T20:54:37.9337359Z 178 │ setSnoozeClockState({ shell: activeThreadShell, now: new Date().toISOString() }); 2026-10-24T20:54:37.9337487Z ·  ─────┬──── 2026-10-24T20:54:37.9338700Z · ╰── Cannot call impure function 2026-10-24T20:54:37.9338761Z 179 │ } 2026-10-24T20:54:37.9338813Z ╰──── 2026-10-24T20:54:37.9339095Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T20:54:37.9339391Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:54:37.9339393Z 2026-10-24T20:54:37.9339653Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:54:37.9339831Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10602:7] 2026-10-24T20:54:37.9339891Z 10601 │ 2026-10-24T20:54:37.9339965Z 10602 │ const layer: Layer.Layer< 2026-10-24T20:54:37.9340038Z ·  ──┬── 2026-10-24T20:54:37.9340166Z · ╰── 'layer' is declared here 2026-10-24T20:54:37.9340263Z 10603 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T20:54:37.9340317Z ╰──── 2026-10-24T20:54:37.9340425Z  help: Consider removing this declaration. 2026-10-24T20:54:37.9340427Z 2026-10-24T20:54:37.9340653Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T20:54:37.9340823Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:1998:15] 2026-10-24T20:54:37.9340892Z 1997 │ assert.equal( 2026-10-24T20:54:37.9341051Z 1998 │ items.filter((item) => item.type === "assistant_message").at(-1)?.text, 2026-10-24T20:54:37.9341135Z ·  ────── 2026-10-24T20:54:37.9341213Z 1999 │ "authoritative answer", 2026-10-24T20:54:37.9341266Z ╰──── 2026-10-24T20:54:37.9341438Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T20:54:37.9341441Z 2026-10-24T20:54:37.9341913Z ⚠ 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-24T20:54:37.9342080Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:3951:7] 2026-10-24T20:54:37.9342329Z 3950 │ const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped); 2026-10-24T20:54:37.9342577Z 3951 │ ╭─▶ while (!responseLifecycle.includes("failed")) { 2026-10-24T20:54:37.9342689Z 3952 │ │ yield* Effect.yieldNow; 2026-10-24T20:54:37.9342824Z 3953 │ ╰─▶ } 2026-10-24T20:54:37.9342945Z 3954 │ const responseExit = yield* Fiber.join(responseFiber); 2026-10-24T20:54:37.9342999Z ╰──── 2026-10-24T20:54:37.9343002Z 2026-10-24T20:54:37.9343463Z ⚠ 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-24T20:54:37.9343639Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6062:9] 2026-10-24T20:54:37.9343733Z 6061 │ .pipe(Effect.forkScoped); 2026-10-24T20:54:37.9343919Z 6062 │ ╭─▶ while (promptGates.length < 1) { 2026-10-24T20:54:37.9344031Z 6063 │ │ yield* Effect.yieldNow; 2026-10-24T20:54:37.9344168Z 6064 │ ╰─▶ } 2026-10-24T20:54:37.9344339Z 6065 │ assert.isDefined(sessionUpdateHandler, "session update handler must be wired"); 2026-10-24T20:54:37.9344391Z ╰──── 2026-10-24T20:54:37.9344394Z 2026-10-24T20:54:37.9344851Z ⚠ 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-24T20:54:37.9345022Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6197:9] 2026-10-24T20:54:37.9345113Z 6196 │ .pipe(Effect.forkScoped); 2026-10-24T20:54:37.9345296Z 6197 │ ╭─▶ while (promptGates.length < 2) { 2026-10-24T20:54:37.9345406Z 6198 │ │ yield* Effect.yieldNow; 2026-10-24T20:54:37.9345543Z 6199 │ ╰─▶ } 2026-10-24T20:54:37.9345709Z 6200 │ if (sessionUpdateHandler === undefined || capturedMutation.current === null) { 2026-10-24T20:54:37.9345760Z ╰──── 2026-10-24T20:54:37.9345763Z 2026-10-24T20:54:37.9345931Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:54:37.9346092Z ╭─[apps/web/src/components/CommandPaletteThreadItems.tsx:152:58] 2026-10-24T20:54:37.9346304Z 151 │ if (threadSearchQuery.trim().length > 0 && !threadSearchQuery.startsWith(">") && !isOpen) { 2026-10-24T20:54:37.9346440Z 152 │ claimThreadOpen(thread.environmentId, thread.id, Date.now()); 2026-10-24T20:54:37.9346564Z ·  ─────┬──── 2026-10-24T20:54:37.9346736Z · ╰── Cannot call impure function 2026-10-24T20:54:37.9346795Z 153 │ } 2026-10-24T20:54:37.9346847Z ╰──── 2026-10-24T20:54:37.9347133Z  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-24T20:54:37.9347489Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:54:37.9347530Z 2026-10-24T20:54:37.9347902Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownEffect(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const. 2026-10-24T20:54:37.9348018Z ╭─[packages/effect-acp/src/client.ts:1269:11] 2026-10-24T20:54:37.9348169Z 1268 │ extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) => 2026-10-24T20:54:37.9348342Z 1269 │ Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe( 2026-10-24T20:54:37.9348449Z ·  ────────────────────────── 2026-10-24T20:54:37.9348595Z 1270 │ Effect.mapError(() => AcpError.AcpRequestError.invalidParams()), 2026-10-24T20:54:37.9348648Z ╰──── 2026-10-24T20:54:37.9348651Z 2026-10-24T20:54:37.9349118Z ⚠ 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-24T20:54:37.9349244Z ╭─[packages/effect-acp/src/errors.test.ts:129:28] 2026-10-24T20:54:37.9349339Z 128 │ const secret = "acp-summary-secret"; 2026-10-24T20:54:37.9349451Z 129 │ const cause = yield* Schema.decodeUnknownEffect( 2026-10-24T20:54:37.9349568Z ·  ────────────────────────── 2026-10-24T20:54:37.9349637Z 130 │ Schema.Struct({ 2026-10-24T20:54:37.9349689Z ╰──── 2026-10-24T20:54:37.9349692Z 2026-10-24T20:54:37.9350032Z ⚠ 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-24T20:54:37.9350152Z ╭─[packages/effect-acp/src/schema.test.ts:18:12] 2026-10-24T20:54:37.9350317Z 17 │ const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } }; 2026-10-24T20:54:37.9350442Z 18 │ expect(Schema.is(V1.AvailableCommand)(command)).toBe(true); 2026-10-24T20:54:37.9350521Z ·  ───────── 2026-10-24T20:54:37.9350582Z 19 │ expect( 2026-10-24T20:54:37.9350633Z ╰──── 2026-10-24T20:54:37.9350635Z 2026-10-24T20:54:37.9350966Z ⚠ 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-24T20:54:37.9351082Z ╭─[packages/effect-acp/src/schema.test.ts:20:7] 2026-10-24T20:54:37.9351142Z 19 │ expect( 2026-10-24T20:54:37.9351314Z 20 │ Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }), 2026-10-24T20:54:37.9351391Z ·  ───────── 2026-10-24T20:54:37.9351454Z 21 │ ).toBe(true); 2026-10-24T20:54:37.9351506Z ╰──── 2026-10-24T20:54:37.9351508Z 2026-10-24T20:54:37.9351967Z ⚠ 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-24T20:54:37.9352095Z ╭─[packages/effect-acp/src/protocol.test.ts:500:31] 2026-10-24T20:54:37.9352149Z 499 │ 2026-10-24T20:54:37.9352265Z 500 │ const response = yield* Schema.decodeUnknownEffect( 2026-10-24T20:54:37.9352383Z ·  ────────────────────────── 2026-10-24T20:54:37.9352553Z 501 │ Schema.fromJsonString(JsonRpcErrorResponse), 2026-10-24T20:54:37.9352637Z ╰──── 2026-10-24T20:54:37.9352639Z 2026-10-24T20:54:37.9352862Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T20:54:37.9352996Z ╭─[apps/mobile/src/state/use-composer-drafts.ts:1022:15] 2026-10-24T20:54:37.9353065Z 1021 │ instanceId, 2026-10-24T20:54:37.9353208Z 1022 │ { ...(persisted.modelOptionMemory[instanceId] ?? {}), ...models }, 2026-10-24T20:54:37.9353347Z ·  ────────────────────────────────────────────────── 2026-10-24T20:54:37.9353409Z 1023 │ ]), 2026-10-24T20:54:37.9353462Z ╰──── 2026-10-24T20:54:37.9353729Z  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-24T20:54:37.9353739Z 2026-10-24T20:54:37.9353888Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:54:37.9354040Z ╭─[apps/mobile/src/features/home/thread-swipe-actions.tsx:494:27] 2026-10-24T20:54:37.9354098Z 493 │ > 2026-10-24T20:54:37.9354178Z 494 │ {props.children(close)} 2026-10-24T20:54:37.9354270Z ·  ──┬── 2026-10-24T20:54:37.9354430Z · ╰── Cannot access ref value during render 2026-10-24T20:54:37.9354508Z 495 │ 2026-10-24T20:54:37.9354560Z ╰──── 2026-10-24T20:54:37.9355034Z  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-24T20:54:37.9355330Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:54:37.9355333Z 2026-10-24T20:54:37.9355477Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:54:37.9355637Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39] 2026-10-24T20:54:37.9355693Z 276 │ 2026-10-24T20:54:37.9355878Z 277 │ ╭─▶ return createElement(RawNativeView, { 2026-10-24T20:54:37.9355972Z 278 │ │ ...nativeProps, 2026-10-24T20:54:37.9356119Z 279 │ │ refreshEnabled: props.onPullToRefresh !== undefined, 2026-10-24T20:54:37.9356249Z 280 │ │ ref: nativeRef, 2026-10-24T20:54:37.9356382Z 281 │ ├─▶ }); 2026-10-24T20:54:37.9356620Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T20:54:37.9356675Z 282 │ } 2026-10-24T20:54:37.9356728Z ╰──── 2026-10-24T20:54:37.9357191Z  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-24T20:54:37.9357485Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:54:37.9357488Z 2026-10-24T20:54:37.9357715Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:54:37.9357875Z ╭─[apps/web/src/components/CommandPalette.tsx:2037:20] 2026-10-24T20:54:37.9357994Z 2036 │ title: inferProjectTitleFromPath(destinationPath), 2026-10-24T20:54:37.9358089Z 2037 │ createdAt: new Date().toISOString(), 2026-10-24T20:54:37.9358180Z ·  ─────┬──── 2026-10-24T20:54:37.9358327Z · ╰── Cannot call impure function 2026-10-24T20:54:37.9358437Z 2038 │ remoteUrl: addProjectCloneFlow.remoteUrl, 2026-10-24T20:54:37.9358491Z ╰──── 2026-10-24T20:54:37.9358864Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T20:54:37.9359167Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:54:37.9359174Z 2026-10-24T20:54:37.9359642Z ⚠ 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-24T20:54:37.9359812Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7] 2026-10-24T20:54:37.9359915Z 565 │ let afterSequence = created[0]!.sequence; 2026-10-24T20:54:37.9360112Z 566 │ ╭─▶ for (let index = 1; index <= 32; index += 1) { 2026-10-24T20:54:37.9360215Z 567 │ │ const nextEvent = { 2026-10-24T20:54:37.9360380Z 568 │ │ id: EventId.make(`event:foundation-stream-race:${index}`), 2026-10-24T20:54:37.9360517Z 569 │ │ type: "thread.metadata-updated" as const, 2026-10-24T20:54:37.9360607Z 570 │ │ threadId, 2026-10-24T20:54:37.9360712Z 571 │ │ providerInstanceId, 2026-10-24T20:54:37.9360812Z 572 │ │ occurredAt: now, 2026-10-24T20:54:37.9360961Z 573 │ │ payload: { ...thread, title: `Race update ${index}` }, 2026-10-24T20:54:37.9361089Z 574 │ │ } satisfies OrchestrationV2DomainEvent; 2026-10-24T20:54:37.9361204Z 575 │ │ const reader = yield* eventSink 2026-10-24T20:54:37.9361325Z 576 │ │ .stream({ threadId, afterSequence }) 2026-10-24T20:54:37.9361463Z 577 │ │ .pipe(Stream.runHead, Effect.forkChild); 2026-10-24T20:54:37.9361572Z 578 │ │ yield* Effect.yieldNow; 2026-10-24T20:54:37.9361737Z 579 │ │ const written = yield* eventSink.write({ events: [nextEvent] }); 2026-10-24T20:54:37.9361867Z 580 │ │ const received = yield* Fiber.join(reader); 2026-10-24T20:54:37.9361984Z 581 │ │ if (Option.isNone(received)) { 2026-10-24T20:54:37.9362186Z 582 │ │ return yield* Effect.die("The event stream ended before delivering the live event."); 2026-10-24T20:54:37.9362265Z 583 │ │ } 2026-10-24T20:54:37.9362427Z 584 │ │ assert.equal(received.value.sequence, written[0]?.sequence); 2026-10-24T20:54:37.9362655Z 585 │ │ assert.equal(received.value.event.id, nextEvent.id); 2026-10-24T20:54:37.9362825Z 586 │ │ afterSequence = received.value.sequence; 2026-10-24T20:54:37.9362956Z 587 │ ╰─▶ } 2026-10-24T20:54:37.9363017Z 588 │ }), 2026-10-24T20:54:37.9363070Z ╰──── 2026-10-24T20:54:37.9363073Z 2026-10-24T20:54:37.9363535Z ⚠ 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-24T20:54:37.9363708Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:2327:9] 2026-10-24T20:54:37.9363786Z 2326 │ let settled = false; 2026-10-24T20:54:37.9363958Z 2327 │ ╭─▶ while (!settled) { 2026-10-24T20:54:37.9364123Z 2328 │ │ settled = (yield* outbox.listByCommandId(commandId)).every( 2026-10-24T20:54:37.9364257Z 2329 │ │ (effect) => effect.status === "succeeded", 2026-10-24T20:54:37.9364340Z 2330 │ │ ); 2026-10-24T20:54:37.9364467Z 2331 │ │ if (!settled) yield* Effect.yieldNow; 2026-10-24T20:54:37.9364603Z 2332 │ ╰─▶ } 2026-10-24T20:54:37.9364722Z 2333 │ }).pipe(Effect.provide(layerWorker), Effect.scoped); 2026-10-24T20:54:37.9364774Z ╰──── 2026-10-24T20:54:37.9364776Z 2026-10-24T20:54:37.9364959Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T20:54:37.9365149Z ╭─[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:116:34] 2026-10-24T20:54:37.9365222Z 115 │ return [...commands]; 2026-10-24T20:54:37.9365355Z 116 │ }, [activeThreadRef, pathname, registrationVersion, navigation]); 2026-10-24T20:54:37.9365471Z ·  ─────────┬───────── 2026-10-24T20:54:37.9365656Z · ╰── Unnecessary dependency `registrationVersion` 2026-10-24T20:54:37.9365709Z 117 │ 2026-10-24T20:54:37.9365761Z ╰──── 2026-10-24T20:54:37.9366077Z  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-24T20:54:37.9366477Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.9366512Z 2026-10-24T20:54:37.9366739Z ⚠ eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used. 2026-10-24T20:54:37.9366865Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:15:8] 2026-10-24T20:54:37.9366936Z 14 │ threadSearchMatchKey, 2026-10-24T20:54:37.9367024Z 15 │ type EnvironmentThreadSearchMatch, 2026-10-24T20:54:37.9367127Z ·  ──────────────┬───────────── 2026-10-24T20:54:37.9367304Z · ╰── 'EnvironmentThreadSearchMatch' is imported here 2026-10-24T20:54:37.9367413Z 16 │ } from "@t3tools/client-runtime/state/thread-search"; 2026-10-24T20:54:37.9367464Z ╰──── 2026-10-24T20:54:37.9367563Z  help: Consider removing this import. 2026-10-24T20:54:37.9367566Z 2026-10-24T20:54:37.9367773Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:54:37.9367905Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:527:25] 2026-10-24T20:54:37.9368036Z 526 │ // range) the boundary string is identical and the chain would die. 2026-10-24T20:54:37.9368128Z 527 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-24T20:54:37.9368230Z ·  ───────┬────── 2026-10-24T20:54:37.9368394Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T20:54:37.9368534Z 528 │ const v2SearchQuery = props.searchQuery.trim().toLocaleLowerCase(); 2026-10-24T20:54:37.9368587Z ╰──── 2026-10-24T20:54:37.9368886Z  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-24T20:54:37.9369202Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:54:37.9369205Z 2026-10-24T20:54:37.9369371Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:54:37.9369500Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:518:53] 2026-10-24T20:54:37.9369588Z 517 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-24T20:54:37.9369748Z 518 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-24T20:54:37.9369868Z ·  ─────┬──── 2026-10-24T20:54:37.9370041Z · ╰── Cannot call impure function 2026-10-24T20:54:37.9370123Z 519 │ const id = setTimeout(() => { 2026-10-24T20:54:37.9370175Z ╰──── 2026-10-24T20:54:37.9370457Z  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-24T20:54:37.9370752Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:54:37.9370754Z 2026-10-24T20:54:37.9371013Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.9371185Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:123:7] 2026-10-24T20:54:37.9371239Z 118 │ 2026-10-24T20:54:37.9371305Z 119 │ useEffect(() => { 2026-10-24T20:54:37.9371443Z ·  ────┬──── 2026-10-24T20:54:37.9371608Z · ╰── This is the containing effect 2026-10-24T20:54:37.9371692Z 120 │ if (orientationSettled) return; 2026-10-24T20:54:37.9371805Z 121 │ const orientation = getNativeShowcaseOrientation(); 2026-10-24T20:54:37.9371882Z 122 │ if (orientation === null) { 2026-10-24T20:54:37.9371965Z 123 │ setOrientationSettled(true); 2026-10-24T20:54:37.9372056Z ·  ──────────┬────────── 2026-10-24T20:54:37.9372228Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.9372291Z 124 │ return; 2026-10-24T20:54:37.9372343Z ╰──── 2026-10-24T20:54:37.9372951Z  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-24T20:54:37.9373277Z  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-24T20:54:37.9373280Z 2026-10-24T20:54:37.9373537Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:54:37.9373706Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:304:7] 2026-10-24T20:54:37.9373760Z 292 │ 2026-10-24T20:54:37.9373825Z 293 │ useEffect(() => { 2026-10-24T20:54:37.9373898Z ·  ────┬──── 2026-10-24T20:54:37.9374032Z · ╰── This is the containing effect 2026-10-24T20:54:37.9374094Z 294 │ if ( 2026-10-24T20:54:37.9374160Z 295 │ scene === null || 2026-10-24T20:54:37.9374238Z 296 │ requestedScene === null || 2026-10-24T20:54:37.9374316Z 297 │ scene !== requestedScene || 2026-10-24T20:54:37.9374382Z 298 │ !hasFixture || 2026-10-24T20:54:37.9374455Z 299 │ !orientationSettled || 2026-10-24T20:54:37.9374524Z 300 │ !themeApplied || 2026-10-24T20:54:37.9374642Z 301 │ (scene === "agent-activity" && !agentActivityStaged) || 2026-10-24T20:54:37.9374776Z 302 │ !isShowcaseNativeContentReady({ scene, themeId, renderSignal }) 2026-10-24T20:54:37.9374832Z 303 │ ) { 2026-10-24T20:54:37.9374902Z 304 │ setReadyScene(null); 2026-10-24T20:54:37.9374982Z ·  ──────┬────── 2026-10-24T20:54:37.9375160Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:54:37.9375224Z 305 │ return; 2026-10-24T20:54:37.9375276Z ╰──── 2026-10-24T20:54:37.9375873Z  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-24T20:54:37.9376223Z  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-24T20:54:37.9376226Z 2026-10-24T20:54:37.9376557Z ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:54:37.9376758Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:128:9] 2026-10-24T20:54:37.9376828Z 127 │ let cancelled = false; 2026-10-24T20:54:37.9376920Z 128 │ let lastOutcome: string | null = null; 2026-10-24T20:54:37.9376999Z ·  ─────┬───── 2026-10-24T20:54:37.9377135Z · ╰── 'lastOutcome' is declared here 2026-10-24T20:54:37.9377316Z 129 │ void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), { 2026-10-24T20:54:37.9377368Z ╰──── 2026-10-24T20:54:37.9377474Z  help: Consider removing this declaration. 2026-10-24T20:54:37.9377476Z 2026-10-24T20:54:37.9377633Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:54:37.9377809Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5] 2026-10-24T20:54:37.9377867Z 90 │ }) { 2026-10-24T20:54:37.9377980Z 91 │ const rotation = useSharedValue(props.hidden ? 1 : 0); 2026-10-24T20:54:37.9378055Z ·  ────┬─── 2026-10-24T20:54:37.9378188Z · ╰── `rotation` originates here 2026-10-24T20:54:37.9378258Z 92 │ useLayoutEffect(() => { 2026-10-24T20:54:37.9378401Z 93 │ rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING); 2026-10-24T20:54:37.9378470Z ·  ────┬─── 2026-10-24T20:54:37.9378603Z · ╰── `rotation` cannot be modified 2026-10-24T20:54:37.9378680Z 94 │ }, [props.hidden, rotation]); 2026-10-24T20:54:37.9378731Z ╰──── 2026-10-24T20:54:37.9379002Z  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-24T20:54:37.9379314Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:54:37.9379317Z 2026-10-24T20:54:37.9379473Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:54:37.9379644Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:269:5] 2026-10-24T20:54:37.9379739Z 266 │ const variant = props.variant ?? "plain"; 2026-10-24T20:54:37.9379872Z 267 │ const loadingVisibility = useSharedValue(props.loading ? 1 : 0); 2026-10-24T20:54:37.9379959Z ·  ────────┬──────── 2026-10-24T20:54:37.9380107Z · ╰── `loadingVisibility` originates here 2026-10-24T20:54:37.9380183Z 268 │ useLayoutEffect(() => { 2026-10-24T20:54:37.9380344Z 269 │ loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING); 2026-10-24T20:54:37.9380427Z ·  ────────┬──────── 2026-10-24T20:54:37.9380577Z · ╰── `loadingVisibility` cannot be modified 2026-10-24T20:54:37.9380669Z 270 │ }, [loadingVisibility, props.loading]); 2026-10-24T20:54:37.9380720Z ╰──── 2026-10-24T20:54:37.9380982Z  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-24T20:54:37.9381289Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:54:37.9381291Z 2026-10-24T20:54:37.9381506Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:54:37.9381703Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:328:5] 2026-10-24T20:54:37.9381759Z 325 │ }) { 2026-10-24T20:54:37.9381920Z 326 │ const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0); 2026-10-24T20:54:37.9382011Z ·  ─────────┬───────── 2026-10-24T20:54:37.9382164Z · ╰── `recordingVisibility` originates here 2026-10-24T20:54:37.9382235Z 327 │ useLayoutEffect(() => { 2026-10-24T20:54:37.9382424Z 328 │ recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING); 2026-10-24T20:54:37.9382512Z ·  ─────────┬───────── 2026-10-24T20:54:37.9382665Z · ╰── `recordingVisibility` cannot be modified 2026-10-24T20:54:37.9382763Z 329 │ }, [props.phase, recordingVisibility]); 2026-10-24T20:54:37.9382818Z ╰──── 2026-10-24T20:54:37.9383080Z  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-24T20:54:37.9383384Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:54:37.9383386Z 2026-10-24T20:54:37.9383540Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:54:37.9383708Z ╭─[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5] 2026-10-24T20:54:37.9383812Z 65 │ const [expanded, setExpanded] = useState(false); 2026-10-24T20:54:37.9383896Z 66 │ const progress = useSharedValue(0); 2026-10-24T20:54:37.9383975Z ·  ────┬─── 2026-10-24T20:54:37.9384110Z · ╰── `progress` originates here 2026-10-24T20:54:37.9384177Z 67 │ useEffect(() => { 2026-10-24T20:54:37.9384302Z 68 │ progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING); 2026-10-24T20:54:37.9384372Z ·  ────┬─── 2026-10-24T20:54:37.9384505Z · ╰── `progress` cannot be modified 2026-10-24T20:54:37.9384577Z 69 │ }, [expanded, progress]); 2026-10-24T20:54:37.9384630Z ╰──── 2026-10-24T20:54:37.9384888Z  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-24T20:54:37.9385199Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:54:37.9385204Z 2026-10-24T20:54:37.9385352Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:54:37.9385521Z ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14] 2026-10-24T20:54:37.9385603Z 26 │ const latestInput = useRef(input); 2026-10-24T20:54:37.9385680Z 27 │ latestInput.current = input; 2026-10-24T20:54:37.9385793Z ·  ─────┬─────────┬─── 2026-10-24T20:54:37.9385977Z · │ ╰── Cannot update ref value during render 2026-10-24T20:54:37.9386093Z · ╰── This value is a ref 2026-10-24T20:54:37.9386193Z 28 │ const mounted = useRef(true); 2026-10-24T20:54:37.9386246Z ╰──── 2026-10-24T20:54:37.9386773Z  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-24T20:54:37.9387102Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:54:37.9387105Z 2026-10-24T20:54:37.9387250Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:54:37.9387410Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:122:38] 2026-10-24T20:54:37.9387570Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-24T20:54:37.9387695Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-24T20:54:37.9387820Z ·  ───────────┬────────── 2026-10-24T20:54:37.9387997Z · ╰── Cannot access ref value during render 2026-10-24T20:54:37.9388118Z 123 │ const sessionRef = useRef(null); 2026-10-24T20:54:37.9388170Z ╰──── 2026-10-24T20:54:37.9388636Z  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-24T20:54:37.9388926Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:54:37.9388929Z 2026-10-24T20:54:37.9389079Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:54:37.9389240Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8] 2026-10-24T20:54:37.9389293Z 125 │ 2026-10-24T20:54:37.9389402Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T20:54:37.9389490Z ·  ─────────┬──────── 2026-10-24T20:54:37.9389640Z · ╰── Cannot access ref value during render 2026-10-24T20:54:37.9389745Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T20:54:37.9389796Z ╰──── 2026-10-24T20:54:37.9390257Z  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-24T20:54:37.9390601Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:54:37.9390634Z 2026-10-24T20:54:37.9390777Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:54:37.9390935Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7] 2026-10-24T20:54:37.9390988Z 125 │ 2026-10-24T20:54:37.9391097Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T20:54:37.9391185Z ·  ─────────┬───────── 2026-10-24T20:54:37.9391333Z · ╰── Cannot access ref value during render 2026-10-24T20:54:37.9391435Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T20:54:37.9391487Z ╰──── 2026-10-24T20:54:37.9391956Z  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-24T20:54:37.9392248Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:54:37.9392250Z 2026-10-24T20:54:37.9392393Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:54:37.9392550Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31] 2026-10-24T20:54:37.9392605Z 125 │ 2026-10-24T20:54:37.9392713Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T20:54:37.9392827Z ·  ─────────┬───────── 2026-10-24T20:54:37.9392999Z · ╰── Cannot access ref value during render 2026-10-24T20:54:37.9393102Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T20:54:37.9393154Z ╰──── 2026-10-24T20:54:37.9393617Z  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-24T20:54:37.9393907Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:54:37.9393911Z 2026-10-24T20:54:37.9394054Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:54:37.9394211Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30] 2026-10-24T20:54:37.9394268Z 125 │ 2026-10-24T20:54:37.9394379Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T20:54:37.9394491Z ·  ──────────┬───────── 2026-10-24T20:54:37.9394659Z · ╰── Cannot access ref value during render 2026-10-24T20:54:37.9394761Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T20:54:37.9394813Z ╰──── 2026-10-24T20:54:37.9395273Z  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-24T20:54:37.9395625Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:54:37.9395661Z 2026-10-24T20:54:37.9395805Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:54:37.9395963Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46] 2026-10-24T20:54:37.9396074Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T20:54:37.9396295Z 127 │ ╭─▶ const recorder = createLazyVoiceRecorder({ 2026-10-24T20:54:37.9396470Z 128 │ │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-24T20:54:37.9396596Z 129 │ │ onStatus: (status: RecordingStatus) => { 2026-10-24T20:54:37.9396752Z 130 │ │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-24T20:54:37.9396876Z 131 │ │ isFinished: status.isFinished, 2026-10-24T20:54:37.9397059Z 132 │ │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-24T20:54:37.9397163Z 133 │ │ error: status.error, 2026-10-24T20:54:37.9397262Z 134 │ │ url: status.url, 2026-10-24T20:54:37.9397343Z 135 │ │ }); 2026-10-24T20:54:37.9397421Z 136 │ │ }, 2026-10-24T20:54:37.9397619Z 137 │ │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-24T20:54:37.9397728Z 138 │ │ selectInput: (inputs) => { 2026-10-24T20:54:37.9397884Z 139 │ │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-24T20:54:37.9398037Z 140 │ │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-24T20:54:37.9398207Z 141 │ │ const known = microphoneOrder(preferences.value.microphones); 2026-10-24T20:54:37.9398349Z 142 │ │ const order = rememberMicrophones(known, inputs); 2026-10-24T20:54:37.9398451Z 143 │ │ if (order !== known) { 2026-10-24T20:54:37.9398636Z 144 │ │ registry.set(updateMobilePreferencesAtom, { 2026-10-24T20:54:37.9398752Z 145 │ │ transform: (current) => ({ 2026-10-24T20:54:37.9398957Z 146 │ │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-24T20:54:37.9399042Z 147 │ │ }), 2026-10-24T20:54:37.9399125Z 148 │ │ }); 2026-10-24T20:54:37.9399210Z 149 │ │ } 2026-10-24T20:54:37.9399354Z 150 │ │ return preferredMicrophoneInput(inputs, order); 2026-10-24T20:54:37.9399431Z 151 │ │ }, 2026-10-24T20:54:37.9399563Z 152 │ ├─▶ }); 2026-10-24T20:54:37.9399802Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T20:54:37.9399889Z 153 │ recorderRef.current = recorder; 2026-10-24T20:54:37.9399942Z ╰──── 2026-10-24T20:54:37.9400482Z  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-24T20:54:37.9400814Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:54:37.9400816Z 2026-10-24T20:54:37.9400961Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:54:37.9401120Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16] 2026-10-24T20:54:37.9401177Z 152 │ }); 2026-10-24T20:54:37.9401259Z 153 │ recorderRef.current = recorder; 2026-10-24T20:54:37.9401374Z ·  ─────┬─────────┬─── 2026-10-24T20:54:37.9401559Z · │ ╰── Cannot update ref value during render 2026-10-24T20:54:37.9401676Z · ╰── This value is a ref 2026-10-24T20:54:37.9401788Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T20:54:37.9401844Z ╰──── 2026-10-24T20:54:37.9402307Z  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-24T20:54:37.9402599Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:54:37.9402602Z 2026-10-24T20:54:37.9402745Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:54:37.9402904Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48] 2026-10-24T20:54:37.9402992Z 153 │ recorderRef.current = recorder; 2026-10-24T20:54:37.9403192Z 154 │ ╭─▶ sessionRef.current = new VoiceInputSession({ 2026-10-24T20:54:37.9403279Z 155 │ │ recorder, 2026-10-24T20:54:37.9403410Z 156 │ │ getTranscriber: getLocalVoiceTranscriber, 2026-10-24T20:54:37.9403528Z 157 │ │ requestPermission: async () => { 2026-10-24T20:54:37.9403694Z 158 │ │ const permission = await requestRecordingPermissionsAsync(); 2026-10-24T20:54:37.9403887Z 159 │ │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-24T20:54:37.9403963Z 160 │ │ }, 2026-10-24T20:54:37.9404108Z 161 │ │ configureRecording: configureVoiceRecordingAudio, 2026-10-24T20:54:37.9404253Z 162 │ │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-24T20:54:37.9404393Z 163 │ │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-24T20:54:37.9404506Z 164 │ │ onStateChange: (nextState) => 2026-10-24T20:54:37.9404598Z 165 │ │ setState({ 2026-10-24T20:54:37.9404699Z 166 │ │ state: nextState, 2026-10-24T20:54:37.9404837Z 167 │ │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-24T20:54:37.9404965Z 168 │ │ label: sessionRef.current?.label ?? null, 2026-10-24T20:54:37.9405046Z 169 │ │ }), 2026-10-24T20:54:37.9405176Z 170 │ ├─▶ }); 2026-10-24T20:54:37.9405432Z · ╰──── Cannot access ref value during render 2026-10-24T20:54:37.9405518Z 171 │ } 2026-10-24T20:54:37.9405571Z ╰──── 2026-10-24T20:54:37.9406035Z  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-24T20:54:37.9406348Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:54:37.9406351Z 2026-10-24T20:54:37.9406496Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:54:37.9406654Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15] 2026-10-24T20:54:37.9406742Z 153 │ recorderRef.current = recorder; 2026-10-24T20:54:37.9406847Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T20:54:37.9406960Z ·  ─────┬────────┬─── 2026-10-24T20:54:37.9407142Z · │ ╰── Cannot update ref value during render 2026-10-24T20:54:37.9407258Z · ╰── This value is a ref 2026-10-24T20:54:37.9407323Z 155 │ recorder, 2026-10-24T20:54:37.9407376Z ╰──── 2026-10-24T20:54:37.9407836Z  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-24T20:54:37.9408131Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:54:37.9408137Z 2026-10-24T20:54:37.9408281Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:54:37.9408438Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7] 2026-10-24T20:54:37.9408526Z 184 │ return () => subscription.remove(); 2026-10-24T20:54:37.9408592Z 185 │ }, [controller]); 2026-10-24T20:54:37.9408669Z ·  ─────┬──── 2026-10-24T20:54:37.9408815Z · ╰── Cannot access ref value during render 2026-10-24T20:54:37.9408867Z 186 │ 2026-10-24T20:54:37.9408921Z ╰──── 2026-10-24T20:54:37.9409393Z  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-24T20:54:37.9409686Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:54:37.9409688Z 2026-10-24T20:54:37.9409835Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:54:37.9409991Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6] 2026-10-24T20:54:37.9410078Z 184 │ return () => subscription.remove(); 2026-10-24T20:54:37.9410144Z 185 │ }, [controller]); 2026-10-24T20:54:37.9410221Z ·  ──────┬───── 2026-10-24T20:54:37.9410364Z · ╰── Cannot access ref value during render 2026-10-24T20:54:37.9410418Z 186 │ 2026-10-24T20:54:37.9410530Z ╰──── 2026-10-24T20:54:37.9411023Z  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-24T20:54:37.9411311Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:54:37.9411315Z 2026-10-24T20:54:37.9411457Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:54:37.9411613Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6] 2026-10-24T20:54:37.9411671Z 191 │ }, 2026-10-24T20:54:37.9411743Z 192 │ [controller, recorder], 2026-10-24T20:54:37.9411825Z ·  ─────┬──── 2026-10-24T20:54:37.9411971Z · ╰── Cannot access ref value during render 2026-10-24T20:54:37.9412026Z 193 │ ); 2026-10-24T20:54:37.9412078Z ╰──── 2026-10-24T20:54:37.9412539Z  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-24T20:54:37.9412829Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:54:37.9412831Z 2026-10-24T20:54:37.9412974Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:54:37.9413136Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20] 2026-10-24T20:54:37.9413229Z 174 │ const controller = session.controller; 2026-10-24T20:54:37.9413317Z 175 │ const recorder = recorderRef.current; 2026-10-24T20:54:37.9413422Z ·  ─────────┬───────── 2026-10-24T20:54:37.9413581Z · ╰── Cannot access ref value during render 2026-10-24T20:54:37.9413634Z 176 │ 2026-10-24T20:54:37.9413686Z ╰──── 2026-10-24T20:54:37.9414146Z  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-24T20:54:37.9414439Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:54:37.9414445Z 2026-10-24T20:54:37.9414589Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:54:37.9414745Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5] 2026-10-24T20:54:37.9414802Z 191 │ }, 2026-10-24T20:54:37.9414874Z 192 │ [controller, recorder], 2026-10-24T20:54:37.9414964Z ·  ───────────┬────────── 2026-10-24T20:54:37.9415111Z · ╰── Cannot access ref value during render 2026-10-24T20:54:37.9415166Z 193 │ ); 2026-10-24T20:54:37.9415218Z ╰──── 2026-10-24T20:54:37.9415736Z  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-24T20:54:37.9416060Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:54:37.9416064Z 2026-10-24T20:54:37.9416238Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:54:37.9416398Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20] 2026-10-24T20:54:37.9416491Z 245 │ return () => clearInterval(intervalId); 2026-10-24T20:54:37.9416604Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-24T20:54:37.9416692Z ·  ─────┬──── 2026-10-24T20:54:37.9416848Z · ╰── Cannot access ref value during render 2026-10-24T20:54:37.9416901Z 247 │ 2026-10-24T20:54:37.9416953Z ╰──── 2026-10-24T20:54:37.9417417Z  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-24T20:54:37.9417712Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:54:37.9417714Z 2026-10-24T20:54:37.9417858Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:54:37.9418015Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6] 2026-10-24T20:54:37.9418106Z 245 │ return () => clearInterval(intervalId); 2026-10-24T20:54:37.9418215Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-24T20:54:37.9418348Z ·  ────────────────────────┬─────────────────────── 2026-10-24T20:54:37.9418509Z · ╰── Cannot access ref value during render 2026-10-24T20:54:37.9418562Z 247 │ 2026-10-24T20:54:37.9418613Z ╰──── 2026-10-24T20:54:37.9419078Z  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-24T20:54:37.9419366Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:54:37.9419369Z 2026-10-24T20:54:37.9419513Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:54:37.9419728Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5] 2026-10-24T20:54:37.9419824Z 260 │ setOwnerFocused, 2026-10-24T20:54:37.9419887Z 261 │ session, 2026-10-24T20:54:37.9419959Z ·  ───┬─── 2026-10-24T20:54:37.9420097Z · ╰── Cannot access ref value during render 2026-10-24T20:54:37.9420157Z 262 │ stop, 2026-10-24T20:54:37.9420210Z ╰──── 2026-10-24T20:54:37.9420671Z  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-24T20:54:37.9420965Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:54:37.9420971Z 2026-10-24T20:54:37.9421113Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:54:37.9421271Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10] 2026-10-24T20:54:37.9421326Z 250 │ 2026-10-24T20:54:37.9421466Z 251 │ ╭─▶ return { 2026-10-24T20:54:37.9421676Z 252 │ │ isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null, 2026-10-24T20:54:37.9421757Z 253 │ │ state, 2026-10-24T20:54:37.9421845Z 254 │ │ audioLevels, 2026-10-24T20:54:37.9421939Z 255 │ │ elapsedSeconds, 2026-10-24T20:54:37.9422068Z 256 │ │ isBusy: voiceInputBlocksSubmission(state), 2026-10-24T20:54:37.9422157Z 257 │ │ ownerKey, 2026-10-24T20:54:37.9422239Z 258 │ │ label, 2026-10-24T20:54:37.9422331Z 259 │ │ focusedOwners, 2026-10-24T20:54:37.9422425Z 260 │ │ setOwnerFocused, 2026-10-24T20:54:37.9422508Z 261 │ │ session, 2026-10-24T20:54:37.9422586Z 262 │ │ stop, 2026-10-24T20:54:37.9422665Z 263 │ │ cancel, 2026-10-24T20:54:37.9422793Z 264 │ ├─▶ }; 2026-10-24T20:54:37.9422991Z · ╰──── Cannot access ref value during render 2026-10-24T20:54:37.9423047Z 265 │ } 2026-10-24T20:54:37.9423099Z ╰──── 2026-10-24T20:54:37.9423568Z  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-24T20:54:37.9423863Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:54:37.9423865Z 2026-10-24T20:54:37.9424024Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:54:37.9424183Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-24T20:54:37.9424345Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-24T20:54:37.9424469Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-24T20:54:37.9424602Z ·  ─────┬───── 2026-10-24T20:54:37.9424767Z · ╰── `audioLevels` originates here 2026-10-24T20:54:37.9424888Z 123 │ const sessionRef = useRef(null); 2026-10-24T20:54:37.9425035Z 124 │ const recorderRef = useRef | null>(null); 2026-10-24T20:54:37.9425088Z 125 │ 2026-10-24T20:54:37.9425196Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T20:54:37.9425296Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T20:54:37.9425435Z 128 │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-24T20:54:37.9425530Z 129 │ onStatus: (status: RecordingStatus) => { 2026-10-24T20:54:37.9425651Z 130 │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-24T20:54:37.9425738Z 131 │ isFinished: status.isFinished, 2026-10-24T20:54:37.9425887Z 132 │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-24T20:54:37.9425964Z 133 │ error: status.error, 2026-10-24T20:54:37.9426033Z 134 │ url: status.url, 2026-10-24T20:54:37.9426094Z 135 │ }); 2026-10-24T20:54:37.9426150Z 136 │ }, 2026-10-24T20:54:37.9426341Z 137 │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-24T20:54:37.9426420Z 138 │ selectInput: (inputs) => { 2026-10-24T20:54:37.9426544Z 139 │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-24T20:54:37.9426657Z 140 │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-24T20:54:37.9426791Z 141 │ const known = microphoneOrder(preferences.value.microphones); 2026-10-24T20:54:37.9426899Z 142 │ const order = rememberMicrophones(known, inputs); 2026-10-24T20:54:37.9426980Z 143 │ if (order !== known) { 2026-10-24T20:54:37.9427089Z 144 │ registry.set(updateMobilePreferencesAtom, { 2026-10-24T20:54:37.9427173Z 145 │ transform: (current) => ({ 2026-10-24T20:54:37.9427348Z 146 │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-24T20:54:37.9427411Z 147 │ }), 2026-10-24T20:54:37.9427471Z 148 │ }); 2026-10-24T20:54:37.9427530Z 149 │ } 2026-10-24T20:54:37.9427639Z 150 │ return preferredMicrophoneInput(inputs, order); 2026-10-24T20:54:37.9427696Z 151 │ }, 2026-10-24T20:54:37.9427753Z 152 │ }); 2026-10-24T20:54:37.9427836Z 153 │ recorderRef.current = recorder; 2026-10-24T20:54:37.9427937Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T20:54:37.9427997Z 155 │ recorder, 2026-10-24T20:54:37.9428104Z 156 │ getTranscriber: getLocalVoiceTranscriber, 2026-10-24T20:54:37.9428193Z 157 │ requestPermission: async () => { 2026-10-24T20:54:37.9428324Z 158 │ const permission = await requestRecordingPermissionsAsync(); 2026-10-24T20:54:37.9428480Z 159 │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-24T20:54:37.9428538Z 160 │ }, 2026-10-24T20:54:37.9428650Z 161 │ configureRecording: configureVoiceRecordingAudio, 2026-10-24T20:54:37.9428758Z 162 │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-24T20:54:37.9428861Z 163 │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-24T20:54:37.9428942Z 164 │ onStateChange: (nextState) => 2026-10-24T20:54:37.9429006Z 165 │ setState({ 2026-10-24T20:54:37.9429077Z 166 │ state: nextState, 2026-10-24T20:54:37.9429240Z 167 │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-24T20:54:37.9429370Z 168 │ label: sessionRef.current?.label ?? null, 2026-10-24T20:54:37.9429430Z 169 │ }), 2026-10-24T20:54:37.9429486Z 170 │ }); 2026-10-24T20:54:37.9429540Z 171 │ } 2026-10-24T20:54:37.9429593Z 172 │ 2026-10-24T20:54:37.9429678Z 173 │ const session = sessionRef.current; 2026-10-24T20:54:37.9429767Z 174 │ const controller = session.controller; 2026-10-24T20:54:37.9429855Z 175 │ const recorder = recorderRef.current; 2026-10-24T20:54:37.9429908Z 176 │ 2026-10-24T20:54:37.9429975Z 177 │ useEffect(() => { 2026-10-24T20:54:37.9430126Z 178 │ const subscription = AppState.addEventListener("change", (nextState) => { 2026-10-24T20:54:37.9430267Z 179 │ // iOS reports `inactive` while its permission dialog is open. Only the 2026-10-24T20:54:37.9430410Z 180 │ // real background state cancels preparation; recorder status handles 2026-10-24T20:54:37.9430516Z 181 │ // calls and route interruptions during capture. 2026-10-24T20:54:37.9430651Z 182 │ if (nextState === "background") controller.appMovedToBackground(); 2026-10-24T20:54:37.9430708Z 183 │ }); 2026-10-24T20:54:37.9430793Z 184 │ return () => subscription.remove(); 2026-10-24T20:54:37.9430860Z 185 │ }, [controller]); 2026-10-24T20:54:37.9430912Z 186 │ 2026-10-24T20:54:37.9430973Z 187 │ useEffect( 2026-10-24T20:54:37.9431038Z 188 │ () => () => { 2026-10-24T20:54:37.9431113Z 189 │ controller.dispose(); 2026-10-24T20:54:37.9431181Z 190 │ recorder.release(); 2026-10-24T20:54:37.9431237Z 191 │ }, 2026-10-24T20:54:37.9431307Z 192 │ [controller, recorder], 2026-10-24T20:54:37.9431361Z 193 │ ); 2026-10-24T20:54:37.9431413Z 194 │ 2026-10-24T20:54:37.9431478Z 195 │ useEffect(() => { 2026-10-24T20:54:37.9431577Z 196 │ if (state.phase !== "recording") return; 2026-10-24T20:54:37.9431631Z 197 │ 2026-10-24T20:54:37.9431780Z 198 │ const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`; 2026-10-24T20:54:37.9431886Z 199 │ const activation = activateKeepAwakeAsync(tag); 2026-10-24T20:54:37.9431968Z 200 │ void activation.catch(() => {}); 2026-10-24T20:54:37.9432030Z 201 │ return () => { 2026-10-24T20:54:37.9432182Z 202 │ // Release after activation settles, even if the recording ends immediately. 2026-10-24T20:54:37.9432322Z 203 │ void activation.then(() => deactivateKeepAwake(tag)).catch(() => {}); 2026-10-24T20:54:37.9432378Z 204 │ }; 2026-10-24T20:54:37.9432457Z 205 │ }, [keepAwakeId, state.phase]); 2026-10-24T20:54:37.9432510Z 206 │ 2026-10-24T20:54:37.9432575Z 207 │ useEffect(() => { 2026-10-24T20:54:37.9432716Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-24T20:54:37.9432769Z 209 │ 2026-10-24T20:54:37.9432891Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-24T20:54:37.9433048Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-24T20:54:37.9433152Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-24T20:54:37.9433229Z ·  ─────┬───── 2026-10-24T20:54:37.9433371Z · ╰── `audioLevels` cannot be modified 2026-10-24T20:54:37.9433427Z 213 │ } 2026-10-24T20:54:37.9433482Z ╰──── 2026-10-24T20:54:37.9433749Z  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-24T20:54:37.9434131Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:54:37.9434164Z 2026-10-24T20:54:37.9434366Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T20:54:37.9434527Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-24T20:54:37.9434581Z 206 │ 2026-10-24T20:54:37.9434645Z 207 │ useEffect(() => { 2026-10-24T20:54:37.9434726Z ·  ───┬─── 2026-10-24T20:54:37.9434944Z · ╰── This function may (indirectly) reassign or modify `audioLevels` after render 2026-10-24T20:54:37.9435081Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-24T20:54:37.9435133Z 209 │ 2026-10-24T20:54:37.9435261Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-24T20:54:37.9435419Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-24T20:54:37.9435521Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-24T20:54:37.9435598Z ·  ─────┬───── 2026-10-24T20:54:37.9435732Z · ╰── This modifies `audioLevels` 2026-10-24T20:54:37.9435788Z 213 │ } 2026-10-24T20:54:37.9435840Z ╰──── 2026-10-24T20:54:37.9436209Z  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-24T20:54:37.9436518Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:54:37.9436525Z 2026-10-24T20:54:37.9436612Z Found 0 errors and 367 warnings in 5479 files (5.5s, 8 threads) 2026-10-24T20:54:37.9921872Z Post job cleanup. 2026-10-24T20:54:38.0580457Z Cache hit occurred on the primary key electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309, not saving cache. 2026-10-24T20:54:38.0654671Z Post job cleanup. 2026-10-24T20:54:38.0667851Z ##[start-action display=Cache full pnpm store;id=__2b1212e6-0049-4482-8ef5-f0f54f446c17.__actions_cache] 2026-10-24T20:54:38.1353651Z Post job cleanup. 2026-10-24T20:54:38.2007044Z Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-bab31c3827e90e1352d302da4c761fd1b91963ae565f5f0ea70972d0942af1f6, not saving cache. 2026-10-24T20:54:38.2047323Z ##[end-action id=__2b1212e6-0049-4482-8ef5-f0f54f446c17.__actions_cache;outcome=success;conclusion=success;duration_ms=137] 2026-10-24T20:54:38.2049240Z ##[start-action display=Cache Vite+;id=__2b1212e6-0049-4482-8ef5-f0f54f446c17.vp_cache] 2026-10-24T20:54:38.2070760Z Post job cleanup. 2026-10-24T20:54:38.2733285Z 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-24T20:54:38.2774994Z ##[end-action id=__2b1212e6-0049-4482-8ef5-f0f54f446c17.vp_cache;outcome=success;conclusion=success;duration_ms=72] 2026-10-24T20:54:38.2845665Z Post job cleanup. 2026-10-24T20:54:38.3310948Z [command]/usr/local/bin/git version 2026-10-24T20:54:38.3342436Z git version 2.55.0 2026-10-24T20:54:38.3360429Z Temporarily overriding HOME='/home/runner/_work/_temp/4e863490-39d0-40fe-bab8-8ead509c21e2' before making global git config changes 2026-10-24T20:54:38.3360794Z Adding repository directory to the temporary git global config as a safe directory 2026-10-24T20:54:38.3363459Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-24T20:54:38.3386888Z Removing SSH command configuration 2026-10-24T20:54:38.3389895Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-24T20:54:38.3416375Z [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-24T20:54:38.3547135Z fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules 2026-10-24T20:54:38.3574434Z ##[warning]The process '/usr/local/bin/git' failed with exit code 128 2026-10-24T20:54:38.3620880Z A job completed hook has been configured by the self-hosted runner administrator 2026-10-24T20:54:38.3646381Z ##[group]Run '/job_completed.sh' 2026-10-24T20:54:38.3658967Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T20:54:38.3659139Z env: 2026-10-24T20:54:38.3659257Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 160 2026-10-24T20:54:38.3659410Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 347 2026-10-24T20:54:38.3659556Z BLACKSMITH_CHECK_RUN_ID: 120984969685 2026-10-24T20:54:38.3659700Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-24T20:54:38.3659857Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-24T20:54:38.3659996Z ##[endgroup] 2026-10-24T20:54:38.3746051Z Docker container cache not activated, skipping hash computation. 2026-10-24T20:54:38.4066516Z No active SSH sessions detected. Proceeding with shutdown immediately. 2026-10-24T20:54:38.4107533Z Cleaning up orphan processes