2026-10-23T23:33:35.6481518Z Current runner version: '2.338.1' 2026-10-23T23:33:35.6487686Z Runner name: 'blacksmith-8vcpu-ubuntu-2404-s2xayxp423yoa52x' 2026-10-23T23:33:35.6488668Z Runner group name: 'blacksmith scale sets - blacksmith-8vcpu-ubuntu-2404' 2026-10-23T23:33:35.6489889Z Machine name: 'ip-172-31-73-130' 2026-10-23T23:33:35.6492701Z ##[group]GITHUB_TOKEN Permissions 2026-10-23T23:33:35.6494726Z Contents: read 2026-10-23T23:33:35.6495168Z Metadata: read 2026-10-23T23:33:35.6495615Z ##[endgroup] 2026-10-23T23:33:35.6498180Z Secret source: Actions 2026-10-23T23:33:35.6498856Z Cache mode: write 2026-10-23T23:33:35.6499665Z Prepare workflow directory 2026-10-23T23:33:35.6714060Z Prepare all required actions 2026-10-23T23:33:35.6744713Z Getting action download info 2026-10-23T23:33:35.8071572Z Download action repository 'actions/checkout@v6' (SHA:d23441a48e516b6c34aea4fa41551a30e30af803) 2026-10-23T23:33:35.8613953Z Download action repository 'actions/cache@v6' (SHA:55cc8345863c7cc4c66a329aec7e433d2d1c52a9) 2026-10-23T23:33:35.9957565Z Setting BLACKSMITH_ACTIONS_RESULTS_URL to https://results-receiver.actions.githubusercontent.com/ 2026-10-23T23:33:36.0004884Z Complete job name: Lint 2026-10-23T23:33:36.0476477Z A job started hook has been configured by the self-hosted runner administrator 2026-10-23T23:33:36.0552906Z ##[group]Run '/setup.sh' 2026-10-23T23:33:36.0569437Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T23:33:36.0570297Z env: 2026-10-23T23:33:36.0570710Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 169 2026-10-23T23:33:36.0571222Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 369 2026-10-23T23:33:36.0571737Z BLACKSMITH_CHECK_RUN_ID: 120709689062 2026-10-23T23:33:36.0572217Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-23T23:33:36.0572654Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-23T23:33:36.0573075Z ##[endgroup] 2026-10-23T23:33:36.0876116Z Logging daemon started (blacksmithd for logs) 2026-10-23T23:33:36.1014893Z Results daemon started (blacksmithd for results) 2026-10-23T23:33:36.1209407Z Background adoption and SSH setup started (PID: 3050) 2026-10-23T23:33:36.1210078Z 2026-10-23T23:33:36.1210243Z ---------------------------------------- 2026-10-23T23:33:36.1210981Z View this job: https://app.blacksmith.sh/pingdotgg/runs/40040343373/jobs/120709689062 2026-10-23T23:33:36.1211611Z SSH Access (using your GitHub SSH key): 2026-10-23T23:33:36.1212252Z ssh -p 64006 runner@blacksmith-8vcpu-ubuntu-2404-s2xayxp423yoa52x.vm.blacksmith.sh 2026-10-23T23:33:36.1212733Z 2026-10-23T23:33:36.1212897Z No GitHub SSH key? Add one at: 2026-10-23T23:33:36.1213653Z https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account 2026-10-23T23:33:36.1214347Z 2026-10-23T23:33:36.1214516Z ---------------------------------------- 2026-10-23T23:33:36.1214804Z 2026-10-23T23:33:36.1215030Z VM ID: blacksmith-8vcpu-ubuntu-2404-s2xayxp423yoa52x 2026-10-23T23:33:36.1215591Z Host: production-152.236.41.185-x8664 2026-10-23T23:33:36.1216131Z Host Agent PID: 913650 2026-10-23T23:33:36.1216533Z Host Agent Git SHA: 1637818df 2026-10-23T23:33:36.1217003Z Host CPU Manufacturer: AuthenticAMD 2026-10-23T23:33:36.1217557Z Blacksmith Host Generation: gen 2 2026-10-23T23:33:36.1218049Z Petname: production-easy-elk-ede0d58f 2026-10-23T23:33:36.1218551Z Region: us-east 2026-10-23T23:33:36.1218960Z Rootfs Version: ubuntu24-full-x64-081926 2026-10-23T23:33:36.1223134Z OS Version: Ubuntu 24.04.4 LTS 2026-10-23T23:33:36.1223466Z 2026-10-23T23:33:36.1223668Z Enabling Blacksmith transparent cache 2026-10-23T23:33:36.1603215Z ##[group]Run actions/checkout@v6 2026-10-23T23:33:36.1603637Z with: 2026-10-23T23:33:36.1604003Z sparse-checkout: /* !/.repos/ !/apps/mobile/modules/t3-terminal/Vendor/**/*.a 2026-10-23T23:33:36.1604639Z sparse-checkout-cone-mode: false 2026-10-23T23:33:36.1605118Z repository: pingdotgg/t3code 2026-10-23T23:33:36.1608386Z token: *** 2026-10-23T23:33:36.1608727Z ssh-strict: true 2026-10-23T23:33:36.1609063Z ssh-user: git 2026-10-23T23:33:36.1609409Z persist-credentials: true 2026-10-23T23:33:36.1610222Z clean: true 2026-10-23T23:33:36.1610446Z fetch-depth: 1 2026-10-23T23:33:36.1610669Z fetch-tags: false 2026-10-23T23:33:36.1610899Z show-progress: true 2026-10-23T23:33:36.1611132Z lfs: false 2026-10-23T23:33:36.1611502Z submodules: false 2026-10-23T23:33:36.1611739Z set-safe-directory: true 2026-10-23T23:33:36.1612000Z allow-unsafe-pr-checkout: false 2026-10-23T23:33:36.1612264Z env: 2026-10-23T23:33:36.1612522Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 169 2026-10-23T23:33:36.1612811Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 369 2026-10-23T23:33:36.1613099Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T23:33:36.1613387Z ##[endgroup] 2026-10-23T23:33:36.3002905Z Syncing repository: pingdotgg/t3code 2026-10-23T23:33:36.3004138Z ##[group]Getting Git version info 2026-10-23T23:33:36.3004557Z Working directory is '/home/runner/_work/t3code/t3code' 2026-10-23T23:33:36.3005154Z [command]/usr/local/bin/git version 2026-10-23T23:33:36.3112066Z git version 2.55.0 2026-10-23T23:33:36.3125116Z ##[endgroup] 2026-10-23T23:33:36.3133901Z Temporarily overriding HOME='/home/runner/_work/_temp/1b0412c6-8a24-4afe-9c95-f149b8cc5d41' before making global git config changes 2026-10-23T23:33:36.3134945Z Adding repository directory to the temporary git global config as a safe directory 2026-10-23T23:33:36.3137807Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-23T23:33:36.3175327Z Deleting the contents of '/home/runner/_work/t3code/t3code' 2026-10-23T23:33:36.3178098Z ##[group]Determining repository object format 2026-10-23T23:33:36.3178955Z ##[endgroup] 2026-10-23T23:33:36.3179534Z ##[group]Initializing the repository 2026-10-23T23:33:36.3182827Z [command]/usr/local/bin/git init /home/runner/_work/t3code/t3code 2026-10-23T23:33:36.3235081Z hint: Using 'master' as the name for the initial branch. This default branch name 2026-10-23T23:33:36.3235939Z hint: will change to "main" in Git 3.0. To configure the initial branch name 2026-10-23T23:33:36.3236757Z hint: to use in all of your new repositories, which will suppress this warning, 2026-10-23T23:33:36.3237326Z hint: call: 2026-10-23T23:33:36.3237683Z hint: 2026-10-23T23:33:36.3238121Z hint: git config --global init.defaultBranch 2026-10-23T23:33:36.3238615Z hint: 2026-10-23T23:33:36.3239075Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and 2026-10-23T23:33:36.3239890Z hint: 'development'. The just-created branch can be renamed via this command: 2026-10-23T23:33:36.3240493Z hint: 2026-10-23T23:33:36.3240833Z hint: git branch -m 2026-10-23T23:33:36.3241211Z hint: 2026-10-23T23:33:36.3241723Z hint: Disable this message with "git config set advice.defaultBranchName false" 2026-10-23T23:33:36.3242527Z Initialized empty Git repository in /home/runner/_work/t3code/t3code/.git/ 2026-10-23T23:33:36.3243960Z [command]/usr/local/bin/git remote add origin https://github.com/pingdotgg/t3code 2026-10-23T23:33:36.3283996Z ##[endgroup] 2026-10-23T23:33:36.3284676Z ##[group]Disabling automatic garbage collection 2026-10-23T23:33:36.3286571Z [command]/usr/local/bin/git config --local gc.auto 0 2026-10-23T23:33:36.3321549Z ##[endgroup] 2026-10-23T23:33:36.3322141Z ##[group]Setting up auth 2026-10-23T23:33:36.3322602Z Removing SSH command configuration 2026-10-23T23:33:36.3326387Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-23T23:33:36.3362370Z [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-23T23:33:36.3547038Z Removing HTTP extra header 2026-10-23T23:33:36.3551648Z [command]/usr/local/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader 2026-10-23T23:33:36.3588274Z [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-23T23:33:36.3730040Z Removing includeIf entries pointing to credentials config files 2026-10-23T23:33:36.3730891Z [command]/usr/local/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: 2026-10-23T23:33:36.3768937Z [command]/usr/local/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url 2026-10-23T23:33:36.3924394Z [command]/usr/local/bin/git config --file /home/runner/_work/_temp/git-credentials-32cd5470-9af7-44e6-bc47-01c6e542eed5.config http.https://github.com/.extraheader AUTHORIZATION: basic *** 2026-10-23T23:33:36.4006481Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git.path /home/runner/_work/_temp/git-credentials-32cd5470-9af7-44e6-bc47-01c6e542eed5.config 2026-10-23T23:33:36.4048033Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git/worktrees/*.path /home/runner/_work/_temp/git-credentials-32cd5470-9af7-44e6-bc47-01c6e542eed5.config 2026-10-23T23:33:36.4081649Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-32cd5470-9af7-44e6-bc47-01c6e542eed5.config 2026-10-23T23:33:36.4112429Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-32cd5470-9af7-44e6-bc47-01c6e542eed5.config 2026-10-23T23:33:36.4139283Z ##[endgroup] 2026-10-23T23:33:36.4140151Z ##[group]Fetching the repository 2026-10-23T23:33:36.4145635Z [command]/usr/local/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --filter=blob:none --depth=1 origin +973df5fd4c149b890183b458ee3baf7e8ebc5fd8:refs/remotes/pull/24267/merge 2026-10-23T23:33:36.7469144Z From https://github.com/pingdotgg/t3code 2026-10-23T23:33:36.7470157Z * [new ref] 973df5fd4c149b890183b458ee3baf7e8ebc5fd8 -> pull/24267/merge 2026-10-23T23:33:36.7498811Z ##[endgroup] 2026-10-23T23:33:36.7499619Z ##[group]Determining the checkout info 2026-10-23T23:33:36.7500517Z ##[endgroup] 2026-10-23T23:33:36.7501106Z ##[group]Setting up sparse checkout 2026-10-23T23:33:36.7503423Z [command]/usr/local/bin/git config core.sparseCheckout true 2026-10-23T23:33:36.7531960Z [command]/usr/local/bin/git rev-parse --git-path info/sparse-checkout 2026-10-23T23:33:36.7552425Z .git/info/sparse-checkout 2026-10-23T23:33:36.7556951Z ##[endgroup] 2026-10-23T23:33:36.7557642Z ##[group]Checking out the ref 2026-10-23T23:33:36.7560158Z [command]/usr/local/bin/git checkout --progress --force refs/remotes/pull/24267/merge 2026-10-23T23:33:44.2347794Z Updating files: 0% (1/6311) 2026-10-23T23:33:44.2381309Z Updating files: 1% (64/6311) 2026-10-23T23:33:44.2400553Z Updating files: 2% (127/6311) 2026-10-23T23:33:44.2426189Z Updating files: 3% (190/6311) 2026-10-23T23:33:44.2451197Z Updating files: 4% (253/6311) 2026-10-23T23:33:44.2487641Z Updating files: 5% (316/6311) 2026-10-23T23:33:44.2513038Z Updating files: 6% (379/6311) 2026-10-23T23:33:44.2581999Z Updating files: 7% (442/6311) 2026-10-23T23:33:44.2619698Z Updating files: 8% (505/6311) 2026-10-23T23:33:44.2647732Z Updating files: 9% (568/6311) 2026-10-23T23:33:44.3006519Z Updating files: 10% (632/6311) 2026-10-23T23:33:44.3024403Z Updating files: 11% (695/6311) 2026-10-23T23:33:44.3037454Z Updating files: 12% (758/6311) 2026-10-23T23:33:44.3054862Z Updating files: 13% (821/6311) 2026-10-23T23:33:44.3075034Z Updating files: 14% (884/6311) 2026-10-23T23:33:44.3096077Z Updating files: 15% (947/6311) 2026-10-23T23:33:44.3119809Z Updating files: 16% (1010/6311) 2026-10-23T23:33:44.3138275Z Updating files: 17% (1073/6311) 2026-10-23T23:33:44.3162094Z Updating files: 18% (1136/6311) 2026-10-23T23:33:44.3180643Z Updating files: 19% (1200/6311) 2026-10-23T23:33:44.3208141Z Updating files: 20% (1263/6311) 2026-10-23T23:33:44.3231073Z Updating files: 21% (1326/6311) 2026-10-23T23:33:44.3253604Z Updating files: 22% (1389/6311) 2026-10-23T23:33:44.3270483Z Updating files: 23% (1452/6311) 2026-10-23T23:33:44.3286513Z Updating files: 24% (1515/6311) 2026-10-23T23:33:44.3307992Z Updating files: 25% (1578/6311) 2026-10-23T23:33:44.3324342Z Updating files: 26% (1641/6311) 2026-10-23T23:33:44.3340704Z Updating files: 27% (1704/6311) 2026-10-23T23:33:44.3365195Z Updating files: 28% (1768/6311) 2026-10-23T23:33:44.3406296Z Updating files: 29% (1831/6311) 2026-10-23T23:33:44.3430361Z Updating files: 30% (1894/6311) 2026-10-23T23:33:44.3459681Z Updating files: 31% (1957/6311) 2026-10-23T23:33:44.3497213Z Updating files: 32% (2020/6311) 2026-10-23T23:33:44.3534003Z Updating files: 33% (2083/6311) 2026-10-23T23:33:44.3620169Z Updating files: 34% (2146/6311) 2026-10-23T23:33:44.3690038Z Updating files: 35% (2209/6311) 2026-10-23T23:33:44.3737259Z Updating files: 36% (2272/6311) 2026-10-23T23:33:44.3777643Z Updating files: 37% (2336/6311) 2026-10-23T23:33:44.3832885Z Updating files: 38% (2399/6311) 2026-10-23T23:33:44.3865787Z Updating files: 39% (2462/6311) 2026-10-23T23:33:44.3906014Z Updating files: 40% (2525/6311) 2026-10-23T23:33:44.3947277Z Updating files: 41% (2588/6311) 2026-10-23T23:33:44.3968618Z Updating files: 42% (2651/6311) 2026-10-23T23:33:44.3982361Z Updating files: 43% (2714/6311) 2026-10-23T23:33:44.4009773Z Updating files: 44% (2777/6311) 2026-10-23T23:33:44.4047386Z Updating files: 45% (2840/6311) 2026-10-23T23:33:44.4080790Z Updating files: 46% (2904/6311) 2026-10-23T23:33:44.4114919Z Updating files: 47% (2967/6311) 2026-10-23T23:33:44.4153300Z Updating files: 48% (3030/6311) 2026-10-23T23:33:44.4191972Z Updating files: 49% (3093/6311) 2026-10-23T23:33:44.4241032Z Updating files: 50% (3156/6311) 2026-10-23T23:33:44.4260626Z Updating files: 51% (3219/6311) 2026-10-23T23:33:44.4304977Z Updating files: 52% (3282/6311) 2026-10-23T23:33:44.4339222Z Updating files: 53% (3345/6311) 2026-10-23T23:33:44.4366496Z Updating files: 54% (3408/6311) 2026-10-23T23:33:44.4397384Z Updating files: 55% (3472/6311) 2026-10-23T23:33:44.4420509Z Updating files: 56% (3535/6311) 2026-10-23T23:33:44.4443535Z Updating files: 57% (3598/6311) 2026-10-23T23:33:44.4467398Z Updating files: 58% (3661/6311) 2026-10-23T23:33:44.4939622Z Updating files: 59% (3724/6311) 2026-10-23T23:33:44.4956620Z Updating files: 60% (3787/6311) 2026-10-23T23:33:44.4977866Z Updating files: 61% (3850/6311) 2026-10-23T23:33:44.4999598Z Updating files: 62% (3913/6311) 2026-10-23T23:33:44.5027938Z Updating files: 63% (3976/6311) 2026-10-23T23:33:44.5062708Z Updating files: 64% (4040/6311) 2026-10-23T23:33:44.5090781Z Updating files: 65% (4103/6311) 2026-10-23T23:33:44.5111070Z Updating files: 66% (4166/6311) 2026-10-23T23:33:44.5144280Z Updating files: 67% (4229/6311) 2026-10-23T23:33:44.5160289Z Updating files: 68% (4292/6311) 2026-10-23T23:33:44.5184872Z Updating files: 69% (4355/6311) 2026-10-23T23:33:44.5201889Z Updating files: 70% (4418/6311) 2026-10-23T23:33:44.5222533Z Updating files: 71% (4481/6311) 2026-10-23T23:33:44.5244815Z Updating files: 72% (4544/6311) 2026-10-23T23:33:44.5278381Z Updating files: 73% (4608/6311) 2026-10-23T23:33:44.5603823Z Updating files: 74% (4671/6311) 2026-10-23T23:33:44.5835357Z Updating files: 75% (4734/6311) 2026-10-23T23:33:44.5864222Z Updating files: 76% (4797/6311) 2026-10-23T23:33:44.5888792Z Updating files: 77% (4860/6311) 2026-10-23T23:33:44.5921672Z Updating files: 78% (4923/6311) 2026-10-23T23:33:44.5945045Z Updating files: 79% (4986/6311) 2026-10-23T23:33:44.5967047Z Updating files: 80% (5049/6311) 2026-10-23T23:33:44.5991705Z Updating files: 81% (5112/6311) 2026-10-23T23:33:44.6014280Z Updating files: 82% (5176/6311) 2026-10-23T23:33:44.6037594Z Updating files: 83% (5239/6311) 2026-10-23T23:33:44.6064646Z Updating files: 84% (5302/6311) 2026-10-23T23:33:44.6088761Z Updating files: 85% (5365/6311) 2026-10-23T23:33:44.6118081Z Updating files: 86% (5428/6311) 2026-10-23T23:33:44.6207222Z Updating files: 87% (5491/6311) 2026-10-23T23:33:44.6246805Z Updating files: 88% (5554/6311) 2026-10-23T23:33:44.6267160Z Updating files: 89% (5617/6311) 2026-10-23T23:33:44.6300268Z Updating files: 90% (5680/6311) 2026-10-23T23:33:44.6343806Z Updating files: 91% (5744/6311) 2026-10-23T23:33:44.6361961Z Updating files: 92% (5807/6311) 2026-10-23T23:33:44.6382545Z Updating files: 93% (5870/6311) 2026-10-23T23:33:44.6408915Z Updating files: 94% (5933/6311) 2026-10-23T23:33:44.6439941Z Updating files: 95% (5996/6311) 2026-10-23T23:33:44.6511629Z Updating files: 96% (6059/6311) 2026-10-23T23:33:44.6544289Z Updating files: 97% (6122/6311) 2026-10-23T23:33:44.6604132Z Updating files: 98% (6185/6311) 2026-10-23T23:33:44.6628555Z Updating files: 99% (6248/6311) 2026-10-23T23:33:44.6629194Z Updating files: 100% (6311/6311) 2026-10-23T23:33:44.6629578Z Updating files: 100% (6311/6311), done. 2026-10-23T23:33:44.6823073Z Note: switching to 'refs/remotes/pull/24267/merge'. 2026-10-23T23:33:44.6823571Z 2026-10-23T23:33:44.6823829Z You are in 'detached HEAD' state. You can look around, make experimental 2026-10-23T23:33:44.6824410Z changes and commit them, and you can discard any commits you make in this 2026-10-23T23:33:44.6824870Z state without impacting any branches by switching back to a branch. 2026-10-23T23:33:44.6825116Z 2026-10-23T23:33:44.6825382Z If you want to create a new branch to retain commits you create, you may 2026-10-23T23:33:44.6825853Z do so (now or later) by using -c with the switch command. Example: 2026-10-23T23:33:44.6826109Z 2026-10-23T23:33:44.6826224Z git switch -c 2026-10-23T23:33:44.6826406Z 2026-10-23T23:33:44.6826510Z Or undo this operation with: 2026-10-23T23:33:44.6826665Z 2026-10-23T23:33:44.6826750Z git switch - 2026-10-23T23:33:44.6826965Z 2026-10-23T23:33:44.6827183Z Turn off this advice by setting config variable advice.detachedHead to false 2026-10-23T23:33:44.6827478Z 2026-10-23T23:33:44.6827819Z HEAD is now at 973df5f Merge 31f6861e719ff2e2e369213231d3be9440cef11d into 22dc1dabc6d3b1616d0fa5017268c086a77887bc 2026-10-23T23:33:44.6836982Z ##[endgroup] 2026-10-23T23:33:44.6886172Z [command]/usr/local/bin/git log -1 --format=%H 2026-10-23T23:33:44.6916369Z 973df5fd4c149b890183b458ee3baf7e8ebc5fd8 2026-10-23T23:33:44.7035875Z ##[group]Run files="$(git ls-files .github/pr-assets)" 2026-10-23T23:33:44.7036273Z files="$(git ls-files .github/pr-assets)" 2026-10-23T23:33:44.7036580Z if test -n "$files"; then 2026-10-23T23:33:44.7036937Z  printf 'PR evidence must be uploaded to GitHub, not committed:\n%s\n' "$files" >&2 2026-10-23T23:33:44.7037295Z  exit 1 2026-10-23T23:33:44.7037484Z fi 2026-10-23T23:33:44.7052852Z shell: /usr/bin/bash -e {0} 2026-10-23T23:33:44.7053110Z env: 2026-10-23T23:33:44.7053305Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 169 2026-10-23T23:33:44.7053577Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 369 2026-10-23T23:33:44.7053834Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T23:33:44.7054062Z ##[endgroup] 2026-10-23T23:33:44.7317201Z Prepare all required actions 2026-10-23T23:33:44.7317739Z Getting action download info 2026-10-23T23:33:44.8277757Z Download action repository 'voidzero-dev/setup-vp@v1' (SHA:250f29ce396baf5e8f24498e17c0dfdebabc26eb) 2026-10-23T23:33:44.9324354Z ##[group]Run ./.github/actions/setup-ci-deps 2026-10-23T23:33:44.9324662Z env: 2026-10-23T23:33:44.9324865Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 169 2026-10-23T23:33:44.9325136Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 369 2026-10-23T23:33:44.9325399Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T23:33:44.9325628Z ##[endgroup] 2026-10-23T23:33:44.9473378Z ##[start-action display=Resolve Vite+ version;id=__self.vp] 2026-10-23T23:33:44.9497729Z ##[group]Run echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-23T23:33:44.9498334Z echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-23T23:33:44.9498683Z echo "node=$(jq -r '.engines.node' package.json)" >> "$GITHUB_OUTPUT" 2026-10-23T23:33:44.9498953Z echo "pnpm=$(jq -r '.packageManager' package.json)" >> "$GITHUB_OUTPUT" 2026-10-23T23:33:44.9509716Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T23:33:44.9509920Z env: 2026-10-23T23:33:44.9510051Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 169 2026-10-23T23:33:44.9510216Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 369 2026-10-23T23:33:44.9510374Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T23:33:44.9510526Z ##[endgroup] 2026-10-23T23:33:44.9603231Z ##[end-action id=__self.vp;outcome=success;conclusion=success;duration_ms=12] 2026-10-23T23:33:44.9605476Z ##[start-action display=Cache Vite+;id=__self.vp_cache] 2026-10-23T23:33:44.9672684Z ##[group]Run actions/cache@v6 2026-10-23T23:33:44.9672928Z with: 2026-10-23T23:33:44.9673092Z path: ~/.vite-plus 2026-10-23T23:33:44.9673340Z key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-23T23:33:44.9673701Z enableCrossOsArchive: false 2026-10-23T23:33:44.9673889Z fail-on-cache-miss: false 2026-10-23T23:33:44.9674032Z lookup-only: false 2026-10-23T23:33:44.9674156Z save-always: false 2026-10-23T23:33:44.9674284Z env: 2026-10-23T23:33:44.9674418Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 169 2026-10-23T23:33:44.9674684Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 369 2026-10-23T23:33:44.9674940Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T23:33:44.9675164Z ##[endgroup] 2026-10-23T23:33:45.1975661Z Cache hit for: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-23T23:33:45.6520549Z Received 170349591 of 170349591 (100.0%), 381.4 MBs/sec 2026-10-23T23:33:45.6521067Z Cache Size: ~162 MB (170349591 B) 2026-10-23T23:33:45.6549945Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/325a7aff-6b37-4a57-b414-7345d7caac82/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-23T23:33:46.5332183Z Cache restored successfully 2026-10-23T23:33:46.5532503Z Cache restored from key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-23T23:33:46.5629183Z ##[end-action id=__self.vp_cache;outcome=success;conclusion=success;duration_ms=1602] 2026-10-23T23:33:46.5631995Z ##[start-action display=Use cached Vite+;id=__self.__run] 2026-10-23T23:33:46.5657201Z ##[group]Run echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-23T23:33:46.5657459Z echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-23T23:33:46.5657651Z "$HOME/.vite-plus/bin/vp" env use "26.12.1" 2026-10-23T23:33:46.5668500Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T23:33:46.5668693Z env: 2026-10-23T23:33:46.5668823Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 169 2026-10-23T23:33:46.5668985Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 369 2026-10-23T23:33:46.5669145Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T23:33:46.5669314Z ##[endgroup] 2026-10-23T23:33:46.5720028Z Using Node.js v26.12.1 (resolved from 26.12.1) 2026-10-23T23:33:46.5731894Z ##[end-action id=__self.__run;outcome=success;conclusion=success;duration_ms=9] 2026-10-23T23:33:46.5734288Z ##[start-action display=Setup Vite+;id=__self.__voidzero-dev_setup-vp] 2026-10-23T23:33:46.5740157Z ##[end-action id=__self.__voidzero-dev_setup-vp;outcome=skipped;conclusion=skipped;duration_ms=0] 2026-10-23T23:33:46.5741977Z ##[start-action display=Resolve pnpm store path;id=__self.pnpm_store] 2026-10-23T23:33:46.5776040Z ##[group]Run store_path="$(vp pm cache dir)" 2026-10-23T23:33:46.5776326Z store_path="$(vp pm cache dir)" 2026-10-23T23:33:46.5776504Z echo "path=$store_path" >> "$GITHUB_OUTPUT" 2026-10-23T23:33:46.5790857Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T23:33:46.5791067Z env: 2026-10-23T23:33:46.5791197Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 169 2026-10-23T23:33:46.5791354Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 369 2026-10-23T23:33:46.5791808Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T23:33:46.5791960Z ##[endgroup] 2026-10-23T23:33:46.5982848Z ##[end-action id=__self.pnpm_store;outcome=success;conclusion=success;duration_ms=24] 2026-10-23T23:33:46.5985014Z ##[start-action display=Cache full pnpm store;id=__self.__actions_cache] 2026-10-23T23:33:46.6502245Z ##[group]Run actions/cache@v6 2026-10-23T23:33:46.6502490Z with: 2026-10-23T23:33:46.6502708Z path: /home/runner/.local/share/pnpm/store/v11 2026-10-23T23:33:46.6503168Z key: pnpm-full-v1-Linux-X64-3cb0b4d7cff93dc8fe33f2ea73cac71ca25a36270fcb648b9b4a9320151012ef 2026-10-23T23:33:46.6503471Z restore-keys: pnpm-full-v1-Linux-X64- 2026-10-23T23:33:46.6503637Z enableCrossOsArchive: false 2026-10-23T23:33:46.6503785Z fail-on-cache-miss: false 2026-10-23T23:33:46.6503918Z lookup-only: false 2026-10-23T23:33:46.6504040Z save-always: false 2026-10-23T23:33:46.6504161Z env: 2026-10-23T23:33:46.6504282Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 169 2026-10-23T23:33:46.6504467Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 369 2026-10-23T23:33:46.6504621Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T23:33:46.6504766Z ##[endgroup] 2026-10-23T23:33:46.8697088Z Cache hit for: pnpm-full-v1-Linux-X64-3cb0b4d7cff93dc8fe33f2ea73cac71ca25a36270fcb648b9b4a9320151012ef 2026-10-23T23:33:47.8990456Z Received 633339904 of 995020926 (63.7%), 601.6 MBs/sec 2026-10-23T23:33:48.5478488Z Received 995020926 of 995020926 (100.0%), 574.1 MBs/sec 2026-10-23T23:33:48.5479651Z Cache Size: ~949 MB (995020926 B) 2026-10-23T23:33:48.5523961Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/d5cb5591-7b0d-4a39-b353-aabdcab84adf/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-23T23:33:54.7069608Z Cache restored successfully 2026-10-23T23:33:54.7766596Z Cache restored from key: pnpm-full-v1-Linux-X64-3cb0b4d7cff93dc8fe33f2ea73cac71ca25a36270fcb648b9b4a9320151012ef 2026-10-23T23:33:54.7850634Z ##[end-action id=__self.__actions_cache;outcome=success;conclusion=success;duration_ms=8186] 2026-10-23T23:33:54.7853095Z ##[start-action display=Install dependencies;id=__self.__run_2] 2026-10-23T23:33:54.7868415Z ##[group]Run vp install 2026-10-23T23:33:54.7868592Z vp install 2026-10-23T23:33:54.7878997Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T23:33:54.7879186Z env: 2026-10-23T23:33:54.7879318Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 169 2026-10-23T23:33:54.7879484Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 369 2026-10-23T23:33:54.7879647Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T23:33:54.7879798Z ##[endgroup] 2026-10-23T23:33:54.8264054Z Scope: all 33 workspace projects 2026-10-23T23:33:54.9628350Z ? Verifying lockfile against supply-chain policies (2088 entries)... 2026-10-23T23:33:55.2969819Z Packages are hard linked from the content-addressable store to the virtual store. 2026-10-23T23:33:55.2970184Z Content-addressable store is at: /home/runner/.local/share/pnpm/store/v11 2026-10-23T23:33:55.2970427Z Virtual store is at: node_modules/.pnpm 2026-10-23T23:33:58.0612077Z ✓ Lockfile passes supply-chain policies (2088 entries in 3.1s) 2026-10-23T23:33:58.0612484Z Lockfile is up to date, resolution step is skipped 2026-10-23T23:33:58.0976169Z Packages: +1721 2026-10-23T23:33:58.0976516Z ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2026-10-23T23:33:58.1491278Z Progress: resolved 1721, reused 1718, downloaded 0, added 1721, done 2026-10-23T23:33:59.4875640Z . prepare$ vp config --no-agent 2026-10-23T23:33:59.6645596Z . prepare: Done 2026-10-23T23:33:59.6669297Z 2026-10-23T23:33:59.6669566Z devDependencies: 2026-10-23T23:33:59.6669724Z + @coderabbitai/config 1.1.0 2026-10-23T23:33:59.6669884Z + @shadcn/lint 0.1.5 2026-10-23T23:33:59.6670053Z + @types/node 24.12.4 2026-10-23T23:33:59.6670187Z + knip 6.34.0 2026-10-23T23:33:59.6670337Z + typescript <- @tsc-rs/typescript 0.8.0 2026-10-23T23:33:59.6670504Z + vite-plus 1.3.0 2026-10-23T23:33:59.6670578Z 2026-10-23T23:33:59.6713720Z Done in 4.9s using pnpm v12.14.0 2026-10-23T23:33:59.6915661Z ##[end-action id=__self.__run_2;outcome=success;conclusion=success;duration_ms=4906] 2026-10-23T23:33:59.7649309Z ##[group]Run actions/cache@v6 2026-10-23T23:33:59.7649896Z with: 2026-10-23T23:33:59.7650090Z path: ~/.cache/electron 2026-10-23T23:33:59.7650459Z key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-23T23:33:59.7650840Z enableCrossOsArchive: false 2026-10-23T23:33:59.7651055Z fail-on-cache-miss: false 2026-10-23T23:33:59.7651258Z lookup-only: false 2026-10-23T23:33:59.7651448Z save-always: false 2026-10-23T23:33:59.7651632Z env: 2026-10-23T23:33:59.7651817Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 169 2026-10-23T23:33:59.7652082Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 369 2026-10-23T23:33:59.7652343Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T23:33:59.7652575Z ##[endgroup] 2026-10-23T23:34:00.0002366Z Cache hit for: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-23T23:34:00.2269292Z Received 122906203 of 122906203 (100.0%), 589.0 MBs/sec 2026-10-23T23:34:00.2269791Z Cache Size: ~117 MB (122906203 B) 2026-10-23T23:34:00.2287031Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/ee59a2bb-180f-4143-a045-f641f50f203f/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-23T23:34:00.2887787Z Cache restored successfully 2026-10-23T23:34:00.3066247Z Cache restored from key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-23T23:34:00.3224425Z ##[group]Run vp run --filter @t3tools/desktop ensure:electron 2026-10-23T23:34:00.3224690Z vp run --filter @t3tools/desktop ensure:electron 2026-10-23T23:34:00.3234803Z shell: /usr/bin/bash -e {0} 2026-10-23T23:34:00.3234955Z env: 2026-10-23T23:34:00.3235074Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 169 2026-10-23T23:34:00.3235300Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 369 2026-10-23T23:34:00.3235450Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T23:34:00.3235591Z ##[endgroup] 2026-10-23T23:34:00.5310992Z ~/apps/desktop$ node scripts/ensure-electron-runtime.mjs ⊘ cache disabled 2026-10-23T23:34:01.2318664Z /home/runner/_work/t3code/t3code/node_modules/.pnpm/electron@44.9.3_supports-color@8.1.1/node_modules/electron/dist/electron 2026-10-23T23:34:01.2339619Z 2026-10-23T23:34:01.2442188Z ##[group]Run vp run knip:check 2026-10-23T23:34:01.2442386Z vp run knip:check 2026-10-23T23:34:01.2452990Z shell: /usr/bin/bash -e {0} 2026-10-23T23:34:01.2453132Z env: 2026-10-23T23:34:01.2453254Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 169 2026-10-23T23:34:01.2453407Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 369 2026-10-23T23:34:01.2453555Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T23:34:01.2453695Z ##[endgroup] 2026-10-23T23:34:01.4303503Z $ knip --include files,dependencies --no-config-hints ⊘ cache disabled 2026-10-23T23:34:06.4742855Z 2026-10-23T23:34:06.4747560Z $ knip --workspace apps/server --workspace apps/desktop --workspace apps/web --workspace packages/client-runtime --workspace packages/contracts --workspace packages/effect-acp --workspace packages/effect-codex-app-server --workspace packages/shared --workspace packages/ssh --workspace packages/tailscale --workspace packages/provider-core --workspace packages/provider-acp --workspace packages/provider-acp-registry --workspace packages/provider-testing --workspace packages/provider-pi --workspace packages/provider-muse --workspace packages/provider-opencode --workspace packages/provider-cursor --workspace packages/provider-grok --workspace packages/source-control-core --workspace packages/source-control-azure-devops --workspace packages/source-control-bitbucket --workspace packages/source-control-forgejo --workspace packages/source-control-gitcafe --workspace packages/source-control-github --workspace packages/source-control-gitlab --workspace packages/source-control-testing --exports --preprocessor ./scripts/knip-schemas.ts --no-config-hints ⊘ cache disabled 2026-10-23T23:34:16.8326394Z 2026-10-23T23:34:16.8327877Z --- 2026-10-23T23:34:16.8328219Z vp run: 2/2 successful. (Run `vp run --last-details` for full details) 2026-10-23T23:34:16.8433455Z ##[group]Run vp run --filter @t3tools/source-control-github generate --check 2026-10-23T23:34:16.8433770Z vp run --filter @t3tools/source-control-github generate --check 2026-10-23T23:34:16.8444051Z shell: /usr/bin/bash -e {0} 2026-10-23T23:34:16.8444255Z env: 2026-10-23T23:34:16.8444376Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 169 2026-10-23T23:34:16.8444584Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 369 2026-10-23T23:34:16.8444733Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T23:34:16.8444872Z ##[endgroup] 2026-10-23T23:34:17.0244348Z ~/packages/source-control-github$ graphqlgen --check ⊘ cache disabled 2026-10-23T23:34:17.2631824Z 2026-10-23T23:34:17.2752285Z ##[group]Run vp run --filter t3 generate --check 2026-10-23T23:34:17.2752710Z vp run --filter t3 generate --check 2026-10-23T23:34:17.2767649Z shell: /usr/bin/bash -e {0} 2026-10-23T23:34:17.2767872Z env: 2026-10-23T23:34:17.2768075Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 169 2026-10-23T23:34:17.2768325Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 369 2026-10-23T23:34:17.2768571Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T23:34:17.2768799Z ##[endgroup] 2026-10-23T23:34:17.4672874Z ~/apps/server$ graphqlgen --check ⊘ cache disabled 2026-10-23T23:34:17.6531577Z 2026-10-23T23:34:17.6647856Z ##[group]Run vp check 2026-10-23T23:34:17.6648031Z vp check 2026-10-23T23:34:17.6658679Z shell: /usr/bin/bash -e {0} 2026-10-23T23:34:17.6658821Z env: 2026-10-23T23:34:17.6658968Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 169 2026-10-23T23:34:17.6659118Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 369 2026-10-23T23:34:17.6659268Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T23:34:17.6659408Z ##[endgroup] 2026-10-23T23:34:18.3475552Z pass: All 5668 files are correctly formatted (496ms, 8 threads) 2026-10-23T23:34:25.8290119Z warn: Lint warnings found 2026-10-23T23:34:25.8291972Z ⚠ 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-23T23:34:25.8292916Z ╭─[packages/client-runtime/src/connection/supervisor.test.ts:135:3] 2026-10-23T23:34:25.8293365Z 134 │ let lastState = yield* SubscriptionRef.get(state); 2026-10-23T23:34:25.8293881Z 135 │ ╭─▶ for (let iteration = 0; iteration < 100; iteration += 1) { 2026-10-23T23:34:25.8294435Z 136 │ │ lastState = yield* SubscriptionRef.get(state); 2026-10-23T23:34:25.8294794Z 137 │ │ if (predicate(lastState)) { 2026-10-23T23:34:25.8295127Z 138 │ │ return lastState; 2026-10-23T23:34:25.8295405Z 139 │ │ } 2026-10-23T23:34:25.8295689Z 140 │ │ yield* Effect.yieldNow; 2026-10-23T23:34:25.8296274Z 141 │ ╰─▶ } 2026-10-23T23:34:25.8296570Z 142 │ return yield* Effect.die( 2026-10-23T23:34:25.8296782Z ╰──── 2026-10-23T23:34:25.8296872Z 2026-10-23T23:34:25.8297221Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-23T23:34:25.8297791Z ╭─[apps/web/src/components/pullRequest/pullRequestList.logic.ts:265:9] 2026-10-23T23:34:25.8298134Z 264 │ ): boolean { 2026-10-23T23:34:25.8298458Z 265 │ const labels = entry.labels.map((label) => label.name.trim().toLowerCase()); 2026-10-23T23:34:25.8298964Z ·  ───────────────────────────────────────────────────────────────────── 2026-10-23T23:34:25.8299409Z 266 │ const holds = (label: string) => labels.includes(label.trim().toLowerCase()); 2026-10-23T23:34:25.8299709Z ╰──── 2026-10-23T23:34:25.8299901Z  help: Switch to `Set` 2026-10-23T23:34:25.8300038Z 2026-10-23T23:34:25.8300331Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T23:34:25.8300849Z ╭─[apps/web/src/components/pullRequest/PullRequestChecksPopover.tsx:88:15] 2026-10-23T23:34:25.8301189Z 87 │
  • { 2026-10-23T23:34:25.8359780Z 165 │ const record = 2026-10-23T23:34:25.8360042Z 166 │ token.type === "context" 2026-10-23T23:34:25.8360464Z 167 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-23T23:34:25.8360849Z 168 │ : undefined; 2026-10-23T23:34:25.8361166Z 169 │ const presentation = contextChipPresentation( 2026-10-23T23:34:25.8361759Z 170 │ token.type === "context" ? token.kind : token.type, 2026-10-23T23:34:25.8362147Z 171 │ record, 2026-10-23T23:34:25.8362366Z 172 │ ); 2026-10-23T23:34:25.8362614Z 173 │ const icon = contextChipIcon( 2026-10-23T23:34:25.8362897Z 174 │ presentation, 2026-10-23T23:34:25.8363274Z 175 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-23T23:34:25.8363630Z 176 │ ); 2026-10-23T23:34:25.8363838Z 177 │ return { 2026-10-23T23:34:25.8364111Z 178 │ type: token.type, 2026-10-23T23:34:25.8364279Z 179 │ source: token.source, 2026-10-23T23:34:25.8364450Z 180 │ start: token.start, 2026-10-23T23:34:25.8364612Z 181 │ end: token.end, 2026-10-23T23:34:25.8364786Z 182 │ accent: presentation.accent, 2026-10-23T23:34:25.8365017Z 183 │ label: 2026-10-23T23:34:25.8365235Z 184 │ token.type === "skill" 2026-10-23T23:34:25.8365454Z 185 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-23T23:34:25.8365663Z 186 │ : token.type === "context" 2026-10-23T23:34:25.8366154Z 187 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-23T23:34:25.8366632Z 188 │ : basename(token.value), 2026-10-23T23:34:25.8367014Z 189 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-23T23:34:25.8367385Z 190 │ iconUri: contextChipIconUri(icon), 2026-10-23T23:34:25.8367688Z 191 │ tintsIcon: icon.kind === "chip", 2026-10-23T23:34:25.8367943Z 192 │ }; 2026-10-23T23:34:25.8368143Z 193 │ }), 2026-10-23T23:34:25.8368321Z 194 │ ); 2026-10-23T23:34:25.8368586Z 195 │ }, [props.value, props.context, skillLabels]); 2026-10-23T23:34:25.8368986Z ·  ────────────────────┬──────────────────── 2026-10-23T23:34:25.8369503Z · ╰── This dependency list is missing values used by the callback 2026-10-23T23:34:25.8370017Z 196 │ // Every render resolves against the snapshot history, so a render whose 2026-10-23T23:34:25.8370348Z ╰──── 2026-10-23T23:34:25.8370765Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-23T23:34:25.8371612Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.8372116Z 2026-10-23T23:34:25.8372440Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-23T23:34:25.8372974Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:257:5] 2026-10-23T23:34:25.8373486Z 249 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-23T23:34:25.8373873Z 250 │ nativeEventSnapshotsRef.current.push({ 2026-10-23T23:34:25.8374272Z ·  ───────────┬─────────── 2026-10-23T23:34:25.8375184Z · ╰── 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-23T23:34:25.8376186Z 251 │ eventCount: acknowledgedEventCount, 2026-10-23T23:34:25.8376487Z 252 │ value, 2026-10-23T23:34:25.8376729Z 253 │ selection: nextSelection, 2026-10-23T23:34:25.8376979Z 254 │ }); 2026-10-23T23:34:25.8377530Z 255 │ return acknowledgedEventCount; 2026-10-23T23:34:25.8377909Z 256 │ }, 2026-10-23T23:34:25.8378100Z 257 │ [], 2026-10-23T23:34:25.8378316Z ·  ─┬ 2026-10-23T23:34:25.8378748Z · ╰── This dependency list is missing values used by the callback 2026-10-23T23:34:25.8408329Z 258 │ ); 2026-10-23T23:34:25.8408556Z ╰──── 2026-10-23T23:34:25.8409080Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-23T23:34:25.8410120Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.8410725Z 2026-10-23T23:34:25.8411282Z ⚠ unicorn(prefer-add-event-listener): Prefer `addEventListener()` over their `on`-function counterparts. 2026-10-23T23:34:25.8412078Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:12:14] 2026-10-23T23:34:25.8412704Z 11 │ addEventListener(_type: string, listener: (event: { data: string }) => void) { 2026-10-23T23:34:25.8413084Z 12 │ this.onmessage = listener; 2026-10-23T23:34:25.8413381Z ·  ───────── 2026-10-23T23:34:25.8413617Z 13 │ } 2026-10-23T23:34:25.8413802Z ╰──── 2026-10-23T23:34:25.8414505Z  help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on` replaces any previously registered handler. 2026-10-23T23:34:25.8414989Z 2026-10-23T23:34:25.8415319Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-23T23:34:25.8415841Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:16:9] 2026-10-23T23:34:25.8416343Z 15 │ constructor() { 2026-10-23T23:34:25.8416570Z 16 │ source = this; 2026-10-23T23:34:25.8416790Z ·  ────── 2026-10-23T23:34:25.8416993Z 17 │ } 2026-10-23T23:34:25.8417159Z ╰──── 2026-10-23T23:34:25.8417624Z  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-23T23:34:25.8417994Z 2026-10-23T23:34:25.8418522Z ⚠ 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-23T23:34:25.8419154Z ╭─[packages/contracts/src/auth.test.ts:17:12] 2026-10-23T23:34:25.8419574Z 16 │ it("decodes legacy review credentials without offering them in new grants", () => { 2026-10-23T23:34:25.8420056Z 17 │ expect(Schema.decodeUnknownSync(AuthEnvironmentScopes)(["review:write"])).toEqual([ 2026-10-23T23:34:25.8420452Z ·  ──────────────────────── 2026-10-23T23:34:25.8420696Z 18 │ "review:write", 2026-10-23T23:34:25.8420883Z ╰──── 2026-10-23T23:34:25.8420959Z 2026-10-23T23:34:25.8421485Z ⚠ 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-23T23:34:25.8422127Z ╭─[packages/contracts/src/auth.test.ts:20:18] 2026-10-23T23:34:25.8422375Z 19 │ ]); 2026-10-23T23:34:25.8422703Z 20 │ expect(() => Schema.decodeUnknownSync(AuthGrantScopes)(["review:write"])).toThrow(); 2026-10-23T23:34:25.8423094Z ·  ──────────────────────── 2026-10-23T23:34:25.8423829Z 21 │ expect(AuthStandardClientScopes).not.toContain("review:write"); 2026-10-23T23:34:25.8424256Z ╰──── 2026-10-23T23:34:25.8424336Z 2026-10-23T23:34:25.8424865Z ⚠ 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-23T23:34:25.8425502Z ╭─[packages/contracts/src/auth.test.ts:58:21] 2026-10-23T23:34:25.8425925Z 57 │ it("ignores unknown response permissions without falling back to broader scopes", () => { 2026-10-23T23:34:25.8426357Z 58 │ const session = Schema.decodeUnknownSync(AuthSessionState)({ 2026-10-23T23:34:25.8426706Z ·  ──────────────────────── 2026-10-23T23:34:25.8426966Z 59 │ authenticated: true, 2026-10-23T23:34:25.8427163Z ╰──── 2026-10-23T23:34:25.8427240Z 2026-10-23T23:34:25.8427551Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-23T23:34:25.8428042Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:229:6] 2026-10-23T23:34:25.8428485Z 225 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-23T23:34:25.8428869Z 226 │ nativeEventSnapshotsRef.current, 2026-10-23T23:34:25.8429158Z ·  ───────────┬─────────── 2026-10-23T23:34:25.8429985Z · ╰── 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-23T23:34:25.8430705Z 227 │ mostRecentEventCount, 2026-10-23T23:34:25.8430908Z 228 │ ); 2026-10-23T23:34:25.8431180Z 229 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-23T23:34:25.8431568Z ·  ──────────────────────────┬────────────────────────── 2026-10-23T23:34:25.8432069Z · ╰── This dependency list is missing values used by the callback 2026-10-23T23:34:25.8432460Z 230 │ const assumedValue = props.value; 2026-10-23T23:34:25.8432677Z ╰──── 2026-10-23T23:34:25.8432992Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-23T23:34:25.8433729Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.8434256Z 2026-10-23T23:34:25.8434723Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T23:34:25.8435333Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:237:7] 2026-10-23T23:34:25.8435805Z 236 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-23T23:34:25.8436204Z 237 │ nativeEventSnapshotsRef.current, 2026-10-23T23:34:25.8436533Z ·  ───────────┬─────────── 2026-10-23T23:34:25.8437522Z · ╰── 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-23T23:34:25.8438365Z 238 │ controlledEventCount, 2026-10-23T23:34:25.8438610Z 239 │ assumedValue, 2026-10-23T23:34:25.8438820Z 240 │ ); 2026-10-23T23:34:25.8439181Z 241 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-23T23:34:25.8439685Z ·  ───────────┬────────── 2026-10-23T23:34:25.8440248Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-23T23:34:25.8440710Z 242 │ const acceptNativeEvent = useCallback( 2026-10-23T23:34:25.8440954Z ╰──── 2026-10-23T23:34:25.8441733Z  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-23T23:34:25.8442873Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.8443361Z 2026-10-23T23:34:25.8443606Z ⚠ react(refs): Cannot access refs during render 2026-10-23T23:34:25.8444140Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:162:29] 2026-10-23T23:34:25.8444573Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T23:34:25.8444967Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T23:34:25.8445366Z ·  ─────────────┬──────────── 2026-10-23T23:34:25.8445839Z · ╰── Cannot access ref value during render 2026-10-23T23:34:25.8446188Z 163 │ }); 2026-10-23T23:34:25.8446367Z ╰──── 2026-10-23T23:34:25.8447230Z  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-23T23:34:25.8448376Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T23:34:25.8448809Z 2026-10-23T23:34:25.8449051Z ⚠ react(refs): Cannot access refs during render 2026-10-23T23:34:25.8449513Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:162:29] 2026-10-23T23:34:25.8449954Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T23:34:25.8450357Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T23:34:25.8450764Z ·  ─────────────┬──────────── 2026-10-23T23:34:25.8451448Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T23:34:25.8451929Z 163 │ }); 2026-10-23T23:34:25.8452112Z ╰──── 2026-10-23T23:34:25.8452989Z  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-23T23:34:25.8454227Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T23:34:25.8454667Z 2026-10-23T23:34:25.8454907Z ⚠ react(refs): Cannot access refs during render 2026-10-23T23:34:25.8455352Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:23] 2026-10-23T23:34:25.8455660Z 163 │ }); 2026-10-23T23:34:25.8455905Z 164 │ confirmedTokensRef.current = tokens; 2026-10-23T23:34:25.8456902Z ·  ─────────┬────────────┬─── 2026-10-23T23:34:25.8457398Z · │ ╰── Cannot update ref value during render 2026-10-23T23:34:25.8457873Z · ╰── This value is a ref 2026-10-23T23:34:25.8458184Z 165 │ return JSON.stringify( 2026-10-23T23:34:25.8458411Z ╰──── 2026-10-23T23:34:25.8459230Z  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-23T23:34:25.8460378Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T23:34:25.8460817Z 2026-10-23T23:34:25.8461062Z ⚠ react(refs): Cannot access refs during render 2026-10-23T23:34:25.8461510Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:206:5] 2026-10-23T23:34:25.8461853Z 205 │ mostRecentEventCount, 2026-10-23T23:34:25.8462125Z 206 │ nativeEventSnapshotsRef.current, 2026-10-23T23:34:25.8462462Z ·  ───────────────┬─────────────── 2026-10-23T23:34:25.8462951Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T23:34:25.8463339Z 207 │ ); 2026-10-23T23:34:25.8463520Z ╰──── 2026-10-23T23:34:25.8464451Z  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-23T23:34:25.8465605Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T23:34:25.8466056Z 2026-10-23T23:34:25.8466314Z ⚠ react(refs): Cannot access refs during render 2026-10-23T23:34:25.8466784Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:212:5] 2026-10-23T23:34:25.8467128Z 211 │ mostRecentEventCount, 2026-10-23T23:34:25.8467366Z 212 │ nativeEventSnapshotsRef.current, 2026-10-23T23:34:25.8467632Z ·  ───────────────┬─────────────── 2026-10-23T23:34:25.8468103Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T23:34:25.8468774Z 213 │ ); 2026-10-23T23:34:25.8469038Z ╰──── 2026-10-23T23:34:25.8469865Z  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-23T23:34:25.8471030Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T23:34:25.8471496Z 2026-10-23T23:34:25.8471827Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-23T23:34:25.8472351Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:197:6] 2026-10-23T23:34:25.8472787Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T23:34:25.8473200Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T23:34:25.8473591Z ·  ─────────┬──────── 2026-10-23T23:34:25.8474475Z · ╰── 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-23T23:34:25.8474966Z 163 │ }); 2026-10-23T23:34:25.8475131Z 164 │ confirmedTokensRef.current = tokens; 2026-10-23T23:34:25.8475320Z 165 │ return JSON.stringify( 2026-10-23T23:34:25.8475580Z 166 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-23T23:34:25.8475830Z 167 │ const record = 2026-10-23T23:34:25.8475998Z 168 │ token.type === "context" 2026-10-23T23:34:25.8476275Z 169 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-23T23:34:25.8476516Z 170 │ : undefined; 2026-10-23T23:34:25.8476717Z 171 │ const presentation = contextChipPresentation( 2026-10-23T23:34:25.8476959Z 172 │ token.type === "context" ? token.kind : token.type, 2026-10-23T23:34:25.8477153Z 173 │ record, 2026-10-23T23:34:25.8477333Z 174 │ ); 2026-10-23T23:34:25.8477583Z 175 │ const icon = contextChipIcon( 2026-10-23T23:34:25.8477855Z 176 │ presentation, 2026-10-23T23:34:25.8478216Z 177 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-23T23:34:25.8478553Z 178 │ ); 2026-10-23T23:34:25.8478760Z 179 │ return { 2026-10-23T23:34:25.8478994Z 180 │ type: token.type, 2026-10-23T23:34:25.8479259Z 181 │ source: token.source, 2026-10-23T23:34:25.8479521Z 182 │ start: token.start, 2026-10-23T23:34:25.8479774Z 183 │ end: token.end, 2026-10-23T23:34:25.8480039Z 184 │ accent: presentation.accent, 2026-10-23T23:34:25.8480307Z 185 │ label: 2026-10-23T23:34:25.8480547Z 186 │ token.type === "skill" 2026-10-23T23:34:25.8480878Z 187 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-23T23:34:25.8481208Z 188 │ : token.type === "context" 2026-10-23T23:34:25.8481610Z 189 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-23T23:34:25.8481930Z 190 │ : basename(token.value), 2026-10-23T23:34:25.8482183Z 191 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-23T23:34:25.8482617Z 192 │ iconUri: contextChipIconUri(icon), 2026-10-23T23:34:25.8482863Z 193 │ tintsIcon: icon.kind === "chip", 2026-10-23T23:34:25.8483032Z 194 │ }; 2026-10-23T23:34:25.8483161Z 195 │ }), 2026-10-23T23:34:25.8483293Z 196 │ ); 2026-10-23T23:34:25.8483464Z 197 │ }, [props.value, props.context, skillLabels]); 2026-10-23T23:34:25.8483740Z ·  ────────────────────┬──────────────────── 2026-10-23T23:34:25.8484348Z · ╰── This dependency list is missing values used by the callback 2026-10-23T23:34:25.8484888Z 198 │ // Every render resolves against the snapshot history, so a render whose 2026-10-23T23:34:25.8485232Z ╰──── 2026-10-23T23:34:25.8485655Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-23T23:34:25.8486524Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.8487020Z 2026-10-23T23:34:25.8487339Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-23T23:34:25.8487870Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:259:5] 2026-10-23T23:34:25.8488285Z 251 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-23T23:34:25.8488539Z 252 │ nativeEventSnapshotsRef.current.push({ 2026-10-23T23:34:25.8488765Z ·  ───────────┬─────────── 2026-10-23T23:34:25.8489366Z · ╰── 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-23T23:34:25.8489900Z 253 │ eventCount: acknowledgedEventCount, 2026-10-23T23:34:25.8490083Z 254 │ value, 2026-10-23T23:34:25.8490245Z 255 │ selection: nextSelection, 2026-10-23T23:34:25.8490402Z 256 │ }); 2026-10-23T23:34:25.8490559Z 257 │ return acknowledgedEventCount; 2026-10-23T23:34:25.8490721Z 258 │ }, 2026-10-23T23:34:25.8490842Z 259 │ [], 2026-10-23T23:34:25.8490982Z ·  ─┬ 2026-10-23T23:34:25.8491257Z · ╰── This dependency list is missing values used by the callback 2026-10-23T23:34:25.8491501Z 260 │ ); 2026-10-23T23:34:25.8491616Z ╰──── 2026-10-23T23:34:25.8491884Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-23T23:34:25.8492564Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.8492914Z 2026-10-23T23:34:25.8493073Z ⚠ react(refs): Cannot access refs during render 2026-10-23T23:34:25.8493353Z ╭─[apps/mobile/src/native/StackHeader.tsx:185:9] 2026-10-23T23:34:25.8493557Z 184 │ "options", 2026-10-23T23:34:25.8493736Z 185 │ latestOptionFunctionsRef.current, 2026-10-23T23:34:25.8493971Z ·  ────────────────┬─────────────── 2026-10-23T23:34:25.8494381Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T23:34:25.8494671Z 186 │ optionFunctionWrappersRef.current, 2026-10-23T23:34:25.8494837Z ╰──── 2026-10-23T23:34:25.8495385Z  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-23T23:34:25.8496234Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T23:34:25.8496524Z 2026-10-23T23:34:25.8496677Z ⚠ react(refs): Cannot access refs during render 2026-10-23T23:34:25.8496954Z ╭─[apps/mobile/src/native/StackHeader.tsx:186:9] 2026-10-23T23:34:25.8497181Z 185 │ latestOptionFunctionsRef.current, 2026-10-23T23:34:25.8497391Z 186 │ optionFunctionWrappersRef.current, 2026-10-23T23:34:25.8497622Z ·  ────────────────┬──────────────── 2026-10-23T23:34:25.8497946Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T23:34:25.8498235Z 187 │ ) as NativeStackNavigationOptions) 2026-10-23T23:34:25.8498396Z ╰──── 2026-10-23T23:34:25.8498930Z  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-23T23:34:25.8499664Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T23:34:25.8499951Z 2026-10-23T23:34:25.8500164Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-23T23:34:25.8500512Z ╭─[packages/client-runtime/src/state/filesystem.ts:3:8] 2026-10-23T23:34:25.8500735Z 2 │ AuthFilesystemReadScope, 2026-10-23T23:34:25.8500902Z 3 │ type AuthSessionState, 2026-10-23T23:34:25.8501160Z ·  ────────┬─────── 2026-10-23T23:34:25.8501537Z · ╰── 'AuthSessionState' is imported here 2026-10-23T23:34:25.8501883Z 4 │ type FilesystemBrowseEntry, 2026-10-23T23:34:25.8502108Z ╰──── 2026-10-23T23:34:25.8502339Z  help: Consider removing this import. 2026-10-23T23:34:25.8502526Z 2026-10-23T23:34:25.8502833Z ⚠ eslint(require-yield): This generator function does not have `yield` 2026-10-23T23:34:25.8503365Z ╭─[packages/provider-acp/src/server/mcpOverAcpBridge.ts:81:78] 2026-10-23T23:34:25.8503696Z  80 │ 2026-10-23T23:34:25.8504565Z  81 │ ╭─▶ export const makeAcpMcpOverAcpBridge = Effect.fn("AcpMcpOverAcpBridge.make")(function* ( 2026-10-23T23:34:25.8505141Z  82 │ │ options: AcpMcpOverAcpBridgeOptions, 2026-10-23T23:34:25.8505404Z  83 │ │ ): Effect.fn.Return { 2026-10-23T23:34:25.8505717Z  84 │ │ const fetchImplementation = options.fetchImplementation ?? fetch; 2026-10-23T23:34:25.8506031Z  85 │ │ const connections = new Map(); 2026-10-23T23:34:25.8506255Z  86 │ │ 2026-10-23T23:34:25.8506571Z  87 │ │ const connectionFor = (connectionId: string): Effect.Effect => 2026-10-23T23:34:25.8506897Z  88 │ │ Effect.suspend(() => { 2026-10-23T23:34:25.8507160Z  89 │ │ const connection = connections.get(connectionId); 2026-10-23T23:34:25.8507428Z  90 │ │ return connection === undefined 2026-10-23T23:34:25.8507884Z  91 │ │ ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`)) 2026-10-23T23:34:25.8508398Z  92 │ │ : Effect.succeed(connection); 2026-10-23T23:34:25.8508712Z  93 │ │ }); 2026-10-23T23:34:25.8508965Z  94 │ │ 2026-10-23T23:34:25.8509242Z  95 │ │ const send = ( 2026-10-23T23:34:25.8509563Z  96 │ │ connection: Connection, 2026-10-23T23:34:25.8509889Z  97 │ │ message: unknown, 2026-10-23T23:34:25.8510323Z  98 │ │ ): Effect.Effect, AcpMcpOverAcpError> => 2026-10-23T23:34:25.8510788Z  99 │ │ connection.mutex.withPermits(1)( 2026-10-23T23:34:25.8511167Z 100 │ │ Effect.gen(function* () { 2026-10-23T23:34:25.8511552Z 101 │ │ const body = JSON.stringify(message); 2026-10-23T23:34:25.8511999Z 102 │ │ if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) { 2026-10-23T23:34:25.8512628Z 103 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB.")); 2026-10-23T23:34:25.8513098Z 104 │ │ } 2026-10-23T23:34:25.8513480Z 105 │ │ const response = yield* Effect.tryPromise({ 2026-10-23T23:34:25.8513863Z 106 │ │ try: (signal) => 2026-10-23T23:34:25.8514326Z 107 │ │ fetchImplementation(options.endpoint, { 2026-10-23T23:34:25.8514733Z 108 │ │ method: "POST", 2026-10-23T23:34:25.8515073Z 109 │ │ signal, 2026-10-23T23:34:25.8515398Z 110 │ │ headers: { 2026-10-23T23:34:25.8515792Z 111 │ │ "content-type": "application/json", 2026-10-23T23:34:25.8516249Z 112 │ │ accept: "application/json, text/event-stream", 2026-10-23T23:34:25.8516694Z 113 │ │ authorization: options.authorization, 2026-10-23T23:34:25.8517119Z 114 │ │ ...(connection.sessionId === null 2026-10-23T23:34:25.8517492Z 115 │ │ ? {} 2026-10-23T23:34:25.8517906Z 116 │ │ : { "mcp-session-id": connection.sessionId }), 2026-10-23T23:34:25.8518509Z 117 │ │ ...(connection.protocolVersion === null 2026-10-23T23:34:25.8518965Z 118 │ │ ? {} 2026-10-23T23:34:25.8519404Z 119 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-23T23:34:25.8519807Z 120 │ │ }, 2026-10-23T23:34:25.8520100Z 121 │ │ body, 2026-10-23T23:34:25.8520402Z 122 │ │ }), 2026-10-23T23:34:25.8520720Z 123 │ │ catch: bridgeError, 2026-10-23T23:34:25.8521036Z 124 │ │ }); 2026-10-23T23:34:25.8521538Z 125 │ │ connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId; 2026-10-23T23:34:25.8522056Z 126 │ │ if (!response.ok) { 2026-10-23T23:34:25.8522417Z 127 │ │ yield* Effect.promise( 2026-10-23T23:34:25.8522746Z 128 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-23T23:34:25.8523105Z 129 │ │ ); 2026-10-23T23:34:25.8523378Z 130 │ │ return yield* Effect.fail( 2026-10-23T23:34:25.8523832Z 131 │ │ new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`), 2026-10-23T23:34:25.8524268Z 132 │ │ ); 2026-10-23T23:34:25.8524544Z 133 │ │ } 2026-10-23T23:34:25.8525042Z 134 │ │ const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))]; 2026-10-23T23:34:25.8525448Z 135 │ │ for (const payload of payloads) { 2026-10-23T23:34:25.8525811Z 136 │ │ connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion; 2026-10-23T23:34:25.8526195Z 137 │ │ } 2026-10-23T23:34:25.8526501Z 138 │ │ return payloads; 2026-10-23T23:34:25.8526875Z 139 │ │ }).pipe(Effect.mapError(bridgeError)), 2026-10-23T23:34:25.8527216Z 140 │ │ ); 2026-10-23T23:34:25.8527478Z 141 │ │ 2026-10-23T23:34:25.8527890Z 142 │ │ const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* ( 2026-10-23T23:34:25.8528381Z 143 │ │ request: AcpSchema.DisconnectMcpRequest, 2026-10-23T23:34:25.8528920Z 144 │ │ ): Effect.fn.Return { 2026-10-23T23:34:25.8529497Z 145 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-23T23:34:25.8529964Z 146 │ │ connections.delete(request.connectionId); 2026-10-23T23:34:25.8530370Z 147 │ │ const sessionId = connection.sessionId; 2026-10-23T23:34:25.8530748Z 148 │ │ if (sessionId !== null) { 2026-10-23T23:34:25.8531148Z 149 │ │ const response = yield* Effect.tryPromise({ 2026-10-23T23:34:25.8531563Z 150 │ │ try: (signal) => 2026-10-23T23:34:25.8531955Z 151 │ │ fetchImplementation(options.endpoint, { 2026-10-23T23:34:25.8532344Z 152 │ │ method: "DELETE", 2026-10-23T23:34:25.8532880Z 153 │ │ signal, 2026-10-23T23:34:25.8533264Z 154 │ │ headers: { 2026-10-23T23:34:25.8533643Z 155 │ │ authorization: options.authorization, 2026-10-23T23:34:25.8534107Z 156 │ │ "mcp-session-id": sessionId, 2026-10-23T23:34:25.8534519Z 157 │ │ ...(connection.protocolVersion === null 2026-10-23T23:34:25.8534897Z 158 │ │ ? {} 2026-10-23T23:34:25.8535336Z 159 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-23T23:34:25.8535734Z 160 │ │ }, 2026-10-23T23:34:25.8536136Z 161 │ │ }), 2026-10-23T23:34:25.8536446Z 162 │ │ catch: bridgeError, 2026-10-23T23:34:25.8536758Z 163 │ │ }); 2026-10-23T23:34:25.8537138Z 164 │ │ if (!response.ok && response.status !== 404) { 2026-10-23T23:34:25.8537547Z 165 │ │ return yield* Effect.fail( 2026-10-23T23:34:25.8537928Z 166 │ │ new AcpMcpOverAcpError( 2026-10-23T23:34:25.8538434Z 167 │ │ `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`, 2026-10-23T23:34:25.8538867Z 168 │ │ ), 2026-10-23T23:34:25.8539129Z 169 │ │ ); 2026-10-23T23:34:25.8539387Z 170 │ │ } 2026-10-23T23:34:25.8539691Z 171 │ │ yield* Effect.promise( 2026-10-23T23:34:25.8540156Z 172 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-23T23:34:25.8540569Z 173 │ │ ); 2026-10-23T23:34:25.8540841Z 174 │ │ } 2026-10-23T23:34:25.8541112Z 175 │ │ return {}; 2026-10-23T23:34:25.8541373Z 176 │ │ }); 2026-10-23T23:34:25.8541626Z 177 │ │ 2026-10-23T23:34:25.8541882Z 178 │ │ return { 2026-10-23T23:34:25.8542286Z 179 │ │ connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) { 2026-10-23T23:34:25.8542731Z 180 │ │ if (request.serverId !== "t3-code") { 2026-10-23T23:34:25.8543106Z 181 │ │ return yield* Effect.fail( 2026-10-23T23:34:25.8543579Z 182 │ │ new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`), 2026-10-23T23:34:25.8543995Z 183 │ │ ); 2026-10-23T23:34:25.8544338Z 184 │ │ } 2026-10-23T23:34:25.8544691Z 185 │ │ if (connections.size >= MAX_CONNECTIONS) { 2026-10-23T23:34:25.8545243Z 186 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections.")); 2026-10-23T23:34:25.8545675Z 187 │ │ } 2026-10-23T23:34:25.8546105Z 188 │ │ const connectionId = yield* options.allocateConnectionId; 2026-10-23T23:34:25.8546588Z 189 │ │ connections.set(connectionId, { 2026-10-23T23:34:25.8546972Z 190 │ │ mutex: yield* Semaphore.make(1), 2026-10-23T23:34:25.8547331Z 191 │ │ sessionId: null, 2026-10-23T23:34:25.8547678Z 192 │ │ protocolVersion: null, 2026-10-23T23:34:25.8548351Z 193 │ │ nextRequestId: 0, 2026-10-23T23:34:25.8548734Z 194 │ │ }); 2026-10-23T23:34:25.8549050Z 195 │ │ return { connectionId }; 2026-10-23T23:34:25.8549360Z 196 │ │ }), 2026-10-23T23:34:25.8549790Z 197 │ │ message: Effect.fn("mcpOverAcpBridge.message")(function* (request) { 2026-10-23T23:34:25.8550323Z 198 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-23T23:34:25.8550773Z 199 │ │ const id = ++connection.nextRequestId; 2026-10-23T23:34:25.8551188Z 200 │ │ const payloads = yield* send(connection, { 2026-10-23T23:34:25.8551542Z 201 │ │ jsonrpc: "2.0", 2026-10-23T23:34:25.8551861Z 202 │ │ id, 2026-10-23T23:34:25.8552187Z 203 │ │ method: request.method, 2026-10-23T23:34:25.8552643Z 204 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-23T23:34:25.8553018Z 205 │ │ }); 2026-10-23T23:34:25.8553478Z 206 │ │ const response = payloads.find((payload) => asEnvelope(payload)?.id === id); 2026-10-23T23:34:25.8553970Z 207 │ │ const envelope = asEnvelope(response); 2026-10-23T23:34:25.8554417Z 208 │ │ if (envelope === null) { 2026-10-23T23:34:25.8554779Z 209 │ │ return yield* Effect.fail( 2026-10-23T23:34:25.8555280Z 210 │ │ new AcpMcpOverAcpError("MCP server did not return a matching response."), 2026-10-23T23:34:25.8555708Z 211 │ │ ); 2026-10-23T23:34:25.8555977Z 212 │ │ } 2026-10-23T23:34:25.8556308Z 213 │ │ if (envelope.error !== undefined) { 2026-10-23T23:34:25.8556837Z 214 │ │ return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error))); 2026-10-23T23:34:25.8557275Z 215 │ │ } 2026-10-23T23:34:25.8557703Z 216 │ │ return (envelope.result ?? null) as AcpSchema.MessageMcpResponse; 2026-10-23T23:34:25.8558103Z 217 │ │ }), 2026-10-23T23:34:25.8558566Z 218 │ │ notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) { 2026-10-23T23:34:25.8559147Z 219 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-23T23:34:25.8559602Z 220 │ │ yield* send(connection, { 2026-10-23T23:34:25.8559958Z 221 │ │ jsonrpc: "2.0", 2026-10-23T23:34:25.8560293Z 222 │ │ method: request.method, 2026-10-23T23:34:25.8560728Z 223 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-23T23:34:25.8561108Z 224 │ │ }); 2026-10-23T23:34:25.8561383Z 225 │ │ }), 2026-10-23T23:34:25.8561664Z 226 │ │ disconnect, 2026-10-23T23:34:25.8562001Z 227 │ │ dispose: Effect.suspend(() => 2026-10-23T23:34:25.8562354Z 228 │ │ Effect.forEach( 2026-10-23T23:34:25.8562703Z 229 │ │ [...connections.keys()], 2026-10-23T23:34:25.8563389Z 230 │ │ (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore), 2026-10-23T23:34:25.8563910Z 231 │ │ { discard: true }, 2026-10-23T23:34:25.8564286Z 232 │ │ ), 2026-10-23T23:34:25.8564563Z 233 │ │ ), 2026-10-23T23:34:25.8564827Z 234 │ │ }; 2026-10-23T23:34:25.8565190Z 235 │ ╰─▶ }); 2026-10-23T23:34:25.8565507Z ╰──── 2026-10-23T23:34:25.8566030Z  help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed. 2026-10-23T23:34:25.8566424Z 2026-10-23T23:34:25.8566782Z ⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used. 2026-10-23T23:34:25.8567359Z ╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10] 2026-10-23T23:34:25.8567690Z 21 │ 2026-10-23T23:34:25.8568026Z 22 │ function summarizePayload(payload: unknown): Readonly> { 2026-10-23T23:34:25.8568448Z ·  ────────┬─────── 2026-10-23T23:34:25.8568841Z · ╰── 'summarizePayload' is declared here 2026-10-23T23:34:25.8569251Z 23 │ if (payload === null) return { valueType: "null" }; 2026-10-23T23:34:25.8569523Z ╰──── 2026-10-23T23:34:25.8569773Z  help: Consider removing this declaration. 2026-10-23T23:34:25.8569969Z 2026-10-23T23:34:25.8570434Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-23T23:34:25.8571061Z ╭─[packages/provider-cursor/src/server/auth.ts:249:20] 2026-10-23T23:34:25.8571381Z 248 │ }, 2026-10-23T23:34:25.8571633Z 249 │ (effect, flow, stopSessions) => 2026-10-23T23:34:25.8571952Z ·  ──────┬───── 2026-10-23T23:34:25.8572358Z · ╰── 'stopSessions' is declared here 2026-10-23T23:34:25.8572701Z 250 │ effect.pipe( 2026-10-23T23:34:25.8572931Z ╰──── 2026-10-23T23:34:25.8573191Z  help: Consider removing this parameter. 2026-10-23T23:34:25.8573396Z 2026-10-23T23:34:25.8573886Z ⚠ eslint(no-unused-vars): Variable 'legacyCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-23T23:34:25.8574683Z ╭─[packages/provider-cursor/src/server/credentialStore.test.ts:15:7] 2026-10-23T23:34:25.8575042Z 14 │ 2026-10-23T23:34:25.8575242Z 15 │ const legacyCredentials = { 2026-10-23T23:34:25.8575719Z ·  ────────┬──────── 2026-10-23T23:34:25.8576324Z · ╰── 'legacyCredentials' is declared here 2026-10-23T23:34:25.8576672Z 16 │ version: 1 as const, 2026-10-23T23:34:25.8576887Z ╰──── 2026-10-23T23:34:25.8577146Z  help: Consider removing this declaration. 2026-10-23T23:34:25.8577350Z 2026-10-23T23:34:25.8577621Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T23:34:25.8578160Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:372:47] 2026-10-23T23:34:25.8578648Z 371 │ const { open, onOpenChange, onSnooze, timestampFormat } = props; 2026-10-23T23:34:25.8579166Z 372 │ const presets = open ? resolveSnoozePresets(new Date(), timestampFormat) : []; 2026-10-23T23:34:25.8579636Z ·  ─────┬──── 2026-10-23T23:34:25.8580138Z · ╰── Cannot call impure function 2026-10-23T23:34:25.8580507Z 373 │ return ( 2026-10-23T23:34:25.8580703Z ╰──── 2026-10-23T23:34:25.8581272Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T23:34:25.8582282Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T23:34:25.8582790Z 2026-10-23T23:34:25.8583084Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T23:34:25.8583619Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:853:39] 2026-10-23T23:34:25.8584111Z 852 │ if (snoozeGateClock.thread !== thread) { 2026-10-23T23:34:25.8584511Z 853 │ setSnoozeGateClock({ thread, now: new Date().toISOString() }); 2026-10-23T23:34:25.8584919Z ·  ─────┬──── 2026-10-23T23:34:25.8585370Z · ╰── Cannot call impure function 2026-10-23T23:34:25.8585703Z 854 │ } 2026-10-23T23:34:25.8585886Z ╰──── 2026-10-23T23:34:25.8586415Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T23:34:25.8587335Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T23:34:25.8587789Z 2026-10-23T23:34:25.8588146Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-23T23:34:25.8588655Z ╭─[packages/contracts/src/rpc.ts:297:8] 2026-10-23T23:34:25.8588952Z 296 │ } from "./device.ts"; 2026-10-23T23:34:25.8589230Z 297 │ import {} from "./previewAutomation.ts"; 2026-10-23T23:34:25.8589515Z ·  ── 2026-10-23T23:34:25.8589738Z 298 │ import { 2026-10-23T23:34:25.8589939Z ╰──── 2026-10-23T23:34:25.8590154Z  help: Remove empty braces 2026-10-23T23:34:25.8590320Z 2026-10-23T23:34:25.8590626Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T23:34:25.8591207Z ╭─[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:116:34] 2026-10-23T23:34:25.8591620Z 115 │ return [...commands]; 2026-10-23T23:34:25.8592289Z 116 │ }, [activeThreadRef, pathname, registrationVersion, navigation]); 2026-10-23T23:34:25.8592886Z ·  ─────────┬───────── 2026-10-23T23:34:25.8593388Z · ╰── Unnecessary dependency `registrationVersion` 2026-10-23T23:34:25.8593764Z 117 │ 2026-10-23T23:34:25.8593936Z ╰──── 2026-10-23T23:34:25.8594481Z  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-23T23:34:25.8595116Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.8595425Z 2026-10-23T23:34:25.8596141Z ⚠ 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-23T23:34:25.8597127Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:169:7] 2026-10-23T23:34:25.8597469Z 168 │ }); 2026-10-23T23:34:25.8597911Z 169 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-23T23:34:25.8598541Z 170 │ │ if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break; 2026-10-23T23:34:25.8598960Z 171 │ │ yield* Effect.yieldNow; 2026-10-23T23:34:25.8599383Z 172 │ ╰─▶ } 2026-10-23T23:34:25.8599696Z 173 │ 2026-10-23T23:34:25.8599882Z ╰──── 2026-10-23T23:34:25.8599979Z 2026-10-23T23:34:25.8600762Z ⚠ 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-23T23:34:25.8601647Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:178:7] 2026-10-23T23:34:25.8602061Z 177 │ yield* Deferred.succeed(releaseSave, undefined); 2026-10-23T23:34:25.8602568Z 178 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-23T23:34:25.8603079Z 179 │ │ if ((yield* Ref.get(saved)).length > 0) break; 2026-10-23T23:34:25.8603484Z 180 │ │ yield* Effect.yieldNow; 2026-10-23T23:34:25.8603880Z 181 │ ╰─▶ } 2026-10-23T23:34:25.8604261Z 182 │ 2026-10-23T23:34:25.8604450Z ╰──── 2026-10-23T23:34:25.8604541Z 2026-10-23T23:34:25.8605294Z ⚠ 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-23T23:34:25.8606202Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7] 2026-10-23T23:34:25.8606666Z 306 │ yield* Deferred.succeed(releaseUnenrichedSave, undefined); 2026-10-23T23:34:25.8607211Z 307 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-23T23:34:25.8607706Z 308 │ │ const values = yield* Ref.get(saved); 2026-10-23T23:34:25.8608458Z 309 │ │ if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) { 2026-10-23T23:34:25.8608906Z 310 │ │ break; 2026-10-23T23:34:25.8609115Z 311 │ │ } 2026-10-23T23:34:25.8609449Z 312 │ │ yield* Effect.yieldNow; 2026-10-23T23:34:25.8609861Z 313 │ ╰─▶ } 2026-10-23T23:34:25.8610175Z 314 │ 2026-10-23T23:34:25.8610366Z ╰──── 2026-10-23T23:34:25.8610453Z 2026-10-23T23:34:25.8611203Z ⚠ 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-23T23:34:25.8612165Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1228:7] 2026-10-23T23:34:25.8612589Z 1227 │ yield* harness.replaceSession; 2026-10-23T23:34:25.8613131Z 1228 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T23:34:25.8613710Z 1229 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) { 2026-10-23T23:34:25.8614156Z 1230 │ │ break; 2026-10-23T23:34:25.8614347Z 1231 │ │ } 2026-10-23T23:34:25.8614562Z 1232 │ │ yield* Effect.yieldNow; 2026-10-23T23:34:25.8614829Z 1233 │ ╰─▶ } 2026-10-23T23:34:25.8615050Z 1234 │ yield* Queue.offer( 2026-10-23T23:34:25.8615202Z ╰──── 2026-10-23T23:34:25.8615262Z 2026-10-23T23:34:25.8615758Z ⚠ 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-23T23:34:25.8616479Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1337:7] 2026-10-23T23:34:25.8616740Z 1336 │ yield* harness.replaceSession; 2026-10-23T23:34:25.8617073Z 1337 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T23:34:25.8617446Z 1338 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break; 2026-10-23T23:34:25.8617727Z 1339 │ │ yield* Effect.yieldNow; 2026-10-23T23:34:25.8617993Z 1340 │ ╰─▶ } 2026-10-23T23:34:25.8618279Z 1341 │ expect(yield* Ref.get(harness.subscriptionCount)).toBe(2); 2026-10-23T23:34:25.8618484Z ╰──── 2026-10-23T23:34:25.8618545Z 2026-10-23T23:34:25.8619034Z ⚠ 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-23T23:34:25.8619601Z ╭─[packages/contracts/src/baseSchemas.test.ts:39:9] 2026-10-23T23:34:25.8619815Z 38 │ JSON.stringify( 2026-10-23T23:34:25.8620029Z 39 │ Schema.encodeUnknownSync(Schema.toCodecJson(Named))([ 2026-10-23T23:34:25.8620278Z ·  ──────────────────────── 2026-10-23T23:34:25.8620459Z 40 │ { name: "a" }, 2026-10-23T23:34:25.8620604Z ╰──── 2026-10-23T23:34:25.8620662Z 2026-10-23T23:34:25.8621151Z ⚠ eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used. 2026-10-23T23:34:25.8621742Z ╭─[infra/relay/src/http/Api.ts:69:13] 2026-10-23T23:34:25.8622144Z 68 │ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts"; 2026-10-23T23:34:25.8622592Z 69 │ import * as HookForwarder from "../hooks/HookForwarder.ts"; 2026-10-23T23:34:25.8622925Z ·  ──────┬────── 2026-10-23T23:34:25.8623324Z · ╰── 'HookForwarder' is imported here 2026-10-23T23:34:25.8623723Z 70 │ import * as HeldHooks from "../hooks/HeldHooks.ts"; 2026-10-23T23:34:25.8623996Z ╰──── 2026-10-23T23:34:25.8624293Z  help: Consider removing this import. 2026-10-23T23:34:25.8624482Z 2026-10-23T23:34:25.8624797Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-23T23:34:25.8625331Z ╭─[packages/client-runtime/src/state/shell.ts:189:5] 2026-10-23T23:34:25.8625727Z 186 │ let waiting = yield* Ref.get(awaitingCompletion); 2026-10-23T23:34:25.8625934Z 187 │ let next = initial; 2026-10-23T23:34:25.8626100Z ·  ──┬─ 2026-10-23T23:34:25.8626344Z · ╰── From this accumulator 2026-10-23T23:34:25.8626692Z 188 │ let receivedSnapshot = false; 2026-10-23T23:34:25.8626982Z 189 │ for (const item of items) { 2026-10-23T23:34:25.8627251Z ·  ─┬─ 2026-10-23T23:34:25.8627563Z · ╰── For this loop 2026-10-23T23:34:25.8627898Z 190 │ if (item.kind === "synchronized") { 2026-10-23T23:34:25.8628191Z 191 │ waiting = false; 2026-10-23T23:34:25.8628498Z 192 │ if (Option.isSome(next.snapshot)) { 2026-10-23T23:34:25.8628869Z 193 │ next = { ...next, status: "live", error: Option.none() }; 2026-10-23T23:34:25.8629220Z ·  ───┬─── 2026-10-23T23:34:25.8629596Z · ╰── From this spread 2026-10-23T23:34:25.8629909Z 194 │ } 2026-10-23T23:34:25.8630105Z ╰──── 2026-10-23T23:34:25.8630456Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-23T23:34:25.8631010Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-23T23:34:25.8631278Z 2026-10-23T23:34:25.8631553Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T23:34:25.8632037Z ╭─[apps/server/src/processRunner.test.ts:266:14] 2026-10-23T23:34:25.8632338Z 265 │ 2026-10-23T23:34:25.8632626Z 266 │ for (const {} of ["timeout", "success"] as const) { 2026-10-23T23:34:25.8632954Z ·  ── 2026-10-23T23:34:25.8633191Z 267 │ } 2026-10-23T23:34:25.8633376Z ╰──── 2026-10-23T23:34:25.8633883Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T23:34:25.8634334Z 2026-10-23T23:34:25.8634820Z ⚠ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'. 2026-10-23T23:34:25.8635512Z ╭─[apps/web/src/components/preview/PreviewPanelShell.tsx:61:9] 2026-10-23T23:34:25.8635857Z 60 │ ) { 2026-10-23T23:34:25.8636237Z 61 │ const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded"; 2026-10-23T23:34:25.8636656Z ·  ──────┬────── 2026-10-23T23:34:25.8637268Z · ╰── 'useDragRegion' is declared here 2026-10-23T23:34:25.8637716Z 62 │ const isInline = props.mode === "inline"; 2026-10-23T23:34:25.8637979Z ╰──── 2026-10-23T23:34:25.8638230Z  help: Consider removing this declaration. 2026-10-23T23:34:25.8638424Z 2026-10-23T23:34:25.8638856Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T23:34:25.8639533Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:335:7] 2026-10-23T23:34:25.8639914Z 330 │ }; 2026-10-23T23:34:25.8640121Z 331 │ useEffect(() => { 2026-10-23T23:34:25.8640366Z ·  ────┬──── 2026-10-23T23:34:25.8640717Z · ╰── This is the containing effect 2026-10-23T23:34:25.8641116Z 332 │ if (!guidesEnabled && section === "guide") { 2026-10-23T23:34:25.8641476Z 333 │ requestedSection.current = "overview"; 2026-10-23T23:34:25.8641952Z 334 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-23T23:34:25.8642360Z 335 │ setSection("overview"); 2026-10-23T23:34:25.8642623Z ·  ─────┬──── 2026-10-23T23:34:25.8643063Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.8643438Z 336 │ } 2026-10-23T23:34:25.8643619Z ╰──── 2026-10-23T23:34:25.8644853Z  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-23T23:34:25.8646455Z  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-23T23:34:25.8647027Z 2026-10-23T23:34:25.8647393Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-23T23:34:25.8648025Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:337:6] 2026-10-23T23:34:25.8648474Z 332 │ if (!guidesEnabled && section === "guide") { 2026-10-23T23:34:25.8648816Z 333 │ requestedSection.current = "overview"; 2026-10-23T23:34:25.8649141Z ·  ────────┬─────── 2026-10-23T23:34:25.8650075Z · ╰── 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-23T23:34:25.8651036Z 334 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-23T23:34:25.8651574Z ·  ─────────┬───────── ──────┬────── 2026-10-23T23:34:25.8652661Z · │ ╰── 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-23T23:34:25.8654465Z · ╰── 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-23T23:34:25.8655401Z 335 │ setSection("overview"); 2026-10-23T23:34:25.8655651Z 336 │ } 2026-10-23T23:34:25.8655903Z 337 │ }, [guidesEnabled, section, insets.top]); 2026-10-23T23:34:25.8656465Z ·  ──────────────────┬───────────────── 2026-10-23T23:34:25.8657001Z · ╰── This dependency list is missing values used by the callback 2026-10-23T23:34:25.8657458Z 338 │ const tabContent = activityContent; 2026-10-23T23:34:25.8657715Z ╰──── 2026-10-23T23:34:25.8658087Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-23T23:34:25.8658905Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.8659404Z 2026-10-23T23:34:25.8659781Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-23T23:34:25.8660418Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:873:6] 2026-10-23T23:34:25.8660820Z 856 │ if ( 2026-10-23T23:34:25.8675625Z 857 │ lastSelection.current.path === route.params.path && 2026-10-23T23:34:25.8676093Z ·  ──────┬────── 2026-10-23T23:34:25.8676994Z · ╰── 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-23T23:34:25.8677892Z 858 │ lastSelection.current.id === route.params.fileSelectionId 2026-10-23T23:34:25.8678226Z 859 │ ) 2026-10-23T23:34:25.8678459Z 860 │ return; 2026-10-23T23:34:25.8678880Z 861 │ lastSelection.current = { path: route.params.path, id: route.params.fileSelectionId }; 2026-10-23T23:34:25.8679400Z 862 │ if (route.params.focus) navigation.setParams({ focus: undefined }); 2026-10-23T23:34:25.8679784Z 863 │ setJumpPath(route.params.path); 2026-10-23T23:34:25.8680078Z 864 │ setSelectedRowId(null); 2026-10-23T23:34:25.8680353Z 865 │ jumpStarted.current = false; 2026-10-23T23:34:25.8680760Z 866 │ const file = data.files.find((entry) => entry.path === route.params.path); 2026-10-23T23:34:25.8681178Z 867 │ if (!file || !nativeView.current) return; 2026-10-23T23:34:25.8681506Z ·  ─────┬──── 2026-10-23T23:34:25.8682733Z · ╰── 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-23T23:34:25.8683650Z 868 │ setCollapsedIds((ids) => ids.filter((id) => id !== file.id)); 2026-10-23T23:34:25.8683999Z 869 │ jumpStarted.current = true; 2026-10-23T23:34:25.8684430Z 870 │ void nativeView.current.scrollToFile(file.id, false).catch(() => { 2026-10-23T23:34:25.8684801Z 871 │ jumpStarted.current = false; 2026-10-23T23:34:25.8685051Z 872 │ }); 2026-10-23T23:34:25.8685473Z 873 │ }, [route.params.path, route.params.fileSelectionId, route.params.focus, data.files, navigation]); 2026-10-23T23:34:25.8686133Z ·  ──────────────────────────────────────────────┬────────────────────────────────────────────── 2026-10-23T23:34:25.8686823Z · ╰── This dependency list is missing values used by the callback 2026-10-23T23:34:25.8687350Z 874 │ const appliedFilter = useRef(filter.hideTestFiles); 2026-10-23T23:34:25.8687644Z ╰──── 2026-10-23T23:34:25.8688008Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-23T23:34:25.8688817Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.8689324Z 2026-10-23T23:34:25.8690115Z ⚠ 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-23T23:34:25.8691049Z ╭─[packages/contracts/src/composerContext.test.ts:181:18] 2026-10-23T23:34:25.8691509Z 180 │ it("sends a message without the records the wire cannot carry", () => { 2026-10-23T23:34:25.8692055Z 181 │ const wire = Schema.encodeUnknownSync(Schema.toCodecJson(OrchestrationMessageContext))({ 2026-10-23T23:34:25.8692541Z ·  ──────────────────────── 2026-10-23T23:34:25.8692837Z 182 │ version: 1, 2026-10-23T23:34:25.8693048Z ╰──── 2026-10-23T23:34:25.8693140Z 2026-10-23T23:34:25.8693413Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T23:34:25.8693906Z ╭─[apps/web/src/components/CommandPalette.tsx:1996:20] 2026-10-23T23:34:25.8694409Z 1995 │ title: inferProjectTitleFromPath(destinationPath), 2026-10-23T23:34:25.8694789Z 1996 │ createdAt: new Date().toISOString(), 2026-10-23T23:34:25.8695122Z ·  ─────┬──── 2026-10-23T23:34:25.8695551Z · ╰── Cannot call impure function 2026-10-23T23:34:25.8696152Z 1997 │ remoteUrl: addProjectCloneFlow.remoteUrl, 2026-10-23T23:34:25.8696435Z ╰──── 2026-10-23T23:34:25.8696980Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T23:34:25.8697911Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T23:34:25.8698381Z 2026-10-23T23:34:25.8698662Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T23:34:25.8699182Z ╭─[apps/web/src/components/CustomSnoozeDialog.tsx:140:58] 2026-10-23T23:34:25.8699665Z 139 │ {...(weekStartsOn === undefined ? {} : { weekStartsOn })} 2026-10-23T23:34:25.8700418Z 140 │ disabled={{ before: new Date(new Date().setHours(0, 0, 0, 0)) }} 2026-10-23T23:34:25.8700977Z ·  ─────┬──── 2026-10-23T23:34:25.8701480Z · ╰── Cannot call impure function 2026-10-23T23:34:25.8701902Z 141 │ onSelect={(selected) => { 2026-10-23T23:34:25.8702171Z ╰──── 2026-10-23T23:34:25.8702735Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T23:34:25.8703630Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T23:34:25.8704156Z 2026-10-23T23:34:25.8704977Z ⚠ unicorn(prefer-string-starts-ends-with): Prefer String#startsWith over a regex with a caret. 2026-10-23T23:34:25.8705420Z ╭─[apps/server/src/vcs/GitVcsDriverCore.ts:509:11] 2026-10-23T23:34:25.8705684Z 508 │ GIT_DIAGNOSTIC_LINE_PATTERN.test(line) || 2026-10-23T23:34:25.8705956Z 509 │ (!/^remote:/.test(line) && SSH_TRANSPORT_REFUSAL_PATTERN.test(line)), 2026-10-23T23:34:25.8706210Z ·  ─────────────── 2026-10-23T23:34:25.8706378Z 510 │ ) 2026-10-23T23:34:25.8706504Z ╰──── 2026-10-23T23:34:25.8706733Z  help: Replace `/^remote:/.test(line)` with `line.startsWith('remote:')`. 2026-10-23T23:34:25.8706907Z 2026-10-23T23:34:25.8707313Z ⚠ 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-23T23:34:25.8707813Z ╭─[apps/server/src/vcs/GitVcsDriverCore.test.ts:1786:34] 2026-10-23T23:34:25.8708118Z 1785 │ const stat = branch.files!.find((file) => file.path === path)!; 2026-10-23T23:34:25.8708431Z 1786 │ const request = yield* Schema.decodeEffect(ReviewDiffPreviewInput)({ 2026-10-23T23:34:25.8708723Z ·  ─────────────────── 2026-10-23T23:34:25.8708923Z 1787 │ cwd, 2026-10-23T23:34:25.8709061Z ╰──── 2026-10-23T23:34:25.8709122Z 2026-10-23T23:34:25.8709415Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-23T23:34:25.8709831Z ╭─[apps/server/src/telemetry/AnalyticsService.ts:340:7] 2026-10-23T23:34:25.8710039Z 339 │ 2026-10-23T23:34:25.8710222Z 340 │ const layerTest = AnalyticsService.layerTest; 2026-10-23T23:34:25.8710433Z ·  ────┬──── 2026-10-23T23:34:25.8710679Z · ╰── 'layerTest' is declared here 2026-10-23T23:34:25.8710883Z ╰──── 2026-10-23T23:34:25.8711057Z  help: Consider removing this declaration. 2026-10-23T23:34:25.8711182Z 2026-10-23T23:34:25.8711488Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-23T23:34:25.8711914Z ╭─[apps/server/src/provider/AntigravityAuth.ts:285:20] 2026-10-23T23:34:25.8712122Z 284 │ }, 2026-10-23T23:34:25.8712286Z 285 │ (effect, flow, stopSessions) => 2026-10-23T23:34:25.8712491Z ·  ──────┬───── 2026-10-23T23:34:25.8712974Z · ╰── 'stopSessions' is declared here 2026-10-23T23:34:25.8713264Z 286 │ effect.pipe( 2026-10-23T23:34:25.8713406Z ╰──── 2026-10-23T23:34:25.8713573Z  help: Consider removing this parameter. 2026-10-23T23:34:25.8713699Z 2026-10-23T23:34:25.8713875Z ⚠ eslint(no-empty-pattern): Empty array binding pattern 2026-10-23T23:34:25.8714292Z ╭─[apps/server/src/pullRequest/PullRequestService.test.ts:1526:12] 2026-10-23T23:34:25.8714521Z 1525 │ 2026-10-23T23:34:25.8714656Z 1526 │ for (const [] of [ 2026-10-23T23:34:25.8714823Z ·  ── 2026-10-23T23:34:25.8714994Z 1527 │ ["github", "github.com"], 2026-10-23T23:34:25.8715142Z ╰──── 2026-10-23T23:34:25.8715515Z  help: Passing non-iterable values (null, undefined, numbers, booleans, etc.) will result in a runtime error because these values are not iterable. 2026-10-23T23:34:25.8715801Z 2026-10-23T23:34:25.8716033Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-23T23:34:25.8716368Z ╭─[apps/mobile/src/Stack.tsx:1068:21] 2026-10-23T23:34:25.8716560Z 1067 │ } 2026-10-23T23:34:25.8717083Z ·  ───────────────────────────────────────────── 2026-10-23T23:34:25.8717300Z 1069 │ screenListeners={{ 2026-10-23T23:34:25.8717450Z ╰──── 2026-10-23T23:34:25.8717900Z  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-23T23:34:25.8718258Z 2026-10-23T23:34:25.8718480Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T23:34:25.8718872Z ╭─[apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx:814:17] 2026-10-23T23:34:25.8719129Z 813 │
    { 2026-10-23T23:34:25.8726377Z ╰──── 2026-10-23T23:34:25.8726745Z  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-23T23:34:25.8727354Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T23:34:25.8727658Z 2026-10-23T23:34:25.8727945Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T23:34:25.8728408Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:119:10] 2026-10-23T23:34:25.8728667Z 117 │ 2026-10-23T23:34:25.8728799Z 118 │ useEffect(() => { 2026-10-23T23:34:25.8728963Z ·  ────┬──── 2026-10-23T23:34:25.8729204Z · ╰── This is the containing effect 2026-10-23T23:34:25.8729435Z 119 │ void refreshNotifications(); 2026-10-23T23:34:25.8729640Z ·  ──────────┬───────── 2026-10-23T23:34:25.8729937Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.8730275Z 120 │ const subscription = AppState.addEventListener("change", (state) => { 2026-10-23T23:34:25.8730491Z ╰──── 2026-10-23T23:34:25.8731206Z  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-23T23:34:25.8732238Z  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-23T23:34:25.8732602Z 2026-10-23T23:34:25.8732884Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T23:34:25.8733346Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7] 2026-10-23T23:34:25.8733629Z 125 │ 2026-10-23T23:34:25.8733762Z 126 │ useEffect(() => { 2026-10-23T23:34:25.8733925Z ·  ────┬──── 2026-10-23T23:34:25.8734199Z · ╰── This is the containing effect 2026-10-23T23:34:25.8734411Z 127 │ if (!isLoaded) { 2026-10-23T23:34:25.8734595Z 128 │ setLiveActivityStatus("checking"); 2026-10-23T23:34:25.8734804Z ·  ──────────┬────────── 2026-10-23T23:34:25.8735104Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.8735355Z 129 │ return; 2026-10-23T23:34:25.8735485Z ╰──── 2026-10-23T23:34:25.8736371Z  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-23T23:34:25.8737307Z  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-23T23:34:25.8737632Z 2026-10-23T23:34:25.8737853Z ⚠ eslint(no-unused-vars): Identifier 'Fiber' is imported but never used. 2026-10-23T23:34:25.8738165Z ╭─[apps/server/src/ws.ts:10:13] 2026-10-23T23:34:25.8738376Z  9 │ import * as Effect from "effect/Effect"; 2026-10-23T23:34:25.8738579Z 10 │ import * as Fiber from "effect/Fiber"; 2026-10-23T23:34:25.8738764Z ·  ──┬── 2026-10-23T23:34:25.8739001Z · ╰── 'Fiber' is imported here 2026-10-23T23:34:25.8739252Z 11 │ import * as FileSystem from "effect/FileSystem"; 2026-10-23T23:34:25.8739427Z ╰──── 2026-10-23T23:34:25.8739590Z  help: Consider removing this import. 2026-10-23T23:34:25.8739711Z 2026-10-23T23:34:25.8739922Z ⚠ eslint(no-unused-vars): Identifier 'Schedule' is imported but never used. 2026-10-23T23:34:25.8740227Z ╭─[apps/server/src/ws.ts:17:13] 2026-10-23T23:34:25.8740430Z 16 │ import * as Ref from "effect/Ref"; 2026-10-23T23:34:25.8740635Z 17 │ import * as Schedule from "effect/Schedule"; 2026-10-23T23:34:25.8740833Z ·  ────┬─── 2026-10-23T23:34:25.8741198Z · ╰── 'Schedule' is imported here 2026-10-23T23:34:25.8741437Z 18 │ import * as Schema from "effect/Schema"; 2026-10-23T23:34:25.8741603Z ╰──── 2026-10-23T23:34:25.8741762Z  help: Consider removing this import. 2026-10-23T23:34:25.8741883Z 2026-10-23T23:34:25.8742210Z ⚠ eslint(no-unused-vars): Variable 'projectSetupScriptRunner' is declared but never used. Unused variables should start with a '_'. 2026-10-23T23:34:25.8742617Z ╭─[apps/server/src/ws.ts:1285:13] 2026-10-23T23:34:25.8742909Z 1284 │ const usageLimitSources = yield* UsageLimitSources.UsageLimitSources; 2026-10-23T23:34:25.8743455Z 1285 │ const projectSetupScriptRunner = yield* ProjectSetupScriptRunner.ProjectSetupScriptRunner; 2026-10-23T23:34:25.8743858Z ·  ────────────┬─────────── 2026-10-23T23:34:25.8744217Z · ╰── 'projectSetupScriptRunner' is declared here 2026-10-23T23:34:25.8744580Z 1286 │ const worktreeSetupTracker = yield* WorktreeSetupTracker.WorktreeSetupTracker; 2026-10-23T23:34:25.8744827Z ╰──── 2026-10-23T23:34:25.8744996Z  help: Consider removing this declaration. 2026-10-23T23:34:25.8745123Z 2026-10-23T23:34:25.8745377Z ⚠ eslint(no-unneeded-ternary): Unnecessary use of boolean literals in conditional expression 2026-10-23T23:34:25.8745758Z ╭─[packages/shared/src/serverSettings.test.ts:35:7] 2026-10-23T23:34:25.8746109Z 34 │ const fallback = fallbackTextGenerationModelSelection(providerInstances, (instanceId) => 2026-10-23T23:34:25.8746416Z 35 │ instanceId === configured ? true : false, 2026-10-23T23:34:25.8746667Z ·  ──────────────────────────────────────── 2026-10-23T23:34:25.8746853Z 36 │ ); 2026-10-23T23:34:25.8746977Z ╰──── 2026-10-23T23:34:25.8747135Z  help: Remove this ternary operator 2026-10-23T23:34:25.8747255Z 2026-10-23T23:34:25.8747543Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T23:34:25.8747939Z ╭─[apps/server/src/serverRuntimeStartup.ts:728:7] 2026-10-23T23:34:25.8748141Z 727 │ 2026-10-23T23:34:25.8748288Z 728 │ const layer = layerWithOptions(); 2026-10-23T23:34:25.8748472Z ·  ──┬── 2026-10-23T23:34:25.8748705Z · ╰── 'layer' is declared here 2026-10-23T23:34:25.8748904Z ╰──── 2026-10-23T23:34:25.8749075Z  help: Consider removing this declaration. 2026-10-23T23:34:25.8749202Z 2026-10-23T23:34:25.8749443Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-23T23:34:25.8749801Z ╭─[packages/shared/src/serverSettings.ts:346:9] 2026-10-23T23:34:25.8750046Z 345 │ const entry: ProjectSettingsOverrides = { 2026-10-23T23:34:25.8750312Z 346 │ ...(entries.get(projectId) ?? currentEntries[projectId] ?? {}), 2026-10-23T23:34:25.8750632Z ·  ────────────────────────────────────────────────────────────── 2026-10-23T23:34:25.8750854Z 347 │ }; 2026-10-23T23:34:25.8750980Z ╰──── 2026-10-23T23:34:25.8751338Z  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-23T23:34:25.8751620Z 2026-10-23T23:34:25.8751862Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in Array.prototype.reduce() 2026-10-23T23:34:25.8752226Z ╭─[packages/shared/src/serverSettings.ts:448:24] 2026-10-23T23:34:25.8752437Z 447 │ const favorites = 2026-10-23T23:34:25.8752642Z 448 │ setModelFavorites?.reduce((current, change) => { 2026-10-23T23:34:25.8752866Z ·  ───┬── 2026-10-23T23:34:25.8753114Z · ╰── For this reduce 2026-10-23T23:34:25.8753339Z 449 │ const exists = current.some( 2026-10-23T23:34:25.8753636Z 450 │ (favorite) => favorite.provider === change.provider && favorite.model === change.model, 2026-10-23T23:34:25.8753888Z 451 │ ); 2026-10-23T23:34:25.8754166Z 452 │ return change.favorite 2026-10-23T23:34:25.8754377Z 453 │ ? exists 2026-10-23T23:34:25.8754526Z 454 │ ? current 2026-10-23T23:34:25.8754758Z 455 │ : [...current, { provider: change.provider, model: change.model }] 2026-10-23T23:34:25.8755005Z ·  ─────┬──── 2026-10-23T23:34:25.8755240Z · ╰── From this spread 2026-10-23T23:34:25.8755450Z 456 │ : current.filter( 2026-10-23T23:34:25.8755599Z ╰──── 2026-10-23T23:34:25.8755881Z  help: Consider using `Object.assign()` or `Array.prototype.push()` to mutate the accumulator instead. 2026-10-23T23:34:25.8756276Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-23T23:34:25.8756455Z 2026-10-23T23:34:25.8756670Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-23T23:34:25.8756999Z ╭─[packages/shared/src/serverSettings.ts:466:3] 2026-10-23T23:34:25.8757203Z 464 │ null; 2026-10-23T23:34:25.8757400Z 465 │ let nextModelPreferences = initialModelPreferences; 2026-10-23T23:34:25.8757638Z ·  ──────────┬───────── 2026-10-23T23:34:25.8757882Z · ╰── From this accumulator 2026-10-23T23:34:25.8758139Z 466 │ for (const change of setModelsHidden ?? []) { 2026-10-23T23:34:25.8758334Z ·  ─┬─ 2026-10-23T23:34:25.8758453Z · ╰── For this loop 2026-10-23T23:34:25.8758605Z 467 │ const preferences = nextModelPreferences?.[change.provider] ?? { 2026-10-23T23:34:25.8758678Z 468 │ hiddenModels: [], 2026-10-23T23:34:25.8758760Z 469 │ modelOrder: [], 2026-10-23T23:34:25.8758827Z 470 │ }; 2026-10-23T23:34:25.8759025Z 471 │ const hiddenModels = preferences.hiddenModels.filter((model) => model !== change.model); 2026-10-23T23:34:25.8759142Z 472 │ if (change.hidden) hiddenModels.push(change.model); 2026-10-23T23:34:25.8759223Z 473 │ nextModelPreferences = { 2026-10-23T23:34:25.8759307Z 474 │ ...nextModelPreferences, 2026-10-23T23:34:25.8759413Z ·  ───────────┬─────────── 2026-10-23T23:34:25.8759549Z · ╰── From this spread 2026-10-23T23:34:25.8759672Z 475 │ [change.provider]: { ...preferences, hiddenModels }, 2026-10-23T23:34:25.8759732Z ╰──── 2026-10-23T23:34:25.8759904Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-23T23:34:25.8760147Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-23T23:34:25.8760189Z 2026-10-23T23:34:25.8760396Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T23:34:25.8760575Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:100:85] 2026-10-23T23:34:25.8760687Z  99 │ const startEditor = startScheduledTaskEditor; 2026-10-23T23:34:25.8760887Z 100 │ const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]); 2026-10-23T23:34:25.8761044Z ·  ─────┬───── 2026-10-23T23:34:25.8761273Z · ╰── Unnecessary dependency `startEditor` 2026-10-23T23:34:25.8761361Z 101 │ const readEditor = useCallback( 2026-10-23T23:34:25.8761425Z ╰──── 2026-10-23T23:34:25.8761779Z  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-23T23:34:25.8762124Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.8762127Z 2026-10-23T23:34:25.8762327Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T23:34:25.8762501Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:121:7] 2026-10-23T23:34:25.8762571Z 120 │ setEditor, 2026-10-23T23:34:25.8762638Z 121 │ startEditor, 2026-10-23T23:34:25.8762724Z ·  ─────┬───── 2026-10-23T23:34:25.8762890Z · ╰── Unnecessary dependency `startEditor` 2026-10-23T23:34:25.8762960Z 122 │ hasChanges, 2026-10-23T23:34:25.8763016Z ╰──── 2026-10-23T23:34:25.8763356Z  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-23T23:34:25.8763696Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.8763699Z 2026-10-23T23:34:25.8764213Z ⚠ 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-23T23:34:25.8764375Z ╭─[apps/server/src/provider/acp/AntigravityProtocol.ts:263:20] 2026-10-23T23:34:25.8764466Z 262 │ ...(update._meta !== undefined 2026-10-23T23:34:25.8764647Z 263 │ ? { _meta: Schema.is(Schema.Record(Schema.String, Schema.Json))(meta) ? meta : null } 2026-10-23T23:34:25.8764744Z ·  ───────── 2026-10-23T23:34:25.8764810Z 264 │ : {}), 2026-10-23T23:34:25.8764867Z ╰──── 2026-10-23T23:34:25.8764870Z 2026-10-23T23:34:25.8765182Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-23T23:34:25.8765367Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:473:19] 2026-10-23T23:34:25.8765433Z 472 │ onFilters, 2026-10-23T23:34:25.8765505Z 473 │ authorOptions = [], 2026-10-23T23:34:25.8765590Z ·  ── 2026-10-23T23:34:25.8765728Z 474 │ labelOptions = [], 2026-10-23T23:34:25.8765819Z ╰──── 2026-10-23T23:34:25.8766177Z  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-23T23:34:25.8766180Z 2026-10-23T23:34:25.8766490Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-23T23:34:25.8766673Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:474:18] 2026-10-23T23:34:25.8766747Z 473 │ authorOptions = [], 2026-10-23T23:34:25.8766816Z 474 │ labelOptions = [], 2026-10-23T23:34:25.8766899Z ·  ── 2026-10-23T23:34:25.8766966Z 475 │ optionScope, 2026-10-23T23:34:25.8767023Z ╰──── 2026-10-23T23:34:25.8767367Z  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-23T23:34:25.8767373Z 2026-10-23T23:34:25.8767889Z ⚠ 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-23T23:34:25.8768037Z ╭─[apps/server/src/project/ProjectService.test.ts:94:3] 2026-10-23T23:34:25.8768099Z 93 │ ) { 2026-10-23T23:34:25.8768325Z 94 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T23:34:25.8768515Z 95 │ │ const project = Option.getOrThrow(yield* service.getById(projectId)); 2026-10-23T23:34:25.8768655Z 96 │ │ if (predicate(project)) return project; 2026-10-23T23:34:25.8768768Z 97 │ │ yield* Effect.yieldNow; 2026-10-23T23:34:25.8768906Z 98 │ ╰─▶ } 2026-10-23T23:34:25.8769066Z 99 │ return yield* Effect.die(`Project ${projectId} was not enriched in time.`); 2026-10-23T23:34:25.8769124Z ╰──── 2026-10-23T23:34:25.8769127Z 2026-10-23T23:34:25.8769634Z ⚠ 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-23T23:34:25.8769806Z ╭─[apps/server/src/project/ProjectEnrichmentService.test.ts:28:3] 2026-10-23T23:34:25.8769866Z 27 │ ) { 2026-10-23T23:34:25.8770088Z 28 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T23:34:25.8770244Z 29 │ │ const available = yield* service.peek(workspaceRoot); 2026-10-23T23:34:25.8770379Z 30 │ │ if (predicate(available)) return available; 2026-10-23T23:34:25.8770484Z 31 │ │ yield* Effect.yieldNow; 2026-10-23T23:34:25.8770616Z 32 │ ╰─▶ } 2026-10-23T23:34:25.8770807Z 33 │ return yield* Effect.die(`Project metadata for ${workspaceRoot} was not resolved in time.`); 2026-10-23T23:34:25.8770865Z ╰──── 2026-10-23T23:34:25.8770868Z 2026-10-23T23:34:25.8771101Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-23T23:34:25.8771311Z ╭─[packages/shared/src/composerContextLegacySend.ts:19:45] 2026-10-23T23:34:25.8771502Z 18 │ const occurrences = collectComposerContextReferences(text); 2026-10-23T23:34:25.8771620Z 19 │ for (const occurrence of [...occurrences].reverse()) { 2026-10-23T23:34:25.8771743Z ·  ─────── 2026-10-23T23:34:25.8771860Z 20 │ const record = recordsById.get(occurrence.contextId); 2026-10-23T23:34:25.8771918Z ╰──── 2026-10-23T23:34:25.8772213Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-23T23:34:25.8772216Z 2026-10-23T23:34:25.8772428Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-23T23:34:25.8772553Z ╭─[apps/mobile/src/lib/useHoverGesture.ts:8:15] 2026-10-23T23:34:25.8772623Z 7 │ () => 2026-10-23T23:34:25.8772700Z 8 │ Gesture.Hover() 2026-10-23T23:34:25.8772784Z ·  ──┬── 2026-10-23T23:34:25.8772930Z · ╰── `Hover` may be a component 2026-10-23T23:34:25.8773012Z 9 │ .manualActivation(true) 2026-10-23T23:34:25.8773069Z ╰──── 2026-10-23T23:34:25.8773379Z  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-23T23:34:25.8773877Z  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-23T23:34:25.8773883Z 2026-10-23T23:34:25.8774123Z ⚠ eslint(no-control-regex): Unexpected control character 2026-10-23T23:34:25.8774338Z ╭─[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46] 2026-10-23T23:34:25.8774494Z 219 │ 2026-10-23T23:34:25.8774655Z 220 │ {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")} 2026-10-23T23:34:25.8774772Z ·  ──┬─ 2026-10-23T23:34:25.8774957Z · ╰── 'U+001B' is a control character. 2026-10-23T23:34:25.8775027Z 221 │ 2026-10-23T23:34:25.8775084Z ╰──── 2026-10-23T23:34:25.8775336Z  help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression. 2026-10-23T23:34:25.8775339Z 2026-10-23T23:34:25.8775657Z ⚠ eslint(no-unused-vars): Variable 'layerUnavailable' is declared but never used. Unused variables should start with a '_'. 2026-10-23T23:34:25.8775820Z ╭─[apps/server/src/orchestration-v2/Orchestrator.ts:12340:7] 2026-10-23T23:34:25.8775881Z 12339 │ 2026-10-23T23:34:25.8776222Z 12340 │ const layerUnavailable: Layer.Layer = Layer.succeed( 2026-10-23T23:34:25.8776322Z ·  ────────┬─────── 2026-10-23T23:34:25.8776485Z · ╰── 'layerUnavailable' is declared here 2026-10-23T23:34:25.8776573Z 12341 │ OrchestratorV2, 2026-10-23T23:34:25.8776627Z ╰──── 2026-10-23T23:34:25.8776742Z  help: Consider removing this declaration. 2026-10-23T23:34:25.8776745Z 2026-10-23T23:34:25.8777062Z ⚠ eslint(no-unused-vars): Type 'Scope' is imported but never used. 2026-10-23T23:34:25.8777275Z ╭─[apps/server/src/provider/ProviderAuthService.ts:15:18] 2026-10-23T23:34:25.8777368Z 14 │ import * as Layer from "effect/Layer"; 2026-10-23T23:34:25.8777471Z 15 │ import type * as Scope from "effect/Scope"; 2026-10-23T23:34:25.8777558Z ·  ──┬── 2026-10-23T23:34:25.8777706Z · ╰── 'Scope' is imported here 2026-10-23T23:34:25.8777799Z 16 │ import * as Stream from "effect/Stream"; 2026-10-23T23:34:25.8777856Z ╰──── 2026-10-23T23:34:25.8777964Z  help: Consider removing this import. 2026-10-23T23:34:25.8777967Z 2026-10-23T23:34:25.8778259Z ⚠ eslint(no-unused-vars): Variable 'claudeCaps' is declared but never used. Unused variables should start with a '_'. 2026-10-23T23:34:25.8778384Z ╭─[packages/shared/src/model.test.ts:36:7] 2026-10-23T23:34:25.8778443Z 35 │ 2026-10-23T23:34:25.8778586Z 36 │ const claudeCaps: ModelCapabilities = createModelCapabilities({ 2026-10-23T23:34:25.8778668Z ·  ─────┬──── 2026-10-23T23:34:25.8778814Z · ╰── 'claudeCaps' is declared here 2026-10-23T23:34:25.8778885Z 37 │ optionDescriptors: [ 2026-10-23T23:34:25.8778941Z ╰──── 2026-10-23T23:34:25.8779054Z  help: Consider removing this declaration. 2026-10-23T23:34:25.8779057Z 2026-10-23T23:34:25.8779574Z ⚠ 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-23T23:34:25.8779710Z ╭─[packages/shared/src/atomicWrite.test.ts:139:5] 2026-10-23T23:34:25.8779797Z 138 │ Effect.gen(function* () { 2026-10-23T23:34:25.8780012Z 139 │ ╭─▶ while (fiber.pollUnsafe() === undefined) { 2026-10-23T23:34:25.8780144Z 140 │ │ yield* TestClock.adjust("100 millis"); 2026-10-23T23:34:25.8780498Z 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-23T23:34:25.8780703Z 142 │ │ yield* Effect.promise(() => new Promise((resolve) => setImmediate(resolve))); 2026-10-23T23:34:25.8780847Z 143 │ ╰─▶ } 2026-10-23T23:34:25.8780942Z 144 │ return yield* Fiber.join(fiber); 2026-10-23T23:34:25.8780997Z ╰──── 2026-10-23T23:34:25.8781009Z 2026-10-23T23:34:25.8781224Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T23:34:25.8781383Z ╭─[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9] 2026-10-23T23:34:25.8781481Z 35 │ ` or list indent), 2026-10-23T23:34:25.8785317Z ╰──── 2026-10-23T23:34:25.8785597Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-23T23:34:25.8785600Z 2026-10-23T23:34:25.8785844Z ⚠ eslint(no-unused-vars): Function 'assertUserMessagesExclude' is declared but never used. 2026-10-23T23:34:25.8786018Z ╭─[apps/server/src/orchestration-v2/testkit/fixtures/shared.ts:1398:10] 2026-10-23T23:34:25.8786077Z 1397 │ 2026-10-23T23:34:25.8786174Z 1398 │ function assertUserMessagesExclude( 2026-10-23T23:34:25.8786285Z ·  ────────────┬──────────── 2026-10-23T23:34:25.8786472Z · ╰── 'assertUserMessagesExclude' is declared here 2026-10-23T23:34:25.8786591Z 1399 │ projection: OrchestrationV2ThreadProjection, 2026-10-23T23:34:25.8786648Z ╰──── 2026-10-23T23:34:25.8786759Z  help: Consider removing this declaration. 2026-10-23T23:34:25.8786762Z 2026-10-23T23:34:25.8786936Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T23:34:25.8787095Z ╭─[apps/server/src/provider/Drivers/CodexDriver.test.ts:466:14] 2026-10-23T23:34:25.8787153Z 465 │ 2026-10-23T23:34:25.8787267Z 466 │ for (const {} of ["direct", "wrapper"] as const) { 2026-10-23T23:34:25.8787342Z ·  ── 2026-10-23T23:34:25.8787401Z 467 │ } 2026-10-23T23:34:25.8787456Z ╰──── 2026-10-23T23:34:25.8787773Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T23:34:25.8787816Z 2026-10-23T23:34:25.8787978Z ⚠ react(refs): Cannot access refs during render 2026-10-23T23:34:25.8788160Z ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14] 2026-10-23T23:34:25.8788249Z 26 │ const latestInput = useRef(input); 2026-10-23T23:34:25.8788331Z 27 │ latestInput.current = input; 2026-10-23T23:34:25.8788446Z ·  ─────┬─────────┬─── 2026-10-23T23:34:25.8788643Z · │ ╰── Cannot update ref value during render 2026-10-23T23:34:25.8788766Z · ╰── This value is a ref 2026-10-23T23:34:25.8788849Z 28 │ const mounted = useRef(true); 2026-10-23T23:34:25.8788910Z ╰──── 2026-10-23T23:34:25.8789445Z  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-23T23:34:25.8789767Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T23:34:25.8789770Z 2026-10-23T23:34:25.8790014Z ⚠ eslint(no-unused-vars): Function 'resolveThreadWorkspaceCwd' is declared but never used. 2026-10-23T23:34:25.8790141Z ╭─[apps/server/src/checkpointing/Utils.ts:12:10] 2026-10-23T23:34:25.8790195Z 11 │ 2026-10-23T23:34:25.8790298Z 12 │ function resolveThreadWorkspaceCwd(input: { 2026-10-23T23:34:25.8790411Z ·  ────────────┬──────────── 2026-10-23T23:34:25.8790594Z · ╰── 'resolveThreadWorkspaceCwd' is declared here 2026-10-23T23:34:25.8790664Z 13 │ readonly thread: { 2026-10-23T23:34:25.8790720Z ╰──── 2026-10-23T23:34:25.8790831Z  help: Consider removing this declaration. 2026-10-23T23:34:25.8790834Z 2026-10-23T23:34:25.8791114Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T23:34:25.8791292Z ╭─[apps/mobile/src/features/review/ReviewCommentComposerSheet.tsx:103:7] 2026-10-23T23:34:25.8791349Z 100 │ 2026-10-23T23:34:25.8791419Z 101 │ useEffect(() => { 2026-10-23T23:34:25.8791496Z ·  ────┬──── 2026-10-23T23:34:25.8791702Z · ╰── This is the containing effect 2026-10-23T23:34:25.8791851Z 102 │ if (!target || selectedLines.length === 0) { 2026-10-23T23:34:25.8791944Z 103 │ setHighlightedLinesById({}); 2026-10-23T23:34:25.8792052Z ·  ───────────┬─────────── 2026-10-23T23:34:25.8792241Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.8792310Z 104 │ return; 2026-10-23T23:34:25.8792365Z ╰──── 2026-10-23T23:34:25.8793020Z  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-23T23:34:25.8793383Z  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-23T23:34:25.8793388Z 2026-10-23T23:34:25.8793600Z ⚠ eslint(no-unsafe-optional-chaining): Unsafe usage of optional chaining 2026-10-23T23:34:25.8793779Z ╭─[apps/server/src/orchestration-v2/ThreadLaunchService.test.ts:1783:8] 2026-10-23T23:34:25.8793849Z 1782 │ assert.equal( 2026-10-23T23:34:25.8794005Z 1783 │ (stored.context?.records[0] as { attachmentId: string }).attachmentId, 2026-10-23T23:34:25.8794169Z ·  ────────────────────────── 2026-10-23T23:34:25.8794258Z 1784 │ stored.attachments[0]?.id, 2026-10-23T23:34:25.8794317Z ╰──── 2026-10-23T23:34:25.8794518Z  help: If this short-circuits with 'undefined' the evaluation will throw TypeError 2026-10-23T23:34:25.8794521Z 2026-10-23T23:34:25.8795053Z ⚠ 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-23T23:34:25.8795262Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7] 2026-10-23T23:34:25.8795382Z 565 │ let afterSequence = created[0]!.sequence; 2026-10-23T23:34:25.8795599Z 566 │ ╭─▶ for (let index = 1; index <= 32; index += 1) { 2026-10-23T23:34:25.8795712Z 567 │ │ const nextEvent = { 2026-10-23T23:34:25.8795887Z 568 │ │ id: EventId.make(`event:foundation-stream-race:${index}`), 2026-10-23T23:34:25.8796036Z 569 │ │ type: "thread.metadata-updated" as const, 2026-10-23T23:34:25.8796138Z 570 │ │ threadId, 2026-10-23T23:34:25.8796250Z 571 │ │ providerInstanceId, 2026-10-23T23:34:25.8796355Z 572 │ │ occurredAt: now, 2026-10-23T23:34:25.8796516Z 573 │ │ payload: { ...thread, title: `Race update ${index}` }, 2026-10-23T23:34:25.8796655Z 574 │ │ } satisfies OrchestrationV2DomainEvent; 2026-10-23T23:34:25.8796779Z 575 │ │ const reader = yield* eventSink 2026-10-23T23:34:25.8796907Z 576 │ │ .stream({ threadId, afterSequence }) 2026-10-23T23:34:25.8797049Z 577 │ │ .pipe(Stream.runHead, Effect.forkChild); 2026-10-23T23:34:25.8797163Z 578 │ │ yield* Effect.yieldNow; 2026-10-23T23:34:25.8797398Z 579 │ │ const written = yield* eventSink.write({ events: [nextEvent] }); 2026-10-23T23:34:25.8797578Z 580 │ │ const received = yield* Fiber.join(reader); 2026-10-23T23:34:25.8797703Z 581 │ │ if (Option.isNone(received)) { 2026-10-23T23:34:25.8797922Z 582 │ │ return yield* Effect.die("The event stream ended before delivering the live event."); 2026-10-23T23:34:25.8798007Z 583 │ │ } 2026-10-23T23:34:25.8798180Z 584 │ │ assert.equal(received.value.sequence, written[0]?.sequence); 2026-10-23T23:34:25.8798336Z 585 │ │ assert.equal(received.value.event.id, nextEvent.id); 2026-10-23T23:34:25.8798478Z 586 │ │ afterSequence = received.value.sequence; 2026-10-23T23:34:25.8798629Z 587 │ ╰─▶ } 2026-10-23T23:34:25.8798696Z 588 │ }), 2026-10-23T23:34:25.8798750Z ╰──── 2026-10-23T23:34:25.8798753Z 2026-10-23T23:34:25.8799257Z ⚠ 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-23T23:34:25.8799441Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:2327:9] 2026-10-23T23:34:25.8799526Z 2326 │ let settled = false; 2026-10-23T23:34:25.8799696Z 2327 │ ╭─▶ while (!settled) { 2026-10-23T23:34:25.8799870Z 2328 │ │ settled = (yield* outbox.listByCommandId(commandId)).every( 2026-10-23T23:34:25.8800020Z 2329 │ │ (effect) => effect.status === "succeeded", 2026-10-23T23:34:25.8800114Z 2330 │ │ ); 2026-10-23T23:34:25.8800247Z 2331 │ │ if (!settled) yield* Effect.yieldNow; 2026-10-23T23:34:25.8800395Z 2332 │ ╰─▶ } 2026-10-23T23:34:25.8800522Z 2333 │ }).pipe(Effect.provide(layerWorker), Effect.scoped); 2026-10-23T23:34:25.8800580Z ╰──── 2026-10-23T23:34:25.8800583Z 2026-10-23T23:34:25.8800876Z ⚠ eslint(no-unused-vars): Variable 'layerDaemon' is declared but never used. Unused variables should start with a '_'. 2026-10-23T23:34:25.8801025Z ╭─[apps/server/src/orchestration-v2/EffectWorker.ts:914:7] 2026-10-23T23:34:25.8801081Z 913 │ 2026-10-23T23:34:25.8801291Z 914 │ const layerDaemon: Layer.Layer = Layer.effectDiscard( 2026-10-23T23:34:25.8801379Z ·  ─────┬───── 2026-10-23T23:34:25.8801524Z · ╰── 'layerDaemon' is declared here 2026-10-23T23:34:25.8801619Z 915 │ runDaemon.pipe(Effect.forkScoped), 2026-10-23T23:34:25.8801676Z ╰──── 2026-10-23T23:34:25.8801794Z  help: Consider removing this declaration. 2026-10-23T23:34:25.8801801Z 2026-10-23T23:34:25.8802012Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T23:34:25.8802199Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:555:70] 2026-10-23T23:34:25.8802289Z 554 │ assert.deepStrictEqual( 2026-10-23T23:34:25.8802530Z 555 │ (yield* Ref.get(fixture.syncCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-23T23:34:25.8802706Z ·  ┬ 2026-10-23T23:34:25.8802910Z · ╰── '_' is declared here 2026-10-23T23:34:25.8802980Z 556 │ [ 2026-10-23T23:34:25.8803036Z ╰──── 2026-10-23T23:34:25.8803145Z  help: Consider removing this parameter. 2026-10-23T23:34:25.8803148Z 2026-10-23T23:34:25.8803343Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T23:34:25.8803530Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:1155:70] 2026-10-23T23:34:25.8803621Z 1154 │ assert.deepStrictEqual( 2026-10-23T23:34:25.8803799Z 1155 │ (yield* Ref.get(fixture.linkCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-23T23:34:25.8803936Z ·  ┬ 2026-10-23T23:34:25.8804158Z · ╰── '_' is declared here 2026-10-23T23:34:25.8804227Z 1156 │ [ 2026-10-23T23:34:25.8804281Z ╰──── 2026-10-23T23:34:25.8804390Z  help: Consider removing this parameter. 2026-10-23T23:34:25.8804394Z 2026-10-23T23:34:25.8804638Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-23T23:34:25.8804770Z ╭─[apps/server/src/terminal/Manager.test.ts:731:31] 2026-10-23T23:34:25.8804829Z 730 │ ); 2026-10-23T23:34:25.8805018Z 731 │ const snapshot = events.filter((event) => event.type === "snapshot").at(-1)?.snapshot; 2026-10-23T23:34:25.8805130Z ·  ────── 2026-10-23T23:34:25.8805269Z 732 │ expect(snapshot?.history).toBe("aa😀\rEND"); 2026-10-23T23:34:25.8805322Z ╰──── 2026-10-23T23:34:25.8805504Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-23T23:34:25.8805507Z 2026-10-23T23:34:25.8805872Z ⚠ eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'. 2026-10-23T23:34:25.8806048Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1444:7] 2026-10-23T23:34:25.8806107Z 1443 │ 2026-10-23T23:34:25.8806226Z 1444 │ const layerCodexAppServerClientFactoryCommand = ( 2026-10-23T23:34:25.8806353Z ·  ───────────────────┬─────────────────── 2026-10-23T23:34:25.8806581Z · ╰── 'layerCodexAppServerClientFactoryCommand' is declared here 2026-10-23T23:34:25.8806718Z 1445 │ options: CodexClient.CodexAppServerClientOptions & { 2026-10-23T23:34:25.8806772Z ╰──── 2026-10-23T23:34:25.8806882Z  help: Consider removing this declaration. 2026-10-23T23:34:25.8806885Z 2026-10-23T23:34:25.8807160Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T23:34:25.8807332Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1680:7] 2026-10-23T23:34:25.8807388Z 1679 │ 2026-10-23T23:34:25.8807465Z 1680 │ const layer: Layer.Layer< 2026-10-23T23:34:25.8807543Z ·  ──┬── 2026-10-23T23:34:25.8807735Z · ╰── 'layer' is declared here 2026-10-23T23:34:25.8807887Z 1681 │ ProviderAdapter.ProviderAdapterV2, 2026-10-23T23:34:25.8807944Z ╰──── 2026-10-23T23:34:25.8808053Z  help: Consider removing this declaration. 2026-10-23T23:34:25.8808055Z 2026-10-23T23:34:25.8808324Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T23:34:25.8808460Z ╭─[packages/provider-grok/src/server/adapter.ts:408:7] 2026-10-23T23:34:25.8808518Z 407 │ 2026-10-23T23:34:25.8808594Z 408 │ const layer: Layer.Layer< 2026-10-23T23:34:25.8808670Z ·  ──┬── 2026-10-23T23:34:25.8808799Z · ╰── 'layer' is declared here 2026-10-23T23:34:25.8808897Z 409 │ ProviderAdapter.ProviderAdapterV2, 2026-10-23T23:34:25.8808952Z ╰──── 2026-10-23T23:34:25.8809067Z  help: Consider removing this declaration. 2026-10-23T23:34:25.8809076Z 2026-10-23T23:34:25.8809570Z ⚠ 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-23T23:34:25.8809728Z ╭─[apps/server/src/background/HostPowerMonitor.test.ts:133:11] 2026-10-23T23:34:25.8809872Z 132 │ const monitor = yield* HostPowerMonitor.HostPowerMonitor; 2026-10-23T23:34:25.8810026Z 133 │ ╭─▶ for ( 2026-10-23T23:34:25.8810137Z 134 │ │ let attempt = 0; 2026-10-23T23:34:25.8810321Z 135 │ │ attempt < 100 && (yield* monitor.snapshot).onBattery !== "true"; 2026-10-23T23:34:25.8810432Z 136 │ │ attempt += 1 2026-10-23T23:34:25.8810521Z 137 │ │ ) { 2026-10-23T23:34:25.8810640Z 138 │ │ yield* Effect.yieldNow; 2026-10-23T23:34:25.8810782Z 139 │ ╰─▶ } 2026-10-23T23:34:25.8810914Z 140 │ expect((yield* monitor.snapshot).onBattery).toBe("true"); 2026-10-23T23:34:25.8810973Z ╰──── 2026-10-23T23:34:25.8810975Z 2026-10-23T23:34:25.8811337Z ⚠ 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-23T23:34:25.8811461Z ╭─[packages/effect-acp/src/schema.test.ts:18:12] 2026-10-23T23:34:25.8811639Z 17 │ const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } }; 2026-10-23T23:34:25.8811772Z 18 │ expect(Schema.is(V1.AvailableCommand)(command)).toBe(true); 2026-10-23T23:34:25.8811856Z ·  ───────── 2026-10-23T23:34:25.8811917Z 19 │ expect( 2026-10-23T23:34:25.8811973Z ╰──── 2026-10-23T23:34:25.8811975Z 2026-10-23T23:34:25.8812328Z ⚠ 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-23T23:34:25.8812453Z ╭─[packages/effect-acp/src/schema.test.ts:20:7] 2026-10-23T23:34:25.8812515Z 19 │ expect( 2026-10-23T23:34:25.8812690Z 20 │ Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }), 2026-10-23T23:34:25.8812770Z ·  ───────── 2026-10-23T23:34:25.8812921Z 21 │ ).toBe(true); 2026-10-23T23:34:25.8813013Z ╰──── 2026-10-23T23:34:25.8813019Z 2026-10-23T23:34:25.8813417Z ⚠ 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-23T23:34:25.8813539Z ╭─[packages/effect-acp/src/client.ts:1269:11] 2026-10-23T23:34:25.8813700Z 1268 │ extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) => 2026-10-23T23:34:25.8813882Z 1269 │ Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe( 2026-10-23T23:34:25.8813991Z ·  ────────────────────────── 2026-10-23T23:34:25.8814208Z 1270 │ Effect.mapError(() => AcpError.AcpRequestError.invalidParams()), 2026-10-23T23:34:25.8814264Z ╰──── 2026-10-23T23:34:25.8814266Z 2026-10-23T23:34:25.8814766Z ⚠ 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-23T23:34:25.8814895Z ╭─[packages/effect-acp/src/errors.test.ts:129:28] 2026-10-23T23:34:25.8814995Z 128 │ const secret = "acp-summary-secret"; 2026-10-23T23:34:25.8815111Z 129 │ const cause = yield* Schema.decodeUnknownEffect( 2026-10-23T23:34:25.8815239Z ·  ────────────────────────── 2026-10-23T23:34:25.8815310Z 130 │ Schema.Struct({ 2026-10-23T23:34:25.8815366Z ╰──── 2026-10-23T23:34:25.8815369Z 2026-10-23T23:34:25.8815607Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-23T23:34:25.8815792Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:1998:15] 2026-10-23T23:34:25.8815867Z 1997 │ assert.equal( 2026-10-23T23:34:25.8816171Z 1998 │ items.filter((item) => item.type === "assistant_message").at(-1)?.text, 2026-10-23T23:34:25.8816292Z ·  ────── 2026-10-23T23:34:25.8816378Z 1999 │ "authoritative answer", 2026-10-23T23:34:25.8816434Z ╰──── 2026-10-23T23:34:25.8816612Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-23T23:34:25.8816615Z 2026-10-23T23:34:25.8817111Z ⚠ 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-23T23:34:25.8817401Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:3951:7] 2026-10-23T23:34:25.8817664Z 3950 │ const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped); 2026-10-23T23:34:25.8817879Z 3951 │ ╭─▶ while (!responseLifecycle.includes("failed")) { 2026-10-23T23:34:25.8817995Z 3952 │ │ yield* Effect.yieldNow; 2026-10-23T23:34:25.8818137Z 3953 │ ╰─▶ } 2026-10-23T23:34:25.8818268Z 3954 │ const responseExit = yield* Fiber.join(responseFiber); 2026-10-23T23:34:25.8818320Z ╰──── 2026-10-23T23:34:25.8818326Z 2026-10-23T23:34:25.8818823Z ⚠ 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-23T23:34:25.8819010Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6062:9] 2026-10-23T23:34:25.8819108Z 6061 │ .pipe(Effect.forkScoped); 2026-10-23T23:34:25.8819302Z 6062 │ ╭─▶ while (promptGates.length < 1) { 2026-10-23T23:34:25.8819416Z 6063 │ │ yield* Effect.yieldNow; 2026-10-23T23:34:25.8819561Z 6064 │ ╰─▶ } 2026-10-23T23:34:25.8819742Z 6065 │ assert.isDefined(sessionUpdateHandler, "session update handler must be wired"); 2026-10-23T23:34:25.8819797Z ╰──── 2026-10-23T23:34:25.8819799Z 2026-10-23T23:34:25.8820295Z ⚠ 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-23T23:34:25.8820473Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6197:9] 2026-10-23T23:34:25.8820567Z 6196 │ .pipe(Effect.forkScoped); 2026-10-23T23:34:25.8820777Z 6197 │ ╭─▶ while (promptGates.length < 2) { 2026-10-23T23:34:25.8820894Z 6198 │ │ yield* Effect.yieldNow; 2026-10-23T23:34:25.8821035Z 6199 │ ╰─▶ } 2026-10-23T23:34:25.8821212Z 6200 │ if (sessionUpdateHandler === undefined || capturedMutation.current === null) { 2026-10-23T23:34:25.8821269Z ╰──── 2026-10-23T23:34:25.8821271Z 2026-10-23T23:34:25.8821542Z ⚠ eslint(no-unused-vars): Function 'normalizeTerminalContextSelection' is declared but never used. 2026-10-23T23:34:25.8821665Z ╭─[apps/web/src/lib/terminalContext.ts:56:10] 2026-10-23T23:34:25.8821723Z 55 │ 2026-10-23T23:34:25.8821830Z 56 │ function normalizeTerminalContextSelection( 2026-10-23T23:34:25.8821949Z ·  ────────────────┬──────────────── 2026-10-23T23:34:25.8822150Z · ╰── 'normalizeTerminalContextSelection' is declared here 2026-10-23T23:34:25.8822246Z 57 │ selection: TerminalContextSelection, 2026-10-23T23:34:25.8822301Z ╰──── 2026-10-23T23:34:25.8822412Z  help: Consider removing this declaration. 2026-10-23T23:34:25.8822414Z 2026-10-23T23:34:25.8822969Z ⚠ 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-23T23:34:25.8823136Z ╭─[packages/effect-acp/src/protocol.test.ts:500:31] 2026-10-23T23:34:25.8823194Z 499 │ 2026-10-23T23:34:25.8823316Z 500 │ const response = yield* Schema.decodeUnknownEffect( 2026-10-23T23:34:25.8823446Z ·  ────────────────────────── 2026-10-23T23:34:25.8823558Z 501 │ Schema.fromJsonString(JsonRpcErrorResponse), 2026-10-23T23:34:25.8823616Z ╰──── 2026-10-23T23:34:25.8823619Z 2026-10-23T23:34:25.8823894Z ⚠ eslint(no-unused-vars): Function 'promptResponseHasMissingXAiStopReason' is declared but never used. 2026-10-23T23:34:25.8824094Z ╭─[packages/provider-grok/src/server/xaiAcpExtension.ts:1620:10] 2026-10-23T23:34:25.8824157Z 1619 │ 2026-10-23T23:34:25.8824386Z 1620 │ function promptResponseHasMissingXAiStopReason(response: EffectAcpSchema.PromptResponse): boolean { 2026-10-23T23:34:25.8824510Z ·  ──────────────────┬────────────────── 2026-10-23T23:34:25.8824723Z · ╰── 'promptResponseHasMissingXAiStopReason' is declared here 2026-10-23T23:34:25.8824803Z 1621 │ const meta = response._meta; 2026-10-23T23:34:25.8824860Z ╰──── 2026-10-23T23:34:25.8824969Z  help: Consider removing this declaration. 2026-10-23T23:34:25.8824971Z 2026-10-23T23:34:25.8825237Z ⚠ eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used. 2026-10-23T23:34:25.8825426Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:960:10] 2026-10-23T23:34:25.8825489Z 959 │ 2026-10-23T23:34:25.8825607Z 960 │ function layerClaudeAgentSdkReplayQueryRunner( 2026-10-23T23:34:25.8825729Z ·  ──────────────────┬───────────────── 2026-10-23T23:34:25.8825934Z · ╰── 'layerClaudeAgentSdkReplayQueryRunner' is declared here 2026-10-23T23:34:25.8826043Z 961 │ transcript: ClaudeAgentSdkReplayTranscript, 2026-10-23T23:34:25.8826098Z ╰──── 2026-10-23T23:34:25.8826206Z  help: Consider removing this declaration. 2026-10-23T23:34:25.8826208Z 2026-10-23T23:34:25.8826480Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T23:34:25.8826657Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10578:7] 2026-10-23T23:34:25.8826723Z 10577 │ 2026-10-23T23:34:25.8826808Z 10578 │ const layer: Layer.Layer< 2026-10-23T23:34:25.8826883Z ·  ──┬── 2026-10-23T23:34:25.8827018Z · ╰── 'layer' is declared here 2026-10-23T23:34:25.8827121Z 10579 │ ProviderAdapter.ProviderAdapterV2, 2026-10-23T23:34:25.8827179Z ╰──── 2026-10-23T23:34:25.8827285Z  help: Consider removing this declaration. 2026-10-23T23:34:25.8827291Z 2026-10-23T23:34:25.8827500Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-23T23:34:25.8827641Z ╭─[packages/client-runtime/src/state/usageAccess.ts:3:8] 2026-10-23T23:34:25.8827720Z 2 │ AuthDiagnosticsReadScope, 2026-10-23T23:34:25.8827795Z 3 │ type AuthSessionState, 2026-10-23T23:34:25.8827882Z ·  ────────┬─────── 2026-10-23T23:34:25.8828100Z · ╰── 'AuthSessionState' is imported here 2026-10-23T23:34:25.8828225Z 4 │ sessionGrantsScope, 2026-10-23T23:34:25.8828278Z ╰──── 2026-10-23T23:34:25.8828387Z  help: Consider removing this import. 2026-10-23T23:34:25.8828390Z 2026-10-23T23:34:25.8828670Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-23T23:34:25.8828795Z ╭─[apps/server/src/usage/UsageService.ts:169:7] 2026-10-23T23:34:25.8828853Z 168 │ 2026-10-23T23:34:25.8828935Z 169 │ const layerTest = Layer.succeed( 2026-10-23T23:34:25.8829016Z ·  ────┬──── 2026-10-23T23:34:25.8829159Z · ╰── 'layerTest' is declared here 2026-10-23T23:34:25.8829234Z 170 │ UsageService, 2026-10-23T23:34:25.8829292Z ╰──── 2026-10-23T23:34:25.8829399Z  help: Consider removing this declaration. 2026-10-23T23:34:25.8829402Z 2026-10-23T23:34:25.8829716Z ⚠ eslint(no-unused-vars): Variable 'layerFromProviderAdapter' is declared but never used. Unused variables should start with a '_'. 2026-10-23T23:34:25.8829889Z ╭─[apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts:346:7] 2026-10-23T23:34:25.8829943Z 345 │ 2026-10-23T23:34:25.8830052Z 346 │ const layerFromProviderAdapter: Layer.Layer< 2026-10-23T23:34:25.8830151Z ·  ────────────┬─────────── 2026-10-23T23:34:25.8830329Z · ╰── 'layerFromProviderAdapter' is declared here 2026-10-23T23:34:25.8830409Z 347 │ ProviderAdapterRegistryV2, 2026-10-23T23:34:25.8830464Z ╰──── 2026-10-23T23:34:25.8830579Z  help: Consider removing this declaration. 2026-10-23T23:34:25.8830586Z 2026-10-23T23:34:25.8831077Z ⚠ 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-23T23:34:25.8831213Z ╭─[apps/server/src/usage/UsageService.test.ts:2383:7] 2026-10-23T23:34:25.8831315Z 2382 │ let orphanedAt: number | undefined; 2026-10-23T23:34:25.8831564Z 2383 │ ╭─▶ for (let interruptAt = 1; interruptAt <= 31; interruptAt += 1) { 2026-10-23T23:34:25.8831694Z 2384 │ │ const tasks: Array<() => void> = []; 2026-10-23T23:34:25.8831859Z 2385 │ │ const dispatcher: Scheduler.SchedulerDispatcher = { 2026-10-23T23:34:25.8832000Z 2386 │ │ scheduleTask: (task) => tasks.push(task), 2026-10-23T23:34:25.8832105Z 2387 │ │ flush: () => { 2026-10-23T23:34:25.8832236Z 2388 │ │ let task: (() => void) | undefined; 2026-10-23T23:34:25.8832392Z 2389 │ │ while ((task = tasks.shift()) !== undefined) task(); 2026-10-23T23:34:25.8832478Z 2390 │ │ }, 2026-10-23T23:34:25.8832564Z 2391 │ │ }; 2026-10-23T23:34:25.8832639Z 2392 │ │ 2026-10-23T23:34:25.8832811Z 2393 │ │ let requestFiber: Fiber.Fiber | undefined; 2026-10-23T23:34:25.8832923Z 2394 │ │ let requestChecks = 0; 2026-10-23T23:34:25.8833126Z 2395 │ │ const scheduler: Scheduler.Scheduler = { 2026-10-23T23:34:25.8833289Z 2396 │ │ executionMode: "async", 2026-10-23T23:34:25.8833424Z 2397 │ │ makeDispatcher: () => dispatcher, 2026-10-23T23:34:25.8833543Z 2398 │ │ shouldYield: (fiber) => { 2026-10-23T23:34:25.8833686Z 2399 │ │ if (fiber !== requestFiber) return false; 2026-10-23T23:34:25.8833798Z 2400 │ │ requestChecks += 1; 2026-10-23T23:34:25.8833951Z 2401 │ │ if (requestChecks !== interruptAt) return false; 2026-10-23T23:34:25.8834114Z 2402 │ │ fiber.interruptUnsafe(); 2026-10-23T23:34:25.8834219Z 2403 │ │ return true; 2026-10-23T23:34:25.8834313Z 2404 │ │ }, 2026-10-23T23:34:25.8834402Z 2405 │ │ }; 2026-10-23T23:34:25.8834475Z 2406 │ │ 2026-10-23T23:34:25.8834605Z 2407 │ │ const input: UsageSummaryInput = { 2026-10-23T23:34:25.8834705Z 2408 │ │ ...WINDOW, 2026-10-23T23:34:25.8834841Z 2409 │ │ sinceDay: UsageDay.make("2026-09-01"), 2026-10-23T23:34:25.8835047Z 2410 │ │ untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`), 2026-10-23T23:34:25.8835132Z 2411 │ │ }; 2026-10-23T23:34:25.8835252Z 2412 │ │ const first = yield* service 2026-10-23T23:34:25.8835364Z 2413 │ │ .readSummary(input) 2026-10-23T23:34:25.8835462Z 2414 │ │ .pipe( 2026-10-23T23:34:25.8835570Z 2415 │ │ Effect.exit, 2026-10-23T23:34:25.8835741Z 2416 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-23T23:34:25.8835852Z 2417 │ │ Effect.forkChild, 2026-10-23T23:34:25.8835936Z 2418 │ │ ); 2026-10-23T23:34:25.8836046Z 2419 │ │ requestFiber = first; 2026-10-23T23:34:25.8836160Z 2420 │ │ yield* Effect.yieldNow; 2026-10-23T23:34:25.8836272Z 2421 │ │ dispatcher.flush(); 2026-10-23T23:34:25.8836345Z 2422 │ │ 2026-10-23T23:34:25.8836506Z 2423 │ │ const second = yield* service.readSummary(input).pipe( 2026-10-23T23:34:25.8836617Z 2424 │ │ Effect.match({ 2026-10-23T23:34:25.8836753Z 2425 │ │ onFailure: (error) => error.reason, 2026-10-23T23:34:25.8836883Z 2426 │ │ onSuccess: () => "success" as const, 2026-10-23T23:34:25.8836973Z 2427 │ │ }), 2026-10-23T23:34:25.8837140Z 2428 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-23T23:34:25.8837249Z 2429 │ │ Effect.forkChild, 2026-10-23T23:34:25.8837331Z 2430 │ │ ); 2026-10-23T23:34:25.8837442Z 2431 │ │ yield* Effect.yieldNow; 2026-10-23T23:34:25.8837553Z 2432 │ │ dispatcher.flush(); 2026-10-23T23:34:25.8837689Z 2433 │ │ const secondExit = second.pollUnsafe(); 2026-10-23T23:34:25.8837883Z 2434 │ │ if (secondExit === undefined) { 2026-10-23T23:34:25.8838047Z 2435 │ │ second.interruptUnsafe(); 2026-10-23T23:34:25.8838169Z 2436 │ │ orphanedAt = interruptAt; 2026-10-23T23:34:25.8838264Z 2437 │ │ break; 2026-10-23T23:34:25.8838345Z 2438 │ │ } 2026-10-23T23:34:25.8838473Z 2439 │ │ if (Exit.isFailure(secondExit)) { 2026-10-23T23:34:25.8838642Z 2440 │ │ assert.fail("the matching request fiber was interrupted"); 2026-10-23T23:34:25.8838727Z 2441 │ │ } 2026-10-23T23:34:25.8838887Z 2442 │ │ assert.strictEqual(secondExit.value, "invalidWindow"); 2026-10-23T23:34:25.8839036Z 2443 │ ╰─▶ } 2026-10-23T23:34:25.8839100Z 2444 │ 2026-10-23T23:34:25.8839156Z ╰──── 2026-10-23T23:34:25.8839159Z 2026-10-23T23:34:25.8839335Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T23:34:25.8839484Z ╭─[apps/server/src/process/externalLauncher.test.ts:186:12] 2026-10-23T23:34:25.8839542Z 185 │ 2026-10-23T23:34:25.8839650Z 186 │ for (const {} of ["darwin", "linux"] as const) { 2026-10-23T23:34:25.8839723Z ·  ── 2026-10-23T23:34:25.8839782Z 187 │ } 2026-10-23T23:34:25.8839839Z ╰──── 2026-10-23T23:34:25.8840089Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T23:34:25.8840092Z 2026-10-23T23:34:25.8840275Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T23:34:25.8840423Z ╭─[apps/server/src/process/externalLauncher.test.ts:189:12] 2026-10-23T23:34:25.8840480Z 188 │ 2026-10-23T23:34:25.8840551Z 189 │ for (const {} of [ 2026-10-23T23:34:25.8840624Z ·  ── 2026-10-23T23:34:25.8840720Z 190 │ { kind: "browser", folderVerb: "none" }, 2026-10-23T23:34:25.8840778Z ╰──── 2026-10-23T23:34:25.8841019Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T23:34:25.8841022Z 2026-10-23T23:34:25.8841198Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T23:34:25.8841341Z ╭─[apps/server/src/process/externalLauncher.test.ts:311:12] 2026-10-23T23:34:25.8841397Z 310 │ 2026-10-23T23:34:25.8841597Z 311 │ for (const {} of ["rejected", "spawn-error", "stalled"] as const) { 2026-10-23T23:34:25.8841705Z ·  ── 2026-10-23T23:34:25.8841760Z 312 │ } 2026-10-23T23:34:25.8841818Z ╰──── 2026-10-23T23:34:25.8842066Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T23:34:25.8842068Z 2026-10-23T23:34:25.8842247Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T23:34:25.8842391Z ╭─[apps/server/src/process/externalLauncher.test.ts:314:12] 2026-10-23T23:34:25.8842447Z 313 │ 2026-10-23T23:34:25.8842518Z 314 │ for (const {} of [ 2026-10-23T23:34:25.8842593Z ·  ── 2026-10-23T23:34:25.8842650Z 315 │ { 2026-10-23T23:34:25.8842705Z ╰──── 2026-10-23T23:34:25.8842954Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T23:34:25.8842959Z 2026-10-23T23:34:25.8843237Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T23:34:25.8843418Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:123:7] 2026-10-23T23:34:25.8843475Z 118 │ 2026-10-23T23:34:25.8843548Z 119 │ useEffect(() => { 2026-10-23T23:34:25.8843626Z ·  ────┬──── 2026-10-23T23:34:25.8843763Z · ╰── This is the containing effect 2026-10-23T23:34:25.8843852Z 120 │ if (orientationSettled) return; 2026-10-23T23:34:25.8843973Z 121 │ const orientation = getNativeShowcaseOrientation(); 2026-10-23T23:34:25.8844109Z 122 │ if (orientation === null) { 2026-10-23T23:34:25.8844201Z 123 │ setOrientationSettled(true); 2026-10-23T23:34:25.8844301Z ·  ──────────┬────────── 2026-10-23T23:34:25.8844491Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.8844559Z 124 │ return; 2026-10-23T23:34:25.8844612Z ╰──── 2026-10-23T23:34:25.8845262Z  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-23T23:34:25.8845618Z  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-23T23:34:25.8845621Z 2026-10-23T23:34:25.8845902Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T23:34:25.8846090Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:304:7] 2026-10-23T23:34:25.8846146Z 292 │ 2026-10-23T23:34:25.8846217Z 293 │ useEffect(() => { 2026-10-23T23:34:25.8846295Z ·  ────┬──── 2026-10-23T23:34:25.8846430Z · ╰── This is the containing effect 2026-10-23T23:34:25.8846493Z 294 │ if ( 2026-10-23T23:34:25.8846565Z 295 │ scene === null || 2026-10-23T23:34:25.8846648Z 296 │ requestedScene === null || 2026-10-23T23:34:25.8846728Z 297 │ scene !== requestedScene || 2026-10-23T23:34:25.8846800Z 298 │ !hasFixture || 2026-10-23T23:34:25.8846880Z 299 │ !orientationSettled || 2026-10-23T23:34:25.8847024Z 300 │ !themeApplied || 2026-10-23T23:34:25.8847198Z 301 │ (scene === "agent-activity" && !agentActivityStaged) || 2026-10-23T23:34:25.8847343Z 302 │ !isShowcaseNativeContentReady({ scene, themeId, renderSignal }) 2026-10-23T23:34:25.8847405Z 303 │ ) { 2026-10-23T23:34:25.8847479Z 304 │ setReadyScene(null); 2026-10-23T23:34:25.8847562Z ·  ──────┬────── 2026-10-23T23:34:25.8847747Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.8847814Z 305 │ return; 2026-10-23T23:34:25.8847872Z ╰──── 2026-10-23T23:34:25.8848537Z  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-23T23:34:25.8848892Z  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-23T23:34:25.8848895Z 2026-10-23T23:34:25.8849184Z ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'. 2026-10-23T23:34:25.8849368Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:128:9] 2026-10-23T23:34:25.8849443Z 127 │ let cancelled = false; 2026-10-23T23:34:25.8849539Z 128 │ let lastOutcome: string | null = null; 2026-10-23T23:34:25.8849626Z ·  ─────┬───── 2026-10-23T23:34:25.8849773Z · ╰── 'lastOutcome' is declared here 2026-10-23T23:34:25.8849972Z 129 │ void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), { 2026-10-23T23:34:25.8850029Z ╰──── 2026-10-23T23:34:25.8850140Z  help: Consider removing this declaration. 2026-10-23T23:34:25.8850144Z 2026-10-23T23:34:25.8850354Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T23:34:25.8850520Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:223:31] 2026-10-23T23:34:25.8850637Z 222 │ ? snippetTokens.map((line, lineIndex) => ( 2026-10-23T23:34:25.8850744Z 223 │ 2026-10-23T23:34:25.8850871Z ·  ─────────────── 2026-10-23T23:34:25.8850979Z 224 │ {lineIndex > 0 ? "\n" : ""} 2026-10-23T23:34:25.8851033Z ╰──── 2026-10-23T23:34:25.8851198Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-23T23:34:25.8851204Z 2026-10-23T23:34:25.8851412Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T23:34:25.8851572Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25] 2026-10-23T23:34:25.8851654Z 226 │ { 2026-10-23T23:34:25.8852952Z ·  ────┬──── 2026-10-23T23:34:25.8853093Z · ╰── This is the containing effect 2026-10-23T23:34:25.8853171Z 57 │ scheduler.reset(); 2026-10-23T23:34:25.8853281Z 58 │ highlightedRowIdsRef.current = new Set(); 2026-10-23T23:34:25.8853384Z 59 │ visibleChunkIndexRef.current = 0; 2026-10-23T23:34:25.8853513Z 60 │ setVisibleRange({ firstRowIndex: 0, lastRowIndex: 80 }); 2026-10-23T23:34:25.8853605Z ·  ───────┬─────── 2026-10-23T23:34:25.8853801Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.8853929Z 61 │ setTokensPatchJson(createEmptyTokenPatch(resetKey)); 2026-10-23T23:34:25.8853990Z ╰──── 2026-10-23T23:34:25.8854680Z  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-23T23:34:25.8855042Z  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-23T23:34:25.8855049Z 2026-10-23T23:34:25.8855265Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T23:34:25.8855458Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:63:7] 2026-10-23T23:34:25.8855554Z 62 │ return () => scheduler.cancel(); 2026-10-23T23:34:25.8855665Z 63 │ }, [enabled, resetKey, rows.length, scheduler]); 2026-10-23T23:34:25.8855802Z ·  ───┬─── ─────┬───── 2026-10-23T23:34:25.8856130Z · │ ╰── Unnecessary dependency `rows.length` 2026-10-23T23:34:25.8856282Z · ╰── Unnecessary dependency `enabled` 2026-10-23T23:34:25.8856342Z 64 │ 2026-10-23T23:34:25.8856398Z ╰──── 2026-10-23T23:34:25.8856716Z  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-23T23:34:25.8857061Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.8857068Z 2026-10-23T23:34:25.8857343Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T23:34:25.8857515Z ╭─[apps/server/src/orchestration-v2/ThreadPullRequestService.ts:413:7] 2026-10-23T23:34:25.8857574Z 412 │ 2026-10-23T23:34:25.8857712Z 413 │ const layer = Layer.effect(ThreadPullRequestServiceV2, make); 2026-10-23T23:34:25.8857791Z ·  ──┬── 2026-10-23T23:34:25.8857921Z · ╰── 'layer' is declared here 2026-10-23T23:34:25.8857977Z ╰──── 2026-10-23T23:34:25.8858090Z  help: Consider removing this declaration. 2026-10-23T23:34:25.8858209Z 2026-10-23T23:34:25.8858547Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T23:34:25.8858747Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:107:5] 2026-10-23T23:34:25.8858802Z 104 │ 2026-10-23T23:34:25.8858875Z 105 │ useEffect(() => { 2026-10-23T23:34:25.8858952Z ·  ────┬──── 2026-10-23T23:34:25.8859087Z · ╰── This is the containing effect 2026-10-23T23:34:25.8859174Z 106 │ clearReviewCommentTarget(); 2026-10-23T23:34:25.8859280Z 107 │ setPendingNativeCommentSelection(null); 2026-10-23T23:34:25.8859396Z ·  ────────────────┬─────────────── 2026-10-23T23:34:25.8859589Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.8859676Z 108 │ }, [selectedSection?.id]); 2026-10-23T23:34:25.8859733Z ╰──── 2026-10-23T23:34:25.8860374Z  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-23T23:34:25.8860721Z  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-23T23:34:25.8860723Z 2026-10-23T23:34:25.8860992Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T23:34:25.8861195Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7] 2026-10-23T23:34:25.8861255Z 109 │ 2026-10-23T23:34:25.8861326Z 110 │ useEffect(() => { 2026-10-23T23:34:25.8861399Z ·  ────┬──── 2026-10-23T23:34:25.8861552Z · ╰── This is the containing effect 2026-10-23T23:34:25.8861646Z 111 │ if (activeCommentTarget === null) { 2026-10-23T23:34:25.8861759Z 112 │ setPendingNativeCommentSelection(null); 2026-10-23T23:34:25.8918341Z ·  ────────────────┬─────────────── 2026-10-23T23:34:25.8918968Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.8919034Z 113 │ } 2026-10-23T23:34:25.8919093Z ╰──── 2026-10-23T23:34:25.8919833Z  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-23T23:34:25.8920230Z  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-23T23:34:25.8920238Z 2026-10-23T23:34:25.8920470Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T23:34:25.8920673Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7] 2026-10-23T23:34:25.8920788Z 107 │ setPendingNativeCommentSelection(null); 2026-10-23T23:34:25.8920870Z 108 │ }, [selectedSection?.id]); 2026-10-23T23:34:25.8921355Z ·  ─────────┬───────── 2026-10-23T23:34:25.8921616Z · ╰── Unnecessary dependency `selectedSection?.id` 2026-10-23T23:34:25.8921676Z 109 │ 2026-10-23T23:34:25.8921733Z ╰──── 2026-10-23T23:34:25.8922055Z  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-23T23:34:25.8922388Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.8922391Z 2026-10-23T23:34:25.8922899Z ⚠ 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-23T23:34:25.8923101Z ╭─[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:521:13] 2026-10-23T23:34:25.8923180Z 520 │ })).delivery; 2026-10-23T23:34:25.8923394Z 521 │ ╭─▶ while (delivery.outcome === "accepted") { 2026-10-23T23:34:25.8923516Z 522 │ │ yield* Effect.yieldNow; 2026-10-23T23:34:25.8923672Z 523 │ │ delivery = (yield* service.getWebhookDelivery({ 2026-10-23T23:34:25.8923784Z 524 │ │ id: task.id, 2026-10-23T23:34:25.8923913Z 525 │ │ deliveryId: deliveryId!, 2026-10-23T23:34:25.8924018Z 526 │ │ })).delivery; 2026-10-23T23:34:25.8924222Z 527 │ ╰─▶ } 2026-10-23T23:34:25.8924350Z 528 │ assert.equal(delivery.outcome, "dispatch_failed"); 2026-10-23T23:34:25.8924406Z ╰──── 2026-10-23T23:34:25.8924408Z 2026-10-23T23:34:25.8924609Z ⚠ react(static-components): Cannot create components during render 2026-10-23T23:34:25.8924779Z ╭─[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10] 2026-10-23T23:34:25.8924873Z 196 │ const { onInput, onResize } = props; 2026-10-23T23:34:25.8925029Z 197 │ const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView(); 2026-10-23T23:34:25.8925173Z ·  ────────────────┬─────────────── 2026-10-23T23:34:25.8925375Z · ╰── The component is created during render here 2026-10-23T23:34:25.8925573Z 198 │ const hasNativeSurface = Boolean(NativeTerminalSurfaceView); 2026-10-23T23:34:25.8925666Z 199 │ 2026-10-23T23:34:25.8925745Z 200 │ useEffect(() => { 2026-10-23T23:34:25.8925838Z 201 │ terminalDebugLog("native:surface", { 2026-10-23T23:34:25.8925935Z 202 │ terminalKey: props.terminalKey, 2026-10-23T23:34:25.8926018Z 203 │ native: hasNativeSurface, 2026-10-23T23:34:25.8926160Z 204 │ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(), 2026-10-23T23:34:25.8926248Z 205 │ bufferLen: props.buffer.length, 2026-10-23T23:34:25.8926333Z 206 │ isRunning: props.isRunning, 2026-10-23T23:34:25.8926394Z 207 │ }); 2026-10-23T23:34:25.8926569Z 208 │ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]); 2026-10-23T23:34:25.8926659Z 209 │ const handleNativeInput = useCallback( 2026-10-23T23:34:25.8926796Z 210 │ (event: NativeSyntheticEvent) => { 2026-10-23T23:34:25.8926909Z 211 │ if (!props.isRunning || props.readOnly) { 2026-10-23T23:34:25.8926983Z 212 │ return; 2026-10-23T23:34:25.8927040Z 213 │ } 2026-10-23T23:34:25.8927138Z 214 │ terminalDebugLog("native:onInput", { 2026-10-23T23:34:25.8927307Z 215 │ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)), 2026-10-23T23:34:25.8927371Z 216 │ }); 2026-10-23T23:34:25.8927464Z 217 │ onInput(event.nativeEvent.data); 2026-10-23T23:34:25.8927525Z 218 │ }, 2026-10-23T23:34:25.8927631Z 219 │ [onInput, props.isRunning, props.readOnly], 2026-10-23T23:34:25.8927687Z 220 │ ); 2026-10-23T23:34:25.8927787Z 221 │ const handleNativeResize = useCallback( 2026-10-23T23:34:25.8927910Z 222 │ (event: NativeSyntheticEvent) => { 2026-10-23T23:34:25.8927985Z 223 │ onResize({ 2026-10-23T23:34:25.8928073Z 224 │ cols: event.nativeEvent.cols, 2026-10-23T23:34:25.8928161Z 225 │ rows: event.nativeEvent.rows, 2026-10-23T23:34:25.8928222Z 226 │ }); 2026-10-23T23:34:25.8928282Z 227 │ }, 2026-10-23T23:34:25.8928346Z 228 │ [onResize], 2026-10-23T23:34:25.8928404Z 229 │ ); 2026-10-23T23:34:25.8928461Z 230 │ 2026-10-23T23:34:25.8928551Z 231 │ if (NativeTerminalSurfaceView) { 2026-10-23T23:34:25.8928616Z 232 │ return ( 2026-10-23T23:34:25.8928700Z 233 │ 2026-10-23T23:34:25.8928785Z 234 │ { 2026-10-23T23:34:25.8931836Z ·  ────┬──── 2026-10-23T23:34:25.8931977Z · ╰── This is the containing effect 2026-10-23T23:34:25.8932100Z 640 │ if (pendingLaunchEntry.key === launchTargetKey) { 2026-10-23T23:34:25.8932170Z 641 │ return; 2026-10-23T23:34:25.8932230Z 642 │ } 2026-10-23T23:34:25.8932311Z 643 │ setPendingLaunchEntry({ 2026-10-23T23:34:25.8932406Z ·  ──────────┬────────── 2026-10-23T23:34:25.8932592Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.8932668Z 644 │ key: launchTargetKey, 2026-10-23T23:34:25.8932723Z ╰──── 2026-10-23T23:34:25.8933378Z  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-23T23:34:25.8933731Z  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-23T23:34:25.8933737Z 2026-10-23T23:34:25.8934011Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T23:34:25.8934264Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5] 2026-10-23T23:34:25.8934323Z 648 │ 2026-10-23T23:34:25.8934389Z 649 │ useEffect(() => { 2026-10-23T23:34:25.8934465Z ·  ────┬──── 2026-10-23T23:34:25.8934603Z · ╰── This is the containing effect 2026-10-23T23:34:25.8934726Z 650 │ if (initialAttachGridEntry.key === launchTargetKey) { 2026-10-23T23:34:25.8934789Z 651 │ return; 2026-10-23T23:34:25.8934854Z 652 │ } 2026-10-23T23:34:25.8934942Z 653 │ setInitialAttachGridEntry({ 2026-10-23T23:34:25.8935044Z ·  ────────────┬──────────── 2026-10-23T23:34:25.8935225Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.8935301Z 654 │ key: launchTargetKey, 2026-10-23T23:34:25.8935356Z ╰──── 2026-10-23T23:34:25.8936153Z  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-23T23:34:25.8936606Z  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-23T23:34:25.8936672Z 2026-10-23T23:34:25.8936941Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T23:34:25.8937116Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7] 2026-10-23T23:34:25.8937174Z 743 │ 2026-10-23T23:34:25.8937244Z 744 │ useEffect(() => { 2026-10-23T23:34:25.8937318Z ·  ────┬──── 2026-10-23T23:34:25.8937454Z · ╰── This is the containing effect 2026-10-23T23:34:25.8937564Z 745 │ if (!routeEnvironmentId || !routeThreadId) { 2026-10-23T23:34:25.8937637Z 746 │ setLastGridSize({ 2026-10-23T23:34:25.8937723Z ·  ───────┬─────── 2026-10-23T23:34:25.8937906Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.8937997Z 747 │ cols: DEFAULT_TERMINAL_COLS, 2026-10-23T23:34:25.8938051Z ╰──── 2026-10-23T23:34:25.8938681Z  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-23T23:34:25.8939019Z  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-23T23:34:25.8939022Z 2026-10-23T23:34:25.8939235Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T23:34:25.8939420Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24] 2026-10-23T23:34:25.8939482Z 537 │ }); 2026-10-23T23:34:25.8939614Z 538 │ }, [terminal.buffer, terminal.buffer.length, terminalKey]); 2026-10-23T23:34:25.8939733Z ·  ───────────┬────────── 2026-10-23T23:34:25.8940003Z · ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead 2026-10-23T23:34:25.8940175Z 539 │ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null; 2026-10-23T23:34:25.8940228Z ╰──── 2026-10-23T23:34:25.8940543Z  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-23T23:34:25.8940880Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.8940886Z 2026-10-23T23:34:25.8941114Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T23:34:25.8941299Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7] 2026-10-23T23:34:25.8941402Z 708 │ sentInitialInputKeyRef.current = null; 2026-10-23T23:34:25.8941473Z 709 │ }, [terminalKey]); 2026-10-23T23:34:25.8941556Z ·  ─────┬───── 2026-10-23T23:34:25.8941706Z · ╰── Unnecessary dependency `terminalKey` 2026-10-23T23:34:25.8941763Z 710 │ 2026-10-23T23:34:25.8941818Z ╰──── 2026-10-23T23:34:25.8942192Z  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-23T23:34:25.8942607Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.8942610Z 2026-10-23T23:34:25.8942821Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T23:34:25.8943004Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52] 2026-10-23T23:34:25.8943064Z 799 │ }; 2026-10-23T23:34:25.8943257Z 800 │ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]); 2026-10-23T23:34:25.8943450Z ·  ────────────┬──────────── ─────┬───── 2026-10-23T23:34:25.8943708Z · │ ╰── Unnecessary dependency `terminalKey` 2026-10-23T23:34:25.8943935Z · ╰── Unnecessary dependency `terminal.lifecycleVersion` 2026-10-23T23:34:25.8943991Z 801 │ 2026-10-23T23:34:25.8944080Z ╰──── 2026-10-23T23:34:25.8944391Z  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-23T23:34:25.8944721Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.8944724Z 2026-10-23T23:34:25.8944878Z ⚠ react(refs): Cannot access refs during render 2026-10-23T23:34:25.8945064Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24] 2026-10-23T23:34:25.8945122Z 792 │ } 2026-10-23T23:34:25.8945235Z 793 │ const pasteSession = pasteSessionRef.current; 2026-10-23T23:34:25.8945358Z ·  ───────────┬─────────── 2026-10-23T23:34:25.8945532Z · ╰── Cannot access ref value during render 2026-10-23T23:34:25.8945586Z 794 │ 2026-10-23T23:34:25.8945642Z ╰──── 2026-10-23T23:34:25.8946148Z  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-23T23:34:25.8946463Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T23:34:25.8946470Z 2026-10-23T23:34:25.8946686Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T23:34:25.8946830Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:454:7] 2026-10-23T23:34:25.8946922Z 453 │ showAuxiliaryPane("inspector"); 2026-10-23T23:34:25.8947036Z 454 │ }, [environmentId, showAuxiliaryPane, threadId]); 2026-10-23T23:34:25.8947190Z ·  ──────┬────── ────┬─── 2026-10-23T23:34:25.8947401Z · │ ╰── Unnecessary dependency `threadId` 2026-10-23T23:34:25.8947624Z · ╰── Unnecessary dependency `environmentId` 2026-10-23T23:34:25.8947765Z 455 │ const { 2026-10-23T23:34:25.8947821Z ╰──── 2026-10-23T23:34:25.8948131Z  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-23T23:34:25.8948517Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.8948520Z 2026-10-23T23:34:25.8948720Z ⚠ react(static-components): Cannot create components during render 2026-10-23T23:34:25.8948865Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:725:20] 2026-10-23T23:34:25.8948934Z 492 │ // same check. 2026-10-23T23:34:25.8949066Z 493 │ const NativeReviewDiffView = resolveNativeReviewDiffView(); 2026-10-23T23:34:25.8949201Z ·  ─────────────┬───────────── 2026-10-23T23:34:25.8949405Z · ╰── The component is created during render here 2026-10-23T23:34:25.8949566Z 494 │ const nativeReviewDiffViewRef = useRef(null); 2026-10-23T23:34:25.8949693Z 495 │ const showcasedReviewDrawRef = useRef(null); 2026-10-23T23:34:25.8949834Z 496 │ const [isPullRefreshing, setIsPullRefreshing] = useState(false); 2026-10-23T23:34:25.8949933Z 497 │ const handlePullToRefresh = async () => { 2026-10-23T23:34:25.8950017Z 498 │ setIsPullRefreshing(true); 2026-10-23T23:34:25.8950104Z 499 │ await refreshSelectedSection(); 2026-10-23T23:34:25.8950187Z 500 │ setIsPullRefreshing(false); 2026-10-23T23:34:25.8950246Z 501 │ }; 2026-10-23T23:34:25.8950405Z 502 │ const reviewFileNavigatorRef = useRef(null); 2026-10-23T23:34:25.8950557Z 503 │ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : []; 2026-10-23T23:34:25.8950671Z 504 │ const fileVisibility = useReviewFileVisibility({ 2026-10-23T23:34:25.8950765Z 505 │ threadKey: reviewCache.threadKey, 2026-10-23T23:34:25.8950859Z 506 │ sectionId: selectedSection?.id ?? null, 2026-10-23T23:34:25.8950930Z 507 │ files: reviewFiles, 2026-10-23T23:34:25.8951035Z 508 │ cachedExpandedFileIds: selectedSection?.id 2026-10-23T23:34:25.8951175Z 509 │ ? reviewCache.expandedFileIdsBySection[selectedSection.id] 2026-10-23T23:34:25.8951245Z 510 │ : undefined, 2026-10-23T23:34:25.8951344Z 511 │ cachedViewedFileIds: selectedSection?.id 2026-10-23T23:34:25.8951477Z 512 │ ? reviewCache.viewedFileIdsBySection[selectedSection.id] 2026-10-23T23:34:25.8951608Z 513 │ : undefined, 2026-10-23T23:34:25.8951704Z 514 │ }); 2026-10-23T23:34:25.8951910Z 515 │ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility; 2026-10-23T23:34:25.8952052Z 516 │ const commentSelection = useReviewCommentSelectionController({ 2026-10-23T23:34:25.8952119Z 517 │ environmentId, 2026-10-23T23:34:25.8952184Z 518 │ threadId, 2026-10-23T23:34:25.8952255Z 519 │ selectedSection, 2026-10-23T23:34:25.8952332Z 520 │ nativeReviewDiffData, 2026-10-23T23:34:25.8952393Z 521 │ }); 2026-10-23T23:34:25.8952506Z 522 │ const nativeBridge = useNativeReviewDiffBridge({ 2026-10-23T23:34:25.8952599Z 523 │ threadKey: reviewCache.threadKey, 2026-10-23T23:34:25.8952695Z 524 │ sectionId: selectedSection?.id ?? null, 2026-10-23T23:34:25.8952778Z 525 │ diff: selectedSection?.diff, 2026-10-23T23:34:25.8952864Z 526 │ data: nativeReviewDiffData, 2026-10-23T23:34:25.8952939Z 527 │ collapsedFileIds, 2026-10-23T23:34:25.8953007Z 528 │ viewedFileIds, 2026-10-23T23:34:25.8953126Z 529 │ selectedRowIds: commentSelection.selectedRowIds, 2026-10-23T23:34:25.8953228Z 530 │ canHighlight: parsedDiff.kind === "files", 2026-10-23T23:34:25.8953287Z 531 │ }); 2026-10-23T23:34:25.8953366Z 532 │ const showcaseReviewKey = 2026-10-23T23:34:25.8953507Z 533 │ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection 2026-10-23T23:34:25.8953728Z 534 │ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}` 2026-10-23T23:34:25.8953795Z 535 │ : null; 2026-10-23T23:34:25.8953974Z 536 │ const handleNativeDebug = (event: NativeSyntheticEvent>) => { 2026-10-23T23:34:25.8954108Z 537 │ nativeBridge.onDebug(event); 2026-10-23T23:34:25.8954174Z 538 │ if ( 2026-10-23T23:34:25.8954263Z 539 │ showcaseReviewKey === null || 2026-10-23T23:34:25.8954393Z 540 │ showcasedReviewDrawRef.current === showcaseReviewKey || 2026-10-23T23:34:25.8954511Z 541 │ !isNativeReviewDiffDrawEvent(event.nativeEvent) 2026-10-23T23:34:25.8954569Z 542 │ ) { 2026-10-23T23:34:25.8954634Z 543 │ return; 2026-10-23T23:34:25.8954693Z 544 │ } 2026-10-23T23:34:25.8954811Z 545 │ showcasedReviewDrawRef.current = showcaseReviewKey; 2026-10-23T23:34:25.8954989Z 546 │ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId }); 2026-10-23T23:34:25.8955048Z 547 │ }; 2026-10-23T23:34:25.8955106Z 548 │ 2026-10-23T23:34:25.8955231Z 549 │ const handleSelectFile = async (fileId: string | null) => { 2026-10-23T23:34:25.8955319Z 550 │ loadVisibleFile(fileId, true); 2026-10-23T23:34:25.8955427Z 551 │ commentSelection.clearSelection(); 2026-10-23T23:34:25.8955563Z 552 │ if (fileId !== null && collapsedFileIds.includes(fileId)) { 2026-10-23T23:34:25.8955647Z 553 │ toggleExpandedFile(fileId); 2026-10-23T23:34:25.8955708Z 554 │ } 2026-10-23T23:34:25.8955832Z 555 │ const nativeView = nativeReviewDiffViewRef.current; 2026-10-23T23:34:25.8955912Z 556 │ if (!nativeView) return; 2026-10-23T23:34:25.8956012Z 557 │ const result = await settlePromise(() => 2026-10-23T23:34:25.8956203Z 558 │ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true), 2026-10-23T23:34:25.8956266Z 559 │ ); 2026-10-23T23:34:25.8956362Z 560 │ if (AsyncResult.isFailure(result)) { 2026-10-23T23:34:25.8956556Z 561 │ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result)); 2026-10-23T23:34:25.8956617Z 562 │ } 2026-10-23T23:34:25.8956748Z 563 │ }; 2026-10-23T23:34:25.8956876Z 564 │ const handleVisibleFileChange = ( 2026-10-23T23:34:25.8957016Z 565 │ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>, 2026-10-23T23:34:25.8957079Z 566 │ ) => { 2026-10-23T23:34:25.8957197Z 567 │ loadVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-23T23:34:25.8957379Z 568 │ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-23T23:34:25.8957435Z 569 │ }; 2026-10-23T23:34:25.8957520Z 570 │ const renderInspector = () => ( 2026-10-23T23:34:25.8957596Z 571 │ void handleSelectFile(fileId)} 2026-10-23T23:34:25.8958153Z 577 │ /> 2026-10-23T23:34:25.8958212Z 578 │ ); 2026-10-23T23:34:25.8958267Z 579 │ 2026-10-23T23:34:25.8958464Z 580 │ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => { 2026-10-23T23:34:25.8958559Z 581 │ const { fileId } = event.nativeEvent; 2026-10-23T23:34:25.8958627Z 582 │ if (fileId) { 2026-10-23T23:34:25.8958713Z 583 │ loadVisibleFile(fileId, true); 2026-10-23T23:34:25.8958797Z 584 │ toggleExpandedFile(fileId); 2026-10-23T23:34:25.8958857Z 585 │ } 2026-10-23T23:34:25.8958913Z 586 │ }; 2026-10-23T23:34:25.8958969Z 587 │ 2026-10-23T23:34:25.8959062Z 588 │ const handleNativeToggleViewedFile = ( 2026-10-23T23:34:25.8959194Z 589 │ event: NativeSyntheticEvent<{ readonly fileId?: string }>, 2026-10-23T23:34:25.8959257Z 590 │ ) => { 2026-10-23T23:34:25.8959349Z 591 │ const { fileId } = event.nativeEvent; 2026-10-23T23:34:25.8959414Z 592 │ if (fileId) { 2026-10-23T23:34:25.8959496Z 593 │ toggleViewedFile(fileId); 2026-10-23T23:34:25.8959566Z 594 │ } 2026-10-23T23:34:25.8959624Z 595 │ }; 2026-10-23T23:34:25.8959677Z 596 │ 2026-10-23T23:34:25.8959754Z 597 │ const parsedDiffNotice = 2026-10-23T23:34:25.8959928Z 598 │ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null; 2026-10-23T23:34:25.8960055Z 599 │ const hasCachedSelectedDiff = selectedSection?.diff != null; 2026-10-23T23:34:25.8960225Z 600 │ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null); 2026-10-23T23:34:25.8960354Z 601 │ const sectionMenu = buildReviewSectionMenu(reviewSections); 2026-10-23T23:34:25.8960530Z 602 │ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({ 2026-10-23T23:34:25.8960652Z 603 │ hasEnvironmentPresentation: environment.isReady, 2026-10-23T23:34:25.8960759Z 604 │ isEnvironmentConnected: isEnvironmentReady, 2026-10-23T23:34:25.8960837Z 605 │ hasCachedSelectedDiff, 2026-10-23T23:34:25.8960908Z 606 │ hasAnyCachedDiff, 2026-10-23T23:34:25.8960964Z 607 │ }); 2026-10-23T23:34:25.8961058Z 608 │ const handleRetryEnvironment = () => { 2026-10-23T23:34:25.8961152Z 609 │ void retryEnvironment(environmentId); 2026-10-23T23:34:25.8961211Z 610 │ }; 2026-10-23T23:34:25.8961299Z 611 │ const handleReturnToThread = () => { 2026-10-23T23:34:25.8961385Z 612 │ if (navigation.canGoBack()) { 2026-10-23T23:34:25.8961461Z 613 │ navigation.goBack(); 2026-10-23T23:34:25.8961532Z 614 │ return; 2026-10-23T23:34:25.8961587Z 615 │ } 2026-10-23T23:34:25.8961741Z 616 │ navigation.navigate("Thread", { 2026-10-23T23:34:25.8961879Z 617 │ environmentId: String(environmentId), 2026-10-23T23:34:25.8961964Z 618 │ threadId: String(threadId), 2026-10-23T23:34:25.8962023Z 619 │ }); 2026-10-23T23:34:25.8962082Z 620 │ }; 2026-10-23T23:34:25.8962168Z 621 │ const androidHeaderSubtitle = [ 2026-10-23T23:34:25.8962247Z 622 │ selectedSection?.title, 2026-10-23T23:34:25.8962331Z 623 │ headerDiffSummary.additions, 2026-10-23T23:34:25.8962420Z 624 │ headerDiffSummary.deletions, 2026-10-23T23:34:25.8962479Z 625 │ ] 2026-10-23T23:34:25.8962591Z 626 │ .filter((part): part is string => Boolean(part)) 2026-10-23T23:34:25.8962661Z 627 │ .join(" · "); 2026-10-23T23:34:25.8962717Z 628 │ 2026-10-23T23:34:25.8962802Z 629 │ const showChangedFilesPane = 2026-10-23T23:34:25.8962886Z 630 │ !showConnectionNotice && 2026-10-23T23:34:25.8962970Z 631 │ selectedSection !== null && 2026-10-23T23:34:25.8963056Z 632 │ parsedDiff.kind === "files" && 2026-10-23T23:34:25.8963142Z 633 │ NativeReviewDiffView !== null; 2026-10-23T23:34:25.8963322Z 634 │ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined); 2026-10-23T23:34:25.8963512Z 635 │ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane; 2026-10-23T23:34:25.8963569Z 636 │ 2026-10-23T23:34:25.8963649Z 637 │ const listHeader = (() => { 2026-10-23T23:34:25.8963739Z 638 │ const children: ReactElement[] = []; 2026-10-23T23:34:25.8963796Z 639 │ 2026-10-23T23:34:25.8963865Z 640 │ if (error) { 2026-10-23T23:34:25.8963937Z 641 │ children.push( 2026-10-23T23:34:25.8964000Z 642 │ 2026-10-23T23:34:25.8964758Z 649 │ Review unavailable 2026-10-23T23:34:25.8964930Z 650 │ {error} 2026-10-23T23:34:25.8964998Z 651 │ , 2026-10-23T23:34:25.8965059Z 652 │ ); 2026-10-23T23:34:25.8965116Z 653 │ } 2026-10-23T23:34:25.8965172Z 654 │ 2026-10-23T23:34:25.8965251Z 655 │ if (parsedDiffNotice) { 2026-10-23T23:34:25.8965431Z 656 │ children.push(); 2026-10-23T23:34:25.8965489Z 657 │ } 2026-10-23T23:34:25.8965545Z 658 │ 2026-10-23T23:34:25.8965628Z 659 │ if (children.length === 0) { 2026-10-23T23:34:25.8965697Z 660 │ return null; 2026-10-23T23:34:25.8965753Z 661 │ } 2026-10-23T23:34:25.8965809Z 662 │ 2026-10-23T23:34:25.8965885Z 663 │ return <>{children}; 2026-10-23T23:34:25.8965946Z 664 │ })(); 2026-10-23T23:34:25.8966020Z 665 │ const headerSubtitle = [ 2026-10-23T23:34:25.8966106Z 666 │ headerDiffSummary.additions, 2026-10-23T23:34:25.8966191Z 667 │ headerDiffSummary.deletions, 2026-10-23T23:34:25.8966275Z 668 │ pendingReviewCommentCount > 0 2026-10-23T23:34:25.8966463Z 669 │ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}` 2026-10-23T23:34:25.8966530Z 670 │ : null, 2026-10-23T23:34:25.8966655Z 671 │ ] 2026-10-23T23:34:25.8966763Z 672 │ .filter(Boolean) 2026-10-23T23:34:25.8966831Z 673 │ .join(" · "); 2026-10-23T23:34:25.8966978Z 674 │ const headerTitleText = selectedSection?.title ?? "Review changes"; 2026-10-23T23:34:25.8967035Z 675 │ 2026-10-23T23:34:25.8967097Z 676 │ return ( 2026-10-23T23:34:25.8967158Z 677 │ <> 2026-10-23T23:34:25.8967228Z 678 │ 2026-10-23T23:34:25.8968657Z 694 │ 2026-10-23T23:34:25.8968727Z 695 │ 2026-10-23T23:34:25.8968858Z 696 │ 2026-10-23T23:34:25.8968946Z 697 │ {showConnectionNotice ? ( 2026-10-23T23:34:25.8969105Z 698 │ 2026-10-23T23:34:25.8969202Z 699 │ 2026-10-23T23:34:25.8970306Z 711 │ 2026-10-23T23:34:25.8970480Z 712 │ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? ( 2026-10-23T23:34:25.8970547Z 713 │ 2026-10-23T23:34:25.8971019Z 719 │ 2026-10-23T23:34:25.8971466Z 723 │ {listHeader} 2026-10-23T23:34:25.8971632Z 724 │ 2026-10-23T23:34:25.8971724Z 725 │ 2026-10-23T23:34:25.8976252Z 817 │ 2026-10-23T23:34:25.8976378Z ·  ──────────────────── 2026-10-23T23:34:25.8976478Z 818 │ 2026-10-23T23:34:25.8977719Z 832 │ 2026-10-23T23:34:25.8977852Z ·  ──────────────────── 2026-10-23T23:34:25.8977958Z 833 │ 2026-10-23T23:34:25.8978015Z ╰──── 2026-10-23T23:34:25.8978256Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-23T23:34:25.8978411Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-23T23:34:25.8978416Z 2026-10-23T23:34:25.8978696Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T23:34:25.8978862Z ╭─[apps/mobile/src/features/terminal/terminalLaunchContext.ts:117:5] 2026-10-23T23:34:25.8979046Z 112 │ const [entry, setEntry] = useState(() => ({ key: input.targetKey, location: candidate })); 2026-10-23T23:34:25.8979118Z 113 │ useEffect(() => { 2026-10-23T23:34:25.8979197Z ·  ────┬──── 2026-10-23T23:34:25.8979335Z · ╰── This is the containing effect 2026-10-23T23:34:25.8979514Z 114 │ if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) { 2026-10-23T23:34:25.8979581Z 115 │ return; 2026-10-23T23:34:25.8979645Z 116 │ } 2026-10-23T23:34:25.8979771Z 117 │ setEntry({ key: input.targetKey, location: candidate }); 2026-10-23T23:34:25.8979850Z ·  ────┬─── 2026-10-23T23:34:25.8980032Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.8980161Z 118 │ }, [candidate, entry.key, entry.location, input.targetKey]); 2026-10-23T23:34:25.8980215Z ╰──── 2026-10-23T23:34:25.8980865Z  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-23T23:34:25.8981224Z  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-23T23:34:25.8981230Z 2026-10-23T23:34:25.8981401Z ⚠ react(immutability): This value cannot be modified 2026-10-23T23:34:25.8981576Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:42:5] 2026-10-23T23:34:25.8981632Z 35 │ 2026-10-23T23:34:25.8981782Z 36 │ const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0); 2026-10-23T23:34:25.8981877Z ·  ────────┬──────── 2026-10-23T23:34:25.8982039Z · ╰── `inspectorProgress` originates here 2026-10-23T23:34:25.8982139Z 37 │ const { renderedInspectorWidth } = props; 2026-10-23T23:34:25.8982282Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-23T23:34:25.8982341Z 39 │ 2026-10-23T23:34:25.8982491Z 40 │ const onClosed = props.onClosed; 2026-10-23T23:34:25.8982593Z 41 │ useEffect(() => { 2026-10-23T23:34:25.8982691Z 42 │ inspectorProgress.value = withTiming( 2026-10-23T23:34:25.8982782Z ·  ────────┬──────── 2026-10-23T23:34:25.8982945Z · ╰── `inspectorProgress` cannot be modified 2026-10-23T23:34:25.8983027Z 43 │ inspectorVisible ? 1 : 0, 2026-10-23T23:34:25.8983085Z ╰──── 2026-10-23T23:34:25.8983374Z  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-23T23:34:25.8983716Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T23:34:25.8983719Z 2026-10-23T23:34:25.8983891Z ⚠ react(immutability): This value cannot be modified 2026-10-23T23:34:25.8984109Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:67:7] 2026-10-23T23:34:25.8984213Z 37 │ const { renderedInspectorWidth } = props; 2026-10-23T23:34:25.8984356Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-23T23:34:25.8984453Z ·  ──────────┬───────── 2026-10-23T23:34:25.8984622Z · ╰── `renderedContentWidth` originates here 2026-10-23T23:34:25.8984679Z 39 │ 2026-10-23T23:34:25.8984765Z 40 │ const onClosed = props.onClosed; 2026-10-23T23:34:25.8984832Z 41 │ useEffect(() => { 2026-10-23T23:34:25.8984930Z 42 │ inspectorProgress.value = withTiming( 2026-10-23T23:34:25.8985012Z 43 │ inspectorVisible ? 1 : 0, 2026-10-23T23:34:25.8985092Z 44 │ WORKSPACE_PANE_TIMING, 2026-10-23T23:34:25.8985167Z 45 │ (finished) => { 2026-10-23T23:34:25.8985320Z 46 │ if (finished === true && !inspectorVisible && onClosed !== undefined) { 2026-10-23T23:34:25.8985399Z 47 │ runOnJS(onClosed)(); 2026-10-23T23:34:25.8985462Z 48 │ } 2026-10-23T23:34:25.8985520Z 49 │ }, 2026-10-23T23:34:25.8985582Z 50 │ ); 2026-10-23T23:34:25.8985722Z 51 │ const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0; 2026-10-23T23:34:25.8985807Z 52 │ renderedInspectorWidth.set( 2026-10-23T23:34:25.8985961Z 53 │ resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING), 2026-10-23T23:34:25.8986020Z 54 │ ); 2026-10-23T23:34:25.8986079Z 55 │ }, [ 2026-10-23T23:34:25.8986150Z 56 │ inspectorProgress, 2026-10-23T23:34:25.8986222Z 57 │ inspectorVisible, 2026-10-23T23:34:25.8986291Z 58 │ inspectorWidth, 2026-10-23T23:34:25.8986428Z 59 │ onClosed, 2026-10-23T23:34:25.8986538Z 60 │ renderedInspectorWidth, 2026-10-23T23:34:25.8986603Z 61 │ resizing, 2026-10-23T23:34:25.8986663Z 62 │ ]); 2026-10-23T23:34:25.8986721Z 63 │ 2026-10-23T23:34:25.8986787Z 64 │ useEffect(() => { 2026-10-23T23:34:25.8986889Z 65 │ const targetWidth = inspectorWidth ?? 0; 2026-10-23T23:34:25.8986981Z 66 │ if (!inspectorVisible || resizing) { 2026-10-23T23:34:25.8987088Z 67 │ renderedContentWidth.value = targetWidth; 2026-10-23T23:34:25.8987182Z ·  ──────────┬───────── 2026-10-23T23:34:25.8987357Z · ╰── `renderedContentWidth` cannot be modified 2026-10-23T23:34:25.8987421Z 68 │ return; 2026-10-23T23:34:25.8987478Z ╰──── 2026-10-23T23:34:25.8987769Z  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-23T23:34:25.8988106Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T23:34:25.8988108Z 2026-10-23T23:34:25.8988321Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T23:34:25.8988494Z ╭─[apps/mobile/src/features/terminal/TerminalContextSheet.tsx:72:15] 2026-10-23T23:34:25.8988562Z 71 │ Promise.resolve()); 2026-10-23T23:34:25.8991347Z 225 │ │ const pending = backgroundRuntime.pending.shift(); 2026-10-23T23:34:25.8991452Z 226 │ │ if (!pending) { 2026-10-23T23:34:25.8991554Z 227 │ │ idlePasses++; 2026-10-23T23:34:25.8991748Z 228 │ │ if (idlePasses >= 3) { 2026-10-23T23:34:25.8991889Z 229 │ │ return; 2026-10-23T23:34:25.8991975Z 230 │ │ } 2026-10-23T23:34:25.8992068Z 231 │ │ continue; 2026-10-23T23:34:25.8992155Z 232 │ │ } 2026-10-23T23:34:25.8992260Z 233 │ │ idlePasses = 0; 2026-10-23T23:34:25.8992388Z 234 │ │ const exit = yield* Effect.exit( 2026-10-23T23:34:25.8992621Z 235 │ │ pending.operation as Effect.Effect, 2026-10-23T23:34:25.8992708Z 236 │ │ ); 2026-10-23T23:34:25.8992829Z 237 │ │ yield* Effect.sync(() => { 2026-10-23T23:34:25.8992947Z 238 │ │ pending.resolve(exit); 2026-10-23T23:34:25.8993037Z 239 │ │ }); 2026-10-23T23:34:25.8993182Z 240 │ ╰─▶ } 2026-10-23T23:34:25.8993245Z 241 │ }, 2026-10-23T23:34:25.8993302Z ╰──── 2026-10-23T23:34:25.8993305Z 2026-10-23T23:34:25.8993588Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T23:34:25.8993737Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:60:5] 2026-10-23T23:34:25.8993795Z 57 │ 2026-10-23T23:34:25.8993866Z 58 │ useEffect(() => { 2026-10-23T23:34:25.8993947Z ·  ────┬──── 2026-10-23T23:34:25.8994133Z · ╰── This is the containing effect 2026-10-23T23:34:25.8994237Z 59 │ const controller = new AbortController(); 2026-10-23T23:34:25.8994325Z 60 │ setLoadState("pending"); 2026-10-23T23:34:25.8994410Z ·  ──────┬───── 2026-10-23T23:34:25.8994595Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.8994769Z 61 │ // A renewed signature is used on Retry, not as a reason to reset the native player. 2026-10-23T23:34:25.8994826Z ╰──── 2026-10-23T23:34:25.8995485Z  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-23T23:34:25.8995845Z  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-23T23:34:25.8995850Z 2026-10-23T23:34:25.8996072Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T23:34:25.8996220Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:71:7] 2026-10-23T23:34:25.8996310Z 70 │ return () => controller.abort(); 2026-10-23T23:34:25.8996415Z 71 │ }, [player, props.playRequested, attempt]); 2026-10-23T23:34:25.8996605Z ·  ───┬── ─────────┬───────── ───┬─── 2026-10-23T23:34:25.8996859Z · │ │ ╰── Unnecessary dependency `attempt` 2026-10-23T23:34:25.8997082Z · │ ╰── Unnecessary dependency `props.playRequested` 2026-10-23T23:34:25.8997297Z · ╰── Unnecessary dependency `player_0` 2026-10-23T23:34:25.8997397Z 72 │ 2026-10-23T23:34:25.8997453Z ╰──── 2026-10-23T23:34:25.8997778Z  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-23T23:34:25.8998121Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.8998124Z 2026-10-23T23:34:25.8998404Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T23:34:25.8998581Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:40:5] 2026-10-23T23:34:25.8998709Z 37 │ const [initialized, setInitialized] = useState(false); 2026-10-23T23:34:25.8998789Z 38 │ useLayoutEffect(() => { 2026-10-23T23:34:25.8998872Z ·  ───────┬─────── 2026-10-23T23:34:25.8999017Z · ╰── This is the containing effect 2026-10-23T23:34:25.8999087Z 39 │ reset(); 2026-10-23T23:34:25.8999162Z 40 │ setInitialized(true); 2026-10-23T23:34:25.8999245Z ·  ───────┬────── 2026-10-23T23:34:25.8999429Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.8999498Z 41 │ }, [reset]); 2026-10-23T23:34:25.8999554Z ╰──── 2026-10-23T23:34:25.9000211Z  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-23T23:34:25.9000568Z  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-23T23:34:25.9000571Z 2026-10-23T23:34:25.9000852Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T23:34:25.9001027Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:93:5] 2026-10-23T23:34:25.9001086Z 88 │ 2026-10-23T23:34:25.9001154Z 89 │ useEffect(() => { 2026-10-23T23:34:25.9001232Z ·  ────┬──── 2026-10-23T23:34:25.9001373Z · ╰── This is the containing effect 2026-10-23T23:34:25.9001558Z 90 │ if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return; 2026-10-23T23:34:25.9001671Z 91 │ const branchName = initialProjectRef.branch; 2026-10-23T23:34:25.9001744Z 92 │ let active = true; 2026-10-23T23:34:25.9001851Z 93 │ setPendingCheckouts((count) => count + 1); 2026-10-23T23:34:25.9001943Z ·  ─────────┬───────── 2026-10-23T23:34:25.9002132Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.9002302Z 94 │ // Serialize replacements: ignoring a stale result cannot undo its Git mutation. 2026-10-23T23:34:25.9002359Z ╰──── 2026-10-23T23:34:25.9003076Z  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-23T23:34:25.9003460Z  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-23T23:34:25.9003466Z 2026-10-23T23:34:25.9003743Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T23:34:25.9003889Z ╭─[apps/mobile/src/components/ProjectFavicon.tsx:158:5] 2026-10-23T23:34:25.9004145Z 153 │ const [activeFaviconRequest, setActiveFaviconRequest] = useState(null); 2026-10-23T23:34:25.9004223Z 154 │ useLayoutEffect(() => { 2026-10-23T23:34:25.9004308Z ·  ───────┬─────── 2026-10-23T23:34:25.9004462Z · ╰── This is the containing effect 2026-10-23T23:34:25.9004561Z 155 │ if (faviconRequest === null) return; 2026-10-23T23:34:25.9004619Z 156 │ 2026-10-23T23:34:25.9004763Z 157 │ const endRequest = beginProjectFaviconRequest(faviconRequest); 2026-10-23T23:34:25.9004869Z 158 │ setActiveFaviconRequest(faviconRequest); 2026-10-23T23:34:25.9004970Z ·  ───────────┬─────────── 2026-10-23T23:34:25.9005161Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.9005234Z 159 │ return endRequest; 2026-10-23T23:34:25.9005293Z ╰──── 2026-10-23T23:34:25.9005955Z  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-23T23:34:25.9006310Z  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-23T23:34:25.9006312Z 2026-10-23T23:34:25.9006508Z ⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`. 2026-10-23T23:34:25.9006639Z ╭─[apps/web/src/terminal/ghostty/core.ts:194:19] 2026-10-23T23:34:25.9006780Z 193 │ const count = Math.min(CHUNK_SIZE, graphemeLength - start); 2026-10-23T23:34:25.9006879Z 194 │ const codes = new Array(count); 2026-10-23T23:34:25.9007000Z ·  ──────────────────────── 2026-10-23T23:34:25.9007111Z 195 │ for (let index = 0; index < count; index += 1) { 2026-10-23T23:34:25.9007169Z ╰──── 2026-10-23T23:34:25.9007640Z  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-23T23:34:25.9007646Z 2026-10-23T23:34:25.9007931Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T23:34:25.9008090Z ╭─[apps/mobile/src/components/VideoPreviewModal.ios.tsx:63:55] 2026-10-23T23:34:25.9008153Z 61 │ }, []); 2026-10-23T23:34:25.9008224Z 62 │ useEffect(() => { 2026-10-23T23:34:25.9008301Z ·  ────┬──── 2026-10-23T23:34:25.9008439Z · ╰── This is the containing effect 2026-10-23T23:34:25.9008666Z 63 │ if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl); 2026-10-23T23:34:25.9008836Z ·  ───────┬────── 2026-10-23T23:34:25.9009064Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.9009151Z 64 │ }, [playbackUrl, resolvedUrl]); 2026-10-23T23:34:25.9009205Z ╰──── 2026-10-23T23:34:25.9009860Z  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-23T23:34:25.9010218Z  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-23T23:34:25.9010224Z 2026-10-23T23:34:25.9010444Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T23:34:25.9010587Z ╭─[apps/mobile/src/components/ComposerEditor.tsx:82:6] 2026-10-23T23:34:25.9010645Z 81 │ }, 2026-10-23T23:34:25.9010715Z 82 │ [draftKey], 2026-10-23T23:34:25.9010794Z ·  ────┬─── 2026-10-23T23:34:25.9010943Z · ╰── Unnecessary dependency `draftKey` 2026-10-23T23:34:25.9011004Z 83 │ ); 2026-10-23T23:34:25.9011060Z ╰──── 2026-10-23T23:34:25.9011380Z  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-23T23:34:25.9011727Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.9011733Z 2026-10-23T23:34:25.9011956Z ⚠ eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used. 2026-10-23T23:34:25.9012057Z ╭─[apps/web/src/types.ts:22:3] 2026-10-23T23:34:25.9012135Z 21 │ EnvironmentThreadShell, 2026-10-23T23:34:25.9012207Z 22 │ ThreadRunSummary, 2026-10-23T23:34:25.9012290Z ·  ────────┬─────── 2026-10-23T23:34:25.9012446Z · ╰── 'ThreadRunSummary' is imported here 2026-10-23T23:34:25.9012522Z 23 │ ThreadRuntimeSummary, 2026-10-23T23:34:25.9012577Z ╰──── 2026-10-23T23:34:25.9012682Z  help: Consider removing this import. 2026-10-23T23:34:25.9012685Z 2026-10-23T23:34:25.9012984Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T23:34:25.9013179Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:773:7] 2026-10-23T23:34:25.9013290Z 772 │ if (settingsSheetPresentation.isActive) { 2026-10-23T23:34:25.9013431Z 773 │ settingsRoutePresentation.present(settingsRouteSession); 2026-10-23T23:34:25.9013536Z ·  ────────────┬──────────── 2026-10-23T23:34:25.9013723Z · ╰── Missing dependency `settingsRoutePresentation` 2026-10-23T23:34:25.9013783Z 774 │ } 2026-10-23T23:34:25.9014003Z 775 │ }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]); 2026-10-23T23:34:25.9014170Z ·  ────────────────┬──────────────── 2026-10-23T23:34:25.9014484Z · ╰── Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead 2026-10-23T23:34:25.9014546Z 776 │ 2026-10-23T23:34:25.9014600Z ╰──── 2026-10-23T23:34:25.9015063Z  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-23T23:34:25.9015404Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.9015406Z 2026-10-23T23:34:25.9015577Z ⚠ react(immutability): This value cannot be modified 2026-10-23T23:34:25.9015732Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:391:5] 2026-10-23T23:34:25.9015913Z 387 │ typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0; 2026-10-23T23:34:25.9016177Z 388 │ const animatedBorderRadius = useSharedValue(targetBorderRadius); 2026-10-23T23:34:25.9016282Z ·  ──────────┬───────── 2026-10-23T23:34:25.9016453Z · ╰── `animatedBorderRadius` originates here 2026-10-23T23:34:25.9016624Z 389 │ const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android"; 2026-10-23T23:34:25.9016703Z 390 │ useLayoutEffect(() => { 2026-10-23T23:34:25.9016812Z 391 │ animatedBorderRadius.value = shouldAnimate 2026-10-23T23:34:25.9016910Z ·  ──────────┬───────── 2026-10-23T23:34:25.9017078Z · ╰── `animatedBorderRadius` cannot be modified 2026-10-23T23:34:25.9017183Z 392 │ ? withTiming(targetBorderRadius, { 2026-10-23T23:34:25.9017244Z ╰──── 2026-10-23T23:34:25.9017535Z  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-23T23:34:25.9017865Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T23:34:25.9017871Z 2026-10-23T23:34:25.9018053Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T23:34:25.9018185Z ╭─[apps/web/src/hooks/useThreadActions.ts:821:56] 2026-10-23T23:34:25.9018298Z 820 │ const resolved = resolveThreadTarget(target); 2026-10-23T23:34:25.9018470Z 821 │ if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) { 2026-10-23T23:34:25.9018717Z ·  ─────┬──── 2026-10-23T23:34:25.9018957Z · ╰── Cannot call impure function 2026-10-23T23:34:25.9019045Z 822 │ return AsyncResult.failure( 2026-10-23T23:34:25.9019105Z ╰──── 2026-10-23T23:34:25.9019412Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T23:34:25.9019747Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T23:34:25.9019750Z 2026-10-23T23:34:25.9019933Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T23:34:25.9020069Z ╭─[apps/web/src/hooks/useThreadActions.ts:709:46] 2026-10-23T23:34:25.9020148Z 708 │ const wokeAt = resolved 2026-10-23T23:34:25.9020298Z 709 │ ? threadWokeAt(resolved.thread, { now: new Date().toISOString() }) 2026-10-23T23:34:25.9020422Z ·  ─────┬──── 2026-10-23T23:34:25.9020599Z · ╰── Cannot call impure function 2026-10-23T23:34:25.9020668Z 710 │ : null; 2026-10-23T23:34:25.9020722Z ╰──── 2026-10-23T23:34:25.9021025Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T23:34:25.9021346Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T23:34:25.9021350Z 2026-10-23T23:34:25.9021639Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T23:34:25.9021805Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:512:5] 2026-10-23T23:34:25.9021872Z 510 │ }, []); 2026-10-23T23:34:25.9021947Z 511 │ useEffect(() => { 2026-10-23T23:34:25.9022028Z ·  ────┬──── 2026-10-23T23:34:25.9022166Z · ╰── This is the containing effect 2026-10-23T23:34:25.9022262Z 512 │ setKeyboardStateSuspect(false); 2026-10-23T23:34:25.9022362Z ·  ───────────┬─────────── 2026-10-23T23:34:25.9022552Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.9022663Z 513 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-23T23:34:25.9022725Z ╰──── 2026-10-23T23:34:25.9023376Z  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-23T23:34:25.9023728Z  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-23T23:34:25.9023731Z 2026-10-23T23:34:25.9024009Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T23:34:25.9024219Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:872:7] 2026-10-23T23:34:25.9024451Z 869 │ const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0); 2026-10-23T23:34:25.9024563Z 870 │ useEffect(() => { 2026-10-23T23:34:25.9024642Z ·  ────┬──── 2026-10-23T23:34:25.9024785Z · ╰── This is the containing effect 2026-10-23T23:34:25.9024963Z 871 │ if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) { 2026-10-23T23:34:25.9025086Z 872 │ setLastKnownKeyboardHeight(liveKeyboardHeight); 2026-10-23T23:34:25.9025194Z ·  ─────────────┬──────────── 2026-10-23T23:34:25.9025383Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.9025445Z 873 │ } 2026-10-23T23:34:25.9025502Z ╰──── 2026-10-23T23:34:25.9026160Z  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-23T23:34:25.9026511Z  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-23T23:34:25.9026514Z 2026-10-23T23:34:25.9026789Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T23:34:25.9026958Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1119:5] 2026-10-23T23:34:25.9027018Z 1117 │ 2026-10-23T23:34:25.9027091Z 1118 │ useEffect(() => { 2026-10-23T23:34:25.9027168Z ·  ────┬──── 2026-10-23T23:34:25.9027317Z · ╰── This is the containing effect 2026-10-23T23:34:25.9027406Z 1119 │ setAnchorMessageId(null); 2026-10-23T23:34:25.9027507Z ·  ─────────┬──────── 2026-10-23T23:34:25.9027690Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.9027789Z 1120 │ setSubmittedMessageId(null); 2026-10-23T23:34:25.9027850Z ╰──── 2026-10-23T23:34:25.9028500Z  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-23T23:34:25.9028857Z  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-23T23:34:25.9028862Z 2026-10-23T23:34:25.9029079Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T23:34:25.9029242Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:513:7] 2026-10-23T23:34:25.9029336Z 512 │ setKeyboardStateSuspect(false); 2026-10-23T23:34:25.9029445Z 513 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-23T23:34:25.9029596Z ·  ────────┬──────── ─────────┬──────── 2026-10-23T23:34:25.9029823Z · │ ╰── Unnecessary dependency `liveKeyboardHeight` 2026-10-23T23:34:25.9030056Z · ╰── Unnecessary dependency `isKeyboardVisible` 2026-10-23T23:34:25.9030244Z 514 │ const handleOwnedInputFocusChange = (focused: boolean) => { 2026-10-23T23:34:25.9030301Z ╰──── 2026-10-23T23:34:25.9030624Z  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-23T23:34:25.9030965Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.9030968Z 2026-10-23T23:34:25.9031189Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T23:34:25.9031360Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1067:7] 2026-10-23T23:34:25.9031454Z 1066 │ userInputInsetProgress.set(1); 2026-10-23T23:34:25.9031640Z 1067 │ }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]); 2026-10-23T23:34:25.9031751Z ·  ────────────┬─────────── 2026-10-23T23:34:25.9031951Z · ╰── Unnecessary dependency `activeUserInputRequestId` 2026-10-23T23:34:25.9032066Z 1068 │ const showContent = props.showContent ?? true; 2026-10-23T23:34:25.9032125Z ╰──── 2026-10-23T23:34:25.9032448Z  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-23T23:34:25.9032790Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.9032793Z 2026-10-23T23:34:25.9033017Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T23:34:25.9033190Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1125:15] 2026-10-23T23:34:25.9033267Z 1124 │ freeze.set(false); 2026-10-23T23:34:25.9033358Z 1125 │ }, [freeze, selectedThreadKey]); 2026-10-23T23:34:25.9033462Z ·  ────────┬──────── 2026-10-23T23:34:25.9033642Z · ╰── Unnecessary dependency `selectedThreadKey` 2026-10-23T23:34:25.9033705Z 1126 │ 2026-10-23T23:34:25.9033762Z ╰──── 2026-10-23T23:34:25.9034122Z  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-23T23:34:25.9034526Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.9034567Z 2026-10-23T23:34:25.9034744Z ⚠ react(immutability): This value cannot be modified 2026-10-23T23:34:25.9034909Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:955:5] 2026-10-23T23:34:25.9035034Z 950 │ const composerPopoverHeight = useSharedValue(0); 2026-10-23T23:34:25.9035146Z 951 │ const floatingControlCoverage = useSharedValue( 2026-10-23T23:34:25.9035256Z ·  ───────────┬─────────── 2026-10-23T23:34:25.9035437Z · ╰── `floatingControlCoverage` originates here 2026-10-23T23:34:25.9035577Z 952 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-23T23:34:25.9035636Z 953 │ ); 2026-10-23T23:34:25.9035710Z 954 │ useEffect(() => { 2026-10-23T23:34:25.9035829Z 955 │ floatingControlCoverage.value = withTiming( 2026-10-23T23:34:25.9035933Z ·  ───────────┬─────────── 2026-10-23T23:34:25.9036111Z · ╰── `floatingControlCoverage` cannot be modified 2026-10-23T23:34:25.9036252Z 956 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-23T23:34:25.9036309Z ╰──── 2026-10-23T23:34:25.9036601Z  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-23T23:34:25.9036932Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T23:34:25.9036939Z 2026-10-23T23:34:25.9037108Z ⚠ react(immutability): This value cannot be modified 2026-10-23T23:34:25.9037279Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:973:7] 2026-10-23T23:34:25.9037489Z 963 │ const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null; 2026-10-23T23:34:25.9037625Z 964 │ const combinedContentInsetEndAdjustment = useSharedValue( 2026-10-23T23:34:25.9037746Z ·  ────────────────┬──────────────── 2026-10-23T23:34:25.9037954Z · ╰── `combinedContentInsetEndAdjustment` originates here 2026-10-23T23:34:25.9038098Z 965 │ Math.max(0, estimatedOverlayHeight - nativeInsetOvercount), 2026-10-23T23:34:25.9038160Z 966 │ ); 2026-10-23T23:34:25.9038235Z 967 │ useAnimatedReaction( 2026-10-23T23:34:25.9038302Z 968 │ () => 2026-10-23T23:34:25.9038404Z 969 │ contentInsetEndAdjustment.value + 2026-10-23T23:34:25.9038508Z 970 │ floatingControlCoverage.value + 2026-10-23T23:34:25.9038725Z 971 │ (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0), 2026-10-23T23:34:25.9038797Z 972 │ (value) => { 2026-10-23T23:34:25.9038923Z 973 │ combinedContentInsetEndAdjustment.value = value; 2026-10-23T23:34:25.9039046Z ·  ────────────────┬──────────────── 2026-10-23T23:34:25.9039255Z · ╰── `combinedContentInsetEndAdjustment` cannot be modified 2026-10-23T23:34:25.9039318Z 974 │ }, 2026-10-23T23:34:25.9039375Z ╰──── 2026-10-23T23:34:25.9039667Z  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-23T23:34:25.9040066Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T23:34:25.9040108Z 2026-10-23T23:34:25.9040371Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-23T23:34:25.9040527Z ╭─[apps/web/src/components/chat/useComposerSend.ts:985:13] 2026-10-23T23:34:25.9040661Z 984 │ const changedBeforeDecline = draftChangedSinceSend(); 2026-10-23T23:34:25.9040935Z 985 │ ╭─▶ const pendingIdsBeforeDecline = pendingApprovalsRef.current.map( 2026-10-23T23:34:25.9041069Z 986 │ │ (approval) => approval.requestId, 2026-10-23T23:34:25.9041217Z 987 │ ╰─▶ ); 2026-10-23T23:34:25.9041381Z 988 │ const approvalResponding = approvalsToDecline.some((approval) => 2026-10-23T23:34:25.9041442Z ╰──── 2026-10-23T23:34:25.9041526Z  help: Switch to `Set` 2026-10-23T23:34:25.9041529Z 2026-10-23T23:34:25.9041690Z ⚠ react(refs): Cannot access refs during render 2026-10-23T23:34:25.9041822Z ╭─[apps/mobile/src/components/ui/Menu.tsx:54:36] 2026-10-23T23:34:25.9042020Z 53 │ const child = children as ReactElement>; 2026-10-23T23:34:25.9042208Z 54 │ ╭─▶ children = cloneElement(child, { 2026-10-23T23:34:25.9042324Z 55 │ │ onTouchStart: (event) => { 2026-10-23T23:34:25.9042498Z 56 │ │ // Reset for a new touch, not onPressIn, which also fires when a 2026-10-23T23:34:25.9042678Z 57 │ │ // finger moves out of the row and back during the same gesture. 2026-10-23T23:34:25.9042820Z 58 │ │ menuPress.current.isPreparing = false; 2026-10-23T23:34:25.9043005Z 59 │ │ menuPress.current.suppressPress = menuPress.current.isOpen; 2026-10-23T23:34:25.9043128Z 60 │ │ pendingPress.current = null; 2026-10-23T23:34:25.9043257Z 61 │ │ child.props.onTouchStart?.(event); 2026-10-23T23:34:25.9043341Z 62 │ │ }, 2026-10-23T23:34:25.9043452Z 63 │ │ onPress: (event) => { 2026-10-23T23:34:25.9043639Z 64 │ │ // Accessibility clicks have no touch identifier and must not inherit 2026-10-23T23:34:25.9043790Z 65 │ │ // cancellation from a previous physical gesture. 2026-10-23T23:34:25.9043986Z 66 │ │ const isTouch = typeof event.nativeEvent.identifier === "number"; 2026-10-23T23:34:25.9044248Z 67 │ │ if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) { 2026-10-23T23:34:25.9044346Z 68 │ │ return; 2026-10-23T23:34:25.9044433Z 69 │ │ } 2026-10-23T23:34:25.9044590Z 70 │ │ if (isTouch && menuPress.current.isPreparing) { 2026-10-23T23:34:25.9044778Z 71 │ │ // A release can arrive between native menu preparation and display. 2026-10-23T23:34:25.9044965Z 72 │ │ // Let UIKit's display/cancel callback decide this press's outcome. 2026-10-23T23:34:25.9045079Z 73 │ │ event.persist(); 2026-10-23T23:34:25.9045337Z 74 │ │ pendingPress.current = () => child.props.onPress?.(event); 2026-10-23T23:34:25.9045475Z 75 │ │ return; 2026-10-23T23:34:25.9045564Z 76 │ │ } 2026-10-23T23:34:25.9045696Z 77 │ │ child.props.onPress?.(event); 2026-10-23T23:34:25.9045786Z 78 │ │ }, 2026-10-23T23:34:25.9045931Z 79 │ ├─▶ }); 2026-10-23T23:34:25.9046199Z · ╰──── Passing a ref to a function may read its value during render 2026-10-23T23:34:25.9046318Z 80 │ menuProps.onMenuInteractionStart = () => { 2026-10-23T23:34:25.9046378Z ╰──── 2026-10-23T23:34:25.9046904Z  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-23T23:34:25.9047236Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T23:34:25.9047239Z 2026-10-23T23:34:25.9047527Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T23:34:25.9047716Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:215:7] 2026-10-23T23:34:25.9047779Z 211 │ }; 2026-10-23T23:34:25.9047852Z 212 │ useEffect(() => { 2026-10-23T23:34:25.9047934Z ·  ────┬──── 2026-10-23T23:34:25.9048080Z · ╰── This is the containing effect 2026-10-23T23:34:25.9048285Z 213 │ const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null; 2026-10-23T23:34:25.9048358Z 214 │ if (inserted) { 2026-10-23T23:34:25.9048447Z 215 │ setSelection((current) => 2026-10-23T23:34:25.9048537Z ·  ──────┬───── 2026-10-23T23:34:25.9048727Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.9048911Z 216 │ current.start === inserted.start && current.end === inserted.end ? current : inserted, 2026-10-23T23:34:25.9048971Z ╰──── 2026-10-23T23:34:25.9049636Z  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-23T23:34:25.9049997Z  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-23T23:34:25.9050003Z 2026-10-23T23:34:25.9050286Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T23:34:25.9050466Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:296:7] 2026-10-23T23:34:25.9050555Z 284 │ }, [hasWorkspaceSnapshot]); 2026-10-23T23:34:25.9050627Z 285 │ useEffect(() => { 2026-10-23T23:34:25.9050708Z ·  ────┬──── 2026-10-23T23:34:25.9050852Z · ╰── This is the containing effect 2026-10-23T23:34:25.9051019Z 286 │ if (!environmentId || !projectCwd || !selectedProviderInstanceId) return; 2026-10-23T23:34:25.9051252Z 287 │ const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`; 2026-10-23T23:34:25.9051372Z 288 │ const now = Date.now(); 2026-10-23T23:34:25.9051497Z 289 │ const lastRequest = workspaceRefreshKeyRef.current; 2026-10-23T23:34:25.9051562Z 290 │ if ( 2026-10-23T23:34:25.9051650Z 291 │ lastRequest?.key === key && 2026-10-23T23:34:25.9051805Z 292 │ now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS 2026-10-23T23:34:25.9051936Z 293 │ ) 2026-10-23T23:34:25.9052045Z 294 │ return; 2026-10-23T23:34:25.9052273Z 295 │ if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) { 2026-10-23T23:34:25.9052539Z 296 │ setWorkspaceRefreshRetry(null); 2026-10-23T23:34:25.9052690Z ·  ────────────┬─────────── 2026-10-23T23:34:25.9052923Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.9053025Z 297 │ return; 2026-10-23T23:34:25.9053092Z ╰──── 2026-10-23T23:34:25.9053800Z  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-23T23:34:25.9054253Z  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-23T23:34:25.9054256Z 2026-10-23T23:34:25.9054511Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T23:34:25.9054714Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:326:5] 2026-10-23T23:34:25.9054806Z 325 │ }, [ 2026-10-23T23:34:25.9054921Z 326 │ draftMessage, 2026-10-23T23:34:25.9055033Z ·  ──────┬───── 2026-10-23T23:34:25.9055221Z · ╰── Unnecessary dependency `draftMessage` 2026-10-23T23:34:25.9055298Z 327 │ environmentId, 2026-10-23T23:34:25.9055407Z ╰──── 2026-10-23T23:34:25.9055756Z  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-23T23:34:25.9056196Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.9056199Z 2026-10-23T23:34:25.9056438Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T23:34:25.9056615Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:121:27] 2026-10-23T23:34:25.9056840Z 120 │ const scope = makeScope(options.capabilities ?? new Set(["preview", "worktree"])); 2026-10-23T23:34:25.9056972Z 121 │ const dispatch = vi.fn((_: unknown) => 2026-10-23T23:34:25.9057099Z ·  ┬ 2026-10-23T23:34:25.9057249Z · ╰── '_' is declared here 2026-10-23T23:34:25.9057420Z 122 │ (options.dispatchGate ?? Effect.void).pipe( 2026-10-23T23:34:25.9057512Z ╰──── 2026-10-23T23:34:25.9057654Z  help: Consider removing this parameter. 2026-10-23T23:34:25.9057658Z 2026-10-23T23:34:25.9058003Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T23:34:25.9058239Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:134:39] 2026-10-23T23:34:25.9058341Z 133 │ ); 2026-10-23T23:34:25.9058490Z 134 │ const listLocalBranchNames = vi.fn((_: string) => 2026-10-23T23:34:25.9058637Z ·  ┬ 2026-10-23T23:34:25.9058797Z · ╰── '_' is declared here 2026-10-23T23:34:25.9058925Z 135 │ Effect.succeed( 2026-10-23T23:34:25.9059014Z ╰──── 2026-10-23T23:34:25.9059168Z  help: Consider removing this parameter. 2026-10-23T23:34:25.9059171Z 2026-10-23T23:34:25.9059380Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T23:34:25.9059566Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:178:31] 2026-10-23T23:34:25.9059675Z 177 │ }); 2026-10-23T23:34:25.9059826Z 178 │ const sendToThread = vi.fn((_: unknown) => { 2026-10-23T23:34:25.9059936Z ·  ┬ 2026-10-23T23:34:25.9060111Z · ╰── '_' is declared here 2026-10-23T23:34:25.9060276Z 179 │ switch (options.continuation ?? "queued") { 2026-10-23T23:34:25.9060372Z ╰──── 2026-10-23T23:34:25.9060494Z  help: Consider removing this parameter. 2026-10-23T23:34:25.9060497Z 2026-10-23T23:34:25.9060729Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T23:34:25.9060915Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:203:33] 2026-10-23T23:34:25.9061018Z 202 │ ); 2026-10-23T23:34:25.9061143Z 203 │ const removeWorktree = vi.fn((_: unknown) => 2026-10-23T23:34:25.9061285Z ·  ┬ 2026-10-23T23:34:25.9061461Z · ╰── '_' is declared here 2026-10-23T23:34:25.9061607Z 204 │ options.removeWorktreeFails 2026-10-23T23:34:25.9061683Z ╰──── 2026-10-23T23:34:25.9061826Z  help: Consider removing this parameter. 2026-10-23T23:34:25.9061829Z 2026-10-23T23:34:25.9062057Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T23:34:25.9062239Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:208:36] 2026-10-23T23:34:25.9062348Z 207 │ ); 2026-10-23T23:34:25.9062470Z 208 │ const deleteLocalBranch = vi.fn((_: unknown) => 2026-10-23T23:34:25.9062608Z ·  ┬ 2026-10-23T23:34:25.9062791Z · ╰── '_' is declared here 2026-10-23T23:34:25.9062944Z 209 │ options.deleteLocalBranchFails 2026-10-23T23:34:25.9063015Z ╰──── 2026-10-23T23:34:25.9063156Z  help: Consider removing this parameter. 2026-10-23T23:34:25.9063159Z 2026-10-23T23:34:25.9063386Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T23:34:25.9063571Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:213:42] 2026-10-23T23:34:25.9063659Z 212 │ ); 2026-10-23T23:34:25.9063815Z 213 │ const fetchWorktreeBaseCommit = vi.fn((_: unknown) => 2026-10-23T23:34:25.9063955Z ·  ┬ 2026-10-23T23:34:25.9064185Z · ╰── '_' is declared here 2026-10-23T23:34:25.9064379Z 214 │ options.fetchWorktreeBaseFails 2026-10-23T23:34:25.9064512Z ╰──── 2026-10-23T23:34:25.9064652Z  help: Consider removing this parameter. 2026-10-23T23:34:25.9064655Z 2026-10-23T23:34:25.9064889Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T23:34:25.9065040Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:254:30] 2026-10-23T23:34:25.9065155Z 253 │ ); 2026-10-23T23:34:25.9065293Z 254 │ const localStatus = vi.fn((_: unknown) => 2026-10-23T23:34:25.9065425Z ·  ┬ 2026-10-23T23:34:25.9065583Z · ╰── '_' is declared here 2026-10-23T23:34:25.9065689Z 255 │ Effect.succeed({ 2026-10-23T23:34:25.9065789Z ╰──── 2026-10-23T23:34:25.9065933Z  help: Consider removing this parameter. 2026-10-23T23:34:25.9065941Z 2026-10-23T23:34:25.9066183Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T23:34:25.9066336Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:264:32] 2026-10-23T23:34:25.9066447Z 263 │ ); 2026-10-23T23:34:25.9066637Z 264 │ const refreshStatus = vi.fn((_: string) => Effect.die("refreshStatus stub")); 2026-10-23T23:34:25.9066770Z ·  ┬ 2026-10-23T23:34:25.9066931Z · ╰── '_' is declared here 2026-10-23T23:34:25.9067125Z 265 │ const runForThread = vi.fn((input: { readonly worktreePath: string }) => { 2026-10-23T23:34:25.9067226Z ╰──── 2026-10-23T23:34:25.9067375Z  help: Consider removing this parameter. 2026-10-23T23:34:25.9067378Z 2026-10-23T23:34:25.9067715Z ⚠ eslint(no-unused-vars): Variable 'revokeActiveMcpThread' is declared but never used. Unused variables should start with a '_'. 2026-10-23T23:34:25.9067880Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:218:7] 2026-10-23T23:34:25.9067995Z 217 │ 2026-10-23T23:34:25.9068195Z 218 │ const revokeActiveMcpThread = (threadId: ThreadId): Effect.Effect => 2026-10-23T23:34:25.9068307Z ·  ──────────┬────────── 2026-10-23T23:34:25.9068512Z · ╰── 'revokeActiveMcpThread' is declared here 2026-10-23T23:34:25.9068797Z 219 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeThread(threadId) : Effect.void; 2026-10-23T23:34:25.9068896Z ╰──── 2026-10-23T23:34:25.9069031Z  help: Consider removing this declaration. 2026-10-23T23:34:25.9069055Z 2026-10-23T23:34:25.9069477Z ⚠ eslint(no-unused-vars): Variable 'revokeAllActiveMcpCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-23T23:34:25.9069680Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:221:7] 2026-10-23T23:34:25.9069798Z 220 │ 2026-10-23T23:34:25.9069973Z 221 │ const revokeAllActiveMcpCredentials = (): Effect.Effect => 2026-10-23T23:34:25.9070101Z ·  ──────────────┬────────────── 2026-10-23T23:34:25.9070329Z · ╰── 'revokeAllActiveMcpCredentials' is declared here 2026-10-23T23:34:25.9070553Z 222 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void; 2026-10-23T23:34:25.9070653Z ╰──── 2026-10-23T23:34:25.9070778Z  help: Consider removing this declaration. 2026-10-23T23:34:25.9070781Z 2026-10-23T23:34:25.9070988Z ⚠ eslint(no-new): Do not use 'new' for side effects. 2026-10-23T23:34:25.9071148Z ╭─[apps/server/src/mcp/McpToolAccess.test.ts:168:3] 2026-10-23T23:34:25.9071329Z 167 │ // @ts-expect-error a declaration constructed directly 2026-10-23T23:34:25.9071444Z 168 │ new McpToolAccess.Declaration(unchecked); 2026-10-23T23:34:25.9071586Z ·  ───────────────────────────── 2026-10-23T23:34:25.9071758Z 169 │ // @ts-expect-error a handlers layer built outside McpToolAccess 2026-10-23T23:34:25.9071859Z ╰──── 2026-10-23T23:34:25.9072070Z  help: Assign the result of 'new' to a variable or compare it to a reference. 2026-10-23T23:34:25.9072073Z 2026-10-23T23:34:25.9072271Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T23:34:25.9072486Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:697:76] 2026-10-23T23:34:25.9072711Z 696 │ const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() })); 2026-10-23T23:34:25.9072942Z 697 │ if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() }); 2026-10-23T23:34:25.9073107Z ·  ─────┬──── 2026-10-23T23:34:25.9073348Z · ╰── Cannot call impure function 2026-10-23T23:34:25.9073532Z 698 │ const snoozeGateNow = new Date(snoozeGateClock.now).toISOString(); 2026-10-23T23:34:25.9073621Z ╰──── 2026-10-23T23:34:25.9073974Z  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-23T23:34:25.9074360Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T23:34:25.9074366Z 2026-10-23T23:34:25.9074587Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T23:34:25.9074780Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:718:71] 2026-10-23T23:34:25.9074917Z 717 │ const snoozePresets = useMemo( 2026-10-23T23:34:25.9075124Z 718 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-23T23:34:25.9075298Z ·  ─────┬──── 2026-10-23T23:34:25.9075538Z · ╰── Cannot call impure function 2026-10-23T23:34:25.9075773Z 719 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-23T23:34:25.9075906Z ╰──── 2026-10-23T23:34:25.9076218Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T23:34:25.9076571Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T23:34:25.9076574Z 2026-10-23T23:34:25.9076796Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T23:34:25.9077025Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:719:6] 2026-10-23T23:34:25.9077253Z 718 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-23T23:34:25.9077400Z 719 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-23T23:34:25.9077536Z ·  ────────────┬─────────── 2026-10-23T23:34:25.9077767Z · ╰── Unnecessary dependency `props.snoozePresetMinute` 2026-10-23T23:34:25.9077869Z 720 │ ); 2026-10-23T23:34:25.9077937Z ╰──── 2026-10-23T23:34:25.9078318Z  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-23T23:34:25.9078683Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.9078686Z 2026-10-23T23:34:25.9078942Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T23:34:25.9079133Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:765:7] 2026-10-23T23:34:25.9079250Z 764 │ thread.pinnedAt, 2026-10-23T23:34:25.9079353Z 765 │ variant, 2026-10-23T23:34:25.9079471Z ·  ───┬─── 2026-10-23T23:34:25.9079648Z · ╰── Unnecessary dependency `variant` 2026-10-23T23:34:25.9079748Z 766 │ ], 2026-10-23T23:34:25.9079839Z ╰──── 2026-10-23T23:34:25.9080203Z  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-23T23:34:25.9080605Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.9080609Z 2026-10-23T23:34:25.9080842Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T23:34:25.9081054Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1215:21] 2026-10-23T23:34:25.9081238Z 1214 │ {providerDrivers.slice(0, -1).map((driver, index) => ( 2026-10-23T23:34:25.9081436Z 1215 │ 2026-10-23T23:34:25.9081588Z ·  ────────────────────────── 2026-10-23T23:34:25.9081744Z 1216 │ 2026-10-23T23:34:25.9081838Z ╰──── 2026-10-23T23:34:25.9082027Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-23T23:34:25.9082031Z 2026-10-23T23:34:25.9082259Z ⚠ react(refs): Cannot access refs during render 2026-10-23T23:34:25.9082517Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:152:27] 2026-10-23T23:34:25.9082805Z 151 │ 2026-10-23T23:34:25.9082925Z 152 │ {props.children(open)} 2026-10-23T23:34:25.9083069Z ·  ──┬─ 2026-10-23T23:34:25.9083287Z · ╰── Cannot access ref value during render 2026-10-23T23:34:25.9083388Z 153 │ 2026-10-23T23:34:25.9083485Z ╰──── 2026-10-23T23:34:25.9084090Z  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-23T23:34:25.9084447Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T23:34:25.9084481Z 2026-10-23T23:34:25.9084714Z ⚠ react(memo-dependencies): Found missing/extra memoization dependencies 2026-10-23T23:34:25.9084922Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:140:9] 2026-10-23T23:34:25.9085050Z 139 │ if (action.id !== undefined) { 2026-10-23T23:34:25.9085173Z 140 │ props.onPressAction?.({ 2026-10-23T23:34:25.9085275Z ·  ──┬── 2026-10-23T23:34:25.9085458Z · ╰── Missing dependency `props` 2026-10-23T23:34:25.9085598Z 141 │ nativeEvent: { event: action.id }, 2026-10-23T23:34:25.9085784Z 142 │ } as Parameters>[0]); 2026-10-23T23:34:25.9085880Z 143 │ } 2026-10-23T23:34:25.9085988Z 144 │ }, 2026-10-23T23:34:25.9086110Z 145 │ [close, props.onPressAction], 2026-10-23T23:34:25.9086246Z ·  ─────────┬───────── 2026-10-23T23:34:25.9086489Z · ╰── Overly precise dependency `props.onPressAction`, use `props` instead 2026-10-23T23:34:25.9086600Z 146 │ ); 2026-10-23T23:34:25.9086693Z ╰──── 2026-10-23T23:34:25.9087264Z  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-23T23:34:25.9087633Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.9087651Z 2026-10-23T23:34:25.9087900Z ⚠ eslint(no-unused-vars): Identifier 'Duration' is imported but never used. 2026-10-23T23:34:25.9088258Z ╭─[packages/provider-pi/src/server/adapter.test.ts:24:13] 2026-10-23T23:34:25.9088397Z 23 │ import * as Deferred from "effect/Deferred"; 2026-10-23T23:34:25.9088534Z 24 │ import * as Duration from "effect/Duration"; 2026-10-23T23:34:25.9088627Z ·  ────┬─── 2026-10-23T23:34:25.9088842Z · ╰── 'Duration' is imported here 2026-10-23T23:34:25.9088972Z 25 │ import * as Effect from "effect/Effect"; 2026-10-23T23:34:25.9089064Z ╰──── 2026-10-23T23:34:25.9089186Z  help: Consider removing this import. 2026-10-23T23:34:25.9089189Z 2026-10-23T23:34:25.9089493Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T23:34:25.9089767Z ╭─[apps/web/src/components/chat/useThreadLifecycle.tsx:178:58] 2026-10-23T23:34:25.9089934Z 177 │ if (snoozeClockState.shell !== activeThreadShell) { 2026-10-23T23:34:25.9090133Z 178 │ setSnoozeClockState({ shell: activeThreadShell, now: new Date().toISOString() }); 2026-10-23T23:34:25.9090303Z ·  ─────┬──── 2026-10-23T23:34:25.9090560Z · ╰── Cannot call impure function 2026-10-23T23:34:25.9090656Z 179 │ } 2026-10-23T23:34:25.9090750Z ╰──── 2026-10-23T23:34:25.9091095Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T23:34:25.9091611Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T23:34:25.9091617Z 2026-10-23T23:34:25.9091953Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T23:34:25.9092156Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:361:7] 2026-10-23T23:34:25.9092349Z 355 │ }, [cancelledIncomingShareId, navigation, props.incomingShareId]); 2026-10-23T23:34:25.9092428Z 356 │ useEffect(() => { 2026-10-23T23:34:25.9092572Z ·  ────┬──── 2026-10-23T23:34:25.9092749Z · ╰── This is the containing effect 2026-10-23T23:34:25.9092888Z 357 │ if (!isReturningToProjectPicker) { 2026-10-23T23:34:25.9092975Z 358 │ return; 2026-10-23T23:34:25.9093077Z 359 │ } 2026-10-23T23:34:25.9093241Z 360 │ if (requestedInitialProjectAvailable) { 2026-10-23T23:34:25.9093359Z 361 │ setIsReturningToProjectPicker(false); 2026-10-23T23:34:25.9093514Z ·  ──────────────┬────────────── 2026-10-23T23:34:25.9093739Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.9093860Z 362 │ return; 2026-10-23T23:34:25.9093958Z ╰──── 2026-10-23T23:34:25.9094689Z  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-23T23:34:25.9095089Z  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-23T23:34:25.9095095Z 2026-10-23T23:34:25.9095551Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T23:34:25.9095771Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:504:9] 2026-10-23T23:34:25.9095871Z 447 │ 2026-10-23T23:34:25.9096264Z 448 │ useEffect(() => { 2026-10-23T23:34:25.9096369Z ·  ────┬──── 2026-10-23T23:34:25.9096566Z · ╰── This is the containing effect 2026-10-23T23:34:25.9096717Z 449 │ if (props.pendingTaskId || props.draftId) { 2026-10-23T23:34:25.9096798Z 450 │ return; 2026-10-23T23:34:25.9097015Z 451 │ } 2026-10-23T23:34:25.9097274Z 452 │ if (lastInitialProjectRefRef.current !== props.initialProjectRef) { 2026-10-23T23:34:25.9097460Z 453 │ lastInitialProjectRefRef.current = props.initialProjectRef; 2026-10-23T23:34:25.9097593Z 454 │ appliedInitialProjectKeyRef.current = null; 2026-10-23T23:34:25.9097685Z 455 │ } 2026-10-23T23:34:25.9097855Z 456 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-23T23:34:25.9106075Z 457 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-23T23:34:25.9106253Z 458 │ if (initialEnvironmentId && initialProjectId) { 2026-10-23T23:34:25.9106334Z 459 │ const directProject = 2026-10-23T23:34:25.9106406Z 460 │ projects.find( 2026-10-23T23:34:25.9106477Z 461 │ (project) => 2026-10-23T23:34:25.9106684Z 462 │ project.environmentId === initialEnvironmentId && project.id === initialProjectId, 2026-10-23T23:34:25.9106765Z 463 │ ) ?? null; 2026-10-23T23:34:25.9106823Z 464 │ 2026-10-23T23:34:25.9106901Z 465 │ if (directProject) { 2026-10-23T23:34:25.9107055Z 466 │ // Apply the route's project once. Re-applying on every change would 2026-10-23T23:34:25.9107205Z 467 │ // instantly revert environment/project switches made in the picker. 2026-10-23T23:34:25.9107384Z 468 │ const directProjectKey = `${directProject.environmentId}:${directProject.id}`; 2026-10-23T23:34:25.9107533Z 469 │ if (appliedInitialProjectKeyRef.current === directProjectKey) { 2026-10-23T23:34:25.9107603Z 470 │ return; 2026-10-23T23:34:25.9107664Z 471 │ } 2026-10-23T23:34:25.9107774Z 472 │ if (props.initialProjectRef?.branch) { 2026-10-23T23:34:25.9107843Z 473 │ if ( 2026-10-23T23:34:25.9108008Z 474 │ selectedProject?.environmentId !== directProject.environmentId || 2026-10-23T23:34:25.9108120Z 475 │ selectedProject.id !== directProject.id 2026-10-23T23:34:25.9108187Z 476 │ ) { 2026-10-23T23:34:25.9108279Z 477 │ setProject(directProject); 2026-10-23T23:34:25.9108351Z 478 │ return; 2026-10-23T23:34:25.9108416Z 479 │ } 2026-10-23T23:34:25.9108507Z 480 │ if (!flow.draftKey) return; 2026-10-23T23:34:25.9108663Z 481 │ // The route completes checkout before mounting this composer. Local 2026-10-23T23:34:25.9108818Z 482 │ // mode reuses an existing worktree; worktree mode would create another. 2026-10-23T23:34:25.9108937Z 483 │ updateComposerDraftSettings(flow.draftKey, { 2026-10-23T23:34:25.9109026Z 484 │ workspaceSelection: { 2026-10-23T23:34:25.9109105Z 485 │ mode: "local", 2026-10-23T23:34:25.9109341Z 486 │ branch: props.initialProjectRef.branch, 2026-10-23T23:34:25.9109546Z 487 │ worktreePath: props.initialProjectRef.worktreePath ?? null, 2026-10-23T23:34:25.9109635Z 488 │ startFromOrigin: false, 2026-10-23T23:34:25.9109701Z 489 │ }, 2026-10-23T23:34:25.9109766Z 490 │ }); 2026-10-23T23:34:25.9109825Z 491 │ } 2026-10-23T23:34:25.9109965Z 492 │ appliedInitialProjectKeyRef.current = directProjectKey; 2026-10-23T23:34:25.9110032Z 493 │ if ( 2026-10-23T23:34:25.9110186Z 494 │ selectedProject?.environmentId === directProject.environmentId && 2026-10-23T23:34:25.9110291Z 495 │ selectedProject.id === directProject.id 2026-10-23T23:34:25.9110356Z 496 │ ) { 2026-10-23T23:34:25.9110424Z 497 │ return; 2026-10-23T23:34:25.9110486Z 498 │ } 2026-10-23T23:34:25.9110576Z 499 │ setProject(directProject); 2026-10-23T23:34:25.9110646Z 500 │ return; 2026-10-23T23:34:25.9110707Z 501 │ } 2026-10-23T23:34:25.9110763Z 502 │ 2026-10-23T23:34:25.9110847Z 503 │ if (projects.length > 0) { 2026-10-23T23:34:25.9110955Z 504 │ setIsReturningToProjectPicker(true); 2026-10-23T23:34:25.9111077Z ·  ──────────────┬────────────── 2026-10-23T23:34:25.9111281Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.9111342Z 505 │ } 2026-10-23T23:34:25.9111399Z ╰──── 2026-10-23T23:34:25.9112057Z  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-23T23:34:25.9112415Z  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-23T23:34:25.9112419Z 2026-10-23T23:34:25.9112694Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T23:34:25.9112862Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:604:5] 2026-10-23T23:34:25.9112920Z 545 │ 2026-10-23T23:34:25.9112990Z 546 │ useEffect(() => { 2026-10-23T23:34:25.9113064Z ·  ────┬──── 2026-10-23T23:34:25.9113204Z · ╰── This is the containing effect 2026-10-23T23:34:25.9113306Z 547 │ const shareId = props.incomingShareId; 2026-10-23T23:34:25.9113400Z 548 │ const draftKey = flow.draftKey; 2026-10-23T23:34:25.9113505Z 549 │ const destinationProject = selectedProject; 2026-10-23T23:34:25.9113655Z 550 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-23T23:34:25.9113790Z 551 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-23T23:34:25.9113886Z 552 │ const selectedProjectMatchesRoute = 2026-10-23T23:34:25.9113964Z 553 │ !initialEnvironmentId || 2026-10-23T23:34:25.9114077Z 554 │ !initialProjectId || 2026-10-23T23:34:25.9114218Z 555 │ (destinationProject?.environmentId === initialEnvironmentId && 2026-10-23T23:34:25.9114328Z 556 │ destinationProject.id === initialProjectId); 2026-10-23T23:34:25.9114388Z 557 │ if ( 2026-10-23T23:34:25.9114456Z 558 │ !shareId || 2026-10-23T23:34:25.9114524Z 559 │ !draftKey || 2026-10-23T23:34:25.9114661Z 560 │ !destinationProject || 2026-10-23T23:34:25.9114792Z 561 │ !selectedProjectMatchesRoute || 2026-10-23T23:34:25.9114891Z 562 │ cancelledIncomingShareId === shareId 2026-10-23T23:34:25.9114954Z 563 │ ) { 2026-10-23T23:34:25.9115020Z 564 │ return; 2026-10-23T23:34:25.9115078Z 565 │ } 2026-10-23T23:34:25.9115182Z 566 │ const importKey = `${shareId}:${draftKey}`; 2026-10-23T23:34:25.9115244Z 567 │ if ( 2026-10-23T23:34:25.9115361Z 568 │ startedShareImportKeyRef.current === importKey || 2026-10-23T23:34:25.9115479Z 569 │ cancellingShareImportKeyRef.current === importKey 2026-10-23T23:34:25.9115538Z 570 │ ) { 2026-10-23T23:34:25.9115603Z 571 │ return; 2026-10-23T23:34:25.9115659Z 572 │ } 2026-10-23T23:34:25.9115715Z 573 │ 2026-10-23T23:34:25.9115789Z 574 │ if (!incomingShare) { 2026-10-23T23:34:25.9116003Z 575 │ if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) { 2026-10-23T23:34:25.9116139Z 576 │ alertedUnavailableIncomingShareIdRef.current = shareId; 2026-10-23T23:34:25.9116211Z 577 │ Dialog.alert( 2026-10-23T23:34:25.9116303Z 578 │ "Shared content unavailable", 2026-10-23T23:34:25.9116489Z 579 │ "The shared content is no longer in the inbox. You can continue editing this task draft.", 2026-10-23T23:34:25.9116550Z 580 │ ); 2026-10-23T23:34:25.9116610Z 581 │ } 2026-10-23T23:34:25.9116675Z 582 │ return; 2026-10-23T23:34:25.9116734Z 583 │ } 2026-10-23T23:34:25.9116786Z 584 │ 2026-10-23T23:34:25.9116849Z 585 │ if ( 2026-10-23T23:34:25.9117022Z 586 │ incomingShare.attachments.some((attachment) => attachment.type === "file") && 2026-10-23T23:34:25.9117138Z 587 │ selectedEnvironmentServerConfig === null 2026-10-23T23:34:25.9117198Z 588 │ ) { 2026-10-23T23:34:25.9117260Z 589 │ return; 2026-10-23T23:34:25.9117319Z 590 │ } 2026-10-23T23:34:25.9117372Z 591 │ 2026-10-23T23:34:25.9117524Z 592 │ if (alertedUnavailableIncomingShareIdRef.current === shareId) { 2026-10-23T23:34:25.9117655Z 593 │ alertedUnavailableIncomingShareIdRef.current = null; 2026-10-23T23:34:25.9117714Z 594 │ } 2026-10-23T23:34:25.9117825Z 595 │ startedShareImportKeyRef.current = importKey; 2026-10-23T23:34:25.9117901Z 596 │ const draftBackup = 2026-10-23T23:34:25.9118102Z 597 │ shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey); 2026-10-23T23:34:25.9118248Z 598 │ shareImportDraftBackupRef.current.set(importKey, draftBackup); 2026-10-23T23:34:25.9118341Z 599 │ const importToken = Symbol(importKey); 2026-10-23T23:34:25.9118432Z 600 │ let didReserveShare = false; 2026-10-23T23:34:25.9118517Z 601 │ let didConsumeShare = false; 2026-10-23T23:34:25.9118604Z 602 │ let needsDraftRestore = false; 2026-10-23T23:34:25.9118721Z 603 │ activeShareImportTokenRef.current = importToken; 2026-10-23T23:34:25.9118812Z 604 │ setImportingShareKey(importKey); 2026-10-23T23:34:25.9118906Z ·  ──────────┬───────── 2026-10-23T23:34:25.9119092Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.9119165Z 605 │ void (async () => { 2026-10-23T23:34:25.9119223Z ╰──── 2026-10-23T23:34:25.9119935Z  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-23T23:34:25.9120474Z  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-23T23:34:25.9120477Z 2026-10-23T23:34:25.9120696Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T23:34:25.9120857Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:524:5] 2026-10-23T23:34:25.9120941Z 523 │ props.initialProjectRef, 2026-10-23T23:34:25.9121019Z 524 │ props.incomingShareId, 2026-10-23T23:34:25.9121115Z ·  ──────────┬────────── 2026-10-23T23:34:25.9121293Z · ╰── Unnecessary dependency `props.incomingShareId` 2026-10-23T23:34:25.9121378Z 525 │ props.pendingTaskId, 2026-10-23T23:34:25.9121439Z ╰──── 2026-10-23T23:34:25.9121750Z  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-23T23:34:25.9122080Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.9122086Z 2026-10-23T23:34:25.9122313Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T23:34:25.9122476Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:543:5] 2026-10-23T23:34:25.9122600Z 542 │ loadedBranchesProjectKeyRef.current = projectKey; 2026-10-23T23:34:25.9122674Z 543 │ flow.loadBranches(); 2026-10-23T23:34:25.9122749Z ·  ──┬─ 2026-10-23T23:34:25.9122888Z · ╰── Missing dependency `flow` 2026-10-23T23:34:25.9122990Z 544 │ }, [flow.loadBranches, selectedProject]); 2026-10-23T23:34:25.9123081Z ·  ────────┬──────── 2026-10-23T23:34:25.9123293Z · ╰── Overly precise dependency `flow.loadBranches`, use `flow` instead 2026-10-23T23:34:25.9123351Z 545 │ 2026-10-23T23:34:25.9123407Z ╰──── 2026-10-23T23:34:25.9123884Z  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-23T23:34:25.9124267Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.9124272Z 2026-10-23T23:34:25.9124490Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T23:34:25.9124652Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:766:5] 2026-10-23T23:34:25.9124724Z 765 │ flow.draftKey, 2026-10-23T23:34:25.9124804Z 766 │ hasImportedIncomingShare, 2026-10-23T23:34:25.9124904Z ·  ────────────┬─────────── 2026-10-23T23:34:25.9125091Z · ╰── Unnecessary dependency `hasImportedIncomingShare` 2026-10-23T23:34:25.9125167Z 767 │ incomingShare, 2026-10-23T23:34:25.9125251Z 768 │ isIncomingShareInboxLoading, 2026-10-23T23:34:25.9125356Z ·  ─────────────┬───────────── 2026-10-23T23:34:25.9125615Z · ╰── Unnecessary dependency `isIncomingShareInboxLoading` 2026-10-23T23:34:25.9125760Z 769 │ isIncomingShareUnavailable, 2026-10-23T23:34:25.9125845Z 770 │ props.incomingShareId, 2026-10-23T23:34:25.9125951Z 771 │ props.initialProjectRef?.environmentId, 2026-10-23T23:34:25.9126047Z 772 │ props.initialProjectRef?.projectId, 2026-10-23T23:34:25.9126127Z 773 │ releaseShareReservation, 2026-10-23T23:34:25.9126193Z 774 │ reserveShare, 2026-10-23T23:34:25.9126289Z 775 │ selectedEnvironmentServerConfig, 2026-10-23T23:34:25.9126366Z 776 │ selectedProject, 2026-10-23T23:34:25.9126440Z 777 │ shareImportAttempt, 2026-10-23T23:34:25.9126530Z ·  ─────────┬──────── 2026-10-23T23:34:25.9126709Z · ╰── Unnecessary dependency `shareImportAttempt` 2026-10-23T23:34:25.9126774Z 778 │ ]); 2026-10-23T23:34:25.9126837Z ╰──── 2026-10-23T23:34:25.9127145Z  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-23T23:34:25.9127481Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.9127484Z 2026-10-23T23:34:25.9127759Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T23:34:25.9127901Z ╭─[packages/provider-pi/src/server/adapter.ts:3405:7] 2026-10-23T23:34:25.9127959Z 3404 │ 2026-10-23T23:34:25.9128158Z 3405 │ const layer: Layer.Layer = 2026-10-23T23:34:25.9128240Z ·  ──┬── 2026-10-23T23:34:25.9128377Z · ╰── 'layer' is declared here 2026-10-23T23:34:25.9128443Z 3406 │ Layer.effect( 2026-10-23T23:34:25.9128500Z ╰──── 2026-10-23T23:34:25.9128611Z  help: Consider removing this declaration. 2026-10-23T23:34:25.9128614Z 2026-10-23T23:34:25.9128933Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T23:34:25.9129115Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:285:5] 2026-10-23T23:34:25.9129241Z 283 │ const [snoozeWakeTick, bumpSnoozeWakeTick] = useState(0); 2026-10-23T23:34:25.9129310Z 284 │ useEffect(() => { 2026-10-23T23:34:25.9129388Z ·  ────┬──── 2026-10-23T23:34:25.9129531Z · ╰── This is the containing effect 2026-10-23T23:34:25.9129621Z 285 │ setNow(new Date().toISOString()); 2026-10-23T23:34:25.9129695Z ·  ───┬── 2026-10-23T23:34:25.9129868Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.9130015Z 286 │ const id = setInterval(() => setNow(new Date().toISOString()), 60_000); 2026-10-23T23:34:25.9130068Z ╰──── 2026-10-23T23:34:25.9130709Z  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-23T23:34:25.9131120Z  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-23T23:34:25.9131160Z 2026-10-23T23:34:25.9131386Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T23:34:25.9131562Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:365:25] 2026-10-23T23:34:25.9131700Z 364 │ // range) the boundary string is identical and the chain would die. 2026-10-23T23:34:25.9131796Z 365 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-23T23:34:25.9131905Z ·  ───────┬────── 2026-10-23T23:34:25.9132083Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-23T23:34:25.9132201Z 366 │ const listItems = ((): readonly SidebarListItem[] => { 2026-10-23T23:34:25.9132260Z ╰──── 2026-10-23T23:34:25.9132576Z  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-23T23:34:25.9132908Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.9132911Z 2026-10-23T23:34:25.9133086Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T23:34:25.9133263Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:356:53] 2026-10-23T23:34:25.9133355Z 355 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-23T23:34:25.9133528Z 356 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-23T23:34:25.9133658Z ·  ─────┬──── 2026-10-23T23:34:25.9133842Z · ╰── Cannot call impure function 2026-10-23T23:34:25.9133928Z 357 │ const id = setTimeout(() => { 2026-10-23T23:34:25.9133983Z ╰──── 2026-10-23T23:34:25.9134535Z  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-23T23:34:25.9134846Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T23:34:25.9134849Z 2026-10-23T23:34:25.9135331Z ⚠ 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-23T23:34:25.9135472Z ╭─[apps/server/src/assets/AssetAccess.test.ts:1043:32] 2026-10-23T23:34:25.9135619Z 1042 │ expect(error._tag).toBe("AssetGitHubMediaUrlValidationError"); 2026-10-23T23:34:25.9135820Z 1043 │ const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(AssetAccessError))(error); 2026-10-23T23:34:25.9136035Z ·  ─────────────────── 2026-10-23T23:34:25.9136150Z 1044 │ expect(encoded).not.toContain(url); 2026-10-23T23:34:25.9136208Z ╰──── 2026-10-23T23:34:25.9136211Z 2026-10-23T23:34:25.9136379Z ⚠ react(immutability): This value cannot be modified 2026-10-23T23:34:25.9136549Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:111:5] 2026-10-23T23:34:25.9136608Z 107 │ ); 2026-10-23T23:34:25.9136902Z 108 │ const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0); 2026-10-23T23:34:25.9137065Z ·  ─────────┬──────── 2026-10-23T23:34:25.9137231Z · ╰── `separationProgress` originates here 2026-10-23T23:34:25.9137293Z 109 │ 2026-10-23T23:34:25.9137363Z 110 │ useEffect(() => { 2026-10-23T23:34:25.9137552Z 111 │ separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING); 2026-10-23T23:34:25.9137638Z ·  ─────────┬──────── 2026-10-23T23:34:25.9137804Z · ╰── `separationProgress` cannot be modified 2026-10-23T23:34:25.9137922Z 112 │ }, [props.showScrollToEnd, separationProgress]); 2026-10-23T23:34:25.9137983Z ╰──── 2026-10-23T23:34:25.9138270Z  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-23T23:34:25.9138602Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T23:34:25.9138605Z 2026-10-23T23:34:25.9138769Z ⚠ react(immutability): This value cannot be modified 2026-10-23T23:34:25.9138942Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-23T23:34:25.9139056Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-23T23:34:25.9139180Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-23T23:34:25.9139270Z ·  ──────┬───── 2026-10-23T23:34:25.9139421Z · ╰── `capsuleWidth` originates here 2026-10-23T23:34:25.9139546Z 130 │ const measuredWidthRef = useRef(null); 2026-10-23T23:34:25.9139677Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-23T23:34:25.9139789Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-23T23:34:25.9139892Z 133 │ if (width === measuredWidthRef.current) { 2026-10-23T23:34:25.9139956Z 134 │ return; 2026-10-23T23:34:25.9140015Z 135 │ } 2026-10-23T23:34:25.9140128Z 136 │ const first = measuredWidthRef.current === null; 2026-10-23T23:34:25.9140221Z 137 │ measuredWidthRef.current = width; 2026-10-23T23:34:25.9140372Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-23T23:34:25.9140457Z ·  ──────┬───── 2026-10-23T23:34:25.9140607Z · ╰── `capsuleWidth` cannot be modified 2026-10-23T23:34:25.9140667Z 139 │ }; 2026-10-23T23:34:25.9140785Z ╰──── 2026-10-23T23:34:25.9141106Z  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-23T23:34:25.9141430Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T23:34:25.9141433Z 2026-10-23T23:34:25.9141601Z ⚠ react(immutability): This value cannot be modified 2026-10-23T23:34:25.9141778Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-23T23:34:25.9141894Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-23T23:34:25.9142017Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-23T23:34:25.9142106Z ·  ──────┬───── 2026-10-23T23:34:25.9142260Z · ╰── `capsuleWidth` originates here 2026-10-23T23:34:25.9142379Z 130 │ const measuredWidthRef = useRef(null); 2026-10-23T23:34:25.9142504Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-23T23:34:25.9142618Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-23T23:34:25.9142723Z 133 │ if (width === measuredWidthRef.current) { 2026-10-23T23:34:25.9142787Z 134 │ return; 2026-10-23T23:34:25.9142847Z 135 │ } 2026-10-23T23:34:25.9142962Z 136 │ const first = measuredWidthRef.current === null; 2026-10-23T23:34:25.9143057Z 137 │ measuredWidthRef.current = width; 2026-10-23T23:34:25.9143206Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-23T23:34:25.9143265Z 139 │ }; 2026-10-23T23:34:25.9143370Z 140 │ const hasStatus = props.status !== null; 2026-10-23T23:34:25.9143515Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-23T23:34:25.9143582Z 142 │ useEffect(() => { 2026-10-23T23:34:25.9143654Z 143 │ if (!hasStatus) { 2026-10-23T23:34:25.9143750Z 144 │ measuredWidthRef.current = null; 2026-10-23T23:34:25.9143831Z 145 │ capsuleWidth.value = null; 2026-10-23T23:34:25.9143917Z ·  ──────┬───── 2026-10-23T23:34:25.9144133Z · ╰── `capsuleWidth` cannot be modified 2026-10-23T23:34:25.9144193Z 146 │ } 2026-10-23T23:34:25.9144246Z ╰──── 2026-10-23T23:34:25.9144527Z  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-23T23:34:25.9144858Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T23:34:25.9144864Z 2026-10-23T23:34:25.9145077Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T23:34:25.9145251Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-23T23:34:25.9145392Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-23T23:34:25.9145462Z 142 │ useEffect(() => { 2026-10-23T23:34:25.9145544Z ·  ───┬─── 2026-10-23T23:34:25.9145790Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-23T23:34:25.9145859Z 143 │ if (!hasStatus) { 2026-10-23T23:34:25.9145953Z 144 │ measuredWidthRef.current = null; 2026-10-23T23:34:25.9146097Z 145 │ capsuleWidth.value = null; 2026-10-23T23:34:25.9146233Z ·  ──────┬───── 2026-10-23T23:34:25.9146383Z · ╰── This modifies `capsuleWidth` 2026-10-23T23:34:25.9146444Z 146 │ } 2026-10-23T23:34:25.9146504Z ╰──── 2026-10-23T23:34:25.9146871Z  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-23T23:34:25.9147194Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T23:34:25.9147197Z 2026-10-23T23:34:25.9147407Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T23:34:25.9147587Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-23T23:34:25.9147709Z 130 │ const measuredWidthRef = useRef(null); 2026-10-23T23:34:25.9147833Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-23T23:34:25.9147963Z ·  ───────────────┬─────────────── 2026-10-23T23:34:25.9148220Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-23T23:34:25.9148332Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-23T23:34:25.9148436Z 133 │ if (width === measuredWidthRef.current) { 2026-10-23T23:34:25.9148499Z 134 │ return; 2026-10-23T23:34:25.9148558Z 135 │ } 2026-10-23T23:34:25.9148670Z 136 │ const first = measuredWidthRef.current === null; 2026-10-23T23:34:25.9148768Z 137 │ measuredWidthRef.current = width; 2026-10-23T23:34:25.9148920Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-23T23:34:25.9149005Z ·  ──────┬───── 2026-10-23T23:34:25.9149155Z · ╰── This modifies `capsuleWidth` 2026-10-23T23:34:25.9149215Z 139 │ }; 2026-10-23T23:34:25.9149269Z ╰──── 2026-10-23T23:34:25.9149637Z  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-23T23:34:25.9149967Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T23:34:25.9149970Z 2026-10-23T23:34:25.9150135Z ⚠ react(refs): Cannot access refs during render 2026-10-23T23:34:25.9150308Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39] 2026-10-23T23:34:25.9150368Z 276 │ 2026-10-23T23:34:25.9150564Z 277 │ ╭─▶ return createElement(RawNativeView, { 2026-10-23T23:34:25.9150666Z 278 │ │ ...nativeProps, 2026-10-23T23:34:25.9150818Z 279 │ │ refreshEnabled: props.onPullToRefresh !== undefined, 2026-10-23T23:34:25.9150916Z 280 │ │ ref: nativeRef, 2026-10-23T23:34:25.9151052Z 281 │ ├─▶ }); 2026-10-23T23:34:25.9151304Z · ╰──── Passing a ref to a function may read its value during render 2026-10-23T23:34:25.9151423Z 282 │ } 2026-10-23T23:34:25.9151524Z ╰──── 2026-10-23T23:34:25.9152026Z  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-23T23:34:25.9152336Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T23:34:25.9152339Z 2026-10-23T23:34:25.9152615Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T23:34:25.9152777Z ╭─[apps/mobile/src/features/threads/use-worktree-setup.ts:30:40] 2026-10-23T23:34:25.9152957Z 28 │ const snapshot = resolveWorktreeSetupSnapshot(input.threadId, query.data, live); 2026-10-23T23:34:25.9153031Z 29 │ useEffect(() => { 2026-10-23T23:34:25.9153108Z ·  ────┬──── 2026-10-23T23:34:25.9153245Z · ╰── This is the containing effect 2026-10-23T23:34:25.9153377Z 30 │ if (snapshot && snapshot !== live) setHeld({ key, snapshot }); 2026-10-23T23:34:25.9153488Z ·  ───┬─── 2026-10-23T23:34:25.9153693Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.9153768Z 31 │ }, [key, live, snapshot]); 2026-10-23T23:34:25.9153826Z ╰──── 2026-10-23T23:34:25.9154516Z  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-23T23:34:25.9154865Z  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-23T23:34:25.9154868Z 2026-10-23T23:34:25.9155130Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-23T23:34:25.9155296Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:290:50] 2026-10-23T23:34:25.9155360Z 289 │ return ( 2026-10-23T23:34:25.9155509Z 290 │ 2026-10-23T23:34:25.9155638Z ·  ───────────── 2026-10-23T23:34:25.9155716Z 291 │ {props.children} 2026-10-23T23:34:25.9155775Z ╰──── 2026-10-23T23:34:25.9156016Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-23T23:34:25.9156171Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-23T23:34:25.9156174Z 2026-10-23T23:34:25.9156434Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-23T23:34:25.9156607Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:654:44] 2026-10-23T23:34:25.9156673Z 653 │ return ( 2026-10-23T23:34:25.9156811Z 654 │ 2026-10-23T23:34:25.9156936Z ·  ───────────── 2026-10-23T23:34:25.9157007Z 655 │ {props.children} 2026-10-23T23:34:25.9157127Z ╰──── 2026-10-23T23:34:25.9157440Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-23T23:34:25.9157593Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-23T23:34:25.9157596Z 2026-10-23T23:34:25.9157850Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-23T23:34:25.9158035Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1462:55] 2026-10-23T23:34:25.9158106Z 1461 │ return ( 2026-10-23T23:34:25.9158304Z 1462 │ 2026-10-23T23:34:25.9158456Z ·  ──────────────────── 2026-10-23T23:34:25.9158576Z 1463 │ { 2026-10-23T23:34:25.9159727Z ·  ────┬──── 2026-10-23T23:34:25.9159880Z · ╰── This is the containing effect 2026-10-23T23:34:25.9159978Z 60 │ setMountedModes((current) => { 2026-10-23T23:34:25.9160066Z ·  ───────┬─────── 2026-10-23T23:34:25.9160249Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.9160343Z 61 │ if (current.has(props.mode)) { 2026-10-23T23:34:25.9160401Z ╰──── 2026-10-23T23:34:25.9161081Z  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-23T23:34:25.9161456Z  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-23T23:34:25.9161462Z 2026-10-23T23:34:25.9161717Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-23T23:34:25.9161865Z ╭─[apps/mobile/src/state/use-composer-drafts.ts:1022:15] 2026-10-23T23:34:25.9161938Z 1021 │ instanceId, 2026-10-23T23:34:25.9162093Z 1022 │ { ...(persisted.modelOptionMemory[instanceId] ?? {}), ...models }, 2026-10-23T23:34:25.9162249Z ·  ────────────────────────────────────────────────── 2026-10-23T23:34:25.9162322Z 1023 │ ]), 2026-10-23T23:34:25.9162381Z ╰──── 2026-10-23T23:34:25.9162676Z  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-23T23:34:25.9162679Z 2026-10-23T23:34:25.9163027Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T23:34:25.9163258Z ╭─[packages/provider-opencode/src/server/adapter.ts:3755:7] 2026-10-23T23:34:25.9163318Z 3754 │ 2026-10-23T23:34:25.9163537Z 3755 │ const layer: Layer.Layer = 2026-10-23T23:34:25.9163613Z ·  ──┬── 2026-10-23T23:34:25.9163750Z · ╰── 'layer' is declared here 2026-10-23T23:34:25.9163824Z 3756 │ Layer.effect( 2026-10-23T23:34:25.9163880Z ╰──── 2026-10-23T23:34:25.9163993Z  help: Consider removing this declaration. 2026-10-23T23:34:25.9163997Z 2026-10-23T23:34:25.9164205Z ⚠ react(immutability): This value cannot be modified 2026-10-23T23:34:25.9164373Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:174:5] 2026-10-23T23:34:25.9164536Z 170 │ const expandedAngle = props.collapsedDirection === "right" ? 90 : 180; 2026-10-23T23:34:25.9164691Z 171 │ const rotation = useSharedValue(props.expanded ? expandedAngle : 0); 2026-10-23T23:34:25.9164778Z ·  ────┬─── 2026-10-23T23:34:25.9164929Z · ╰── `rotation` originates here 2026-10-23T23:34:25.9164988Z 172 │ 2026-10-23T23:34:25.9165063Z 173 │ useLayoutEffect(() => { 2026-10-23T23:34:25.9165224Z 174 │ rotation.value = withTiming(props.expanded ? expandedAngle : 0, { 2026-10-23T23:34:25.9165304Z ·  ────┬─── 2026-10-23T23:34:25.9165458Z · ╰── `rotation` cannot be modified 2026-10-23T23:34:25.9165575Z 175 │ duration: THREAD_DISCLOSURE_TRANSITION_MS, 2026-10-23T23:34:25.9165637Z ╰──── 2026-10-23T23:34:25.9165939Z  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-23T23:34:25.9166280Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T23:34:25.9166283Z 2026-10-23T23:34:25.9166509Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T23:34:25.9166673Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:1246:23] 2026-10-23T23:34:25.9166752Z 1245 │ Date.now()); 2026-10-23T23:34:25.9168057Z 84 │ useEffect(() => { 2026-10-23T23:34:25.9168136Z ·  ────┬──── 2026-10-23T23:34:25.9168270Z · ╰── This is the containing effect 2026-10-23T23:34:25.9168371Z 85 │ if (!actionState.isRunning) return; 2026-10-23T23:34:25.9168448Z 86 │ setNowMs(Date.now()); 2026-10-23T23:34:25.9168524Z ·  ────┬─── 2026-10-23T23:34:25.9168707Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.9168848Z 87 │ const interval = setInterval(() => setNowMs(Date.now()), 1000); 2026-10-23T23:34:25.9168909Z ╰──── 2026-10-23T23:34:25.9169608Z  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-23T23:34:25.9169968Z  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-23T23:34:25.9169975Z 2026-10-23T23:34:25.9170184Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-23T23:34:25.9170360Z ╭─[apps/mobile/src/features/threads/ThreadQueueControl.tsx:602:27] 2026-10-23T23:34:25.9170557Z 601 │ const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success)); 2026-10-23T23:34:25.9170643Z 602 │ const gesture = Gesture.Pan() 2026-10-23T23:34:25.9170737Z ·  ─┬─ 2026-10-23T23:34:25.9170894Z · ╰── `Pan` may be a component 2026-10-23T23:34:25.9170977Z 603 │ .enabled(!props.disabled) 2026-10-23T23:34:25.9171033Z ╰──── 2026-10-23T23:34:25.9171348Z  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-23T23:34:25.9171850Z  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-23T23:34:25.9171853Z 2026-10-23T23:34:25.9172134Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T23:34:25.9172325Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:79:5] 2026-10-23T23:34:25.9172386Z 76 │ 2026-10-23T23:34:25.9172454Z 77 │ useEffect(() => { 2026-10-23T23:34:25.9172529Z ·  ────┬──── 2026-10-23T23:34:25.9172668Z · ╰── This is the containing effect 2026-10-23T23:34:25.9172871Z 78 │ const { host, code } = parsePairingUrl(connectionPairingUrl); 2026-10-23T23:34:25.9172989Z 79 │ setHostInput(host); 2026-10-23T23:34:25.9173074Z ·  ──────┬───── 2026-10-23T23:34:25.9173259Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.9173330Z 80 │ setCodeInput(code); 2026-10-23T23:34:25.9173389Z ╰──── 2026-10-23T23:34:25.9174082Z  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-23T23:34:25.9174446Z  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-23T23:34:25.9174451Z 2026-10-23T23:34:25.9174731Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T23:34:25.9174917Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:89:5] 2026-10-23T23:34:25.9174973Z 82 │ 2026-10-23T23:34:25.9175043Z 83 │ useEffect(() => { 2026-10-23T23:34:25.9175119Z ·  ────┬──── 2026-10-23T23:34:25.9175256Z · ╰── This is the containing effect 2026-10-23T23:34:25.9175354Z 84 │ if (routePairingUrl.length === 0) { 2026-10-23T23:34:25.9175420Z 85 │ return; 2026-10-23T23:34:25.9175483Z 86 │ } 2026-10-23T23:34:25.9175538Z 87 │ 2026-10-23T23:34:25.9175670Z 88 │ const { host, code } = parsePairingUrl(routePairingUrl); 2026-10-23T23:34:25.9175746Z 89 │ setHostInput(host); 2026-10-23T23:34:25.9175830Z ·  ──────┬───── 2026-10-23T23:34:25.9176107Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.9176180Z 90 │ setCodeInput(code); 2026-10-23T23:34:25.9176237Z ╰──── 2026-10-23T23:34:25.9176888Z  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-23T23:34:25.9177238Z  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-23T23:34:25.9177246Z 2026-10-23T23:34:25.9177526Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T23:34:25.9177711Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:95:7] 2026-10-23T23:34:25.9177771Z 92 │ 2026-10-23T23:34:25.9177841Z 93 │ useEffect(() => { 2026-10-23T23:34:25.9177914Z ·  ────┬──── 2026-10-23T23:34:25.9178054Z · ╰── This is the containing effect 2026-10-23T23:34:25.9178147Z 94 │ if (pairingConnectionError) { 2026-10-23T23:34:25.9178227Z 95 │ setIsSubmitting(false); 2026-10-23T23:34:25.9178314Z ·  ───────┬─────── 2026-10-23T23:34:25.9178500Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.9178665Z 96 │ } 2026-10-23T23:34:25.9178780Z ╰──── 2026-10-23T23:34:25.9179428Z  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-23T23:34:25.9179779Z  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-23T23:34:25.9179782Z 2026-10-23T23:34:25.9180060Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T23:34:25.9180225Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:57:5] 2026-10-23T23:34:25.9180288Z 55 │ 2026-10-23T23:34:25.9180356Z 56 │ useEffect(() => { 2026-10-23T23:34:25.9180435Z ·  ────┬──── 2026-10-23T23:34:25.9180573Z · ╰── This is the containing effect 2026-10-23T23:34:25.9180646Z 57 │ setDecodedSize(null); 2026-10-23T23:34:25.9180731Z ·  ───────┬────── 2026-10-23T23:34:25.9180913Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.9180990Z 58 │ }, [props.sourceKey]); 2026-10-23T23:34:25.9181046Z ╰──── 2026-10-23T23:34:25.9181710Z  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-23T23:34:25.9182067Z  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-23T23:34:25.9182070Z 2026-10-23T23:34:25.9182352Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T23:34:25.9182518Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5] 2026-10-23T23:34:25.9182577Z 59 │ 2026-10-23T23:34:25.9182644Z 60 │ useEffect(() => { 2026-10-23T23:34:25.9182720Z ·  ────┬──── 2026-10-23T23:34:25.9182858Z · ╰── This is the containing effect 2026-10-23T23:34:25.9182931Z 61 │ setFailedUri(null); 2026-10-23T23:34:25.9183016Z ·  ──────┬───── 2026-10-23T23:34:25.9183202Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.9183275Z 62 │ }, [props.uri]); 2026-10-23T23:34:25.9183330Z ╰──── 2026-10-23T23:34:25.9183989Z  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-23T23:34:25.9184389Z  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-23T23:34:25.9184392Z 2026-10-23T23:34:25.9184701Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-23T23:34:25.9184905Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10] 2026-10-23T23:34:25.9185044Z 6 │ import { parse, SvgAst, type JsxAST } from "react-native-svg"; 2026-10-23T23:34:25.9185239Z 7 │ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native"; 2026-10-23T23:34:25.9185338Z ·  ────────┬──────── 2026-10-23T23:34:25.9185504Z · ╰── 'ActivityIndicator' is imported here 2026-10-23T23:34:25.9185564Z 8 │ 2026-10-23T23:34:25.9185618Z ╰──── 2026-10-23T23:34:25.9185728Z  help: Consider removing this import. 2026-10-23T23:34:25.9185731Z 2026-10-23T23:34:25.9185955Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T23:34:25.9186127Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7] 2026-10-23T23:34:25.9186203Z 57 │ setDecodedSize(null); 2026-10-23T23:34:25.9186282Z 58 │ }, [props.sourceKey]); 2026-10-23T23:34:25.9186372Z ·  ───────┬─────── 2026-10-23T23:34:25.9186542Z · ╰── Unnecessary dependency `props.sourceKey` 2026-10-23T23:34:25.9186597Z 59 │ 2026-10-23T23:34:25.9186655Z ╰──── 2026-10-23T23:34:25.9186979Z  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-23T23:34:25.9187324Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.9187327Z 2026-10-23T23:34:25.9187551Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T23:34:25.9187719Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7] 2026-10-23T23:34:25.9187794Z 61 │ setFailedUri(null); 2026-10-23T23:34:25.9187865Z 62 │ }, [props.uri]); 2026-10-23T23:34:25.9187943Z ·  ────┬──── 2026-10-23T23:34:25.9188100Z · ╰── Unnecessary dependency `props.uri` 2026-10-23T23:34:25.9188158Z 63 │ 2026-10-23T23:34:25.9188215Z ╰──── 2026-10-23T23:34:25.9188534Z  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-23T23:34:25.9188880Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.9188886Z 2026-10-23T23:34:25.9189168Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T23:34:25.9189333Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:400:5] 2026-10-23T23:34:25.9189394Z 398 │ 2026-10-23T23:34:25.9189463Z 399 │ useEffect(() => { 2026-10-23T23:34:25.9189544Z ·  ────┬──── 2026-10-23T23:34:25.9189687Z · ╰── This is the containing effect 2026-10-23T23:34:25.9189791Z 400 │ setInspectorSelection((current) => { 2026-10-23T23:34:25.9189887Z ·  ──────────┬────────── 2026-10-23T23:34:25.9190076Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.9190268Z 401 │ if (props.renderInspector === undefined) { 2026-10-23T23:34:25.9190368Z ╰──── 2026-10-23T23:34:25.9191030Z  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-23T23:34:25.9191384Z  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-23T23:34:25.9191387Z 2026-10-23T23:34:25.9191623Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-23T23:34:25.9191795Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:528:24] 2026-10-23T23:34:25.9191976Z 527 │ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top; 2026-10-23T23:34:25.9192163Z 528 │ ╭─▶ const GitInspector = () => ( 2026-10-23T23:34:25.9192271Z 529 │ │ 2026-10-23T23:34:25.9192941Z 534 │ ╰─▶ ); 2026-10-23T23:34:25.9193029Z 535 │ const FilesInspector = () => 2026-10-23T23:34:25.9193091Z ╰──── 2026-10-23T23:34:25.9193335Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-23T23:34:25.9193338Z 2026-10-23T23:34:25.9193569Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-23T23:34:25.9193732Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:535:26] 2026-10-23T23:34:25.9193793Z 534 │ ); 2026-10-23T23:34:25.9193976Z 535 │ ╭─▶ const FilesInspector = () => 2026-10-23T23:34:25.9194203Z 536 │ │ selectedThread !== null && selectedThreadCwd !== null ? ( 2026-10-23T23:34:25.9194322Z 537 │ │ 2026-10-23T23:34:25.9195476Z 545 │ ╰─▶ ) : null; 2026-10-23T23:34:25.9195643Z 546 │ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset); 2026-10-23T23:34:25.9195697Z ╰──── 2026-10-23T23:34:25.9195940Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-23T23:34:25.9195946Z 2026-10-23T23:34:25.9196116Z ⚠ react(immutability): This value cannot be modified 2026-10-23T23:34:25.9196285Z ╭─[apps/mobile/src/features/connection/ConnectionStatusDot.tsx:58:7] 2026-10-23T23:34:25.9196390Z 53 │ function usePulseAnimation(pulse: boolean) { 2026-10-23T23:34:25.9196490Z 54 │ const pulseProgress = useSharedValue(0); 2026-10-23T23:34:25.9196581Z ·  ──────┬────── 2026-10-23T23:34:25.9196735Z · ╰── `pulseProgress` originates here 2026-10-23T23:34:25.9196790Z 55 │ 2026-10-23T23:34:25.9196861Z 56 │ useEffect(() => { 2026-10-23T23:34:25.9196931Z 57 │ if (pulse) { 2026-10-23T23:34:25.9197033Z 58 │ pulseProgress.value = withRepeat( 2026-10-23T23:34:25.9197120Z ·  ──────┬────── 2026-10-23T23:34:25.9197276Z · ╰── `pulseProgress` cannot be modified 2026-10-23T23:34:25.9197349Z 59 │ withTiming(1, { 2026-10-23T23:34:25.9197402Z ╰──── 2026-10-23T23:34:25.9197693Z  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-23T23:34:25.9198027Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T23:34:25.9198030Z 2026-10-23T23:34:25.9198215Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T23:34:25.9198428Z ╭─[packages/provider-opencode/src/server/OpenCodeRuntime.environment.test.ts:53:14] 2026-10-23T23:34:25.9198486Z 52 │ 2026-10-23T23:34:25.9198555Z 53 │ for (const {} of [ 2026-10-23T23:34:25.9198635Z ·  ── 2026-10-23T23:34:25.9198706Z 54 │ { healthy: true }, 2026-10-23T23:34:25.9198760Z ╰──── 2026-10-23T23:34:25.9199008Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T23:34:25.9199011Z 2026-10-23T23:34:25.9199290Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T23:34:25.9199466Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:444:5] 2026-10-23T23:34:25.9199531Z 434 │ : null; 2026-10-23T23:34:25.9199602Z 435 │ useEffect(() => { 2026-10-23T23:34:25.9199681Z ·  ────┬──── 2026-10-23T23:34:25.9199891Z · ╰── This is the containing effect 2026-10-23T23:34:25.9200197Z 436 │ if ( 2026-10-23T23:34:25.9200283Z 437 │ props.active === false || 2026-10-23T23:34:25.9200370Z 438 │ activeDraftKey !== null || 2026-10-23T23:34:25.9200462Z 439 │ editingPendingTask !== null || 2026-10-23T23:34:25.9200542Z 440 │ selectedProject === null 2026-10-23T23:34:25.9200605Z 441 │ ) { 2026-10-23T23:34:25.9200672Z 442 │ return; 2026-10-23T23:34:25.9200731Z 443 │ } 2026-10-23T23:34:25.9200804Z 444 │ setActiveDraftKey( 2026-10-23T23:34:25.9200895Z ·  ────────┬──────── 2026-10-23T23:34:25.9201079Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.9201157Z 445 │ createNewTaskDraft({ 2026-10-23T23:34:25.9201218Z ╰──── 2026-10-23T23:34:25.9201871Z  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-23T23:34:25.9202221Z  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-23T23:34:25.9202223Z 2026-10-23T23:34:25.9202485Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-23T23:34:25.9202661Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1244:36] 2026-10-23T23:34:25.9202776Z 1243 │ 2026-10-23T23:34:25.9202985Z 1244 │ {props.children} 2026-10-23T23:34:25.9203106Z ·  ───────────── 2026-10-23T23:34:25.9203186Z 1245 │ 2026-10-23T23:34:25.9203239Z ╰──── 2026-10-23T23:34:25.9203516Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-23T23:34:25.9203664Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-23T23:34:25.9203667Z 2026-10-23T23:34:25.9203832Z ⚠ react(immutability): This value cannot be modified 2026-10-23T23:34:25.9203996Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-23T23:34:25.9204098Z  86 │ 2026-10-23T23:34:25.9204201Z  87 │ const cardCoverage = props.cardCoverage; 2026-10-23T23:34:25.9204288Z ·  ──────┬───── 2026-10-23T23:34:25.9204431Z · ╰── `cardCoverage` originates here 2026-10-23T23:34:25.9204517Z  88 │ const barHeightRef = useRef(0); 2026-10-23T23:34:25.9204602Z  89 │ const cardHeightRef = useRef(0); 2026-10-23T23:34:25.9204694Z  90 │ const cardHeight = useSharedValue(0); 2026-10-23T23:34:25.9204790Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-23T23:34:25.9204862Z  92 │ if (!cardCoverage) { 2026-10-23T23:34:25.9204927Z  93 │ return; 2026-10-23T23:34:25.9204985Z  94 │ } 2026-10-23T23:34:25.9205142Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-23T23:34:25.9205304Z  96 │ if (coverage === cardCoverage.value) { 2026-10-23T23:34:25.9205570Z  97 │ return; 2026-10-23T23:34:25.9205629Z  98 │ } 2026-10-23T23:34:25.9205712Z  99 │ if (cardCoverage.value === 0) { 2026-10-23T23:34:25.9205800Z 100 │ cardCoverage.value = coverage; 2026-10-23T23:34:25.9205886Z ·  ──────┬───── 2026-10-23T23:34:25.9206035Z · ╰── `cardCoverage` cannot be modified 2026-10-23T23:34:25.9206099Z 101 │ return; 2026-10-23T23:34:25.9206155Z ╰──── 2026-10-23T23:34:25.9206471Z  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-23T23:34:25.9206797Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T23:34:25.9206806Z 2026-10-23T23:34:25.9206972Z ⚠ react(immutability): This value cannot be modified 2026-10-23T23:34:25.9207140Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7] 2026-10-23T23:34:25.9207227Z  89 │ const cardHeightRef = useRef(0); 2026-10-23T23:34:25.9207320Z  90 │ const cardHeight = useSharedValue(0); 2026-10-23T23:34:25.9207401Z ·  ─────┬──── 2026-10-23T23:34:25.9207545Z · ╰── `cardHeight` originates here 2026-10-23T23:34:25.9207645Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-23T23:34:25.9207719Z  92 │ if (!cardCoverage) { 2026-10-23T23:34:25.9207780Z  93 │ return; 2026-10-23T23:34:25.9207839Z  94 │ } 2026-10-23T23:34:25.9207999Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-23T23:34:25.9208098Z  96 │ if (coverage === cardCoverage.value) { 2026-10-23T23:34:25.9208162Z  97 │ return; 2026-10-23T23:34:25.9208220Z  98 │ } 2026-10-23T23:34:25.9208306Z  99 │ if (cardCoverage.value === 0) { 2026-10-23T23:34:25.9208393Z 100 │ cardCoverage.value = coverage; 2026-10-23T23:34:25.9208453Z 101 │ return; 2026-10-23T23:34:25.9208511Z 102 │ } 2026-10-23T23:34:25.9208617Z 103 │ cardCoverage.value = withTiming(coverage, { 2026-10-23T23:34:25.9208718Z 104 │ duration: USER_INPUT_TOGGLE_DURATION_MS, 2026-10-23T23:34:25.9208809Z 105 │ easing: Easing.out(Easing.cubic), 2026-10-23T23:34:25.9208869Z 106 │ }); 2026-10-23T23:34:25.9208940Z 107 │ }, [cardCoverage]); 2026-10-23T23:34:25.9209028Z 108 │ const handleBarLayout = useCallback( 2026-10-23T23:34:25.9209114Z 109 │ (event: LayoutChangeEvent) => { 2026-10-23T23:34:25.9209255Z 110 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-23T23:34:25.9209331Z 111 │ notifyCoverage(); 2026-10-23T23:34:25.9209389Z 112 │ }, 2026-10-23T23:34:25.9209459Z 113 │ [notifyCoverage], 2026-10-23T23:34:25.9209516Z 114 │ ); 2026-10-23T23:34:25.9209608Z 115 │ const handleCardLayout = useCallback( 2026-10-23T23:34:25.9209691Z 116 │ (event: LayoutChangeEvent) => { 2026-10-23T23:34:25.9209825Z 117 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-23T23:34:25.9209946Z 118 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-23T23:34:25.9210029Z ·  ─────┬──── 2026-10-23T23:34:25.9210174Z · ╰── `cardHeight` cannot be modified 2026-10-23T23:34:25.9210247Z 119 │ notifyCoverage(); 2026-10-23T23:34:25.9210302Z ╰──── 2026-10-23T23:34:25.9210652Z  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-23T23:34:25.9211015Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T23:34:25.9211018Z 2026-10-23T23:34:25.9211232Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T23:34:25.9211397Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-23T23:34:25.9211491Z  90 │ const cardHeight = useSharedValue(0); 2026-10-23T23:34:25.9211587Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-23T23:34:25.9211700Z ·  ───┬─── 2026-10-23T23:34:25.9211967Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-23T23:34:25.9212043Z  92 │ if (!cardCoverage) { 2026-10-23T23:34:25.9212103Z  93 │ return; 2026-10-23T23:34:25.9212161Z  94 │ } 2026-10-23T23:34:25.9212319Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-23T23:34:25.9212411Z  96 │ if (coverage === cardCoverage.value) { 2026-10-23T23:34:25.9212471Z  97 │ return; 2026-10-23T23:34:25.9212529Z  98 │ } 2026-10-23T23:34:25.9212614Z  99 │ if (cardCoverage.value === 0) { 2026-10-23T23:34:25.9212701Z 100 │ cardCoverage.value = coverage; 2026-10-23T23:34:25.9212782Z ·  ──────┬───── 2026-10-23T23:34:25.9212925Z · ╰── This modifies `cardCoverage` 2026-10-23T23:34:25.9212994Z 101 │ return; 2026-10-23T23:34:25.9213054Z ╰──── 2026-10-23T23:34:25.9213416Z  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-23T23:34:25.9213740Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T23:34:25.9213743Z 2026-10-23T23:34:25.9213952Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T23:34:25.9214165Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-23T23:34:25.9214252Z  99 │ if (cardCoverage.value === 0) { 2026-10-23T23:34:25.9214336Z 100 │ cardCoverage.value = coverage; 2026-10-23T23:34:25.9214425Z ·  ──────┬───── 2026-10-23T23:34:25.9214567Z · ╰── This modifies `cardCoverage` 2026-10-23T23:34:25.9214630Z 101 │ return; 2026-10-23T23:34:25.9214685Z 102 │ } 2026-10-23T23:34:25.9214794Z 103 │ cardCoverage.value = withTiming(coverage, { 2026-10-23T23:34:25.9214896Z 104 │ duration: USER_INPUT_TOGGLE_DURATION_MS, 2026-10-23T23:34:25.9214983Z 105 │ easing: Easing.out(Easing.cubic), 2026-10-23T23:34:25.9215043Z 106 │ }); 2026-10-23T23:34:25.9215113Z 107 │ }, [cardCoverage]); 2026-10-23T23:34:25.9215203Z 108 │ const handleBarLayout = useCallback( 2026-10-23T23:34:25.9215285Z 109 │ (event: LayoutChangeEvent) => { 2026-10-23T23:34:25.9215399Z ·  ───────────────┬─────────────── 2026-10-23T23:34:25.9215724Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-23T23:34:25.9215909Z 110 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-23T23:34:25.9216033Z ╰──── 2026-10-23T23:34:25.9216393Z  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-23T23:34:25.9216714Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T23:34:25.9216716Z 2026-10-23T23:34:25.9216925Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T23:34:25.9217088Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7] 2026-10-23T23:34:25.9217182Z 115 │ const handleCardLayout = useCallback( 2026-10-23T23:34:25.9217272Z 116 │ (event: LayoutChangeEvent) => { 2026-10-23T23:34:25.9217383Z ·  ───────────────┬─────────────── 2026-10-23T23:34:25.9217618Z · ╰── This function may (indirectly) reassign or modify `cardHeight` after render 2026-10-23T23:34:25.9217751Z 117 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-23T23:34:25.9217874Z 118 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-23T23:34:25.9217954Z ·  ─────┬──── 2026-10-23T23:34:25.9218092Z · ╰── This modifies `cardHeight` 2026-10-23T23:34:25.9218162Z 119 │ notifyCoverage(); 2026-10-23T23:34:25.9218219Z ╰──── 2026-10-23T23:34:25.9218583Z  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-23T23:34:25.9218907Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T23:34:25.9218910Z 2026-10-23T23:34:25.9219184Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T23:34:25.9219331Z ╭─[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5] 2026-10-23T23:34:25.9219390Z 150 │ 2026-10-23T23:34:25.9219460Z 151 │ useEffect(() => { 2026-10-23T23:34:25.9219537Z ·  ────┬──── 2026-10-23T23:34:25.9219670Z · ╰── This is the containing effect 2026-10-23T23:34:25.9219764Z 152 │ if (!controlledSelectedPath) { 2026-10-23T23:34:25.9219830Z 153 │ return; 2026-10-23T23:34:25.9219886Z 154 │ } 2026-10-23T23:34:25.9219972Z 155 │ setExpandedPaths((current) => { 2026-10-23T23:34:25.9220058Z ·  ────────┬─────── 2026-10-23T23:34:25.9220238Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.9220368Z 156 │ const ancestors = ancestorPaths(controlledSelectedPath); 2026-10-23T23:34:25.9220420Z ╰──── 2026-10-23T23:34:25.9221059Z  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-23T23:34:25.9221513Z  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-23T23:34:25.9221567Z 2026-10-23T23:34:25.9221923Z ⚠ 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-23T23:34:25.9222076Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:50:18] 2026-10-23T23:34:25.9222246Z 49 │ for (const tool of ["sendMessage", "followupTask", "interruptAgent", "listAgents"]) { 2026-10-23T23:34:25.9222429Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-23T23:34:25.9222520Z ·  ───────── 2026-10-23T23:34:25.9222719Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-23T23:34:25.9222775Z ╰──── 2026-10-23T23:34:25.9222778Z 2026-10-23T23:34:25.9223133Z ⚠ 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-23T23:34:25.9223284Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:51:18] 2026-10-23T23:34:25.9223463Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-23T23:34:25.9223651Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-23T23:34:25.9223740Z ·  ───────── 2026-10-23T23:34:25.9223798Z 52 │ } 2026-10-23T23:34:25.9223853Z ╰──── 2026-10-23T23:34:25.9223856Z 2026-10-23T23:34:25.9224250Z ⚠ 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-23T23:34:25.9224404Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:55:5] 2026-10-23T23:34:25.9224473Z 54 │ assert.equal( 2026-10-23T23:34:25.9224656Z 55 │ Schema.is(CodexSchema.ServerNotification__CollabAgentToolCallStatus)("interrupted"), 2026-10-23T23:34:25.9224733Z ·  ───────── 2026-10-23T23:34:25.9224792Z 56 │ true, 2026-10-23T23:34:25.9224847Z ╰──── 2026-10-23T23:34:25.9224849Z 2026-10-23T23:34:25.9225199Z ⚠ 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-23T23:34:25.9225348Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:59:5] 2026-10-23T23:34:25.9225473Z 58 │ assert.equal( 2026-10-23T23:34:25.9225718Z 59 │ Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentToolCallStatus)("interrupted"), 2026-10-23T23:34:25.9225796Z ·  ───────── 2026-10-23T23:34:25.9225857Z 60 │ true, 2026-10-23T23:34:25.9225909Z ╰──── 2026-10-23T23:34:25.9225911Z 2026-10-23T23:34:25.9226262Z ⚠ 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-23T23:34:25.9226421Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:103:16] 2026-10-23T23:34:25.9226477Z 102 │ 2026-10-23T23:34:25.9226655Z 103 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse)(resumeResponse), true); 2026-10-23T23:34:25.9226744Z ·  ───────── 2026-10-23T23:34:25.9226808Z 104 │ }); 2026-10-23T23:34:25.9226867Z ╰──── 2026-10-23T23:34:25.9226869Z 2026-10-23T23:34:25.9227083Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T23:34:25.9227206Z ╭─[apps/mobile/src/state/thread-order.ts:29:7] 2026-10-23T23:34:25.9227286Z 28 │ getPendingThreadOrder(); 2026-10-23T23:34:25.9227371Z 29 │ }, [nowMinute, snoozeWakeTick]); 2026-10-23T23:34:25.9227501Z ·  ────┬──── ───────┬────── 2026-10-23T23:34:25.9227707Z · │ ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-23T23:34:25.9227856Z · ╰── Unnecessary dependency `nowMinute` 2026-10-23T23:34:25.9227925Z 30 │ return pending; 2026-10-23T23:34:25.9227977Z ╰──── 2026-10-23T23:34:25.9228300Z  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-23T23:34:25.9228635Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.9228637Z 2026-10-23T23:34:25.9228791Z ⚠ react(refs): Cannot access refs during render 2026-10-23T23:34:25.9228953Z ╭─[apps/mobile/src/features/home/thread-swipe-actions.tsx:494:27] 2026-10-23T23:34:25.9229012Z 493 │ > 2026-10-23T23:34:25.9229096Z 494 │ {props.children(close)} 2026-10-23T23:34:25.9229193Z ·  ──┬── 2026-10-23T23:34:25.9229367Z · ╰── Cannot access ref value during render 2026-10-23T23:34:25.9229452Z 495 │ 2026-10-23T23:34:25.9229508Z ╰──── 2026-10-23T23:34:25.9230007Z  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-23T23:34:25.9230316Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T23:34:25.9230318Z 2026-10-23T23:34:25.9230482Z ⚠ react(immutability): This value cannot be modified 2026-10-23T23:34:25.9230664Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5] 2026-10-23T23:34:25.9230722Z 90 │ }) { 2026-10-23T23:34:25.9230904Z 91 │ const rotation = useSharedValue(props.hidden ? 1 : 0); 2026-10-23T23:34:25.9231019Z ·  ────┬─── 2026-10-23T23:34:25.9231159Z · ╰── `rotation` originates here 2026-10-23T23:34:25.9231234Z 92 │ useLayoutEffect(() => { 2026-10-23T23:34:25.9231383Z 93 │ rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING); 2026-10-23T23:34:25.9231456Z ·  ────┬─── 2026-10-23T23:34:25.9231596Z · ╰── `rotation` cannot be modified 2026-10-23T23:34:25.9231677Z 94 │ }, [props.hidden, rotation]); 2026-10-23T23:34:25.9231732Z ╰──── 2026-10-23T23:34:25.9232012Z  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-23T23:34:25.9232344Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T23:34:25.9232350Z 2026-10-23T23:34:25.9232516Z ⚠ react(immutability): This value cannot be modified 2026-10-23T23:34:25.9232697Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:269:5] 2026-10-23T23:34:25.9232799Z 266 │ const variant = props.variant ?? "plain"; 2026-10-23T23:34:25.9232938Z 267 │ const loadingVisibility = useSharedValue(props.loading ? 1 : 0); 2026-10-23T23:34:25.9233030Z ·  ────────┬──────── 2026-10-23T23:34:25.9233191Z · ╰── `loadingVisibility` originates here 2026-10-23T23:34:25.9233265Z 268 │ useLayoutEffect(() => { 2026-10-23T23:34:25.9233440Z 269 │ loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING); 2026-10-23T23:34:25.9233531Z ·  ────────┬──────── 2026-10-23T23:34:25.9233689Z · ╰── `loadingVisibility` cannot be modified 2026-10-23T23:34:25.9233787Z 270 │ }, [loadingVisibility, props.loading]); 2026-10-23T23:34:25.9233840Z ╰──── 2026-10-23T23:34:25.9234168Z  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-23T23:34:25.9234492Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T23:34:25.9234495Z 2026-10-23T23:34:25.9234657Z ⚠ react(immutability): This value cannot be modified 2026-10-23T23:34:25.9234873Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:328:5] 2026-10-23T23:34:25.9234934Z 325 │ }) { 2026-10-23T23:34:25.9235106Z 326 │ const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0); 2026-10-23T23:34:25.9235202Z ·  ─────────┬───────── 2026-10-23T23:34:25.9235363Z · ╰── `recordingVisibility` originates here 2026-10-23T23:34:25.9235435Z 327 │ useLayoutEffect(() => { 2026-10-23T23:34:25.9235636Z 328 │ recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING); 2026-10-23T23:34:25.9235731Z ·  ─────────┬───────── 2026-10-23T23:34:25.9235895Z · ╰── `recordingVisibility` cannot be modified 2026-10-23T23:34:25.9235989Z 329 │ }, [props.phase, recordingVisibility]); 2026-10-23T23:34:25.9236045Z ╰──── 2026-10-23T23:34:25.9236394Z  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-23T23:34:25.9236767Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T23:34:25.9236770Z 2026-10-23T23:34:25.9236920Z ⚠ react(refs): Cannot access refs during render 2026-10-23T23:34:25.9237091Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:122:38] 2026-10-23T23:34:25.9237260Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-23T23:34:25.9237393Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-23T23:34:25.9237524Z ·  ───────────┬────────── 2026-10-23T23:34:25.9237713Z · ╰── Cannot access ref value during render 2026-10-23T23:34:25.9237840Z 123 │ const sessionRef = useRef(null); 2026-10-23T23:34:25.9237896Z ╰──── 2026-10-23T23:34:25.9238394Z  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-23T23:34:25.9238702Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T23:34:25.9238704Z 2026-10-23T23:34:25.9238860Z ⚠ react(refs): Cannot access refs during render 2026-10-23T23:34:25.9239031Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8] 2026-10-23T23:34:25.9239092Z 125 │ 2026-10-23T23:34:25.9239207Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T23:34:25.9239299Z ·  ─────────┬──────── 2026-10-23T23:34:25.9239458Z · ╰── Cannot access ref value during render 2026-10-23T23:34:25.9239568Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-23T23:34:25.9239620Z ╰──── 2026-10-23T23:34:25.9240115Z  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-23T23:34:25.9240427Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T23:34:25.9240432Z 2026-10-23T23:34:25.9240583Z ⚠ react(refs): Cannot access refs during render 2026-10-23T23:34:25.9240752Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7] 2026-10-23T23:34:25.9240806Z 125 │ 2026-10-23T23:34:25.9240920Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T23:34:25.9241013Z ·  ─────────┬───────── 2026-10-23T23:34:25.9241169Z · ╰── Cannot access ref value during render 2026-10-23T23:34:25.9241274Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-23T23:34:25.9241330Z ╰──── 2026-10-23T23:34:25.9241882Z  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-23T23:34:25.9242245Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T23:34:25.9242248Z 2026-10-23T23:34:25.9242401Z ⚠ react(refs): Cannot access refs during render 2026-10-23T23:34:25.9242567Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31] 2026-10-23T23:34:25.9242624Z 125 │ 2026-10-23T23:34:25.9242738Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T23:34:25.9242863Z ·  ─────────┬───────── 2026-10-23T23:34:25.9243046Z · ╰── Cannot access ref value during render 2026-10-23T23:34:25.9243157Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-23T23:34:25.9243212Z ╰──── 2026-10-23T23:34:25.9243719Z  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-23T23:34:25.9244073Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T23:34:25.9244080Z 2026-10-23T23:34:25.9244229Z ⚠ react(refs): Cannot access refs during render 2026-10-23T23:34:25.9244398Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30] 2026-10-23T23:34:25.9244462Z 125 │ 2026-10-23T23:34:25.9244578Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T23:34:25.9244697Z ·  ──────────┬───────── 2026-10-23T23:34:25.9244874Z · ╰── Cannot access ref value during render 2026-10-23T23:34:25.9244982Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-23T23:34:25.9245036Z ╰──── 2026-10-23T23:34:25.9245525Z  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-23T23:34:25.9245906Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T23:34:25.9245959Z 2026-10-23T23:34:25.9246118Z ⚠ react(refs): Cannot access refs during render 2026-10-23T23:34:25.9246286Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46] 2026-10-23T23:34:25.9246405Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T23:34:25.9246609Z 127 │ ╭─▶ const recorder = createLazyVoiceRecorder({ 2026-10-23T23:34:25.9246797Z 128 │ │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-23T23:34:25.9246931Z 129 │ │ onStatus: (status: RecordingStatus) => { 2026-10-23T23:34:25.9247095Z 130 │ │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-23T23:34:25.9247224Z 131 │ │ isFinished: status.isFinished, 2026-10-23T23:34:25.9247416Z 132 │ │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-23T23:34:25.9247525Z 133 │ │ error: status.error, 2026-10-23T23:34:25.9247630Z 134 │ │ url: status.url, 2026-10-23T23:34:25.9247714Z 135 │ │ }); 2026-10-23T23:34:25.9247798Z 136 │ │ }, 2026-10-23T23:34:25.9248006Z 137 │ │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-23T23:34:25.9248123Z 138 │ │ selectInput: (inputs) => { 2026-10-23T23:34:25.9248285Z 139 │ │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-23T23:34:25.9248447Z 140 │ │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-23T23:34:25.9248625Z 141 │ │ const known = microphoneOrder(preferences.value.microphones); 2026-10-23T23:34:25.9248772Z 142 │ │ const order = rememberMicrophones(known, inputs); 2026-10-23T23:34:25.9248878Z 143 │ │ if (order !== known) { 2026-10-23T23:34:25.9249024Z 144 │ │ registry.set(updateMobilePreferencesAtom, { 2026-10-23T23:34:25.9249146Z 145 │ │ transform: (current) => ({ 2026-10-23T23:34:25.9249364Z 146 │ │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-23T23:34:25.9249452Z 147 │ │ }), 2026-10-23T23:34:25.9249539Z 148 │ │ }); 2026-10-23T23:34:25.9249628Z 149 │ │ } 2026-10-23T23:34:25.9249780Z 150 │ │ return preferredMicrophoneInput(inputs, order); 2026-10-23T23:34:25.9249860Z 151 │ │ }, 2026-10-23T23:34:25.9250000Z 152 │ ├─▶ }); 2026-10-23T23:34:25.9250251Z · ╰──── Passing a ref to a function may read its value during render 2026-10-23T23:34:25.9250342Z 153 │ recorderRef.current = recorder; 2026-10-23T23:34:25.9250398Z ╰──── 2026-10-23T23:34:25.9250887Z  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-23T23:34:25.9251258Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T23:34:25.9251300Z 2026-10-23T23:34:25.9251456Z ⚠ react(refs): Cannot access refs during render 2026-10-23T23:34:25.9251624Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16] 2026-10-23T23:34:25.9251683Z 152 │ }); 2026-10-23T23:34:25.9251771Z 153 │ recorderRef.current = recorder; 2026-10-23T23:34:25.9251891Z ·  ─────┬─────────┬─── 2026-10-23T23:34:25.9252085Z · │ ╰── Cannot update ref value during render 2026-10-23T23:34:25.9252206Z · ╰── This value is a ref 2026-10-23T23:34:25.9252323Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-23T23:34:25.9252382Z ╰──── 2026-10-23T23:34:25.9252872Z  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-23T23:34:25.9253179Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T23:34:25.9253181Z 2026-10-23T23:34:25.9253332Z ⚠ react(refs): Cannot access refs during render 2026-10-23T23:34:25.9253498Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48] 2026-10-23T23:34:25.9253590Z 153 │ recorderRef.current = recorder; 2026-10-23T23:34:25.9253800Z 154 │ ╭─▶ sessionRef.current = new VoiceInputSession({ 2026-10-23T23:34:25.9253891Z 155 │ │ recorder, 2026-10-23T23:34:25.9254027Z 156 │ │ getTranscriber: getLocalVoiceTranscriber, 2026-10-23T23:34:25.9254323Z 157 │ │ requestPermission: async () => { 2026-10-23T23:34:25.9254497Z 158 │ │ const permission = await requestRecordingPermissionsAsync(); 2026-10-23T23:34:25.9254702Z 159 │ │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-23T23:34:25.9254783Z 160 │ │ }, 2026-10-23T23:34:25.9254934Z 161 │ │ configureRecording: configureVoiceRecordingAudio, 2026-10-23T23:34:25.9255085Z 162 │ │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-23T23:34:25.9255234Z 163 │ │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-23T23:34:25.9255349Z 164 │ │ onStateChange: (nextState) => 2026-10-23T23:34:25.9255445Z 165 │ │ setState({ 2026-10-23T23:34:25.9255552Z 166 │ │ state: nextState, 2026-10-23T23:34:25.9255700Z 167 │ │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-23T23:34:25.9255834Z 168 │ │ label: sessionRef.current?.label ?? null, 2026-10-23T23:34:25.9255920Z 169 │ │ }), 2026-10-23T23:34:25.9256626Z 170 │ ├─▶ }); 2026-10-23T23:34:25.9256950Z · ╰──── Cannot access ref value during render 2026-10-23T23:34:25.9257065Z 171 │ } 2026-10-23T23:34:25.9257121Z ╰──── 2026-10-23T23:34:25.9257629Z  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-23T23:34:25.9257935Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T23:34:25.9257938Z 2026-10-23T23:34:25.9258091Z ⚠ react(refs): Cannot access refs during render 2026-10-23T23:34:25.9258256Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15] 2026-10-23T23:34:25.9258343Z 153 │ recorderRef.current = recorder; 2026-10-23T23:34:25.9258459Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-23T23:34:25.9258581Z ·  ─────┬────────┬─── 2026-10-23T23:34:25.9258771Z · │ ╰── Cannot update ref value during render 2026-10-23T23:34:25.9258894Z · ╰── This value is a ref 2026-10-23T23:34:25.9258963Z 155 │ recorder, 2026-10-23T23:34:25.9259018Z ╰──── 2026-10-23T23:34:25.9259508Z  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-23T23:34:25.9259822Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T23:34:25.9259828Z 2026-10-23T23:34:25.9259980Z ⚠ react(refs): Cannot access refs during render 2026-10-23T23:34:25.9260147Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7] 2026-10-23T23:34:25.9260240Z 184 │ return () => subscription.remove(); 2026-10-23T23:34:25.9260308Z 185 │ }, [controller]); 2026-10-23T23:34:25.9260389Z ·  ─────┬──── 2026-10-23T23:34:25.9260542Z · ╰── Cannot access ref value during render 2026-10-23T23:34:25.9260596Z 186 │ 2026-10-23T23:34:25.9260651Z ╰──── 2026-10-23T23:34:25.9261155Z  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-23T23:34:25.9261462Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T23:34:25.9261464Z 2026-10-23T23:34:25.9261615Z ⚠ react(refs): Cannot access refs during render 2026-10-23T23:34:25.9261779Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6] 2026-10-23T23:34:25.9261872Z 184 │ return () => subscription.remove(); 2026-10-23T23:34:25.9261942Z 185 │ }, [controller]); 2026-10-23T23:34:25.9262024Z ·  ──────┬───── 2026-10-23T23:34:25.9262171Z · ╰── Cannot access ref value during render 2026-10-23T23:34:25.9262229Z 186 │ 2026-10-23T23:34:25.9262283Z ╰──── 2026-10-23T23:34:25.9262842Z  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-23T23:34:25.9263212Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T23:34:25.9263218Z 2026-10-23T23:34:25.9263366Z ⚠ react(refs): Cannot access refs during render 2026-10-23T23:34:25.9263533Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6] 2026-10-23T23:34:25.9263593Z 191 │ }, 2026-10-23T23:34:25.9263670Z 192 │ [controller, recorder], 2026-10-23T23:34:25.9263750Z ·  ─────┬──── 2026-10-23T23:34:25.9263905Z · ╰── Cannot access ref value during render 2026-10-23T23:34:25.9263968Z 193 │ ); 2026-10-23T23:34:25.9264022Z ╰──── 2026-10-23T23:34:25.9264548Z  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-23T23:34:25.9264854Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T23:34:25.9264856Z 2026-10-23T23:34:25.9265008Z ⚠ react(refs): Cannot access refs during render 2026-10-23T23:34:25.9265176Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20] 2026-10-23T23:34:25.9265275Z 174 │ const controller = session.controller; 2026-10-23T23:34:25.9265371Z 175 │ const recorder = recorderRef.current; 2026-10-23T23:34:25.9265484Z ·  ─────────┬───────── 2026-10-23T23:34:25.9265654Z · ╰── Cannot access ref value during render 2026-10-23T23:34:25.9265707Z 176 │ 2026-10-23T23:34:25.9265764Z ╰──── 2026-10-23T23:34:25.9266259Z  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-23T23:34:25.9266564Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T23:34:25.9266567Z 2026-10-23T23:34:25.9266723Z ⚠ react(refs): Cannot access refs during render 2026-10-23T23:34:25.9266892Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5] 2026-10-23T23:34:25.9266954Z 191 │ }, 2026-10-23T23:34:25.9267030Z 192 │ [controller, recorder], 2026-10-23T23:34:25.9267126Z ·  ───────────┬────────── 2026-10-23T23:34:25.9267280Z · ╰── Cannot access ref value during render 2026-10-23T23:34:25.9267340Z 193 │ ); 2026-10-23T23:34:25.9267396Z ╰──── 2026-10-23T23:34:25.9267891Z  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-23T23:34:25.9268276Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T23:34:25.9268320Z 2026-10-23T23:34:25.9268491Z ⚠ react(refs): Cannot access refs during render 2026-10-23T23:34:25.9268659Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20] 2026-10-23T23:34:25.9268759Z 245 │ return () => clearInterval(intervalId); 2026-10-23T23:34:25.9268878Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-23T23:34:25.9268969Z ·  ─────┬──── 2026-10-23T23:34:25.9269134Z · ╰── Cannot access ref value during render 2026-10-23T23:34:25.9269191Z 247 │ 2026-10-23T23:34:25.9269247Z ╰──── 2026-10-23T23:34:25.9269746Z  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-23T23:34:25.9270056Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T23:34:25.9270058Z 2026-10-23T23:34:25.9270211Z ⚠ react(refs): Cannot access refs during render 2026-10-23T23:34:25.9270377Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6] 2026-10-23T23:34:25.9270473Z 245 │ return () => clearInterval(intervalId); 2026-10-23T23:34:25.9270586Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-23T23:34:25.9270728Z ·  ────────────────────────┬─────────────────────── 2026-10-23T23:34:25.9270900Z · ╰── Cannot access ref value during render 2026-10-23T23:34:25.9270958Z 247 │ 2026-10-23T23:34:25.9271009Z ╰──── 2026-10-23T23:34:25.9271503Z  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-23T23:34:25.9271813Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T23:34:25.9271816Z 2026-10-23T23:34:25.9271971Z ⚠ react(refs): Cannot access refs during render 2026-10-23T23:34:25.9272141Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5] 2026-10-23T23:34:25.9272216Z 260 │ setOwnerFocused, 2026-10-23T23:34:25.9272282Z 261 │ session, 2026-10-23T23:34:25.9272358Z ·  ───┬─── 2026-10-23T23:34:25.9272503Z · ╰── Cannot access ref value during render 2026-10-23T23:34:25.9272568Z 262 │ stop, 2026-10-23T23:34:25.9272624Z ╰──── 2026-10-23T23:34:25.9273119Z  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-23T23:34:25.9273425Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T23:34:25.9273428Z 2026-10-23T23:34:25.9273644Z ⚠ react(refs): Cannot access refs during render 2026-10-23T23:34:25.9273864Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10] 2026-10-23T23:34:25.9273925Z 250 │ 2026-10-23T23:34:25.9274111Z 251 │ ╭─▶ return { 2026-10-23T23:34:25.9274335Z 252 │ │ isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null, 2026-10-23T23:34:25.9274421Z 253 │ │ state, 2026-10-23T23:34:25.9274517Z 254 │ │ audioLevels, 2026-10-23T23:34:25.9274617Z 255 │ │ elapsedSeconds, 2026-10-23T23:34:25.9274754Z 256 │ │ isBusy: voiceInputBlocksSubmission(state), 2026-10-23T23:34:25.9274848Z 257 │ │ ownerKey, 2026-10-23T23:34:25.9274936Z 258 │ │ label, 2026-10-23T23:34:25.9275032Z 259 │ │ focusedOwners, 2026-10-23T23:34:25.9275130Z 260 │ │ setOwnerFocused, 2026-10-23T23:34:25.9275216Z 261 │ │ session, 2026-10-23T23:34:25.9275300Z 262 │ │ stop, 2026-10-23T23:34:25.9275386Z 263 │ │ cancel, 2026-10-23T23:34:25.9275520Z 264 │ ├─▶ }; 2026-10-23T23:34:25.9275738Z · ╰──── Cannot access ref value during render 2026-10-23T23:34:25.9275801Z 265 │ } 2026-10-23T23:34:25.9275859Z ╰──── 2026-10-23T23:34:25.9276358Z  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-23T23:34:25.9276670Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T23:34:25.9276673Z 2026-10-23T23:34:25.9276845Z ⚠ react(immutability): This value cannot be modified 2026-10-23T23:34:25.9277015Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-23T23:34:25.9277188Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-23T23:34:25.9277318Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-23T23:34:25.9277403Z ·  ─────┬───── 2026-10-23T23:34:25.9277608Z · ╰── `audioLevels` originates here 2026-10-23T23:34:25.9277782Z 123 │ const sessionRef = useRef(null); 2026-10-23T23:34:25.9277937Z 124 │ const recorderRef = useRef | null>(null); 2026-10-23T23:34:25.9277996Z 125 │ 2026-10-23T23:34:25.9278113Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T23:34:25.9278221Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-23T23:34:25.9278368Z 128 │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-23T23:34:25.9278475Z 129 │ onStatus: (status: RecordingStatus) => { 2026-10-23T23:34:25.9278609Z 130 │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-23T23:34:25.9278704Z 131 │ isFinished: status.isFinished, 2026-10-23T23:34:25.9278864Z 132 │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-23T23:34:25.9278948Z 133 │ error: status.error, 2026-10-23T23:34:25.9279024Z 134 │ url: status.url, 2026-10-23T23:34:25.9279091Z 135 │ }); 2026-10-23T23:34:25.9279152Z 136 │ }, 2026-10-23T23:34:25.9279329Z 137 │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-23T23:34:25.9279415Z 138 │ selectInput: (inputs) => { 2026-10-23T23:34:25.9279548Z 139 │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-23T23:34:25.9279673Z 140 │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-23T23:34:25.9279818Z 141 │ const known = microphoneOrder(preferences.value.microphones); 2026-10-23T23:34:25.9279936Z 142 │ const order = rememberMicrophones(known, inputs); 2026-10-23T23:34:25.9280026Z 143 │ if (order !== known) { 2026-10-23T23:34:25.9280141Z 144 │ registry.set(updateMobilePreferencesAtom, { 2026-10-23T23:34:25.9280230Z 145 │ transform: (current) => ({ 2026-10-23T23:34:25.9280414Z 146 │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-23T23:34:25.9280482Z 147 │ }), 2026-10-23T23:34:25.9280545Z 148 │ }); 2026-10-23T23:34:25.9280607Z 149 │ } 2026-10-23T23:34:25.9280723Z 150 │ return preferredMicrophoneInput(inputs, order); 2026-10-23T23:34:25.9280783Z 151 │ }, 2026-10-23T23:34:25.9280843Z 152 │ }); 2026-10-23T23:34:25.9280930Z 153 │ recorderRef.current = recorder; 2026-10-23T23:34:25.9281038Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-23T23:34:25.9281102Z 155 │ recorder, 2026-10-23T23:34:25.9281215Z 156 │ getTranscriber: getLocalVoiceTranscriber, 2026-10-23T23:34:25.9281308Z 157 │ requestPermission: async () => { 2026-10-23T23:34:25.9281449Z 158 │ const permission = await requestRecordingPermissionsAsync(); 2026-10-23T23:34:25.9281613Z 159 │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-23T23:34:25.9281673Z 160 │ }, 2026-10-23T23:34:25.9284813Z 161 │ configureRecording: configureVoiceRecordingAudio, 2026-10-23T23:34:25.9284966Z 162 │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-23T23:34:25.9285079Z 163 │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-23T23:34:25.9285166Z 164 │ onStateChange: (nextState) => 2026-10-23T23:34:25.9285237Z 165 │ setState({ 2026-10-23T23:34:25.9285312Z 166 │ state: nextState, 2026-10-23T23:34:25.9285426Z 167 │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-23T23:34:25.9285623Z 168 │ label: sessionRef.current?.label ?? null, 2026-10-23T23:34:25.9285750Z 169 │ }), 2026-10-23T23:34:25.9285812Z 170 │ }); 2026-10-23T23:34:25.9285867Z 171 │ } 2026-10-23T23:34:25.9285922Z 172 │ 2026-10-23T23:34:25.9286013Z 173 │ const session = sessionRef.current; 2026-10-23T23:34:25.9286106Z 174 │ const controller = session.controller; 2026-10-23T23:34:25.9286197Z 175 │ const recorder = recorderRef.current; 2026-10-23T23:34:25.9286253Z 176 │ 2026-10-23T23:34:25.9286324Z 177 │ useEffect(() => { 2026-10-23T23:34:25.9286484Z 178 │ const subscription = AppState.addEventListener("change", (nextState) => { 2026-10-23T23:34:25.9286634Z 179 │ // iOS reports `inactive` while its permission dialog is open. Only the 2026-10-23T23:34:25.9286782Z 180 │ // real background state cancels preparation; recorder status handles 2026-10-23T23:34:25.9286899Z 181 │ // calls and route interruptions during capture. 2026-10-23T23:34:25.9287042Z 182 │ if (nextState === "background") controller.appMovedToBackground(); 2026-10-23T23:34:25.9287103Z 183 │ }); 2026-10-23T23:34:25.9287194Z 184 │ return () => subscription.remove(); 2026-10-23T23:34:25.9287263Z 185 │ }, [controller]); 2026-10-23T23:34:25.9287316Z 186 │ 2026-10-23T23:34:25.9287382Z 187 │ useEffect( 2026-10-23T23:34:25.9287447Z 188 │ () => () => { 2026-10-23T23:34:25.9287525Z 189 │ controller.dispose(); 2026-10-23T23:34:25.9287596Z 190 │ recorder.release(); 2026-10-23T23:34:25.9287656Z 191 │ }, 2026-10-23T23:34:25.9287730Z 192 │ [controller, recorder], 2026-10-23T23:34:25.9287788Z 193 │ ); 2026-10-23T23:34:25.9287841Z 194 │ 2026-10-23T23:34:25.9287910Z 195 │ useEffect(() => { 2026-10-23T23:34:25.9288016Z 196 │ if (state.phase !== "recording") return; 2026-10-23T23:34:25.9288070Z 197 │ 2026-10-23T23:34:25.9288228Z 198 │ const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`; 2026-10-23T23:34:25.9288341Z 199 │ const activation = activateKeepAwakeAsync(tag); 2026-10-23T23:34:25.9288428Z 200 │ void activation.catch(() => {}); 2026-10-23T23:34:25.9288493Z 201 │ return () => { 2026-10-23T23:34:25.9288652Z 202 │ // Release after activation settles, even if the recording ends immediately. 2026-10-23T23:34:25.9288799Z 203 │ void activation.then(() => deactivateKeepAwake(tag)).catch(() => {}); 2026-10-23T23:34:25.9288859Z 204 │ }; 2026-10-23T23:34:25.9288941Z 205 │ }, [keepAwakeId, state.phase]); 2026-10-23T23:34:25.9288996Z 206 │ 2026-10-23T23:34:25.9289064Z 207 │ useEffect(() => { 2026-10-23T23:34:25.9289213Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-23T23:34:25.9289269Z 209 │ 2026-10-23T23:34:25.9289398Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-23T23:34:25.9289563Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-23T23:34:25.9289672Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-23T23:34:25.9289754Z ·  ─────┬───── 2026-10-23T23:34:25.9289909Z · ╰── `audioLevels` cannot be modified 2026-10-23T23:34:25.9289968Z 213 │ } 2026-10-23T23:34:25.9290023Z ╰──── 2026-10-23T23:34:25.9290307Z  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-23T23:34:25.9290851Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T23:34:25.9290888Z 2026-10-23T23:34:25.9291108Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T23:34:25.9291279Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-23T23:34:25.9291335Z 206 │ 2026-10-23T23:34:25.9291400Z 207 │ useEffect(() => { 2026-10-23T23:34:25.9291484Z ·  ───┬─── 2026-10-23T23:34:25.9291718Z · ╰── This function may (indirectly) reassign or modify `audioLevels` after render 2026-10-23T23:34:25.9291865Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-23T23:34:25.9291919Z 209 │ 2026-10-23T23:34:25.9292055Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-23T23:34:25.9292225Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-23T23:34:25.9292334Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-23T23:34:25.9292414Z ·  ─────┬───── 2026-10-23T23:34:25.9292557Z · ╰── This modifies `audioLevels` 2026-10-23T23:34:25.9292616Z 213 │ } 2026-10-23T23:34:25.9292668Z ╰──── 2026-10-23T23:34:25.9293031Z  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-23T23:34:25.9293355Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T23:34:25.9293358Z 2026-10-23T23:34:25.9293576Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T23:34:25.9293736Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7] 2026-10-23T23:34:25.9293836Z 256 │ return () => cancelAnimationFrame(frame); 2026-10-23T23:34:25.9293922Z 257 │ }, [props.path, targetIndex]); 2026-10-23T23:34:25.9294002Z ·  ─────┬──── 2026-10-23T23:34:25.9294198Z · ╰── Unnecessary dependency `props.path` 2026-10-23T23:34:25.9294251Z 258 │ 2026-10-23T23:34:25.9294306Z ╰──── 2026-10-23T23:34:25.9294624Z  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-23T23:34:25.9294961Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.9294966Z 2026-10-23T23:34:25.9295172Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T23:34:25.9295330Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23] 2026-10-23T23:34:25.9295409Z 292 │ 2026-10-23T23:34:25.9296821Z ·  ─────────── 2026-10-23T23:34:25.9296891Z 310 │ {body} 2026-10-23T23:34:25.9296949Z ╰──── 2026-10-23T23:34:25.9297101Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-23T23:34:25.9297104Z 2026-10-23T23:34:25.9297271Z ⚠ react(immutability): This value cannot be modified 2026-10-23T23:34:25.9297447Z ╭─[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5] 2026-10-23T23:34:25.9297562Z 65 │ const [expanded, setExpanded] = useState(false); 2026-10-23T23:34:25.9297654Z 66 │ const progress = useSharedValue(0); 2026-10-23T23:34:25.9297734Z ·  ────┬─── 2026-10-23T23:34:25.9297871Z · ╰── `progress` originates here 2026-10-23T23:34:25.9297939Z 67 │ useEffect(() => { 2026-10-23T23:34:25.9298073Z 68 │ progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING); 2026-10-23T23:34:25.9298148Z ·  ────┬─── 2026-10-23T23:34:25.9298286Z · ╰── `progress` cannot be modified 2026-10-23T23:34:25.9298362Z 69 │ }, [expanded, progress]); 2026-10-23T23:34:25.9298416Z ╰──── 2026-10-23T23:34:25.9298697Z  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-23T23:34:25.9299027Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T23:34:25.9299032Z 2026-10-23T23:34:25.9299273Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-23T23:34:25.9299427Z ╭─[packages/client-runtime/src/operations/projects.ts:228:51] 2026-10-23T23:34:25.9299492Z 227 │ ): string { 2026-10-23T23:34:25.9299654Z 228 │ const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? ""; 2026-10-23T23:34:25.9299775Z ·  ────── 2026-10-23T23:34:25.9299914Z 229 │ return target.owner ? `${target.owner}/${folderName}` : folderName; 2026-10-23T23:34:25.9299970Z ╰──── 2026-10-23T23:34:25.9300155Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-23T23:34:25.9300163Z 2026-10-23T23:34:25.9300365Z ⚠ eslint(no-unused-vars): Identifier 'Arr' is imported but never used. 2026-10-23T23:34:25.9300507Z ╭─[packages/client-runtime/src/state/threadSort.ts:4:13] 2026-10-23T23:34:25.9300632Z 3 │ import type { EnvironmentThreadShell } from "./models.ts"; 2026-10-23T23:34:25.9300719Z 4 │ import * as Arr from "effect/Array"; 2026-10-23T23:34:25.9300793Z ·  ─┬─ 2026-10-23T23:34:25.9300924Z · ╰── 'Arr' is imported here 2026-10-23T23:34:25.9301012Z 5 │ import * as Order from "effect/Order"; 2026-10-23T23:34:25.9301067Z ╰──── 2026-10-23T23:34:25.9301169Z  help: Consider removing this import. 2026-10-23T23:34:25.9301172Z 2026-10-23T23:34:25.9301439Z ⚠ eslint(no-unused-vars): Identifier 'Order' is imported but never used. 2026-10-23T23:34:25.9301634Z ╭─[packages/client-runtime/src/state/threadSort.ts:5:13] 2026-10-23T23:34:25.9301722Z 4 │ import * as Arr from "effect/Array"; 2026-10-23T23:34:25.9301806Z 5 │ import * as Order from "effect/Order"; 2026-10-23T23:34:25.9301886Z ·  ──┬── 2026-10-23T23:34:25.9302026Z · ╰── 'Order' is imported here 2026-10-23T23:34:25.9302084Z 6 │ 2026-10-23T23:34:25.9302137Z ╰──── 2026-10-23T23:34:25.9302241Z  help: Consider removing this import. 2026-10-23T23:34:25.9302244Z 2026-10-23T23:34:25.9302457Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T23:34:25.9302618Z ╭─[apps/mobile/src/state/use-thread-outbox-drain.ts:1315:5] 2026-10-23T23:34:25.9302705Z 1314 │ queuedMessagesByThreadKey, 2026-10-23T23:34:25.9302772Z 1315 │ retryTick, 2026-10-23T23:34:25.9302852Z ·  ────┬──── 2026-10-23T23:34:25.9303002Z · ╰── Unnecessary dependency `retryTick` 2026-10-23T23:34:25.9303076Z 1316 │ restoreQueuedMessage, 2026-10-23T23:34:25.9303133Z ╰──── 2026-10-23T23:34:25.9303449Z  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-23T23:34:25.9303784Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.9303786Z 2026-10-23T23:34:25.9304062Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-23T23:34:25.9304210Z ╭─[apps/mobile/src/state/use-model-option-memory.ts:21:7] 2026-10-23T23:34:25.9304280Z 20 │ [instanceId]: { 2026-10-23T23:34:25.9304368Z 21 │ ...(state[instanceId] ?? {}), 2026-10-23T23:34:25.9304474Z ·  ──────────────────────────── 2026-10-23T23:34:25.9304546Z 22 │ [model]: options, 2026-10-23T23:34:25.9304602Z ╰──── 2026-10-23T23:34:25.9304887Z  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-23T23:34:25.9304890Z 2026-10-23T23:34:25.9305397Z ⚠ 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-23T23:34:25.9305541Z ╭─[packages/client-runtime/src/rpc/session.test.ts:226:3] 2026-10-23T23:34:25.9305601Z 225 │ ) { 2026-10-23T23:34:25.9305821Z 226 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T23:34:25.9305940Z 227 │ │ const socket = sockets[index]; 2026-10-23T23:34:25.9306032Z 228 │ │ if (socket) { 2026-10-23T23:34:25.9306131Z 229 │ │ return socket; 2026-10-23T23:34:25.9306210Z 230 │ │ } 2026-10-23T23:34:25.9306320Z 231 │ │ yield* Effect.yieldNow; 2026-10-23T23:34:25.9306451Z 232 │ ╰─▶ } 2026-10-23T23:34:25.9306715Z 233 │ return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket.")); 2026-10-23T23:34:25.9306812Z ╰──── 2026-10-23T23:34:25.9306814Z 2026-10-23T23:34:25.9307312Z ⚠ 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-23T23:34:25.9307456Z ╭─[packages/client-runtime/src/rpc/session.test.ts:240:3] 2026-10-23T23:34:25.9307514Z 239 │ ) { 2026-10-23T23:34:25.9307729Z 240 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T23:34:25.9307959Z 241 │ │ const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index]; 2026-10-23T23:34:25.9308063Z 242 │ │ if (request) { 2026-10-23T23:34:25.9308165Z 243 │ │ return request; 2026-10-23T23:34:25.9308244Z 244 │ │ } 2026-10-23T23:34:25.9308352Z 245 │ │ yield* Effect.yieldNow; 2026-10-23T23:34:25.9308486Z 246 │ ╰─▶ } 2026-10-23T23:34:25.9308662Z 247 │ return yield* Effect.die(new Error("Expected the RPC protocol to send a request.")); 2026-10-23T23:34:25.9308718Z ╰──── 2026-10-23T23:34:25.9308720Z 2026-10-23T23:34:25.9309209Z ⚠ 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-23T23:34:25.9309355Z ╭─[packages/client-runtime/src/rpc/client.test.ts:131:9] 2026-10-23T23:34:25.9309421Z 130 │ ) { 2026-10-23T23:34:25.9309642Z 131 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T23:34:25.9309774Z 132 │ │ if (subscriptions.length >= count) { 2026-10-23T23:34:25.9309871Z 133 │ │ return; 2026-10-23T23:34:25.9309957Z 134 │ │ } 2026-10-23T23:34:25.9310071Z 135 │ │ yield* Effect.yieldNow; 2026-10-23T23:34:25.9310213Z 136 │ ╰─▶ } 2026-10-23T23:34:25.9310389Z 137 │ return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`)); 2026-10-23T23:34:25.9310442Z ╰──── 2026-10-23T23:34:25.9310448Z 2026-10-23T23:34:25.9310942Z ⚠ 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-23T23:34:25.9311086Z ╭─[packages/client-runtime/src/rpc/client.test.ts:252:7] 2026-10-23T23:34:25.9311259Z 251 │ yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient))); 2026-10-23T23:34:25.9311532Z 252 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) { 2026-10-23T23:34:25.9311643Z 253 │ │ yield* Effect.yieldNow; 2026-10-23T23:34:25.9311782Z 254 │ ╰─▶ } 2026-10-23T23:34:25.9311973Z 255 │ yield* SubscriptionRef.set(activeSession, Option.none()); 2026-10-23T23:34:25.9312070Z ╰──── 2026-10-23T23:34:25.9312073Z 2026-10-23T23:34:25.9312563Z ⚠ 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-23T23:34:25.9312698Z ╭─[packages/client-runtime/src/rpc/client.test.ts:258:7] 2026-10-23T23:34:25.9312757Z 257 │ 2026-10-23T23:34:25.9313023Z 258 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-23T23:34:25.9313134Z 259 │ │ yield* Effect.yieldNow; 2026-10-23T23:34:25.9313270Z 260 │ ╰─▶ } 2026-10-23T23:34:25.9313390Z 261 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-23T23:34:25.9313449Z ╰──── 2026-10-23T23:34:25.9313451Z 2026-10-23T23:34:25.9313941Z ⚠ 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-23T23:34:25.9314114Z ╭─[packages/client-runtime/src/rpc/client.test.ts:322:7] 2026-10-23T23:34:25.9314179Z 321 │ ); 2026-10-23T23:34:25.9314451Z 322 │ ╭─▶ for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) { 2026-10-23T23:34:25.9314560Z 323 │ │ yield* Effect.yieldNow; 2026-10-23T23:34:25.9314702Z 324 │ ╰─▶ } 2026-10-23T23:34:25.9314760Z 325 │ 2026-10-23T23:34:25.9314816Z ╰──── 2026-10-23T23:34:25.9314818Z 2026-10-23T23:34:25.9315304Z ⚠ 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-23T23:34:25.9315441Z ╭─[packages/client-runtime/src/rpc/client.test.ts:330:7] 2026-10-23T23:34:25.9315613Z 329 │ yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient))); 2026-10-23T23:34:25.9315879Z 330 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-23T23:34:25.9315989Z 331 │ │ yield* Effect.yieldNow; 2026-10-23T23:34:25.9316193Z 332 │ ╰─▶ } 2026-10-23T23:34:25.9316336Z 333 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-23T23:34:25.9316393Z ╰──── 2026-10-23T23:34:25.9316396Z 2026-10-23T23:34:25.9316673Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T23:34:25.9316820Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2121:5] 2026-10-23T23:34:25.9316880Z 2119 │ ); 2026-10-23T23:34:25.9316950Z 2120 │ useEffect(() => { 2026-10-23T23:34:25.9317032Z ·  ────┬──── 2026-10-23T23:34:25.9317172Z · ╰── This is the containing effect 2026-10-23T23:34:25.9317249Z 2121 │ setExpandedVideo(null); 2026-10-23T23:34:25.9317344Z ·  ────────┬─────── 2026-10-23T23:34:25.9317533Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.9317613Z 2122 │ setExpandedFile(null); 2026-10-23T23:34:25.9317666Z ╰──── 2026-10-23T23:34:25.9318339Z  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-23T23:34:25.9318701Z  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-23T23:34:25.9318704Z 2026-10-23T23:34:25.9318962Z ⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used. 2026-10-23T23:34:25.9319105Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:62:10] 2026-10-23T23:34:25.9319249Z 61 │ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets"; 2026-10-23T23:34:25.9319395Z 62 │ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks"; 2026-10-23T23:34:25.9319501Z ·  ───────────┬─────────── 2026-10-23T23:34:25.9319679Z · ╰── 'isMarkdownFileLinkLabel' is imported here 2026-10-23T23:34:25.9319846Z 63 │ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments"; 2026-10-23T23:34:25.9319900Z ╰──── 2026-10-23T23:34:25.9320005Z  help: Consider removing this import. 2026-10-23T23:34:25.9320008Z 2026-10-23T23:34:25.9320237Z ⚠ eslint(no-unused-vars): Identifier 'createContext' is imported but never used. 2026-10-23T23:34:25.9320380Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:88:3] 2026-10-23T23:34:25.9320439Z 87 │ import { 2026-10-23T23:34:25.9320509Z 88 │ createContext, 2026-10-23T23:34:25.9320590Z ·  ──────┬────── 2026-10-23T23:34:25.9320735Z · ╰── 'createContext' is imported here 2026-10-23T23:34:25.9320792Z 89 │ memo, 2026-10-23T23:34:25.9320848Z ╰──── 2026-10-23T23:34:25.9320952Z  help: Consider removing this import. 2026-10-23T23:34:25.9320955Z 2026-10-23T23:34:25.9321183Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-23T23:34:25.9321321Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:104:3] 2026-10-23T23:34:25.9321445Z 103 │ import { 2026-10-23T23:34:25.9321576Z 104 │ ActivityIndicator, 2026-10-23T23:34:25.9321674Z ·  ────────┬──────── 2026-10-23T23:34:25.9321827Z · ╰── 'ActivityIndicator' is imported here 2026-10-23T23:34:25.9321892Z 105 │ Image, 2026-10-23T23:34:25.9321948Z ╰──── 2026-10-23T23:34:25.9322051Z  help: Consider removing this import. 2026-10-23T23:34:25.9322054Z 2026-10-23T23:34:25.9322265Z ⚠ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used. 2026-10-23T23:34:25.9322413Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:111:3] 2026-10-23T23:34:25.9322481Z 110 │ Pressable, 2026-10-23T23:34:25.9322549Z 111 │ ScrollView, 2026-10-23T23:34:25.9322625Z ·  ─────┬──── 2026-10-23T23:34:25.9322773Z · ╰── 'ScrollView' is imported here 2026-10-23T23:34:25.9322843Z 112 │ StyleSheet, 2026-10-23T23:34:25.9322902Z ╰──── 2026-10-23T23:34:25.9323001Z  help: Consider removing this import. 2026-10-23T23:34:25.9323004Z 2026-10-23T23:34:25.9323216Z ⚠ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used. 2026-10-23T23:34:25.9323360Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:113:11] 2026-10-23T23:34:25.9323425Z 112 │ StyleSheet, 2026-10-23T23:34:25.9323494Z 113 │ Text as NativeText, 2026-10-23T23:34:25.9323580Z ·  ─────┬──── 2026-10-23T23:34:25.9323728Z · ╰── 'NativeText' is imported here 2026-10-23T23:34:25.9323798Z 114 │ type ColorValue, 2026-10-23T23:34:25.9323853Z ╰──── 2026-10-23T23:34:25.9323962Z  help: Consider removing this import. 2026-10-23T23:34:25.9323967Z 2026-10-23T23:34:25.9324235Z ⚠ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used. 2026-10-23T23:34:25.9324378Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:136:10] 2026-10-23T23:34:25.9324520Z 135 │ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic"; 2026-10-23T23:34:25.9324656Z 136 │ import { tryOpenExternalUrl } from "../../lib/openExternalUrl"; 2026-10-23T23:34:25.9324752Z ·  ─────────┬──────── 2026-10-23T23:34:25.9324919Z · ╰── 'tryOpenExternalUrl' is imported here 2026-10-23T23:34:25.9325079Z 137 │ import { downloadAndShareAttachment } from "../../lib/attachmentDownload"; 2026-10-23T23:34:25.9325141Z ╰──── 2026-10-23T23:34:25.9325251Z  help: Consider removing this import. 2026-10-23T23:34:25.9325259Z 2026-10-23T23:34:25.9325493Z ⚠ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used. 2026-10-23T23:34:25.9325632Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:139:10] 2026-10-23T23:34:25.9325776Z 138 │ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks"; 2026-10-23T23:34:25.9325909Z 139 │ import { faviconUrlForOrigin } from "@t3tools/shared/favicon"; 2026-10-23T23:34:25.9326009Z ·  ─────────┬───────── 2026-10-23T23:34:25.9326172Z · ╰── 'faviconUrlForOrigin' is imported here 2026-10-23T23:34:25.9326237Z 140 │ import { 2026-10-23T23:34:25.9326291Z ╰──── 2026-10-23T23:34:25.9326394Z  help: Consider removing this import. 2026-10-23T23:34:25.9326479Z 2026-10-23T23:34:25.9326758Z ⚠ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used. 2026-10-23T23:34:25.9326899Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:153:10] 2026-10-23T23:34:25.9327068Z 152 │ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile"; 2026-10-23T23:34:25.9327237Z 153 │ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer"; 2026-10-23T23:34:25.9327354Z ·  ────────┬─────── 2026-10-23T23:34:25.9327527Z · ╰── 'MediaVideoPlayer' is imported here 2026-10-23T23:34:25.9327677Z 154 │ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia"; 2026-10-23T23:34:25.9327735Z ╰──── 2026-10-23T23:34:25.9327846Z  help: Consider removing this import. 2026-10-23T23:34:25.9327849Z 2026-10-23T23:34:25.9328136Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used. 2026-10-23T23:34:25.9328281Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:157:3] 2026-10-23T23:34:25.9328376Z 156 │ attachmentVideoPreviewSource, 2026-10-23T23:34:25.9328455Z 157 │ mediaVideoPreviewUri, 2026-10-23T23:34:25.9328544Z ·  ──────────┬───────── 2026-10-23T23:34:25.9328705Z · ╰── 'mediaVideoPreviewUri' is imported here 2026-10-23T23:34:25.9328783Z 158 │ mediaVideoThumbnailKey, 2026-10-23T23:34:25.9328838Z ╰──── 2026-10-23T23:34:25.9328936Z  help: Consider removing this import. 2026-10-23T23:34:25.9328939Z 2026-10-23T23:34:25.9329182Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used. 2026-10-23T23:34:25.9329326Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:158:3] 2026-10-23T23:34:25.9329401Z 157 │ mediaVideoPreviewUri, 2026-10-23T23:34:25.9329474Z 158 │ mediaVideoThumbnailKey, 2026-10-23T23:34:25.9329568Z ·  ───────────┬────────── 2026-10-23T23:34:25.9329733Z · ╰── 'mediaVideoThumbnailKey' is imported here 2026-10-23T23:34:25.9329819Z 159 │ type MediaVideoPreviewSource, 2026-10-23T23:34:25.9329870Z ╰──── 2026-10-23T23:34:25.9329972Z  help: Consider removing this import. 2026-10-23T23:34:25.9329975Z 2026-10-23T23:34:25.9330201Z ⚠ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used. 2026-10-23T23:34:25.9330339Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:159:8] 2026-10-23T23:34:25.9330418Z 158 │ mediaVideoThumbnailKey, 2026-10-23T23:34:25.9330506Z 159 │ type MediaVideoPreviewSource, 2026-10-23T23:34:25.9330607Z ·  ───────────┬─────────── 2026-10-23T23:34:25.9330780Z · ╰── 'MediaVideoPreviewSource' is imported here 2026-10-23T23:34:25.9330870Z 160 │ } from "../../lib/videoPreviewSource"; 2026-10-23T23:34:25.9330925Z ╰──── 2026-10-23T23:34:25.9331025Z  help: Consider removing this import. 2026-10-23T23:34:25.9331027Z 2026-10-23T23:34:25.9331237Z ⚠ eslint(no-unused-vars): Type 'ReviewDiffTheme' is imported but never used. 2026-10-23T23:34:25.9331376Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:167:15] 2026-10-23T23:34:25.9331565Z 166 │ import { parseReviewCommentMessageSegments } from "../review/reviewCommentSelection"; 2026-10-23T23:34:25.9331786Z 167 │ import type { ReviewDiffTheme } from "../review/shikiReviewHighlighter"; 2026-10-23T23:34:25.9331956Z ·  ───────┬─────── 2026-10-23T23:34:25.9332121Z · ╰── 'ReviewDiffTheme' is imported here 2026-10-23T23:34:25.9332183Z 168 │ import { 2026-10-23T23:34:25.9332238Z ╰──── 2026-10-23T23:34:25.9332338Z  help: Consider removing this import. 2026-10-23T23:34:25.9332340Z 2026-10-23T23:34:25.9332587Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used. 2026-10-23T23:34:25.9332740Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:182:3] 2026-10-23T23:34:25.9332812Z 181 │ import { 2026-10-23T23:34:25.9332895Z 182 │ resolveMarkdownFontSizes, 2026-10-23T23:34:25.9333004Z ·  ────────────┬─────────── 2026-10-23T23:34:25.9333179Z · ╰── 'resolveMarkdownFontSizes' is imported here 2026-10-23T23:34:25.9333272Z 183 │ resolveNativeMarkdownTypography, 2026-10-23T23:34:25.9333326Z ╰──── 2026-10-23T23:34:25.9333425Z  help: Consider removing this import. 2026-10-23T23:34:25.9333427Z 2026-10-23T23:34:25.9333668Z ⚠ eslint(no-unused-vars): Identifier 'markdownLinkIconSource' is imported but never used. 2026-10-23T23:34:25.9333810Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:187:10] 2026-10-23T23:34:25.9333953Z 186 │ import { PierreEntryIcon } from "../../components/PierreEntryIcon"; 2026-10-23T23:34:25.9334165Z 187 │ import { markdownLinkIconSource } from "../../lib/markdownLinkIcons"; 2026-10-23T23:34:25.9334264Z ·  ───────────┬────────── 2026-10-23T23:34:25.9334445Z · ╰── 'markdownLinkIconSource' is imported here 2026-10-23T23:34:25.9334511Z 188 │ import { 2026-10-23T23:34:25.9334566Z ╰──── 2026-10-23T23:34:25.9334666Z  help: Consider removing this import. 2026-10-23T23:34:25.9334669Z 2026-10-23T23:34:25.9334951Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used. 2026-10-23T23:34:25.9335093Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:190:3] 2026-10-23T23:34:25.9335178Z 189 │ normalizeNativeMarkdownUrl, 2026-10-23T23:34:25.9335278Z 190 │ resolveMarkdownInlineCodePresentation, 2026-10-23T23:34:25.9335398Z ·  ──────────────────┬────────────────── 2026-10-23T23:34:25.9335676Z · ╰── 'resolveMarkdownInlineCodePresentation' is imported here 2026-10-23T23:34:25.9335811Z 191 │ resolveMarkdownLinkIcon, 2026-10-23T23:34:25.9335864Z ╰──── 2026-10-23T23:34:25.9336056Z  help: Consider removing this import. 2026-10-23T23:34:25.9336060Z 2026-10-23T23:34:25.9336338Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownLinkIcon' is imported but never used. 2026-10-23T23:34:25.9336479Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:191:3] 2026-10-23T23:34:25.9336587Z 190 │ resolveMarkdownInlineCodePresentation, 2026-10-23T23:34:25.9336680Z 191 │ resolveMarkdownLinkIcon, 2026-10-23T23:34:25.9336787Z ·  ───────────┬─────────── 2026-10-23T23:34:25.9336959Z · ╰── 'resolveMarkdownLinkIcon' is imported here 2026-10-23T23:34:25.9337048Z 192 │ resolveMarkdownLinkPresentation, 2026-10-23T23:34:25.9337110Z ╰──── 2026-10-23T23:34:25.9337212Z  help: Consider removing this import. 2026-10-23T23:34:25.9337215Z 2026-10-23T23:34:25.9337456Z ⚠ eslint(no-unused-vars): Identifier 'useMarkdownCodeHighlight' is imported but never used. 2026-10-23T23:34:25.9337594Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:230:10] 2026-10-23T23:34:25.9337702Z 229 │ import { ThreadMcpApp } from "./McpAppWebView"; 2026-10-23T23:34:25.9337857Z 230 │ import { useMarkdownCodeHighlight } from "./markdownCodeHighlightState"; 2026-10-23T23:34:25.9337963Z ·  ────────────┬─────────── 2026-10-23T23:34:25.9338138Z · ╰── 'useMarkdownCodeHighlight' is imported here 2026-10-23T23:34:25.9338200Z 231 │ import { 2026-10-23T23:34:25.9338255Z ╰──── 2026-10-23T23:34:25.9338360Z  help: Consider removing this import. 2026-10-23T23:34:25.9338366Z 2026-10-23T23:34:25.9338586Z ⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used. 2026-10-23T23:34:25.9338724Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:234:3] 2026-10-23T23:34:25.9338792Z 233 │ useAssetUrl, 2026-10-23T23:34:25.9338865Z 234 │ useAssetUrlState, 2026-10-23T23:34:25.9338950Z ·  ────────┬─────── 2026-10-23T23:34:25.9339102Z · ╰── 'useAssetUrlState' is imported here 2026-10-23T23:34:25.9339176Z 235 │ useRefreshAssetUrl, 2026-10-23T23:34:25.9339230Z ╰──── 2026-10-23T23:34:25.9339328Z  help: Consider removing this import. 2026-10-23T23:34:25.9339331Z 2026-10-23T23:34:25.9339553Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T23:34:25.9339702Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2123:7] 2026-10-23T23:34:25.9339783Z 2122 │ setExpandedFile(null); 2026-10-23T23:34:25.9339951Z 2123 │ }, [props.environmentId, props.threadId, props.contentPresentation.kind]); 2026-10-23T23:34:25.9340188Z ·  ─────────┬───────── ───────┬────── ───────────────┬────────────── 2026-10-23T23:34:25.9340505Z · │ │ ╰── Unnecessary dependency `props.contentPresentation.kind` 2026-10-23T23:34:25.9340718Z · │ ╰── Unnecessary dependency `props.threadId` 2026-10-23T23:34:25.9341027Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-23T23:34:25.9341290Z 2124 │ const horizontalPadding = props.layoutVariant === "split" ? 20 : 16; 2026-10-23T23:34:25.9341355Z ╰──── 2026-10-23T23:34:25.9341679Z  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-23T23:34:25.9342013Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.9342016Z 2026-10-23T23:34:25.9342229Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T23:34:25.9342372Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2590:7] 2026-10-23T23:34:25.9342481Z 2589 │ reportHeaderMaterialVisibility(false); 2026-10-23T23:34:25.9342606Z 2590 │ }, [feedThreadKey, reportHeaderMaterialVisibility]); 2026-10-23T23:34:25.9342693Z ·  ──────┬────── 2026-10-23T23:34:25.9342850Z · ╰── Unnecessary dependency `feedThreadKey` 2026-10-23T23:34:25.9342911Z 2591 │ 2026-10-23T23:34:25.9342966Z ╰──── 2026-10-23T23:34:25.9343279Z  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-23T23:34:25.9343607Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.9343609Z 2026-10-23T23:34:25.9343826Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T23:34:25.9343972Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2606:7] 2026-10-23T23:34:25.9344072Z 2605 │ } 2026-10-23T23:34:25.9344208Z 2606 │ }, [listMountKey, props.contentInsetEndAdjustment, listRef]); 2026-10-23T23:34:25.9344293Z ·  ──────┬───── 2026-10-23T23:34:25.9344450Z · ╰── Unnecessary dependency `listMountKey` 2026-10-23T23:34:25.9344507Z 2607 │ 2026-10-23T23:34:25.9344559Z ╰──── 2026-10-23T23:34:25.9344875Z  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-23T23:34:25.9345216Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.9345221Z 2026-10-23T23:34:25.9345434Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T23:34:25.9345577Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2763:7] 2026-10-23T23:34:25.9345635Z 2762 │ } 2026-10-23T23:34:25.9345829Z 2763 │ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]); 2026-10-23T23:34:25.9346047Z ·  ───────┬─────── ─────────┬──────── ────────┬─────── 2026-10-23T23:34:25.9346322Z · │ │ ╰── Unnecessary dependency `expandedWorkRows` 2026-10-23T23:34:25.9346608Z · │ ╰── Unnecessary dependency `expandedWorkGroups` 2026-10-23T23:34:25.9346811Z · ╰── Unnecessary dependency `expandedTurnIds` 2026-10-23T23:34:25.9346869Z 2764 │ 2026-10-23T23:34:25.9346925Z ╰──── 2026-10-23T23:34:25.9347239Z  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-23T23:34:25.9347574Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.9347577Z 2026-10-23T23:34:25.9347775Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T23:34:25.9347918Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:605:9] 2026-10-23T23:34:25.9347987Z 604 │ }; 2026-10-23T23:34:25.9348111Z 605 │ }, [props.environmentId, attachment.id, httpBaseUrl]), 2026-10-23T23:34:25.9348316Z ·  ─────────┬───────── ──────┬────── ─────┬───── 2026-10-23T23:34:25.9348572Z · │ │ ╰── Unnecessary dependency `httpBaseUrl` 2026-10-23T23:34:25.9348781Z · │ ╰── Unnecessary dependency `attachment.id` 2026-10-23T23:34:25.9348955Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-23T23:34:25.9349011Z 606 │ ); 2026-10-23T23:34:25.9349066Z ╰──── 2026-10-23T23:34:25.9349409Z  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-23T23:34:25.9349748Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.9349751Z 2026-10-23T23:34:25.9349976Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T23:34:25.9350161Z ╭─[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:249:7] 2026-10-23T23:34:25.9350248Z 248 │ mountedRef.current = false; 2026-10-23T23:34:25.9350331Z 249 │ flow.setBranchQuery(""); 2026-10-23T23:34:25.9350404Z ·  ──┬─ 2026-10-23T23:34:25.9350539Z · ╰── Missing dependency `flow` 2026-10-23T23:34:25.9350663Z 250 │ }; 2026-10-23T23:34:25.9350795Z 251 │ }, [flow.setBranchQuery]); 2026-10-23T23:34:25.9350904Z ·  ─────────┬───────── 2026-10-23T23:34:25.9351129Z · ╰── Overly precise dependency `flow.setBranchQuery`, use `flow` instead 2026-10-23T23:34:25.9351189Z 252 │ 2026-10-23T23:34:25.9351245Z ╰──── 2026-10-23T23:34:25.9351698Z  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-23T23:34:25.9352030Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.9352032Z 2026-10-23T23:34:25.9352260Z ⚠ eslint(no-unused-vars): Function 'nonEmptyString' is declared but never used. 2026-10-23T23:34:25.9352421Z ╭─[packages/client-runtime/src/work-log/presentation.ts:234:10] 2026-10-23T23:34:25.9352479Z 233 │ 2026-10-23T23:34:25.9352600Z 234 │ function nonEmptyString(value: unknown): string | null { 2026-10-23T23:34:25.9352693Z ·  ───────┬────── 2026-10-23T23:34:25.9352849Z · ╰── 'nonEmptyString' is declared here 2026-10-23T23:34:25.9353003Z 235 │ return typeof value === "string" && value.trim().length > 0 ? value : null; 2026-10-23T23:34:25.9353056Z ╰──── 2026-10-23T23:34:25.9353172Z  help: Consider removing this declaration. 2026-10-23T23:34:25.9353175Z 2026-10-23T23:34:25.9353461Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T23:34:25.9353637Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-23T23:34:25.9353702Z 259 │ .join("|"); 2026-10-23T23:34:25.9353774Z 260 │ useEffect(() => { 2026-10-23T23:34:25.9353852Z ·  ────┬──── 2026-10-23T23:34:25.9353989Z · ╰── This is the containing effect 2026-10-23T23:34:25.9354088Z 261 │ stop(); 2026-10-23T23:34:25.9354165Z ·  ──┬─ 2026-10-23T23:34:25.9354340Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.9354410Z 262 │ }, [orderVersion]); 2026-10-23T23:34:25.9354464Z ╰──── 2026-10-23T23:34:25.9355112Z  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-23T23:34:25.9355459Z  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-23T23:34:25.9355461Z 2026-10-23T23:34:25.9355690Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T23:34:25.9355863Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-23T23:34:25.9355930Z 260 │ useEffect(() => { 2026-10-23T23:34:25.9355995Z 261 │ stop(); 2026-10-23T23:34:25.9356070Z ·  ──┬─ 2026-10-23T23:34:25.9356267Z · ╰── Missing dependency `stop` 2026-10-23T23:34:25.9356383Z 262 │ }, [orderVersion]); 2026-10-23T23:34:25.9356471Z ·  ──────┬───── 2026-10-23T23:34:25.9356634Z · ╰── Unnecessary dependency `orderVersion` 2026-10-23T23:34:25.9356700Z 263 │ useEffect( 2026-10-23T23:34:25.9356753Z ╰──── 2026-10-23T23:34:25.9357203Z  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-23T23:34:25.9357536Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.9357538Z 2026-10-23T23:34:25.9357700Z ⚠ react(refs): Cannot access refs during render 2026-10-23T23:34:25.9357869Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9] 2026-10-23T23:34:25.9357953Z 95 │ const latest = useRef(props); 2026-10-23T23:34:25.9358028Z 96 │ latest.current = props; 2026-10-23T23:34:25.9358142Z ·  ───┬──────┬─── 2026-10-23T23:34:25.9358331Z · │ ╰── Cannot update ref value during render 2026-10-23T23:34:25.9358453Z · ╰── This value is a ref 2026-10-23T23:34:25.9358526Z 97 │ const gesture = useMemo( 2026-10-23T23:34:25.9358584Z ╰──── 2026-10-23T23:34:25.9359089Z  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-23T23:34:25.9359405Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T23:34:25.9359407Z 2026-10-23T23:34:25.9359563Z ⚠ react(refs): Cannot access refs during render 2026-10-23T23:34:25.9359735Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18] 2026-10-23T23:34:25.9359807Z 103 │ .runOnJS(true) 2026-10-23T23:34:25.9359912Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-23T23:34:25.9360037Z ·  ───────────────┬────────────── 2026-10-23T23:34:25.9360256Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T23:34:25.9360407Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-23T23:34:25.9360463Z ╰──── 2026-10-23T23:34:25.9360969Z  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-23T23:34:25.9361279Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T23:34:25.9361282Z 2026-10-23T23:34:25.9361437Z ⚠ react(refs): Cannot access refs during render 2026-10-23T23:34:25.9361609Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19] 2026-10-23T23:34:25.9361773Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-23T23:34:25.9361990Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-23T23:34:25.9362153Z ·  ──────────────────────────┬───────────────────────── 2026-10-23T23:34:25.9362380Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T23:34:25.9362511Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-23T23:34:25.9362566Z ╰──── 2026-10-23T23:34:25.9363108Z  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-23T23:34:25.9363442Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T23:34:25.9363449Z 2026-10-23T23:34:25.9363605Z ⚠ react(refs): Cannot access refs during render 2026-10-23T23:34:25.9363773Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16] 2026-10-23T23:34:25.9363911Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-23T23:34:25.9364077Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-23T23:34:25.9364231Z ·  ──────────────────────────┬───────────────────────── 2026-10-23T23:34:25.9364452Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T23:34:25.9364593Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-23T23:34:25.9364652Z ╰──── 2026-10-23T23:34:25.9365161Z  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-23T23:34:25.9365473Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T23:34:25.9365476Z 2026-10-23T23:34:25.9365627Z ⚠ react(refs): Cannot access refs during render 2026-10-23T23:34:25.9365800Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21] 2026-10-23T23:34:25.9365932Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-23T23:34:25.9366074Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-23T23:34:25.9366228Z ·  ───────────────────────┬────────────────────── 2026-10-23T23:34:25.9366463Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T23:34:25.9366540Z 108 │ [props.disabled], 2026-10-23T23:34:25.9366597Z ╰──── 2026-10-23T23:34:25.9367096Z  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-23T23:34:25.9367407Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T23:34:25.9367473Z 2026-10-23T23:34:25.9367823Z ⚠ react(refs): Cannot access refs during render 2026-10-23T23:34:25.9367992Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:249:9] 2026-10-23T23:34:25.9368113Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-23T23:34:25.9368224Z 249 │ latest.current = { rows, planners, moveThread }; 2026-10-23T23:34:25.9368337Z ·  ───┬──────┬─── 2026-10-23T23:34:25.9368533Z · │ ╰── Cannot update ref value during render 2026-10-23T23:34:25.9368655Z · ╰── This value is a ref 2026-10-23T23:34:25.9368710Z 250 │ 2026-10-23T23:34:25.9368765Z ╰──── 2026-10-23T23:34:25.9369269Z  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-23T23:34:25.9369584Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T23:34:25.9369587Z 2026-10-23T23:34:25.9369744Z ⚠ react(refs): Cannot access refs during render 2026-10-23T23:34:25.9369917Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:247:22] 2026-10-23T23:34:25.9370045Z 246 │ const [preview, setPreview] = useState(null); 2026-10-23T23:34:25.9370171Z 247 │ const translateY = useRef(new Animated.Value(0)).current; 2026-10-23T23:34:25.9370307Z ·  ──────────────────┬────────────────── 2026-10-23T23:34:25.9370495Z · ╰── Cannot access ref value during render 2026-10-23T23:34:25.9370617Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-23T23:34:25.9370672Z ╰──── 2026-10-23T23:34:25.9371176Z  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-23T23:34:25.9371487Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T23:34:25.9371490Z 2026-10-23T23:34:25.9371673Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T23:34:25.9371851Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:324:16] 2026-10-23T23:34:25.9371928Z 323 │ update(0); 2026-10-23T23:34:25.9372015Z 324 │ let last = performance.now(); 2026-10-23T23:34:25.9372117Z ·  ────────┬──────── 2026-10-23T23:34:25.9372269Z · ╰── Cannot call impure function 2026-10-23T23:34:25.9372343Z 325 │ const tick = () => { 2026-10-23T23:34:25.9372399Z ╰──── 2026-10-23T23:34:25.9372717Z  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-23T23:34:25.9373033Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T23:34:25.9373036Z 2026-10-23T23:34:25.9373305Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-23T23:34:25.9373519Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15] 2026-10-23T23:34:25.9373615Z  98 │ () => 2026-10-23T23:34:25.9373718Z  99 │ Gesture.Pan() 2026-10-23T23:34:25.9373837Z ·  ─┬─ 2026-10-23T23:34:25.9374229Z · ╰── `Pan` may be a component 2026-10-23T23:34:25.9374322Z 100 │ .enabled(!props.disabled) 2026-10-23T23:34:25.9374375Z ╰──── 2026-10-23T23:34:25.9374669Z  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-23T23:34:25.9375156Z  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-23T23:34:25.9375162Z 2026-10-23T23:34:25.9375364Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-23T23:34:25.9375530Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5] 2026-10-23T23:34:25.9375604Z 103 │ .runOnJS(true) 2026-10-23T23:34:25.9375710Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-23T23:34:25.9375804Z ·  ───┬── 2026-10-23T23:34:25.9376446Z · ╰── 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-23T23:34:25.9376596Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-23T23:34:25.9376729Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-23T23:34:25.9376864Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-23T23:34:25.9376936Z 108 │ [props.disabled], 2026-10-23T23:34:25.9377022Z ·  ────────┬─────── 2026-10-23T23:34:25.9377226Z · ╰── This dependency list is missing values used by the callback 2026-10-23T23:34:25.9377287Z 109 │ ); 2026-10-23T23:34:25.9377343Z ╰──── 2026-10-23T23:34:25.9377559Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-23T23:34:25.9378030Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.9378091Z 2026-10-23T23:34:25.9378312Z ⚠ eslint(no-unused-vars): Type 'EnvironmentId' is imported but never used. 2026-10-23T23:34:25.9378462Z ╭─[packages/client-runtime/src/state/sharedSettings.ts:2:3] 2026-10-23T23:34:25.9378528Z 1 │ import type { 2026-10-23T23:34:25.9378598Z 2 │ EnvironmentId, 2026-10-23T23:34:25.9378682Z ·  ──────┬────── 2026-10-23T23:34:25.9378827Z · ╰── 'EnvironmentId' is imported here 2026-10-23T23:34:25.9378917Z 3 │ ExecutionEnvironmentCapabilities, 2026-10-23T23:34:25.9378974Z ╰──── 2026-10-23T23:34:25.9379079Z  help: Consider removing this import. 2026-10-23T23:34:25.9379081Z 2026-10-23T23:34:25.9379503Z ⚠ 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-23T23:34:25.9379639Z ╭─[packages/shared/src/otelEnvironment.ts:146:14] 2026-10-23T23:34:25.9379704Z 145 │ name, 2026-10-23T23:34:25.9379856Z 146 │ (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()), 2026-10-23T23:34:25.9379972Z ·  ────────────────────────── 2026-10-23T23:34:25.9380105Z 147 │ `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`, 2026-10-23T23:34:25.9380163Z ╰──── 2026-10-23T23:34:25.9380165Z 2026-10-23T23:34:25.9380367Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T23:34:25.9380481Z ╭─[packages/shared/src/qrCode.ts:458:44] 2026-10-23T23:34:25.9380559Z 457 │ ): Array { 2026-10-23T23:34:25.9380675Z 458 │ let result: Array = divisor.map((_) => 0); 2026-10-23T23:34:25.9380784Z ·  ┬ 2026-10-23T23:34:25.9380941Z · ╰── '_' is declared here 2026-10-23T23:34:25.9381018Z 459 │ for (const b of data) { 2026-10-23T23:34:25.9381073Z ╰──── 2026-10-23T23:34:25.9381185Z  help: Consider removing this parameter. 2026-10-23T23:34:25.9381187Z 2026-10-23T23:34:25.9381412Z ⚠ typescript(no-extraneous-class): Unexpected class with only a constructor. 2026-10-23T23:34:25.9381548Z ╭─[apps/desktop/src/preview/Manager.test.ts:158:18] 2026-10-23T23:34:25.9381653Z 157 │ BrowserWindow: browserWindowConstructor, 2026-10-23T23:34:25.9381835Z 158 │ ╭─▶ ClipboardItem: class { 2026-10-23T23:34:25.9381981Z 159 │ │ constructor(data: Record) { 2026-10-23T23:34:25.9382106Z 160 │ │ clipboardItemConstructor(data); 2026-10-23T23:34:25.9382185Z 161 │ │ } 2026-10-23T23:34:25.9382321Z 162 │ ╰─▶ }, 2026-10-23T23:34:25.9382389Z 163 │ clipboard: { 2026-10-23T23:34:25.9382445Z ╰──── 2026-10-23T23:34:25.9382625Z  help: Try replacing this class with a standalone function or deleting it entirely 2026-10-23T23:34:25.9382628Z 2026-10-23T23:34:25.9382848Z ⚠ eslint(no-unused-vars): Identifier 'HostProcess' is imported but never used. 2026-10-23T23:34:25.9383100Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:25:13] 2026-10-23T23:34:25.9383243Z 24 │ import * as Schema from "effect/Schema"; 2026-10-23T23:34:25.9383374Z 25 │ import * as HostProcess from "@t3tools/shared/HostProcess"; 2026-10-23T23:34:25.9383466Z ·  ─────┬───── 2026-10-23T23:34:25.9383617Z · ╰── 'HostProcess' is imported here 2026-10-23T23:34:25.9383676Z 26 │ 2026-10-23T23:34:25.9383729Z ╰──── 2026-10-23T23:34:25.9383834Z  help: Consider removing this import. 2026-10-23T23:34:25.9383836Z 2026-10-23T23:34:25.9385174Z ⚠ eslint(no-unused-vars): Variable 'serverConfig' is declared but never used. Unused variables should start with a '_'. 2026-10-23T23:34:25.9385445Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:124:11] 2026-10-23T23:34:25.9385590Z 123 │ const path = yield* Path.Path; 2026-10-23T23:34:25.9385786Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-23T23:34:25.9385917Z ·  ──────┬───── 2026-10-23T23:34:25.9386143Z · ╰── 'serverConfig' is declared here 2026-10-23T23:34:25.9386361Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-23T23:34:25.9386449Z ╰──── 2026-10-23T23:34:25.9386617Z  help: Consider removing this declaration. 2026-10-23T23:34:25.9386622Z 2026-10-23T23:34:25.9387104Z ⚠ eslint(no-unused-vars): Variable 'serverSettings' is declared but never used. Unused variables should start with a '_'. 2026-10-23T23:34:25.9387387Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:125:11] 2026-10-23T23:34:25.9387590Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-23T23:34:25.9387852Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-23T23:34:25.9388003Z ·  ───────┬────── 2026-10-23T23:34:25.9388238Z · ╰── 'serverSettings' is declared here 2026-10-23T23:34:25.9388421Z 126 │ const gitWorkflow = yield* GitWorkflowService.GitWorkflowService; 2026-10-23T23:34:25.9388479Z ╰──── 2026-10-23T23:34:25.9388594Z  help: Consider removing this declaration. 2026-10-23T23:34:25.9388597Z 2026-10-23T23:34:25.9388809Z ⚠ eslint(no-unused-vars): Identifier 'identity' is imported but never used. 2026-10-23T23:34:25.9388918Z ╭─[apps/server/src/auth/http.ts:28:10] 2026-10-23T23:34:25.9389014Z 27 │ import * as Schema from "effect/Schema"; 2026-10-23T23:34:25.9389119Z 28 │ import { identity } from "effect/Function"; 2026-10-23T23:34:25.9389206Z ·  ────┬─── 2026-10-23T23:34:25.9389345Z · ╰── 'identity' is imported here 2026-10-23T23:34:25.9389434Z 29 │ import * as Layer from "effect/Layer"; 2026-10-23T23:34:25.9389491Z ╰──── 2026-10-23T23:34:25.9389595Z  help: Consider removing this import. 2026-10-23T23:34:25.9389598Z 2026-10-23T23:34:25.9389989Z ⚠ 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-23T23:34:25.9390124Z ╭─[apps/server/src/auth/RpcAuthorization.ts:237:17] 2026-10-23T23:34:25.9390269Z 236 │ const requiredScopesForSettingsUpdate = (payload: unknown) => { 2026-10-23T23:34:25.9390541Z 237 │ const input = Schema.decodeUnknownSync(SettingsUpdate)(payload); 2026-10-23T23:34:25.9390704Z ·  ──────────────────────── 2026-10-23T23:34:25.9390854Z 238 │ const scopes = requiredScopesForServerSettingsPatch(input.patch); 2026-10-23T23:34:25.9390909Z ╰──── 2026-10-23T23:34:25.9390911Z 2026-10-23T23:34:25.9391308Z ⚠ 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-23T23:34:25.9391441Z ╭─[apps/server/src/auth/RpcAuthorization.ts:256:26] 2026-10-23T23:34:25.9391550Z 255 │ if (method === WS_METHODS.assetsCreateUrl) { 2026-10-23T23:34:25.9391720Z 256 │ const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload); 2026-10-23T23:34:25.9391843Z ·  ──────────────────────── 2026-10-23T23:34:25.9391918Z 257 │ return [ 2026-10-23T23:34:25.9391976Z ╰──── 2026-10-23T23:34:25.9391978Z 2026-10-23T23:34:25.9392287Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-23T23:34:25.9392451Z ╭─[apps/web/src/components/settings/SettingInheritance.tsx:163:24] 2026-10-23T23:34:25.9392515Z 162 │ keys, 2026-10-23T23:34:25.9392591Z 163 │ overridingProjects = [], 2026-10-23T23:34:25.9392679Z ·  ── 2026-10-23T23:34:25.9392752Z 164 │ onClearOverrides, 2026-10-23T23:34:25.9392807Z ╰──── 2026-10-23T23:34:25.9393148Z  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-23T23:34:25.9393151Z 2026-10-23T23:34:25.9393374Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-23T23:34:25.9393550Z ╭─[apps/web/src/components/settings/ProviderSettingsPanel.logic.ts:4:8] 2026-10-23T23:34:25.9393630Z 3 │ AuthProvidersManageScope, 2026-10-23T23:34:25.9393704Z 4 │ type AuthSessionState, 2026-10-23T23:34:25.9393793Z ·  ────────┬─────── 2026-10-23T23:34:25.9393948Z · ╰── 'AuthSessionState' is imported here 2026-10-23T23:34:25.9394019Z 5 │ type EnvironmentId, 2026-10-23T23:34:25.9394113Z ╰──── 2026-10-23T23:34:25.9394218Z  help: Consider removing this import. 2026-10-23T23:34:25.9394221Z 2026-10-23T23:34:25.9394497Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T23:34:25.9394649Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:68:5] 2026-10-23T23:34:25.9394760Z 66 │ const { id: attachmentId, fileUri } = attachment; 2026-10-23T23:34:25.9394829Z 67 │ useEffect(() => { 2026-10-23T23:34:25.9394906Z ·  ────┬──── 2026-10-23T23:34:25.9395046Z · ╰── This is the containing effect 2026-10-23T23:34:25.9395112Z 68 │ setUri(null); 2026-10-23T23:34:25.9395188Z ·  ───┬── 2026-10-23T23:34:25.9395366Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T23:34:25.9395436Z 69 │ setError(null); 2026-10-23T23:34:25.9395490Z ╰──── 2026-10-23T23:34:25.9396207Z  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-23T23:34:25.9396606Z  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-23T23:34:25.9396608Z 2026-10-23T23:34:25.9396827Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T23:34:25.9396973Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:91:7] 2026-10-23T23:34:25.9397030Z 90 │ }; 2026-10-23T23:34:25.9397113Z 91 │ }, [attachmentId, fileUri]); 2026-10-23T23:34:25.9397241Z ·  ──────┬───── ───┬─── 2026-10-23T23:34:25.9397443Z · │ ╰── Unnecessary dependency `fileUri` 2026-10-23T23:34:25.9397597Z · ╰── Unnecessary dependency `attachmentId` 2026-10-23T23:34:25.9397742Z 92 │ const mimeType = videoMimeType(attachment) ?? attachment.mimeType; 2026-10-23T23:34:25.9397796Z ╰──── 2026-10-23T23:34:25.9398110Z  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-23T23:34:25.9398444Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.9398447Z 2026-10-23T23:34:25.9398672Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T23:34:25.9398827Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:213:34] 2026-10-23T23:34:25.9398900Z 212 │ useEffect(() => { 2026-10-23T23:34:25.9399021Z 213 │ if (!isFocused && hasSource) props.onRequestClose(); 2026-10-23T23:34:25.9399124Z ·  ──┬── 2026-10-23T23:34:25.9399284Z · ╰── Missing dependency `props` 2026-10-23T23:34:25.9399399Z 214 │ }, [isFocused, hasSource, props.onRequestClose]); 2026-10-23T23:34:25.9399520Z ·  ──────────┬───────── 2026-10-23T23:34:25.9399763Z · ╰── Overly precise dependency `props.onRequestClose`, use `props` instead 2026-10-23T23:34:25.9399843Z 215 │ const { source } = props; 2026-10-23T23:34:25.9399902Z ╰──── 2026-10-23T23:34:25.9400419Z  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-23T23:34:25.9400793Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T23:34:25.9400796Z 2026-10-23T23:34:25.9401011Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-23T23:34:25.9401191Z ╭─[apps/server/src/sourceControl/SourceControlProviderRegistry.ts:15:13] 2026-10-23T23:34:25.9401271Z 14 │ } from "@t3tools/contracts"; 2026-10-23T23:34:25.9401372Z 15 │ import type {} from "@t3tools/contracts"; 2026-10-23T23:34:25.9401446Z ·  ── 2026-10-23T23:34:25.9401645Z 16 │ import { detectSourceControlProviderFromRemoteUrl } from "@t3tools/shared/sourceControl"; 2026-10-23T23:34:25.9401705Z ╰──── 2026-10-23T23:34:25.9401795Z  help: Remove empty braces 2026-10-23T23:34:25.9401798Z 2026-10-23T23:34:25.9402273Z ⚠ 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-23T23:34:25.9402408Z ╭─[apps/server/src/serverSettings.test.ts:1741:32] 2026-10-23T23:34:25.9402592Z 1740 │ const model = createModelSelection(ProviderInstanceId.make("codex"), "gpt-5.5"); 2026-10-23T23:34:25.9402790Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-23T23:34:25.9402919Z ·  ─────────────────── 2026-10-23T23:34:25.9403036Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-23T23:34:25.9403093Z ╰──── 2026-10-23T23:34:25.9403095Z 2026-10-23T23:34:25.9403573Z ⚠ 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-23T23:34:25.9403702Z ╭─[apps/server/src/serverSettings.test.ts:1742:34] 2026-10-23T23:34:25.9403897Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-23T23:34:25.9404010Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-23T23:34:25.9404185Z ·  ─────────────────── 2026-10-23T23:34:25.9404319Z 1743 │ Schema.fromJsonString(Schema.Array(ProjectScript)), 2026-10-23T23:34:25.9404376Z ╰──── 2026-10-23T23:34:25.9404379Z 2026-10-23T23:34:25.9404589Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T23:34:25.9404748Z ╭─[apps/mobile/src/components/ComposerContextSheet.tsx:267:25] 2026-10-23T23:34:25.9404863Z 266 │ {record.elements?.map((element, index) => ( 2026-10-23T23:34:25.9405040Z 267 │ 2026-10-23T23:34:25.9405207Z ·  ─────────────────────────────────────────────────────── 2026-10-23T23:34:25.9405289Z 268 │