2026-10-24T12:44:07.5069344Z Current runner version: '2.338.1' 2026-10-24T12:44:07.5075036Z Runner name: 'blacksmith-8vcpu-ubuntu-2404-wnjqww3hbaveksc6' 2026-10-24T12:44:07.5076156Z Runner group name: 'blacksmith scale sets - blacksmith-8vcpu-ubuntu-2404' 2026-10-24T12:44:07.5077682Z Machine name: 'ip-172-31-73-130' 2026-10-24T12:44:07.5080244Z ##[group]GITHUB_TOKEN Permissions 2026-10-24T12:44:07.5082242Z Contents: read 2026-10-24T12:44:07.5082895Z Metadata: read 2026-10-24T12:44:07.5083492Z ##[endgroup] 2026-10-24T12:44:07.5085679Z Secret source: Actions 2026-10-24T12:44:07.5086746Z Cache mode: write 2026-10-24T12:44:07.5087608Z Prepare workflow directory 2026-10-24T12:44:07.5309763Z Prepare all required actions 2026-10-24T12:44:07.5338841Z Getting action download info 2026-10-24T12:44:07.6646143Z Download action repository 'actions/checkout@v6' (SHA:d23441a48e516b6c34aea4fa41551a30e30af803) 2026-10-24T12:44:07.7060744Z Download action repository 'actions/cache@v6' (SHA:55cc8345863c7cc4c66a329aec7e433d2d1c52a9) 2026-10-24T12:44:07.8240964Z Setting BLACKSMITH_ACTIONS_RESULTS_URL to https://results-receiver.actions.githubusercontent.com/ 2026-10-24T12:44:07.8283482Z Complete job name: Lint 2026-10-24T12:44:07.8683748Z A job started hook has been configured by the self-hosted runner administrator 2026-10-24T12:44:07.8761612Z ##[group]Run '/setup.sh' 2026-10-24T12:44:07.8774489Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T12:44:07.8774922Z env: 2026-10-24T12:44:07.8775165Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 147 2026-10-24T12:44:07.8775475Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 453 2026-10-24T12:44:07.8775772Z BLACKSMITH_CHECK_RUN_ID: 120875719752 2026-10-24T12:44:07.8776068Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-24T12:44:07.8776358Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-24T12:44:07.8776631Z ##[endgroup] 2026-10-24T12:44:07.9035080Z Logging daemon started (blacksmithd for logs) 2026-10-24T12:44:07.9172386Z Results daemon started (blacksmithd for results) 2026-10-24T12:44:07.9323372Z Background adoption and SSH setup started (PID: 3165) 2026-10-24T12:44:07.9324640Z 2026-10-24T12:44:07.9325210Z ---------------------------------------- 2026-10-24T12:44:07.9325916Z View this job: https://app.blacksmith.sh/pingdotgg/runs/40095150909/jobs/120875719752 2026-10-24T12:44:07.9326568Z SSH Access (using your GitHub SSH key): 2026-10-24T12:44:07.9327202Z ssh -p 64004 runner@blacksmith-8vcpu-ubuntu-2404-wnjqww3hbaveksc6.vm.blacksmith.sh 2026-10-24T12:44:07.9327674Z 2026-10-24T12:44:07.9327834Z No GitHub SSH key? Add one at: 2026-10-24T12:44:07.9328626Z https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account 2026-10-24T12:44:07.9329245Z 2026-10-24T12:44:07.9329406Z ---------------------------------------- 2026-10-24T12:44:07.9329675Z 2026-10-24T12:44:07.9329880Z VM ID: blacksmith-8vcpu-ubuntu-2404-wnjqww3hbaveksc6 2026-10-24T12:44:07.9330372Z Host: production-152.236.46.246-x8664 2026-10-24T12:44:07.9330778Z Host Agent PID: 1011341 2026-10-24T12:44:07.9331143Z Host Agent Git SHA: 1637818df 2026-10-24T12:44:07.9331530Z Host CPU Manufacturer: AuthenticAMD 2026-10-24T12:44:07.9331948Z Blacksmith Host Generation: gen 2 2026-10-24T12:44:07.9332369Z Petname: production-next-serval-34fff059 2026-10-24T12:44:07.9332792Z Region: us-east 2026-10-24T12:44:07.9333144Z Rootfs Version: ubuntu24-full-x64-081926 2026-10-24T12:44:07.9335407Z OS Version: Ubuntu 24.04.4 LTS 2026-10-24T12:44:07.9335959Z 2026-10-24T12:44:07.9336128Z Enabling Blacksmith transparent cache 2026-10-24T12:44:07.9650932Z ##[group]Run actions/checkout@v6 2026-10-24T12:44:07.9651432Z with: 2026-10-24T12:44:07.9651992Z sparse-checkout: /* !/.repos/ !/apps/mobile/modules/t3-terminal/Vendor/**/*.a 2026-10-24T12:44:07.9652651Z sparse-checkout-cone-mode: false 2026-10-24T12:44:07.9653109Z repository: pingdotgg/t3code 2026-10-24T12:44:07.9655999Z token: *** 2026-10-24T12:44:07.9656320Z ssh-strict: true 2026-10-24T12:44:07.9656649Z ssh-user: git 2026-10-24T12:44:07.9656998Z persist-credentials: true 2026-10-24T12:44:07.9657800Z clean: true 2026-10-24T12:44:07.9658186Z fetch-depth: 1 2026-10-24T12:44:07.9658519Z fetch-tags: false 2026-10-24T12:44:07.9658852Z show-progress: true 2026-10-24T12:44:07.9659186Z lfs: false 2026-10-24T12:44:07.9659542Z submodules: false 2026-10-24T12:44:07.9659886Z set-safe-directory: true 2026-10-24T12:44:07.9660285Z allow-unsafe-pr-checkout: false 2026-10-24T12:44:07.9660688Z env: 2026-10-24T12:44:07.9661055Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 147 2026-10-24T12:44:07.9661495Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 453 2026-10-24T12:44:07.9661939Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T12:44:07.9662364Z ##[endgroup] 2026-10-24T12:44:08.0990471Z Syncing repository: pingdotgg/t3code 2026-10-24T12:44:08.0992041Z ##[group]Getting Git version info 2026-10-24T12:44:08.0992622Z Working directory is '/home/runner/_work/t3code/t3code' 2026-10-24T12:44:08.0993477Z [command]/usr/local/bin/git version 2026-10-24T12:44:08.1042615Z git version 2.55.0 2026-10-24T12:44:08.1055946Z ##[endgroup] 2026-10-24T12:44:08.1064468Z Temporarily overriding HOME='/home/runner/_work/_temp/dcb18adc-81bf-4be8-8f13-facb1949d4ac' before making global git config changes 2026-10-24T12:44:08.1065139Z Adding repository directory to the temporary git global config as a safe directory 2026-10-24T12:44:08.1068734Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-24T12:44:08.1101506Z Deleting the contents of '/home/runner/_work/t3code/t3code' 2026-10-24T12:44:08.1103348Z ##[group]Determining repository object format 2026-10-24T12:44:08.1104493Z ##[endgroup] 2026-10-24T12:44:08.1104867Z ##[group]Initializing the repository 2026-10-24T12:44:08.1106863Z [command]/usr/local/bin/git init /home/runner/_work/t3code/t3code 2026-10-24T12:44:08.1141836Z hint: Using 'master' as the name for the initial branch. This default branch name 2026-10-24T12:44:08.1142368Z hint: will change to "main" in Git 3.0. To configure the initial branch name 2026-10-24T12:44:08.1142865Z hint: to use in all of your new repositories, which will suppress this warning, 2026-10-24T12:44:08.1143238Z hint: call: 2026-10-24T12:44:08.1143474Z hint: 2026-10-24T12:44:08.1143762Z hint: git config --global init.defaultBranch 2026-10-24T12:44:08.1144080Z hint: 2026-10-24T12:44:08.1144383Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and 2026-10-24T12:44:08.1144844Z hint: 'development'. The just-created branch can be renamed via this command: 2026-10-24T12:44:08.1145222Z hint: 2026-10-24T12:44:08.1145437Z hint: git branch -m 2026-10-24T12:44:08.1145683Z hint: 2026-10-24T12:44:08.1146001Z hint: Disable this message with "git config set advice.defaultBranchName false" 2026-10-24T12:44:08.1146481Z Initialized empty Git repository in /home/runner/_work/t3code/t3code/.git/ 2026-10-24T12:44:08.1148024Z [command]/usr/local/bin/git remote add origin https://github.com/pingdotgg/t3code 2026-10-24T12:44:08.1178767Z ##[endgroup] 2026-10-24T12:44:08.1179177Z ##[group]Disabling automatic garbage collection 2026-10-24T12:44:08.1181441Z [command]/usr/local/bin/git config --local gc.auto 0 2026-10-24T12:44:08.1206430Z ##[endgroup] 2026-10-24T12:44:08.1206825Z ##[group]Setting up auth 2026-10-24T12:44:08.1207109Z Removing SSH command configuration 2026-10-24T12:44:08.1210812Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-24T12:44:08.1235703Z [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-24T12:44:08.1375639Z Removing HTTP extra header 2026-10-24T12:44:08.1379891Z [command]/usr/local/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader 2026-10-24T12:44:08.1405758Z [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-24T12:44:08.1514869Z Removing includeIf entries pointing to credentials config files 2026-10-24T12:44:08.1518204Z [command]/usr/local/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: 2026-10-24T12:44:08.1541581Z [command]/usr/local/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url 2026-10-24T12:44:08.1649423Z [command]/usr/local/bin/git config --file /home/runner/_work/_temp/git-credentials-2cd12b7b-a9f7-40ae-8046-c4890875e455.config http.https://github.com/.extraheader AUTHORIZATION: basic *** 2026-10-24T12:44:08.1675844Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git.path /home/runner/_work/_temp/git-credentials-2cd12b7b-a9f7-40ae-8046-c4890875e455.config 2026-10-24T12:44:08.1699750Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git/worktrees/*.path /home/runner/_work/_temp/git-credentials-2cd12b7b-a9f7-40ae-8046-c4890875e455.config 2026-10-24T12:44:08.1720676Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-2cd12b7b-a9f7-40ae-8046-c4890875e455.config 2026-10-24T12:44:08.1741233Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-2cd12b7b-a9f7-40ae-8046-c4890875e455.config 2026-10-24T12:44:08.1759543Z ##[endgroup] 2026-10-24T12:44:08.1759916Z ##[group]Fetching the repository 2026-10-24T12:44:08.1764239Z [command]/usr/local/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --filter=blob:none --depth=1 origin +473df35a66cb7d9eacac05268bdea6652afc4cd9:refs/remotes/pull/22877/merge 2026-10-24T12:44:08.4552440Z From https://github.com/pingdotgg/t3code 2026-10-24T12:44:08.4553626Z * [new ref] 473df35a66cb7d9eacac05268bdea6652afc4cd9 -> pull/22877/merge 2026-10-24T12:44:08.4576292Z ##[endgroup] 2026-10-24T12:44:08.4577075Z ##[group]Determining the checkout info 2026-10-24T12:44:08.4577967Z ##[endgroup] 2026-10-24T12:44:08.4578740Z ##[group]Setting up sparse checkout 2026-10-24T12:44:08.4580910Z [command]/usr/local/bin/git config core.sparseCheckout true 2026-10-24T12:44:08.4607826Z [command]/usr/local/bin/git rev-parse --git-path info/sparse-checkout 2026-10-24T12:44:08.4624871Z .git/info/sparse-checkout 2026-10-24T12:44:08.4629541Z ##[endgroup] 2026-10-24T12:44:08.4630519Z ##[group]Checking out the ref 2026-10-24T12:44:08.4632402Z [command]/usr/local/bin/git checkout --progress --force refs/remotes/pull/22877/merge 2026-10-24T12:44:14.9189297Z Updating files: 0% (1/6401) 2026-10-24T12:44:14.9220788Z Updating files: 1% (65/6401) 2026-10-24T12:44:14.9239570Z Updating files: 2% (129/6401) 2026-10-24T12:44:14.9263079Z Updating files: 3% (193/6401) 2026-10-24T12:44:14.9286112Z Updating files: 4% (257/6401) 2026-10-24T12:44:14.9319630Z Updating files: 5% (321/6401) 2026-10-24T12:44:14.9343359Z Updating files: 6% (385/6401) 2026-10-24T12:44:14.9402881Z Updating files: 7% (449/6401) 2026-10-24T12:44:14.9434713Z Updating files: 8% (513/6401) 2026-10-24T12:44:14.9459160Z Updating files: 9% (577/6401) 2026-10-24T12:44:14.9769570Z Updating files: 10% (641/6401) 2026-10-24T12:44:14.9787152Z Updating files: 11% (705/6401) 2026-10-24T12:44:14.9798608Z Updating files: 12% (769/6401) 2026-10-24T12:44:14.9815838Z Updating files: 13% (833/6401) 2026-10-24T12:44:14.9833839Z Updating files: 14% (897/6401) 2026-10-24T12:44:14.9853214Z Updating files: 15% (961/6401) 2026-10-24T12:44:14.9874018Z Updating files: 16% (1025/6401) 2026-10-24T12:44:14.9890406Z Updating files: 17% (1089/6401) 2026-10-24T12:44:14.9910560Z Updating files: 18% (1153/6401) 2026-10-24T12:44:14.9926883Z Updating files: 19% (1217/6401) 2026-10-24T12:44:14.9953185Z Updating files: 20% (1281/6401) 2026-10-24T12:44:14.9971045Z Updating files: 21% (1345/6401) 2026-10-24T12:44:14.9992650Z Updating files: 22% (1409/6401) 2026-10-24T12:44:15.0007294Z Updating files: 23% (1473/6401) 2026-10-24T12:44:15.0022010Z Updating files: 24% (1537/6401) 2026-10-24T12:44:15.0039584Z Updating files: 25% (1601/6401) 2026-10-24T12:44:15.0054574Z Updating files: 26% (1665/6401) 2026-10-24T12:44:15.0069477Z Updating files: 27% (1729/6401) 2026-10-24T12:44:15.0090861Z Updating files: 28% (1793/6401) 2026-10-24T12:44:15.0127564Z Updating files: 29% (1857/6401) 2026-10-24T12:44:15.0151014Z Updating files: 30% (1921/6401) 2026-10-24T12:44:15.0178228Z Updating files: 31% (1985/6401) 2026-10-24T12:44:15.0209781Z Updating files: 32% (2049/6401) 2026-10-24T12:44:15.0240933Z Updating files: 33% (2113/6401) 2026-10-24T12:44:15.0317767Z Updating files: 34% (2177/6401) 2026-10-24T12:44:15.0379871Z Updating files: 35% (2241/6401) 2026-10-24T12:44:15.0418814Z Updating files: 36% (2305/6401) 2026-10-24T12:44:15.0455850Z Updating files: 37% (2369/6401) 2026-10-24T12:44:15.0504789Z Updating files: 38% (2433/6401) 2026-10-24T12:44:15.0534298Z Updating files: 39% (2497/6401) 2026-10-24T12:44:15.0567682Z Updating files: 40% (2561/6401) 2026-10-24T12:44:15.0596449Z Updating files: 41% (2625/6401) 2026-10-24T12:44:15.0613132Z Updating files: 42% (2689/6401) 2026-10-24T12:44:15.0624587Z Updating files: 43% (2753/6401) 2026-10-24T12:44:15.0653920Z Updating files: 44% (2817/6401) 2026-10-24T12:44:15.0684404Z Updating files: 45% (2881/6401) 2026-10-24T12:44:15.0714008Z Updating files: 46% (2945/6401) 2026-10-24T12:44:15.0742876Z Updating files: 47% (3009/6401) 2026-10-24T12:44:15.0774787Z Updating files: 48% (3073/6401) 2026-10-24T12:44:15.0816419Z Updating files: 49% (3137/6401) 2026-10-24T12:44:15.0848276Z Updating files: 50% (3201/6401) 2026-10-24T12:44:15.0864892Z Updating files: 51% (3265/6401) 2026-10-24T12:44:15.0904349Z Updating files: 52% (3329/6401) 2026-10-24T12:44:15.0935649Z Updating files: 53% (3393/6401) 2026-10-24T12:44:15.0957346Z Updating files: 54% (3457/6401) 2026-10-24T12:44:15.0982671Z Updating files: 55% (3521/6401) 2026-10-24T12:44:15.0999623Z Updating files: 56% (3585/6401) 2026-10-24T12:44:15.1020947Z Updating files: 57% (3649/6401) 2026-10-24T12:44:15.1041043Z Updating files: 58% (3713/6401) 2026-10-24T12:44:15.1445917Z Updating files: 59% (3777/6401) 2026-10-24T12:44:15.1461129Z Updating files: 60% (3841/6401) 2026-10-24T12:44:15.1484194Z Updating files: 61% (3905/6401) 2026-10-24T12:44:15.1504395Z Updating files: 62% (3969/6401) 2026-10-24T12:44:15.1529003Z Updating files: 63% (4033/6401) 2026-10-24T12:44:15.1558706Z Updating files: 64% (4097/6401) 2026-10-24T12:44:15.1580428Z Updating files: 65% (4161/6401) 2026-10-24T12:44:15.1599510Z Updating files: 66% (4225/6401) 2026-10-24T12:44:15.1624982Z Updating files: 67% (4289/6401) 2026-10-24T12:44:15.1641755Z Updating files: 68% (4353/6401) 2026-10-24T12:44:15.1661646Z Updating files: 69% (4417/6401) 2026-10-24T12:44:15.1676346Z Updating files: 70% (4481/6401) 2026-10-24T12:44:15.1696619Z Updating files: 71% (4545/6401) 2026-10-24T12:44:15.1711520Z Updating files: 72% (4609/6401) 2026-10-24T12:44:15.1762374Z Updating files: 73% (4673/6401) 2026-10-24T12:44:15.2203456Z Updating files: 74% (4737/6401) 2026-10-24T12:44:15.2228406Z Updating files: 75% (4801/6401) 2026-10-24T12:44:15.2253849Z Updating files: 76% (4865/6401) 2026-10-24T12:44:15.2280376Z Updating files: 77% (4929/6401) 2026-10-24T12:44:15.2304268Z Updating files: 78% (4993/6401) 2026-10-24T12:44:15.2322231Z Updating files: 79% (5057/6401) 2026-10-24T12:44:15.2346499Z Updating files: 80% (5121/6401) 2026-10-24T12:44:15.2363897Z Updating files: 81% (5185/6401) 2026-10-24T12:44:15.2383454Z Updating files: 82% (5249/6401) 2026-10-24T12:44:15.2408377Z Updating files: 83% (5313/6401) 2026-10-24T12:44:15.2440867Z Updating files: 84% (5377/6401) 2026-10-24T12:44:15.2460493Z Updating files: 85% (5441/6401) 2026-10-24T12:44:15.2491558Z Updating files: 86% (5505/6401) 2026-10-24T12:44:15.2570425Z Updating files: 87% (5569/6401) 2026-10-24T12:44:15.2603884Z Updating files: 88% (5633/6401) 2026-10-24T12:44:15.2626154Z Updating files: 89% (5697/6401) 2026-10-24T12:44:15.2658064Z Updating files: 90% (5761/6401) 2026-10-24T12:44:15.2691406Z Updating files: 91% (5825/6401) 2026-10-24T12:44:15.2708031Z Updating files: 92% (5889/6401) 2026-10-24T12:44:15.2732746Z Updating files: 93% (5953/6401) 2026-10-24T12:44:15.2755873Z Updating files: 94% (6017/6401) 2026-10-24T12:44:15.2782271Z Updating files: 95% (6081/6401) 2026-10-24T12:44:15.2846279Z Updating files: 96% (6145/6401) 2026-10-24T12:44:15.2871194Z Updating files: 97% (6209/6401) 2026-10-24T12:44:15.2922248Z Updating files: 98% (6273/6401) 2026-10-24T12:44:15.2944268Z Updating files: 99% (6337/6401) 2026-10-24T12:44:15.2944618Z Updating files: 100% (6401/6401) 2026-10-24T12:44:15.2944803Z Updating files: 100% (6401/6401), done. 2026-10-24T12:44:15.3111316Z Note: switching to 'refs/remotes/pull/22877/merge'. 2026-10-24T12:44:15.3111501Z 2026-10-24T12:44:15.3111659Z You are in 'detached HEAD' state. You can look around, make experimental 2026-10-24T12:44:15.3112135Z changes and commit them, and you can discard any commits you make in this 2026-10-24T12:44:15.3112378Z state without impacting any branches by switching back to a branch. 2026-10-24T12:44:15.3112518Z 2026-10-24T12:44:15.3112613Z If you want to create a new branch to retain commits you create, you may 2026-10-24T12:44:15.3112852Z do so (now or later) by using -c with the switch command. Example: 2026-10-24T12:44:15.3112984Z 2026-10-24T12:44:15.3113047Z git switch -c 2026-10-24T12:44:15.3113145Z 2026-10-24T12:44:15.3113204Z Or undo this operation with: 2026-10-24T12:44:15.3113289Z 2026-10-24T12:44:15.3113340Z git switch - 2026-10-24T12:44:15.3113415Z 2026-10-24T12:44:15.3113533Z Turn off this advice by setting config variable advice.detachedHead to false 2026-10-24T12:44:15.3113689Z 2026-10-24T12:44:15.3113865Z HEAD is now at 473df35 Merge 7c927b95dfdd02196de6bd7a7a87a66fa0c23279 into 7f7daad98503dc049b7230465ae3863d71f197e4 2026-10-24T12:44:15.3126483Z ##[endgroup] 2026-10-24T12:44:15.3169218Z [command]/usr/local/bin/git log -1 --format=%H 2026-10-24T12:44:15.3193920Z 473df35a66cb7d9eacac05268bdea6652afc4cd9 2026-10-24T12:44:15.3290343Z ##[group]Run files="$(git ls-files .github/pr-assets)" 2026-10-24T12:44:15.3290732Z files="$(git ls-files .github/pr-assets)" 2026-10-24T12:44:15.3291042Z if test -n "$files"; then 2026-10-24T12:44:15.3291427Z  printf 'PR evidence must be uploaded to GitHub, not committed:\n%s\n' "$files" >&2 2026-10-24T12:44:15.3291799Z  exit 1 2026-10-24T12:44:15.3291981Z fi 2026-10-24T12:44:15.3312662Z shell: /usr/bin/bash -e {0} 2026-10-24T12:44:15.3312887Z env: 2026-10-24T12:44:15.3313079Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 147 2026-10-24T12:44:15.3313347Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 453 2026-10-24T12:44:15.3313587Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T12:44:15.3313817Z ##[endgroup] 2026-10-24T12:44:15.3479915Z Prepare all required actions 2026-10-24T12:44:15.3480299Z Getting action download info 2026-10-24T12:44:15.4608953Z Download action repository 'voidzero-dev/setup-vp@v1' (SHA:250f29ce396baf5e8f24498e17c0dfdebabc26eb) 2026-10-24T12:44:15.5694517Z ##[group]Run ./.github/actions/setup-ci-deps 2026-10-24T12:44:15.5694799Z env: 2026-10-24T12:44:15.5694996Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 147 2026-10-24T12:44:15.5695260Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 453 2026-10-24T12:44:15.5695518Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T12:44:15.5695830Z ##[endgroup] 2026-10-24T12:44:15.5828143Z ##[start-action display=Resolve Vite+ version;id=__self.vp] 2026-10-24T12:44:15.5851131Z ##[group]Run echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-24T12:44:15.5851704Z echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-24T12:44:15.5852095Z echo "node=$(jq -r '.engines.node' package.json)" >> "$GITHUB_OUTPUT" 2026-10-24T12:44:15.5852359Z echo "pnpm=$(jq -r '.packageManager' package.json)" >> "$GITHUB_OUTPUT" 2026-10-24T12:44:15.5869341Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T12:44:15.5869613Z env: 2026-10-24T12:44:15.5869800Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 147 2026-10-24T12:44:15.5870034Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 453 2026-10-24T12:44:15.5870273Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T12:44:15.5870494Z ##[endgroup] 2026-10-24T12:44:15.5949227Z ##[end-action id=__self.vp;outcome=success;conclusion=success;duration_ms=12] 2026-10-24T12:44:15.5950800Z ##[start-action display=Cache Vite+;id=__self.vp_cache] 2026-10-24T12:44:15.5996173Z ##[group]Run actions/cache@v6 2026-10-24T12:44:15.5996330Z with: 2026-10-24T12:44:15.5996441Z path: ~/.vite-plus 2026-10-24T12:44:15.5996613Z key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T12:44:15.5996825Z enableCrossOsArchive: false 2026-10-24T12:44:15.5996962Z fail-on-cache-miss: false 2026-10-24T12:44:15.5997087Z lookup-only: false 2026-10-24T12:44:15.5997198Z save-always: false 2026-10-24T12:44:15.5997311Z env: 2026-10-24T12:44:15.5997424Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 147 2026-10-24T12:44:15.5997572Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 453 2026-10-24T12:44:15.5997717Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T12:44:15.5997857Z ##[endgroup] 2026-10-24T12:44:15.8080088Z Cache hit for: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T12:44:16.1804604Z Received 170349591 of 170349591 (100.0%), 468.2 MBs/sec 2026-10-24T12:44:16.1805380Z Cache Size: ~162 MB (170349591 B) 2026-10-24T12:44:16.1834685Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/c43d70db-1bd6-4eb3-ab9c-84e83cb5b46f/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T12:44:16.9363431Z Cache restored successfully 2026-10-24T12:44:16.9564468Z Cache restored from key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T12:44:16.9652629Z ##[end-action id=__self.vp_cache;outcome=success;conclusion=success;duration_ms=1370] 2026-10-24T12:44:16.9655069Z ##[start-action display=Use cached Vite+;id=__self.__run] 2026-10-24T12:44:16.9678095Z ##[group]Run echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-24T12:44:16.9678325Z echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-24T12:44:16.9678503Z "$HOME/.vite-plus/bin/vp" env use "26.12.1" 2026-10-24T12:44:16.9692913Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T12:44:16.9693087Z env: 2026-10-24T12:44:16.9693205Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 147 2026-10-24T12:44:16.9693352Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 453 2026-10-24T12:44:16.9693499Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T12:44:16.9693657Z ##[endgroup] 2026-10-24T12:44:16.9737080Z Using Node.js v26.12.1 (resolved from 26.12.1) 2026-10-24T12:44:16.9747750Z ##[end-action id=__self.__run;outcome=success;conclusion=success;duration_ms=9] 2026-10-24T12:44:16.9749999Z ##[start-action display=Setup Vite+;id=__self.__voidzero-dev_setup-vp] 2026-10-24T12:44:16.9755842Z ##[end-action id=__self.__voidzero-dev_setup-vp;outcome=skipped;conclusion=skipped;duration_ms=0] 2026-10-24T12:44:16.9758225Z ##[start-action display=Resolve pnpm store path;id=__self.pnpm_store] 2026-10-24T12:44:16.9795545Z ##[group]Run store_path="$(vp pm cache dir)" 2026-10-24T12:44:16.9795841Z store_path="$(vp pm cache dir)" 2026-10-24T12:44:16.9796113Z echo "path=$store_path" >> "$GITHUB_OUTPUT" 2026-10-24T12:44:16.9814593Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T12:44:16.9814888Z env: 2026-10-24T12:44:16.9815073Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 147 2026-10-24T12:44:16.9815329Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 453 2026-10-24T12:44:16.9815816Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T12:44:16.9816046Z ##[endgroup] 2026-10-24T12:44:16.9974933Z ##[end-action id=__self.pnpm_store;outcome=success;conclusion=success;duration_ms=21] 2026-10-24T12:44:16.9977086Z ##[start-action display=Cache full pnpm store;id=__self.__actions_cache] 2026-10-24T12:44:17.0340755Z ##[group]Run actions/cache@v6 2026-10-24T12:44:17.0340901Z with: 2026-10-24T12:44:17.0341034Z path: /home/runner/.local/share/pnpm/store/v11 2026-10-24T12:44:17.0341313Z key: pnpm-full-v1-Linux-X64-fa50cf9b003d547cd32552f61b874eb4abe5dace3fdb4b1abd9610da2da24074 2026-10-24T12:44:17.0341581Z restore-keys: pnpm-full-v1-Linux-X64- 2026-10-24T12:44:17.0341737Z enableCrossOsArchive: false 2026-10-24T12:44:17.0341876Z fail-on-cache-miss: false 2026-10-24T12:44:17.0342008Z lookup-only: false 2026-10-24T12:44:17.0342122Z save-always: false 2026-10-24T12:44:17.0342237Z env: 2026-10-24T12:44:17.0342349Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 147 2026-10-24T12:44:17.0342525Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 453 2026-10-24T12:44:17.0342670Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T12:44:17.0342805Z ##[endgroup] 2026-10-24T12:44:17.2228259Z Cache hit for: pnpm-full-v1-Linux-X64-fa50cf9b003d547cd32552f61b874eb4abe5dace3fdb4b1abd9610da2da24074 2026-10-24T12:44:18.3008133Z Received 805306368 of 994208090 (81.0%), 725.2 MBs/sec 2026-10-24T12:44:18.5404267Z Received 994208090 of 994208090 (100.0%), 729.9 MBs/sec 2026-10-24T12:44:18.5405604Z Cache Size: ~948 MB (994208090 B) 2026-10-24T12:44:18.5454056Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/ca8d2293-b909-4646-9406-5219e6e7ed7e/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T12:44:24.4135888Z Cache restored successfully 2026-10-24T12:44:24.4632202Z Cache restored from key: pnpm-full-v1-Linux-X64-fa50cf9b003d547cd32552f61b874eb4abe5dace3fdb4b1abd9610da2da24074 2026-10-24T12:44:24.4704569Z ##[end-action id=__self.__actions_cache;outcome=success;conclusion=success;duration_ms=7472] 2026-10-24T12:44:24.4706949Z ##[start-action display=Install dependencies;id=__self.__run_2] 2026-10-24T12:44:24.4719011Z ##[group]Run vp install 2026-10-24T12:44:24.4719174Z vp install 2026-10-24T12:44:24.4733662Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T12:44:24.4733838Z env: 2026-10-24T12:44:24.4733958Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 147 2026-10-24T12:44:24.4734107Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 453 2026-10-24T12:44:24.4734250Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T12:44:24.4734388Z ##[endgroup] 2026-10-24T12:44:24.5154644Z Scope: all 34 workspace projects 2026-10-24T12:44:24.6213449Z ? Verifying lockfile against supply-chain policies (2088 entries)... 2026-10-24T12:44:24.8932319Z Packages are hard linked from the content-addressable store to the virtual store. 2026-10-24T12:44:24.8932812Z Content-addressable store is at: /home/runner/.local/share/pnpm/store/v11 2026-10-24T12:44:24.8933379Z Virtual store is at: node_modules/.pnpm 2026-10-24T12:44:27.2942241Z ✓ Lockfile passes supply-chain policies (2088 entries in 2.7s) 2026-10-24T12:44:27.2942514Z Lockfile is up to date, resolution step is skipped 2026-10-24T12:44:27.3126486Z Packages: +1721 2026-10-24T12:44:27.3126706Z ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2026-10-24T12:44:27.3494813Z Progress: resolved 1721, reused 1718, downloaded 0, added 1721, done 2026-10-24T12:44:28.4623336Z . prepare$ vp config --no-agent 2026-10-24T12:44:28.5732540Z . prepare: Done 2026-10-24T12:44:28.5749699Z 2026-10-24T12:44:28.5749801Z devDependencies: 2026-10-24T12:44:28.5749931Z + @coderabbitai/config 1.1.0 2026-10-24T12:44:28.5750115Z + @shadcn/lint 0.1.5 2026-10-24T12:44:28.5750276Z + @types/node 24.12.4 2026-10-24T12:44:28.5750405Z + knip 6.34.0 2026-10-24T12:44:28.5750544Z + typescript <- @tsc-rs/typescript 0.8.0 2026-10-24T12:44:28.5750690Z + vite-plus 1.3.0 2026-10-24T12:44:28.5750757Z 2026-10-24T12:44:28.5785821Z Done in 4.1s using pnpm v12.14.0 2026-10-24T12:44:28.5968444Z ##[end-action id=__self.__run_2;outcome=success;conclusion=success;duration_ms=4126] 2026-10-24T12:44:28.6492084Z ##[group]Run actions/cache@v6 2026-10-24T12:44:28.6492244Z with: 2026-10-24T12:44:28.6492354Z path: ~/.cache/electron 2026-10-24T12:44:28.6492575Z key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T12:44:28.6492813Z enableCrossOsArchive: false 2026-10-24T12:44:28.6492948Z fail-on-cache-miss: false 2026-10-24T12:44:28.6493072Z lookup-only: false 2026-10-24T12:44:28.6493190Z save-always: false 2026-10-24T12:44:28.6493300Z env: 2026-10-24T12:44:28.6493407Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 147 2026-10-24T12:44:28.6493554Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 453 2026-10-24T12:44:28.6493708Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T12:44:28.6493842Z ##[endgroup] 2026-10-24T12:44:28.8465541Z Cache hit for: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T12:44:29.0281350Z Received 122906203 of 122906203 (100.0%), 719.1 MBs/sec 2026-10-24T12:44:29.0281713Z Cache Size: ~117 MB (122906203 B) 2026-10-24T12:44:29.0296990Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/c52148b5-a0a5-4686-949b-3f83ff77e8f5/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T12:44:29.1146639Z Cache restored successfully 2026-10-24T12:44:29.1276675Z Cache restored from key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T12:44:29.1404606Z ##[group]Run vp run --filter @t3tools/desktop ensure:electron 2026-10-24T12:44:29.1404847Z vp run --filter @t3tools/desktop ensure:electron 2026-10-24T12:44:29.1419070Z shell: /usr/bin/bash -e {0} 2026-10-24T12:44:29.1419200Z env: 2026-10-24T12:44:29.1419487Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 147 2026-10-24T12:44:29.1419636Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 453 2026-10-24T12:44:29.1419777Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T12:44:29.1419915Z ##[endgroup] 2026-10-24T12:44:29.3274572Z ~/apps/desktop$ node scripts/ensure-electron-runtime.mjs ⊘ cache disabled 2026-10-24T12:44:29.9507569Z /home/runner/_work/t3code/t3code/node_modules/.pnpm/electron@44.9.3_supports-color@8.1.1/node_modules/electron/dist/electron 2026-10-24T12:44:29.9529714Z 2026-10-24T12:44:29.9662871Z ##[group]Run vp run knip:check 2026-10-24T12:44:29.9663052Z vp run knip:check 2026-10-24T12:44:29.9677039Z shell: /usr/bin/bash -e {0} 2026-10-24T12:44:29.9677169Z env: 2026-10-24T12:44:29.9677280Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 147 2026-10-24T12:44:29.9677428Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 453 2026-10-24T12:44:29.9677571Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T12:44:29.9677708Z ##[endgroup] 2026-10-24T12:44:30.1719363Z $ knip --include files,dependencies --no-config-hints ⊘ cache disabled 2026-10-24T12:44:34.3639594Z 2026-10-24T12:44:34.3642828Z $ 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-24T12:44:43.3592009Z 2026-10-24T12:44:43.3592994Z --- 2026-10-24T12:44:43.3593352Z vp run: 2/2 successful. (Run `vp run --last-details` for full details) 2026-10-24T12:44:43.3685281Z ##[group]Run vp run --filter @t3tools/source-control-github generate --check 2026-10-24T12:44:43.3685569Z vp run --filter @t3tools/source-control-github generate --check 2026-10-24T12:44:43.3699606Z shell: /usr/bin/bash -e {0} 2026-10-24T12:44:43.3699731Z env: 2026-10-24T12:44:43.3699844Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 147 2026-10-24T12:44:43.3699988Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 453 2026-10-24T12:44:43.3700132Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T12:44:43.3700268Z ##[endgroup] 2026-10-24T12:44:43.5242818Z ~/packages/source-control-github$ graphqlgen --check ⊘ cache disabled 2026-10-24T12:44:43.7289819Z 2026-10-24T12:44:43.7367955Z ##[group]Run vp run --filter t3 generate --check 2026-10-24T12:44:43.7368164Z vp run --filter t3 generate --check 2026-10-24T12:44:43.7382396Z shell: /usr/bin/bash -e {0} 2026-10-24T12:44:43.7382523Z env: 2026-10-24T12:44:43.7382649Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 147 2026-10-24T12:44:43.7382796Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 453 2026-10-24T12:44:43.7382936Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T12:44:43.7383068Z ##[endgroup] 2026-10-24T12:44:43.8946617Z ~/apps/server$ graphqlgen --check ⊘ cache disabled 2026-10-24T12:44:44.0550055Z 2026-10-24T12:44:44.0637571Z ##[group]Run vp check 2026-10-24T12:44:44.0637726Z vp check 2026-10-24T12:44:44.0651145Z shell: /usr/bin/bash -e {0} 2026-10-24T12:44:44.0651281Z env: 2026-10-24T12:44:44.0651394Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 147 2026-10-24T12:44:44.0651544Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 453 2026-10-24T12:44:44.0651688Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T12:44:44.0651822Z ##[endgroup] 2026-10-24T12:44:44.6365009Z pass: All 5750 files are correctly formatted (419ms, 8 threads) 2026-10-24T12:44:50.6418973Z warn: Lint warnings found 2026-10-24T12:44:50.6421192Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.6421574Z ╭─[apps/mobile/src/features/home/thread-swipe-actions.tsx:494:27] 2026-10-24T12:44:50.6421891Z 493 │ > 2026-10-24T12:44:50.6422056Z 494 │ {props.children(close)} 2026-10-24T12:44:50.6422293Z ·  ──┬── 2026-10-24T12:44:50.6422614Z · ╰── Cannot access ref value during render 2026-10-24T12:44:50.6422920Z 495 │ 2026-10-24T12:44:50.6423093Z ╰──── 2026-10-24T12:44:50.6423691Z  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-24T12:44:50.6424500Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.6424807Z 2026-10-24T12:44:50.6424984Z ⚠ react(immutability): This value cannot be modified 2026-10-24T12:44:50.6425321Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:174:5] 2026-10-24T12:44:50.6425681Z 170 │ const expandedAngle = props.collapsedDirection === "right" ? 90 : 180; 2026-10-24T12:44:50.6426001Z 171 │ const rotation = useSharedValue(props.expanded ? expandedAngle : 0); 2026-10-24T12:44:50.6426244Z ·  ────┬─── 2026-10-24T12:44:50.6426480Z · ╰── `rotation` originates here 2026-10-24T12:44:50.6426687Z 172 │ 2026-10-24T12:44:50.6426828Z 173 │ useLayoutEffect(() => { 2026-10-24T12:44:50.6427062Z 174 │ rotation.value = withTiming(props.expanded ? expandedAngle : 0, { 2026-10-24T12:44:50.6427289Z ·  ────┬─── 2026-10-24T12:44:50.6427518Z · ╰── `rotation` cannot be modified 2026-10-24T12:44:50.6427774Z 175 │ duration: THREAD_DISCLOSURE_TRANSITION_MS, 2026-10-24T12:44:50.6427957Z ╰──── 2026-10-24T12:44:50.6428310Z  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-24T12:44:50.6429002Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T12:44:50.6429313Z 2026-10-24T12:44:50.6429528Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T12:44:50.6429897Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:1246:23] 2026-10-24T12:44:50.6430136Z 1245 │ { 2026-10-24T12:44:50.6439048Z ╰──── 2026-10-24T12:44:50.6439398Z  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-24T12:44:50.6439981Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T12:44:50.6440270Z 2026-10-24T12:44:50.6440543Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-24T12:44:50.6440926Z ╭─[apps/server/src/telemetry/AnalyticsService.ts:340:7] 2026-10-24T12:44:50.6441122Z 339 │ 2026-10-24T12:44:50.6441287Z 340 │ const layerTest = AnalyticsService.layerTest; 2026-10-24T12:44:50.6441482Z ·  ────┬──── 2026-10-24T12:44:50.6441704Z · ╰── 'layerTest' is declared here 2026-10-24T12:44:50.6441895Z ╰──── 2026-10-24T12:44:50.6442057Z  help: Consider removing this declaration. 2026-10-24T12:44:50.6442177Z 2026-10-24T12:44:50.6442506Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T12:44:50.6442972Z ╭─[packages/provider-grok/src/server/adapter.ts:408:7] 2026-10-24T12:44:50.6443164Z 407 │ 2026-10-24T12:44:50.6443304Z 408 │ const layer: Layer.Layer< 2026-10-24T12:44:50.6443468Z ·  ──┬── 2026-10-24T12:44:50.6443681Z · ╰── 'layer' is declared here 2026-10-24T12:44:50.6443909Z 409 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T12:44:50.6444073Z ╰──── 2026-10-24T12:44:50.6444232Z  help: Consider removing this declaration. 2026-10-24T12:44:50.6444353Z 2026-10-24T12:44:50.6444592Z ⚠ eslint(no-unused-vars): Function 'resolveThreadWorkspaceCwd' is declared but never used. 2026-10-24T12:44:50.6444941Z ╭─[apps/server/src/checkpointing/Utils.ts:12:10] 2026-10-24T12:44:50.6445129Z 11 │ 2026-10-24T12:44:50.6445287Z 12 │ function resolveThreadWorkspaceCwd(input: { 2026-10-24T12:44:50.6445503Z ·  ────────────┬──────────── 2026-10-24T12:44:50.6445782Z · ╰── 'resolveThreadWorkspaceCwd' is declared here 2026-10-24T12:44:50.6446013Z 13 │ readonly thread: { 2026-10-24T12:44:50.6446152Z ╰──── 2026-10-24T12:44:50.6446307Z  help: Consider removing this declaration. 2026-10-24T12:44:50.6446426Z 2026-10-24T12:44:50.6446687Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T12:44:50.6447070Z ╭─[packages/provider-opencode/src/server/adapter.ts:3755:7] 2026-10-24T12:44:50.6447282Z 3754 │ 2026-10-24T12:44:50.6447563Z 3755 │ const layer: Layer.Layer = 2026-10-24T12:44:50.6447848Z ·  ──┬── 2026-10-24T12:44:50.6448063Z · ╰── 'layer' is declared here 2026-10-24T12:44:50.6448263Z 3756 │ Layer.effect( 2026-10-24T12:44:50.6448398Z ╰──── 2026-10-24T12:44:50.6448557Z  help: Consider removing this declaration. 2026-10-24T12:44:50.6448679Z 2026-10-24T12:44:50.6448946Z ⚠ eslint(no-unused-vars): Function 'promptResponseHasMissingXAiStopReason' is declared but never used. 2026-10-24T12:44:50.6449347Z ╭─[packages/provider-grok/src/server/xaiAcpExtension.ts:1620:10] 2026-10-24T12:44:50.6449561Z 1619 │ 2026-10-24T12:44:50.6449843Z 1620 │ function promptResponseHasMissingXAiStopReason(response: EffectAcpSchema.PromptResponse): boolean { 2026-10-24T12:44:50.6450185Z ·  ──────────────────┬────────────────── 2026-10-24T12:44:50.6450509Z · ╰── 'promptResponseHasMissingXAiStopReason' is declared here 2026-10-24T12:44:50.6450784Z 1621 │ const meta = response._meta; 2026-10-24T12:44:50.6450933Z ╰──── 2026-10-24T12:44:50.6451093Z  help: Consider removing this declaration. 2026-10-24T12:44:50.6451209Z 2026-10-24T12:44:50.6451437Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T12:44:50.6451780Z ╭─[apps/server/src/terminal/Manager.test.ts:731:31] 2026-10-24T12:44:50.6451971Z 730 │ ); 2026-10-24T12:44:50.6452285Z 731 │ const snapshot = events.filter((event) => event.type === "snapshot").at(-1)?.snapshot; 2026-10-24T12:44:50.6452608Z ·  ────── 2026-10-24T12:44:50.6452877Z 732 │ expect(snapshot?.history).toBe("aa😀\rEND"); 2026-10-24T12:44:50.6453049Z ╰──── 2026-10-24T12:44:50.6453280Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T12:44:50.6453459Z 2026-10-24T12:44:50.6453695Z ⚠ eslint(no-unused-vars): Function 'assertUserMessagesExclude' is declared but never used. 2026-10-24T12:44:50.6454083Z ╭─[apps/server/src/orchestration-v2/testkit/fixtures/shared.ts:1398:10] 2026-10-24T12:44:50.6454305Z 1397 │ 2026-10-24T12:44:50.6454454Z 1398 │ function assertUserMessagesExclude( 2026-10-24T12:44:50.6454665Z ·  ────────────┬──────────── 2026-10-24T12:44:50.6454955Z · ╰── 'assertUserMessagesExclude' is declared here 2026-10-24T12:44:50.6455238Z 1399 │ projection: OrchestrationV2ThreadProjection, 2026-10-24T12:44:50.6455412Z ╰──── 2026-10-24T12:44:50.6455572Z  help: Consider removing this declaration. 2026-10-24T12:44:50.6455688Z 2026-10-24T12:44:50.6455860Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T12:44:50.6456223Z ╭─[packages/provider-opencode/src/server/OpenCodeRuntime.environment.test.ts:53:14] 2026-10-24T12:44:50.6456470Z 52 │ 2026-10-24T12:44:50.6456596Z 53 │ for (const {} of [ 2026-10-24T12:44:50.6456749Z ·  ── 2026-10-24T12:44:50.6457058Z 54 │ { healthy: true }, 2026-10-24T12:44:50.6457223Z ╰──── 2026-10-24T12:44:50.6457517Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T12:44:50.6457749Z 2026-10-24T12:44:50.6457962Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T12:44:50.6458305Z ╭─[apps/web/src/lib/composerContextReferences.ts:90:40] 2026-10-24T12:44:50.6458519Z 89 │ let cursor = prompt.length; 2026-10-24T12:44:50.6458719Z 90 │ for (const occurrence of occurrences.reverse()) { 2026-10-24T12:44:50.6458941Z ·  ─────── 2026-10-24T12:44:50.6459140Z 91 │ let { start, end } = occurrence; 2026-10-24T12:44:50.6459290Z ╰──── 2026-10-24T12:44:50.6459615Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T12:44:50.6459869Z 2026-10-24T12:44:50.6460062Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T12:44:50.6460428Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:555:70] 2026-10-24T12:44:50.6460704Z 554 │ assert.deepStrictEqual( 2026-10-24T12:44:50.6460981Z 555 │ (yield* Ref.get(fixture.syncCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-24T12:44:50.6461285Z ·  ┬ 2026-10-24T12:44:50.6461587Z · ╰── '_' is declared here 2026-10-24T12:44:50.6461811Z 556 │ [ 2026-10-24T12:44:50.6461944Z ╰──── 2026-10-24T12:44:50.6462106Z  help: Consider removing this parameter. 2026-10-24T12:44:50.6462227Z 2026-10-24T12:44:50.6462486Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T12:44:50.6462913Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:1155:70] 2026-10-24T12:44:50.6463178Z 1154 │ assert.deepStrictEqual( 2026-10-24T12:44:50.6463449Z 1155 │ (yield* Ref.get(fixture.linkCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-24T12:44:50.6463744Z ·  ┬ 2026-10-24T12:44:50.6464042Z · ╰── '_' is declared here 2026-10-24T12:44:50.6464264Z 1156 │ [ 2026-10-24T12:44:50.6464402Z ╰──── 2026-10-24T12:44:50.6464562Z  help: Consider removing this parameter. 2026-10-24T12:44:50.6464684Z 2026-10-24T12:44:50.6464842Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.6465155Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:152:27] 2026-10-24T12:44:50.6465506Z 151 │ 2026-10-24T12:44:50.6465773Z 152 │ {props.children(open)} 2026-10-24T12:44:50.6465972Z ·  ──┬─ 2026-10-24T12:44:50.6466244Z · ╰── Cannot access ref value during render 2026-10-24T12:44:50.6466469Z 153 │ 2026-10-24T12:44:50.6466603Z ╰──── 2026-10-24T12:44:50.6467150Z  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-24T12:44:50.6467949Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.6468363Z 2026-10-24T12:44:50.6468689Z ⚠ react(memo-dependencies): Found missing/extra memoization dependencies 2026-10-24T12:44:50.6469079Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:140:9] 2026-10-24T12:44:50.6469394Z 139 │ if (action.id !== undefined) { 2026-10-24T12:44:50.6486849Z 140 │ props.onPressAction?.({ 2026-10-24T12:44:50.6487050Z ·  ──┬── 2026-10-24T12:44:50.6487302Z · ╰── Missing dependency `props` 2026-10-24T12:44:50.6487546Z 141 │ nativeEvent: { event: action.id }, 2026-10-24T12:44:50.6487826Z 142 │ } as Parameters>[0]); 2026-10-24T12:44:50.6488050Z 143 │ } 2026-10-24T12:44:50.6488180Z 144 │ }, 2026-10-24T12:44:50.6488332Z 145 │ [close, props.onPressAction], 2026-10-24T12:44:50.6488539Z ·  ─────────┬───────── 2026-10-24T12:44:50.6488868Z · ╰── Overly precise dependency `props.onPressAction`, use `props` instead 2026-10-24T12:44:50.6489133Z 146 │ ); 2026-10-24T12:44:50.6489254Z ╰──── 2026-10-24T12:44:50.6489812Z  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-24T12:44:50.6490764Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.6491140Z 2026-10-24T12:44:50.6491300Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.6491583Z ╭─[apps/mobile/src/components/ui/Menu.tsx:54:36] 2026-10-24T12:44:50.6491910Z 53 │ const child = children as ReactElement>; 2026-10-24T12:44:50.6492282Z 54 │ ╭─▶ children = cloneElement(child, { 2026-10-24T12:44:50.6492566Z 55 │ │ onTouchStart: (event) => { 2026-10-24T12:44:50.6492886Z 56 │ │ // Reset for a new touch, not onPressIn, which also fires when a 2026-10-24T12:44:50.6493223Z 57 │ │ // finger moves out of the row and back during the same gesture. 2026-10-24T12:44:50.6493521Z 58 │ │ menuPress.current.isPreparing = false; 2026-10-24T12:44:50.6493840Z 59 │ │ menuPress.current.suppressPress = menuPress.current.isOpen; 2026-10-24T12:44:50.6494145Z 60 │ │ pendingPress.current = null; 2026-10-24T12:44:50.6494399Z 61 │ │ child.props.onTouchStart?.(event); 2026-10-24T12:44:50.6494609Z 62 │ │ }, 2026-10-24T12:44:50.6494810Z 63 │ │ onPress: (event) => { 2026-10-24T12:44:50.6495102Z 64 │ │ // Accessibility clicks have no touch identifier and must not inherit 2026-10-24T12:44:50.6495414Z 65 │ │ // cancellation from a previous physical gesture. 2026-10-24T12:44:50.6495744Z 66 │ │ const isTouch = typeof event.nativeEvent.identifier === "number"; 2026-10-24T12:44:50.6496116Z 67 │ │ if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) { 2026-10-24T12:44:50.6496527Z 68 │ │ return; 2026-10-24T12:44:50.6496712Z 69 │ │ } 2026-10-24T12:44:50.6496958Z 70 │ │ if (isTouch && menuPress.current.isPreparing) { 2026-10-24T12:44:50.6497280Z 71 │ │ // A release can arrive between native menu preparation and display. 2026-10-24T12:44:50.6497626Z 72 │ │ // Let UIKit's display/cancel callback decide this press's outcome. 2026-10-24T12:44:50.6497900Z 73 │ │ event.persist(); 2026-10-24T12:44:50.6498259Z 74 │ │ pendingPress.current = () => child.props.onPress?.(event); 2026-10-24T12:44:50.6498576Z 75 │ │ return; 2026-10-24T12:44:50.6498763Z 76 │ │ } 2026-10-24T12:44:50.6498974Z 77 │ │ child.props.onPress?.(event); 2026-10-24T12:44:50.6499183Z 78 │ │ }, 2026-10-24T12:44:50.6499411Z 79 │ ├─▶ }); 2026-10-24T12:44:50.6499799Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T12:44:50.6500128Z 80 │ menuProps.onMenuInteractionStart = () => { 2026-10-24T12:44:50.6500307Z ╰──── 2026-10-24T12:44:50.6500859Z  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-24T12:44:50.6501605Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.6501888Z 2026-10-24T12:44:50.6502180Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-24T12:44:50.6502587Z ╭─[apps/server/src/provider/AntigravityAuth.ts:285:20] 2026-10-24T12:44:50.6502812Z 284 │ }, 2026-10-24T12:44:50.6502968Z 285 │ (effect, flow, stopSessions) => 2026-10-24T12:44:50.6503172Z ·  ──────┬───── 2026-10-24T12:44:50.6503436Z · ╰── 'stopSessions' is declared here 2026-10-24T12:44:50.6503664Z 286 │ effect.pipe( 2026-10-24T12:44:50.6503801Z ╰──── 2026-10-24T12:44:50.6503965Z  help: Consider removing this parameter. 2026-10-24T12:44:50.6504086Z 2026-10-24T12:44:50.6504280Z ⚠ eslint(require-yield): This generator function does not have `yield` 2026-10-24T12:44:50.6504625Z ╭─[packages/provider-acp/src/server/mcpOverAcpBridge.ts:81:78] 2026-10-24T12:44:50.6504839Z  80 │ 2026-10-24T12:44:50.6505183Z  81 │ ╭─▶ export const makeAcpMcpOverAcpBridge = Effect.fn("AcpMcpOverAcpBridge.make")(function* ( 2026-10-24T12:44:50.6505559Z  82 │ │ options: AcpMcpOverAcpBridgeOptions, 2026-10-24T12:44:50.6505815Z  83 │ │ ): Effect.fn.Return { 2026-10-24T12:44:50.6506120Z  84 │ │ const fetchImplementation = options.fetchImplementation ?? fetch; 2026-10-24T12:44:50.6506435Z  85 │ │ const connections = new Map(); 2026-10-24T12:44:50.6506648Z  86 │ │ 2026-10-24T12:44:50.6506950Z  87 │ │ const connectionFor = (connectionId: string): Effect.Effect => 2026-10-24T12:44:50.6507262Z  88 │ │ Effect.suspend(() => { 2026-10-24T12:44:50.6507511Z  89 │ │ const connection = connections.get(connectionId); 2026-10-24T12:44:50.6507765Z  90 │ │ return connection === undefined 2026-10-24T12:44:50.6508100Z  91 │ │ ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`)) 2026-10-24T12:44:50.6508507Z  92 │ │ : Effect.succeed(connection); 2026-10-24T12:44:50.6508842Z  93 │ │ }); 2026-10-24T12:44:50.6509004Z  94 │ │ 2026-10-24T12:44:50.6509174Z  95 │ │ const send = ( 2026-10-24T12:44:50.6509373Z  96 │ │ connection: Connection, 2026-10-24T12:44:50.6509575Z  97 │ │ message: unknown, 2026-10-24T12:44:50.6509838Z  98 │ │ ): Effect.Effect, AcpMcpOverAcpError> => 2026-10-24T12:44:50.6510113Z  99 │ │ connection.mutex.withPermits(1)( 2026-10-24T12:44:50.6510343Z 100 │ │ Effect.gen(function* () { 2026-10-24T12:44:50.6510588Z 101 │ │ const body = JSON.stringify(message); 2026-10-24T12:44:50.6510871Z 102 │ │ if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) { 2026-10-24T12:44:50.6511242Z 103 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB.")); 2026-10-24T12:44:50.6511531Z 104 │ │ } 2026-10-24T12:44:50.6511761Z 105 │ │ const response = yield* Effect.tryPromise({ 2026-10-24T12:44:50.6512002Z 106 │ │ try: (signal) => 2026-10-24T12:44:50.6512248Z 107 │ │ fetchImplementation(options.endpoint, { 2026-10-24T12:44:50.6512491Z 108 │ │ method: "POST", 2026-10-24T12:44:50.6512743Z 109 │ │ signal, 2026-10-24T12:44:50.6512949Z 110 │ │ headers: { 2026-10-24T12:44:50.6513196Z 111 │ │ "content-type": "application/json", 2026-10-24T12:44:50.6513485Z 112 │ │ accept: "application/json, text/event-stream", 2026-10-24T12:44:50.6513770Z 113 │ │ authorization: options.authorization, 2026-10-24T12:44:50.6514037Z 114 │ │ ...(connection.sessionId === null 2026-10-24T12:44:50.6514270Z 115 │ │ ? {} 2026-10-24T12:44:50.6514526Z 116 │ │ : { "mcp-session-id": connection.sessionId }), 2026-10-24T12:44:50.6514808Z 117 │ │ ...(connection.protocolVersion === null 2026-10-24T12:44:50.6515046Z 118 │ │ ? {} 2026-10-24T12:44:50.6515323Z 119 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-24T12:44:50.6515592Z 120 │ │ }, 2026-10-24T12:44:50.6515793Z 121 │ │ body, 2026-10-24T12:44:50.6515994Z 122 │ │ }), 2026-10-24T12:44:50.6516199Z 123 │ │ catch: bridgeError, 2026-10-24T12:44:50.6516403Z 124 │ │ }); 2026-10-24T12:44:50.6516733Z 125 │ │ connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId; 2026-10-24T12:44:50.6517055Z 126 │ │ if (!response.ok) { 2026-10-24T12:44:50.6517282Z 127 │ │ yield* Effect.promise( 2026-10-24T12:44:50.6517601Z 128 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-24T12:44:50.6517967Z 129 │ │ ); 2026-10-24T12:44:50.6518256Z 130 │ │ return yield* Effect.fail( 2026-10-24T12:44:50.6518601Z 131 │ │ new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`), 2026-10-24T12:44:50.6518900Z 132 │ │ ); 2026-10-24T12:44:50.6519081Z 133 │ │ } 2026-10-24T12:44:50.6519397Z 134 │ │ const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))]; 2026-10-24T12:44:50.6519729Z 135 │ │ for (const payload of payloads) { 2026-10-24T12:44:50.6520087Z 136 │ │ connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion; 2026-10-24T12:44:50.6520390Z 137 │ │ } 2026-10-24T12:44:50.6520593Z 138 │ │ return payloads; 2026-10-24T12:44:50.6520845Z 139 │ │ }).pipe(Effect.mapError(bridgeError)), 2026-10-24T12:44:50.6521063Z 140 │ │ ); 2026-10-24T12:44:50.6521234Z 141 │ │ 2026-10-24T12:44:50.6521964Z 142 │ │ const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* ( 2026-10-24T12:44:50.6522276Z 143 │ │ request: AcpSchema.DisconnectMcpRequest, 2026-10-24T12:44:50.6522607Z 144 │ │ ): Effect.fn.Return { 2026-10-24T12:44:50.6522988Z 145 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T12:44:50.6523285Z 146 │ │ connections.delete(request.connectionId); 2026-10-24T12:44:50.6523556Z 147 │ │ const sessionId = connection.sessionId; 2026-10-24T12:44:50.6523801Z 148 │ │ if (sessionId !== null) { 2026-10-24T12:44:50.6524056Z 149 │ │ const response = yield* Effect.tryPromise({ 2026-10-24T12:44:50.6524302Z 150 │ │ try: (signal) => 2026-10-24T12:44:50.6524550Z 151 │ │ fetchImplementation(options.endpoint, { 2026-10-24T12:44:50.6524795Z 152 │ │ method: "DELETE", 2026-10-24T12:44:50.6525006Z 153 │ │ signal, 2026-10-24T12:44:50.6525209Z 154 │ │ headers: { 2026-10-24T12:44:50.6525453Z 155 │ │ authorization: options.authorization, 2026-10-24T12:44:50.6525720Z 156 │ │ "mcp-session-id": sessionId, 2026-10-24T12:44:50.6525994Z 157 │ │ ...(connection.protocolVersion === null 2026-10-24T12:44:50.6526237Z 158 │ │ ? {} 2026-10-24T12:44:50.6526514Z 159 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-24T12:44:50.6526773Z 160 │ │ }, 2026-10-24T12:44:50.6526959Z 161 │ │ }), 2026-10-24T12:44:50.6527163Z 162 │ │ catch: bridgeError, 2026-10-24T12:44:50.6527359Z 163 │ │ }); 2026-10-24T12:44:50.6527594Z 164 │ │ if (!response.ok && response.status !== 404) { 2026-10-24T12:44:50.6527852Z 165 │ │ return yield* Effect.fail( 2026-10-24T12:44:50.6528091Z 166 │ │ new AcpMcpOverAcpError( 2026-10-24T12:44:50.6528491Z 167 │ │ `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`, 2026-10-24T12:44:50.6528806Z 168 │ │ ), 2026-10-24T12:44:50.6528984Z 169 │ │ ); 2026-10-24T12:44:50.6529160Z 170 │ │ } 2026-10-24T12:44:50.6529361Z 171 │ │ yield* Effect.promise( 2026-10-24T12:44:50.6529664Z 172 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-24T12:44:50.6529927Z 173 │ │ ); 2026-10-24T12:44:50.6530100Z 174 │ │ } 2026-10-24T12:44:50.6530280Z 175 │ │ return {}; 2026-10-24T12:44:50.6530455Z 176 │ │ }); 2026-10-24T12:44:50.6530627Z 177 │ │ 2026-10-24T12:44:50.6530801Z 178 │ │ return { 2026-10-24T12:44:50.6531078Z 179 │ │ connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) { 2026-10-24T12:44:50.6531384Z 180 │ │ if (request.serverId !== "t3-code") { 2026-10-24T12:44:50.6531632Z 181 │ │ return yield* Effect.fail( 2026-10-24T12:44:50.6531945Z 182 │ │ new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`), 2026-10-24T12:44:50.6532217Z 183 │ │ ); 2026-10-24T12:44:50.6532389Z 184 │ │ } 2026-10-24T12:44:50.6532613Z 185 │ │ if (connections.size >= MAX_CONNECTIONS) { 2026-10-24T12:44:50.6532998Z 186 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections.")); 2026-10-24T12:44:50.6533291Z 187 │ │ } 2026-10-24T12:44:50.6533545Z 188 │ │ const connectionId = yield* options.allocateConnectionId; 2026-10-24T12:44:50.6533823Z 189 │ │ connections.set(connectionId, { 2026-10-24T12:44:50.6534074Z 190 │ │ mutex: yield* Semaphore.make(1), 2026-10-24T12:44:50.6534302Z 191 │ │ sessionId: null, 2026-10-24T12:44:50.6534527Z 192 │ │ protocolVersion: null, 2026-10-24T12:44:50.6534748Z 193 │ │ nextRequestId: 0, 2026-10-24T12:44:50.6534942Z 194 │ │ }); 2026-10-24T12:44:50.6535146Z 195 │ │ return { connectionId }; 2026-10-24T12:44:50.6535345Z 196 │ │ }), 2026-10-24T12:44:50.6535618Z 197 │ │ message: Effect.fn("mcpOverAcpBridge.message")(function* (request) { 2026-10-24T12:44:50.6535968Z 198 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T12:44:50.6536265Z 199 │ │ const id = ++connection.nextRequestId; 2026-10-24T12:44:50.6536532Z 200 │ │ const payloads = yield* send(connection, { 2026-10-24T12:44:50.6536772Z 201 │ │ jsonrpc: "2.0", 2026-10-24T12:44:50.6536966Z 202 │ │ id, 2026-10-24T12:44:50.6537175Z 203 │ │ method: request.method, 2026-10-24T12:44:50.6537458Z 204 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-24T12:44:50.6537704Z 205 │ │ }); 2026-10-24T12:44:50.6538073Z 206 │ │ const response = payloads.find((payload) => asEnvelope(payload)?.id === id); 2026-10-24T12:44:50.6538434Z 207 │ │ const envelope = asEnvelope(response); 2026-10-24T12:44:50.6538676Z 208 │ │ if (envelope === null) { 2026-10-24T12:44:50.6538909Z 209 │ │ return yield* Effect.fail( 2026-10-24T12:44:50.6539225Z 210 │ │ new AcpMcpOverAcpError("MCP server did not return a matching response."), 2026-10-24T12:44:50.6539499Z 211 │ │ ); 2026-10-24T12:44:50.6539672Z 212 │ │ } 2026-10-24T12:44:50.6539887Z 213 │ │ if (envelope.error !== undefined) { 2026-10-24T12:44:50.6540228Z 214 │ │ return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error))); 2026-10-24T12:44:50.6540510Z 215 │ │ } 2026-10-24T12:44:50.6540778Z 216 │ │ return (envelope.result ?? null) as AcpSchema.MessageMcpResponse; 2026-10-24T12:44:50.6541034Z 217 │ │ }), 2026-10-24T12:44:50.6541326Z 218 │ │ notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) { 2026-10-24T12:44:50.6541691Z 219 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T12:44:50.6541966Z 220 │ │ yield* send(connection, { 2026-10-24T12:44:50.6542184Z 221 │ │ jsonrpc: "2.0", 2026-10-24T12:44:50.6542404Z 222 │ │ method: request.method, 2026-10-24T12:44:50.6542715Z 223 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-24T12:44:50.6542966Z 224 │ │ }); 2026-10-24T12:44:50.6543138Z 225 │ │ }), 2026-10-24T12:44:50.6543322Z 226 │ │ disconnect, 2026-10-24T12:44:50.6543535Z 227 │ │ dispose: Effect.suspend(() => 2026-10-24T12:44:50.6543762Z 228 │ │ Effect.forEach( 2026-10-24T12:44:50.6543981Z 229 │ │ [...connections.keys()], 2026-10-24T12:44:50.6544278Z 230 │ │ (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore), 2026-10-24T12:44:50.6544560Z 231 │ │ { discard: true }, 2026-10-24T12:44:50.6544755Z 232 │ │ ), 2026-10-24T12:44:50.6544927Z 233 │ │ ), 2026-10-24T12:44:50.6545104Z 234 │ │ }; 2026-10-24T12:44:50.6545375Z 235 │ ╰─▶ }); 2026-10-24T12:44:50.6545568Z ╰──── 2026-10-24T12:44:50.6545884Z  help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed. 2026-10-24T12:44:50.6546131Z 2026-10-24T12:44:50.6546483Z ⚠ 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-24T12:44:50.6546956Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:50:18] 2026-10-24T12:44:50.6547277Z 49 │ for (const tool of ["sendMessage", "followupTask", "interruptAgent", "listAgents"]) { 2026-10-24T12:44:50.6547625Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-24T12:44:50.6547975Z ·  ───────── 2026-10-24T12:44:50.6548298Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-24T12:44:50.6548960Z ╰──── 2026-10-24T12:44:50.6549019Z 2026-10-24T12:44:50.6549366Z ⚠ 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-24T12:44:50.6549828Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:51:18] 2026-10-24T12:44:50.6550158Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-24T12:44:50.6550516Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-24T12:44:50.6550793Z ·  ───────── 2026-10-24T12:44:50.6550950Z 52 │ } 2026-10-24T12:44:50.6551073Z ╰──── 2026-10-24T12:44:50.6551133Z 2026-10-24T12:44:50.6551477Z ⚠ 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-24T12:44:50.6551932Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:55:5] 2026-10-24T12:44:50.6552153Z 54 │ assert.equal( 2026-10-24T12:44:50.6552409Z 55 │ Schema.is(CodexSchema.ServerNotification__CollabAgentToolCallStatus)("interrupted"), 2026-10-24T12:44:50.6552666Z ·  ───────── 2026-10-24T12:44:50.6552850Z 56 │ true, 2026-10-24T12:44:50.6552968Z ╰──── 2026-10-24T12:44:50.6553025Z 2026-10-24T12:44:50.6553372Z ⚠ 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-24T12:44:50.6553828Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:59:5] 2026-10-24T12:44:50.6554044Z 58 │ assert.equal( 2026-10-24T12:44:50.6554307Z 59 │ Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentToolCallStatus)("interrupted"), 2026-10-24T12:44:50.6554566Z ·  ───────── 2026-10-24T12:44:50.6554716Z 60 │ true, 2026-10-24T12:44:50.6554833Z ╰──── 2026-10-24T12:44:50.6554889Z 2026-10-24T12:44:50.6555228Z ⚠ 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-24T12:44:50.6555689Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:103:16] 2026-10-24T12:44:50.6555902Z 102 │ 2026-10-24T12:44:50.6556229Z 103 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse)(resumeResponse), true); 2026-10-24T12:44:50.6556553Z ·  ───────── 2026-10-24T12:44:50.6556708Z 104 │ }); 2026-10-24T12:44:50.6556822Z ╰──── 2026-10-24T12:44:50.6556877Z 2026-10-24T12:44:50.6557094Z ⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used. 2026-10-24T12:44:50.6557446Z ╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10] 2026-10-24T12:44:50.6557649Z 21 │ 2026-10-24T12:44:50.6557871Z 22 │ function summarizePayload(payload: unknown): Readonly> { 2026-10-24T12:44:50.6558128Z ·  ────────┬─────── 2026-10-24T12:44:50.6558381Z · ╰── 'summarizePayload' is declared here 2026-10-24T12:44:50.6558641Z 23 │ if (payload === null) return { valueType: "null" }; 2026-10-24T12:44:50.6558821Z ╰──── 2026-10-24T12:44:50.6558990Z  help: Consider removing this declaration. 2026-10-24T12:44:50.6559110Z 2026-10-24T12:44:50.6559551Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const. 2026-10-24T12:44:50.6560107Z ╭─[apps/server/src/provider/acp/AntigravityProtocol.ts:263:20] 2026-10-24T12:44:50.6560347Z 262 │ ...(update._meta !== undefined 2026-10-24T12:44:50.6560624Z 263 │ ? { _meta: Schema.is(Schema.Record(Schema.String, Schema.Json))(meta) ? meta : null } 2026-10-24T12:44:50.6560889Z ·  ───────── 2026-10-24T12:44:50.6561058Z 264 │ : {}), 2026-10-24T12:44:50.6561185Z ╰──── 2026-10-24T12:44:50.6561243Z 2026-10-24T12:44:50.6561470Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T12:44:50.6561808Z ╭─[apps/web/src/lib/announce.browser.test.ts:41:46] 2026-10-24T12:44:50.6562001Z 40 │ 2026-10-24T12:44:50.6562167Z 41 │ expect(regionTexts()).toEqual([...first].reverse()); 2026-10-24T12:44:50.6562408Z ·  ─────── 2026-10-24T12:44:50.6562626Z 42 │ expect(regionTexts()).toContain("Claude"); 2026-10-24T12:44:50.6562812Z ╰──── 2026-10-24T12:44:50.6563138Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T12:44:50.6563396Z 2026-10-24T12:44:50.6563667Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T12:44:50.6564049Z ╭─[packages/provider-pi/src/server/adapter.ts:3405:7] 2026-10-24T12:44:50.6564246Z 3404 │ 2026-10-24T12:44:50.6564504Z 3405 │ const layer: Layer.Layer = 2026-10-24T12:44:50.6564769Z ·  ──┬── 2026-10-24T12:44:50.6564990Z · ╰── 'layer' is declared here 2026-10-24T12:44:50.6565194Z 3406 │ Layer.effect( 2026-10-24T12:44:50.6565330Z ╰──── 2026-10-24T12:44:50.6565491Z  help: Consider removing this declaration. 2026-10-24T12:44:50.6565611Z 2026-10-24T12:44:50.6565817Z ⚠ eslint(no-unused-vars): Identifier 'Duration' is imported but never used. 2026-10-24T12:44:50.6566155Z ╭─[packages/provider-pi/src/server/adapter.test.ts:24:13] 2026-10-24T12:44:50.6566483Z 23 │ import * as Deferred from "effect/Deferred"; 2026-10-24T12:44:50.6566733Z 24 │ import * as Duration from "effect/Duration"; 2026-10-24T12:44:50.6566923Z ·  ────┬─── 2026-10-24T12:44:50.6567156Z · ╰── 'Duration' is imported here 2026-10-24T12:44:50.6567389Z 25 │ import * as Effect from "effect/Effect"; 2026-10-24T12:44:50.6567548Z ╰──── 2026-10-24T12:44:50.6567702Z  help: Consider removing this import. 2026-10-24T12:44:50.6567817Z 2026-10-24T12:44:50.6568069Z ⚠ eslint(no-unused-vars): Function 'normalizeTerminalContextSelection' is declared but never used. 2026-10-24T12:44:50.6568425Z ╭─[apps/web/src/lib/terminalContext.ts:56:10] 2026-10-24T12:44:50.6568608Z 55 │ 2026-10-24T12:44:50.6568769Z 56 │ function normalizeTerminalContextSelection( 2026-10-24T12:44:50.6569006Z ·  ────────────────┬──────────────── 2026-10-24T12:44:50.6569329Z · ╰── 'normalizeTerminalContextSelection' is declared here 2026-10-24T12:44:50.6569601Z 57 │ selection: TerminalContextSelection, 2026-10-24T12:44:50.6569763Z ╰──── 2026-10-24T12:44:50.6569921Z  help: Consider removing this declaration. 2026-10-24T12:44:50.6570043Z 2026-10-24T12:44:50.6570237Z ⚠ eslint(no-unused-vars): Identifier 'Fiber' is imported but never used. 2026-10-24T12:44:50.6570527Z ╭─[apps/server/src/ws.ts:10:13] 2026-10-24T12:44:50.6570722Z  9 │ import * as Effect from "effect/Effect"; 2026-10-24T12:44:50.6570911Z 10 │ import * as Fiber from "effect/Fiber"; 2026-10-24T12:44:50.6571089Z ·  ──┬── 2026-10-24T12:44:50.6571324Z · ╰── 'Fiber' is imported here 2026-10-24T12:44:50.6571569Z 11 │ import * as FileSystem from "effect/FileSystem"; 2026-10-24T12:44:50.6571739Z ╰──── 2026-10-24T12:44:50.6571891Z  help: Consider removing this import. 2026-10-24T12:44:50.6572005Z 2026-10-24T12:44:50.6572209Z ⚠ eslint(no-unused-vars): Identifier 'Schedule' is imported but never used. 2026-10-24T12:44:50.6572499Z ╭─[apps/server/src/ws.ts:17:13] 2026-10-24T12:44:50.6572711Z 16 │ import * as Ref from "effect/Ref"; 2026-10-24T12:44:50.6572904Z 17 │ import * as Schedule from "effect/Schedule"; 2026-10-24T12:44:50.6573093Z ·  ────┬─── 2026-10-24T12:44:50.6573325Z · ╰── 'Schedule' is imported here 2026-10-24T12:44:50.6573557Z 18 │ import * as Schema from "effect/Schema"; 2026-10-24T12:44:50.6573720Z ╰──── 2026-10-24T12:44:50.6573871Z  help: Consider removing this import. 2026-10-24T12:44:50.6573987Z 2026-10-24T12:44:50.6574295Z ⚠ eslint(no-unused-vars): Variable 'projectSetupScriptRunner' is declared but never used. Unused variables should start with a '_'. 2026-10-24T12:44:50.6574680Z ╭─[apps/server/src/ws.ts:1286:13] 2026-10-24T12:44:50.6574953Z 1285 │ const usageLimitSources = yield* UsageLimitSources.UsageLimitSources; 2026-10-24T12:44:50.6575319Z 1286 │ const projectSetupScriptRunner = yield* ProjectSetupScriptRunner.ProjectSetupScriptRunner; 2026-10-24T12:44:50.6575636Z ·  ────────────┬─────────── 2026-10-24T12:44:50.6575927Z · ╰── 'projectSetupScriptRunner' is declared here 2026-10-24T12:44:50.6576358Z 1287 │ const worktreeSetupTracker = yield* WorktreeSetupTracker.WorktreeSetupTracker; 2026-10-24T12:44:50.6576630Z ╰──── 2026-10-24T12:44:50.6576793Z  help: Consider removing this declaration. 2026-10-24T12:44:50.6576910Z 2026-10-24T12:44:50.6577403Z ⚠ 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-24T12:44:50.6578014Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7] 2026-10-24T12:44:50.6578292Z 565 │ let afterSequence = created[0]!.sequence; 2026-10-24T12:44:50.6578615Z 566 │ ╭─▶ for (let index = 1; index <= 32; index += 1) { 2026-10-24T12:44:50.6578915Z 567 │ │ const nextEvent = { 2026-10-24T12:44:50.6579199Z 568 │ │ id: EventId.make(`event:foundation-stream-race:${index}`), 2026-10-24T12:44:50.6579502Z 569 │ │ type: "thread.metadata-updated" as const, 2026-10-24T12:44:50.6579743Z 570 │ │ threadId, 2026-10-24T12:44:50.6579958Z 571 │ │ providerInstanceId, 2026-10-24T12:44:50.6580182Z 572 │ │ occurredAt: now, 2026-10-24T12:44:50.6580448Z 573 │ │ payload: { ...thread, title: `Race update ${index}` }, 2026-10-24T12:44:50.6580738Z 574 │ │ } satisfies OrchestrationV2DomainEvent; 2026-10-24T12:44:50.6580994Z 575 │ │ const reader = yield* eventSink 2026-10-24T12:44:50.6581251Z 576 │ │ .stream({ threadId, afterSequence }) 2026-10-24T12:44:50.6581528Z 577 │ │ .pipe(Stream.runHead, Effect.forkChild); 2026-10-24T12:44:50.6581779Z 578 │ │ yield* Effect.yieldNow; 2026-10-24T12:44:50.6582069Z 579 │ │ const written = yield* eventSink.write({ events: [nextEvent] }); 2026-10-24T12:44:50.6582371Z 580 │ │ const received = yield* Fiber.join(reader); 2026-10-24T12:44:50.6582632Z 581 │ │ if (Option.isNone(received)) { 2026-10-24T12:44:50.6582993Z 582 │ │ return yield* Effect.die("The event stream ended before delivering the live event."); 2026-10-24T12:44:50.6583278Z 583 │ │ } 2026-10-24T12:44:50.6583538Z 584 │ │ assert.equal(received.value.sequence, written[0]?.sequence); 2026-10-24T12:44:50.6583862Z 585 │ │ assert.equal(received.value.event.id, nextEvent.id); 2026-10-24T12:44:50.6584149Z 586 │ │ afterSequence = received.value.sequence; 2026-10-24T12:44:50.6584428Z 587 │ ╰─▶ } 2026-10-24T12:44:50.6584631Z 588 │ }), 2026-10-24T12:44:50.6584759Z ╰──── 2026-10-24T12:44:50.6584816Z 2026-10-24T12:44:50.6585301Z ⚠ 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-24T12:44:50.6585909Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:2327:9] 2026-10-24T12:44:50.6586168Z 2326 │ let settled = false; 2026-10-24T12:44:50.6586517Z 2327 │ ╭─▶ while (!settled) { 2026-10-24T12:44:50.6586885Z 2328 │ │ settled = (yield* outbox.listByCommandId(commandId)).every( 2026-10-24T12:44:50.6587194Z 2329 │ │ (effect) => effect.status === "succeeded", 2026-10-24T12:44:50.6587420Z 2330 │ │ ); 2026-10-24T12:44:50.6587653Z 2331 │ │ if (!settled) yield* Effect.yieldNow; 2026-10-24T12:44:50.6587934Z 2332 │ ╰─▶ } 2026-10-24T12:44:50.6588199Z 2333 │ }).pipe(Effect.provide(layerWorker), Effect.scoped); 2026-10-24T12:44:50.6588385Z ╰──── 2026-10-24T12:44:50.6588446Z 2026-10-24T12:44:50.6588885Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T12:44:50.6589220Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:121:27] 2026-10-24T12:44:50.6589537Z 120 │ const scope = makeScope(options.capabilities ?? new Set(["preview", "worktree"])); 2026-10-24T12:44:50.6589806Z 121 │ const dispatch = vi.fn((_: unknown) => 2026-10-24T12:44:50.6589999Z ·  ┬ 2026-10-24T12:44:50.6590239Z · ╰── '_' is declared here 2026-10-24T12:44:50.6590482Z 122 │ (options.dispatchGate ?? Effect.void).pipe( 2026-10-24T12:44:50.6590660Z ╰──── 2026-10-24T12:44:50.6590822Z  help: Consider removing this parameter. 2026-10-24T12:44:50.6590943Z 2026-10-24T12:44:50.6591132Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T12:44:50.6591462Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:134:39] 2026-10-24T12:44:50.6591677Z 133 │ ); 2026-10-24T12:44:50.6591848Z 134 │ const listLocalBranchNames = vi.fn((_: string) => 2026-10-24T12:44:50.6592073Z ·  ┬ 2026-10-24T12:44:50.6592328Z · ╰── '_' is declared here 2026-10-24T12:44:50.6592539Z 135 │ Effect.succeed( 2026-10-24T12:44:50.6592676Z ╰──── 2026-10-24T12:44:50.6592865Z  help: Consider removing this parameter. 2026-10-24T12:44:50.6592984Z 2026-10-24T12:44:50.6593173Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T12:44:50.6593494Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:178:31] 2026-10-24T12:44:50.6593700Z 177 │ }); 2026-10-24T12:44:50.6593877Z 178 │ const sendToThread = vi.fn((_: unknown) => { 2026-10-24T12:44:50.6594090Z ·  ┬ 2026-10-24T12:44:50.6594331Z · ╰── '_' is declared here 2026-10-24T12:44:50.6594573Z 179 │ switch (options.continuation ?? "queued") { 2026-10-24T12:44:50.6594742Z ╰──── 2026-10-24T12:44:50.6594904Z  help: Consider removing this parameter. 2026-10-24T12:44:50.6595019Z 2026-10-24T12:44:50.6595206Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T12:44:50.6595528Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:203:33] 2026-10-24T12:44:50.6595729Z 202 │ ); 2026-10-24T12:44:50.6595896Z 203 │ const removeWorktree = vi.fn((_: unknown) => 2026-10-24T12:44:50.6596205Z ·  ┬ 2026-10-24T12:44:50.6596501Z · ╰── '_' is declared here 2026-10-24T12:44:50.6596724Z 204 │ options.removeWorktreeFails 2026-10-24T12:44:50.6596877Z ╰──── 2026-10-24T12:44:50.6597036Z  help: Consider removing this parameter. 2026-10-24T12:44:50.6597156Z 2026-10-24T12:44:50.6597341Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T12:44:50.6597661Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:208:36] 2026-10-24T12:44:50.6597862Z 207 │ ); 2026-10-24T12:44:50.6598031Z 208 │ const deleteLocalBranch = vi.fn((_: unknown) => 2026-10-24T12:44:50.6598246Z ·  ┬ 2026-10-24T12:44:50.6598500Z · ╰── '_' is declared here 2026-10-24T12:44:50.6598729Z 209 │ options.deleteLocalBranchFails 2026-10-24T12:44:50.6598890Z ╰──── 2026-10-24T12:44:50.6599047Z  help: Consider removing this parameter. 2026-10-24T12:44:50.6599164Z 2026-10-24T12:44:50.6599351Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T12:44:50.6599672Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:213:42] 2026-10-24T12:44:50.6599874Z 212 │ ); 2026-10-24T12:44:50.6600056Z 213 │ const fetchWorktreeBaseCommit = vi.fn((_: unknown) => 2026-10-24T12:44:50.6600286Z ·  ┬ 2026-10-24T12:44:50.6600548Z · ╰── '_' is declared here 2026-10-24T12:44:50.6600775Z 214 │ options.fetchWorktreeBaseFails 2026-10-24T12:44:50.6600941Z ╰──── 2026-10-24T12:44:50.6601103Z  help: Consider removing this parameter. 2026-10-24T12:44:50.6601220Z 2026-10-24T12:44:50.6601406Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T12:44:50.6601725Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:254:30] 2026-10-24T12:44:50.6601930Z 253 │ ); 2026-10-24T12:44:50.6602086Z 254 │ const localStatus = vi.fn((_: unknown) => 2026-10-24T12:44:50.6602287Z ·  ┬ 2026-10-24T12:44:50.6602526Z · ╰── '_' is declared here 2026-10-24T12:44:50.6602750Z 255 │ Effect.succeed({ 2026-10-24T12:44:50.6602891Z ╰──── 2026-10-24T12:44:50.6603049Z  help: Consider removing this parameter. 2026-10-24T12:44:50.6603168Z 2026-10-24T12:44:50.6603360Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T12:44:50.6603684Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:264:32] 2026-10-24T12:44:50.6603890Z 263 │ ); 2026-10-24T12:44:50.6604109Z 264 │ const refreshStatus = vi.fn((_: string) => Effect.die("refreshStatus stub")); 2026-10-24T12:44:50.6604364Z ·  ┬ 2026-10-24T12:44:50.6604608Z · ╰── '_' is declared here 2026-10-24T12:44:50.6604896Z 265 │ const runForThread = vi.fn((input: { readonly worktreePath: string }) => { 2026-10-24T12:44:50.6605106Z ╰──── 2026-10-24T12:44:50.6605265Z  help: Consider removing this parameter. 2026-10-24T12:44:50.6605380Z 2026-10-24T12:44:50.6605666Z ⚠ eslint(no-unsafe-optional-chaining): Unsafe usage of optional chaining 2026-10-24T12:44:50.6606080Z ╭─[apps/server/src/orchestration-v2/ThreadLaunchService.test.ts:1783:8] 2026-10-24T12:44:50.6606318Z 1782 │ assert.equal( 2026-10-24T12:44:50.6606554Z 1783 │ (stored.context?.records[0] as { attachmentId: string }).attachmentId, 2026-10-24T12:44:50.6606816Z ·  ────────────────────────── 2026-10-24T12:44:50.6607012Z 1784 │ stored.attachments[0]?.id, 2026-10-24T12:44:50.6607168Z ╰──── 2026-10-24T12:44:50.6607401Z  help: If this short-circuits with 'undefined' the evaluation will throw TypeError 2026-10-24T12:44:50.6607579Z 2026-10-24T12:44:50.6607764Z ⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`. 2026-10-24T12:44:50.6608067Z ╭─[apps/web/src/terminal/ghostty/core.ts:194:19] 2026-10-24T12:44:50.6608338Z 193 │ const count = Math.min(CHUNK_SIZE, graphemeLength - start); 2026-10-24T12:44:50.6608572Z 194 │ const codes = new Array(count); 2026-10-24T12:44:50.6608795Z ·  ──────────────────────── 2026-10-24T12:44:50.6609017Z 195 │ for (let index = 0; index < count; index += 1) { 2026-10-24T12:44:50.6609192Z ╰──── 2026-10-24T12:44:50.6609679Z  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-24T12:44:50.6610072Z 2026-10-24T12:44:50.6610367Z ⚠ eslint(no-unused-vars): Variable 'layerUnavailable' is declared but never used. Unused variables should start with a '_'. 2026-10-24T12:44:50.6610791Z ╭─[apps/server/src/orchestration-v2/Orchestrator.ts:12380:7] 2026-10-24T12:44:50.6611010Z 12379 │ 2026-10-24T12:44:50.6611219Z 12380 │ const layerUnavailable: Layer.Layer = Layer.succeed( 2026-10-24T12:44:50.6611466Z ·  ────────┬─────── 2026-10-24T12:44:50.6611718Z · ╰── 'layerUnavailable' is declared here 2026-10-24T12:44:50.6611943Z 12381 │ OrchestratorV2, 2026-10-24T12:44:50.6612080Z ╰──── 2026-10-24T12:44:50.6612242Z  help: Consider removing this declaration. 2026-10-24T12:44:50.6612364Z 2026-10-24T12:44:50.6612598Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T12:44:50.6612988Z ╭─[scripts/lib/cli-external-packages.test.ts:114:11] 2026-10-24T12:44:50.6613200Z 113 │ const declared = { 2026-10-24T12:44:50.6613470Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-24T12:44:50.6613736Z ·  ──────────────────────────────── 2026-10-24T12:44:50.6613960Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T12:44:50.6614135Z ╰──── 2026-10-24T12:44:50.6614465Z  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-24T12:44:50.6614730Z 2026-10-24T12:44:50.6614956Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T12:44:50.6615302Z ╭─[scripts/lib/cli-external-packages.test.ts:115:11] 2026-10-24T12:44:50.6615535Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-24T12:44:50.6615750Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T12:44:50.6616006Z ·  ──────────────────────────────────────── 2026-10-24T12:44:50.6616241Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-24T12:44:50.6616412Z ╰──── 2026-10-24T12:44:50.6616739Z  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-24T12:44:50.6616998Z 2026-10-24T12:44:50.6617226Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T12:44:50.6617569Z ╭─[scripts/lib/cli-external-packages.test.ts:116:11] 2026-10-24T12:44:50.6617813Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T12:44:50.6618030Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-24T12:44:50.6618263Z ·  ──────────────────────────────────── 2026-10-24T12:44:50.6618458Z 117 │ }; 2026-10-24T12:44:50.6618587Z ╰──── 2026-10-24T12:44:50.6618912Z  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-24T12:44:50.6619171Z 2026-10-24T12:44:50.6619375Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T12:44:50.6619723Z ╭─[apps/mobile/src/state/use-thread-outbox-drain.ts:1321:5] 2026-10-24T12:44:50.6619957Z 1320 │ queuedMessagesByThreadKey, 2026-10-24T12:44:50.6620124Z 1321 │ retryTick, 2026-10-24T12:44:50.6620278Z ·  ────┬──── 2026-10-24T12:44:50.6620514Z · ╰── Unnecessary dependency `retryTick` 2026-10-24T12:44:50.6620735Z 1322 │ restoreQueuedMessage, 2026-10-24T12:44:50.6620882Z ╰──── 2026-10-24T12:44:50.6621244Z  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-24T12:44:50.6621862Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.6622166Z 2026-10-24T12:44:50.6622396Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T12:44:50.6622781Z ╭─[apps/mobile/src/state/use-model-option-memory.ts:21:7] 2026-10-24T12:44:50.6622996Z 20 │ [instanceId]: { 2026-10-24T12:44:50.6623163Z 21 │ ...(state[instanceId] ?? {}), 2026-10-24T12:44:50.6623366Z ·  ──────────────────────────── 2026-10-24T12:44:50.6623627Z 22 │ [model]: options, 2026-10-24T12:44:50.6623806Z ╰──── 2026-10-24T12:44:50.6624133Z  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-24T12:44:50.6624393Z 2026-10-24T12:44:50.6624660Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T12:44:50.6625077Z ╭─[apps/server/src/orchestration-v2/ThreadPullRequestService.ts:410:7] 2026-10-24T12:44:50.6625310Z 409 │ 2026-10-24T12:44:50.6625502Z 410 │ const layer = Layer.effect(ThreadPullRequestServiceV2, make); 2026-10-24T12:44:50.6625719Z ·  ──┬── 2026-10-24T12:44:50.6625933Z · ╰── 'layer' is declared here 2026-10-24T12:44:50.6626120Z ╰──── 2026-10-24T12:44:50.6626286Z  help: Consider removing this declaration. 2026-10-24T12:44:50.6626413Z 2026-10-24T12:44:50.6626586Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T12:44:50.6626905Z ╭─[apps/web/src/components/chat/useThreadLifecycle.tsx:178:58] 2026-10-24T12:44:50.6627176Z 177 │ if (snoozeClockState.shell !== activeThreadShell) { 2026-10-24T12:44:50.6627470Z 178 │ setSnoozeClockState({ shell: activeThreadShell, now: new Date().toISOString() }); 2026-10-24T12:44:50.6627772Z ·  ─────┬──── 2026-10-24T12:44:50.6628076Z · ╰── Cannot call impure function 2026-10-24T12:44:50.6628300Z 179 │ } 2026-10-24T12:44:50.6628415Z ╰──── 2026-10-24T12:44:50.6628827Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T12:44:50.6629406Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T12:44:50.6629694Z 2026-10-24T12:44:50.6629958Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T12:44:50.6630377Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10578:7] 2026-10-24T12:44:50.6630607Z 10577 │ 2026-10-24T12:44:50.6630741Z 10578 │ const layer: Layer.Layer< 2026-10-24T12:44:50.6630908Z ·  ──┬── 2026-10-24T12:44:50.6631127Z · ╰── 'layer' is declared here 2026-10-24T12:44:50.6631363Z 10579 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T12:44:50.6631535Z ╰──── 2026-10-24T12:44:50.6631700Z  help: Consider removing this declaration. 2026-10-24T12:44:50.6631821Z 2026-10-24T12:44:50.6632167Z ⚠ eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'. 2026-10-24T12:44:50.6632645Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1444:7] 2026-10-24T12:44:50.6632894Z 1443 │ 2026-10-24T12:44:50.6633073Z 1444 │ const layerCodexAppServerClientFactoryCommand = ( 2026-10-24T12:44:50.6633332Z ·  ───────────────────┬─────────────────── 2026-10-24T12:44:50.6633669Z · ╰── 'layerCodexAppServerClientFactoryCommand' is declared here 2026-10-24T12:44:50.6634106Z 1445 │ options: CodexClient.CodexAppServerClientOptions & { 2026-10-24T12:44:50.6634343Z ╰──── 2026-10-24T12:44:50.6634510Z  help: Consider removing this declaration. 2026-10-24T12:44:50.6634629Z 2026-10-24T12:44:50.6634898Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T12:44:50.6635314Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1680:7] 2026-10-24T12:44:50.6635540Z 1679 │ 2026-10-24T12:44:50.6635673Z 1680 │ const layer: Layer.Layer< 2026-10-24T12:44:50.6635841Z ·  ──┬── 2026-10-24T12:44:50.6636056Z · ╰── 'layer' is declared here 2026-10-24T12:44:50.6636286Z 1681 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T12:44:50.6636449Z ╰──── 2026-10-24T12:44:50.6636621Z  help: Consider removing this declaration. 2026-10-24T12:44:50.6636747Z 2026-10-24T12:44:50.6637006Z ⚠ eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used. 2026-10-24T12:44:50.6637440Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:960:10] 2026-10-24T12:44:50.6637678Z 959 │ 2026-10-24T12:44:50.6637853Z 960 │ function layerClaudeAgentSdkReplayQueryRunner( 2026-10-24T12:44:50.6638100Z ·  ──────────────────┬───────────────── 2026-10-24T12:44:50.6638426Z · ╰── 'layerClaudeAgentSdkReplayQueryRunner' is declared here 2026-10-24T12:44:50.6638724Z 961 │ transcript: ClaudeAgentSdkReplayTranscript, 2026-10-24T12:44:50.6638900Z ╰──── 2026-10-24T12:44:50.6639066Z  help: Consider removing this declaration. 2026-10-24T12:44:50.6639191Z 2026-10-24T12:44:50.6639677Z ⚠ 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-24T12:44:50.6640271Z ╭─[packages/client-runtime/src/connection/supervisor.test.ts:135:3] 2026-10-24T12:44:50.6640553Z 134 │ let lastState = yield* SubscriptionRef.get(state); 2026-10-24T12:44:50.6640905Z 135 │ ╭─▶ for (let iteration = 0; iteration < 100; iteration += 1) { 2026-10-24T12:44:50.6641250Z 136 │ │ lastState = yield* SubscriptionRef.get(state); 2026-10-24T12:44:50.6641508Z 137 │ │ if (predicate(lastState)) { 2026-10-24T12:44:50.6641738Z 138 │ │ return lastState; 2026-10-24T12:44:50.6641937Z 139 │ │ } 2026-10-24T12:44:50.6642139Z 140 │ │ yield* Effect.yieldNow; 2026-10-24T12:44:50.6642390Z 141 │ ╰─▶ } 2026-10-24T12:44:50.6642604Z 142 │ return yield* Effect.die( 2026-10-24T12:44:50.6642779Z ╰──── 2026-10-24T12:44:50.6642837Z 2026-10-24T12:44:50.6643070Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T12:44:50.6643468Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:1998:15] 2026-10-24T12:44:50.6643712Z 1997 │ assert.equal( 2026-10-24T12:44:50.6643955Z 1998 │ items.filter((item) => item.type === "assistant_message").at(-1)?.text, 2026-10-24T12:44:50.6644276Z ·  ────── 2026-10-24T12:44:50.6644498Z 1999 │ "authoritative answer", 2026-10-24T12:44:50.6644649Z ╰──── 2026-10-24T12:44:50.6644885Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T12:44:50.6654434Z 2026-10-24T12:44:50.6654948Z ⚠ 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-24T12:44:50.6655559Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:3951:7] 2026-10-24T12:44:50.6655925Z 3950 │ const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped); 2026-10-24T12:44:50.6656339Z 3951 │ ╭─▶ while (!responseLifecycle.includes("failed")) { 2026-10-24T12:44:50.6656659Z 3952 │ │ yield* Effect.yieldNow; 2026-10-24T12:44:50.6656926Z 3953 │ ╰─▶ } 2026-10-24T12:44:50.6657189Z 3954 │ const responseExit = yield* Fiber.join(responseFiber); 2026-10-24T12:44:50.6657378Z ╰──── 2026-10-24T12:44:50.6657437Z 2026-10-24T12:44:50.6657917Z ⚠ 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-24T12:44:50.6658522Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6062:9] 2026-10-24T12:44:50.6658788Z 6061 │ .pipe(Effect.forkScoped); 2026-10-24T12:44:50.6659093Z 6062 │ ╭─▶ while (promptGates.length < 1) { 2026-10-24T12:44:50.6659391Z 6063 │ │ yield* Effect.yieldNow; 2026-10-24T12:44:50.6659659Z 6064 │ ╰─▶ } 2026-10-24T12:44:50.6659974Z 6065 │ assert.isDefined(sessionUpdateHandler, "session update handler must be wired"); 2026-10-24T12:44:50.6660205Z ╰──── 2026-10-24T12:44:50.6660263Z 2026-10-24T12:44:50.6660737Z ⚠ 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-24T12:44:50.6661435Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6197:9] 2026-10-24T12:44:50.6661739Z 6196 │ .pipe(Effect.forkScoped); 2026-10-24T12:44:50.6662036Z 6197 │ ╭─▶ while (promptGates.length < 2) { 2026-10-24T12:44:50.6662326Z 6198 │ │ yield* Effect.yieldNow; 2026-10-24T12:44:50.6662588Z 6199 │ ╰─▶ } 2026-10-24T12:44:50.6662924Z 6200 │ if (sessionUpdateHandler === undefined || capturedMutation.current === null) { 2026-10-24T12:44:50.6663151Z ╰──── 2026-10-24T12:44:50.6663210Z 2026-10-24T12:44:50.6663385Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T12:44:50.6663695Z ╭─[apps/web/src/components/CustomSnoozeDialog.tsx:140:58] 2026-10-24T12:44:50.6663993Z 139 │ {...(weekStartsOn === undefined ? {} : { weekStartsOn })} 2026-10-24T12:44:50.6664289Z 140 │ disabled={{ before: new Date(new Date().setHours(0, 0, 0, 0)) }} 2026-10-24T12:44:50.6664575Z ·  ─────┬──── 2026-10-24T12:44:50.6664884Z · ╰── Cannot call impure function 2026-10-24T12:44:50.6665155Z 141 │ onSelect={(selected) => { 2026-10-24T12:44:50.6665324Z ╰──── 2026-10-24T12:44:50.6665675Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T12:44:50.6666257Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T12:44:50.6666554Z 2026-10-24T12:44:50.6666794Z ⚠ eslint(no-unneeded-ternary): Unnecessary use of boolean literals in conditional expression 2026-10-24T12:44:50.6667151Z ╭─[packages/shared/src/serverSettings.test.ts:35:7] 2026-10-24T12:44:50.6667479Z 34 │ const fallback = fallbackTextGenerationModelSelection(providerInstances, (instanceId) => 2026-10-24T12:44:50.6667770Z 35 │ instanceId === configured ? true : false, 2026-10-24T12:44:50.6668010Z ·  ──────────────────────────────────────── 2026-10-24T12:44:50.6668191Z 36 │ ); 2026-10-24T12:44:50.6668320Z ╰──── 2026-10-24T12:44:50.6668473Z  help: Remove this ternary operator 2026-10-24T12:44:50.6668671Z 2026-10-24T12:44:50.6668869Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T12:44:50.6669173Z ╭─[packages/shared/src/qrCode.ts:458:44] 2026-10-24T12:44:50.6669371Z 457 │ ): Array { 2026-10-24T12:44:50.6669563Z 458 │ let result: Array = divisor.map((_) => 0); 2026-10-24T12:44:50.6669788Z ·  ┬ 2026-10-24T12:44:50.6670054Z · ╰── '_' is declared here 2026-10-24T12:44:50.6670272Z 459 │ for (const b of data) { 2026-10-24T12:44:50.6670419Z ╰──── 2026-10-24T12:44:50.6670579Z  help: Consider removing this parameter. 2026-10-24T12:44:50.6670701Z 2026-10-24T12:44:50.6670874Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T12:44:50.6671178Z ╭─[apps/web/src/components/CommandPalette.tsx:2037:20] 2026-10-24T12:44:50.6671548Z 2036 │ title: inferProjectTitleFromPath(destinationPath), 2026-10-24T12:44:50.6671824Z 2037 │ createdAt: new Date().toISOString(), 2026-10-24T12:44:50.6672027Z ·  ─────┬──── 2026-10-24T12:44:50.6672276Z · ╰── Cannot call impure function 2026-10-24T12:44:50.6672532Z 2038 │ remoteUrl: addProjectCloneFlow.remoteUrl, 2026-10-24T12:44:50.6672728Z ╰──── 2026-10-24T12:44:50.6673075Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T12:44:50.6673643Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T12:44:50.6673932Z 2026-10-24T12:44:50.6674167Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T12:44:50.6674528Z ╭─[apps/mobile/src/state/use-composer-drafts.ts:1022:15] 2026-10-24T12:44:50.6674743Z 1021 │ instanceId, 2026-10-24T12:44:50.6674976Z 1022 │ { ...(persisted.modelOptionMemory[instanceId] ?? {}), ...models }, 2026-10-24T12:44:50.6675276Z ·  ────────────────────────────────────────────────── 2026-10-24T12:44:50.6675477Z 1023 │ ]), 2026-10-24T12:44:50.6675607Z ╰──── 2026-10-24T12:44:50.6675937Z  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-24T12:44:50.6676198Z 2026-10-24T12:44:50.6676357Z ⚠ react(immutability): This value cannot be modified 2026-10-24T12:44:50.6676689Z ╭─[apps/mobile/src/features/connection/ConnectionStatusDot.tsx:58:7] 2026-10-24T12:44:50.6676960Z 53 │ function usePulseAnimation(pulse: boolean) { 2026-10-24T12:44:50.6677175Z 54 │ const pulseProgress = useSharedValue(0); 2026-10-24T12:44:50.6677367Z ·  ──────┬────── 2026-10-24T12:44:50.6677609Z · ╰── `pulseProgress` originates here 2026-10-24T12:44:50.6677810Z 55 │ 2026-10-24T12:44:50.6677936Z 56 │ useEffect(() => { 2026-10-24T12:44:50.6678083Z 57 │ if (pulse) { 2026-10-24T12:44:50.6678251Z 58 │ pulseProgress.value = withRepeat( 2026-10-24T12:44:50.6678437Z ·  ──────┬────── 2026-10-24T12:44:50.6678678Z · ╰── `pulseProgress` cannot be modified 2026-10-24T12:44:50.6678894Z 59 │ withTiming(1, { 2026-10-24T12:44:50.6679042Z ╰──── 2026-10-24T12:44:50.6679373Z  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-24T12:44:50.6679942Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T12:44:50.6680240Z 2026-10-24T12:44:50.6680449Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T12:44:50.6680766Z ╭─[apps/mobile/src/state/thread-order.ts:29:7] 2026-10-24T12:44:50.6680973Z 28 │ getPendingThreadOrder(); 2026-10-24T12:44:50.6681147Z 29 │ }, [nowMinute, snoozeWakeTick]); 2026-10-24T12:44:50.6681377Z ·  ────┬──── ───────┬────── 2026-10-24T12:44:50.6681785Z · │ ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T12:44:50.6682153Z · ╰── Unnecessary dependency `nowMinute` 2026-10-24T12:44:50.6682364Z 30 │ return pending; 2026-10-24T12:44:50.6682499Z ╰──── 2026-10-24T12:44:50.6682874Z  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-24T12:44:50.6683482Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.6683783Z 2026-10-24T12:44:50.6683981Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T12:44:50.6684365Z ╭─[apps/web/src/components/pullRequest/PullRequestChecksPopover.tsx:88:15] 2026-10-24T12:44:50.6684612Z 87 │
  • Date.now()); 2026-10-24T12:44:50.6686950Z 84 │ useEffect(() => { 2026-10-24T12:44:50.6687108Z ·  ────┬──── 2026-10-24T12:44:50.6687326Z · ╰── This is the containing effect 2026-10-24T12:44:50.6687553Z 85 │ if (!actionState.isRunning) return; 2026-10-24T12:44:50.6687725Z 86 │ setNowMs(Date.now()); 2026-10-24T12:44:50.6687885Z ·  ────┬─── 2026-10-24T12:44:50.6688142Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.6688438Z 87 │ const interval = setInterval(() => setNowMs(Date.now()), 1000); 2026-10-24T12:44:50.6688628Z ╰──── 2026-10-24T12:44:50.6689310Z  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-24T12:44:50.6690198Z  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-24T12:44:50.6690513Z 2026-10-24T12:44:50.6690758Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-24T12:44:50.6691157Z ╭─[apps/web/src/components/pullRequest/pullRequestList.logic.ts:262:9] 2026-10-24T12:44:50.6691399Z 261 │ ): boolean { 2026-10-24T12:44:50.6691634Z 262 │ const labels = entry.labels.map((label) => label.name.trim().toLowerCase()); 2026-10-24T12:44:50.6691975Z ·  ───────────────────────────────────────────────────────────────────── 2026-10-24T12:44:50.6692366Z 263 │ const holds = (label: string) => labels.includes(label.trim().toLowerCase()); 2026-10-24T12:44:50.6692620Z ╰──── 2026-10-24T12:44:50.6692780Z  help: Switch to `Set` 2026-10-24T12:44:50.6692881Z 2026-10-24T12:44:50.6693098Z ⚠ eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used. 2026-10-24T12:44:50.6693410Z ╭─[infra/relay/src/http/Api.ts:69:13] 2026-10-24T12:44:50.6693671Z 68 │ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts"; 2026-10-24T12:44:50.6693944Z 69 │ import * as HookForwarder from "../hooks/HookForwarder.ts"; 2026-10-24T12:44:50.6694167Z ·  ──────┬────── 2026-10-24T12:44:50.6694416Z · ╰── 'HookForwarder' is imported here 2026-10-24T12:44:50.6694674Z 70 │ import * as HeldHooks from "../hooks/HeldHooks.ts"; 2026-10-24T12:44:50.6694851Z ╰──── 2026-10-24T12:44:50.6695006Z  help: Consider removing this import. 2026-10-24T12:44:50.6695126Z 2026-10-24T12:44:50.6695404Z ⚠ eslint(no-unused-vars): Variable 'claudeCaps' is declared but never used. Unused variables should start with a '_'. 2026-10-24T12:44:50.6695776Z ╭─[packages/shared/src/model.test.ts:36:7] 2026-10-24T12:44:50.6695956Z 35 │ 2026-10-24T12:44:50.6696150Z 36 │ const claudeCaps: ModelCapabilities = createModelCapabilities({ 2026-10-24T12:44:50.6696376Z ·  ─────┬──── 2026-10-24T12:44:50.6696604Z · ╰── 'claudeCaps' is declared here 2026-10-24T12:44:50.6696817Z 37 │ optionDescriptors: [ 2026-10-24T12:44:50.6696959Z ╰──── 2026-10-24T12:44:50.6697130Z  help: Consider removing this declaration. 2026-10-24T12:44:50.6697256Z 2026-10-24T12:44:50.6697524Z ⚠ unicorn(prefer-add-event-listener): Prefer `addEventListener()` over their `on`-function counterparts. 2026-10-24T12:44:50.6698013Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:12:14] 2026-10-24T12:44:50.6698326Z 11 │ addEventListener(_type: string, listener: (event: { data: string }) => void) { 2026-10-24T12:44:50.6698576Z 12 │ this.onmessage = listener; 2026-10-24T12:44:50.6698761Z ·  ───────── 2026-10-24T12:44:50.6698918Z 13 │ } 2026-10-24T12:44:50.6699036Z ╰──── 2026-10-24T12:44:50.6699420Z  help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on` replaces any previously registered handler. 2026-10-24T12:44:50.6699720Z 2026-10-24T12:44:50.6700015Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-24T12:44:50.6700409Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:16:9] 2026-10-24T12:44:50.6700631Z 15 │ constructor() { 2026-10-24T12:44:50.6700787Z 16 │ source = this; 2026-10-24T12:44:50.6700946Z ·  ────── 2026-10-24T12:44:50.6701089Z 17 │ } 2026-10-24T12:44:50.6701210Z ╰──── 2026-10-24T12:44:50.6701544Z  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-24T12:44:50.6701813Z 2026-10-24T12:44:50.6702300Z ⚠ 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-24T12:44:50.6702893Z ╭─[packages/effect-acp/src/protocol.test.ts:500:31] 2026-10-24T12:44:50.6703084Z 499 │ 2026-10-24T12:44:50.6703263Z 500 │ const response = yield* Schema.decodeUnknownEffect( 2026-10-24T12:44:50.6703524Z ·  ────────────────────────── 2026-10-24T12:44:50.6703764Z 501 │ Schema.fromJsonString(JsonRpcErrorResponse), 2026-10-24T12:44:50.6703944Z ╰──── 2026-10-24T12:44:50.6704003Z 2026-10-24T12:44:50.6704389Z ⚠ 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-24T12:44:50.6704855Z ╭─[packages/effect-acp/src/client.ts:1269:11] 2026-10-24T12:44:50.6705146Z 1268 │ extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) => 2026-10-24T12:44:50.6705493Z 1269 │ Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe( 2026-10-24T12:44:50.6705784Z ·  ────────────────────────── 2026-10-24T12:44:50.6706047Z 1270 │ Effect.mapError(() => AcpError.AcpRequestError.invalidParams()), 2026-10-24T12:44:50.6706259Z ╰──── 2026-10-24T12:44:50.6706317Z 2026-10-24T12:44:50.6706794Z ⚠ 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-24T12:44:50.6707340Z ╭─[packages/effect-acp/src/errors.test.ts:129:28] 2026-10-24T12:44:50.6707571Z 128 │ const secret = "acp-summary-secret"; 2026-10-24T12:44:50.6707801Z 129 │ const cause = yield* Schema.decodeUnknownEffect( 2026-10-24T12:44:50.6708055Z ·  ────────────────────────── 2026-10-24T12:44:50.6708246Z 130 │ Schema.Struct({ 2026-10-24T12:44:50.6708388Z ╰──── 2026-10-24T12:44:50.6708444Z 2026-10-24T12:44:50.6708847Z ⚠ 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-24T12:44:50.6709282Z ╭─[packages/effect-acp/src/schema.test.ts:18:12] 2026-10-24T12:44:50.6709577Z 17 │ const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } }; 2026-10-24T12:44:50.6709871Z 18 │ expect(Schema.is(V1.AvailableCommand)(command)).toBe(true); 2026-10-24T12:44:50.6710091Z ·  ───────── 2026-10-24T12:44:50.6710247Z 19 │ expect( 2026-10-24T12:44:50.6710473Z ╰──── 2026-10-24T12:44:50.6710586Z 2026-10-24T12:44:50.6710925Z ⚠ 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-24T12:44:50.6711358Z ╭─[packages/effect-acp/src/schema.test.ts:20:7] 2026-10-24T12:44:50.6711546Z 19 │ expect( 2026-10-24T12:44:50.6711789Z 20 │ Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }), 2026-10-24T12:44:50.6712038Z ·  ───────── 2026-10-24T12:44:50.6712195Z 21 │ ).toBe(true); 2026-10-24T12:44:50.6712328Z ╰──── 2026-10-24T12:44:50.6712385Z 2026-10-24T12:44:50.6712616Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T12:44:50.6712984Z ╭─[packages/shared/src/serverSettings.ts:346:9] 2026-10-24T12:44:50.6713227Z 345 │ const entry: ProjectSettingsOverrides = { 2026-10-24T12:44:50.6713481Z 346 │ ...(entries.get(projectId) ?? currentEntries[projectId] ?? {}), 2026-10-24T12:44:50.6713787Z ·  ────────────────────────────────────────────────────────────── 2026-10-24T12:44:50.6713997Z 347 │ }; 2026-10-24T12:44:50.6714118Z ╰──── 2026-10-24T12:44:50.6714451Z  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-24T12:44:50.6714715Z 2026-10-24T12:44:50.6714939Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in Array.prototype.reduce() 2026-10-24T12:44:50.6715276Z ╭─[packages/shared/src/serverSettings.ts:448:24] 2026-10-24T12:44:50.6715474Z 447 │ const favorites = 2026-10-24T12:44:50.6715677Z 448 │ setModelFavorites?.reduce((current, change) => { 2026-10-24T12:44:50.6715896Z ·  ───┬── 2026-10-24T12:44:50.6716132Z · ╰── For this reduce 2026-10-24T12:44:50.6716347Z 449 │ const exists = current.some( 2026-10-24T12:44:50.6716631Z 450 │ (favorite) => favorite.provider === change.provider && favorite.model === change.model, 2026-10-24T12:44:50.6716870Z 451 │ ); 2026-10-24T12:44:50.6717016Z 452 │ return change.favorite 2026-10-24T12:44:50.6717172Z 453 │ ? exists 2026-10-24T12:44:50.6717316Z 454 │ ? current 2026-10-24T12:44:50.6717536Z 455 │ : [...current, { provider: change.provider, model: change.model }] 2026-10-24T12:44:50.6717769Z ·  ─────┬──── 2026-10-24T12:44:50.6718002Z · ╰── From this spread 2026-10-24T12:44:50.6718203Z 456 │ : current.filter( 2026-10-24T12:44:50.6718345Z ╰──── 2026-10-24T12:44:50.6718612Z  help: Consider using `Object.assign()` or `Array.prototype.push()` to mutate the accumulator instead. 2026-10-24T12:44:50.6718988Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T12:44:50.6719162Z 2026-10-24T12:44:50.6719357Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-24T12:44:50.6719666Z ╭─[packages/shared/src/serverSettings.ts:466:3] 2026-10-24T12:44:50.6719858Z 464 │ null; 2026-10-24T12:44:50.6720050Z 465 │ let nextModelPreferences = initialModelPreferences; 2026-10-24T12:44:50.6720274Z ·  ──────────┬───────── 2026-10-24T12:44:50.6720577Z · ╰── From this accumulator 2026-10-24T12:44:50.6720853Z 466 │ for (const change of setModelsHidden ?? []) { 2026-10-24T12:44:50.6721044Z ·  ─┬─ 2026-10-24T12:44:50.6721232Z · ╰── For this loop 2026-10-24T12:44:50.6721488Z 467 │ const preferences = nextModelPreferences?.[change.provider] ?? { 2026-10-24T12:44:50.6721713Z 468 │ hiddenModels: [], 2026-10-24T12:44:50.6721869Z 469 │ modelOrder: [], 2026-10-24T12:44:50.6722014Z 470 │ }; 2026-10-24T12:44:50.6722264Z 471 │ const hiddenModels = preferences.hiddenModels.filter((model) => model !== change.model); 2026-10-24T12:44:50.6722569Z 472 │ if (change.hidden) hiddenModels.push(change.model); 2026-10-24T12:44:50.6722794Z 473 │ nextModelPreferences = { 2026-10-24T12:44:50.6722970Z 474 │ ...nextModelPreferences, 2026-10-24T12:44:50.6723173Z ·  ───────────┬─────────── 2026-10-24T12:44:50.6723415Z · ╰── From this spread 2026-10-24T12:44:50.6723662Z 475 │ [change.provider]: { ...preferences, hiddenModels }, 2026-10-24T12:44:50.6723843Z ╰──── 2026-10-24T12:44:50.6724062Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-24T12:44:50.6724388Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T12:44:50.6724556Z 2026-10-24T12:44:50.6724707Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.6724981Z ╭─[apps/mobile/src/native/StackHeader.tsx:185:9] 2026-10-24T12:44:50.6725181Z 184 │ "options", 2026-10-24T12:44:50.6725360Z 185 │ latestOptionFunctionsRef.current, 2026-10-24T12:44:50.6725594Z ·  ────────────────┬─────────────── 2026-10-24T12:44:50.6725917Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T12:44:50.6726211Z 186 │ optionFunctionWrappersRef.current, 2026-10-24T12:44:50.6726378Z ╰──── 2026-10-24T12:44:50.6726921Z  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-24T12:44:50.6727661Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.6727953Z 2026-10-24T12:44:50.6728108Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.6728384Z ╭─[apps/mobile/src/native/StackHeader.tsx:186:9] 2026-10-24T12:44:50.6728611Z 185 │ latestOptionFunctionsRef.current, 2026-10-24T12:44:50.6728820Z 186 │ optionFunctionWrappersRef.current, 2026-10-24T12:44:50.6729050Z ·  ────────────────┬──────────────── 2026-10-24T12:44:50.6729367Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T12:44:50.6729652Z 187 │ ) as NativeStackNavigationOptions) 2026-10-24T12:44:50.6729816Z ╰──── 2026-10-24T12:44:50.6730431Z  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-24T12:44:50.6731205Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.6731496Z 2026-10-24T12:44:50.6731700Z ⚠ eslint(no-unused-vars): Identifier 'Image' is imported but never used. 2026-10-24T12:44:50.6732048Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:17:10] 2026-10-24T12:44:50.6732349Z 16 │ import type { NativeSyntheticEvent, ViewProps } from "react-native"; 2026-10-24T12:44:50.6732620Z 17 │ import { Image, Platform, StyleSheet } from "react-native"; 2026-10-24T12:44:50.6732864Z ·  ──┬── 2026-10-24T12:44:50.6733085Z · ╰── 'Image' is imported here 2026-10-24T12:44:50.6733277Z 18 │ 2026-10-24T12:44:50.6733390Z ╰──── 2026-10-24T12:44:50.6733501Z  help: Consider removing this import. 2026-10-24T12:44:50.6733509Z 2026-10-24T12:44:50.6733721Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T12:44:50.6733867Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:229:6] 2026-10-24T12:44:50.6734038Z 225 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-24T12:44:50.6734134Z 226 │ nativeEventSnapshotsRef.current, 2026-10-24T12:44:50.6734232Z ·  ───────────┬─────────── 2026-10-24T12:44:50.6734709Z · ╰── 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-24T12:44:50.6734791Z 227 │ mostRecentEventCount, 2026-10-24T12:44:50.6734855Z 228 │ ); 2026-10-24T12:44:50.6734984Z 229 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-24T12:44:50.6735126Z ·  ──────────────────────────┬────────────────────────── 2026-10-24T12:44:50.6735337Z · ╰── This dependency list is missing values used by the callback 2026-10-24T12:44:50.6735424Z 230 │ const assumedValue = props.value; 2026-10-24T12:44:50.6735478Z ╰──── 2026-10-24T12:44:50.6735649Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T12:44:50.6735973Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.6735976Z 2026-10-24T12:44:50.6736261Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T12:44:50.6736445Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:237:7] 2026-10-24T12:44:50.6736594Z 236 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-24T12:44:50.6736685Z 237 │ nativeEventSnapshotsRef.current, 2026-10-24T12:44:50.6736782Z ·  ───────────┬─────────── 2026-10-24T12:44:50.6737258Z · ╰── 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-24T12:44:50.6737333Z 238 │ controlledEventCount, 2026-10-24T12:44:50.6737400Z 239 │ assumedValue, 2026-10-24T12:44:50.6737466Z 240 │ ); 2026-10-24T12:44:50.6737634Z 241 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-24T12:44:50.6737779Z ·  ───────────┬────────── 2026-10-24T12:44:50.6737997Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-24T12:44:50.6738089Z 242 │ const acceptNativeEvent = useCallback( 2026-10-24T12:44:50.6738144Z ╰──── 2026-10-24T12:44:50.6738589Z  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-24T12:44:50.6738919Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.6738925Z 2026-10-24T12:44:50.6739073Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.6739224Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29] 2026-10-24T12:44:50.6739352Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T12:44:50.6739470Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T12:44:50.6739593Z ·  ─────────────┬──────────── 2026-10-24T12:44:50.6739769Z · ╰── Cannot access ref value during render 2026-10-24T12:44:50.6739830Z 163 │ }); 2026-10-24T12:44:50.6739886Z ╰──── 2026-10-24T12:44:50.6740376Z  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-24T12:44:50.6740681Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.6740684Z 2026-10-24T12:44:50.6740834Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.6740984Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29] 2026-10-24T12:44:50.6741111Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T12:44:50.6741225Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T12:44:50.6741348Z ·  ─────────────┬──────────── 2026-10-24T12:44:50.6741632Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T12:44:50.6741729Z 163 │ }); 2026-10-24T12:44:50.6741783Z ╰──── 2026-10-24T12:44:50.6742265Z  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-24T12:44:50.6742566Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.6742569Z 2026-10-24T12:44:50.6742737Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.6742890Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:164:23] 2026-10-24T12:44:50.6742951Z 163 │ }); 2026-10-24T12:44:50.6743046Z 164 │ confirmedTokensRef.current = tokens; 2026-10-24T12:44:50.6743177Z ·  ─────────┬────────────┬─── 2026-10-24T12:44:50.6743378Z · │ ╰── Cannot update ref value during render 2026-10-24T12:44:50.6743498Z · ╰── This value is a ref 2026-10-24T12:44:50.6743575Z 165 │ return JSON.stringify( 2026-10-24T12:44:50.6743631Z ╰──── 2026-10-24T12:44:50.6744111Z  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-24T12:44:50.6744416Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.6744425Z 2026-10-24T12:44:50.6744571Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.6744718Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:206:5] 2026-10-24T12:44:50.6744794Z 205 │ mostRecentEventCount, 2026-10-24T12:44:50.6744887Z 206 │ nativeEventSnapshotsRef.current, 2026-10-24T12:44:50.6744997Z ·  ───────────────┬─────────────── 2026-10-24T12:44:50.6745193Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T12:44:50.6745253Z 207 │ ); 2026-10-24T12:44:50.6745306Z ╰──── 2026-10-24T12:44:50.6745791Z  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-24T12:44:50.6746096Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.6746099Z 2026-10-24T12:44:50.6746247Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.6746394Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:212:5] 2026-10-24T12:44:50.6746466Z 211 │ mostRecentEventCount, 2026-10-24T12:44:50.6746559Z 212 │ nativeEventSnapshotsRef.current, 2026-10-24T12:44:50.6746669Z ·  ───────────────┬─────────────── 2026-10-24T12:44:50.6746925Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T12:44:50.6747019Z 213 │ ); 2026-10-24T12:44:50.6747075Z ╰──── 2026-10-24T12:44:50.6747554Z  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-24T12:44:50.6747856Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.6747859Z 2026-10-24T12:44:50.6748055Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T12:44:50.6748205Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:197:6] 2026-10-24T12:44:50.6748333Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T12:44:50.6748453Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T12:44:50.6748624Z ·  ─────────┬──────── 2026-10-24T12:44:50.6749108Z · ╰── 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-24T12:44:50.6749169Z 163 │ }); 2026-10-24T12:44:50.6749264Z 164 │ confirmedTokensRef.current = tokens; 2026-10-24T12:44:50.6749339Z 165 │ return JSON.stringify( 2026-10-24T12:44:50.6749508Z 166 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-24T12:44:50.6749584Z 167 │ const record = 2026-10-24T12:44:50.6749670Z 168 │ token.type === "context" 2026-10-24T12:44:50.6749844Z 169 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-24T12:44:50.6749911Z 170 │ : undefined; 2026-10-24T12:44:50.6750023Z 171 │ const presentation = contextChipPresentation( 2026-10-24T12:44:50.6750137Z 172 │ token.type === "context" ? token.kind : token.type, 2026-10-24T12:44:50.6750204Z 173 │ record, 2026-10-24T12:44:50.6750263Z 174 │ ); 2026-10-24T12:44:50.6750351Z 175 │ const icon = contextChipIcon( 2026-10-24T12:44:50.6750422Z 176 │ presentation, 2026-10-24T12:44:50.6750570Z 177 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-24T12:44:50.6750629Z 178 │ ); 2026-10-24T12:44:50.6750695Z 179 │ return { 2026-10-24T12:44:50.6750775Z 180 │ type: token.type, 2026-10-24T12:44:50.6750855Z 181 │ source: token.source, 2026-10-24T12:44:50.6750929Z 182 │ start: token.start, 2026-10-24T12:44:50.6751000Z 183 │ end: token.end, 2026-10-24T12:44:50.6751155Z 184 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-24T12:44:50.6751219Z 185 │ label: 2026-10-24T12:44:50.6751298Z 186 │ token.type === "skill" 2026-10-24T12:44:50.6751409Z 187 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-24T12:44:50.6751495Z 188 │ : token.type === "context" 2026-10-24T12:44:50.6751741Z 189 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-24T12:44:50.6751826Z 190 │ : basename(token.value), 2026-10-24T12:44:50.6752059Z 191 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-24T12:44:50.6752205Z 192 │ iconUri: contextChipIconUri(icon), 2026-10-24T12:44:50.6752296Z 193 │ tintsIcon: icon.kind === "chip", 2026-10-24T12:44:50.6752355Z 194 │ }; 2026-10-24T12:44:50.6752417Z 195 │ }), 2026-10-24T12:44:50.6752476Z 196 │ ); 2026-10-24T12:44:50.6752614Z 197 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-24T12:44:50.6752811Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-24T12:44:50.6753028Z · ╰── This dependency list is missing values used by the callback 2026-10-24T12:44:50.6753172Z 198 │ // Every render resolves against the snapshot history, so a render whose 2026-10-24T12:44:50.6753234Z ╰──── 2026-10-24T12:44:50.6753450Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T12:44:50.6753789Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.6753792Z 2026-10-24T12:44:50.6753988Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T12:44:50.6754136Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:259:5] 2026-10-24T12:44:50.6754270Z 251 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-24T12:44:50.6754375Z 252 │ nativeEventSnapshotsRef.current.push({ 2026-10-24T12:44:50.6754471Z ·  ───────────┬─────────── 2026-10-24T12:44:50.6754952Z · ╰── 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-24T12:44:50.6755051Z 253 │ eventCount: acknowledgedEventCount, 2026-10-24T12:44:50.6755113Z 254 │ value, 2026-10-24T12:44:50.6755195Z 255 │ selection: nextSelection, 2026-10-24T12:44:50.6755257Z 256 │ }); 2026-10-24T12:44:50.6755343Z 257 │ return acknowledgedEventCount; 2026-10-24T12:44:50.6755399Z 258 │ }, 2026-10-24T12:44:50.6755456Z 259 │ [], 2026-10-24T12:44:50.6755528Z ·  ─┬ 2026-10-24T12:44:50.6755713Z · ╰── This dependency list is missing values used by the callback 2026-10-24T12:44:50.6755770Z 260 │ ); 2026-10-24T12:44:50.6755886Z ╰──── 2026-10-24T12:44:50.6756137Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T12:44:50.6756482Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.6756484Z 2026-10-24T12:44:50.6756717Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T12:44:50.6756866Z ╭─[packages/client-runtime/src/operations/projects.ts:238:51] 2026-10-24T12:44:50.6756930Z 237 │ ): string { 2026-10-24T12:44:50.6757090Z 238 │ const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? ""; 2026-10-24T12:44:50.6757205Z ·  ────── 2026-10-24T12:44:50.6757347Z 239 │ return target.owner ? `${target.owner}/${folderName}` : folderName; 2026-10-24T12:44:50.6757408Z ╰──── 2026-10-24T12:44:50.6757584Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T12:44:50.6757587Z 2026-10-24T12:44:50.6757797Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T12:44:50.6757938Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:231:6] 2026-10-24T12:44:50.6758106Z 227 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-24T12:44:50.6758201Z 228 │ nativeEventSnapshotsRef.current, 2026-10-24T12:44:50.6758295Z ·  ───────────┬─────────── 2026-10-24T12:44:50.6758773Z · ╰── 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-24T12:44:50.6758852Z 229 │ mostRecentEventCount, 2026-10-24T12:44:50.6758912Z 230 │ ); 2026-10-24T12:44:50.6759040Z 231 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-24T12:44:50.6759178Z ·  ──────────────────────────┬────────────────────────── 2026-10-24T12:44:50.6759387Z · ╰── This dependency list is missing values used by the callback 2026-10-24T12:44:50.6759474Z 232 │ const assumedValue = props.value; 2026-10-24T12:44:50.6759530Z ╰──── 2026-10-24T12:44:50.6759701Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T12:44:50.6760052Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.6760060Z 2026-10-24T12:44:50.6760284Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T12:44:50.6760424Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:239:7] 2026-10-24T12:44:50.6760571Z 238 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-24T12:44:50.6760666Z 239 │ nativeEventSnapshotsRef.current, 2026-10-24T12:44:50.6760761Z ·  ───────────┬─────────── 2026-10-24T12:44:50.6761233Z · ╰── 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-24T12:44:50.6761372Z 240 │ controlledEventCount, 2026-10-24T12:44:50.6761475Z 241 │ assumedValue, 2026-10-24T12:44:50.6761535Z 242 │ ); 2026-10-24T12:44:50.6761696Z 243 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-24T12:44:50.6761841Z ·  ───────────┬────────── 2026-10-24T12:44:50.6762057Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-24T12:44:50.6762150Z 244 │ const acceptNativeEvent = useCallback( 2026-10-24T12:44:50.6762205Z ╰──── 2026-10-24T12:44:50.6762644Z  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-24T12:44:50.6762989Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.6762995Z 2026-10-24T12:44:50.6763143Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.6763285Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29] 2026-10-24T12:44:50.6763413Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T12:44:50.6763531Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T12:44:50.6763652Z ·  ─────────────┬──────────── 2026-10-24T12:44:50.6763829Z · ╰── Cannot access ref value during render 2026-10-24T12:44:50.6763893Z 165 │ }); 2026-10-24T12:44:50.6763953Z ╰──── 2026-10-24T12:44:50.6764431Z  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-24T12:44:50.6764734Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.6764737Z 2026-10-24T12:44:50.6764885Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.6765027Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29] 2026-10-24T12:44:50.6765152Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T12:44:50.6765272Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T12:44:50.6765398Z ·  ─────────────┬──────────── 2026-10-24T12:44:50.6765614Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T12:44:50.6765673Z 165 │ }); 2026-10-24T12:44:50.6765725Z ╰──── 2026-10-24T12:44:50.6766209Z  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-24T12:44:50.6766515Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.6766517Z 2026-10-24T12:44:50.6766723Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.6766895Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:166:23] 2026-10-24T12:44:50.6766954Z 165 │ }); 2026-10-24T12:44:50.6767048Z 166 │ confirmedTokensRef.current = tokens; 2026-10-24T12:44:50.6767179Z ·  ─────────┬────────────┬─── 2026-10-24T12:44:50.6767373Z · │ ╰── Cannot update ref value during render 2026-10-24T12:44:50.6767494Z · ╰── This value is a ref 2026-10-24T12:44:50.6767570Z 167 │ return JSON.stringify( 2026-10-24T12:44:50.6767627Z ╰──── 2026-10-24T12:44:50.6768108Z  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-24T12:44:50.6768413Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.6768416Z 2026-10-24T12:44:50.6768565Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.6768705Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:208:5] 2026-10-24T12:44:50.6768780Z 207 │ mostRecentEventCount, 2026-10-24T12:44:50.6768869Z 208 │ nativeEventSnapshotsRef.current, 2026-10-24T12:44:50.6768978Z ·  ───────────────┬─────────────── 2026-10-24T12:44:50.6769179Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T12:44:50.6769242Z 209 │ ); 2026-10-24T12:44:50.6769295Z ╰──── 2026-10-24T12:44:50.6769773Z  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-24T12:44:50.6770073Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.6770075Z 2026-10-24T12:44:50.6770224Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.6770363Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:214:5] 2026-10-24T12:44:50.6770435Z 213 │ mostRecentEventCount, 2026-10-24T12:44:50.6770529Z 214 │ nativeEventSnapshotsRef.current, 2026-10-24T12:44:50.6770640Z ·  ───────────────┬─────────────── 2026-10-24T12:44:50.6770835Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T12:44:50.6770890Z 215 │ ); 2026-10-24T12:44:50.6770945Z ╰──── 2026-10-24T12:44:50.6771422Z  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-24T12:44:50.6771722Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.6771724Z 2026-10-24T12:44:50.6771975Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T12:44:50.6772147Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:199:6] 2026-10-24T12:44:50.6772275Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T12:44:50.6772390Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T12:44:50.6772504Z ·  ─────────┬──────── 2026-10-24T12:44:50.6773003Z · ╰── 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-24T12:44:50.6773063Z 165 │ }); 2026-10-24T12:44:50.6773159Z 166 │ confirmedTokensRef.current = tokens; 2026-10-24T12:44:50.6773233Z 167 │ return JSON.stringify( 2026-10-24T12:44:50.6773406Z 168 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-24T12:44:50.6773482Z 169 │ const record = 2026-10-24T12:44:50.6773565Z 170 │ token.type === "context" 2026-10-24T12:44:50.6773733Z 171 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-24T12:44:50.6773803Z 172 │ : undefined; 2026-10-24T12:44:50.6773915Z 173 │ const presentation = contextChipPresentation( 2026-10-24T12:44:50.6774030Z 174 │ token.type === "context" ? token.kind : token.type, 2026-10-24T12:44:50.6774097Z 175 │ record, 2026-10-24T12:44:50.6774157Z 176 │ ); 2026-10-24T12:44:50.6774245Z 177 │ const icon = contextChipIcon( 2026-10-24T12:44:50.6774315Z 178 │ presentation, 2026-10-24T12:44:50.6774468Z 179 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-24T12:44:50.6774531Z 180 │ ); 2026-10-24T12:44:50.6774596Z 181 │ return { 2026-10-24T12:44:50.6774670Z 182 │ type: token.type, 2026-10-24T12:44:50.6774747Z 183 │ source: token.source, 2026-10-24T12:44:50.6774821Z 184 │ start: token.start, 2026-10-24T12:44:50.6774894Z 185 │ end: token.end, 2026-10-24T12:44:50.6775049Z 186 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-24T12:44:50.6775110Z 187 │ label: 2026-10-24T12:44:50.6775191Z 188 │ token.type === "skill" 2026-10-24T12:44:50.6775302Z 189 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-24T12:44:50.6775389Z 190 │ : token.type === "context" 2026-10-24T12:44:50.6775692Z 191 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-24T12:44:50.6775818Z 192 │ : basename(token.value), 2026-10-24T12:44:50.6775968Z 193 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-24T12:44:50.6776065Z 194 │ iconUri: contextChipIconUri(icon), 2026-10-24T12:44:50.6776155Z 195 │ tintsIcon: icon.kind === "chip", 2026-10-24T12:44:50.6776214Z 196 │ }; 2026-10-24T12:44:50.6776275Z 197 │ }), 2026-10-24T12:44:50.6776333Z 198 │ ); 2026-10-24T12:44:50.6776467Z 199 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-24T12:44:50.6776627Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-24T12:44:50.6776847Z · ╰── This dependency list is missing values used by the callback 2026-10-24T12:44:50.6776997Z 200 │ // Every render resolves against the snapshot history, so a render whose 2026-10-24T12:44:50.6777049Z ╰──── 2026-10-24T12:44:50.6777262Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T12:44:50.6777584Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.6777586Z 2026-10-24T12:44:50.6777783Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T12:44:50.6777922Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:261:5] 2026-10-24T12:44:50.6778054Z 253 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-24T12:44:50.6778163Z 254 │ nativeEventSnapshotsRef.current.push({ 2026-10-24T12:44:50.6778262Z ·  ───────────┬─────────── 2026-10-24T12:44:50.6778733Z · ╰── 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-24T12:44:50.6778826Z 255 │ eventCount: acknowledgedEventCount, 2026-10-24T12:44:50.6778892Z 256 │ value, 2026-10-24T12:44:50.6778974Z 257 │ selection: nextSelection, 2026-10-24T12:44:50.6779035Z 258 │ }); 2026-10-24T12:44:50.6779119Z 259 │ return acknowledgedEventCount; 2026-10-24T12:44:50.6779178Z 260 │ }, 2026-10-24T12:44:50.6779237Z 261 │ [], 2026-10-24T12:44:50.6779309Z ·  ─┬ 2026-10-24T12:44:50.6779499Z · ╰── This dependency list is missing values used by the callback 2026-10-24T12:44:50.6779560Z 262 │ ); 2026-10-24T12:44:50.6779614Z ╰──── 2026-10-24T12:44:50.6779825Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T12:44:50.6780143Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.6780146Z 2026-10-24T12:44:50.6780387Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-24T12:44:50.6780529Z ╭─[apps/web/src/components/chat/useComposerSend.ts:985:13] 2026-10-24T12:44:50.6780654Z 984 │ const changedBeforeDecline = draftChangedSinceSend(); 2026-10-24T12:44:50.6780953Z 985 │ ╭─▶ const pendingIdsBeforeDecline = pendingApprovalsRef.current.map( 2026-10-24T12:44:50.6781105Z 986 │ │ (approval) => approval.requestId, 2026-10-24T12:44:50.6781244Z 987 │ ╰─▶ ); 2026-10-24T12:44:50.6781387Z 988 │ const approvalResponding = approvalsToDecline.some((approval) => 2026-10-24T12:44:50.6781441Z ╰──── 2026-10-24T12:44:50.6781519Z  help: Switch to `Set` 2026-10-24T12:44:50.6781522Z 2026-10-24T12:44:50.6782010Z ⚠ 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-24T12:44:50.6782143Z ╭─[packages/shared/src/atomicWrite.test.ts:139:5] 2026-10-24T12:44:50.6782228Z 138 │ Effect.gen(function* () { 2026-10-24T12:44:50.6782422Z 139 │ ╭─▶ while (fiber.pollUnsafe() === undefined) { 2026-10-24T12:44:50.6782551Z 140 │ │ yield* TestClock.adjust("100 millis"); 2026-10-24T12:44:50.6782906Z 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-24T12:44:50.6783101Z 142 │ │ yield* Effect.promise(() => new Promise((resolve) => setImmediate(resolve))); 2026-10-24T12:44:50.6783235Z 143 │ ╰─▶ } 2026-10-24T12:44:50.6783321Z 144 │ return yield* Fiber.join(fiber); 2026-10-24T12:44:50.6783379Z ╰──── 2026-10-24T12:44:50.6783388Z 2026-10-24T12:44:50.6783659Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T12:44:50.6783799Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:60:5] 2026-10-24T12:44:50.6783854Z 57 │ 2026-10-24T12:44:50.6783923Z 58 │ useEffect(() => { 2026-10-24T12:44:50.6783999Z ·  ────┬──── 2026-10-24T12:44:50.6784133Z · ╰── This is the containing effect 2026-10-24T12:44:50.6784228Z 59 │ const controller = new AbortController(); 2026-10-24T12:44:50.6784304Z 60 │ setLoadState("pending"); 2026-10-24T12:44:50.6784384Z ·  ──────┬───── 2026-10-24T12:44:50.6784559Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.6784730Z 61 │ // A renewed signature is used on Retry, not as a reason to reset the native player. 2026-10-24T12:44:50.6784793Z ╰──── 2026-10-24T12:44:50.6785415Z  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-24T12:44:50.6785751Z  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-24T12:44:50.6785753Z 2026-10-24T12:44:50.6785961Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T12:44:50.6786150Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:71:7] 2026-10-24T12:44:50.6786268Z 70 │ return () => controller.abort(); 2026-10-24T12:44:50.6786368Z 71 │ }, [player, props.playRequested, attempt]); 2026-10-24T12:44:50.6786546Z ·  ───┬── ─────────┬───────── ───┬─── 2026-10-24T12:44:50.6786781Z · │ │ ╰── Unnecessary dependency `attempt` 2026-10-24T12:44:50.6786988Z · │ ╰── Unnecessary dependency `props.playRequested` 2026-10-24T12:44:50.6787133Z · ╰── Unnecessary dependency `player_0` 2026-10-24T12:44:50.6787189Z 72 │ 2026-10-24T12:44:50.6787241Z ╰──── 2026-10-24T12:44:50.6787555Z  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-24T12:44:50.6787881Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.6787884Z 2026-10-24T12:44:50.6788092Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T12:44:50.6788229Z ╭─[packages/client-runtime/src/state/filesystem.ts:3:8] 2026-10-24T12:44:50.6788304Z 2 │ AuthFilesystemReadScope, 2026-10-24T12:44:50.6788379Z 3 │ type AuthSessionState, 2026-10-24T12:44:50.6788468Z ·  ────────┬─────── 2026-10-24T12:44:50.6788677Z · ╰── 'AuthSessionState' is imported here 2026-10-24T12:44:50.6788761Z 4 │ type FilesystemBrowseEntry, 2026-10-24T12:44:50.6788819Z ╰──── 2026-10-24T12:44:50.6788923Z  help: Consider removing this import. 2026-10-24T12:44:50.6788926Z 2026-10-24T12:44:50.6789125Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T12:44:50.6789277Z ╭─[apps/mobile/src/components/ComposerContextSheet.tsx:272:25] 2026-10-24T12:44:50.6789389Z 271 │ {record.elements?.map((element, index) => ( 2026-10-24T12:44:50.6789564Z 272 │ 2026-10-24T12:44:50.6789727Z ·  ─────────────────────────────────────────────────────── 2026-10-24T12:44:50.6789805Z 273 │ { 2026-10-24T12:44:50.6790689Z ·  ────┬──── 2026-10-24T12:44:50.6790819Z · ╰── This is the containing effect 2026-10-24T12:44:50.6790886Z 68 │ setUri(null); 2026-10-24T12:44:50.6790960Z ·  ───┬── 2026-10-24T12:44:50.6791131Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.6791267Z 69 │ setError(null); 2026-10-24T12:44:50.6791362Z ╰──── 2026-10-24T12:44:50.6791980Z  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-24T12:44:50.6792315Z  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-24T12:44:50.6792318Z 2026-10-24T12:44:50.6792524Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T12:44:50.6792661Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:91:7] 2026-10-24T12:44:50.6792760Z 90 │ }; 2026-10-24T12:44:50.6792840Z 91 │ }, [attachmentId, fileUri]); 2026-10-24T12:44:50.6792963Z ·  ──────┬───── ───┬─── 2026-10-24T12:44:50.6793149Z · │ ╰── Unnecessary dependency `fileUri` 2026-10-24T12:44:50.6793302Z · ╰── Unnecessary dependency `attachmentId` 2026-10-24T12:44:50.6793441Z 92 │ const mimeType = videoMimeType(attachment) ?? attachment.mimeType; 2026-10-24T12:44:50.6793496Z ╰──── 2026-10-24T12:44:50.6793797Z  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-24T12:44:50.6794126Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.6794132Z 2026-10-24T12:44:50.6794353Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T12:44:50.6794498Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:213:34] 2026-10-24T12:44:50.6794567Z 212 │ useEffect(() => { 2026-10-24T12:44:50.6794682Z 213 │ if (!isFocused && hasSource) props.onRequestClose(); 2026-10-24T12:44:50.6794786Z ·  ──┬── 2026-10-24T12:44:50.6794943Z · ╰── Missing dependency `props` 2026-10-24T12:44:50.6795053Z 214 │ }, [isFocused, hasSource, props.onRequestClose]); 2026-10-24T12:44:50.6795168Z ·  ──────────┬───────── 2026-10-24T12:44:50.6795461Z · ╰── Overly precise dependency `props.onRequestClose`, use `props` instead 2026-10-24T12:44:50.6795572Z 215 │ const { source } = props; 2026-10-24T12:44:50.6795629Z ╰──── 2026-10-24T12:44:50.6796061Z  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-24T12:44:50.6796384Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.6796386Z 2026-10-24T12:44:50.6796656Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T12:44:50.6796800Z ╭─[apps/mobile/src/components/ProjectFavicon.tsx:172:5] 2026-10-24T12:44:50.6797003Z 167 │ const [activeFaviconRequest, setActiveFaviconRequest] = useState(null); 2026-10-24T12:44:50.6797074Z 168 │ useLayoutEffect(() => { 2026-10-24T12:44:50.6797158Z ·  ───────┬─────── 2026-10-24T12:44:50.6797297Z · ╰── This is the containing effect 2026-10-24T12:44:50.6797390Z 169 │ if (faviconRequest === null) return; 2026-10-24T12:44:50.6797446Z 170 │ 2026-10-24T12:44:50.6797585Z 171 │ const endRequest = beginProjectFaviconRequest(faviconRequest); 2026-10-24T12:44:50.6797687Z 172 │ setActiveFaviconRequest(faviconRequest); 2026-10-24T12:44:50.6797784Z ·  ───────────┬─────────── 2026-10-24T12:44:50.6797962Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.6798042Z 173 │ return endRequest; 2026-10-24T12:44:50.6798101Z ╰──── 2026-10-24T12:44:50.6798720Z  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-24T12:44:50.6799053Z  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-24T12:44:50.6799056Z 2026-10-24T12:44:50.6799262Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T12:44:50.6799402Z ╭─[packages/client-runtime/src/state/usageAccess.ts:3:8] 2026-10-24T12:44:50.6799482Z 2 │ AuthDiagnosticsReadScope, 2026-10-24T12:44:50.6799555Z 3 │ type AuthSessionState, 2026-10-24T12:44:50.6799641Z ·  ────────┬─────── 2026-10-24T12:44:50.6799795Z · ╰── 'AuthSessionState' is imported here 2026-10-24T12:44:50.6799867Z 4 │ sessionGrantsScope, 2026-10-24T12:44:50.6799922Z ╰──── 2026-10-24T12:44:50.6800022Z  help: Consider removing this import. 2026-10-24T12:44:50.6800025Z 2026-10-24T12:44:50.6800231Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T12:44:50.6800364Z ╭─[apps/mobile/src/components/ComposerEditor.tsx:82:6] 2026-10-24T12:44:50.6800423Z 81 │ }, 2026-10-24T12:44:50.6800487Z 82 │ [draftKey], 2026-10-24T12:44:50.6800562Z ·  ────┬─── 2026-10-24T12:44:50.6800758Z · ╰── Unnecessary dependency `draftKey` 2026-10-24T12:44:50.6800848Z 83 │ ); 2026-10-24T12:44:50.6800900Z ╰──── 2026-10-24T12:44:50.6801202Z  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-24T12:44:50.6801522Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.6801525Z 2026-10-24T12:44:50.6801732Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T12:44:50.6801900Z ╭─[apps/web/src/components/settings/ProviderSettingsPanel.logic.ts:4:8] 2026-10-24T12:44:50.6801977Z 3 │ AuthProvidersManageScope, 2026-10-24T12:44:50.6802052Z 4 │ type AuthSessionState, 2026-10-24T12:44:50.6802147Z ·  ────────┬─────── 2026-10-24T12:44:50.6802293Z · ╰── 'AuthSessionState' is imported here 2026-10-24T12:44:50.6802363Z 5 │ type EnvironmentId, 2026-10-24T12:44:50.6802417Z ╰──── 2026-10-24T12:44:50.6802517Z  help: Consider removing this import. 2026-10-24T12:44:50.6802520Z 2026-10-24T12:44:50.6803032Z ⚠ 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-24T12:44:50.6803193Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1680:7] 2026-10-24T12:44:50.6803290Z 1679 │ yield* harness.replaceSession; 2026-10-24T12:44:50.6803514Z 1680 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T12:44:50.6803677Z 1681 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) { 2026-10-24T12:44:50.6803766Z 1682 │ │ break; 2026-10-24T12:44:50.6803850Z 1683 │ │ } 2026-10-24T12:44:50.6803961Z 1684 │ │ yield* Effect.yieldNow; 2026-10-24T12:44:50.6804099Z 1685 │ ╰─▶ } 2026-10-24T12:44:50.6804175Z 1686 │ yield* Queue.offer( 2026-10-24T12:44:50.6804232Z ╰──── 2026-10-24T12:44:50.6804235Z 2026-10-24T12:44:50.6804723Z ⚠ 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-24T12:44:50.6804886Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1789:7] 2026-10-24T12:44:50.6804979Z 1788 │ yield* harness.replaceSession; 2026-10-24T12:44:50.6805188Z 1789 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T12:44:50.6805355Z 1790 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break; 2026-10-24T12:44:50.6805467Z 1791 │ │ yield* Effect.yieldNow; 2026-10-24T12:44:50.6805604Z 1792 │ ╰─▶ } 2026-10-24T12:44:50.6805737Z 1793 │ expect(yield* Ref.get(harness.subscriptionCount)).toBe(2); 2026-10-24T12:44:50.6805844Z ╰──── 2026-10-24T12:44:50.6805875Z 2026-10-24T12:44:50.6806096Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T12:44:50.6806240Z ╭─[packages/shared/src/composerContextLegacySend.ts:19:45] 2026-10-24T12:44:50.6806367Z 18 │ const occurrences = collectComposerContextReferences(text); 2026-10-24T12:44:50.6806479Z 19 │ for (const occurrence of [...occurrences].reverse()) { 2026-10-24T12:44:50.6806595Z ·  ─────── 2026-10-24T12:44:50.6806710Z 20 │ const record = recordsById.get(occurrence.contextId); 2026-10-24T12:44:50.6806763Z ╰──── 2026-10-24T12:44:50.6807038Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T12:44:50.6807041Z 2026-10-24T12:44:50.6807527Z ⚠ 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-24T12:44:50.6807684Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:169:7] 2026-10-24T12:44:50.6807751Z 168 │ }); 2026-10-24T12:44:50.6807951Z 169 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T12:44:50.6808151Z 170 │ │ if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break; 2026-10-24T12:44:50.6808261Z 171 │ │ yield* Effect.yieldNow; 2026-10-24T12:44:50.6808397Z 172 │ ╰─▶ } 2026-10-24T12:44:50.6808458Z 173 │ 2026-10-24T12:44:50.6808517Z ╰──── 2026-10-24T12:44:50.6808520Z 2026-10-24T12:44:50.6808999Z ⚠ 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-24T12:44:50.6809150Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:178:7] 2026-10-24T12:44:50.6809261Z 177 │ yield* Deferred.succeed(releaseSave, undefined); 2026-10-24T12:44:50.6809462Z 178 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T12:44:50.6809601Z 179 │ │ if ((yield* Ref.get(saved)).length > 0) break; 2026-10-24T12:44:50.6809713Z 180 │ │ yield* Effect.yieldNow; 2026-10-24T12:44:50.6809851Z 181 │ ╰─▶ } 2026-10-24T12:44:50.6809906Z 182 │ 2026-10-24T12:44:50.6809964Z ╰──── 2026-10-24T12:44:50.6809967Z 2026-10-24T12:44:50.6810441Z ⚠ 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-24T12:44:50.6810592Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7] 2026-10-24T12:44:50.6810720Z 306 │ yield* Deferred.succeed(releaseUnenrichedSave, undefined); 2026-10-24T12:44:50.6810917Z 307 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T12:44:50.6811096Z 308 │ │ const values = yield* Ref.get(saved); 2026-10-24T12:44:50.6811331Z 309 │ │ if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) { 2026-10-24T12:44:50.6811420Z 310 │ │ break; 2026-10-24T12:44:50.6811503Z 311 │ │ } 2026-10-24T12:44:50.6811612Z 312 │ │ yield* Effect.yieldNow; 2026-10-24T12:44:50.6811748Z 313 │ ╰─▶ } 2026-10-24T12:44:50.6811803Z 314 │ 2026-10-24T12:44:50.6811858Z ╰──── 2026-10-24T12:44:50.6811861Z 2026-10-24T12:44:50.6812345Z ⚠ 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-24T12:44:50.6812499Z ╭─[apps/server/src/background/HostPowerMonitor.test.ts:133:11] 2026-10-24T12:44:50.6812635Z 132 │ const monitor = yield* HostPowerMonitor.HostPowerMonitor; 2026-10-24T12:44:50.6812806Z 133 │ ╭─▶ for ( 2026-10-24T12:44:50.6812913Z 134 │ │ let attempt = 0; 2026-10-24T12:44:50.6813088Z 135 │ │ attempt < 100 && (yield* monitor.snapshot).onBattery !== "true"; 2026-10-24T12:44:50.6813192Z 136 │ │ attempt += 1 2026-10-24T12:44:50.6813275Z 137 │ │ ) { 2026-10-24T12:44:50.6813389Z 138 │ │ yield* Effect.yieldNow; 2026-10-24T12:44:50.6813539Z 139 │ ╰─▶ } 2026-10-24T12:44:50.6813672Z 140 │ expect((yield* monitor.snapshot).onBattery).toBe("true"); 2026-10-24T12:44:50.6813724Z ╰──── 2026-10-24T12:44:50.6813727Z 2026-10-24T12:44:50.6814119Z ⚠ 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-24T12:44:50.6814246Z ╭─[packages/shared/src/otelEnvironment.ts:146:14] 2026-10-24T12:44:50.6814309Z 145 │ name, 2026-10-24T12:44:50.6814451Z 146 │ (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()), 2026-10-24T12:44:50.6814564Z ·  ────────────────────────── 2026-10-24T12:44:50.6814690Z 147 │ `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`, 2026-10-24T12:44:50.6814746Z ╰──── 2026-10-24T12:44:50.6814755Z 2026-10-24T12:44:50.6815051Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-24T12:44:50.6815182Z ╭─[packages/provider-cursor/src/server/auth.ts:249:20] 2026-10-24T12:44:50.6815242Z 248 │ }, 2026-10-24T12:44:50.6815327Z 249 │ (effect, flow, stopSessions) => 2026-10-24T12:44:50.6815423Z ·  ──────┬───── 2026-10-24T12:44:50.6815575Z · ╰── 'stopSessions' is declared here 2026-10-24T12:44:50.6815646Z 250 │ effect.pipe( 2026-10-24T12:44:50.6815700Z ╰──── 2026-10-24T12:44:50.6815807Z  help: Consider removing this parameter. 2026-10-24T12:44:50.6815810Z 2026-10-24T12:44:50.6816074Z ⚠ eslint(no-unused-vars): Type 'EnvironmentId' is imported but never used. 2026-10-24T12:44:50.6816249Z ╭─[packages/client-runtime/src/state/sharedSettings.ts:2:3] 2026-10-24T12:44:50.6816317Z 1 │ import type { 2026-10-24T12:44:50.6816384Z 2 │ EnvironmentId, 2026-10-24T12:44:50.6816462Z ·  ──────┬────── 2026-10-24T12:44:50.6816604Z · ╰── 'EnvironmentId' is imported here 2026-10-24T12:44:50.6816692Z 3 │ ExecutionEnvironmentCapabilities, 2026-10-24T12:44:50.6816746Z ╰──── 2026-10-24T12:44:50.6816846Z  help: Consider removing this import. 2026-10-24T12:44:50.6816848Z 2026-10-24T12:44:50.6817116Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T12:44:50.6817284Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:40:5] 2026-10-24T12:44:50.6817410Z 37 │ const [initialized, setInitialized] = useState(false); 2026-10-24T12:44:50.6817486Z 38 │ useLayoutEffect(() => { 2026-10-24T12:44:50.6817567Z ·  ───────┬─────── 2026-10-24T12:44:50.6817705Z · ╰── This is the containing effect 2026-10-24T12:44:50.6817769Z 39 │ reset(); 2026-10-24T12:44:50.6817838Z 40 │ setInitialized(true); 2026-10-24T12:44:50.6817920Z ·  ───────┬────── 2026-10-24T12:44:50.6818096Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.6818162Z 41 │ }, [reset]); 2026-10-24T12:44:50.6818214Z ╰──── 2026-10-24T12:44:50.6818842Z  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-24T12:44:50.6819185Z  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-24T12:44:50.6819188Z 2026-10-24T12:44:50.6819453Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T12:44:50.6819621Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:93:5] 2026-10-24T12:44:50.6819675Z 88 │ 2026-10-24T12:44:50.6819745Z 89 │ useEffect(() => { 2026-10-24T12:44:50.6819820Z ·  ────┬──── 2026-10-24T12:44:50.6819960Z · ╰── This is the containing effect 2026-10-24T12:44:50.6820127Z 90 │ if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return; 2026-10-24T12:44:50.6820236Z 91 │ const branchName = initialProjectRef.branch; 2026-10-24T12:44:50.6820307Z 92 │ let active = true; 2026-10-24T12:44:50.6820406Z 93 │ setPendingCheckouts((count) => count + 1); 2026-10-24T12:44:50.6820494Z ·  ─────────┬───────── 2026-10-24T12:44:50.6820673Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.6820834Z 94 │ // Serialize replacements: ignoring a stale result cannot undo its Git mutation. 2026-10-24T12:44:50.6820889Z ╰──── 2026-10-24T12:44:50.6821568Z  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-24T12:44:50.6821935Z  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-24T12:44:50.6821938Z 2026-10-24T12:44:50.6822231Z ⚠ eslint(no-unused-vars): Variable 'legacyCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-24T12:44:50.6822393Z ╭─[packages/provider-cursor/src/server/credentialStore.test.ts:15:7] 2026-10-24T12:44:50.6822450Z 14 │ 2026-10-24T12:44:50.6822524Z 15 │ const legacyCredentials = { 2026-10-24T12:44:50.6822613Z ·  ────────┬──────── 2026-10-24T12:44:50.6822805Z · ╰── 'legacyCredentials' is declared here 2026-10-24T12:44:50.6822881Z 16 │ version: 1 as const, 2026-10-24T12:44:50.6822933Z ╰──── 2026-10-24T12:44:50.6823043Z  help: Consider removing this declaration. 2026-10-24T12:44:50.6823046Z 2026-10-24T12:44:50.6823240Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-24T12:44:50.6823371Z ╭─[packages/client-runtime/src/state/shell.ts:189:5] 2026-10-24T12:44:50.6823483Z 186 │ let waiting = yield* Ref.get(awaitingCompletion); 2026-10-24T12:44:50.6823554Z 187 │ let next = initial; 2026-10-24T12:44:50.6823629Z ·  ──┬─ 2026-10-24T12:44:50.6823756Z · ╰── From this accumulator 2026-10-24T12:44:50.6823838Z 188 │ let receivedSnapshot = false; 2026-10-24T12:44:50.6823920Z 189 │ for (const item of items) { 2026-10-24T12:44:50.6823998Z ·  ─┬─ 2026-10-24T12:44:50.6824111Z · ╰── For this loop 2026-10-24T12:44:50.6824202Z 190 │ if (item.kind === "synchronized") { 2026-10-24T12:44:50.6824273Z 191 │ waiting = false; 2026-10-24T12:44:50.6824368Z 192 │ if (Option.isSome(next.snapshot)) { 2026-10-24T12:44:50.6824488Z 193 │ next = { ...next, status: "live", error: Option.none() }; 2026-10-24T12:44:50.6824580Z ·  ───┬─── 2026-10-24T12:44:50.6824716Z · ╰── From this spread 2026-10-24T12:44:50.6824778Z 194 │ } 2026-10-24T12:44:50.6824831Z ╰──── 2026-10-24T12:44:50.6824992Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-24T12:44:50.6825215Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T12:44:50.6825248Z 2026-10-24T12:44:50.6825515Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T12:44:50.6825682Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:279:5] 2026-10-24T12:44:50.6825804Z 277 │ const [snoozeWakeTick, bumpSnoozeWakeTick] = useState(0); 2026-10-24T12:44:50.6825874Z 278 │ useEffect(() => { 2026-10-24T12:44:50.6825950Z ·  ────┬──── 2026-10-24T12:44:50.6826087Z · ╰── This is the containing effect 2026-10-24T12:44:50.6826173Z 279 │ setNow(new Date().toISOString()); 2026-10-24T12:44:50.6826248Z ·  ───┬── 2026-10-24T12:44:50.6826431Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.6826580Z 280 │ const id = setInterval(() => setNow(new Date().toISOString()), 60_000); 2026-10-24T12:44:50.6826633Z ╰──── 2026-10-24T12:44:50.6827261Z  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-24T12:44:50.6827599Z  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-24T12:44:50.6827602Z 2026-10-24T12:44:50.6827846Z ⚠ eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used. 2026-10-24T12:44:50.6828018Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:13:8] 2026-10-24T12:44:50.6869321Z 12 │ threadSearchMatchKey, 2026-10-24T12:44:50.6869548Z 13 │ type EnvironmentThreadSearchMatch, 2026-10-24T12:44:50.6869671Z ·  ──────────────┬───────────── 2026-10-24T12:44:50.6869879Z · ╰── 'EnvironmentThreadSearchMatch' is imported here 2026-10-24T12:44:50.6869995Z 14 │ } from "@t3tools/client-runtime/state/thread-search"; 2026-10-24T12:44:50.6870051Z ╰──── 2026-10-24T12:44:50.6870154Z  help: Consider removing this import. 2026-10-24T12:44:50.6870161Z 2026-10-24T12:44:50.6870376Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T12:44:50.6870573Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:359:25] 2026-10-24T12:44:50.6870718Z 358 │ // range) the boundary string is identical and the chain would die. 2026-10-24T12:44:50.6870812Z 359 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-24T12:44:50.6870917Z ·  ───────┬────── 2026-10-24T12:44:50.6871091Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T12:44:50.6871205Z 360 │ const listItems = ((): readonly SidebarListItem[] => { 2026-10-24T12:44:50.6871259Z ╰──── 2026-10-24T12:44:50.6871564Z  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-24T12:44:50.6872072Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.6872125Z 2026-10-24T12:44:50.6872301Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T12:44:50.6872470Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:350:53] 2026-10-24T12:44:50.6872559Z 349 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-24T12:44:50.6872751Z 350 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-24T12:44:50.6872876Z ·  ─────┬──── 2026-10-24T12:44:50.6873049Z · ╰── Cannot call impure function 2026-10-24T12:44:50.6873131Z 351 │ const id = setTimeout(() => { 2026-10-24T12:44:50.6873182Z ╰──── 2026-10-24T12:44:50.6873482Z  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-24T12:44:50.6873791Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T12:44:50.6873794Z 2026-10-24T12:44:50.6874264Z ⚠ 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-24T12:44:50.6874396Z ╭─[packages/contracts/src/baseSchemas.test.ts:39:9] 2026-10-24T12:44:50.6874466Z 38 │ JSON.stringify( 2026-10-24T12:44:50.6874587Z 39 │ Schema.encodeUnknownSync(Schema.toCodecJson(Named))([ 2026-10-24T12:44:50.6874692Z ·  ──────────────────────── 2026-10-24T12:44:50.6874764Z 40 │ { name: "a" }, 2026-10-24T12:44:50.6874815Z ╰──── 2026-10-24T12:44:50.6874818Z 2026-10-24T12:44:50.6875196Z ⚠ 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-24T12:44:50.6875311Z ╭─[packages/contracts/src/auth.test.ts:17:12] 2026-10-24T12:44:50.6875472Z 16 │ it("decodes legacy review credentials without offering them in new grants", () => { 2026-10-24T12:44:50.6875642Z 17 │ expect(Schema.decodeUnknownSync(AuthEnvironmentScopes)(["review:write"])).toEqual([ 2026-10-24T12:44:50.6875747Z ·  ──────────────────────── 2026-10-24T12:44:50.6875815Z 18 │ "review:write", 2026-10-24T12:44:50.6875867Z ╰──── 2026-10-24T12:44:50.6875869Z 2026-10-24T12:44:50.6876244Z ⚠ 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-24T12:44:50.6876360Z ╭─[packages/contracts/src/auth.test.ts:20:18] 2026-10-24T12:44:50.6876419Z 19 │ ]); 2026-10-24T12:44:50.6876585Z 20 │ expect(() => Schema.decodeUnknownSync(AuthGrantScopes)(["review:write"])).toThrow(); 2026-10-24T12:44:50.6876690Z ·  ──────────────────────── 2026-10-24T12:44:50.6876825Z 21 │ expect(AuthStandardClientScopes).not.toContain("review:write"); 2026-10-24T12:44:50.6876877Z ╰──── 2026-10-24T12:44:50.6876880Z 2026-10-24T12:44:50.6877307Z ⚠ 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-24T12:44:50.6877446Z ╭─[packages/contracts/src/auth.test.ts:58:21] 2026-10-24T12:44:50.6877620Z 57 │ it("ignores unknown response permissions without falling back to broader scopes", () => { 2026-10-24T12:44:50.6877746Z 58 │ const session = Schema.decodeUnknownSync(AuthSessionState)({ 2026-10-24T12:44:50.6877854Z ·  ──────────────────────── 2026-10-24T12:44:50.6877926Z 59 │ authenticated: true, 2026-10-24T12:44:50.6877977Z ╰──── 2026-10-24T12:44:50.6877979Z 2026-10-24T12:44:50.6878176Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T12:44:50.6878332Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:223:31] 2026-10-24T12:44:50.6878442Z 222 │ ? snippetTokens.map((line, lineIndex) => ( 2026-10-24T12:44:50.6878542Z 223 │ 2026-10-24T12:44:50.6878652Z ·  ─────────────── 2026-10-24T12:44:50.6878747Z 224 │ {lineIndex > 0 ? "\n" : ""} 2026-10-24T12:44:50.6878800Z ╰──── 2026-10-24T12:44:50.6878948Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T12:44:50.6878951Z 2026-10-24T12:44:50.6879147Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T12:44:50.6879298Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25] 2026-10-24T12:44:50.6879375Z 226 │ { 2026-10-24T12:44:50.6882764Z 181 │ const wire = Schema.encodeUnknownSync(Schema.toCodecJson(OrchestrationMessageContext))({ 2026-10-24T12:44:50.6882874Z ·  ──────────────────────── 2026-10-24T12:44:50.6882943Z 182 │ version: 1, 2026-10-24T12:44:50.6882993Z ╰──── 2026-10-24T12:44:50.6882996Z 2026-10-24T12:44:50.6883197Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T12:44:50.6883337Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:454:7] 2026-10-24T12:44:50.6883424Z 453 │ showAuxiliaryPane("inspector"); 2026-10-24T12:44:50.6883530Z 454 │ }, [environmentId, showAuxiliaryPane, threadId]); 2026-10-24T12:44:50.6883675Z ·  ──────┬────── ────┬─── 2026-10-24T12:44:50.6883879Z · │ ╰── Unnecessary dependency `threadId` 2026-10-24T12:44:50.6884030Z · ╰── Unnecessary dependency `environmentId` 2026-10-24T12:44:50.6884090Z 455 │ const { 2026-10-24T12:44:50.6884142Z ╰──── 2026-10-24T12:44:50.6884444Z  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-24T12:44:50.6884794Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.6884800Z 2026-10-24T12:44:50.6884990Z ⚠ react(static-components): Cannot create components during render 2026-10-24T12:44:50.6885125Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:725:20] 2026-10-24T12:44:50.6885189Z 492 │ // same check. 2026-10-24T12:44:50.6885318Z 493 │ const NativeReviewDiffView = resolveNativeReviewDiffView(); 2026-10-24T12:44:50.6885440Z ·  ─────────────┬───────────── 2026-10-24T12:44:50.6885624Z · ╰── The component is created during render here 2026-10-24T12:44:50.6885778Z 494 │ const nativeReviewDiffViewRef = useRef(null); 2026-10-24T12:44:50.6885959Z 495 │ const showcasedReviewDrawRef = useRef(null); 2026-10-24T12:44:50.6886125Z 496 │ const [isPullRefreshing, setIsPullRefreshing] = useState(false); 2026-10-24T12:44:50.6886218Z 497 │ const handlePullToRefresh = async () => { 2026-10-24T12:44:50.6886297Z 498 │ setIsPullRefreshing(true); 2026-10-24T12:44:50.6886381Z 499 │ await refreshSelectedSection(); 2026-10-24T12:44:50.6886459Z 500 │ setIsPullRefreshing(false); 2026-10-24T12:44:50.6886514Z 501 │ }; 2026-10-24T12:44:50.6886658Z 502 │ const reviewFileNavigatorRef = useRef(null); 2026-10-24T12:44:50.6886801Z 503 │ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : []; 2026-10-24T12:44:50.6886909Z 504 │ const fileVisibility = useReviewFileVisibility({ 2026-10-24T12:44:50.6886995Z 505 │ threadKey: reviewCache.threadKey, 2026-10-24T12:44:50.6887093Z 506 │ sectionId: selectedSection?.id ?? null, 2026-10-24T12:44:50.6887164Z 507 │ files: reviewFiles, 2026-10-24T12:44:50.6887265Z 508 │ cachedExpandedFileIds: selectedSection?.id 2026-10-24T12:44:50.6887395Z 509 │ ? reviewCache.expandedFileIdsBySection[selectedSection.id] 2026-10-24T12:44:50.6887461Z 510 │ : undefined, 2026-10-24T12:44:50.6887558Z 511 │ cachedViewedFileIds: selectedSection?.id 2026-10-24T12:44:50.6887682Z 512 │ ? reviewCache.viewedFileIdsBySection[selectedSection.id] 2026-10-24T12:44:50.6887745Z 513 │ : undefined, 2026-10-24T12:44:50.6887800Z 514 │ }); 2026-10-24T12:44:50.6887995Z 515 │ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility; 2026-10-24T12:44:50.6888127Z 516 │ const commentSelection = useReviewCommentSelectionController({ 2026-10-24T12:44:50.6888189Z 517 │ environmentId, 2026-10-24T12:44:50.6888257Z 518 │ threadId, 2026-10-24T12:44:50.6888326Z 519 │ selectedSection, 2026-10-24T12:44:50.6888397Z 520 │ nativeReviewDiffData, 2026-10-24T12:44:50.6888451Z 521 │ }); 2026-10-24T12:44:50.6888559Z 522 │ const nativeBridge = useNativeReviewDiffBridge({ 2026-10-24T12:44:50.6888646Z 523 │ threadKey: reviewCache.threadKey, 2026-10-24T12:44:50.6888735Z 524 │ sectionId: selectedSection?.id ?? null, 2026-10-24T12:44:50.6888815Z 525 │ diff: selectedSection?.diff, 2026-10-24T12:44:50.6888894Z 526 │ data: nativeReviewDiffData, 2026-10-24T12:44:50.6888962Z 527 │ collapsedFileIds, 2026-10-24T12:44:50.6889024Z 528 │ viewedFileIds, 2026-10-24T12:44:50.6889135Z 529 │ selectedRowIds: commentSelection.selectedRowIds, 2026-10-24T12:44:50.6889232Z 530 │ canHighlight: parsedDiff.kind === "files", 2026-10-24T12:44:50.6889288Z 531 │ }); 2026-10-24T12:44:50.6889366Z 532 │ const showcaseReviewKey = 2026-10-24T12:44:50.6889502Z 533 │ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection 2026-10-24T12:44:50.6889715Z 534 │ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}` 2026-10-24T12:44:50.6889777Z 535 │ : null; 2026-10-24T12:44:50.6889945Z 536 │ const handleNativeDebug = (event: NativeSyntheticEvent>) => { 2026-10-24T12:44:50.6890025Z 537 │ nativeBridge.onDebug(event); 2026-10-24T12:44:50.6890083Z 538 │ if ( 2026-10-24T12:44:50.6890163Z 539 │ showcaseReviewKey === null || 2026-10-24T12:44:50.6890284Z 540 │ showcasedReviewDrawRef.current === showcaseReviewKey || 2026-10-24T12:44:50.6890395Z 541 │ !isNativeReviewDiffDrawEvent(event.nativeEvent) 2026-10-24T12:44:50.6890452Z 542 │ ) { 2026-10-24T12:44:50.6890566Z 543 │ return; 2026-10-24T12:44:50.6890647Z 544 │ } 2026-10-24T12:44:50.6890761Z 545 │ showcasedReviewDrawRef.current = showcaseReviewKey; 2026-10-24T12:44:50.6890927Z 546 │ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId }); 2026-10-24T12:44:50.6890982Z 547 │ }; 2026-10-24T12:44:50.6891036Z 548 │ 2026-10-24T12:44:50.6891157Z 549 │ const handleSelectFile = async (fileId: string | null) => { 2026-10-24T12:44:50.6891237Z 550 │ loadVisibleFile(fileId, true); 2026-10-24T12:44:50.6891327Z 551 │ commentSelection.clearSelection(); 2026-10-24T12:44:50.6891448Z 552 │ if (fileId !== null && collapsedFileIds.includes(fileId)) { 2026-10-24T12:44:50.6891529Z 553 │ toggleExpandedFile(fileId); 2026-10-24T12:44:50.6891584Z 554 │ } 2026-10-24T12:44:50.6891696Z 555 │ const nativeView = nativeReviewDiffViewRef.current; 2026-10-24T12:44:50.6891774Z 556 │ if (!nativeView) return; 2026-10-24T12:44:50.6891871Z 557 │ const result = await settlePromise(() => 2026-10-24T12:44:50.6892050Z 558 │ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true), 2026-10-24T12:44:50.6892105Z 559 │ ); 2026-10-24T12:44:50.6892195Z 560 │ if (AsyncResult.isFailure(result)) { 2026-10-24T12:44:50.6892379Z 561 │ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result)); 2026-10-24T12:44:50.6892434Z 562 │ } 2026-10-24T12:44:50.6892489Z 563 │ }; 2026-10-24T12:44:50.6892574Z 564 │ const handleVisibleFileChange = ( 2026-10-24T12:44:50.6892736Z 565 │ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>, 2026-10-24T12:44:50.6892794Z 566 │ ) => { 2026-10-24T12:44:50.6892903Z 567 │ loadVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-24T12:44:50.6893080Z 568 │ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-24T12:44:50.6893137Z 569 │ }; 2026-10-24T12:44:50.6893216Z 570 │ const renderInspector = () => ( 2026-10-24T12:44:50.6893285Z 571 │ void handleSelectFile(fileId)} 2026-10-24T12:44:50.6893804Z 577 │ /> 2026-10-24T12:44:50.6893858Z 578 │ ); 2026-10-24T12:44:50.6893909Z 579 │ 2026-10-24T12:44:50.6894099Z 580 │ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => { 2026-10-24T12:44:50.6894193Z 581 │ const { fileId } = event.nativeEvent; 2026-10-24T12:44:50.6894261Z 582 │ if (fileId) { 2026-10-24T12:44:50.6894341Z 583 │ loadVisibleFile(fileId, true); 2026-10-24T12:44:50.6894421Z 584 │ toggleExpandedFile(fileId); 2026-10-24T12:44:50.6894476Z 585 │ } 2026-10-24T12:44:50.6894529Z 586 │ }; 2026-10-24T12:44:50.6894581Z 587 │ 2026-10-24T12:44:50.6894671Z 588 │ const handleNativeToggleViewedFile = ( 2026-10-24T12:44:50.6894790Z 589 │ event: NativeSyntheticEvent<{ readonly fileId?: string }>, 2026-10-24T12:44:50.6894846Z 590 │ ) => { 2026-10-24T12:44:50.6894933Z 591 │ const { fileId } = event.nativeEvent; 2026-10-24T12:44:50.6894997Z 592 │ if (fileId) { 2026-10-24T12:44:50.6895074Z 593 │ toggleViewedFile(fileId); 2026-10-24T12:44:50.6895127Z 594 │ } 2026-10-24T12:44:50.6895182Z 595 │ }; 2026-10-24T12:44:50.6895293Z 596 │ 2026-10-24T12:44:50.6895395Z 597 │ const parsedDiffNotice = 2026-10-24T12:44:50.6895559Z 598 │ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null; 2026-10-24T12:44:50.6895683Z 599 │ const hasCachedSelectedDiff = selectedSection?.diff != null; 2026-10-24T12:44:50.6895842Z 600 │ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null); 2026-10-24T12:44:50.6895963Z 601 │ const sectionMenu = buildReviewSectionMenu(reviewSections); 2026-10-24T12:44:50.6896123Z 602 │ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({ 2026-10-24T12:44:50.6896235Z 603 │ hasEnvironmentPresentation: environment.isReady, 2026-10-24T12:44:50.6896338Z 604 │ isEnvironmentConnected: isEnvironmentReady, 2026-10-24T12:44:50.6896410Z 605 │ hasCachedSelectedDiff, 2026-10-24T12:44:50.6896482Z 606 │ hasAnyCachedDiff, 2026-10-24T12:44:50.6896539Z 607 │ }); 2026-10-24T12:44:50.6896628Z 608 │ const handleRetryEnvironment = () => { 2026-10-24T12:44:50.6896717Z 609 │ void retryEnvironment(environmentId); 2026-10-24T12:44:50.6896770Z 610 │ }; 2026-10-24T12:44:50.6896856Z 611 │ const handleReturnToThread = () => { 2026-10-24T12:44:50.6896936Z 612 │ if (navigation.canGoBack()) { 2026-10-24T12:44:50.6897007Z 613 │ navigation.goBack(); 2026-10-24T12:44:50.6897070Z 614 │ return; 2026-10-24T12:44:50.6897126Z 615 │ } 2026-10-24T12:44:50.6897208Z 616 │ navigation.navigate("Thread", { 2026-10-24T12:44:50.6897298Z 617 │ environmentId: String(environmentId), 2026-10-24T12:44:50.6897376Z 618 │ threadId: String(threadId), 2026-10-24T12:44:50.6897434Z 619 │ }); 2026-10-24T12:44:50.6897489Z 620 │ }; 2026-10-24T12:44:50.6897574Z 621 │ const androidHeaderSubtitle = [ 2026-10-24T12:44:50.6897649Z 622 │ selectedSection?.title, 2026-10-24T12:44:50.6897730Z 623 │ headerDiffSummary.additions, 2026-10-24T12:44:50.6897810Z 624 │ headerDiffSummary.deletions, 2026-10-24T12:44:50.6897864Z 625 │ ] 2026-10-24T12:44:50.6897971Z 626 │ .filter((part): part is string => Boolean(part)) 2026-10-24T12:44:50.6898037Z 627 │ .join(" · "); 2026-10-24T12:44:50.6898089Z 628 │ 2026-10-24T12:44:50.6898167Z 629 │ const showChangedFilesPane = 2026-10-24T12:44:50.6898241Z 630 │ !showConnectionNotice && 2026-10-24T12:44:50.6898317Z 631 │ selectedSection !== null && 2026-10-24T12:44:50.6898396Z 632 │ parsedDiff.kind === "files" && 2026-10-24T12:44:50.6898476Z 633 │ NativeReviewDiffView !== null; 2026-10-24T12:44:50.6898649Z 634 │ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined); 2026-10-24T12:44:50.6898828Z 635 │ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane; 2026-10-24T12:44:50.6898882Z 636 │ 2026-10-24T12:44:50.6898956Z 637 │ const listHeader = (() => { 2026-10-24T12:44:50.6899043Z 638 │ const children: ReactElement[] = []; 2026-10-24T12:44:50.6899097Z 639 │ 2026-10-24T12:44:50.6899159Z 640 │ if (error) { 2026-10-24T12:44:50.6899227Z 641 │ children.push( 2026-10-24T12:44:50.6899288Z 642 │ 2026-10-24T12:44:50.6900004Z 649 │ Review unavailable 2026-10-24T12:44:50.6900193Z 650 │ {error} 2026-10-24T12:44:50.6900256Z 651 │ , 2026-10-24T12:44:50.6900312Z 652 │ ); 2026-10-24T12:44:50.6900368Z 653 │ } 2026-10-24T12:44:50.6900421Z 654 │ 2026-10-24T12:44:50.6900492Z 655 │ if (parsedDiffNotice) { 2026-10-24T12:44:50.6900656Z 656 │ children.push(); 2026-10-24T12:44:50.6900713Z 657 │ } 2026-10-24T12:44:50.6900765Z 658 │ 2026-10-24T12:44:50.6900843Z 659 │ if (children.length === 0) { 2026-10-24T12:44:50.6900909Z 660 │ return null; 2026-10-24T12:44:50.6900964Z 661 │ } 2026-10-24T12:44:50.6901017Z 662 │ 2026-10-24T12:44:50.6901092Z 663 │ return <>{children}; 2026-10-24T12:44:50.6901151Z 664 │ })(); 2026-10-24T12:44:50.6901222Z 665 │ const headerSubtitle = [ 2026-10-24T12:44:50.6901302Z 666 │ headerDiffSummary.additions, 2026-10-24T12:44:50.6901380Z 667 │ headerDiffSummary.deletions, 2026-10-24T12:44:50.6901462Z 668 │ pendingReviewCommentCount > 0 2026-10-24T12:44:50.6901638Z 669 │ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}` 2026-10-24T12:44:50.6901700Z 670 │ : null, 2026-10-24T12:44:50.6901753Z 671 │ ] 2026-10-24T12:44:50.6901826Z 672 │ .filter(Boolean) 2026-10-24T12:44:50.6901890Z 673 │ .join(" · "); 2026-10-24T12:44:50.6902026Z 674 │ const headerTitleText = selectedSection?.title ?? "Review changes"; 2026-10-24T12:44:50.6902082Z 675 │ 2026-10-24T12:44:50.6902145Z 676 │ return ( 2026-10-24T12:44:50.6902209Z 677 │ <> 2026-10-24T12:44:50.6902277Z 678 │ 2026-10-24T12:44:50.6905009Z 694 │ 2026-10-24T12:44:50.6905087Z 695 │ 2026-10-24T12:44:50.6905223Z 696 │ 2026-10-24T12:44:50.6905306Z 697 │ {showConnectionNotice ? ( 2026-10-24T12:44:50.6905475Z 698 │ 2026-10-24T12:44:50.6905573Z 699 │ 2026-10-24T12:44:50.6907136Z 711 │ 2026-10-24T12:44:50.6907301Z 712 │ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? ( 2026-10-24T12:44:50.6907362Z 713 │ 2026-10-24T12:44:50.6907833Z 719 │ 2026-10-24T12:44:50.6908202Z 723 │ {listHeader} 2026-10-24T12:44:50.6908328Z 724 │ 2026-10-24T12:44:50.6908411Z 725 │ { 2026-10-24T12:44:50.6910472Z ·  ────┬──── 2026-10-24T12:44:50.6910610Z · ╰── This is the containing effect 2026-10-24T12:44:50.6910695Z 106 │ clearReviewCommentTarget(); 2026-10-24T12:44:50.6910798Z 107 │ setPendingNativeCommentSelection(null); 2026-10-24T12:44:50.6910912Z ·  ────────────────┬─────────────── 2026-10-24T12:44:50.6911091Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.6911169Z 108 │ }, [selectedSection?.id]); 2026-10-24T12:44:50.6911224Z ╰──── 2026-10-24T12:44:50.6912095Z  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-24T12:44:50.6912506Z  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-24T12:44:50.6912510Z 2026-10-24T12:44:50.6912830Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T12:44:50.6913024Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7] 2026-10-24T12:44:50.6913081Z 109 │ 2026-10-24T12:44:50.6913148Z 110 │ useEffect(() => { 2026-10-24T12:44:50.6913220Z ·  ────┬──── 2026-10-24T12:44:50.6913362Z · ╰── This is the containing effect 2026-10-24T12:44:50.6913456Z 111 │ if (activeCommentTarget === null) { 2026-10-24T12:44:50.6913561Z 112 │ setPendingNativeCommentSelection(null); 2026-10-24T12:44:50.6913671Z ·  ────────────────┬─────────────── 2026-10-24T12:44:50.6913858Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.6913918Z 113 │ } 2026-10-24T12:44:50.6913974Z ╰──── 2026-10-24T12:44:50.6914572Z  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-24T12:44:50.6914905Z  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-24T12:44:50.6914911Z 2026-10-24T12:44:50.6915118Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T12:44:50.6915309Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7] 2026-10-24T12:44:50.6915411Z 107 │ setPendingNativeCommentSelection(null); 2026-10-24T12:44:50.6915484Z 108 │ }, [selectedSection?.id]); 2026-10-24T12:44:50.6915575Z ·  ─────────┬───────── 2026-10-24T12:44:50.6915741Z · ╰── Unnecessary dependency `selectedSection?.id` 2026-10-24T12:44:50.6915798Z 109 │ 2026-10-24T12:44:50.6915850Z ╰──── 2026-10-24T12:44:50.6916156Z  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-24T12:44:50.6916475Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.6916478Z 2026-10-24T12:44:50.6916738Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T12:44:50.6916908Z ╭─[apps/mobile/src/features/review/ReviewCommentComposerSheet.tsx:103:7] 2026-10-24T12:44:50.6916961Z 100 │ 2026-10-24T12:44:50.6917029Z 101 │ useEffect(() => { 2026-10-24T12:44:50.6917103Z ·  ────┬──── 2026-10-24T12:44:50.6917236Z · ╰── This is the containing effect 2026-10-24T12:44:50.6917417Z 102 │ if (!target || selectedLines.length === 0) { 2026-10-24T12:44:50.6917538Z 103 │ setHighlightedLinesById({}); 2026-10-24T12:44:50.6917634Z ·  ───────────┬─────────── 2026-10-24T12:44:50.6917813Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.6917876Z 104 │ return; 2026-10-24T12:44:50.6917931Z ╰──── 2026-10-24T12:44:50.6918534Z  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-24T12:44:50.6918866Z  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-24T12:44:50.6918871Z 2026-10-24T12:44:50.6919134Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T12:44:50.6919309Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:60:5] 2026-10-24T12:44:50.6919366Z 55 │ 2026-10-24T12:44:50.6919434Z 56 │ useEffect(() => { 2026-10-24T12:44:50.6919510Z ·  ────┬──── 2026-10-24T12:44:50.6919639Z · ╰── This is the containing effect 2026-10-24T12:44:50.6919711Z 57 │ scheduler.reset(); 2026-10-24T12:44:50.6919814Z 58 │ highlightedRowIdsRef.current = new Set(); 2026-10-24T12:44:50.6919901Z 59 │ visibleChunkIndexRef.current = 0; 2026-10-24T12:44:50.6920021Z 60 │ setVisibleRange({ firstRowIndex: 0, lastRowIndex: 80 }); 2026-10-24T12:44:50.6920111Z ·  ───────┬─────── 2026-10-24T12:44:50.6920288Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.6920403Z 61 │ setTokensPatchJson(createEmptyTokenPatch(resetKey)); 2026-10-24T12:44:50.6920459Z ╰──── 2026-10-24T12:44:50.6921061Z  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-24T12:44:50.6921386Z  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-24T12:44:50.6921389Z 2026-10-24T12:44:50.6921669Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T12:44:50.6921876Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:63:7] 2026-10-24T12:44:50.6921962Z 62 │ return () => scheduler.cancel(); 2026-10-24T12:44:50.6922066Z 63 │ }, [enabled, resetKey, rows.length, scheduler]); 2026-10-24T12:44:50.6922199Z ·  ───┬─── ─────┬───── 2026-10-24T12:44:50.6922399Z · │ ╰── Unnecessary dependency `rows.length` 2026-10-24T12:44:50.6922539Z · ╰── Unnecessary dependency `enabled` 2026-10-24T12:44:50.6922596Z 64 │ 2026-10-24T12:44:50.6922652Z ╰──── 2026-10-24T12:44:50.6923002Z  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-24T12:44:50.6923330Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.6923332Z 2026-10-24T12:44:50.6923626Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T12:44:50.6923785Z ╭─[apps/web/src/components/settings/SettingInheritance.tsx:163:24] 2026-10-24T12:44:50.6923847Z 162 │ keys, 2026-10-24T12:44:50.6923920Z 163 │ overridingProjects = [], 2026-10-24T12:44:50.6924009Z ·  ── 2026-10-24T12:44:50.6924079Z 164 │ onClearOverrides, 2026-10-24T12:44:50.6924136Z ╰──── 2026-10-24T12:44:50.6924461Z  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-24T12:44:50.6924469Z 2026-10-24T12:44:50.6924729Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T12:44:50.6924904Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:79:5] 2026-10-24T12:44:50.6924960Z 76 │ 2026-10-24T12:44:50.6925029Z 77 │ useEffect(() => { 2026-10-24T12:44:50.6925101Z ·  ────┬──── 2026-10-24T12:44:50.6925234Z · ╰── This is the containing effect 2026-10-24T12:44:50.6925366Z 78 │ const { host, code } = parsePairingUrl(connectionPairingUrl); 2026-10-24T12:44:50.6925439Z 79 │ setHostInput(host); 2026-10-24T12:44:50.6925520Z ·  ──────┬───── 2026-10-24T12:44:50.6925695Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.6925766Z 80 │ setCodeInput(code); 2026-10-24T12:44:50.6925816Z ╰──── 2026-10-24T12:44:50.6926421Z  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-24T12:44:50.6926747Z  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-24T12:44:50.6926750Z 2026-10-24T12:44:50.6927084Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T12:44:50.6927288Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:89:5] 2026-10-24T12:44:50.6927344Z 82 │ 2026-10-24T12:44:50.6927408Z 83 │ useEffect(() => { 2026-10-24T12:44:50.6927483Z ·  ────┬──── 2026-10-24T12:44:50.6927615Z · ╰── This is the containing effect 2026-10-24T12:44:50.6927704Z 84 │ if (routePairingUrl.length === 0) { 2026-10-24T12:44:50.6927767Z 85 │ return; 2026-10-24T12:44:50.6927826Z 86 │ } 2026-10-24T12:44:50.6927882Z 87 │ 2026-10-24T12:44:50.6928000Z 88 │ const { host, code } = parsePairingUrl(routePairingUrl); 2026-10-24T12:44:50.6928071Z 89 │ setHostInput(host); 2026-10-24T12:44:50.6928156Z ·  ──────┬───── 2026-10-24T12:44:50.6928329Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.6928395Z 90 │ setCodeInput(code); 2026-10-24T12:44:50.6928449Z ╰──── 2026-10-24T12:44:50.6929055Z  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-24T12:44:50.6929377Z  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-24T12:44:50.6929380Z 2026-10-24T12:44:50.6929644Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T12:44:50.6929816Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:95:7] 2026-10-24T12:44:50.6929873Z 92 │ 2026-10-24T12:44:50.6929940Z 93 │ useEffect(() => { 2026-10-24T12:44:50.6930016Z ·  ────┬──── 2026-10-24T12:44:50.6930144Z · ╰── This is the containing effect 2026-10-24T12:44:50.6930230Z 94 │ if (pairingConnectionError) { 2026-10-24T12:44:50.6930306Z 95 │ setIsSubmitting(false); 2026-10-24T12:44:50.6930393Z ·  ───────┬─────── 2026-10-24T12:44:50.6930563Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.6930622Z 96 │ } 2026-10-24T12:44:50.6930676Z ╰──── 2026-10-24T12:44:50.6931285Z  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-24T12:44:50.6931611Z  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-24T12:44:50.6931620Z 2026-10-24T12:44:50.6931825Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-24T12:44:50.6931936Z ╭─[packages/contracts/src/rpc.ts:297:8] 2026-10-24T12:44:50.6932006Z 296 │ } from "./device.ts"; 2026-10-24T12:44:50.6932103Z 297 │ import {} from "./previewAutomation.ts"; 2026-10-24T12:44:50.6932244Z ·  ── 2026-10-24T12:44:50.6932350Z 298 │ import { 2026-10-24T12:44:50.6932408Z ╰──── 2026-10-24T12:44:50.6932490Z  help: Remove empty braces 2026-10-24T12:44:50.6932496Z 2026-10-24T12:44:50.6932680Z ⚠ react(static-components): Cannot create components during render 2026-10-24T12:44:50.6932887Z ╭─[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10] 2026-10-24T12:44:50.6932979Z 196 │ const { onInput, onResize } = props; 2026-10-24T12:44:50.6933130Z 197 │ const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView(); 2026-10-24T12:44:50.6933264Z ·  ────────────────┬─────────────── 2026-10-24T12:44:50.6933460Z · ╰── The component is created during render here 2026-10-24T12:44:50.6933597Z 198 │ const hasNativeSurface = Boolean(NativeTerminalSurfaceView); 2026-10-24T12:44:50.6933658Z 199 │ 2026-10-24T12:44:50.6933724Z 200 │ useEffect(() => { 2026-10-24T12:44:50.6933816Z 201 │ terminalDebugLog("native:surface", { 2026-10-24T12:44:50.6933905Z 202 │ terminalKey: props.terminalKey, 2026-10-24T12:44:50.6933987Z 203 │ native: hasNativeSurface, 2026-10-24T12:44:50.6934122Z 204 │ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(), 2026-10-24T12:44:50.6934210Z 205 │ bufferLen: props.buffer.length, 2026-10-24T12:44:50.6934293Z 206 │ isRunning: props.isRunning, 2026-10-24T12:44:50.6934352Z 207 │ }); 2026-10-24T12:44:50.6934513Z 208 │ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]); 2026-10-24T12:44:50.6934606Z 209 │ const handleNativeInput = useCallback( 2026-10-24T12:44:50.6934732Z 210 │ (event: NativeSyntheticEvent) => { 2026-10-24T12:44:50.6934838Z 211 │ if (!props.isRunning || props.readOnly) { 2026-10-24T12:44:50.6934901Z 212 │ return; 2026-10-24T12:44:50.6934961Z 213 │ } 2026-10-24T12:44:50.6935055Z 214 │ terminalDebugLog("native:onInput", { 2026-10-24T12:44:50.6935208Z 215 │ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)), 2026-10-24T12:44:50.6935271Z 216 │ }); 2026-10-24T12:44:50.6935360Z 217 │ onInput(event.nativeEvent.data); 2026-10-24T12:44:50.6935420Z 218 │ }, 2026-10-24T12:44:50.6935518Z 219 │ [onInput, props.isRunning, props.readOnly], 2026-10-24T12:44:50.6935576Z 220 │ ); 2026-10-24T12:44:50.6935670Z 221 │ const handleNativeResize = useCallback( 2026-10-24T12:44:50.6935789Z 222 │ (event: NativeSyntheticEvent) => { 2026-10-24T12:44:50.6935858Z 223 │ onResize({ 2026-10-24T12:44:50.6935947Z 224 │ cols: event.nativeEvent.cols, 2026-10-24T12:44:50.6936033Z 225 │ rows: event.nativeEvent.rows, 2026-10-24T12:44:50.6936093Z 226 │ }); 2026-10-24T12:44:50.6936149Z 227 │ }, 2026-10-24T12:44:50.6936215Z 228 │ [onResize], 2026-10-24T12:44:50.6936272Z 229 │ ); 2026-10-24T12:44:50.6936327Z 230 │ 2026-10-24T12:44:50.6936409Z 231 │ if (NativeTerminalSurfaceView) { 2026-10-24T12:44:50.6936472Z 232 │ return ( 2026-10-24T12:44:50.6936553Z 233 │ 2026-10-24T12:44:50.6936635Z 234 │ ({ key: input.targetKey, location: candidate })); 2026-10-24T12:44:50.6939291Z 113 │ useEffect(() => { 2026-10-24T12:44:50.6939366Z ·  ────┬──── 2026-10-24T12:44:50.6939500Z · ╰── This is the containing effect 2026-10-24T12:44:50.6939672Z 114 │ if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) { 2026-10-24T12:44:50.6939739Z 115 │ return; 2026-10-24T12:44:50.6939798Z 116 │ } 2026-10-24T12:44:50.6939919Z 117 │ setEntry({ key: input.targetKey, location: candidate }); 2026-10-24T12:44:50.6939991Z ·  ────┬─── 2026-10-24T12:44:50.6940161Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.6940286Z 118 │ }, [candidate, entry.key, entry.location, input.targetKey]); 2026-10-24T12:44:50.6940341Z ╰──── 2026-10-24T12:44:50.6940946Z  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-24T12:44:50.6941282Z  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-24T12:44:50.6941287Z 2026-10-24T12:44:50.6941589Z ⚠ eslint(no-unused-vars): Variable 'revokeActiveMcpThread' is declared but never used. Unused variables should start with a '_'. 2026-10-24T12:44:50.6941721Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:218:7] 2026-10-24T12:44:50.6941777Z 217 │ 2026-10-24T12:44:50.6941925Z 218 │ const revokeActiveMcpThread = (threadId: ThreadId): Effect.Effect => 2026-10-24T12:44:50.6942020Z ·  ──────────┬────────── 2026-10-24T12:44:50.6942184Z · ╰── 'revokeActiveMcpThread' is declared here 2026-10-24T12:44:50.6942450Z 219 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeThread(threadId) : Effect.void; 2026-10-24T12:44:50.6942537Z ╰──── 2026-10-24T12:44:50.6942647Z  help: Consider removing this declaration. 2026-10-24T12:44:50.6942650Z 2026-10-24T12:44:50.6942996Z ⚠ eslint(no-unused-vars): Variable 'revokeAllActiveMcpCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-24T12:44:50.6943126Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:221:7] 2026-10-24T12:44:50.6943182Z 220 │ 2026-10-24T12:44:50.6943314Z 221 │ const revokeAllActiveMcpCredentials = (): Effect.Effect => 2026-10-24T12:44:50.6943423Z ·  ──────────────┬────────────── 2026-10-24T12:44:50.6943607Z · ╰── 'revokeAllActiveMcpCredentials' is declared here 2026-10-24T12:44:50.6943778Z 222 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void; 2026-10-24T12:44:50.6943835Z ╰──── 2026-10-24T12:44:50.6943961Z  help: Consider removing this declaration. 2026-10-24T12:44:50.6943963Z 2026-10-24T12:44:50.6944175Z ⚠ typescript(no-extraneous-class): Unexpected class with only a constructor. 2026-10-24T12:44:50.6944301Z ╭─[apps/desktop/src/preview/Manager.test.ts:158:18] 2026-10-24T12:44:50.6944402Z 157 │ BrowserWindow: browserWindowConstructor, 2026-10-24T12:44:50.6944569Z 158 │ ╭─▶ ClipboardItem: class { 2026-10-24T12:44:50.6944702Z 159 │ │ constructor(data: Record) { 2026-10-24T12:44:50.6944824Z 160 │ │ clipboardItemConstructor(data); 2026-10-24T12:44:50.6944904Z 161 │ │ } 2026-10-24T12:44:50.6945037Z 162 │ ╰─▶ }, 2026-10-24T12:44:50.6945103Z 163 │ clipboard: { 2026-10-24T12:44:50.6945157Z ╰──── 2026-10-24T12:44:50.6945325Z  help: Try replacing this class with a standalone function or deleting it entirely 2026-10-24T12:44:50.6945327Z 2026-10-24T12:44:50.6945588Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T12:44:50.6945763Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:643:5] 2026-10-24T12:44:50.6945819Z 638 │ 2026-10-24T12:44:50.6945885Z 639 │ useEffect(() => { 2026-10-24T12:44:50.6945961Z ·  ────┬──── 2026-10-24T12:44:50.6946094Z · ╰── This is the containing effect 2026-10-24T12:44:50.6946295Z 640 │ if (pendingLaunchEntry.key === launchTargetKey) { 2026-10-24T12:44:50.6946396Z 641 │ return; 2026-10-24T12:44:50.6946456Z 642 │ } 2026-10-24T12:44:50.6946533Z 643 │ setPendingLaunchEntry({ 2026-10-24T12:44:50.6946625Z ·  ──────────┬────────── 2026-10-24T12:44:50.6946799Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.6946876Z 644 │ key: launchTargetKey, 2026-10-24T12:44:50.6946931Z ╰──── 2026-10-24T12:44:50.6947542Z  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-24T12:44:50.6947873Z  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-24T12:44:50.6947878Z 2026-10-24T12:44:50.6948137Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T12:44:50.6948311Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5] 2026-10-24T12:44:50.6948369Z 648 │ 2026-10-24T12:44:50.6948437Z 649 │ useEffect(() => { 2026-10-24T12:44:50.6948509Z ·  ────┬──── 2026-10-24T12:44:50.6948752Z · ╰── This is the containing effect 2026-10-24T12:44:50.6948872Z 650 │ if (initialAttachGridEntry.key === launchTargetKey) { 2026-10-24T12:44:50.6948937Z 651 │ return; 2026-10-24T12:44:50.6948997Z 652 │ } 2026-10-24T12:44:50.6949084Z 653 │ setInitialAttachGridEntry({ 2026-10-24T12:44:50.6949181Z ·  ────────────┬──────────── 2026-10-24T12:44:50.6949356Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.6949430Z 654 │ key: launchTargetKey, 2026-10-24T12:44:50.6949484Z ╰──── 2026-10-24T12:44:50.6950087Z  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-24T12:44:50.6950420Z  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-24T12:44:50.6950426Z 2026-10-24T12:44:50.6950688Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T12:44:50.6950856Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7] 2026-10-24T12:44:50.6950912Z 743 │ 2026-10-24T12:44:50.6950980Z 744 │ useEffect(() => { 2026-10-24T12:44:50.6951054Z ·  ────┬──── 2026-10-24T12:44:50.6951182Z · ╰── This is the containing effect 2026-10-24T12:44:50.6951287Z 745 │ if (!routeEnvironmentId || !routeThreadId) { 2026-10-24T12:44:50.6951359Z 746 │ setLastGridSize({ 2026-10-24T12:44:50.6951444Z ·  ───────┬─────── 2026-10-24T12:44:50.6951747Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.6951879Z 747 │ cols: DEFAULT_TERMINAL_COLS, 2026-10-24T12:44:50.6951934Z ╰──── 2026-10-24T12:44:50.6952535Z  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-24T12:44:50.6952892Z  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-24T12:44:50.6952895Z 2026-10-24T12:44:50.6953102Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T12:44:50.6953280Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24] 2026-10-24T12:44:50.6953343Z 537 │ }); 2026-10-24T12:44:50.6953470Z 538 │ }, [terminal.buffer, terminal.buffer.length, terminalKey]); 2026-10-24T12:44:50.6953580Z ·  ───────────┬────────── 2026-10-24T12:44:50.6953838Z · ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead 2026-10-24T12:44:50.6954006Z 539 │ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null; 2026-10-24T12:44:50.6954061Z ╰──── 2026-10-24T12:44:50.6954359Z  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-24T12:44:50.6954680Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.6954685Z 2026-10-24T12:44:50.6954889Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T12:44:50.6955062Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7] 2026-10-24T12:44:50.6955160Z 708 │ sentInitialInputKeyRef.current = null; 2026-10-24T12:44:50.6955229Z 709 │ }, [terminalKey]); 2026-10-24T12:44:50.6955311Z ·  ─────┬───── 2026-10-24T12:44:50.6955461Z · ╰── Unnecessary dependency `terminalKey` 2026-10-24T12:44:50.6955514Z 710 │ 2026-10-24T12:44:50.6955569Z ╰──── 2026-10-24T12:44:50.6955872Z  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-24T12:44:50.6956190Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.6956193Z 2026-10-24T12:44:50.6956394Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T12:44:50.6956563Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52] 2026-10-24T12:44:50.6956624Z 799 │ }; 2026-10-24T12:44:50.6956808Z 800 │ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]); 2026-10-24T12:44:50.6956998Z ·  ────────────┬──────────── ─────┬───── 2026-10-24T12:44:50.6957302Z · │ ╰── Unnecessary dependency `terminalKey` 2026-10-24T12:44:50.6957549Z · ╰── Unnecessary dependency `terminal.lifecycleVersion` 2026-10-24T12:44:50.6957606Z 801 │ 2026-10-24T12:44:50.6957662Z ╰──── 2026-10-24T12:44:50.6957956Z  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-24T12:44:50.6958295Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.6958297Z 2026-10-24T12:44:50.6958446Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.6958625Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24] 2026-10-24T12:44:50.6958685Z 792 │ } 2026-10-24T12:44:50.6958792Z 793 │ const pasteSession = pasteSessionRef.current; 2026-10-24T12:44:50.6958907Z ·  ───────────┬─────────── 2026-10-24T12:44:50.6959076Z · ╰── Cannot access ref value during render 2026-10-24T12:44:50.6959132Z 794 │ 2026-10-24T12:44:50.6959184Z ╰──── 2026-10-24T12:44:50.6959663Z  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-24T12:44:50.6959968Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.6959973Z 2026-10-24T12:44:50.6960175Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T12:44:50.6960337Z ╭─[apps/mobile/src/features/terminal/TerminalContextSheet.tsx:72:15] 2026-10-24T12:44:50.6960404Z 71 │ 2026-10-24T12:44:50.6961527Z 220 │ {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")} 2026-10-24T12:44:50.6961642Z ·  ──┬─ 2026-10-24T12:44:50.6961813Z · ╰── 'U+001B' is a control character. 2026-10-24T12:44:50.6961878Z 221 │ 2026-10-24T12:44:50.6961933Z ╰──── 2026-10-24T12:44:50.6962170Z  help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression. 2026-10-24T12:44:50.6962173Z 2026-10-24T12:44:50.6962395Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.6962604Z ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14] 2026-10-24T12:44:50.6962722Z 26 │ const latestInput = useRef(input); 2026-10-24T12:44:50.6962802Z 27 │ latestInput.current = input; 2026-10-24T12:44:50.6962918Z ·  ─────┬─────────┬─── 2026-10-24T12:44:50.6963103Z · │ ╰── Cannot update ref value during render 2026-10-24T12:44:50.6963222Z · ╰── This value is a ref 2026-10-24T12:44:50.6963301Z 28 │ const mounted = useRef(true); 2026-10-24T12:44:50.6963356Z ╰──── 2026-10-24T12:44:50.6963840Z  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-24T12:44:50.6964137Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.6964140Z 2026-10-24T12:44:50.6964288Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.6964453Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:122:38] 2026-10-24T12:44:50.6964617Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-24T12:44:50.6964740Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-24T12:44:50.6964868Z ·  ───────────┬────────── 2026-10-24T12:44:50.6965052Z · ╰── Cannot access ref value during render 2026-10-24T12:44:50.6965177Z 123 │ const sessionRef = useRef(null); 2026-10-24T12:44:50.6965229Z ╰──── 2026-10-24T12:44:50.6965701Z  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-24T12:44:50.6965997Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.6966000Z 2026-10-24T12:44:50.6966147Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.6966314Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8] 2026-10-24T12:44:50.6966370Z 125 │ 2026-10-24T12:44:50.6966483Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T12:44:50.6966577Z ·  ─────────┬──────── 2026-10-24T12:44:50.6966731Z · ╰── Cannot access ref value during render 2026-10-24T12:44:50.6966834Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T12:44:50.6966892Z ╰──── 2026-10-24T12:44:50.6967364Z  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-24T12:44:50.6967733Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.6967769Z 2026-10-24T12:44:50.6967917Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.6968077Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7] 2026-10-24T12:44:50.6968134Z 125 │ 2026-10-24T12:44:50.6968245Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T12:44:50.6968337Z ·  ─────────┬───────── 2026-10-24T12:44:50.6968487Z · ╰── Cannot access ref value during render 2026-10-24T12:44:50.6968592Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T12:44:50.6968647Z ╰──── 2026-10-24T12:44:50.6969123Z  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-24T12:44:50.6969430Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.6969436Z 2026-10-24T12:44:50.6969580Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.6969741Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31] 2026-10-24T12:44:50.6969798Z 125 │ 2026-10-24T12:44:50.6969907Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T12:44:50.6970021Z ·  ─────────┬───────── 2026-10-24T12:44:50.6970200Z · ╰── Cannot access ref value during render 2026-10-24T12:44:50.6970307Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T12:44:50.6970362Z ╰──── 2026-10-24T12:44:50.6970830Z  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-24T12:44:50.6971143Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.6971146Z 2026-10-24T12:44:50.6971292Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.6971453Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30] 2026-10-24T12:44:50.6971510Z 125 │ 2026-10-24T12:44:50.6971691Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T12:44:50.6971840Z ·  ──────────┬───────── 2026-10-24T12:44:50.6972010Z · ╰── Cannot access ref value during render 2026-10-24T12:44:50.6972113Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T12:44:50.6972165Z ╰──── 2026-10-24T12:44:50.6972637Z  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-24T12:44:50.6972972Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.6972979Z 2026-10-24T12:44:50.6973129Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.6973287Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46] 2026-10-24T12:44:50.6973404Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T12:44:50.6973603Z 127 │ ╭─▶ const recorder = createLazyVoiceRecorder({ 2026-10-24T12:44:50.6973783Z 128 │ │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-24T12:44:50.6973913Z 129 │ │ onStatus: (status: RecordingStatus) => { 2026-10-24T12:44:50.6974067Z 130 │ │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-24T12:44:50.6974195Z 131 │ │ isFinished: status.isFinished, 2026-10-24T12:44:50.6974377Z 132 │ │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-24T12:44:50.6974483Z 133 │ │ error: status.error, 2026-10-24T12:44:50.6974582Z 134 │ │ url: status.url, 2026-10-24T12:44:50.6974666Z 135 │ │ }); 2026-10-24T12:44:50.6974748Z 136 │ │ }, 2026-10-24T12:44:50.6974950Z 137 │ │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-24T12:44:50.6975059Z 138 │ │ selectInput: (inputs) => { 2026-10-24T12:44:50.6975219Z 139 │ │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-24T12:44:50.6975377Z 140 │ │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-24T12:44:50.6975550Z 141 │ │ const known = microphoneOrder(preferences.value.microphones); 2026-10-24T12:44:50.6975690Z 142 │ │ const order = rememberMicrophones(known, inputs); 2026-10-24T12:44:50.6975796Z 143 │ │ if (order !== known) { 2026-10-24T12:44:50.6975939Z 144 │ │ registry.set(updateMobilePreferencesAtom, { 2026-10-24T12:44:50.6976056Z 145 │ │ transform: (current) => ({ 2026-10-24T12:44:50.6976263Z 146 │ │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-24T12:44:50.6976353Z 147 │ │ }), 2026-10-24T12:44:50.6976438Z 148 │ │ }); 2026-10-24T12:44:50.6976587Z 149 │ │ } 2026-10-24T12:44:50.6976763Z 150 │ │ return preferredMicrophoneInput(inputs, order); 2026-10-24T12:44:50.6976843Z 151 │ │ }, 2026-10-24T12:44:50.6976979Z 152 │ ├─▶ }); 2026-10-24T12:44:50.6977225Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T12:44:50.6977314Z 153 │ recorderRef.current = recorder; 2026-10-24T12:44:50.6977366Z ╰──── 2026-10-24T12:44:50.6977841Z  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-24T12:44:50.6978144Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.6978149Z 2026-10-24T12:44:50.6978299Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.6978460Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16] 2026-10-24T12:44:50.6978521Z 152 │ }); 2026-10-24T12:44:50.6978608Z 153 │ recorderRef.current = recorder; 2026-10-24T12:44:50.6978725Z ·  ─────┬─────────┬─── 2026-10-24T12:44:50.6978912Z · │ ╰── Cannot update ref value during render 2026-10-24T12:44:50.6979033Z · ╰── This value is a ref 2026-10-24T12:44:50.6979149Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T12:44:50.6979206Z ╰──── 2026-10-24T12:44:50.6979679Z  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-24T12:44:50.6979971Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.6979973Z 2026-10-24T12:44:50.6980121Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.6980281Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48] 2026-10-24T12:44:50.6980373Z 153 │ recorderRef.current = recorder; 2026-10-24T12:44:50.6980573Z 154 │ ╭─▶ sessionRef.current = new VoiceInputSession({ 2026-10-24T12:44:50.6980665Z 155 │ │ recorder, 2026-10-24T12:44:50.6980798Z 156 │ │ getTranscriber: getLocalVoiceTranscriber, 2026-10-24T12:44:50.6980919Z 157 │ │ requestPermission: async () => { 2026-10-24T12:44:50.6981085Z 158 │ │ const permission = await requestRecordingPermissionsAsync(); 2026-10-24T12:44:50.6981282Z 159 │ │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-24T12:44:50.6981363Z 160 │ │ }, 2026-10-24T12:44:50.6981510Z 161 │ │ configureRecording: configureVoiceRecordingAudio, 2026-10-24T12:44:50.6981651Z 162 │ │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-24T12:44:50.6981867Z 163 │ │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-24T12:44:50.6982018Z 164 │ │ onStateChange: (nextState) => 2026-10-24T12:44:50.6982114Z 165 │ │ setState({ 2026-10-24T12:44:50.6982218Z 166 │ │ state: nextState, 2026-10-24T12:44:50.6982357Z 167 │ │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-24T12:44:50.6982489Z 168 │ │ label: sessionRef.current?.label ?? null, 2026-10-24T12:44:50.6982573Z 169 │ │ }), 2026-10-24T12:44:50.6982747Z 170 │ ├─▶ }); 2026-10-24T12:44:50.6982955Z · ╰──── Cannot access ref value during render 2026-10-24T12:44:50.6983019Z 171 │ } 2026-10-24T12:44:50.6983074Z ╰──── 2026-10-24T12:44:50.6983545Z  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-24T12:44:50.6983834Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.6983840Z 2026-10-24T12:44:50.6983986Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.6984148Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15] 2026-10-24T12:44:50.6984234Z 153 │ recorderRef.current = recorder; 2026-10-24T12:44:50.6984344Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T12:44:50.6984460Z ·  ─────┬────────┬─── 2026-10-24T12:44:50.6984648Z · │ ╰── Cannot update ref value during render 2026-10-24T12:44:50.6984769Z · ╰── This value is a ref 2026-10-24T12:44:50.6984837Z 155 │ recorder, 2026-10-24T12:44:50.6984889Z ╰──── 2026-10-24T12:44:50.6985355Z  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-24T12:44:50.6985653Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.6985658Z 2026-10-24T12:44:50.6985804Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.6985967Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7] 2026-10-24T12:44:50.6986053Z 184 │ return () => subscription.remove(); 2026-10-24T12:44:50.6986123Z 185 │ }, [controller]); 2026-10-24T12:44:50.6986203Z ·  ─────┬──── 2026-10-24T12:44:50.6986348Z · ╰── Cannot access ref value during render 2026-10-24T12:44:50.6986405Z 186 │ 2026-10-24T12:44:50.6986460Z ╰──── 2026-10-24T12:44:50.6986999Z  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-24T12:44:50.6987326Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.6987328Z 2026-10-24T12:44:50.6987473Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.6987636Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6] 2026-10-24T12:44:50.6987726Z 184 │ return () => subscription.remove(); 2026-10-24T12:44:50.6987794Z 185 │ }, [controller]); 2026-10-24T12:44:50.6987871Z ·  ──────┬───── 2026-10-24T12:44:50.6988019Z · ╰── Cannot access ref value during render 2026-10-24T12:44:50.6988076Z 186 │ 2026-10-24T12:44:50.6988130Z ╰──── 2026-10-24T12:44:50.6988722Z  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-24T12:44:50.6989025Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.6989027Z 2026-10-24T12:44:50.6989173Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.6989336Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6] 2026-10-24T12:44:50.6989398Z 191 │ }, 2026-10-24T12:44:50.6989470Z 192 │ [controller, recorder], 2026-10-24T12:44:50.6989550Z ·  ─────┬──── 2026-10-24T12:44:50.6989701Z · ╰── Cannot access ref value during render 2026-10-24T12:44:50.6989765Z 193 │ ); 2026-10-24T12:44:50.6989816Z ╰──── 2026-10-24T12:44:50.6990282Z  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-24T12:44:50.6990574Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.6990576Z 2026-10-24T12:44:50.6990731Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.6990889Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20] 2026-10-24T12:44:50.6990989Z 174 │ const controller = session.controller; 2026-10-24T12:44:50.6991082Z 175 │ const recorder = recorderRef.current; 2026-10-24T12:44:50.6991193Z ·  ─────────┬───────── 2026-10-24T12:44:50.6991352Z · ╰── Cannot access ref value during render 2026-10-24T12:44:50.6991411Z 176 │ 2026-10-24T12:44:50.6991470Z ╰──── 2026-10-24T12:44:50.6991940Z  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-24T12:44:50.6992233Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.6992236Z 2026-10-24T12:44:50.6992506Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.6992760Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5] 2026-10-24T12:44:50.6992820Z 191 │ }, 2026-10-24T12:44:50.6992897Z 192 │ [controller, recorder], 2026-10-24T12:44:50.6992987Z ·  ───────────┬────────── 2026-10-24T12:44:50.6993142Z · ╰── Cannot access ref value during render 2026-10-24T12:44:50.6993200Z 193 │ ); 2026-10-24T12:44:50.6993257Z ╰──── 2026-10-24T12:44:50.6993721Z  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-24T12:44:50.6994022Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.6994027Z 2026-10-24T12:44:50.6994181Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.6994346Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20] 2026-10-24T12:44:50.6994446Z 245 │ return () => clearInterval(intervalId); 2026-10-24T12:44:50.6994558Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-24T12:44:50.6994652Z ·  ─────┬──── 2026-10-24T12:44:50.6994812Z · ╰── Cannot access ref value during render 2026-10-24T12:44:50.6994868Z 247 │ 2026-10-24T12:44:50.6994921Z ╰──── 2026-10-24T12:44:50.6995397Z  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-24T12:44:50.6995695Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.6995698Z 2026-10-24T12:44:50.6995843Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.6996004Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6] 2026-10-24T12:44:50.6996097Z 245 │ return () => clearInterval(intervalId); 2026-10-24T12:44:50.6996212Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-24T12:44:50.6996352Z ·  ────────────────────────┬─────────────────────── 2026-10-24T12:44:50.6996516Z · ╰── Cannot access ref value during render 2026-10-24T12:44:50.6996573Z 247 │ 2026-10-24T12:44:50.6996632Z ╰──── 2026-10-24T12:44:50.6997099Z  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-24T12:44:50.6997406Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.6997409Z 2026-10-24T12:44:50.6997556Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.6997786Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5] 2026-10-24T12:44:50.6997896Z 260 │ setOwnerFocused, 2026-10-24T12:44:50.6997963Z 261 │ session, 2026-10-24T12:44:50.6998036Z ·  ───┬─── 2026-10-24T12:44:50.6998182Z · ╰── Cannot access ref value during render 2026-10-24T12:44:50.6998246Z 262 │ stop, 2026-10-24T12:44:50.6998300Z ╰──── 2026-10-24T12:44:50.6998766Z  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-24T12:44:50.6999072Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.6999074Z 2026-10-24T12:44:50.6999225Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.6999385Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10] 2026-10-24T12:44:50.6999442Z 250 │ 2026-10-24T12:44:50.6999581Z 251 │ ╭─▶ return { 2026-10-24T12:44:50.6999796Z 252 │ │ isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null, 2026-10-24T12:44:50.6999879Z 253 │ │ state, 2026-10-24T12:44:50.7000032Z 254 │ │ audioLevels, 2026-10-24T12:44:50.7000143Z 255 │ │ elapsedSeconds, 2026-10-24T12:44:50.7000306Z 256 │ │ isBusy: voiceInputBlocksSubmission(state), 2026-10-24T12:44:50.7000544Z 257 │ │ ownerKey, 2026-10-24T12:44:50.7000673Z 258 │ │ label, 2026-10-24T12:44:50.7000778Z 259 │ │ focusedOwners, 2026-10-24T12:44:50.7000902Z 260 │ │ setOwnerFocused, 2026-10-24T12:44:50.7001011Z 261 │ │ session, 2026-10-24T12:44:50.7001143Z 262 │ │ stop, 2026-10-24T12:44:50.7001242Z 263 │ │ cancel, 2026-10-24T12:44:50.7001406Z 264 │ ├─▶ }; 2026-10-24T12:44:50.7001642Z · ╰──── Cannot access ref value during render 2026-10-24T12:44:50.7001739Z 265 │ } 2026-10-24T12:44:50.7001819Z ╰──── 2026-10-24T12:44:50.7002403Z  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-24T12:44:50.7002827Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.7002829Z 2026-10-24T12:44:50.7003035Z ⚠ react(immutability): This value cannot be modified 2026-10-24T12:44:50.7003240Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-24T12:44:50.7003415Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-24T12:44:50.7003571Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-24T12:44:50.7003681Z ·  ─────┬───── 2026-10-24T12:44:50.7003880Z · ╰── `audioLevels` originates here 2026-10-24T12:44:50.7004016Z 123 │ const sessionRef = useRef(null); 2026-10-24T12:44:50.7004194Z 124 │ const recorderRef = useRef | null>(null); 2026-10-24T12:44:50.7004284Z 125 │ 2026-10-24T12:44:50.7004433Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T12:44:50.7004556Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T12:44:50.7004726Z 128 │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-24T12:44:50.7004855Z 129 │ onStatus: (status: RecordingStatus) => { 2026-10-24T12:44:50.7005004Z 130 │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-24T12:44:50.7005125Z 131 │ isFinished: status.isFinished, 2026-10-24T12:44:50.7005314Z 132 │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-24T12:44:50.7005420Z 133 │ error: status.error, 2026-10-24T12:44:50.7005524Z 134 │ url: status.url, 2026-10-24T12:44:50.7005590Z 135 │ }); 2026-10-24T12:44:50.7005702Z 136 │ }, 2026-10-24T12:44:50.7005902Z 137 │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-24T12:44:50.7006020Z 138 │ selectInput: (inputs) => { 2026-10-24T12:44:50.7006155Z 139 │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-24T12:44:50.7006302Z 140 │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-24T12:44:50.7006470Z 141 │ const known = microphoneOrder(preferences.value.microphones); 2026-10-24T12:44:50.7006611Z 142 │ const order = rememberMicrophones(known, inputs); 2026-10-24T12:44:50.7006697Z 143 │ if (order !== known) { 2026-10-24T12:44:50.7006830Z 144 │ registry.set(updateMobilePreferencesAtom, { 2026-10-24T12:44:50.7006957Z 145 │ transform: (current) => ({ 2026-10-24T12:44:50.7007160Z 146 │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-24T12:44:50.7007240Z 147 │ }), 2026-10-24T12:44:50.7007329Z 148 │ }); 2026-10-24T12:44:50.7007419Z 149 │ } 2026-10-24T12:44:50.7007568Z 150 │ return preferredMicrophoneInput(inputs, order); 2026-10-24T12:44:50.7007646Z 151 │ }, 2026-10-24T12:44:50.7007735Z 152 │ }); 2026-10-24T12:44:50.7007841Z 153 │ recorderRef.current = recorder; 2026-10-24T12:44:50.7007992Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T12:44:50.7008066Z 155 │ recorder, 2026-10-24T12:44:50.7008200Z 156 │ getTranscriber: getLocalVoiceTranscriber, 2026-10-24T12:44:50.7008389Z 157 │ requestPermission: async () => { 2026-10-24T12:44:50.7008590Z 158 │ const permission = await requestRecordingPermissionsAsync(); 2026-10-24T12:44:50.7008772Z 159 │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-24T12:44:50.7008857Z 160 │ }, 2026-10-24T12:44:50.7008996Z 161 │ configureRecording: configureVoiceRecordingAudio, 2026-10-24T12:44:50.7009126Z 162 │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-24T12:44:50.7009260Z 163 │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-24T12:44:50.7009376Z 164 │ onStateChange: (nextState) => 2026-10-24T12:44:50.7009470Z 165 │ setState({ 2026-10-24T12:44:50.7009569Z 166 │ state: nextState, 2026-10-24T12:44:50.7009681Z 167 │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-24T12:44:50.7009839Z 168 │ label: sessionRef.current?.label ?? null, 2026-10-24T12:44:50.7009932Z 169 │ }), 2026-10-24T12:44:50.7010017Z 170 │ }); 2026-10-24T12:44:50.7010084Z 171 │ } 2026-10-24T12:44:50.7010174Z 172 │ 2026-10-24T12:44:50.7010295Z 173 │ const session = sessionRef.current; 2026-10-24T12:44:50.7010417Z 174 │ const controller = session.controller; 2026-10-24T12:44:50.7010515Z 175 │ const recorder = recorderRef.current; 2026-10-24T12:44:50.7010595Z 176 │ 2026-10-24T12:44:50.7010705Z 177 │ useEffect(() => { 2026-10-24T12:44:50.7010882Z 178 │ const subscription = AppState.addEventListener("change", (nextState) => { 2026-10-24T12:44:50.7011035Z 179 │ // iOS reports `inactive` while its permission dialog is open. Only the 2026-10-24T12:44:50.7011209Z 180 │ // real background state cancels preparation; recorder status handles 2026-10-24T12:44:50.7011352Z 181 │ // calls and route interruptions during capture. 2026-10-24T12:44:50.7011526Z 182 │ if (nextState === "background") controller.appMovedToBackground(); 2026-10-24T12:44:50.7011595Z 183 │ }); 2026-10-24T12:44:50.7011713Z 184 │ return () => subscription.remove(); 2026-10-24T12:44:50.7011802Z 185 │ }, [controller]); 2026-10-24T12:44:50.7011908Z 186 │ 2026-10-24T12:44:50.7011981Z 187 │ useEffect( 2026-10-24T12:44:50.7012071Z 188 │ () => () => { 2026-10-24T12:44:50.7012179Z 189 │ controller.dispose(); 2026-10-24T12:44:50.7012299Z 190 │ recorder.release(); 2026-10-24T12:44:50.7012376Z 191 │ }, 2026-10-24T12:44:50.7012479Z 192 │ [controller, recorder], 2026-10-24T12:44:50.7012565Z 193 │ ); 2026-10-24T12:44:50.7012640Z 194 │ 2026-10-24T12:44:50.7012764Z 195 │ useEffect(() => { 2026-10-24T12:44:50.7012900Z 196 │ if (state.phase !== "recording") return; 2026-10-24T12:44:50.7012988Z 197 │ 2026-10-24T12:44:50.7013165Z 198 │ const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`; 2026-10-24T12:44:50.7013278Z 199 │ const activation = activateKeepAwakeAsync(tag); 2026-10-24T12:44:50.7013405Z 200 │ void activation.catch(() => {}); 2026-10-24T12:44:50.7013502Z 201 │ return () => { 2026-10-24T12:44:50.7013682Z 202 │ // Release after activation settles, even if the recording ends immediately. 2026-10-24T12:44:50.7013835Z 203 │ void activation.then(() => deactivateKeepAwake(tag)).catch(() => {}); 2026-10-24T12:44:50.7013926Z 204 │ }; 2026-10-24T12:44:50.7014040Z 205 │ }, [keepAwakeId, state.phase]); 2026-10-24T12:44:50.7014125Z 206 │ 2026-10-24T12:44:50.7014201Z 207 │ useEffect(() => { 2026-10-24T12:44:50.7014430Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-24T12:44:50.7014573Z 209 │ 2026-10-24T12:44:50.7014729Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-24T12:44:50.7014898Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-24T12:44:50.7015031Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-24T12:44:50.7015150Z ·  ─────┬───── 2026-10-24T12:44:50.7015327Z · ╰── `audioLevels` cannot be modified 2026-10-24T12:44:50.7015396Z 213 │ } 2026-10-24T12:44:50.7015484Z ╰──── 2026-10-24T12:44:50.7015782Z  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-24T12:44:50.7016165Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T12:44:50.7016172Z 2026-10-24T12:44:50.7016388Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T12:44:50.7016584Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-24T12:44:50.7016670Z 206 │ 2026-10-24T12:44:50.7016775Z 207 │ useEffect(() => { 2026-10-24T12:44:50.7016875Z ·  ───┬─── 2026-10-24T12:44:50.7017135Z · ╰── This function may (indirectly) reassign or modify `audioLevels` after render 2026-10-24T12:44:50.7017302Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-24T12:44:50.7017381Z 209 │ 2026-10-24T12:44:50.7017554Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-24T12:44:50.7017731Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-24T12:44:50.7017867Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-24T12:44:50.7017980Z ·  ─────┬───── 2026-10-24T12:44:50.7018151Z · ╰── This modifies `audioLevels` 2026-10-24T12:44:50.7018228Z 213 │ } 2026-10-24T12:44:50.7018312Z ╰──── 2026-10-24T12:44:50.7018692Z  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-24T12:44:50.7019023Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T12:44:50.7019026Z 2026-10-24T12:44:50.7019216Z ⚠ react(immutability): This value cannot be modified 2026-10-24T12:44:50.7019427Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5] 2026-10-24T12:44:50.7019512Z 90 │ }) { 2026-10-24T12:44:50.7019662Z 91 │ const rotation = useSharedValue(props.hidden ? 1 : 0); 2026-10-24T12:44:50.7019809Z ·  ────┬─── 2026-10-24T12:44:50.7019966Z · ╰── `rotation` originates here 2026-10-24T12:44:50.7020071Z 92 │ useLayoutEffect(() => { 2026-10-24T12:44:50.7020249Z 93 │ rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING); 2026-10-24T12:44:50.7020346Z ·  ────┬─── 2026-10-24T12:44:50.7020504Z · ╰── `rotation` cannot be modified 2026-10-24T12:44:50.7020620Z 94 │ }, [props.hidden, rotation]); 2026-10-24T12:44:50.7020788Z ╰──── 2026-10-24T12:44:50.7021120Z  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-24T12:44:50.7021432Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T12:44:50.7021435Z 2026-10-24T12:44:50.7021648Z ⚠ react(immutability): This value cannot be modified 2026-10-24T12:44:50.7021851Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:269:5] 2026-10-24T12:44:50.7021984Z 266 │ const variant = props.variant ?? "plain"; 2026-10-24T12:44:50.7022134Z 267 │ const loadingVisibility = useSharedValue(props.loading ? 1 : 0); 2026-10-24T12:44:50.7022257Z ·  ────────┬──────── 2026-10-24T12:44:50.7022458Z · ╰── `loadingVisibility` originates here 2026-10-24T12:44:50.7022565Z 268 │ useLayoutEffect(() => { 2026-10-24T12:44:50.7022829Z 269 │ loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING); 2026-10-24T12:44:50.7022924Z ·  ────────┬──────── 2026-10-24T12:44:50.7023145Z · ╰── `loadingVisibility` cannot be modified 2026-10-24T12:44:50.7023269Z 270 │ }, [loadingVisibility, props.loading]); 2026-10-24T12:44:50.7023354Z ╰──── 2026-10-24T12:44:50.7023639Z  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-24T12:44:50.7023996Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T12:44:50.7024001Z 2026-10-24T12:44:50.7024194Z ⚠ react(immutability): This value cannot be modified 2026-10-24T12:44:50.7024397Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:328:5] 2026-10-24T12:44:50.7024467Z 325 │ }) { 2026-10-24T12:44:50.7024652Z 326 │ const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0); 2026-10-24T12:44:50.7024800Z ·  ─────────┬───────── 2026-10-24T12:44:50.7024986Z · ╰── `recordingVisibility` originates here 2026-10-24T12:44:50.7025088Z 327 │ useLayoutEffect(() => { 2026-10-24T12:44:50.7025292Z 328 │ recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING); 2026-10-24T12:44:50.7025426Z ·  ─────────┬───────── 2026-10-24T12:44:50.7025626Z · ╰── `recordingVisibility` cannot be modified 2026-10-24T12:44:50.7025790Z 329 │ }, [props.phase, recordingVisibility]); 2026-10-24T12:44:50.7025857Z ╰──── 2026-10-24T12:44:50.7026149Z  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-24T12:44:50.7026509Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T12:44:50.7026512Z 2026-10-24T12:44:50.7026805Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T12:44:50.7026986Z ╭─[apps/mobile/src/components/VideoPreviewModal.ios.tsx:63:55] 2026-10-24T12:44:50.7027135Z 61 │ }, []); 2026-10-24T12:44:50.7027271Z 62 │ useEffect(() => { 2026-10-24T12:44:50.7027385Z ·  ────┬──── 2026-10-24T12:44:50.7027535Z · ╰── This is the containing effect 2026-10-24T12:44:50.7027719Z 63 │ if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl); 2026-10-24T12:44:50.7027870Z ·  ───────┬────── 2026-10-24T12:44:50.7028127Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.7028245Z 64 │ }, [playbackUrl, resolvedUrl]); 2026-10-24T12:44:50.7028311Z ╰──── 2026-10-24T12:44:50.7029100Z  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-24T12:44:50.7029467Z  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-24T12:44:50.7029470Z 2026-10-24T12:44:50.7029776Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T12:44:50.7029914Z ╭─[apps/mobile/src/Stack.tsx:1079:21] 2026-10-24T12:44:50.7029992Z 1078 │ } 2026-10-24T12:44:50.7030346Z ·  ───────────────────────────────────────────── 2026-10-24T12:44:50.7030476Z 1080 │ screenOptions={({ route }) => 2026-10-24T12:44:50.7030547Z ╰──── 2026-10-24T12:44:50.7030949Z  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-24T12:44:50.7030952Z 2026-10-24T12:44:50.7031143Z ⚠ react(immutability): This value cannot be modified 2026-10-24T12:44:50.7031356Z ╭─[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5] 2026-10-24T12:44:50.7031493Z 65 │ const [expanded, setExpanded] = useState(false); 2026-10-24T12:44:50.7031592Z 66 │ const progress = useSharedValue(0); 2026-10-24T12:44:50.7031691Z ·  ────┬─── 2026-10-24T12:44:50.7031885Z · ╰── `progress` originates here 2026-10-24T12:44:50.7031983Z 67 │ useEffect(() => { 2026-10-24T12:44:50.7032123Z 68 │ progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING); 2026-10-24T12:44:50.7032227Z ·  ────┬─── 2026-10-24T12:44:50.7032391Z · ╰── `progress` cannot be modified 2026-10-24T12:44:50.7032542Z 69 │ }, [expanded, progress]); 2026-10-24T12:44:50.7032610Z ╰──── 2026-10-24T12:44:50.7032938Z  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-24T12:44:50.7033270Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T12:44:50.7033273Z 2026-10-24T12:44:50.7033808Z ⚠ 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-24T12:44:50.7034030Z ╭─[apps/server/src/vcs/GitVcsDriverCore.test.ts:1786:34] 2026-10-24T12:44:50.7034183Z 1785 │ const stat = branch.files!.find((file) => file.path === path)!; 2026-10-24T12:44:50.7034371Z 1786 │ const request = yield* Schema.decodeEffect(ReviewDiffPreviewInput)({ 2026-10-24T12:44:50.7034524Z ·  ─────────────────── 2026-10-24T12:44:50.7034630Z 1787 │ cwd, 2026-10-24T12:44:50.7034696Z ╰──── 2026-10-24T12:44:50.7034699Z 2026-10-24T12:44:50.7034999Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T12:44:50.7035207Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:123:7] 2026-10-24T12:44:50.7035312Z 118 │ 2026-10-24T12:44:50.7035395Z 119 │ useEffect(() => { 2026-10-24T12:44:50.7035504Z ·  ────┬──── 2026-10-24T12:44:50.7035666Z · ╰── This is the containing effect 2026-10-24T12:44:50.7035819Z 120 │ if (orientationSettled) return; 2026-10-24T12:44:50.7035955Z 121 │ const orientation = getNativeShowcaseOrientation(); 2026-10-24T12:44:50.7036068Z 122 │ if (orientation === null) { 2026-10-24T12:44:50.7036187Z 123 │ setOrientationSettled(true); 2026-10-24T12:44:50.7036302Z ·  ──────────┬────────── 2026-10-24T12:44:50.7036515Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.7036618Z 124 │ return; 2026-10-24T12:44:50.7036708Z ╰──── 2026-10-24T12:44:50.7037354Z  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-24T12:44:50.7045442Z  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-24T12:44:50.7045458Z 2026-10-24T12:44:50.7045868Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T12:44:50.7046049Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:304:7] 2026-10-24T12:44:50.7046104Z 292 │ 2026-10-24T12:44:50.7046302Z 293 │ useEffect(() => { 2026-10-24T12:44:50.7046426Z ·  ────┬──── 2026-10-24T12:44:50.7046561Z · ╰── This is the containing effect 2026-10-24T12:44:50.7046620Z 294 │ if ( 2026-10-24T12:44:50.7046688Z 295 │ scene === null || 2026-10-24T12:44:50.7046768Z 296 │ requestedScene === null || 2026-10-24T12:44:50.7046847Z 297 │ scene !== requestedScene || 2026-10-24T12:44:50.7046912Z 298 │ !hasFixture || 2026-10-24T12:44:50.7046985Z 299 │ !orientationSettled || 2026-10-24T12:44:50.7047053Z 300 │ !themeApplied || 2026-10-24T12:44:50.7047169Z 301 │ (scene === "agent-activity" && !agentActivityStaged) || 2026-10-24T12:44:50.7047303Z 302 │ !isShowcaseNativeContentReady({ scene, themeId, renderSignal }) 2026-10-24T12:44:50.7047359Z 303 │ ) { 2026-10-24T12:44:50.7047437Z 304 │ setReadyScene(null); 2026-10-24T12:44:50.7047525Z ·  ──────┬────── 2026-10-24T12:44:50.7047699Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.7047761Z 305 │ return; 2026-10-24T12:44:50.7047815Z ╰──── 2026-10-24T12:44:50.7048421Z  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-24T12:44:50.7048748Z  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-24T12:44:50.7048753Z 2026-10-24T12:44:50.7049032Z ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'. 2026-10-24T12:44:50.7049210Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:128:9] 2026-10-24T12:44:50.7049280Z 127 │ let cancelled = false; 2026-10-24T12:44:50.7049374Z 128 │ let lastOutcome: string | null = null; 2026-10-24T12:44:50.7049453Z ·  ─────┬───── 2026-10-24T12:44:50.7049592Z · ╰── 'lastOutcome' is declared here 2026-10-24T12:44:50.7049773Z 129 │ void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), { 2026-10-24T12:44:50.7049825Z ╰──── 2026-10-24T12:44:50.7049932Z  help: Consider removing this declaration. 2026-10-24T12:44:50.7049935Z 2026-10-24T12:44:50.7050182Z ⚠ unicorn(prefer-string-starts-ends-with): Prefer String#startsWith over a regex with a caret. 2026-10-24T12:44:50.7050309Z ╭─[apps/server/src/vcs/GitVcsDriverCore.ts:517:11] 2026-10-24T12:44:50.7050410Z 516 │ GIT_DIAGNOSTIC_LINE_PATTERN.test(line) || 2026-10-24T12:44:50.7050548Z 517 │ (!/^remote:/.test(line) && SSH_TRANSPORT_REFUSAL_PATTERN.test(line)), 2026-10-24T12:44:50.7050638Z ·  ─────────────── 2026-10-24T12:44:50.7050695Z 518 │ ) 2026-10-24T12:44:50.7050747Z ╰──── 2026-10-24T12:44:50.7050901Z  help: Replace `/^remote:/.test(line)` with `line.startsWith('remote:')`. 2026-10-24T12:44:50.7050904Z 2026-10-24T12:44:50.7051460Z ⚠ 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-24T12:44:50.7051680Z ╭─[apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts:223:5] 2026-10-24T12:44:50.7051753Z 222 │ let idlePasses = 0; 2026-10-24T12:44:50.7051899Z 223 │ ╭─▶ for (;;) { 2026-10-24T12:44:50.7052038Z 224 │ │ yield* Effect.promise(() => Promise.resolve()); 2026-10-24T12:44:50.7052184Z 225 │ │ const pending = backgroundRuntime.pending.shift(); 2026-10-24T12:44:50.7052279Z 226 │ │ if (!pending) { 2026-10-24T12:44:50.7052374Z 227 │ │ idlePasses++; 2026-10-24T12:44:50.7052479Z 228 │ │ if (idlePasses >= 3) { 2026-10-24T12:44:50.7052567Z 229 │ │ return; 2026-10-24T12:44:50.7052652Z 230 │ │ } 2026-10-24T12:44:50.7052771Z 231 │ │ continue; 2026-10-24T12:44:50.7052847Z 232 │ │ } 2026-10-24T12:44:50.7052941Z 233 │ │ idlePasses = 0; 2026-10-24T12:44:50.7053057Z 234 │ │ const exit = yield* Effect.exit( 2026-10-24T12:44:50.7053275Z 235 │ │ pending.operation as Effect.Effect, 2026-10-24T12:44:50.7053351Z 236 │ │ ); 2026-10-24T12:44:50.7053461Z 237 │ │ yield* Effect.sync(() => { 2026-10-24T12:44:50.7053567Z 238 │ │ pending.resolve(exit); 2026-10-24T12:44:50.7053645Z 239 │ │ }); 2026-10-24T12:44:50.7053782Z 240 │ ╰─▶ } 2026-10-24T12:44:50.7053844Z 241 │ }, 2026-10-24T12:44:50.7053896Z ╰──── 2026-10-24T12:44:50.7053899Z 2026-10-24T12:44:50.7054102Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T12:44:50.7054264Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:155:7] 2026-10-24T12:44:50.7054320Z 154 │ } 2026-10-24T12:44:50.7054388Z 155 │ }, [wrappedRender]); 2026-10-24T12:44:50.7054469Z ·  ──────┬────── 2026-10-24T12:44:50.7054620Z · ╰── Unnecessary dependency `wrappedRender` 2026-10-24T12:44:50.7054676Z 156 │ 2026-10-24T12:44:50.7054728Z ╰──── 2026-10-24T12:44:50.7055033Z  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-24T12:44:50.7055356Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.7055358Z 2026-10-24T12:44:50.7055606Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T12:44:50.7055770Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:800:42] 2026-10-24T12:44:50.7055827Z 799 │ > 2026-10-24T12:44:50.7055957Z 800 │ 2026-10-24T12:44:50.7056082Z ·  ──────────────────── 2026-10-24T12:44:50.7056184Z 801 │ 2026-10-24T12:44:50.7056309Z ╰──── 2026-10-24T12:44:50.7056567Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T12:44:50.7056708Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T12:44:50.7056711Z 2026-10-24T12:44:50.7056868Z ⚠ react(immutability): This value cannot be modified 2026-10-24T12:44:50.7057030Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:42:5] 2026-10-24T12:44:50.7057083Z 35 │ 2026-10-24T12:44:50.7057223Z 36 │ const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0); 2026-10-24T12:44:50.7057313Z ·  ────────┬──────── 2026-10-24T12:44:50.7057462Z · ╰── `inspectorProgress` originates here 2026-10-24T12:44:50.7057563Z 37 │ const { renderedInspectorWidth } = props; 2026-10-24T12:44:50.7057698Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-24T12:44:50.7057752Z 39 │ 2026-10-24T12:44:50.7057833Z 40 │ const onClosed = props.onClosed; 2026-10-24T12:44:50.7057896Z 41 │ useEffect(() => { 2026-10-24T12:44:50.7057987Z 42 │ inspectorProgress.value = withTiming( 2026-10-24T12:44:50.7058069Z ·  ────────┬──────── 2026-10-24T12:44:50.7058220Z · ╰── `inspectorProgress` cannot be modified 2026-10-24T12:44:50.7058297Z 43 │ inspectorVisible ? 1 : 0, 2026-10-24T12:44:50.7058349Z ╰──── 2026-10-24T12:44:50.7058620Z  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-24T12:44:50.7058941Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T12:44:50.7058946Z 2026-10-24T12:44:50.7059102Z ⚠ react(immutability): This value cannot be modified 2026-10-24T12:44:50.7059261Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:67:7] 2026-10-24T12:44:50.7059355Z 37 │ const { renderedInspectorWidth } = props; 2026-10-24T12:44:50.7059487Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-24T12:44:50.7059578Z ·  ──────────┬───────── 2026-10-24T12:44:50.7059734Z · ╰── `renderedContentWidth` originates here 2026-10-24T12:44:50.7059787Z 39 │ 2026-10-24T12:44:50.7059866Z 40 │ const onClosed = props.onClosed; 2026-10-24T12:44:50.7059937Z 41 │ useEffect(() => { 2026-10-24T12:44:50.7060027Z 42 │ inspectorProgress.value = withTiming( 2026-10-24T12:44:50.7060103Z 43 │ inspectorVisible ? 1 : 0, 2026-10-24T12:44:50.7060175Z 44 │ WORKSPACE_PANE_TIMING, 2026-10-24T12:44:50.7060241Z 45 │ (finished) => { 2026-10-24T12:44:50.7060379Z 46 │ if (finished === true && !inspectorVisible && onClosed !== undefined) { 2026-10-24T12:44:50.7060451Z 47 │ runOnJS(onClosed)(); 2026-10-24T12:44:50.7060508Z 48 │ } 2026-10-24T12:44:50.7060564Z 49 │ }, 2026-10-24T12:44:50.7060617Z 50 │ ); 2026-10-24T12:44:50.7060750Z 51 │ const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0; 2026-10-24T12:44:50.7060830Z 52 │ renderedInspectorWidth.set( 2026-10-24T12:44:50.7060974Z 53 │ resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING), 2026-10-24T12:44:50.7061029Z 54 │ ); 2026-10-24T12:44:50.7061159Z 55 │ }, [ 2026-10-24T12:44:50.7061259Z 56 │ inspectorProgress, 2026-10-24T12:44:50.7061323Z 57 │ inspectorVisible, 2026-10-24T12:44:50.7061386Z 58 │ inspectorWidth, 2026-10-24T12:44:50.7061447Z 59 │ onClosed, 2026-10-24T12:44:50.7061519Z 60 │ renderedInspectorWidth, 2026-10-24T12:44:50.7061577Z 61 │ resizing, 2026-10-24T12:44:50.7061631Z 62 │ ]); 2026-10-24T12:44:50.7061683Z 63 │ 2026-10-24T12:44:50.7061745Z 64 │ useEffect(() => { 2026-10-24T12:44:50.7061836Z 65 │ const targetWidth = inspectorWidth ?? 0; 2026-10-24T12:44:50.7061921Z 66 │ if (!inspectorVisible || resizing) { 2026-10-24T12:44:50.7062019Z 67 │ renderedContentWidth.value = targetWidth; 2026-10-24T12:44:50.7062106Z ·  ──────────┬───────── 2026-10-24T12:44:50.7062275Z · ╰── `renderedContentWidth` cannot be modified 2026-10-24T12:44:50.7062337Z 68 │ return; 2026-10-24T12:44:50.7062388Z ╰──── 2026-10-24T12:44:50.7062653Z  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-24T12:44:50.7063014Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T12:44:50.7063016Z 2026-10-24T12:44:50.7063491Z ⚠ 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-24T12:44:50.7063628Z ╭─[packages/client-runtime/src/rpc/client.test.ts:131:9] 2026-10-24T12:44:50.7063694Z 130 │ ) { 2026-10-24T12:44:50.7063909Z 131 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T12:44:50.7064036Z 132 │ │ if (subscriptions.length >= count) { 2026-10-24T12:44:50.7064128Z 133 │ │ return; 2026-10-24T12:44:50.7064210Z 134 │ │ } 2026-10-24T12:44:50.7064319Z 135 │ │ yield* Effect.yieldNow; 2026-10-24T12:44:50.7064454Z 136 │ ╰─▶ } 2026-10-24T12:44:50.7064623Z 137 │ return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`)); 2026-10-24T12:44:50.7064676Z ╰──── 2026-10-24T12:44:50.7064679Z 2026-10-24T12:44:50.7065157Z ⚠ 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-24T12:44:50.7065293Z ╭─[packages/client-runtime/src/rpc/client.test.ts:252:7] 2026-10-24T12:44:50.7065456Z 251 │ yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient))); 2026-10-24T12:44:50.7065711Z 252 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) { 2026-10-24T12:44:50.7065817Z 253 │ │ yield* Effect.yieldNow; 2026-10-24T12:44:50.7065949Z 254 │ ╰─▶ } 2026-10-24T12:44:50.7066073Z 255 │ yield* SubscriptionRef.set(activeSession, Option.none()); 2026-10-24T12:44:50.7066204Z ╰──── 2026-10-24T12:44:50.7066241Z 2026-10-24T12:44:50.7066707Z ⚠ 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-24T12:44:50.7066840Z ╭─[packages/client-runtime/src/rpc/client.test.ts:258:7] 2026-10-24T12:44:50.7066894Z 257 │ 2026-10-24T12:44:50.7067146Z 258 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-24T12:44:50.7067250Z 259 │ │ yield* Effect.yieldNow; 2026-10-24T12:44:50.7067381Z 260 │ ╰─▶ } 2026-10-24T12:44:50.7067490Z 261 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-24T12:44:50.7067544Z ╰──── 2026-10-24T12:44:50.7067547Z 2026-10-24T12:44:50.7068012Z ⚠ 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-24T12:44:50.7068144Z ╭─[packages/client-runtime/src/rpc/client.test.ts:322:7] 2026-10-24T12:44:50.7068204Z 321 │ ); 2026-10-24T12:44:50.7068459Z 322 │ ╭─▶ for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) { 2026-10-24T12:44:50.7068680Z 323 │ │ yield* Effect.yieldNow; 2026-10-24T12:44:50.7068848Z 324 │ ╰─▶ } 2026-10-24T12:44:50.7068910Z 325 │ 2026-10-24T12:44:50.7068965Z ╰──── 2026-10-24T12:44:50.7068968Z 2026-10-24T12:44:50.7069430Z ⚠ 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-24T12:44:50.7069562Z ╭─[packages/client-runtime/src/rpc/client.test.ts:330:7] 2026-10-24T12:44:50.7069726Z 329 │ yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient))); 2026-10-24T12:44:50.7069976Z 330 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-24T12:44:50.7070080Z 331 │ │ yield* Effect.yieldNow; 2026-10-24T12:44:50.7070344Z 332 │ ╰─▶ } 2026-10-24T12:44:50.7070499Z 333 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-24T12:44:50.7070549Z ╰──── 2026-10-24T12:44:50.7070553Z 2026-10-24T12:44:50.7071016Z ⚠ 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-24T12:44:50.7071152Z ╭─[packages/client-runtime/src/rpc/session.test.ts:226:3] 2026-10-24T12:44:50.7071210Z 225 │ ) { 2026-10-24T12:44:50.7071414Z 226 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T12:44:50.7071526Z 227 │ │ const socket = sockets[index]; 2026-10-24T12:44:50.7071620Z 228 │ │ if (socket) { 2026-10-24T12:44:50.7071717Z 229 │ │ return socket; 2026-10-24T12:44:50.7071792Z 230 │ │ } 2026-10-24T12:44:50.7071893Z 231 │ │ yield* Effect.yieldNow; 2026-10-24T12:44:50.7072018Z 232 │ ╰─▶ } 2026-10-24T12:44:50.7072195Z 233 │ return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket.")); 2026-10-24T12:44:50.7072247Z ╰──── 2026-10-24T12:44:50.7072249Z 2026-10-24T12:44:50.7072744Z ⚠ 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-24T12:44:50.7072884Z ╭─[packages/client-runtime/src/rpc/session.test.ts:240:3] 2026-10-24T12:44:50.7072944Z 239 │ ) { 2026-10-24T12:44:50.7073145Z 240 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T12:44:50.7073361Z 241 │ │ const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index]; 2026-10-24T12:44:50.7073451Z 242 │ │ if (request) { 2026-10-24T12:44:50.7073545Z 243 │ │ return request; 2026-10-24T12:44:50.7073619Z 244 │ │ } 2026-10-24T12:44:50.7073719Z 245 │ │ yield* Effect.yieldNow; 2026-10-24T12:44:50.7073845Z 246 │ ╰─▶ } 2026-10-24T12:44:50.7074019Z 247 │ return yield* Effect.die(new Error("Expected the RPC protocol to send a request.")); 2026-10-24T12:44:50.7074074Z ╰──── 2026-10-24T12:44:50.7074076Z 2026-10-24T12:44:50.7074267Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T12:44:50.7074383Z ╭─[apps/mobile/src/lib/useHoverGesture.ts:8:15] 2026-10-24T12:44:50.7074439Z 7 │ () => 2026-10-24T12:44:50.7074504Z 8 │ Gesture.Hover() 2026-10-24T12:44:50.7074584Z ·  ──┬── 2026-10-24T12:44:50.7074717Z · ╰── `Hover` may be a component 2026-10-24T12:44:50.7074791Z 9 │ .manualActivation(true) 2026-10-24T12:44:50.7074843Z ╰──── 2026-10-24T12:44:50.7075127Z  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-24T12:44:50.7075653Z  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-24T12:44:50.7075689Z 2026-10-24T12:44:50.7075858Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T12:44:50.7075980Z ╭─[apps/server/src/processRunner.test.ts:266:14] 2026-10-24T12:44:50.7076035Z 265 │ 2026-10-24T12:44:50.7076139Z 266 │ for (const {} of ["timeout", "success"] as const) { 2026-10-24T12:44:50.7076211Z ·  ── 2026-10-24T12:44:50.7076266Z 267 │ } 2026-10-24T12:44:50.7076318Z ╰──── 2026-10-24T12:44:50.7076548Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T12:44:50.7076559Z 2026-10-24T12:44:50.7076766Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-24T12:44:50.7076938Z ╭─[apps/server/src/sourceControl/SourceControlProviderRegistry.ts:15:13] 2026-10-24T12:44:50.7077013Z 14 │ } from "@t3tools/contracts"; 2026-10-24T12:44:50.7077103Z 15 │ import type {} from "@t3tools/contracts"; 2026-10-24T12:44:50.7077173Z ·  ── 2026-10-24T12:44:50.7077225Z 16 │ 2026-10-24T12:44:50.7077276Z ╰──── 2026-10-24T12:44:50.7077357Z  help: Remove empty braces 2026-10-24T12:44:50.7077361Z 2026-10-24T12:44:50.7077542Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T12:44:50.7077704Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:100:85] 2026-10-24T12:44:50.7077812Z  99 │ const startEditor = startScheduledTaskEditor; 2026-10-24T12:44:50.7078000Z 100 │ const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]); 2026-10-24T12:44:50.7078148Z ·  ─────┬───── 2026-10-24T12:44:50.7078357Z · ╰── Unnecessary dependency `startEditor` 2026-10-24T12:44:50.7078437Z 101 │ const readEditor = useCallback( 2026-10-24T12:44:50.7078488Z ╰──── 2026-10-24T12:44:50.7078809Z  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-24T12:44:50.7079130Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.7079135Z 2026-10-24T12:44:50.7079317Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T12:44:50.7079479Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:121:7] 2026-10-24T12:44:50.7079542Z 120 │ setEditor, 2026-10-24T12:44:50.7079605Z 121 │ startEditor, 2026-10-24T12:44:50.7079683Z ·  ─────┬───── 2026-10-24T12:44:50.7079829Z · ╰── Unnecessary dependency `startEditor` 2026-10-24T12:44:50.7079892Z 122 │ hasChanges, 2026-10-24T12:44:50.7079942Z ╰──── 2026-10-24T12:44:50.7080388Z  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-24T12:44:50.7080741Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.7080744Z 2026-10-24T12:44:50.7081006Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T12:44:50.7081194Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:119:10] 2026-10-24T12:44:50.7081249Z 117 │ 2026-10-24T12:44:50.7081314Z 118 │ useEffect(() => { 2026-10-24T12:44:50.7081387Z ·  ────┬──── 2026-10-24T12:44:50.7081518Z · ╰── This is the containing effect 2026-10-24T12:44:50.7081599Z 119 │ void refreshNotifications(); 2026-10-24T12:44:50.7081696Z ·  ──────────┬───────── 2026-10-24T12:44:50.7081873Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.7082016Z 120 │ const subscription = AppState.addEventListener("change", (state) => { 2026-10-24T12:44:50.7082067Z ╰──── 2026-10-24T12:44:50.7082677Z  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-24T12:44:50.7083032Z  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-24T12:44:50.7083034Z 2026-10-24T12:44:50.7083299Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T12:44:50.7083489Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7] 2026-10-24T12:44:50.7083542Z 125 │ 2026-10-24T12:44:50.7083607Z 126 │ useEffect(() => { 2026-10-24T12:44:50.7083680Z ·  ────┬──── 2026-10-24T12:44:50.7083809Z · ╰── This is the containing effect 2026-10-24T12:44:50.7083875Z 127 │ if (!isLoaded) { 2026-10-24T12:44:50.7083965Z 128 │ setLiveActivityStatus("checking"); 2026-10-24T12:44:50.7084056Z ·  ──────────┬────────── 2026-10-24T12:44:50.7084227Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.7084295Z 129 │ return; 2026-10-24T12:44:50.7084350Z ╰──── 2026-10-24T12:44:50.7084959Z  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-24T12:44:50.7085283Z  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-24T12:44:50.7085286Z 2026-10-24T12:44:50.7085494Z ⚠ eslint(no-unused-vars): Function 'nonEmptyString' is declared but never used. 2026-10-24T12:44:50.7085643Z ╭─[packages/client-runtime/src/work-log/presentation.ts:237:10] 2026-10-24T12:44:50.7085763Z 236 │ 2026-10-24T12:44:50.7085921Z 237 │ function nonEmptyString(value: unknown): string | null { 2026-10-24T12:44:50.7086005Z ·  ───────┬────── 2026-10-24T12:44:50.7086150Z · ╰── 'nonEmptyString' is declared here 2026-10-24T12:44:50.7086294Z 238 │ return typeof value === "string" && value.trim().length > 0 ? value : null; 2026-10-24T12:44:50.7086346Z ╰──── 2026-10-24T12:44:50.7086452Z  help: Consider removing this declaration. 2026-10-24T12:44:50.7086455Z 2026-10-24T12:44:50.7086662Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T12:44:50.7086826Z ╭─[apps/mobile/src/features/workspace/WorkspaceToolbar.ios.tsx:114:33] 2026-10-24T12:44:50.7086925Z 113 │ return () => cancelAnimationFrame(frame); 2026-10-24T12:44:50.7087027Z 114 │ }, [restoreSearch, tabActive, bottomSearch]); 2026-10-24T12:44:50.7087138Z ·  ──────┬───── 2026-10-24T12:44:50.7087311Z · ╰── Unnecessary dependency `bottomSearch` 2026-10-24T12:44:50.7087417Z 115 │ const composeButton = nativeToolbarCompose ? ( 2026-10-24T12:44:50.7087468Z ╰──── 2026-10-24T12:44:50.7087767Z  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-24T12:44:50.7088083Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.7088086Z 2026-10-24T12:44:50.7088265Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T12:44:50.7088416Z ╭─[apps/server/src/provider/Drivers/CodexDriver.test.ts:466:14] 2026-10-24T12:44:50.7088468Z 465 │ 2026-10-24T12:44:50.7088576Z 466 │ for (const {} of ["direct", "wrapper"] as const) { 2026-10-24T12:44:50.7088650Z ·  ── 2026-10-24T12:44:50.7088708Z 467 │ } 2026-10-24T12:44:50.7088758Z ╰──── 2026-10-24T12:44:50.7088990Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T12:44:50.7088992Z 2026-10-24T12:44:50.7089297Z ⚠ eslint(no-unused-vars): Variable 'layerFromProviderAdapter' is declared but never used. Unused variables should start with a '_'. 2026-10-24T12:44:50.7089463Z ╭─[apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts:346:7] 2026-10-24T12:44:50.7089521Z 345 │ 2026-10-24T12:44:50.7089629Z 346 │ const layerFromProviderAdapter: Layer.Layer< 2026-10-24T12:44:50.7089727Z ·  ────────────┬─────────── 2026-10-24T12:44:50.7089894Z · ╰── 'layerFromProviderAdapter' is declared here 2026-10-24T12:44:50.7089972Z 347 │ ProviderAdapterRegistryV2, 2026-10-24T12:44:50.7090027Z ╰──── 2026-10-24T12:44:50.7090132Z  help: Consider removing this declaration. 2026-10-24T12:44:50.7090135Z 2026-10-24T12:44:50.7090408Z ⚠ eslint(no-unused-vars): Variable 'layerDaemon' is declared but never used. Unused variables should start with a '_'. 2026-10-24T12:44:50.7090545Z ╭─[apps/server/src/orchestration-v2/EffectWorker.ts:914:7] 2026-10-24T12:44:50.7090599Z 913 │ 2026-10-24T12:44:50.7090872Z 914 │ const layerDaemon: Layer.Layer = Layer.effectDiscard( 2026-10-24T12:44:50.7090983Z ·  ─────┬───── 2026-10-24T12:44:50.7091118Z · ╰── 'layerDaemon' is declared here 2026-10-24T12:44:50.7091206Z 915 │ runDaemon.pipe(Effect.forkScoped), 2026-10-24T12:44:50.7091259Z ╰──── 2026-10-24T12:44:50.7091364Z  help: Consider removing this declaration. 2026-10-24T12:44:50.7091367Z 2026-10-24T12:44:50.7091521Z ⚠ eslint(no-new): Do not use 'new' for side effects. 2026-10-24T12:44:50.7091650Z ╭─[apps/server/src/mcp/McpToolAccess.test.ts:168:3] 2026-10-24T12:44:50.7091765Z 167 │ // @ts-expect-error a declaration constructed directly 2026-10-24T12:44:50.7091863Z 168 │ new McpToolAccess.Declaration(unchecked); 2026-10-24T12:44:50.7091967Z ·  ───────────────────────────── 2026-10-24T12:44:50.7092100Z 169 │ // @ts-expect-error a handlers layer built outside McpToolAccess 2026-10-24T12:44:50.7092154Z ╰──── 2026-10-24T12:44:50.7092315Z  help: Assign the result of 'new' to a variable or compare it to a reference. 2026-10-24T12:44:50.7092317Z 2026-10-24T12:44:50.7092504Z ⚠ eslint(no-unused-vars): Type 'Scope' is imported but never used. 2026-10-24T12:44:50.7092642Z ╭─[apps/server/src/provider/ProviderAuthService.ts:15:18] 2026-10-24T12:44:50.7092764Z 14 │ import * as Layer from "effect/Layer"; 2026-10-24T12:44:50.7092859Z 15 │ import type * as Scope from "effect/Scope"; 2026-10-24T12:44:50.7092941Z ·  ──┬── 2026-10-24T12:44:50.7093075Z · ╰── 'Scope' is imported here 2026-10-24T12:44:50.7093171Z 16 │ import * as Stream from "effect/Stream"; 2026-10-24T12:44:50.7093228Z ╰──── 2026-10-24T12:44:50.7093328Z  help: Consider removing this import. 2026-10-24T12:44:50.7093330Z 2026-10-24T12:44:50.7093537Z ⚠ eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used. 2026-10-24T12:44:50.7093631Z ╭─[apps/web/src/types.ts:22:3] 2026-10-24T12:44:50.7093707Z 21 │ EnvironmentThreadShell, 2026-10-24T12:44:50.7093774Z 22 │ ThreadRunSummary, 2026-10-24T12:44:50.7093854Z ·  ────────┬─────── 2026-10-24T12:44:50.7093997Z · ╰── 'ThreadRunSummary' is imported here 2026-10-24T12:44:50.7094069Z 23 │ ThreadRuntimeSummary, 2026-10-24T12:44:50.7094122Z ╰──── 2026-10-24T12:44:50.7094218Z  help: Consider removing this import. 2026-10-24T12:44:50.7094221Z 2026-10-24T12:44:50.7094506Z ⚠ eslint(no-unused-vars): Identifier 'HostProcess' is imported but never used. 2026-10-24T12:44:50.7094704Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:25:13] 2026-10-24T12:44:50.7094793Z 24 │ import * as Schema from "effect/Schema"; 2026-10-24T12:44:50.7094911Z 25 │ import * as HostProcess from "@t3tools/shared/HostProcess"; 2026-10-24T12:44:50.7094996Z ·  ─────┬───── 2026-10-24T12:44:50.7095139Z · ╰── 'HostProcess' is imported here 2026-10-24T12:44:50.7095194Z 26 │ 2026-10-24T12:44:50.7095246Z ╰──── 2026-10-24T12:44:50.7095343Z  help: Consider removing this import. 2026-10-24T12:44:50.7095345Z 2026-10-24T12:44:50.7095627Z ⚠ eslint(no-unused-vars): Variable 'serverConfig' is declared but never used. Unused variables should start with a '_'. 2026-10-24T12:44:50.7095798Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:124:11] 2026-10-24T12:44:50.7095882Z 123 │ const path = yield* Path.Path; 2026-10-24T12:44:50.7096002Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-24T12:44:50.7096086Z ·  ──────┬───── 2026-10-24T12:44:50.7096230Z · ╰── 'serverConfig' is declared here 2026-10-24T12:44:50.7096372Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-24T12:44:50.7096426Z ╰──── 2026-10-24T12:44:50.7096532Z  help: Consider removing this declaration. 2026-10-24T12:44:50.7096535Z 2026-10-24T12:44:50.7096821Z ⚠ eslint(no-unused-vars): Variable 'serverSettings' is declared but never used. Unused variables should start with a '_'. 2026-10-24T12:44:50.7096987Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:125:11] 2026-10-24T12:44:50.7097105Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-24T12:44:50.7097246Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-24T12:44:50.7097334Z ·  ───────┬────── 2026-10-24T12:44:50.7097483Z · ╰── 'serverSettings' is declared here 2026-10-24T12:44:50.7097619Z 126 │ const gitWorkflow = yield* GitWorkflowService.GitWorkflowService; 2026-10-24T12:44:50.7097672Z ╰──── 2026-10-24T12:44:50.7097776Z  help: Consider removing this declaration. 2026-10-24T12:44:50.7097778Z 2026-10-24T12:44:50.7097924Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.7098089Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39] 2026-10-24T12:44:50.7098150Z 276 │ 2026-10-24T12:44:50.7098335Z 277 │ ╭─▶ return createElement(RawNativeView, { 2026-10-24T12:44:50.7098432Z 278 │ │ ...nativeProps, 2026-10-24T12:44:50.7098578Z 279 │ │ refreshEnabled: props.onPullToRefresh !== undefined, 2026-10-24T12:44:50.7098672Z 280 │ │ ref: nativeRef, 2026-10-24T12:44:50.7098803Z 281 │ ├─▶ }); 2026-10-24T12:44:50.7099045Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T12:44:50.7099099Z 282 │ } 2026-10-24T12:44:50.7099154Z ╰──── 2026-10-24T12:44:50.7099701Z  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-24T12:44:50.7100054Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.7100057Z 2026-10-24T12:44:50.7100272Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T12:44:50.7100396Z ╭─[apps/mobile/src/lib/markdownDocument.ts:259:28] 2026-10-24T12:44:50.7100497Z 258 │ visit(parser.parse(markdown), false, false); 2026-10-24T12:44:50.7100586Z 259 │ for (const edit of edits.reverse()) 2026-10-24T12:44:50.7100688Z ·  ─────── 2026-10-24T12:44:50.7100855Z 260 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-24T12:44:50.7100909Z ╰──── 2026-10-24T12:44:50.7101173Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T12:44:50.7101176Z 2026-10-24T12:44:50.7101390Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T12:44:50.7101514Z ╭─[apps/mobile/src/lib/markdownDocument.ts:290:28] 2026-10-24T12:44:50.7101596Z 289 │ visit(parser.parse(markdown)); 2026-10-24T12:44:50.7101682Z 290 │ for (const edit of edits.reverse()) 2026-10-24T12:44:50.7101778Z ·  ─────── 2026-10-24T12:44:50.7101947Z 291 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-24T12:44:50.7102003Z ╰──── 2026-10-24T12:44:50.7102265Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T12:44:50.7102267Z 2026-10-24T12:44:50.7102481Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T12:44:50.7102604Z ╭─[apps/mobile/src/lib/markdownDocument.ts:344:38] 2026-10-24T12:44:50.7102683Z 343 │ visit(parser.parse(markdown)); 2026-10-24T12:44:50.7102832Z 344 │ for (const lineStart of lineStarts.reverse()) { 2026-10-24T12:44:50.7102937Z ·  ─────── 2026-10-24T12:44:50.7103109Z 345 │ // The header row may be a lazy line without its container markers (`>` or list indent), 2026-10-24T12:44:50.7103162Z ╰──── 2026-10-24T12:44:50.7103422Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T12:44:50.7103426Z 2026-10-24T12:44:50.7103598Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T12:44:50.7103721Z ╭─[apps/web/src/hooks/useThreadActions.ts:821:56] 2026-10-24T12:44:50.7103822Z 820 │ const resolved = resolveThreadTarget(target); 2026-10-24T12:44:50.7103983Z 821 │ if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) { 2026-10-24T12:44:50.7104107Z ·  ─────┬──── 2026-10-24T12:44:50.7104349Z · ╰── Cannot call impure function 2026-10-24T12:44:50.7104470Z 822 │ return AsyncResult.failure( 2026-10-24T12:44:50.7104523Z ╰──── 2026-10-24T12:44:50.7104809Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T12:44:50.7105113Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T12:44:50.7105116Z 2026-10-24T12:44:50.7105286Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T12:44:50.7105406Z ╭─[apps/web/src/hooks/useThreadActions.ts:709:46] 2026-10-24T12:44:50.7105480Z 708 │ const wokeAt = resolved 2026-10-24T12:44:50.7105618Z 709 │ ? threadWokeAt(resolved.thread, { now: new Date().toISOString() }) 2026-10-24T12:44:50.7105737Z ·  ─────┬──── 2026-10-24T12:44:50.7105901Z · ╰── Cannot call impure function 2026-10-24T12:44:50.7105966Z 710 │ : null; 2026-10-24T12:44:50.7106018Z ╰──── 2026-10-24T12:44:50.7106297Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T12:44:50.7106595Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T12:44:50.7106597Z 2026-10-24T12:44:50.7106805Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-24T12:44:50.7106935Z ╭─[apps/web/src/contextMenuFallback.test.ts:38:9] 2026-10-24T12:44:50.7107007Z 37 │ get isConnected() { 2026-10-24T12:44:50.7107098Z 38 │ let current: FakeElement | null = this; 2026-10-24T12:44:50.7107173Z ·  ─────── 2026-10-24T12:44:50.7107249Z 39 │ while (current?.parent) { 2026-10-24T12:44:50.7107302Z ╰──── 2026-10-24T12:44:50.7107577Z  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-24T12:44:50.7107583Z 2026-10-24T12:44:50.7107853Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-24T12:44:50.7107973Z ╭─[apps/server/src/usage/UsageService.ts:169:7] 2026-10-24T12:44:50.7108027Z 168 │ 2026-10-24T12:44:50.7108114Z 169 │ const layerTest = Layer.succeed( 2026-10-24T12:44:50.7108191Z ·  ────┬──── 2026-10-24T12:44:50.7108328Z · ╰── 'layerTest' is declared here 2026-10-24T12:44:50.7108395Z 170 │ UsageService, 2026-10-24T12:44:50.7108444Z ╰──── 2026-10-24T12:44:50.7108818Z  help: Consider removing this declaration. 2026-10-24T12:44:50.7108822Z 2026-10-24T12:44:50.7109297Z ⚠ 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-24T12:44:50.7109431Z ╭─[apps/server/src/usage/UsageService.test.ts:2615:7] 2026-10-24T12:44:50.7109532Z 2614 │ let orphanedAt: number | undefined; 2026-10-24T12:44:50.7109869Z 2615 │ ╭─▶ for (let interruptAt = 1; interruptAt <= 31; interruptAt += 1) { 2026-10-24T12:44:50.7110046Z 2616 │ │ const tasks: Array<() => void> = []; 2026-10-24T12:44:50.7110199Z 2617 │ │ const dispatcher: Scheduler.SchedulerDispatcher = { 2026-10-24T12:44:50.7110337Z 2618 │ │ scheduleTask: (task) => tasks.push(task), 2026-10-24T12:44:50.7110437Z 2619 │ │ flush: () => { 2026-10-24T12:44:50.7110564Z 2620 │ │ let task: (() => void) | undefined; 2026-10-24T12:44:50.7110715Z 2621 │ │ while ((task = tasks.shift()) !== undefined) task(); 2026-10-24T12:44:50.7110798Z 2622 │ │ }, 2026-10-24T12:44:50.7110880Z 2623 │ │ }; 2026-10-24T12:44:50.7110960Z 2624 │ │ 2026-10-24T12:44:50.7111129Z 2625 │ │ let requestFiber: Fiber.Fiber | undefined; 2026-10-24T12:44:50.7111240Z 2626 │ │ let requestChecks = 0; 2026-10-24T12:44:50.7111371Z 2627 │ │ const scheduler: Scheduler.Scheduler = { 2026-10-24T12:44:50.7111483Z 2628 │ │ executionMode: "async", 2026-10-24T12:44:50.7111607Z 2629 │ │ makeDispatcher: () => dispatcher, 2026-10-24T12:44:50.7111721Z 2630 │ │ shouldYield: (fiber) => { 2026-10-24T12:44:50.7111854Z 2631 │ │ if (fiber !== requestFiber) return false; 2026-10-24T12:44:50.7111961Z 2632 │ │ requestChecks += 1; 2026-10-24T12:44:50.7112112Z 2633 │ │ if (requestChecks !== interruptAt) return false; 2026-10-24T12:44:50.7112232Z 2634 │ │ fiber.interruptUnsafe(); 2026-10-24T12:44:50.7112332Z 2635 │ │ return true; 2026-10-24T12:44:50.7112413Z 2636 │ │ }, 2026-10-24T12:44:50.7112495Z 2637 │ │ }; 2026-10-24T12:44:50.7112567Z 2638 │ │ 2026-10-24T12:44:50.7112733Z 2639 │ │ const input: UsageSummaryInput = { 2026-10-24T12:44:50.7112830Z 2640 │ │ ...WINDOW, 2026-10-24T12:44:50.7112960Z 2641 │ │ sinceDay: UsageDay.make("2026-09-01"), 2026-10-24T12:44:50.7113160Z 2642 │ │ untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`), 2026-10-24T12:44:50.7113249Z 2643 │ │ }; 2026-10-24T12:44:50.7113365Z 2644 │ │ const first = yield* service 2026-10-24T12:44:50.7113473Z 2645 │ │ .readSummary(input) 2026-10-24T12:44:50.7113564Z 2646 │ │ .pipe( 2026-10-24T12:44:50.7113663Z 2647 │ │ Effect.exit, 2026-10-24T12:44:50.7113822Z 2648 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-24T12:44:50.7113929Z 2649 │ │ Effect.forkChild, 2026-10-24T12:44:50.7114015Z 2650 │ │ ); 2026-10-24T12:44:50.7114119Z 2651 │ │ requestFiber = first; 2026-10-24T12:44:50.7114224Z 2652 │ │ yield* Effect.yieldNow; 2026-10-24T12:44:50.7114404Z 2653 │ │ dispatcher.flush(); 2026-10-24T12:44:50.7114516Z 2654 │ │ 2026-10-24T12:44:50.7114671Z 2655 │ │ const second = yield* service.readSummary(input).pipe( 2026-10-24T12:44:50.7114769Z 2656 │ │ Effect.match({ 2026-10-24T12:44:50.7114896Z 2657 │ │ onFailure: (error) => error.reason, 2026-10-24T12:44:50.7115024Z 2658 │ │ onSuccess: () => "success" as const, 2026-10-24T12:44:50.7115109Z 2659 │ │ }), 2026-10-24T12:44:50.7115269Z 2660 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-24T12:44:50.7115373Z 2661 │ │ Effect.forkChild, 2026-10-24T12:44:50.7115454Z 2662 │ │ ); 2026-10-24T12:44:50.7115567Z 2663 │ │ yield* Effect.yieldNow; 2026-10-24T12:44:50.7115671Z 2664 │ │ dispatcher.flush(); 2026-10-24T12:44:50.7115801Z 2665 │ │ const secondExit = second.pollUnsafe(); 2026-10-24T12:44:50.7115922Z 2666 │ │ if (secondExit === undefined) { 2026-10-24T12:44:50.7116038Z 2667 │ │ second.interruptUnsafe(); 2026-10-24T12:44:50.7116149Z 2668 │ │ orphanedAt = interruptAt; 2026-10-24T12:44:50.7116238Z 2669 │ │ break; 2026-10-24T12:44:50.7116318Z 2670 │ │ } 2026-10-24T12:44:50.7116440Z 2671 │ │ if (Exit.isFailure(secondExit)) { 2026-10-24T12:44:50.7116604Z 2672 │ │ assert.fail("the matching request fiber was interrupted"); 2026-10-24T12:44:50.7116686Z 2673 │ │ } 2026-10-24T12:44:50.7116842Z 2674 │ │ assert.strictEqual(secondExit.value, "invalidWindow"); 2026-10-24T12:44:50.7116979Z 2675 │ ╰─▶ } 2026-10-24T12:44:50.7117034Z 2676 │ 2026-10-24T12:44:50.7117089Z ╰──── 2026-10-24T12:44:50.7117092Z 2026-10-24T12:44:50.7117343Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T12:44:50.7117506Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:290:50] 2026-10-24T12:44:50.7117567Z 289 │ return ( 2026-10-24T12:44:50.7117705Z 290 │ 2026-10-24T12:44:50.7117836Z ·  ───────────── 2026-10-24T12:44:50.7117909Z 291 │ {props.children} 2026-10-24T12:44:50.7117961Z ╰──── 2026-10-24T12:44:50.7118189Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T12:44:50.7118332Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T12:44:50.7118335Z 2026-10-24T12:44:50.7118579Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T12:44:50.7118739Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:654:44] 2026-10-24T12:44:50.7118798Z 653 │ return ( 2026-10-24T12:44:50.7118920Z 654 │ 2026-10-24T12:44:50.7119111Z ·  ───────────── 2026-10-24T12:44:50.7119216Z 655 │ {props.children} 2026-10-24T12:44:50.7119267Z ╰──── 2026-10-24T12:44:50.7119492Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T12:44:50.7119634Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T12:44:50.7119638Z 2026-10-24T12:44:50.7119877Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T12:44:50.7120038Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1462:55] 2026-10-24T12:44:50.7120101Z 1461 │ return ( 2026-10-24T12:44:50.7120264Z 1462 │ 2026-10-24T12:44:50.7120404Z ·  ──────────────────── 2026-10-24T12:44:50.7120504Z 1463 │ { 2026-10-24T12:44:50.7121550Z ·  ────┬──── 2026-10-24T12:44:50.7121686Z · ╰── This is the containing effect 2026-10-24T12:44:50.7121749Z 261 │ stop(); 2026-10-24T12:44:50.7121820Z ·  ──┬─ 2026-10-24T12:44:50.7121987Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.7122055Z 262 │ }, [orderVersion]); 2026-10-24T12:44:50.7122108Z ╰──── 2026-10-24T12:44:50.7122754Z  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-24T12:44:50.7123156Z  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-24T12:44:50.7123197Z 2026-10-24T12:44:50.7123413Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T12:44:50.7123577Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-24T12:44:50.7123644Z 260 │ useEffect(() => { 2026-10-24T12:44:50.7123705Z 261 │ stop(); 2026-10-24T12:44:50.7123772Z ·  ──┬─ 2026-10-24T12:44:50.7123900Z · ╰── Missing dependency `stop` 2026-10-24T12:44:50.7123968Z 262 │ }, [orderVersion]); 2026-10-24T12:44:50.7124050Z ·  ──────┬───── 2026-10-24T12:44:50.7124199Z · ╰── Unnecessary dependency `orderVersion` 2026-10-24T12:44:50.7124268Z 263 │ useEffect( 2026-10-24T12:44:50.7124325Z ╰──── 2026-10-24T12:44:50.7124763Z  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-24T12:44:50.7125080Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.7125085Z 2026-10-24T12:44:50.7125230Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.7125391Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9] 2026-10-24T12:44:50.7125470Z 95 │ const latest = useRef(props); 2026-10-24T12:44:50.7125541Z 96 │ latest.current = props; 2026-10-24T12:44:50.7125651Z ·  ───┬──────┬─── 2026-10-24T12:44:50.7125836Z · │ ╰── Cannot update ref value during render 2026-10-24T12:44:50.7125951Z · ╰── This value is a ref 2026-10-24T12:44:50.7126026Z 97 │ const gesture = useMemo( 2026-10-24T12:44:50.7126077Z ╰──── 2026-10-24T12:44:50.7126555Z  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-24T12:44:50.7126854Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.7126857Z 2026-10-24T12:44:50.7127010Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.7127179Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18] 2026-10-24T12:44:50.7127244Z 103 │ .runOnJS(true) 2026-10-24T12:44:50.7127349Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T12:44:50.7127468Z ·  ───────────────┬────────────── 2026-10-24T12:44:50.7127674Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T12:44:50.7127810Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T12:44:50.7127864Z ╰──── 2026-10-24T12:44:50.7128419Z  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-24T12:44:50.7128750Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.7128752Z 2026-10-24T12:44:50.7128896Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.7129060Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19] 2026-10-24T12:44:50.7129163Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T12:44:50.7129299Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T12:44:50.7129446Z ·  ──────────────────────────┬───────────────────────── 2026-10-24T12:44:50.7129663Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T12:44:50.7129793Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T12:44:50.7129847Z ╰──── 2026-10-24T12:44:50.7130322Z  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-24T12:44:50.7130616Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.7130622Z 2026-10-24T12:44:50.7130765Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.7130932Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16] 2026-10-24T12:44:50.7131069Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T12:44:50.7131195Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T12:44:50.7131339Z ·  ──────────────────────────┬───────────────────────── 2026-10-24T12:44:50.7131552Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T12:44:50.7131680Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T12:44:50.7131734Z ╰──── 2026-10-24T12:44:50.7132214Z  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-24T12:44:50.7132513Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.7132515Z 2026-10-24T12:44:50.7132662Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.7132854Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21] 2026-10-24T12:44:50.7132978Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T12:44:50.7133102Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T12:44:50.7133244Z ·  ───────────────────────┬────────────────────── 2026-10-24T12:44:50.7133553Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T12:44:50.7133657Z 108 │ [props.disabled], 2026-10-24T12:44:50.7133709Z ╰──── 2026-10-24T12:44:50.7134183Z  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-24T12:44:50.7134481Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.7134483Z 2026-10-24T12:44:50.7134631Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.7134796Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:249:9] 2026-10-24T12:44:50.7134915Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-24T12:44:50.7135026Z 249 │ latest.current = { rows, planners, moveThread }; 2026-10-24T12:44:50.7135134Z ·  ───┬──────┬─── 2026-10-24T12:44:50.7135318Z · │ ╰── Cannot update ref value during render 2026-10-24T12:44:50.7135433Z · ╰── This value is a ref 2026-10-24T12:44:50.7135490Z 250 │ 2026-10-24T12:44:50.7135543Z ╰──── 2026-10-24T12:44:50.7136013Z  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-24T12:44:50.7136313Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.7136321Z 2026-10-24T12:44:50.7136464Z ⚠ react(refs): Cannot access refs during render 2026-10-24T12:44:50.7136627Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:247:22] 2026-10-24T12:44:50.7136747Z 246 │ const [preview, setPreview] = useState(null); 2026-10-24T12:44:50.7136864Z 247 │ const translateY = useRef(new Animated.Value(0)).current; 2026-10-24T12:44:50.7136990Z ·  ──────────────────┬────────────────── 2026-10-24T12:44:50.7137163Z · ╰── Cannot access ref value during render 2026-10-24T12:44:50.7137276Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-24T12:44:50.7137330Z ╰──── 2026-10-24T12:44:50.7137804Z  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-24T12:44:50.7138104Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T12:44:50.7138106Z 2026-10-24T12:44:50.7138279Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T12:44:50.7138442Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:324:16] 2026-10-24T12:44:50.7138510Z 323 │ update(0); 2026-10-24T12:44:50.7138591Z 324 │ let last = performance.now(); 2026-10-24T12:44:50.7138691Z ·  ────────┬──────── 2026-10-24T12:44:50.7138913Z · ╰── Cannot call impure function 2026-10-24T12:44:50.7139020Z 325 │ const tick = () => { 2026-10-24T12:44:50.7139071Z ╰──── 2026-10-24T12:44:50.7139377Z  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-24T12:44:50.7139677Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T12:44:50.7139681Z 2026-10-24T12:44:50.7139872Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T12:44:50.7140033Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15] 2026-10-24T12:44:50.7140096Z  98 │ () => 2026-10-24T12:44:50.7140169Z  99 │ Gesture.Pan() 2026-10-24T12:44:50.7140250Z ·  ─┬─ 2026-10-24T12:44:50.7140382Z · ╰── `Pan` may be a component 2026-10-24T12:44:50.7140464Z 100 │ .enabled(!props.disabled) 2026-10-24T12:44:50.7140518Z ╰──── 2026-10-24T12:44:50.7140799Z  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-24T12:44:50.7141251Z  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-24T12:44:50.7141256Z 2026-10-24T12:44:50.7141451Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T12:44:50.7141617Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5] 2026-10-24T12:44:50.7141687Z 103 │ .runOnJS(true) 2026-10-24T12:44:50.7141789Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T12:44:50.7141877Z ·  ───┬── 2026-10-24T12:44:50.7142317Z · ╰── 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-24T12:44:50.7142452Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T12:44:50.7142580Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T12:44:50.7142745Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T12:44:50.7142817Z 108 │ [props.disabled], 2026-10-24T12:44:50.7142904Z ·  ────────┬─────── 2026-10-24T12:44:50.7143097Z · ╰── This dependency list is missing values used by the callback 2026-10-24T12:44:50.7143153Z 109 │ ); 2026-10-24T12:44:50.7143208Z ╰──── 2026-10-24T12:44:50.7143419Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T12:44:50.7143739Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.7143742Z 2026-10-24T12:44:50.7144005Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T12:44:50.7144234Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:406:5] 2026-10-24T12:44:50.7144322Z 404 │ 2026-10-24T12:44:50.7144394Z 405 │ useEffect(() => { 2026-10-24T12:44:50.7144469Z ·  ────┬──── 2026-10-24T12:44:50.7144600Z · ╰── This is the containing effect 2026-10-24T12:44:50.7144693Z 406 │ setInspectorSelection((current) => { 2026-10-24T12:44:50.7144786Z ·  ──────────┬────────── 2026-10-24T12:44:50.7144960Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.7145062Z 407 │ if (props.renderInspector === undefined) { 2026-10-24T12:44:50.7145116Z ╰──── 2026-10-24T12:44:50.7145736Z  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-24T12:44:50.7146070Z  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-24T12:44:50.7146072Z 2026-10-24T12:44:50.7146292Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T12:44:50.7146447Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:534:24] 2026-10-24T12:44:50.7146613Z 533 │ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top; 2026-10-24T12:44:50.7146788Z 534 │ ╭─▶ const GitInspector = () => ( 2026-10-24T12:44:50.7146894Z 535 │ │ 2026-10-24T12:44:50.7147521Z 540 │ ╰─▶ ); 2026-10-24T12:44:50.7147606Z 541 │ const FilesInspector = () => 2026-10-24T12:44:50.7147659Z ╰──── 2026-10-24T12:44:50.7147885Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-24T12:44:50.7147887Z 2026-10-24T12:44:50.7148170Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T12:44:50.7148365Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:541:26] 2026-10-24T12:44:50.7148425Z 540 │ ); 2026-10-24T12:44:50.7148653Z 541 │ ╭─▶ const FilesInspector = () => 2026-10-24T12:44:50.7148808Z 542 │ │ selectedThread !== null && selectedThreadCwd !== null ? ( 2026-10-24T12:44:50.7148917Z 543 │ │ 2026-10-24T12:44:50.7149904Z 551 │ ╰─▶ ) : null; 2026-10-24T12:44:50.7150059Z 552 │ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset); 2026-10-24T12:44:50.7150114Z ╰──── 2026-10-24T12:44:50.7150334Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-24T12:44:50.7150336Z 2026-10-24T12:44:50.7150604Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T12:44:50.7150784Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:333:7] 2026-10-24T12:44:50.7150841Z 328 │ }; 2026-10-24T12:44:50.7150910Z 329 │ useEffect(() => { 2026-10-24T12:44:50.7150984Z ·  ────┬──── 2026-10-24T12:44:50.7151119Z · ╰── This is the containing effect 2026-10-24T12:44:50.7151221Z 330 │ if (!guidesEnabled && section === "guide") { 2026-10-24T12:44:50.7151318Z 331 │ requestedSection.current = "overview"; 2026-10-24T12:44:50.7151489Z 332 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-24T12:44:50.7151566Z 333 │ setSection("overview"); 2026-10-24T12:44:50.7151646Z ·  ─────┬──── 2026-10-24T12:44:50.7151828Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.7151886Z 334 │ } 2026-10-24T12:44:50.7151943Z ╰──── 2026-10-24T12:44:50.7152557Z  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-24T12:44:50.7152924Z  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-24T12:44:50.7152927Z 2026-10-24T12:44:50.7153135Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T12:44:50.7153400Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:335:6] 2026-10-24T12:44:50.7153544Z 330 │ if (!guidesEnabled && section === "guide") { 2026-10-24T12:44:50.7153642Z 331 │ requestedSection.current = "overview"; 2026-10-24T12:44:50.7153732Z ·  ────────┬─────── 2026-10-24T12:44:50.7154184Z · ╰── 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-24T12:44:50.7154353Z 332 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-24T12:44:50.7154508Z ·  ─────────┬───────── ──────┬────── 2026-10-24T12:44:50.7155019Z · │ ╰── 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-24T12:44:50.7155477Z · ╰── 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-24T12:44:50.7155553Z 333 │ setSection("overview"); 2026-10-24T12:44:50.7155613Z 334 │ } 2026-10-24T12:44:50.7155708Z 335 │ }, [guidesEnabled, section, insets.top]); 2026-10-24T12:44:50.7155823Z ·  ──────────────────┬───────────────── 2026-10-24T12:44:50.7156018Z · ╰── This dependency list is missing values used by the callback 2026-10-24T12:44:50.7156113Z 336 │ const tabContent = activityContent; 2026-10-24T12:44:50.7156169Z ╰──── 2026-10-24T12:44:50.7156340Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T12:44:50.7156659Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.7156664Z 2026-10-24T12:44:50.7156872Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T12:44:50.7157047Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:877:6] 2026-10-24T12:44:50.7157107Z 860 │ if ( 2026-10-24T12:44:50.7157226Z 861 │ lastSelection.current.path === route.params.path && 2026-10-24T12:44:50.7157306Z ·  ──────┬────── 2026-10-24T12:44:50.7157759Z · ╰── 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-24T12:44:50.7157891Z 862 │ lastSelection.current.id === route.params.fileSelectionId 2026-10-24T12:44:50.7157949Z 863 │ ) 2026-10-24T12:44:50.7158012Z 864 │ return; 2026-10-24T12:44:50.7158191Z 865 │ lastSelection.current = { path: route.params.path, id: route.params.fileSelectionId }; 2026-10-24T12:44:50.7158331Z 866 │ if (route.params.focus) navigation.setParams({ focus: undefined }); 2026-10-24T12:44:50.7158419Z 867 │ setJumpPath(route.params.path); 2026-10-24T12:44:50.7158492Z 868 │ setSelectedRowId(null); 2026-10-24T12:44:50.7158575Z 869 │ jumpStarted.current = false; 2026-10-24T12:44:50.7158897Z 870 │ const file = data.files.find((entry) => entry.path === route.params.path); 2026-10-24T12:44:50.7159149Z 871 │ if (!file || !nativeView.current) return; 2026-10-24T12:44:50.7159238Z ·  ─────┬──── 2026-10-24T12:44:50.7159685Z · ╰── 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-24T12:44:50.7159815Z 872 │ setCollapsedIds((ids) => ids.filter((id) => id !== file.id)); 2026-10-24T12:44:50.7159897Z 873 │ jumpStarted.current = true; 2026-10-24T12:44:50.7160034Z 874 │ void nativeView.current.scrollToFile(file.id, false).catch(() => { 2026-10-24T12:44:50.7160119Z 875 │ jumpStarted.current = false; 2026-10-24T12:44:50.7160177Z 876 │ }); 2026-10-24T12:44:50.7160384Z 877 │ }, [route.params.path, route.params.fileSelectionId, route.params.focus, data.files, navigation]); 2026-10-24T12:44:50.7160592Z ·  ──────────────────────────────────────────────┬────────────────────────────────────────────── 2026-10-24T12:44:50.7160818Z · ╰── This dependency list is missing values used by the callback 2026-10-24T12:44:50.7160933Z 878 │ const appliedFilter = useRef(filter.hideTestFiles); 2026-10-24T12:44:50.7160987Z ╰──── 2026-10-24T12:44:50.7161158Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T12:44:50.7161477Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.7161479Z 2026-10-24T12:44:50.7161862Z ⚠ 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-24T12:44:50.7161996Z ╭─[apps/server/src/auth/RpcAuthorization.ts:237:17] 2026-10-24T12:44:50.7162134Z 236 │ const requiredScopesForSettingsUpdate = (payload: unknown) => { 2026-10-24T12:44:50.7162266Z 237 │ const input = Schema.decodeUnknownSync(SettingsUpdate)(payload); 2026-10-24T12:44:50.7162375Z ·  ──────────────────────── 2026-10-24T12:44:50.7162517Z 238 │ const scopes = requiredScopesForServerSettingsPatch(input.patch); 2026-10-24T12:44:50.7162571Z ╰──── 2026-10-24T12:44:50.7162574Z 2026-10-24T12:44:50.7162979Z ⚠ 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-24T12:44:50.7163107Z ╭─[apps/server/src/auth/RpcAuthorization.ts:256:26] 2026-10-24T12:44:50.7163210Z 255 │ if (method === WS_METHODS.assetsCreateUrl) { 2026-10-24T12:44:50.7163369Z 256 │ const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload); 2026-10-24T12:44:50.7163486Z ·  ──────────────────────── 2026-10-24T12:44:50.7163547Z 257 │ return [ 2026-10-24T12:44:50.7163602Z ╰──── 2026-10-24T12:44:50.7163605Z 2026-10-24T12:44:50.7163809Z ⚠ eslint(no-unused-vars): Identifier 'identity' is imported but never used. 2026-10-24T12:44:50.7163943Z ╭─[apps/server/src/auth/http.ts:28:10] 2026-10-24T12:44:50.7164033Z 27 │ import * as Schema from "effect/Schema"; 2026-10-24T12:44:50.7164209Z 28 │ import { identity } from "effect/Function"; 2026-10-24T12:44:50.7164323Z ·  ────┬─── 2026-10-24T12:44:50.7164461Z · ╰── 'identity' is imported here 2026-10-24T12:44:50.7164546Z 29 │ import * as Layer from "effect/Layer"; 2026-10-24T12:44:50.7164601Z ╰──── 2026-10-24T12:44:50.7164702Z  help: Consider removing this import. 2026-10-24T12:44:50.7164706Z 2026-10-24T12:44:50.7164865Z ⚠ react(immutability): This value cannot be modified 2026-10-24T12:44:50.7165022Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-24T12:44:50.7165078Z 83 │ 2026-10-24T12:44:50.7165173Z 84 │ const cardCoverage = props.cardCoverage; 2026-10-24T12:44:50.7165257Z ·  ──────┬───── 2026-10-24T12:44:50.7165400Z · ╰── `cardCoverage` originates here 2026-10-24T12:44:50.7165485Z 85 │ const barHeightRef = useRef(0); 2026-10-24T12:44:50.7165567Z 86 │ const cardHeightRef = useRef(0); 2026-10-24T12:44:50.7165654Z 87 │ const cardHeight = useSharedValue(0); 2026-10-24T12:44:50.7165745Z 88 │ const notifyCoverage = useCallback(() => { 2026-10-24T12:44:50.7165816Z 89 │ if (!cardCoverage) { 2026-10-24T12:44:50.7165878Z 90 │ return; 2026-10-24T12:44:50.7165935Z 91 │ } 2026-10-24T12:44:50.7166103Z 92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-24T12:44:50.7166209Z 93 │ // feed inset and floating controls trailing it. 2026-10-24T12:44:50.7166373Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T12:44:50.7166450Z ·  ──────┬───── 2026-10-24T12:44:50.7166596Z · ╰── `cardCoverage` cannot be modified 2026-10-24T12:44:50.7166668Z 95 │ }, [cardCoverage]); 2026-10-24T12:44:50.7166721Z ╰──── 2026-10-24T12:44:50.7167025Z  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-24T12:44:50.7167338Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T12:44:50.7167341Z 2026-10-24T12:44:50.7167500Z ⚠ react(immutability): This value cannot be modified 2026-10-24T12:44:50.7167659Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:106:7] 2026-10-24T12:44:50.7167743Z  86 │ const cardHeightRef = useRef(0); 2026-10-24T12:44:50.7167904Z  87 │ const cardHeight = useSharedValue(0); 2026-10-24T12:44:50.7168020Z ·  ─────┬──── 2026-10-24T12:44:50.7168157Z · ╰── `cardHeight` originates here 2026-10-24T12:44:50.7168254Z  88 │ const notifyCoverage = useCallback(() => { 2026-10-24T12:44:50.7168322Z  89 │ if (!cardCoverage) { 2026-10-24T12:44:50.7168386Z  90 │ return; 2026-10-24T12:44:50.7168443Z  91 │ } 2026-10-24T12:44:50.7168609Z  92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-24T12:44:50.7168710Z  93 │ // feed inset and floating controls trailing it. 2026-10-24T12:44:50.7168871Z  94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T12:44:50.7168939Z  95 │ }, [cardCoverage]); 2026-10-24T12:44:50.7169025Z  96 │ const handleBarLayout = useCallback( 2026-10-24T12:44:50.7169112Z  97 │ (event: LayoutChangeEvent) => { 2026-10-24T12:44:50.7169241Z  98 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T12:44:50.7169311Z  99 │ notifyCoverage(); 2026-10-24T12:44:50.7169370Z 100 │ }, 2026-10-24T12:44:50.7169435Z 101 │ [notifyCoverage], 2026-10-24T12:44:50.7169492Z 102 │ ); 2026-10-24T12:44:50.7169580Z 103 │ const handleCardLayout = useCallback( 2026-10-24T12:44:50.7169665Z 104 │ (event: LayoutChangeEvent) => { 2026-10-24T12:44:50.7169791Z 105 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T12:44:50.7169908Z 106 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-24T12:44:50.7169990Z ·  ─────┬──── 2026-10-24T12:44:50.7170131Z · ╰── `cardHeight` cannot be modified 2026-10-24T12:44:50.7170204Z 107 │ notifyCoverage(); 2026-10-24T12:44:50.7170263Z ╰──── 2026-10-24T12:44:50.7170535Z  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-24T12:44:50.7170848Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T12:44:50.7170851Z 2026-10-24T12:44:50.7171052Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T12:44:50.7171210Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-24T12:44:50.7171300Z 87 │ const cardHeight = useSharedValue(0); 2026-10-24T12:44:50.7171395Z 88 │ const notifyCoverage = useCallback(() => { 2026-10-24T12:44:50.7171507Z ·  ───┬─── 2026-10-24T12:44:50.7171757Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-24T12:44:50.7171829Z 89 │ if (!cardCoverage) { 2026-10-24T12:44:50.7171893Z 90 │ return; 2026-10-24T12:44:50.7171949Z 91 │ } 2026-10-24T12:44:50.7172120Z 92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-24T12:44:50.7172224Z 93 │ // feed inset and floating controls trailing it. 2026-10-24T12:44:50.7172385Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T12:44:50.7172462Z ·  ──────┬───── 2026-10-24T12:44:50.7172599Z · ╰── This modifies `cardCoverage` 2026-10-24T12:44:50.7172669Z 95 │ }, [cardCoverage]); 2026-10-24T12:44:50.7172832Z ╰──── 2026-10-24T12:44:50.7173216Z  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-24T12:44:50.7173529Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T12:44:50.7173531Z 2026-10-24T12:44:50.7173734Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T12:44:50.7173893Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-24T12:44:50.7173998Z 93 │ // feed inset and floating controls trailing it. 2026-10-24T12:44:50.7174156Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T12:44:50.7174238Z ·  ──────┬───── 2026-10-24T12:44:50.7174375Z · ╰── This modifies `cardCoverage` 2026-10-24T12:44:50.7174444Z 95 │ }, [cardCoverage]); 2026-10-24T12:44:50.7174530Z 96 │ const handleBarLayout = useCallback( 2026-10-24T12:44:50.7174613Z 97 │ (event: LayoutChangeEvent) => { 2026-10-24T12:44:50.7174721Z ·  ───────────────┬─────────────── 2026-10-24T12:44:50.7174949Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-24T12:44:50.7175070Z 98 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T12:44:50.7175126Z ╰──── 2026-10-24T12:44:50.7175481Z  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-24T12:44:50.7175797Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T12:44:50.7175800Z 2026-10-24T12:44:50.7176003Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T12:44:50.7176162Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:106:7] 2026-10-24T12:44:50.7176253Z 103 │ const handleCardLayout = useCallback( 2026-10-24T12:44:50.7176338Z 104 │ (event: LayoutChangeEvent) => { 2026-10-24T12:44:50.7176447Z ·  ───────────────┬─────────────── 2026-10-24T12:44:50.7176668Z · ╰── This function may (indirectly) reassign or modify `cardHeight` after render 2026-10-24T12:44:50.7176805Z 105 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T12:44:50.7176925Z 106 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-24T12:44:50.7177005Z ·  ─────┬──── 2026-10-24T12:44:50.7177135Z · ╰── This modifies `cardHeight` 2026-10-24T12:44:50.7177206Z 107 │ notifyCoverage(); 2026-10-24T12:44:50.7177261Z ╰──── 2026-10-24T12:44:50.7177606Z  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-24T12:44:50.7177915Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T12:44:50.7177917Z 2026-10-24T12:44:50.7178258Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T12:44:50.7178464Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:444:5] 2026-10-24T12:44:50.7178529Z 434 │ : null; 2026-10-24T12:44:50.7178597Z 435 │ useEffect(() => { 2026-10-24T12:44:50.7178673Z ·  ────┬──── 2026-10-24T12:44:50.7178806Z · ╰── This is the containing effect 2026-10-24T12:44:50.7178867Z 436 │ if ( 2026-10-24T12:44:50.7178944Z 437 │ props.active === false || 2026-10-24T12:44:50.7179026Z 438 │ activeDraftKey !== null || 2026-10-24T12:44:50.7179111Z 439 │ editingPendingTask !== null || 2026-10-24T12:44:50.7179189Z 440 │ selectedProject === null 2026-10-24T12:44:50.7179246Z 441 │ ) { 2026-10-24T12:44:50.7179316Z 442 │ return; 2026-10-24T12:44:50.7179377Z 443 │ } 2026-10-24T12:44:50.7179451Z 444 │ setActiveDraftKey( 2026-10-24T12:44:50.7179534Z ·  ────────┬──────── 2026-10-24T12:44:50.7179709Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.7179784Z 445 │ createNewTaskDraft({ 2026-10-24T12:44:50.7179839Z ╰──── 2026-10-24T12:44:50.7180453Z  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-24T12:44:50.7180788Z  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-24T12:44:50.7180793Z 2026-10-24T12:44:50.7181040Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T12:44:50.7181212Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1244:36] 2026-10-24T12:44:50.7181323Z 1243 │ 2026-10-24T12:44:50.7181519Z 1244 │ {props.children} 2026-10-24T12:44:50.7181635Z ·  ───────────── 2026-10-24T12:44:50.7181714Z 1245 │ 2026-10-24T12:44:50.7181770Z ╰──── 2026-10-24T12:44:50.7182003Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T12:44:50.7182152Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T12:44:50.7182155Z 2026-10-24T12:44:50.7182439Z ⚠ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'. 2026-10-24T12:44:50.7182592Z ╭─[apps/web/src/components/preview/PreviewPanelShell.tsx:61:9] 2026-10-24T12:44:50.7182646Z 60 │ ) { 2026-10-24T12:44:50.7182856Z 61 │ const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded"; 2026-10-24T12:44:50.7182941Z ·  ──────┬────── 2026-10-24T12:44:50.7183086Z · ╰── 'useDragRegion' is declared here 2026-10-24T12:44:50.7183177Z 62 │ const isInline = props.mode === "inline"; 2026-10-24T12:44:50.7183233Z ╰──── 2026-10-24T12:44:50.7183417Z  help: Consider removing this declaration. 2026-10-24T12:44:50.7183456Z 2026-10-24T12:44:50.7183936Z ⚠ 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-24T12:44:50.7184127Z ╭─[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:521:13] 2026-10-24T12:44:50.7184200Z 520 │ })).delivery; 2026-10-24T12:44:50.7184404Z 521 │ ╭─▶ while (delivery.outcome === "accepted") { 2026-10-24T12:44:50.7184522Z 522 │ │ yield* Effect.yieldNow; 2026-10-24T12:44:50.7184676Z 523 │ │ delivery = (yield* service.getWebhookDelivery({ 2026-10-24T12:44:50.7184781Z 524 │ │ id: task.id, 2026-10-24T12:44:50.7184901Z 525 │ │ deliveryId: deliveryId!, 2026-10-24T12:44:50.7185003Z 526 │ │ })).delivery; 2026-10-24T12:44:50.7185146Z 527 │ ╰─▶ } 2026-10-24T12:44:50.7185262Z 528 │ assert.equal(delivery.outcome, "dispatch_failed"); 2026-10-24T12:44:50.7185319Z ╰──── 2026-10-24T12:44:50.7185321Z 2026-10-24T12:44:50.7185587Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T12:44:50.7185734Z ╭─[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5] 2026-10-24T12:44:50.7185788Z 150 │ 2026-10-24T12:44:50.7185865Z 151 │ useEffect(() => { 2026-10-24T12:44:50.7185945Z ·  ────┬──── 2026-10-24T12:44:50.7186077Z · ╰── This is the containing effect 2026-10-24T12:44:50.7186161Z 152 │ if (!controlledSelectedPath) { 2026-10-24T12:44:50.7186226Z 153 │ return; 2026-10-24T12:44:50.7186285Z 154 │ } 2026-10-24T12:44:50.7186372Z 155 │ setExpandedPaths((current) => { 2026-10-24T12:44:50.7186453Z ·  ────────┬─────── 2026-10-24T12:44:50.7186627Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.7186753Z 156 │ const ancestors = ancestorPaths(controlledSelectedPath); 2026-10-24T12:44:50.7186808Z ╰──── 2026-10-24T12:44:50.7187423Z  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-24T12:44:50.7187759Z  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-24T12:44:50.7187762Z 2026-10-24T12:44:50.7187984Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T12:44:50.7188131Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:773:7] 2026-10-24T12:44:50.7188237Z 772 │ if (settingsSheetPresentation.isActive) { 2026-10-24T12:44:50.7188366Z 773 │ settingsRoutePresentation.present(settingsRouteSession); 2026-10-24T12:44:50.7188603Z ·  ────────────┬──────────── 2026-10-24T12:44:50.7188821Z · ╰── Missing dependency `settingsRoutePresentation` 2026-10-24T12:44:50.7188881Z 774 │ } 2026-10-24T12:44:50.7189086Z 775 │ }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]); 2026-10-24T12:44:50.7189201Z ·  ────────────────┬──────────────── 2026-10-24T12:44:50.7189488Z · ╰── Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead 2026-10-24T12:44:50.7189545Z 776 │ 2026-10-24T12:44:50.7189596Z ╰──── 2026-10-24T12:44:50.7190034Z  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-24T12:44:50.7190358Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.7190360Z 2026-10-24T12:44:50.7190521Z ⚠ react(immutability): This value cannot be modified 2026-10-24T12:44:50.7190669Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:391:5] 2026-10-24T12:44:50.7190829Z 387 │ typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0; 2026-10-24T12:44:50.7190967Z 388 │ const animatedBorderRadius = useSharedValue(targetBorderRadius); 2026-10-24T12:44:50.7191062Z ·  ──────────┬───────── 2026-10-24T12:44:50.7191222Z · ╰── `animatedBorderRadius` originates here 2026-10-24T12:44:50.7191390Z 389 │ const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android"; 2026-10-24T12:44:50.7191468Z 390 │ useLayoutEffect(() => { 2026-10-24T12:44:50.7191572Z 391 │ animatedBorderRadius.value = shouldAnimate 2026-10-24T12:44:50.7191663Z ·  ──────────┬───────── 2026-10-24T12:44:50.7191821Z · ╰── `animatedBorderRadius` cannot be modified 2026-10-24T12:44:50.7191915Z 392 │ ? withTiming(targetBorderRadius, { 2026-10-24T12:44:50.7191970Z ╰──── 2026-10-24T12:44:50.7192241Z  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-24T12:44:50.7192550Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T12:44:50.7192666Z 2026-10-24T12:44:50.7192910Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T12:44:50.7193069Z ╭─[apps/web/src/components/CommandPaletteThreadItems.tsx:152:58] 2026-10-24T12:44:50.7193253Z 151 │ if (threadSearchQuery.trim().length > 0 && !threadSearchQuery.startsWith(">") && !isOpen) { 2026-10-24T12:44:50.7193390Z 152 │ claimThreadOpen(thread.environmentId, thread.id, Date.now()); 2026-10-24T12:44:50.7193513Z ·  ─────┬──── 2026-10-24T12:44:50.7193688Z · ╰── Cannot call impure function 2026-10-24T12:44:50.7193749Z 153 │ } 2026-10-24T12:44:50.7193804Z ╰──── 2026-10-24T12:44:50.7194101Z  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-24T12:44:50.7194407Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T12:44:50.7194409Z 2026-10-24T12:44:50.7194615Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T12:44:50.7194768Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7] 2026-10-24T12:44:50.7194868Z 256 │ return () => cancelAnimationFrame(frame); 2026-10-24T12:44:50.7194949Z 257 │ }, [props.path, targetIndex]); 2026-10-24T12:44:50.7195028Z ·  ─────┬──── 2026-10-24T12:44:50.7195176Z · ╰── Unnecessary dependency `props.path` 2026-10-24T12:44:50.7195233Z 258 │ 2026-10-24T12:44:50.7195289Z ╰──── 2026-10-24T12:44:50.7195590Z  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-24T12:44:50.7195908Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.7195911Z 2026-10-24T12:44:50.7196109Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T12:44:50.7196258Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23] 2026-10-24T12:44:50.7196335Z 292 │ 2026-10-24T12:44:50.7197450Z ·  ─────────── 2026-10-24T12:44:50.7197516Z 310 │ {body} 2026-10-24T12:44:50.7197571Z ╰──── 2026-10-24T12:44:50.7197796Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T12:44:50.7197839Z 2026-10-24T12:44:50.7198106Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T12:44:50.7198274Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:217:7] 2026-10-24T12:44:50.7198330Z 213 │ }; 2026-10-24T12:44:50.7198401Z 214 │ useEffect(() => { 2026-10-24T12:44:50.7198476Z ·  ────┬──── 2026-10-24T12:44:50.7198606Z · ╰── This is the containing effect 2026-10-24T12:44:50.7198787Z 215 │ const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null; 2026-10-24T12:44:50.7198856Z 216 │ if (inserted) { 2026-10-24T12:44:50.7198936Z 217 │ setSelection((current) => 2026-10-24T12:44:50.7199020Z ·  ──────┬───── 2026-10-24T12:44:50.7199197Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.7199372Z 218 │ current.start === inserted.start && current.end === inserted.end ? current : inserted, 2026-10-24T12:44:50.7199427Z ╰──── 2026-10-24T12:44:50.7200042Z  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-24T12:44:50.7200369Z  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-24T12:44:50.7200375Z 2026-10-24T12:44:50.7200640Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T12:44:50.7200811Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:298:7] 2026-10-24T12:44:50.7200892Z 286 │ }, [hasWorkspaceSnapshot]); 2026-10-24T12:44:50.7200961Z 287 │ useEffect(() => { 2026-10-24T12:44:50.7201037Z ·  ────┬──── 2026-10-24T12:44:50.7201171Z · ╰── This is the containing effect 2026-10-24T12:44:50.7201323Z 288 │ if (!environmentId || !projectCwd || !selectedProviderInstanceId) return; 2026-10-24T12:44:50.7201479Z 289 │ const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`; 2026-10-24T12:44:50.7201551Z 290 │ const now = Date.now(); 2026-10-24T12:44:50.7201670Z 291 │ const lastRequest = workspaceRefreshKeyRef.current; 2026-10-24T12:44:50.7201737Z 292 │ if ( 2026-10-24T12:44:50.7201821Z 293 │ lastRequest?.key === key && 2026-10-24T12:44:50.7201962Z 294 │ now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS 2026-10-24T12:44:50.7202021Z 295 │ ) 2026-10-24T12:44:50.7202087Z 296 │ return; 2026-10-24T12:44:50.7202265Z 297 │ if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) { 2026-10-24T12:44:50.7202358Z 298 │ setWorkspaceRefreshRetry(null); 2026-10-24T12:44:50.7202460Z ·  ────────────┬─────────── 2026-10-24T12:44:50.7202639Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.7202731Z 299 │ return; 2026-10-24T12:44:50.7202788Z ╰──── 2026-10-24T12:44:50.7203472Z  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-24T12:44:50.7203837Z  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-24T12:44:50.7203841Z 2026-10-24T12:44:50.7204046Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T12:44:50.7204211Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:328:5] 2026-10-24T12:44:50.7204273Z 327 │ }, [ 2026-10-24T12:44:50.7204341Z 328 │ draftMessage, 2026-10-24T12:44:50.7204425Z ·  ──────┬───── 2026-10-24T12:44:50.7204578Z · ╰── Unnecessary dependency `draftMessage` 2026-10-24T12:44:50.7204649Z 329 │ environmentId, 2026-10-24T12:44:50.7204705Z ╰──── 2026-10-24T12:44:50.7205005Z  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-24T12:44:50.7205319Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.7205325Z 2026-10-24T12:44:50.7205536Z ⚠ eslint(no-unused-vars): Function 'describeSchedule' is declared but never used. 2026-10-24T12:44:50.7205668Z ╭─[apps/server/src/scheduledTasks/Schedule.ts:79:10] 2026-10-24T12:44:50.7205725Z 78 │ 2026-10-24T12:44:50.7205872Z 79 │ function describeSchedule(schedule: ScheduledTaskSchedule): string { 2026-10-24T12:44:50.7205963Z ·  ────────┬─────── 2026-10-24T12:44:50.7206115Z · ╰── 'describeSchedule' is declared here 2026-10-24T12:44:50.7206227Z 80 │ if (schedule.type === "webhook") return "On webhook"; 2026-10-24T12:44:50.7206283Z ╰──── 2026-10-24T12:44:50.7206389Z  help: Consider removing this declaration. 2026-10-24T12:44:50.7206392Z 2026-10-24T12:44:50.7206579Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T12:44:50.7206771Z ╭─[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:116:34] 2026-10-24T12:44:50.7206844Z 115 │ return [...commands]; 2026-10-24T12:44:50.7206977Z 116 │ }, [activeThreadRef, pathname, registrationVersion, navigation]); 2026-10-24T12:44:50.7207102Z ·  ─────────┬───────── 2026-10-24T12:44:50.7207296Z · ╰── Unnecessary dependency `registrationVersion` 2026-10-24T12:44:50.7207353Z 117 │ 2026-10-24T12:44:50.7207404Z ╰──── 2026-10-24T12:44:50.7207727Z  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-24T12:44:50.7208044Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.7208047Z 2026-10-24T12:44:50.7208311Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T12:44:50.7208546Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:361:7] 2026-10-24T12:44:50.7208720Z 355 │ }, [cancelledIncomingShareId, navigation, props.incomingShareId]); 2026-10-24T12:44:50.7208790Z 356 │ useEffect(() => { 2026-10-24T12:44:50.7208865Z ·  ────┬──── 2026-10-24T12:44:50.7208997Z · ╰── This is the containing effect 2026-10-24T12:44:50.7209087Z 357 │ if (!isReturningToProjectPicker) { 2026-10-24T12:44:50.7209152Z 358 │ return; 2026-10-24T12:44:50.7209211Z 359 │ } 2026-10-24T12:44:50.7209314Z 360 │ if (requestedInitialProjectAvailable) { 2026-10-24T12:44:50.7209410Z 361 │ setIsReturningToProjectPicker(false); 2026-10-24T12:44:50.7209518Z ·  ──────────────┬────────────── 2026-10-24T12:44:50.7209705Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.7209771Z 362 │ return; 2026-10-24T12:44:50.7209823Z ╰──── 2026-10-24T12:44:50.7210438Z  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-24T12:44:50.7210767Z  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-24T12:44:50.7210770Z 2026-10-24T12:44:50.7211032Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T12:44:50.7211192Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:504:9] 2026-10-24T12:44:50.7211247Z 447 │ 2026-10-24T12:44:50.7211316Z 448 │ useEffect(() => { 2026-10-24T12:44:50.7211394Z ·  ────┬──── 2026-10-24T12:44:50.7211527Z · ╰── This is the containing effect 2026-10-24T12:44:50.7211634Z 449 │ if (props.pendingTaskId || props.draftId) { 2026-10-24T12:44:50.7211698Z 450 │ return; 2026-10-24T12:44:50.7211758Z 451 │ } 2026-10-24T12:44:50.7211902Z 452 │ if (lastInitialProjectRefRef.current !== props.initialProjectRef) { 2026-10-24T12:44:50.7212042Z 453 │ lastInitialProjectRefRef.current = props.initialProjectRef; 2026-10-24T12:44:50.7212153Z 454 │ appliedInitialProjectKeyRef.current = null; 2026-10-24T12:44:50.7212212Z 455 │ } 2026-10-24T12:44:50.7212363Z 456 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-24T12:44:50.7212500Z 457 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-24T12:44:50.7212609Z 458 │ if (initialEnvironmentId && initialProjectId) { 2026-10-24T12:44:50.7212685Z 459 │ const directProject = 2026-10-24T12:44:50.7212779Z 460 │ projects.find( 2026-10-24T12:44:50.7212849Z 461 │ (project) => 2026-10-24T12:44:50.7213029Z 462 │ project.environmentId === initialEnvironmentId && project.id === initialProjectId, 2026-10-24T12:44:50.7213095Z 463 │ ) ?? null; 2026-10-24T12:44:50.7213148Z 464 │ 2026-10-24T12:44:50.7213222Z 465 │ if (directProject) { 2026-10-24T12:44:50.7213368Z 466 │ // Apply the route's project once. Re-applying on every change would 2026-10-24T12:44:50.7213512Z 467 │ // instantly revert environment/project switches made in the picker. 2026-10-24T12:44:50.7213754Z 468 │ const directProjectKey = `${directProject.environmentId}:${directProject.id}`; 2026-10-24T12:44:50.7213930Z 469 │ if (appliedInitialProjectKeyRef.current === directProjectKey) { 2026-10-24T12:44:50.7213996Z 470 │ return; 2026-10-24T12:44:50.7214057Z 471 │ } 2026-10-24T12:44:50.7214156Z 472 │ if (props.initialProjectRef?.branch) { 2026-10-24T12:44:50.7214222Z 473 │ if ( 2026-10-24T12:44:50.7216529Z 474 │ selectedProject?.environmentId !== directProject.environmentId || 2026-10-24T12:44:50.7216655Z 475 │ selectedProject.id !== directProject.id 2026-10-24T12:44:50.7216714Z 476 │ ) { 2026-10-24T12:44:50.7216800Z 477 │ setProject(directProject); 2026-10-24T12:44:50.7216863Z 478 │ return; 2026-10-24T12:44:50.7216923Z 479 │ } 2026-10-24T12:44:50.7217014Z 480 │ if (!flow.draftKey) return; 2026-10-24T12:44:50.7217163Z 481 │ // The route completes checkout before mounting this composer. Local 2026-10-24T12:44:50.7217310Z 482 │ // mode reuses an existing worktree; worktree mode would create another. 2026-10-24T12:44:50.7217422Z 483 │ updateComposerDraftSettings(flow.draftKey, { 2026-10-24T12:44:50.7217501Z 484 │ workspaceSelection: { 2026-10-24T12:44:50.7217573Z 485 │ mode: "local", 2026-10-24T12:44:50.7217680Z 486 │ branch: props.initialProjectRef.branch, 2026-10-24T12:44:50.7217819Z 487 │ worktreePath: props.initialProjectRef.worktreePath ?? null, 2026-10-24T12:44:50.7217900Z 488 │ startFromOrigin: false, 2026-10-24T12:44:50.7217963Z 489 │ }, 2026-10-24T12:44:50.7218023Z 490 │ }); 2026-10-24T12:44:50.7218079Z 491 │ } 2026-10-24T12:44:50.7218215Z 492 │ appliedInitialProjectKeyRef.current = directProjectKey; 2026-10-24T12:44:50.7218277Z 493 │ if ( 2026-10-24T12:44:50.7218424Z 494 │ selectedProject?.environmentId === directProject.environmentId && 2026-10-24T12:44:50.7218523Z 495 │ selectedProject.id === directProject.id 2026-10-24T12:44:50.7218582Z 496 │ ) { 2026-10-24T12:44:50.7218645Z 497 │ return; 2026-10-24T12:44:50.7218702Z 498 │ } 2026-10-24T12:44:50.7218781Z 499 │ setProject(directProject); 2026-10-24T12:44:50.7218843Z 500 │ return; 2026-10-24T12:44:50.7218899Z 501 │ } 2026-10-24T12:44:50.7218952Z 502 │ 2026-10-24T12:44:50.7219029Z 503 │ if (projects.length > 0) { 2026-10-24T12:44:50.7219127Z 504 │ setIsReturningToProjectPicker(true); 2026-10-24T12:44:50.7219343Z ·  ──────────────┬────────────── 2026-10-24T12:44:50.7219565Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.7219620Z 505 │ } 2026-10-24T12:44:50.7219674Z ╰──── 2026-10-24T12:44:50.7220287Z  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-24T12:44:50.7220620Z  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-24T12:44:50.7220623Z 2026-10-24T12:44:50.7220888Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T12:44:50.7221045Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:604:5] 2026-10-24T12:44:50.7221099Z 545 │ 2026-10-24T12:44:50.7221164Z 546 │ useEffect(() => { 2026-10-24T12:44:50.7221238Z ·  ────┬──── 2026-10-24T12:44:50.7221365Z · ╰── This is the containing effect 2026-10-24T12:44:50.7221461Z 547 │ const shareId = props.incomingShareId; 2026-10-24T12:44:50.7221544Z 548 │ const draftKey = flow.draftKey; 2026-10-24T12:44:50.7221646Z 549 │ const destinationProject = selectedProject; 2026-10-24T12:44:50.7221791Z 550 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-24T12:44:50.7221923Z 551 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-24T12:44:50.7222019Z 552 │ const selectedProjectMatchesRoute = 2026-10-24T12:44:50.7222100Z 553 │ !initialEnvironmentId || 2026-10-24T12:44:50.7222169Z 554 │ !initialProjectId || 2026-10-24T12:44:50.7222302Z 555 │ (destinationProject?.environmentId === initialEnvironmentId && 2026-10-24T12:44:50.7222407Z 556 │ destinationProject.id === initialProjectId); 2026-10-24T12:44:50.7222466Z 557 │ if ( 2026-10-24T12:44:50.7222527Z 558 │ !shareId || 2026-10-24T12:44:50.7222591Z 559 │ !draftKey || 2026-10-24T12:44:50.7222665Z 560 │ !destinationProject || 2026-10-24T12:44:50.7222793Z 561 │ !selectedProjectMatchesRoute || 2026-10-24T12:44:50.7222885Z 562 │ cancelledIncomingShareId === shareId 2026-10-24T12:44:50.7222940Z 563 │ ) { 2026-10-24T12:44:50.7223000Z 564 │ return; 2026-10-24T12:44:50.7223054Z 565 │ } 2026-10-24T12:44:50.7223156Z 566 │ const importKey = `${shareId}:${draftKey}`; 2026-10-24T12:44:50.7223214Z 567 │ if ( 2026-10-24T12:44:50.7223325Z 568 │ startedShareImportKeyRef.current === importKey || 2026-10-24T12:44:50.7223436Z 569 │ cancellingShareImportKeyRef.current === importKey 2026-10-24T12:44:50.7223492Z 570 │ ) { 2026-10-24T12:44:50.7223552Z 571 │ return; 2026-10-24T12:44:50.7223606Z 572 │ } 2026-10-24T12:44:50.7223658Z 573 │ 2026-10-24T12:44:50.7223728Z 574 │ if (!incomingShare) { 2026-10-24T12:44:50.7223927Z 575 │ if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) { 2026-10-24T12:44:50.7224056Z 576 │ alertedUnavailableIncomingShareIdRef.current = shareId; 2026-10-24T12:44:50.7224121Z 577 │ Dialog.alert( 2026-10-24T12:44:50.7224206Z 578 │ "Shared content unavailable", 2026-10-24T12:44:50.7224465Z 579 │ "The shared content is no longer in the inbox. You can continue editing this task draft.", 2026-10-24T12:44:50.7224567Z 580 │ ); 2026-10-24T12:44:50.7224621Z 581 │ } 2026-10-24T12:44:50.7224682Z 582 │ return; 2026-10-24T12:44:50.7224736Z 583 │ } 2026-10-24T12:44:50.7224787Z 584 │ 2026-10-24T12:44:50.7224843Z 585 │ if ( 2026-10-24T12:44:50.7225007Z 586 │ incomingShare.attachments.some((attachment) => attachment.type === "file") && 2026-10-24T12:44:50.7225109Z 587 │ selectedEnvironmentServerConfig === null 2026-10-24T12:44:50.7225164Z 588 │ ) { 2026-10-24T12:44:50.7225227Z 589 │ return; 2026-10-24T12:44:50.7225281Z 590 │ } 2026-10-24T12:44:50.7225334Z 591 │ 2026-10-24T12:44:50.7225470Z 592 │ if (alertedUnavailableIncomingShareIdRef.current === shareId) { 2026-10-24T12:44:50.7225600Z 593 │ alertedUnavailableIncomingShareIdRef.current = null; 2026-10-24T12:44:50.7225657Z 594 │ } 2026-10-24T12:44:50.7225768Z 595 │ startedShareImportKeyRef.current = importKey; 2026-10-24T12:44:50.7225836Z 596 │ const draftBackup = 2026-10-24T12:44:50.7226026Z 597 │ shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey); 2026-10-24T12:44:50.7226164Z 598 │ shareImportDraftBackupRef.current.set(importKey, draftBackup); 2026-10-24T12:44:50.7226254Z 599 │ const importToken = Symbol(importKey); 2026-10-24T12:44:50.7226330Z 600 │ let didReserveShare = false; 2026-10-24T12:44:50.7226407Z 601 │ let didConsumeShare = false; 2026-10-24T12:44:50.7226487Z 602 │ let needsDraftRestore = false; 2026-10-24T12:44:50.7226598Z 603 │ activeShareImportTokenRef.current = importToken; 2026-10-24T12:44:50.7226680Z 604 │ setImportingShareKey(importKey); 2026-10-24T12:44:50.7226775Z ·  ──────────┬───────── 2026-10-24T12:44:50.7226952Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.7227021Z 605 │ void (async () => { 2026-10-24T12:44:50.7227072Z ╰──── 2026-10-24T12:44:50.7227680Z  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-24T12:44:50.7228013Z  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-24T12:44:50.7228016Z 2026-10-24T12:44:50.7228224Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T12:44:50.7228381Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:524:5] 2026-10-24T12:44:50.7228456Z 523 │ props.initialProjectRef, 2026-10-24T12:44:50.7228529Z 524 │ props.incomingShareId, 2026-10-24T12:44:50.7228992Z ·  ──────────┬────────── 2026-10-24T12:44:50.7229161Z · ╰── Unnecessary dependency `props.incomingShareId` 2026-10-24T12:44:50.7229232Z 525 │ props.pendingTaskId, 2026-10-24T12:44:50.7229284Z ╰──── 2026-10-24T12:44:50.7229585Z  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-24T12:44:50.7230006Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.7230058Z 2026-10-24T12:44:50.7230274Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T12:44:50.7230428Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:543:5] 2026-10-24T12:44:50.7230545Z 542 │ loadedBranchesProjectKeyRef.current = projectKey; 2026-10-24T12:44:50.7230615Z 543 │ flow.loadBranches(); 2026-10-24T12:44:50.7230684Z ·  ──┬─ 2026-10-24T12:44:50.7230809Z · ╰── Missing dependency `flow` 2026-10-24T12:44:50.7230903Z 544 │ }, [flow.loadBranches, selectedProject]); 2026-10-24T12:44:50.7230988Z ·  ────────┬──────── 2026-10-24T12:44:50.7231194Z · ╰── Overly precise dependency `flow.loadBranches`, use `flow` instead 2026-10-24T12:44:50.7231252Z 545 │ 2026-10-24T12:44:50.7231304Z ╰──── 2026-10-24T12:44:50.7231736Z  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-24T12:44:50.7232052Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.7232057Z 2026-10-24T12:44:50.7232259Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T12:44:50.7232410Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:766:5] 2026-10-24T12:44:50.7232476Z 765 │ flow.draftKey, 2026-10-24T12:44:50.7232557Z 766 │ hasImportedIncomingShare, 2026-10-24T12:44:50.7232650Z ·  ────────────┬─────────── 2026-10-24T12:44:50.7232859Z · ╰── Unnecessary dependency `hasImportedIncomingShare` 2026-10-24T12:44:50.7232925Z 767 │ incomingShare, 2026-10-24T12:44:50.7233006Z 768 │ isIncomingShareInboxLoading, 2026-10-24T12:44:50.7233102Z ·  ─────────────┬───────────── 2026-10-24T12:44:50.7233285Z · ╰── Unnecessary dependency `isIncomingShareInboxLoading` 2026-10-24T12:44:50.7233365Z 769 │ isIncomingShareUnavailable, 2026-10-24T12:44:50.7233438Z 770 │ props.incomingShareId, 2026-10-24T12:44:50.7233531Z 771 │ props.initialProjectRef?.environmentId, 2026-10-24T12:44:50.7233621Z 772 │ props.initialProjectRef?.projectId, 2026-10-24T12:44:50.7233702Z 773 │ releaseShareReservation, 2026-10-24T12:44:50.7233769Z 774 │ reserveShare, 2026-10-24T12:44:50.7233854Z 775 │ selectedEnvironmentServerConfig, 2026-10-24T12:44:50.7233921Z 776 │ selectedProject, 2026-10-24T12:44:50.7233989Z 777 │ shareImportAttempt, 2026-10-24T12:44:50.7234074Z ·  ─────────┬──────── 2026-10-24T12:44:50.7234242Z · ╰── Unnecessary dependency `shareImportAttempt` 2026-10-24T12:44:50.7234298Z 778 │ ]); 2026-10-24T12:44:50.7234349Z ╰──── 2026-10-24T12:44:50.7234644Z  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-24T12:44:50.7235035Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.7235209Z 2026-10-24T12:44:50.7235379Z ⚠ eslint(no-empty-pattern): Empty array binding pattern 2026-10-24T12:44:50.7235541Z ╭─[apps/server/src/pullRequest/PullRequestService.test.ts:1437:12] 2026-10-24T12:44:50.7235598Z 1436 │ 2026-10-24T12:44:50.7235663Z 1437 │ for (const [] of [ 2026-10-24T12:44:50.7235735Z ·  ── 2026-10-24T12:44:50.7235808Z 1438 │ ["github", "github.com"], 2026-10-24T12:44:50.7235863Z ╰──── 2026-10-24T12:44:50.7236145Z  help: Passing non-iterable values (null, undefined, numbers, booleans, etc.) will result in a runtime error because these values are not iterable. 2026-10-24T12:44:50.7236148Z 2026-10-24T12:44:50.7236442Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T12:44:50.7236615Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:473:19] 2026-10-24T12:44:50.7236677Z 472 │ onFilters, 2026-10-24T12:44:50.7236744Z 473 │ authorOptions = [], 2026-10-24T12:44:50.7236822Z ·  ── 2026-10-24T12:44:50.7236888Z 474 │ labelOptions = [], 2026-10-24T12:44:50.7236940Z ╰──── 2026-10-24T12:44:50.7237261Z  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-24T12:44:50.7237264Z 2026-10-24T12:44:50.7237549Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T12:44:50.7237725Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:474:18] 2026-10-24T12:44:50.7237794Z 473 │ authorOptions = [], 2026-10-24T12:44:50.7237859Z 474 │ labelOptions = [], 2026-10-24T12:44:50.7237937Z ·  ── 2026-10-24T12:44:50.7237999Z 475 │ optionScope, 2026-10-24T12:44:50.7238051Z ╰──── 2026-10-24T12:44:50.7238368Z  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-24T12:44:50.7238372Z 2026-10-24T12:44:50.7238630Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T12:44:50.7238755Z ╭─[apps/server/src/serverRuntimeStartup.ts:728:7] 2026-10-24T12:44:50.7238809Z 727 │ 2026-10-24T12:44:50.7238890Z 728 │ const layer = layerWithOptions(); 2026-10-24T12:44:50.7238964Z ·  ──┬── 2026-10-24T12:44:50.7239093Z · ╰── 'layer' is declared here 2026-10-24T12:44:50.7239143Z ╰──── 2026-10-24T12:44:50.7239250Z  help: Consider removing this declaration. 2026-10-24T12:44:50.7239253Z 2026-10-24T12:44:50.7239420Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T12:44:50.7239570Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:372:47] 2026-10-24T12:44:50.7239703Z 371 │ const { open, onOpenChange, onSnooze, timestampFormat } = props; 2026-10-24T12:44:50.7239860Z 372 │ const presets = open ? resolveSnoozePresets(new Date(), timestampFormat) : []; 2026-10-24T12:44:50.7239976Z ·  ─────┬──── 2026-10-24T12:44:50.7240220Z · ╰── Cannot call impure function 2026-10-24T12:44:50.7240332Z 373 │ return ( 2026-10-24T12:44:50.7240383Z ╰──── 2026-10-24T12:44:50.7240665Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T12:44:50.7240966Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T12:44:50.7240969Z 2026-10-24T12:44:50.7241139Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T12:44:50.7241287Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:853:39] 2026-10-24T12:44:50.7241382Z 852 │ if (snoozeGateClock.thread !== thread) { 2026-10-24T12:44:50.7241515Z 853 │ setSnoozeGateClock({ thread, now: new Date().toISOString() }); 2026-10-24T12:44:50.7241628Z ·  ─────┬──── 2026-10-24T12:44:50.7241784Z · ╰── Cannot call impure function 2026-10-24T12:44:50.7241840Z 854 │ } 2026-10-24T12:44:50.7241891Z ╰──── 2026-10-24T12:44:50.7242170Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T12:44:50.7242467Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T12:44:50.7242469Z 2026-10-24T12:44:50.7242764Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T12:44:50.7242918Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:57:5] 2026-10-24T12:44:50.7242972Z 55 │ 2026-10-24T12:44:50.7243037Z 56 │ useEffect(() => { 2026-10-24T12:44:50.7243110Z ·  ────┬──── 2026-10-24T12:44:50.7243238Z · ╰── This is the containing effect 2026-10-24T12:44:50.7243307Z 57 │ setDecodedSize(null); 2026-10-24T12:44:50.7243386Z ·  ───────┬────── 2026-10-24T12:44:50.7243556Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.7243624Z 58 │ }, [props.sourceKey]); 2026-10-24T12:44:50.7243675Z ╰──── 2026-10-24T12:44:50.7244363Z  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-24T12:44:50.7244720Z  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-24T12:44:50.7244723Z 2026-10-24T12:44:50.7244982Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T12:44:50.7245133Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5] 2026-10-24T12:44:50.7245186Z 59 │ 2026-10-24T12:44:50.7245250Z 60 │ useEffect(() => { 2026-10-24T12:44:50.7245320Z ·  ────┬──── 2026-10-24T12:44:50.7245452Z · ╰── This is the containing effect 2026-10-24T12:44:50.7245525Z 61 │ setFailedUri(null); 2026-10-24T12:44:50.7245601Z ·  ──────┬───── 2026-10-24T12:44:50.7245767Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.7245831Z 62 │ }, [props.uri]); 2026-10-24T12:44:50.7245883Z ╰──── 2026-10-24T12:44:50.7246489Z  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-24T12:44:50.7246819Z  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-24T12:44:50.7246824Z 2026-10-24T12:44:50.7247043Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-24T12:44:50.7247193Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10] 2026-10-24T12:44:50.7247318Z 6 │ import { parse, SvgAst, type JsxAST } from "react-native-svg"; 2026-10-24T12:44:50.7247500Z 7 │ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native"; 2026-10-24T12:44:50.7247590Z ·  ────────┬──────── 2026-10-24T12:44:50.7247740Z · ╰── 'ActivityIndicator' is imported here 2026-10-24T12:44:50.7247794Z 8 │ 2026-10-24T12:44:50.7247846Z ╰──── 2026-10-24T12:44:50.7247946Z  help: Consider removing this import. 2026-10-24T12:44:50.7247949Z 2026-10-24T12:44:50.7248157Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T12:44:50.7248312Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7] 2026-10-24T12:44:50.7248380Z 57 │ setDecodedSize(null); 2026-10-24T12:44:50.7248450Z 58 │ }, [props.sourceKey]); 2026-10-24T12:44:50.7248530Z ·  ───────┬─────── 2026-10-24T12:44:50.7248686Z · ╰── Unnecessary dependency `props.sourceKey` 2026-10-24T12:44:50.7248738Z 59 │ 2026-10-24T12:44:50.7248789Z ╰──── 2026-10-24T12:44:50.7249086Z  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-24T12:44:50.7249478Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.7249512Z 2026-10-24T12:44:50.7249713Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T12:44:50.7249863Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7] 2026-10-24T12:44:50.7249931Z 61 │ setFailedUri(null); 2026-10-24T12:44:50.7249994Z 62 │ }, [props.uri]); 2026-10-24T12:44:50.7250068Z ·  ────┬──── 2026-10-24T12:44:50.7250209Z · ╰── Unnecessary dependency `props.uri` 2026-10-24T12:44:50.7250260Z 63 │ 2026-10-24T12:44:50.7250312Z ╰──── 2026-10-24T12:44:50.7250608Z  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-24T12:44:50.7250929Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.7250935Z 2026-10-24T12:44:50.7251095Z ⚠ react(immutability): This value cannot be modified 2026-10-24T12:44:50.7251259Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:111:5] 2026-10-24T12:44:50.7251315Z 107 │ ); 2026-10-24T12:44:50.7251470Z 108 │ const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0); 2026-10-24T12:44:50.7251560Z ·  ─────────┬──────── 2026-10-24T12:44:50.7251711Z · ╰── `separationProgress` originates here 2026-10-24T12:44:50.7251765Z 109 │ 2026-10-24T12:44:50.7251832Z 110 │ useEffect(() => { 2026-10-24T12:44:50.7252015Z 111 │ separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING); 2026-10-24T12:44:50.7252101Z ·  ─────────┬──────── 2026-10-24T12:44:50.7252253Z · ╰── `separationProgress` cannot be modified 2026-10-24T12:44:50.7252363Z 112 │ }, [props.showScrollToEnd, separationProgress]); 2026-10-24T12:44:50.7252415Z ╰──── 2026-10-24T12:44:50.7252717Z  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-24T12:44:50.7253027Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T12:44:50.7253029Z 2026-10-24T12:44:50.7253186Z ⚠ react(immutability): This value cannot be modified 2026-10-24T12:44:50.7253356Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-24T12:44:50.7253470Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-24T12:44:50.7253586Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-24T12:44:50.7253668Z ·  ──────┬───── 2026-10-24T12:44:50.7253805Z · ╰── `capsuleWidth` originates here 2026-10-24T12:44:50.7253916Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T12:44:50.7254030Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T12:44:50.7254137Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T12:44:50.7254233Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T12:44:50.7254294Z 134 │ return; 2026-10-24T12:44:50.7254422Z 135 │ } 2026-10-24T12:44:50.7254567Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T12:44:50.7254655Z 137 │ measuredWidthRef.current = width; 2026-10-24T12:44:50.7254797Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T12:44:50.7254876Z ·  ──────┬───── 2026-10-24T12:44:50.7255018Z · ╰── `capsuleWidth` cannot be modified 2026-10-24T12:44:50.7255075Z 139 │ }; 2026-10-24T12:44:50.7255126Z ╰──── 2026-10-24T12:44:50.7255393Z  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-24T12:44:50.7255702Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T12:44:50.7255710Z 2026-10-24T12:44:50.7255868Z ⚠ react(immutability): This value cannot be modified 2026-10-24T12:44:50.7256033Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-24T12:44:50.7256142Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-24T12:44:50.7256257Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-24T12:44:50.7256341Z ·  ──────┬───── 2026-10-24T12:44:50.7256482Z · ╰── `capsuleWidth` originates here 2026-10-24T12:44:50.7256590Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T12:44:50.7256707Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T12:44:50.7256813Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T12:44:50.7256916Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T12:44:50.7256978Z 134 │ return; 2026-10-24T12:44:50.7257035Z 135 │ } 2026-10-24T12:44:50.7257141Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T12:44:50.7257228Z 137 │ measuredWidthRef.current = width; 2026-10-24T12:44:50.7257368Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T12:44:50.7257424Z 139 │ }; 2026-10-24T12:44:50.7257515Z 140 │ const hasStatus = props.status !== null; 2026-10-24T12:44:50.7257651Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-24T12:44:50.7257715Z 142 │ useEffect(() => { 2026-10-24T12:44:50.7257783Z 143 │ if (!hasStatus) { 2026-10-24T12:44:50.7257871Z 144 │ measuredWidthRef.current = null; 2026-10-24T12:44:50.7257950Z 145 │ capsuleWidth.value = null; 2026-10-24T12:44:50.7258033Z ·  ──────┬───── 2026-10-24T12:44:50.7258178Z · ╰── `capsuleWidth` cannot be modified 2026-10-24T12:44:50.7258233Z 146 │ } 2026-10-24T12:44:50.7258283Z ╰──── 2026-10-24T12:44:50.7258550Z  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-24T12:44:50.7258861Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T12:44:50.7258864Z 2026-10-24T12:44:50.7259066Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T12:44:50.7259232Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-24T12:44:50.7259433Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-24T12:44:50.7259535Z 142 │ useEffect(() => { 2026-10-24T12:44:50.7259615Z ·  ───┬─── 2026-10-24T12:44:50.7259847Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-24T12:44:50.7259913Z 143 │ if (!hasStatus) { 2026-10-24T12:44:50.7260000Z 144 │ measuredWidthRef.current = null; 2026-10-24T12:44:50.7260078Z 145 │ capsuleWidth.value = null; 2026-10-24T12:44:50.7260156Z ·  ──────┬───── 2026-10-24T12:44:50.7260290Z · ╰── This modifies `capsuleWidth` 2026-10-24T12:44:50.7260345Z 146 │ } 2026-10-24T12:44:50.7260399Z ╰──── 2026-10-24T12:44:50.7260752Z  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-24T12:44:50.7261076Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T12:44:50.7261081Z 2026-10-24T12:44:50.7261279Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T12:44:50.7261444Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-24T12:44:50.7261557Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T12:44:50.7261675Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T12:44:50.7261800Z ·  ───────────────┬─────────────── 2026-10-24T12:44:50.7262047Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-24T12:44:50.7262156Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T12:44:50.7262255Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T12:44:50.7262314Z 134 │ return; 2026-10-24T12:44:50.7262369Z 135 │ } 2026-10-24T12:44:50.7262475Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T12:44:50.7262561Z 137 │ measuredWidthRef.current = width; 2026-10-24T12:44:50.7262732Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T12:44:50.7262812Z ·  ──────┬───── 2026-10-24T12:44:50.7262945Z · ╰── This modifies `capsuleWidth` 2026-10-24T12:44:50.7263000Z 139 │ }; 2026-10-24T12:44:50.7263056Z ╰──── 2026-10-24T12:44:50.7263406Z  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-24T12:44:50.7263718Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T12:44:50.7263721Z 2026-10-24T12:44:50.7263983Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T12:44:50.7264119Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2143:5] 2026-10-24T12:44:50.7264176Z 2141 │ ); 2026-10-24T12:44:50.7264245Z 2142 │ useEffect(() => { 2026-10-24T12:44:50.7264321Z ·  ────┬──── 2026-10-24T12:44:50.7264522Z · ╰── This is the containing effect 2026-10-24T12:44:50.7264633Z 2143 │ setExpandedVideo(null); 2026-10-24T12:44:50.7264718Z ·  ────────┬─────── 2026-10-24T12:44:50.7264892Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.7264966Z 2144 │ setExpandedFile(null); 2026-10-24T12:44:50.7265021Z ╰──── 2026-10-24T12:44:50.7265631Z  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-24T12:44:50.7265967Z  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-24T12:44:50.7265972Z 2026-10-24T12:44:50.7266230Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T12:44:50.7266367Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2644:9] 2026-10-24T12:44:50.7266506Z 2635 │ const stopFollowingEnd = useEffectEvent(() => setEndFollow(false)); 2026-10-24T12:44:50.7266574Z 2636 │ useEffect(() => { 2026-10-24T12:44:50.7266649Z ·  ────┬──── 2026-10-24T12:44:50.7266779Z · ╰── This is the containing effect 2026-10-24T12:44:50.7266908Z 2637 │ if (!jumpToMessageId || loadedListKey !== listMountKey) return; 2026-10-24T12:44:50.7267005Z 2638 │ const index = presentedFeed.findIndex( 2026-10-24T12:44:50.7267146Z 2639 │ (entry) => entry.type === "message" && entry.id === jumpToMessageId, 2026-10-24T12:44:50.7267204Z 2640 │ ); 2026-10-24T12:44:50.7267277Z 2641 │ if (index === -1) { 2026-10-24T12:44:50.7267410Z 2642 │ const runId = messageFoldRunId(props.feed, jumpToMessageId); 2026-10-24T12:44:50.7267515Z 2643 │ if (runId && !expandedTurnIds.has(runId)) { 2026-10-24T12:44:50.7267608Z 2644 │ setInteractionState((current) => ({ 2026-10-24T12:44:50.7267700Z ·  ─────────┬───────── 2026-10-24T12:44:50.7267879Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.7267947Z 2645 │ ...current, 2026-10-24T12:44:50.7267999Z ╰──── 2026-10-24T12:44:50.7268679Z  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-24T12:44:50.7269013Z  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-24T12:44:50.7269016Z 2026-10-24T12:44:50.7269250Z ⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used. 2026-10-24T12:44:50.7269384Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:66:10] 2026-10-24T12:44:50.7269521Z 65 │ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets"; 2026-10-24T12:44:50.7269663Z 66 │ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks"; 2026-10-24T12:44:50.7269853Z ·  ───────────┬─────────── 2026-10-24T12:44:50.7270062Z · ╰── 'isMarkdownFileLinkLabel' is imported here 2026-10-24T12:44:50.7270221Z 67 │ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments"; 2026-10-24T12:44:50.7270274Z ╰──── 2026-10-24T12:44:50.7270373Z  help: Consider removing this import. 2026-10-24T12:44:50.7270376Z 2026-10-24T12:44:50.7270584Z ⚠ eslint(no-unused-vars): Identifier 'createContext' is imported but never used. 2026-10-24T12:44:50.7270717Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:92:3] 2026-10-24T12:44:50.7270774Z 91 │ import { 2026-10-24T12:44:50.7270839Z 92 │ createContext, 2026-10-24T12:44:50.7270915Z ·  ──────┬────── 2026-10-24T12:44:50.7271059Z · ╰── 'createContext' is imported here 2026-10-24T12:44:50.7271120Z 93 │ memo, 2026-10-24T12:44:50.7271174Z ╰──── 2026-10-24T12:44:50.7271271Z  help: Consider removing this import. 2026-10-24T12:44:50.7271274Z 2026-10-24T12:44:50.7271487Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-24T12:44:50.7271621Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:108:3] 2026-10-24T12:44:50.7271683Z 107 │ import { 2026-10-24T12:44:50.7271752Z 108 │ ActivityIndicator, 2026-10-24T12:44:50.7271835Z ·  ────────┬──────── 2026-10-24T12:44:50.7271982Z · ╰── 'ActivityIndicator' is imported here 2026-10-24T12:44:50.7272041Z 109 │ Image, 2026-10-24T12:44:50.7272094Z ╰──── 2026-10-24T12:44:50.7272195Z  help: Consider removing this import. 2026-10-24T12:44:50.7272205Z 2026-10-24T12:44:50.7272406Z ⚠ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used. 2026-10-24T12:44:50.7272542Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:115:3] 2026-10-24T12:44:50.7272606Z 114 │ Pressable, 2026-10-24T12:44:50.7272668Z 115 │ ScrollView, 2026-10-24T12:44:50.7272873Z ·  ─────┬──── 2026-10-24T12:44:50.7273006Z · ╰── 'ScrollView' is imported here 2026-10-24T12:44:50.7273070Z 116 │ StyleSheet, 2026-10-24T12:44:50.7273120Z ╰──── 2026-10-24T12:44:50.7273217Z  help: Consider removing this import. 2026-10-24T12:44:50.7273220Z 2026-10-24T12:44:50.7273422Z ⚠ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used. 2026-10-24T12:44:50.7273651Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:117:11] 2026-10-24T12:44:50.7273750Z 116 │ StyleSheet, 2026-10-24T12:44:50.7273816Z 117 │ Text as NativeText, 2026-10-24T12:44:50.7273897Z ·  ─────┬──── 2026-10-24T12:44:50.7274036Z · ╰── 'NativeText' is imported here 2026-10-24T12:44:50.7274101Z 118 │ type ColorValue, 2026-10-24T12:44:50.7274153Z ╰──── 2026-10-24T12:44:50.7274249Z  help: Consider removing this import. 2026-10-24T12:44:50.7274251Z 2026-10-24T12:44:50.7274469Z ⚠ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used. 2026-10-24T12:44:50.7274605Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:140:10] 2026-10-24T12:44:50.7274749Z 139 │ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic"; 2026-10-24T12:44:50.7274883Z 140 │ import { tryOpenExternalUrl } from "../../lib/openExternalUrl"; 2026-10-24T12:44:50.7274974Z ·  ─────────┬──────── 2026-10-24T12:44:50.7275131Z · ╰── 'tryOpenExternalUrl' is imported here 2026-10-24T12:44:50.7275278Z 141 │ import { downloadAndShareAttachment } from "../../lib/attachmentDownload"; 2026-10-24T12:44:50.7275332Z ╰──── 2026-10-24T12:44:50.7275428Z  help: Consider removing this import. 2026-10-24T12:44:50.7275430Z 2026-10-24T12:44:50.7275652Z ⚠ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used. 2026-10-24T12:44:50.7275786Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:143:10] 2026-10-24T12:44:50.7275928Z 142 │ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks"; 2026-10-24T12:44:50.7276057Z 143 │ import { faviconUrlForOrigin } from "@t3tools/shared/favicon"; 2026-10-24T12:44:50.7276149Z ·  ─────────┬───────── 2026-10-24T12:44:50.7276304Z · ╰── 'faviconUrlForOrigin' is imported here 2026-10-24T12:44:50.7276364Z 144 │ import { 2026-10-24T12:44:50.7276416Z ╰──── 2026-10-24T12:44:50.7276512Z  help: Consider removing this import. 2026-10-24T12:44:50.7276515Z 2026-10-24T12:44:50.7276729Z ⚠ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used. 2026-10-24T12:44:50.7276865Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:157:10] 2026-10-24T12:44:50.7277014Z 156 │ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile"; 2026-10-24T12:44:50.7277156Z 157 │ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer"; 2026-10-24T12:44:50.7277246Z ·  ────────┬─────── 2026-10-24T12:44:50.7277396Z · ╰── 'MediaVideoPlayer' is imported here 2026-10-24T12:44:50.7277537Z 158 │ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia"; 2026-10-24T12:44:50.7277589Z ╰──── 2026-10-24T12:44:50.7277683Z  help: Consider removing this import. 2026-10-24T12:44:50.7277685Z 2026-10-24T12:44:50.7277910Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used. 2026-10-24T12:44:50.7278044Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:161:3] 2026-10-24T12:44:50.7278129Z 160 │ attachmentVideoPreviewSource, 2026-10-24T12:44:50.7278200Z 161 │ mediaVideoPreviewUri, 2026-10-24T12:44:50.7278370Z ·  ──────────┬───────── 2026-10-24T12:44:50.7278558Z · ╰── 'mediaVideoPreviewUri' is imported here 2026-10-24T12:44:50.7278633Z 162 │ mediaVideoThumbnailKey, 2026-10-24T12:44:50.7278683Z ╰──── 2026-10-24T12:44:50.7278779Z  help: Consider removing this import. 2026-10-24T12:44:50.7278781Z 2026-10-24T12:44:50.7279009Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used. 2026-10-24T12:44:50.7279143Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:162:3] 2026-10-24T12:44:50.7279214Z 161 │ mediaVideoPreviewUri, 2026-10-24T12:44:50.7279285Z 162 │ mediaVideoThumbnailKey, 2026-10-24T12:44:50.7279374Z ·  ───────────┬────────── 2026-10-24T12:44:50.7279542Z · ╰── 'mediaVideoThumbnailKey' is imported here 2026-10-24T12:44:50.7279626Z 163 │ type MediaVideoPreviewSource, 2026-10-24T12:44:50.7279676Z ╰──── 2026-10-24T12:44:50.7279772Z  help: Consider removing this import. 2026-10-24T12:44:50.7279774Z 2026-10-24T12:44:50.7279990Z ⚠ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used. 2026-10-24T12:44:50.7280124Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:163:8] 2026-10-24T12:44:50.7280195Z 162 │ mediaVideoThumbnailKey, 2026-10-24T12:44:50.7280275Z 163 │ type MediaVideoPreviewSource, 2026-10-24T12:44:50.7280370Z ·  ───────────┬─────────── 2026-10-24T12:44:50.7280534Z · ╰── 'MediaVideoPreviewSource' is imported here 2026-10-24T12:44:50.7280625Z 164 │ } from "../../lib/videoPreviewSource"; 2026-10-24T12:44:50.7280679Z ╰──── 2026-10-24T12:44:50.7280776Z  help: Consider removing this import. 2026-10-24T12:44:50.7280778Z 2026-10-24T12:44:50.7280980Z ⚠ eslint(no-unused-vars): Type 'ReviewDiffTheme' is imported but never used. 2026-10-24T12:44:50.7281113Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:171:15] 2026-10-24T12:44:50.7281293Z 170 │ import { parseReviewCommentMessageSegments } from "../review/reviewCommentSelection"; 2026-10-24T12:44:50.7281435Z 171 │ import type { ReviewDiffTheme } from "../review/shikiReviewHighlighter"; 2026-10-24T12:44:50.7281527Z ·  ───────┬─────── 2026-10-24T12:44:50.7281677Z · ╰── 'ReviewDiffTheme' is imported here 2026-10-24T12:44:50.7281737Z 172 │ import { 2026-10-24T12:44:50.7281790Z ╰──── 2026-10-24T12:44:50.7281892Z  help: Consider removing this import. 2026-10-24T12:44:50.7281897Z 2026-10-24T12:44:50.7282128Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used. 2026-10-24T12:44:50.7282262Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:186:3] 2026-10-24T12:44:50.7282322Z 185 │ import { 2026-10-24T12:44:50.7282398Z 186 │ resolveMarkdownFontSizes, 2026-10-24T12:44:50.7282488Z ·  ────────────┬─────────── 2026-10-24T12:44:50.7282651Z · ╰── 'resolveMarkdownFontSizes' is imported here 2026-10-24T12:44:50.7282771Z 187 │ resolveNativeMarkdownTypography, 2026-10-24T12:44:50.7282823Z ╰──── 2026-10-24T12:44:50.7282916Z  help: Consider removing this import. 2026-10-24T12:44:50.7282919Z 2026-10-24T12:44:50.7283255Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used. 2026-10-24T12:44:50.7283423Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:193:3] 2026-10-24T12:44:50.7283503Z 192 │ normalizeNativeMarkdownUrl, 2026-10-24T12:44:50.7283597Z 193 │ resolveMarkdownInlineCodePresentation, 2026-10-24T12:44:50.7283711Z ·  ──────────────────┬────────────────── 2026-10-24T12:44:50.7283911Z · ╰── 'resolveMarkdownInlineCodePresentation' is imported here 2026-10-24T12:44:50.7283998Z 194 │ resolveMarkdownLinkPresentation, 2026-10-24T12:44:50.7284048Z ╰──── 2026-10-24T12:44:50.7284144Z  help: Consider removing this import. 2026-10-24T12:44:50.7284147Z 2026-10-24T12:44:50.7284385Z ⚠ eslint(no-unused-vars): Identifier 'useMarkdownCodeHighlight' is imported but never used. 2026-10-24T12:44:50.7284523Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:233:10] 2026-10-24T12:44:50.7284626Z 232 │ import { ThreadMcpApp } from "./McpAppWebView"; 2026-10-24T12:44:50.7284771Z 233 │ import { useMarkdownCodeHighlight } from "./markdownCodeHighlightState"; 2026-10-24T12:44:50.7284872Z ·  ────────────┬─────────── 2026-10-24T12:44:50.7285043Z · ╰── 'useMarkdownCodeHighlight' is imported here 2026-10-24T12:44:50.7285103Z 234 │ import { 2026-10-24T12:44:50.7285155Z ╰──── 2026-10-24T12:44:50.7285250Z  help: Consider removing this import. 2026-10-24T12:44:50.7285252Z 2026-10-24T12:44:50.7285470Z ⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used. 2026-10-24T12:44:50.7285610Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:237:3] 2026-10-24T12:44:50.7285676Z 236 │ useAssetUrl, 2026-10-24T12:44:50.7285743Z 237 │ useAssetUrlState, 2026-10-24T12:44:50.7285823Z ·  ────────┬─────── 2026-10-24T12:44:50.7285967Z · ╰── 'useAssetUrlState' is imported here 2026-10-24T12:44:50.7286034Z 238 │ useRefreshAssetUrl, 2026-10-24T12:44:50.7286086Z ╰──── 2026-10-24T12:44:50.7286181Z  help: Consider removing this import. 2026-10-24T12:44:50.7286183Z 2026-10-24T12:44:50.7286385Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T12:44:50.7286519Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2145:7] 2026-10-24T12:44:50.7286595Z 2144 │ setExpandedFile(null); 2026-10-24T12:44:50.7286841Z 2145 │ }, [props.environmentId, props.threadId, props.contentPresentation.kind]); 2026-10-24T12:44:50.7287105Z ·  ─────────┬───────── ───────┬────── ───────────────┬────────────── 2026-10-24T12:44:50.7287401Z · │ │ ╰── Unnecessary dependency `props.contentPresentation.kind` 2026-10-24T12:44:50.7287604Z · │ ╰── Unnecessary dependency `props.threadId` 2026-10-24T12:44:50.7287770Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-24T12:44:50.7287913Z 2146 │ const horizontalPadding = props.layoutVariant === "split" ? 20 : 16; 2026-10-24T12:44:50.7287964Z ╰──── 2026-10-24T12:44:50.7288274Z  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-24T12:44:50.7288598Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.7288601Z 2026-10-24T12:44:50.7288804Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T12:44:50.7288941Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2613:7] 2026-10-24T12:44:50.7289037Z 2612 │ reportHeaderMaterialVisibility(false); 2026-10-24T12:44:50.7289153Z 2613 │ }, [feedThreadKey, reportHeaderMaterialVisibility]); 2026-10-24T12:44:50.7289235Z ·  ──────┬────── 2026-10-24T12:44:50.7289392Z · ╰── Unnecessary dependency `feedThreadKey` 2026-10-24T12:44:50.7289447Z 2614 │ 2026-10-24T12:44:50.7289501Z ╰──── 2026-10-24T12:44:50.7289800Z  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-24T12:44:50.7290120Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.7290122Z 2026-10-24T12:44:50.7290323Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T12:44:50.7290457Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2629:7] 2026-10-24T12:44:50.7290515Z 2628 │ } 2026-10-24T12:44:50.7290651Z 2629 │ }, [listMountKey, props.contentInsetEndAdjustment, listRef]); 2026-10-24T12:44:50.7290735Z ·  ──────┬───── 2026-10-24T12:44:50.7290882Z · ╰── Unnecessary dependency `listMountKey` 2026-10-24T12:44:50.7291030Z 2630 │ // Opening at a message: its run unfolds, the list stops following the end 2026-10-24T12:44:50.7291083Z ╰──── 2026-10-24T12:44:50.7291379Z  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-24T12:44:50.7291690Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.7291693Z 2026-10-24T12:44:50.7291974Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T12:44:50.7292143Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2825:7] 2026-10-24T12:44:50.7292201Z 2824 │ } 2026-10-24T12:44:50.7292384Z 2825 │ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]); 2026-10-24T12:44:50.7292586Z ·  ───────┬─────── ─────────┬──────── ────────┬─────── 2026-10-24T12:44:50.7292875Z · │ │ ╰── Unnecessary dependency `expandedWorkRows` 2026-10-24T12:44:50.7293087Z · │ ╰── Unnecessary dependency `expandedWorkGroups` 2026-10-24T12:44:50.7293242Z · ╰── Unnecessary dependency `expandedTurnIds` 2026-10-24T12:44:50.7293303Z 2826 │ 2026-10-24T12:44:50.7293359Z ╰──── 2026-10-24T12:44:50.7293654Z  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-24T12:44:50.7293973Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.7293975Z 2026-10-24T12:44:50.7294159Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T12:44:50.7294293Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:617:9] 2026-10-24T12:44:50.7294353Z 616 │ }; 2026-10-24T12:44:50.7294472Z 617 │ }, [props.environmentId, attachment.id, httpBaseUrl]), 2026-10-24T12:44:50.7294669Z ·  ─────────┬───────── ──────┬────── ─────┬───── 2026-10-24T12:44:50.7294912Z · │ │ ╰── Unnecessary dependency `httpBaseUrl` 2026-10-24T12:44:50.7295112Z · │ ╰── Unnecessary dependency `attachment.id` 2026-10-24T12:44:50.7295279Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-24T12:44:50.7295336Z 618 │ ); 2026-10-24T12:44:50.7295387Z ╰──── 2026-10-24T12:44:50.7295707Z  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-24T12:44:50.7296034Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.7296039Z 2026-10-24T12:44:50.7296306Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T12:44:50.7296465Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:569:5] 2026-10-24T12:44:50.7296523Z 567 │ }, []); 2026-10-24T12:44:50.7296592Z 568 │ useEffect(() => { 2026-10-24T12:44:50.7296666Z ·  ────┬──── 2026-10-24T12:44:50.7296797Z · ╰── This is the containing effect 2026-10-24T12:44:50.7296884Z 569 │ setKeyboardStateSuspect(false); 2026-10-24T12:44:50.7296978Z ·  ───────────┬─────────── 2026-10-24T12:44:50.7297221Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.7297362Z 570 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-24T12:44:50.7297413Z ╰──── 2026-10-24T12:44:50.7298025Z  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-24T12:44:50.7298351Z  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-24T12:44:50.7298354Z 2026-10-24T12:44:50.7298620Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T12:44:50.7298777Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:965:7] 2026-10-24T12:44:50.7298932Z 962 │ const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0); 2026-10-24T12:44:50.7299000Z 963 │ useEffect(() => { 2026-10-24T12:44:50.7299075Z ·  ────┬──── 2026-10-24T12:44:50.7299205Z · ╰── This is the containing effect 2026-10-24T12:44:50.7299364Z 964 │ if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) { 2026-10-24T12:44:50.7299479Z 965 │ setLastKnownKeyboardHeight(liveKeyboardHeight); 2026-10-24T12:44:50.7299579Z ·  ─────────────┬──────────── 2026-10-24T12:44:50.7299757Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.7299819Z 966 │ } 2026-10-24T12:44:50.7299876Z ╰──── 2026-10-24T12:44:50.7300484Z  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-24T12:44:50.7300812Z  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-24T12:44:50.7300815Z 2026-10-24T12:44:50.7301074Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T12:44:50.7301231Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1221:5] 2026-10-24T12:44:50.7301290Z 1219 │ 2026-10-24T12:44:50.7301361Z 1220 │ useEffect(() => { 2026-10-24T12:44:50.7301436Z ·  ────┬──── 2026-10-24T12:44:50.7301565Z · ╰── This is the containing effect 2026-10-24T12:44:50.7301646Z 1221 │ setAnchorMessageId(null); 2026-10-24T12:44:50.7301734Z ·  ─────────┬──────── 2026-10-24T12:44:50.7301908Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.7301990Z 1222 │ setSubmittedMessageId(null); 2026-10-24T12:44:50.7302043Z ╰──── 2026-10-24T12:44:50.7302758Z  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-24T12:44:50.7303118Z  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-24T12:44:50.7303121Z 2026-10-24T12:44:50.7303322Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T12:44:50.7303474Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:570:7] 2026-10-24T12:44:50.7303561Z 569 │ setKeyboardStateSuspect(false); 2026-10-24T12:44:50.7303662Z 570 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-24T12:44:50.7303803Z ·  ────────┬──────── ─────────┬──────── 2026-10-24T12:44:50.7304018Z · │ ╰── Unnecessary dependency `liveKeyboardHeight` 2026-10-24T12:44:50.7304181Z · ╰── Unnecessary dependency `isKeyboardVisible` 2026-10-24T12:44:50.7304311Z 571 │ const handleOwnedInputFocusChange = (focused: boolean) => { 2026-10-24T12:44:50.7304364Z ╰──── 2026-10-24T12:44:50.7304662Z  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-24T12:44:50.7304978Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.7304981Z 2026-10-24T12:44:50.7305182Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T12:44:50.7305345Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1169:7] 2026-10-24T12:44:50.7305438Z 1168 │ userInputInsetProgress.set(1); 2026-10-24T12:44:50.7305603Z 1169 │ }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]); 2026-10-24T12:44:50.7305701Z ·  ────────────┬─────────── 2026-10-24T12:44:50.7305881Z · ╰── Unnecessary dependency `activeUserInputRequestId` 2026-10-24T12:44:50.7305989Z 1170 │ const showContent = props.showContent ?? true; 2026-10-24T12:44:50.7306040Z ╰──── 2026-10-24T12:44:50.7306338Z  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-24T12:44:50.7306725Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.7306767Z 2026-10-24T12:44:50.7306968Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T12:44:50.7307125Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1227:15] 2026-10-24T12:44:50.7307195Z 1226 │ freeze.set(false); 2026-10-24T12:44:50.7307280Z 1227 │ }, [freeze, selectedThreadKey]); 2026-10-24T12:44:50.7307375Z ·  ────────┬──────── 2026-10-24T12:44:50.7307540Z · ╰── Unnecessary dependency `selectedThreadKey` 2026-10-24T12:44:50.7307594Z 1228 │ 2026-10-24T12:44:50.7307649Z ╰──── 2026-10-24T12:44:50.7307951Z  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-24T12:44:50.7308270Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.7308273Z 2026-10-24T12:44:50.7308428Z ⚠ react(immutability): This value cannot be modified 2026-10-24T12:44:50.7308648Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1057:5] 2026-10-24T12:44:50.7308763Z 1052 │ const composerPopoverHeight = useSharedValue(0); 2026-10-24T12:44:50.7308873Z 1053 │ const floatingControlCoverage = useSharedValue( 2026-10-24T12:44:50.7308969Z ·  ───────────┬─────────── 2026-10-24T12:44:50.7309135Z · ╰── `floatingControlCoverage` originates here 2026-10-24T12:44:50.7309272Z 1054 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-24T12:44:50.7309333Z 1055 │ ); 2026-10-24T12:44:50.7309399Z 1056 │ useEffect(() => { 2026-10-24T12:44:50.7309507Z 1057 │ floatingControlCoverage.value = withTiming( 2026-10-24T12:44:50.7309601Z ·  ───────────┬─────────── 2026-10-24T12:44:50.7309769Z · ╰── `floatingControlCoverage` cannot be modified 2026-10-24T12:44:50.7309898Z 1058 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-24T12:44:50.7309953Z ╰──── 2026-10-24T12:44:50.7310225Z  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-24T12:44:50.7310542Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T12:44:50.7310548Z 2026-10-24T12:44:50.7310703Z ⚠ react(immutability): This value cannot be modified 2026-10-24T12:44:50.7310857Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1075:7] 2026-10-24T12:44:50.7311049Z 1065 │ const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null; 2026-10-24T12:44:50.7311176Z 1066 │ const combinedContentInsetEndAdjustment = useSharedValue( 2026-10-24T12:44:50.7311290Z ·  ────────────────┬──────────────── 2026-10-24T12:44:50.7311478Z · ╰── `combinedContentInsetEndAdjustment` originates here 2026-10-24T12:44:50.7311611Z 1067 │ Math.max(0, estimatedOverlayHeight - nativeInsetOvercount), 2026-10-24T12:44:50.7311667Z 1068 │ ); 2026-10-24T12:44:50.7311941Z 1069 │ useAnimatedReaction( 2026-10-24T12:44:50.7312051Z 1070 │ () => 2026-10-24T12:44:50.7312145Z 1071 │ contentInsetEndAdjustment.value + 2026-10-24T12:44:50.7312237Z 1072 │ floatingControlCoverage.value + 2026-10-24T12:44:50.7312439Z 1073 │ (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0), 2026-10-24T12:44:50.7312502Z 1074 │ (value) => { 2026-10-24T12:44:50.7312619Z 1075 │ combinedContentInsetEndAdjustment.value = value; 2026-10-24T12:44:50.7312756Z ·  ────────────────┬──────────────── 2026-10-24T12:44:50.7312951Z · ╰── `combinedContentInsetEndAdjustment` cannot be modified 2026-10-24T12:44:50.7313007Z 1076 │ }, 2026-10-24T12:44:50.7313060Z ╰──── 2026-10-24T12:44:50.7313336Z  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-24T12:44:50.7313650Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T12:44:50.7313653Z 2026-10-24T12:44:50.7313822Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T12:44:50.7313985Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:698:76] 2026-10-24T12:44:50.7314169Z 697 │ const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() })); 2026-10-24T12:44:50.7314340Z 698 │ if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() }); 2026-10-24T12:44:50.7314478Z ·  ─────┬──── 2026-10-24T12:44:50.7314674Z · ╰── Cannot call impure function 2026-10-24T12:44:50.7314814Z 699 │ const snoozeGateNow = new Date(snoozeGateClock.now).toISOString(); 2026-10-24T12:44:50.7314868Z ╰──── 2026-10-24T12:44:50.7315158Z  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-24T12:44:50.7315458Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T12:44:50.7315460Z 2026-10-24T12:44:50.7315629Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T12:44:50.7315790Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:719:71] 2026-10-24T12:44:50.7315876Z 718 │ const snoozePresets = useMemo( 2026-10-24T12:44:50.7316059Z 719 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-24T12:44:50.7316195Z ·  ─────┬──── 2026-10-24T12:44:50.7316377Z · ╰── Cannot call impure function 2026-10-24T12:44:50.7316494Z 720 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-24T12:44:50.7316545Z ╰──── 2026-10-24T12:44:50.7316827Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T12:44:50.7317199Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T12:44:50.7317246Z 2026-10-24T12:44:50.7317431Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T12:44:50.7317587Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:720:6] 2026-10-24T12:44:50.7317764Z 719 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-24T12:44:50.7317879Z 720 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-24T12:44:50.7317975Z ·  ────────────┬─────────── 2026-10-24T12:44:50.7318154Z · ╰── Unnecessary dependency `props.snoozePresetMinute` 2026-10-24T12:44:50.7318209Z 721 │ ); 2026-10-24T12:44:50.7318262Z ╰──── 2026-10-24T12:44:50.7318588Z  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-24T12:44:50.7318912Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.7318914Z 2026-10-24T12:44:50.7319097Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T12:44:50.7319251Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:766:7] 2026-10-24T12:44:50.7319321Z 765 │ thread.pinnedAt, 2026-10-24T12:44:50.7319387Z 766 │ variant, 2026-10-24T12:44:50.7319464Z ·  ───┬─── 2026-10-24T12:44:50.7319599Z · ╰── Unnecessary dependency `variant` 2026-10-24T12:44:50.7319656Z 767 │ ], 2026-10-24T12:44:50.7319715Z ╰──── 2026-10-24T12:44:50.7320035Z  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-24T12:44:50.7320348Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.7320350Z 2026-10-24T12:44:50.7320546Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T12:44:50.7320708Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1216:21] 2026-10-24T12:44:50.7320838Z 1215 │ {providerDrivers.slice(0, -1).map((driver, index) => ( 2026-10-24T12:44:50.7320973Z 1216 │ 2026-10-24T12:44:50.7321093Z ·  ────────────────────────── 2026-10-24T12:44:50.7321209Z 1217 │ 2026-10-24T12:44:50.7321263Z ╰──── 2026-10-24T12:44:50.7321410Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T12:44:50.7321416Z 2026-10-24T12:44:50.7321584Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T12:44:50.7321703Z ╭─[apps/web/src/components/Sidebar.tsx:1136:11] 2026-10-24T12:44:50.7321804Z 1135 │ foldSearchQuery(threadSearchQuery), 2026-10-24T12:44:50.7321871Z 1136 │ Date.now(), 2026-10-24T12:44:50.7321952Z ·  ─────┬──── 2026-10-24T12:44:50.7322088Z · ╰── Cannot call impure function 2026-10-24T12:44:50.7322301Z 1137 │ // A list filter, as on mobile: a pick would move rows unexplained. 2026-10-24T12:44:50.7322387Z ╰──── 2026-10-24T12:44:50.7322675Z  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-24T12:44:50.7323002Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T12:44:50.7323005Z 2026-10-24T12:44:50.7323266Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T12:44:50.7323417Z ╭─[apps/mobile/src/features/threads/use-worktree-setup.ts:30:40] 2026-10-24T12:44:50.7323582Z 28 │ const snapshot = resolveWorktreeSetupSnapshot(input.threadId, query.data, live); 2026-10-24T12:44:50.7323651Z 29 │ useEffect(() => { 2026-10-24T12:44:50.7323724Z ·  ────┬──── 2026-10-24T12:44:50.7323855Z · ╰── This is the containing effect 2026-10-24T12:44:50.7323979Z 30 │ if (snapshot && snapshot !== live) setHeld({ key, snapshot }); 2026-10-24T12:44:50.7324085Z ·  ───┬─── 2026-10-24T12:44:50.7324280Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.7324355Z 31 │ }, [key, live, snapshot]); 2026-10-24T12:44:50.7324406Z ╰──── 2026-10-24T12:44:50.7325026Z  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-24T12:44:50.7325355Z  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-24T12:44:50.7325357Z 2026-10-24T12:44:50.7325835Z ⚠ 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-24T12:44:50.7325972Z ╭─[apps/server/src/project/ProjectService.test.ts:94:3] 2026-10-24T12:44:50.7326030Z 93 │ ) { 2026-10-24T12:44:50.7326233Z 94 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T12:44:50.7326417Z 95 │ │ const project = Option.getOrThrow(yield* service.getById(projectId)); 2026-10-24T12:44:50.7326541Z 96 │ │ if (predicate(project)) return project; 2026-10-24T12:44:50.7326644Z 97 │ │ yield* Effect.yieldNow; 2026-10-24T12:44:50.7326767Z 98 │ ╰─▶ } 2026-10-24T12:44:50.7326918Z 99 │ return yield* Effect.die(`Project ${projectId} was not enriched in time.`); 2026-10-24T12:44:50.7326971Z ╰──── 2026-10-24T12:44:50.7326974Z 2026-10-24T12:44:50.7327192Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T12:44:50.7327366Z ╭─[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:249:7] 2026-10-24T12:44:50.7327522Z 248 │ mountedRef.current = false; 2026-10-24T12:44:50.7327641Z 249 │ flow.setBranchQuery(""); 2026-10-24T12:44:50.7327713Z ·  ──┬─ 2026-10-24T12:44:50.7327838Z · ╰── Missing dependency `flow` 2026-10-24T12:44:50.7327896Z 250 │ }; 2026-10-24T12:44:50.7327970Z 251 │ }, [flow.setBranchQuery]); 2026-10-24T12:44:50.7328060Z ·  ─────────┬───────── 2026-10-24T12:44:50.7328267Z · ╰── Overly precise dependency `flow.setBranchQuery`, use `flow` instead 2026-10-24T12:44:50.7328322Z 252 │ 2026-10-24T12:44:50.7328375Z ╰──── 2026-10-24T12:44:50.7328808Z  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-24T12:44:50.7329133Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T12:44:50.7329141Z 2026-10-24T12:44:50.7329611Z ⚠ 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-24T12:44:50.7329772Z ╭─[apps/server/src/project/ProjectEnrichmentService.test.ts:28:3] 2026-10-24T12:44:50.7329829Z 27 │ ) { 2026-10-24T12:44:50.7330030Z 28 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T12:44:50.7330178Z 29 │ │ const available = yield* service.peek(workspaceRoot); 2026-10-24T12:44:50.7330309Z 30 │ │ if (predicate(available)) return available; 2026-10-24T12:44:50.7330413Z 31 │ │ yield* Effect.yieldNow; 2026-10-24T12:44:50.7330537Z 32 │ ╰─▶ } 2026-10-24T12:44:50.7330716Z 33 │ return yield* Effect.die(`Project metadata for ${workspaceRoot} was not resolved in time.`); 2026-10-24T12:44:50.7330770Z ╰──── 2026-10-24T12:44:50.7330773Z 2026-10-24T12:44:50.7330942Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T12:44:50.7331083Z ╭─[apps/server/src/process/externalLauncher.test.ts:186:12] 2026-10-24T12:44:50.7331138Z 185 │ 2026-10-24T12:44:50.7331240Z 186 │ for (const {} of ["darwin", "linux"] as const) { 2026-10-24T12:44:50.7331313Z ·  ── 2026-10-24T12:44:50.7331446Z 187 │ } 2026-10-24T12:44:50.7331535Z ╰──── 2026-10-24T12:44:50.7331770Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T12:44:50.7331773Z 2026-10-24T12:44:50.7331940Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T12:44:50.7332081Z ╭─[apps/server/src/process/externalLauncher.test.ts:189:12] 2026-10-24T12:44:50.7332135Z 188 │ 2026-10-24T12:44:50.7332200Z 189 │ for (const {} of [ 2026-10-24T12:44:50.7332271Z ·  ── 2026-10-24T12:44:50.7332365Z 190 │ { kind: "browser", folderVerb: "none" }, 2026-10-24T12:44:50.7332416Z ╰──── 2026-10-24T12:44:50.7332647Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T12:44:50.7332655Z 2026-10-24T12:44:50.7332861Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T12:44:50.7333002Z ╭─[apps/server/src/process/externalLauncher.test.ts:311:12] 2026-10-24T12:44:50.7333056Z 310 │ 2026-10-24T12:44:50.7333184Z 311 │ for (const {} of ["rejected", "spawn-error", "stalled"] as const) { 2026-10-24T12:44:50.7333255Z ·  ── 2026-10-24T12:44:50.7333310Z 312 │ } 2026-10-24T12:44:50.7333360Z ╰──── 2026-10-24T12:44:50.7333590Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T12:44:50.7333592Z 2026-10-24T12:44:50.7333759Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T12:44:50.7333903Z ╭─[apps/server/src/process/externalLauncher.test.ts:314:12] 2026-10-24T12:44:50.7333962Z 313 │ 2026-10-24T12:44:50.7334025Z 314 │ for (const {} of [ 2026-10-24T12:44:50.7334097Z ·  ── 2026-10-24T12:44:50.7334153Z 315 │ { 2026-10-24T12:44:50.7334203Z ╰──── 2026-10-24T12:44:50.7334433Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T12:44:50.7334435Z 2026-10-24T12:44:50.7334889Z ⚠ 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-24T12:44:50.7335015Z ╭─[apps/server/src/serverSettings.test.ts:1741:32] 2026-10-24T12:44:50.7335194Z 1740 │ const model = createModelSelection(ProviderInstanceId.make("codex"), "gpt-5.5"); 2026-10-24T12:44:50.7335382Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-24T12:44:50.7335498Z ·  ─────────────────── 2026-10-24T12:44:50.7335609Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-24T12:44:50.7335662Z ╰──── 2026-10-24T12:44:50.7335664Z 2026-10-24T12:44:50.7336111Z ⚠ 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-24T12:44:50.7336232Z ╭─[apps/server/src/serverSettings.test.ts:1742:34] 2026-10-24T12:44:50.7336418Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-24T12:44:50.7336596Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-24T12:44:50.7336746Z ·  ─────────────────── 2026-10-24T12:44:50.7336864Z 1743 │ Schema.fromJsonString(Schema.Array(ProjectScript)), 2026-10-24T12:44:50.7336919Z ╰──── 2026-10-24T12:44:50.7336922Z 2026-10-24T12:44:50.7337113Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T12:44:50.7337271Z ╭─[apps/mobile/src/features/threads/ThreadQueueControl.tsx:602:27] 2026-10-24T12:44:50.7337442Z 601 │ const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success)); 2026-10-24T12:44:50.7337522Z 602 │ const gesture = Gesture.Pan() 2026-10-24T12:44:50.7337613Z ·  ─┬─ 2026-10-24T12:44:50.7337764Z · ╰── `Pan` may be a component 2026-10-24T12:44:50.7337844Z 603 │ .enabled(!props.disabled) 2026-10-24T12:44:50.7337898Z ╰──── 2026-10-24T12:44:50.7338179Z  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-24T12:44:50.7338632Z  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-24T12:44:50.7338635Z 2026-10-24T12:44:50.7338831Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T12:44:50.7338998Z ╭─[apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx:818:17] 2026-10-24T12:44:50.7339068Z 817 │
    { 2026-10-24T12:44:50.7342772Z ·  ────┬──── 2026-10-24T12:44:50.7342902Z · ╰── This is the containing effect 2026-10-24T12:44:50.7342993Z 60 │ setMountedModes((current) => { 2026-10-24T12:44:50.7343080Z ·  ───────┬─────── 2026-10-24T12:44:50.7343250Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T12:44:50.7343336Z 61 │ if (current.has(props.mode)) { 2026-10-24T12:44:50.7343391Z ╰──── 2026-10-24T12:44:50.7344005Z  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-24T12:44:50.7344333Z  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-24T12:44:50.7344340Z 2026-10-24T12:44:50.7344426Z Found 0 errors and 367 warnings in 5478 files (5.9s, 8 threads) 2026-10-24T12:44:50.7856804Z Post job cleanup. 2026-10-24T12:44:50.8514231Z Cache hit occurred on the primary key electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309, not saving cache. 2026-10-24T12:44:50.8599217Z Post job cleanup. 2026-10-24T12:44:50.8612845Z ##[start-action display=Cache full pnpm store;id=__c17805a4-df81-4837-925b-a1d05d7aa5c8.__actions_cache] 2026-10-24T12:44:50.8956733Z Post job cleanup. 2026-10-24T12:44:50.9633417Z Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-fa50cf9b003d547cd32552f61b874eb4abe5dace3fdb4b1abd9610da2da24074, not saving cache. 2026-10-24T12:44:50.9673551Z ##[end-action id=__c17805a4-df81-4837-925b-a1d05d7aa5c8.__actions_cache;outcome=success;conclusion=success;duration_ms=106] 2026-10-24T12:44:50.9675370Z ##[start-action display=Cache Vite+;id=__c17805a4-df81-4837-925b-a1d05d7aa5c8.vp_cache] 2026-10-24T12:44:50.9696877Z Post job cleanup. 2026-10-24T12:44:51.0343241Z 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-24T12:44:51.0382898Z ##[end-action id=__c17805a4-df81-4837-925b-a1d05d7aa5c8.vp_cache;outcome=success;conclusion=success;duration_ms=70] 2026-10-24T12:44:51.0420690Z Post job cleanup. 2026-10-24T12:44:51.0859248Z [command]/usr/local/bin/git version 2026-10-24T12:44:51.0891189Z git version 2.55.0 2026-10-24T12:44:51.0910342Z Temporarily overriding HOME='/home/runner/_work/_temp/0c3b734d-d689-4807-a317-88263583a476' before making global git config changes 2026-10-24T12:44:51.0910800Z Adding repository directory to the temporary git global config as a safe directory 2026-10-24T12:44:51.0914054Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-24T12:44:51.0942950Z Removing SSH command configuration 2026-10-24T12:44:51.0946193Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-24T12:44:51.0976627Z [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-24T12:44:51.1114952Z fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules 2026-10-24T12:44:51.1137718Z ##[warning]The process '/usr/local/bin/git' failed with exit code 128 2026-10-24T12:44:51.1182371Z A job completed hook has been configured by the self-hosted runner administrator 2026-10-24T12:44:51.1203248Z ##[group]Run '/job_completed.sh' 2026-10-24T12:44:51.1211803Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T12:44:51.1211998Z env: 2026-10-24T12:44:51.1212113Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 147 2026-10-24T12:44:51.1212263Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 453 2026-10-24T12:44:51.1212405Z BLACKSMITH_CHECK_RUN_ID: 120875719752 2026-10-24T12:44:51.1212588Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-24T12:44:51.1212801Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-24T12:44:51.1212938Z ##[endgroup] 2026-10-24T12:44:51.1298079Z Docker container cache not activated, skipping hash computation. 2026-10-24T12:44:51.1596738Z No active SSH sessions detected. Proceeding with shutdown immediately. 2026-10-24T12:44:51.2131842Z Cleaning up orphan processes