2026-10-24T10:35:13.4817009Z Current runner version: '2.338.1' 2026-10-24T10:35:13.4820738Z Runner name: 'blacksmith-8vcpu-ubuntu-2404-oegzxbct3k4r3hmz' 2026-10-24T10:35:13.4821513Z Runner group name: 'blacksmith scale sets - blacksmith-8vcpu-ubuntu-2404' 2026-10-24T10:35:13.4822265Z Machine name: 'ip-172-31-73-130' 2026-10-24T10:35:13.4823881Z ##[group]GITHUB_TOKEN Permissions 2026-10-24T10:35:13.4825403Z Contents: read 2026-10-24T10:35:13.4825827Z Metadata: read 2026-10-24T10:35:13.4826278Z ##[endgroup] 2026-10-24T10:35:13.4827847Z Secret source: Actions 2026-10-24T10:35:13.4828559Z Cache mode: write 2026-10-24T10:35:13.4829323Z Prepare workflow directory 2026-10-24T10:35:13.5012916Z Prepare all required actions 2026-10-24T10:35:13.5039404Z Getting action download info 2026-10-24T10:35:13.6080835Z Download action repository 'actions/checkout@v6' (SHA:d23441a48e516b6c34aea4fa41551a30e30af803) 2026-10-24T10:35:13.6482155Z Download action repository 'actions/cache@v6' (SHA:55cc8345863c7cc4c66a329aec7e433d2d1c52a9) 2026-10-24T10:35:13.7614500Z Setting BLACKSMITH_ACTIONS_RESULTS_URL to https://results-receiver.actions.githubusercontent.com/ 2026-10-24T10:35:13.7653521Z Complete job name: Lint 2026-10-24T10:35:13.8027432Z A job started hook has been configured by the self-hosted runner administrator 2026-10-24T10:35:13.8090022Z ##[group]Run '/setup.sh' 2026-10-24T10:35:13.8097804Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T10:35:13.8098209Z env: 2026-10-24T10:35:13.8098434Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 182 2026-10-24T10:35:13.8098719Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 428 2026-10-24T10:35:13.8099012Z BLACKSMITH_CHECK_RUN_ID: 120850399005 2026-10-24T10:35:13.8099286Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-24T10:35:13.8099556Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-24T10:35:13.8099811Z ##[endgroup] 2026-10-24T10:35:13.8343908Z Logging daemon started (blacksmithd for logs) 2026-10-24T10:35:13.8445583Z Results daemon started (blacksmithd for results) 2026-10-24T10:35:13.8588753Z Background adoption and SSH setup started (PID: 3169) 2026-10-24T10:35:13.8589316Z 2026-10-24T10:35:13.8589477Z ---------------------------------------- 2026-10-24T10:35:13.8590174Z View this job: https://app.blacksmith.sh/pingdotgg/runs/40086494175/jobs/120850399005 2026-10-24T10:35:13.8590809Z SSH Access (using your GitHub SSH key): 2026-10-24T10:35:13.8591455Z ssh -p 64000 runner@blacksmith-8vcpu-ubuntu-2404-oegzxbct3k4r3hmz.vm.blacksmith.sh 2026-10-24T10:35:13.8591952Z 2026-10-24T10:35:13.8592108Z No GitHub SSH key? Add one at: 2026-10-24T10:35:13.8592872Z https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account 2026-10-24T10:35:13.8593499Z 2026-10-24T10:35:13.8593675Z ---------------------------------------- 2026-10-24T10:35:13.8593956Z 2026-10-24T10:35:13.8594174Z VM ID: blacksmith-8vcpu-ubuntu-2404-oegzxbct3k4r3hmz 2026-10-24T10:35:13.8594806Z Host: production-152.236.46.247-x8664 2026-10-24T10:35:13.8595233Z Host Agent PID: 797334 2026-10-24T10:35:13.8595590Z Host Agent Git SHA: 1637818df 2026-10-24T10:35:13.8596001Z Host CPU Manufacturer: AuthenticAMD 2026-10-24T10:35:13.8596429Z Blacksmith Host Generation: gen 2 2026-10-24T10:35:13.8596849Z Petname: production-set-insect-02e32889 2026-10-24T10:35:13.8597279Z Region: us-east 2026-10-24T10:35:13.8597627Z Rootfs Version: ubuntu24-full-x64-081926 2026-10-24T10:35:13.8604475Z OS Version: Ubuntu 24.04.4 LTS 2026-10-24T10:35:13.8605311Z 2026-10-24T10:35:13.8605626Z Enabling Blacksmith transparent cache 2026-10-24T10:35:13.8920805Z ##[group]Run actions/checkout@v6 2026-10-24T10:35:13.8921177Z with: 2026-10-24T10:35:13.8921509Z sparse-checkout: /* !/.repos/ !/apps/mobile/modules/t3-terminal/Vendor/**/*.a 2026-10-24T10:35:13.8921900Z sparse-checkout-cone-mode: false 2026-10-24T10:35:13.8922176Z repository: pingdotgg/t3code 2026-10-24T10:35:13.8924071Z token: *** 2026-10-24T10:35:13.8924288Z ssh-strict: true 2026-10-24T10:35:13.8924559Z ssh-user: git 2026-10-24T10:35:13.8924785Z persist-credentials: true 2026-10-24T10:35:13.8925416Z clean: true 2026-10-24T10:35:13.8925634Z fetch-depth: 1 2026-10-24T10:35:13.8925849Z fetch-tags: false 2026-10-24T10:35:13.8926071Z show-progress: true 2026-10-24T10:35:13.8926296Z lfs: false 2026-10-24T10:35:13.8926505Z submodules: false 2026-10-24T10:35:13.8926734Z set-safe-directory: true 2026-10-24T10:35:13.8926988Z allow-unsafe-pr-checkout: false 2026-10-24T10:35:13.8927264Z env: 2026-10-24T10:35:13.8927516Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 182 2026-10-24T10:35:13.8927797Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 428 2026-10-24T10:35:13.8928078Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T10:35:13.8928339Z ##[endgroup] 2026-10-24T10:35:14.0135474Z Syncing repository: pingdotgg/t3code 2026-10-24T10:35:14.0136642Z ##[group]Getting Git version info 2026-10-24T10:35:14.0136986Z Working directory is '/home/runner/_work/t3code/t3code' 2026-10-24T10:35:14.0137472Z [command]/usr/local/bin/git version 2026-10-24T10:35:14.0215203Z git version 2.55.0 2026-10-24T10:35:14.0228380Z ##[endgroup] 2026-10-24T10:35:14.0237442Z Temporarily overriding HOME='/home/runner/_work/_temp/ad0da4c8-3ad6-45a0-930b-dc4d180dc49d' before making global git config changes 2026-10-24T10:35:14.0238545Z Adding repository directory to the temporary git global config as a safe directory 2026-10-24T10:35:14.0241900Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-24T10:35:14.0274733Z Deleting the contents of '/home/runner/_work/t3code/t3code' 2026-10-24T10:35:14.0276856Z ##[group]Determining repository object format 2026-10-24T10:35:14.0278183Z ##[endgroup] 2026-10-24T10:35:14.0278801Z ##[group]Initializing the repository 2026-10-24T10:35:14.0281752Z [command]/usr/local/bin/git init /home/runner/_work/t3code/t3code 2026-10-24T10:35:14.0318126Z hint: Using 'master' as the name for the initial branch. This default branch name 2026-10-24T10:35:14.0318760Z hint: will change to "main" in Git 3.0. To configure the initial branch name 2026-10-24T10:35:14.0319515Z hint: to use in all of your new repositories, which will suppress this warning, 2026-10-24T10:35:14.0320096Z hint: call: 2026-10-24T10:35:14.0320414Z hint: 2026-10-24T10:35:14.0320822Z hint: git config --global init.defaultBranch 2026-10-24T10:35:14.0321300Z hint: 2026-10-24T10:35:14.0321755Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and 2026-10-24T10:35:14.0322481Z hint: 'development'. The just-created branch can be renamed via this command: 2026-10-24T10:35:14.0323078Z hint: 2026-10-24T10:35:14.0323410Z hint: git branch -m 2026-10-24T10:35:14.0323791Z hint: 2026-10-24T10:35:14.0324290Z hint: Disable this message with "git config set advice.defaultBranchName false" 2026-10-24T10:35:14.0325133Z Initialized empty Git repository in /home/runner/_work/t3code/t3code/.git/ 2026-10-24T10:35:14.0326420Z [command]/usr/local/bin/git remote add origin https://github.com/pingdotgg/t3code 2026-10-24T10:35:14.0361365Z ##[endgroup] 2026-10-24T10:35:14.0361971Z ##[group]Disabling automatic garbage collection 2026-10-24T10:35:14.0364891Z [command]/usr/local/bin/git config --local gc.auto 0 2026-10-24T10:35:14.0389747Z ##[endgroup] 2026-10-24T10:35:14.0390322Z ##[group]Setting up auth 2026-10-24T10:35:14.0390744Z Removing SSH command configuration 2026-10-24T10:35:14.0395005Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-24T10:35:14.0424850Z [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-24T10:35:14.0576365Z Removing HTTP extra header 2026-10-24T10:35:14.0579524Z [command]/usr/local/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader 2026-10-24T10:35:14.0603927Z [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-24T10:35:14.0713893Z Removing includeIf entries pointing to credentials config files 2026-10-24T10:35:14.0718384Z [command]/usr/local/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: 2026-10-24T10:35:14.0744945Z [command]/usr/local/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url 2026-10-24T10:35:14.0862048Z [command]/usr/local/bin/git config --file /home/runner/_work/_temp/git-credentials-64e8206e-727b-4385-a1db-f9ad4fe0b028.config http.https://github.com/.extraheader AUTHORIZATION: basic *** 2026-10-24T10:35:14.0888939Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git.path /home/runner/_work/_temp/git-credentials-64e8206e-727b-4385-a1db-f9ad4fe0b028.config 2026-10-24T10:35:14.0908031Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git/worktrees/*.path /home/runner/_work/_temp/git-credentials-64e8206e-727b-4385-a1db-f9ad4fe0b028.config 2026-10-24T10:35:14.0927236Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-64e8206e-727b-4385-a1db-f9ad4fe0b028.config 2026-10-24T10:35:14.0947193Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-64e8206e-727b-4385-a1db-f9ad4fe0b028.config 2026-10-24T10:35:14.0964402Z ##[endgroup] 2026-10-24T10:35:14.0964769Z ##[group]Fetching the repository 2026-10-24T10:35:14.0969021Z [command]/usr/local/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --filter=blob:none --depth=1 origin +69c7db8a5c6626733ce48821523fca79f800ec9f:refs/remotes/pull/24391/merge 2026-10-24T10:35:14.3748038Z From https://github.com/pingdotgg/t3code 2026-10-24T10:35:14.3748654Z * [new ref] 69c7db8a5c6626733ce48821523fca79f800ec9f -> pull/24391/merge 2026-10-24T10:35:14.3775983Z ##[endgroup] 2026-10-24T10:35:14.3776459Z ##[group]Determining the checkout info 2026-10-24T10:35:14.3776939Z ##[endgroup] 2026-10-24T10:35:14.3777337Z ##[group]Setting up sparse checkout 2026-10-24T10:35:14.3779982Z [command]/usr/local/bin/git config core.sparseCheckout true 2026-10-24T10:35:14.3808314Z [command]/usr/local/bin/git rev-parse --git-path info/sparse-checkout 2026-10-24T10:35:14.3827639Z .git/info/sparse-checkout 2026-10-24T10:35:14.3831248Z ##[endgroup] 2026-10-24T10:35:14.3831713Z ##[group]Checking out the ref 2026-10-24T10:35:14.3833622Z [command]/usr/local/bin/git checkout --progress --force refs/remotes/pull/24391/merge 2026-10-24T10:35:21.2608352Z Updating files: 0% (1/6336) 2026-10-24T10:35:21.2639493Z Updating files: 1% (64/6336) 2026-10-24T10:35:21.2659017Z Updating files: 2% (127/6336) 2026-10-24T10:35:21.2681963Z Updating files: 3% (191/6336) 2026-10-24T10:35:21.2703639Z Updating files: 4% (254/6336) 2026-10-24T10:35:21.2737296Z Updating files: 5% (317/6336) 2026-10-24T10:35:21.2759457Z Updating files: 6% (381/6336) 2026-10-24T10:35:21.2820842Z Updating files: 7% (444/6336) 2026-10-24T10:35:21.2852672Z Updating files: 8% (507/6336) 2026-10-24T10:35:21.2877439Z Updating files: 9% (571/6336) 2026-10-24T10:35:21.3177189Z Updating files: 10% (634/6336) 2026-10-24T10:35:21.3195354Z Updating files: 11% (697/6336) 2026-10-24T10:35:21.3207341Z Updating files: 12% (761/6336) 2026-10-24T10:35:21.3222436Z Updating files: 13% (824/6336) 2026-10-24T10:35:21.3240209Z Updating files: 14% (888/6336) 2026-10-24T10:35:21.3258946Z Updating files: 15% (951/6336) 2026-10-24T10:35:21.3279284Z Updating files: 16% (1014/6336) 2026-10-24T10:35:21.3294907Z Updating files: 17% (1078/6336) 2026-10-24T10:35:21.3315174Z Updating files: 18% (1141/6336) 2026-10-24T10:35:21.3331002Z Updating files: 19% (1204/6336) 2026-10-24T10:35:21.3354708Z Updating files: 20% (1268/6336) 2026-10-24T10:35:21.3373818Z Updating files: 21% (1331/6336) 2026-10-24T10:35:21.3394002Z Updating files: 22% (1394/6336) 2026-10-24T10:35:21.3408284Z Updating files: 23% (1458/6336) 2026-10-24T10:35:21.3422738Z Updating files: 24% (1521/6336) 2026-10-24T10:35:21.3439268Z Updating files: 25% (1584/6336) 2026-10-24T10:35:21.3453840Z Updating files: 26% (1648/6336) 2026-10-24T10:35:21.3467914Z Updating files: 27% (1711/6336) 2026-10-24T10:35:21.3489146Z Updating files: 28% (1775/6336) 2026-10-24T10:35:21.3524141Z Updating files: 29% (1838/6336) 2026-10-24T10:35:21.3546556Z Updating files: 30% (1901/6336) 2026-10-24T10:35:21.3571125Z Updating files: 31% (1965/6336) 2026-10-24T10:35:21.3603595Z Updating files: 32% (2028/6336) 2026-10-24T10:35:21.3636289Z Updating files: 33% (2091/6336) 2026-10-24T10:35:21.3713646Z Updating files: 34% (2155/6336) 2026-10-24T10:35:21.3777272Z Updating files: 35% (2218/6336) 2026-10-24T10:35:21.3820769Z Updating files: 36% (2281/6336) 2026-10-24T10:35:21.3858119Z Updating files: 37% (2345/6336) 2026-10-24T10:35:21.3909126Z Updating files: 38% (2408/6336) 2026-10-24T10:35:21.3936951Z Updating files: 39% (2472/6336) 2026-10-24T10:35:21.3970056Z Updating files: 40% (2535/6336) 2026-10-24T10:35:21.4001121Z Updating files: 41% (2598/6336) 2026-10-24T10:35:21.4020620Z Updating files: 42% (2662/6336) 2026-10-24T10:35:21.4032088Z Updating files: 43% (2725/6336) 2026-10-24T10:35:21.4056237Z Updating files: 44% (2788/6336) 2026-10-24T10:35:21.4091126Z Updating files: 45% (2852/6336) 2026-10-24T10:35:21.4116085Z Updating files: 46% (2915/6336) 2026-10-24T10:35:21.4146920Z Updating files: 47% (2978/6336) 2026-10-24T10:35:21.4176813Z Updating files: 48% (3042/6336) 2026-10-24T10:35:21.4209851Z Updating files: 49% (3105/6336) 2026-10-24T10:35:21.4249833Z Updating files: 50% (3168/6336) 2026-10-24T10:35:21.4266855Z Updating files: 51% (3232/6336) 2026-10-24T10:35:21.4303623Z Updating files: 52% (3295/6336) 2026-10-24T10:35:21.4333174Z Updating files: 53% (3359/6336) 2026-10-24T10:35:21.4354805Z Updating files: 54% (3422/6336) 2026-10-24T10:35:21.4380682Z Updating files: 55% (3485/6336) 2026-10-24T10:35:21.4399476Z Updating files: 56% (3549/6336) 2026-10-24T10:35:21.4417570Z Updating files: 57% (3612/6336) 2026-10-24T10:35:21.4437154Z Updating files: 58% (3675/6336) 2026-10-24T10:35:21.4829927Z Updating files: 59% (3739/6336) 2026-10-24T10:35:21.4844743Z Updating files: 60% (3802/6336) 2026-10-24T10:35:21.4862046Z Updating files: 61% (3865/6336) 2026-10-24T10:35:21.4880904Z Updating files: 62% (3929/6336) 2026-10-24T10:35:21.4903274Z Updating files: 63% (3992/6336) 2026-10-24T10:35:21.4931142Z Updating files: 64% (4056/6336) 2026-10-24T10:35:21.4953886Z Updating files: 65% (4119/6336) 2026-10-24T10:35:21.4970852Z Updating files: 66% (4182/6336) 2026-10-24T10:35:21.4998772Z Updating files: 67% (4246/6336) 2026-10-24T10:35:21.5012171Z Updating files: 68% (4309/6336) 2026-10-24T10:35:21.5032445Z Updating files: 69% (4372/6336) 2026-10-24T10:35:21.5045614Z Updating files: 70% (4436/6336) 2026-10-24T10:35:21.5062662Z Updating files: 71% (4499/6336) 2026-10-24T10:35:21.5080461Z Updating files: 72% (4562/6336) 2026-10-24T10:35:21.5107403Z Updating files: 73% (4626/6336) 2026-10-24T10:35:21.5380689Z Updating files: 74% (4689/6336) 2026-10-24T10:35:21.5580680Z Updating files: 75% (4752/6336) 2026-10-24T10:35:21.5603586Z Updating files: 76% (4816/6336) 2026-10-24T10:35:21.5625547Z Updating files: 77% (4879/6336) 2026-10-24T10:35:21.5652076Z Updating files: 78% (4943/6336) 2026-10-24T10:35:21.5671901Z Updating files: 79% (5006/6336) 2026-10-24T10:35:21.5692100Z Updating files: 80% (5069/6336) 2026-10-24T10:35:21.5710339Z Updating files: 81% (5133/6336) 2026-10-24T10:35:21.5730368Z Updating files: 82% (5196/6336) 2026-10-24T10:35:21.5750699Z Updating files: 83% (5259/6336) 2026-10-24T10:35:21.5773326Z Updating files: 84% (5323/6336) 2026-10-24T10:35:21.5797742Z Updating files: 85% (5386/6336) 2026-10-24T10:35:21.5822735Z Updating files: 86% (5449/6336) 2026-10-24T10:35:21.5894715Z Updating files: 87% (5513/6336) 2026-10-24T10:35:21.5928366Z Updating files: 88% (5576/6336) 2026-10-24T10:35:21.5951740Z Updating files: 89% (5640/6336) 2026-10-24T10:35:21.5976053Z Updating files: 90% (5703/6336) 2026-10-24T10:35:21.6012250Z Updating files: 91% (5766/6336) 2026-10-24T10:35:21.6028998Z Updating files: 92% (5830/6336) 2026-10-24T10:35:21.6045956Z Updating files: 93% (5893/6336) 2026-10-24T10:35:21.6068125Z Updating files: 94% (5956/6336) 2026-10-24T10:35:21.6093006Z Updating files: 95% (6020/6336) 2026-10-24T10:35:21.6150454Z Updating files: 96% (6083/6336) 2026-10-24T10:35:21.6178959Z Updating files: 97% (6146/6336) 2026-10-24T10:35:21.6227522Z Updating files: 98% (6210/6336) 2026-10-24T10:35:21.6247868Z Updating files: 99% (6273/6336) 2026-10-24T10:35:21.6248154Z Updating files: 100% (6336/6336) 2026-10-24T10:35:21.6248404Z Updating files: 100% (6336/6336), done. 2026-10-24T10:35:21.6408483Z Note: switching to 'refs/remotes/pull/24391/merge'. 2026-10-24T10:35:21.6408662Z 2026-10-24T10:35:21.6408838Z You are in 'detached HEAD' state. You can look around, make experimental 2026-10-24T10:35:21.6409184Z changes and commit them, and you can discard any commits you make in this 2026-10-24T10:35:21.6409453Z state without impacting any branches by switching back to a branch. 2026-10-24T10:35:21.6409588Z 2026-10-24T10:35:21.6409677Z If you want to create a new branch to retain commits you create, you may 2026-10-24T10:35:21.6409905Z do so (now or later) by using -c with the switch command. Example: 2026-10-24T10:35:21.6410028Z 2026-10-24T10:35:21.6410086Z git switch -c 2026-10-24T10:35:21.6410184Z 2026-10-24T10:35:21.6410239Z Or undo this operation with: 2026-10-24T10:35:21.6410319Z 2026-10-24T10:35:21.6410365Z git switch - 2026-10-24T10:35:21.6410435Z 2026-10-24T10:35:21.6410555Z Turn off this advice by setting config variable advice.detachedHead to false 2026-10-24T10:35:21.6410699Z 2026-10-24T10:35:21.6410857Z HEAD is now at 69c7db8 Merge 0a26c94c757e685e910fb3df4390efcebfadbc8a into 27e0c684c585f955252d65f06206dd11a143bff5 2026-10-24T10:35:21.6422593Z ##[endgroup] 2026-10-24T10:35:21.6457075Z [command]/usr/local/bin/git log -1 --format=%H 2026-10-24T10:35:21.6475543Z 69c7db8a5c6626733ce48821523fca79f800ec9f 2026-10-24T10:35:21.6590875Z ##[group]Run files="$(git ls-files .github/pr-assets)" 2026-10-24T10:35:21.6591144Z files="$(git ls-files .github/pr-assets)" 2026-10-24T10:35:21.6591324Z if test -n "$files"; then 2026-10-24T10:35:21.6591547Z  printf 'PR evidence must be uploaded to GitHub, not committed:\n%s\n' "$files" >&2 2026-10-24T10:35:21.6591763Z  exit 1 2026-10-24T10:35:21.6591870Z fi 2026-10-24T10:35:21.6600935Z shell: /usr/bin/bash -e {0} 2026-10-24T10:35:21.6601067Z env: 2026-10-24T10:35:21.6601181Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 182 2026-10-24T10:35:21.6601343Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 428 2026-10-24T10:35:21.6601488Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T10:35:21.6601621Z ##[endgroup] 2026-10-24T10:35:21.6750309Z Prepare all required actions 2026-10-24T10:35:21.6750609Z Getting action download info 2026-10-24T10:35:21.7526265Z Download action repository 'voidzero-dev/setup-vp@v1' (SHA:250f29ce396baf5e8f24498e17c0dfdebabc26eb) 2026-10-24T10:35:21.8663330Z ##[group]Run ./.github/actions/setup-ci-deps 2026-10-24T10:35:21.8663483Z env: 2026-10-24T10:35:21.8663598Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 182 2026-10-24T10:35:21.8663750Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 428 2026-10-24T10:35:21.8663894Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T10:35:21.8664034Z ##[endgroup] 2026-10-24T10:35:21.8759817Z ##[start-action display=Resolve Vite+ version;id=__self.vp] 2026-10-24T10:35:21.8776811Z ##[group]Run echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-24T10:35:21.8777285Z echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-24T10:35:21.8777585Z echo "node=$(jq -r '.engines.node' package.json)" >> "$GITHUB_OUTPUT" 2026-10-24T10:35:21.8777827Z echo "pnpm=$(jq -r '.packageManager' package.json)" >> "$GITHUB_OUTPUT" 2026-10-24T10:35:21.8786685Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T10:35:21.8786851Z env: 2026-10-24T10:35:21.8786964Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 182 2026-10-24T10:35:21.8787107Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 428 2026-10-24T10:35:21.8787250Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T10:35:21.8787388Z ##[endgroup] 2026-10-24T10:35:21.8866083Z ##[end-action id=__self.vp;outcome=success;conclusion=success;duration_ms=10] 2026-10-24T10:35:21.8868472Z ##[start-action display=Cache Vite+;id=__self.vp_cache] 2026-10-24T10:35:21.8932758Z ##[group]Run actions/cache@v6 2026-10-24T10:35:21.8933010Z with: 2026-10-24T10:35:21.8933166Z path: ~/.vite-plus 2026-10-24T10:35:21.8933408Z key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T10:35:21.8933712Z enableCrossOsArchive: false 2026-10-24T10:35:21.8933912Z fail-on-cache-miss: false 2026-10-24T10:35:21.8934100Z lookup-only: false 2026-10-24T10:35:21.8934265Z save-always: false 2026-10-24T10:35:21.8934432Z env: 2026-10-24T10:35:21.8934591Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 182 2026-10-24T10:35:21.8934816Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 428 2026-10-24T10:35:21.8935034Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T10:35:21.8935238Z ##[endgroup] 2026-10-24T10:35:22.0919308Z Cache hit for: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T10:35:22.4878281Z Received 170349591 of 170349591 (100.0%), 433.2 MBs/sec 2026-10-24T10:35:22.4878987Z Cache Size: ~162 MB (170349591 B) 2026-10-24T10:35:22.4902772Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/752bb098-e99f-4764-b369-66819457bea6/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T10:35:23.2956905Z Cache restored successfully 2026-10-24T10:35:23.3107432Z Cache restored from key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T10:35:23.3190329Z ##[end-action id=__self.vp_cache;outcome=success;conclusion=success;duration_ms=1432] 2026-10-24T10:35:23.3192914Z ##[start-action display=Use cached Vite+;id=__self.__run] 2026-10-24T10:35:23.3216391Z ##[group]Run echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-24T10:35:23.3216612Z echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-24T10:35:23.3216787Z "$HOME/.vite-plus/bin/vp" env use "26.12.1" 2026-10-24T10:35:23.3227205Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T10:35:23.3227375Z env: 2026-10-24T10:35:23.3227493Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 182 2026-10-24T10:35:23.3227641Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 428 2026-10-24T10:35:23.3227788Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T10:35:23.3227941Z ##[endgroup] 2026-10-24T10:35:23.3264734Z Using Node.js v26.12.1 (resolved from 26.12.1) 2026-10-24T10:35:23.3272828Z ##[end-action id=__self.__run;outcome=success;conclusion=success;duration_ms=7] 2026-10-24T10:35:23.3274255Z ##[start-action display=Setup Vite+;id=__self.__voidzero-dev_setup-vp] 2026-10-24T10:35:23.3278199Z ##[end-action id=__self.__voidzero-dev_setup-vp;outcome=skipped;conclusion=skipped;duration_ms=0] 2026-10-24T10:35:23.3279309Z ##[start-action display=Resolve pnpm store path;id=__self.pnpm_store] 2026-10-24T10:35:23.3307048Z ##[group]Run store_path="$(vp pm cache dir)" 2026-10-24T10:35:23.3307279Z store_path="$(vp pm cache dir)" 2026-10-24T10:35:23.3307488Z echo "path=$store_path" >> "$GITHUB_OUTPUT" 2026-10-24T10:35:23.3316628Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T10:35:23.3316811Z env: 2026-10-24T10:35:23.3316923Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 182 2026-10-24T10:35:23.3317071Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 428 2026-10-24T10:35:23.3317355Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T10:35:23.3317495Z ##[endgroup] 2026-10-24T10:35:23.3446746Z ##[end-action id=__self.pnpm_store;outcome=success;conclusion=success;duration_ms=16] 2026-10-24T10:35:23.3448531Z ##[start-action display=Cache full pnpm store;id=__self.__actions_cache] 2026-10-24T10:35:23.3819610Z ##[group]Run actions/cache@v6 2026-10-24T10:35:23.3819756Z with: 2026-10-24T10:35:23.3819882Z path: /home/runner/.local/share/pnpm/store/v11 2026-10-24T10:35:23.3820145Z key: pnpm-full-v1-Linux-X64-8600a8d4a7fcc9519d421cef0c77201c793c5d8afbbef2897636b5b9305a9b7d 2026-10-24T10:35:23.3820402Z restore-keys: pnpm-full-v1-Linux-X64- 2026-10-24T10:35:23.3820552Z enableCrossOsArchive: false 2026-10-24T10:35:23.3820687Z fail-on-cache-miss: false 2026-10-24T10:35:23.3820811Z lookup-only: false 2026-10-24T10:35:23.3820926Z save-always: false 2026-10-24T10:35:23.3821035Z env: 2026-10-24T10:35:23.3821149Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 182 2026-10-24T10:35:23.3821313Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 428 2026-10-24T10:35:23.3821454Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T10:35:23.3821591Z ##[endgroup] 2026-10-24T10:35:23.5740447Z Cache hit for: pnpm-full-v1-Linux-X64-8600a8d4a7fcc9519d421cef0c77201c793c5d8afbbef2897636b5b9305a9b7d 2026-10-24T10:35:24.6034170Z Received 704643072 of 995169257 (70.8%), 671.3 MBs/sec 2026-10-24T10:35:25.5314872Z Received 995169257 of 995169257 (100.0%), 492.0 MBs/sec 2026-10-24T10:35:25.5315491Z Cache Size: ~949 MB (995169257 B) 2026-10-24T10:35:25.5353461Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/2f760d76-a910-4646-a134-96577e443c01/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T10:35:31.3859799Z Cache restored successfully 2026-10-24T10:35:31.4350615Z Cache restored from key: pnpm-full-v1-Linux-X64-8600a8d4a7fcc9519d421cef0c77201c793c5d8afbbef2897636b5b9305a9b7d 2026-10-24T10:35:31.4423554Z ##[end-action id=__self.__actions_cache;outcome=success;conclusion=success;duration_ms=8097] 2026-10-24T10:35:31.4426649Z ##[start-action display=Install dependencies;id=__self.__run_2] 2026-10-24T10:35:31.4441886Z ##[group]Run vp install 2026-10-24T10:35:31.4442112Z vp install 2026-10-24T10:35:31.4452136Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T10:35:31.4452312Z env: 2026-10-24T10:35:31.4452470Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 182 2026-10-24T10:35:31.4452619Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 428 2026-10-24T10:35:31.4452767Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T10:35:31.4452902Z ##[endgroup] 2026-10-24T10:35:31.4864680Z Scope: all 33 workspace projects 2026-10-24T10:35:31.6007303Z ? Verifying lockfile against supply-chain policies (2088 entries)... 2026-10-24T10:35:31.8808843Z Packages are hard linked from the content-addressable store to the virtual store. 2026-10-24T10:35:31.8809175Z Content-addressable store is at: /home/runner/.local/share/pnpm/store/v11 2026-10-24T10:35:31.8809400Z Virtual store is at: node_modules/.pnpm 2026-10-24T10:35:34.0111756Z ✓ Lockfile passes supply-chain policies (2088 entries in 2.4s) 2026-10-24T10:35:34.0112038Z Lockfile is up to date, resolution step is skipped 2026-10-24T10:35:34.0308130Z Packages: +1721 2026-10-24T10:35:34.0308323Z ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2026-10-24T10:35:34.1995296Z Progress: resolved 1721, reused 1718, downloaded 0, added 1721, done 2026-10-24T10:35:35.2737226Z . prepare$ vp config --no-agent 2026-10-24T10:35:35.3847969Z . prepare: Done 2026-10-24T10:35:35.3864431Z 2026-10-24T10:35:35.3864901Z devDependencies: 2026-10-24T10:35:35.3865089Z + @coderabbitai/config 1.1.0 2026-10-24T10:35:35.3865313Z + @shadcn/lint 0.1.5 2026-10-24T10:35:35.3865484Z + @types/node 24.12.4 2026-10-24T10:35:35.3865617Z + knip 6.34.0 2026-10-24T10:35:35.3865789Z + typescript <- @tsc-rs/typescript 0.8.0 2026-10-24T10:35:35.3865940Z + vite-plus 1.3.0 2026-10-24T10:35:35.3866006Z 2026-10-24T10:35:35.3879486Z Done in 3.9s using pnpm v12.14.0 2026-10-24T10:35:35.4025566Z ##[end-action id=__self.__run_2;outcome=success;conclusion=success;duration_ms=3959] 2026-10-24T10:35:35.4503436Z ##[group]Run actions/cache@v6 2026-10-24T10:35:35.4503589Z with: 2026-10-24T10:35:35.4503703Z path: ~/.cache/electron 2026-10-24T10:35:35.4503946Z key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T10:35:35.4504191Z enableCrossOsArchive: false 2026-10-24T10:35:35.4504330Z fail-on-cache-miss: false 2026-10-24T10:35:35.4504456Z lookup-only: false 2026-10-24T10:35:35.4504573Z save-always: false 2026-10-24T10:35:35.4504683Z env: 2026-10-24T10:35:35.4504798Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 182 2026-10-24T10:35:35.4504949Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 428 2026-10-24T10:35:35.4505111Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T10:35:35.4505339Z ##[endgroup] 2026-10-24T10:35:35.6375722Z Cache hit for: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T10:35:35.8018465Z Received 122906203 of 122906203 (100.0%), 792.0 MBs/sec 2026-10-24T10:35:35.8018929Z Cache Size: ~117 MB (122906203 B) 2026-10-24T10:35:35.8035841Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/0cde6c51-6668-45aa-9957-7d2ff232492e/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T10:35:35.8883719Z Cache restored successfully 2026-10-24T10:35:35.9014740Z Cache restored from key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T10:35:35.9218726Z ##[group]Run vp run --filter @t3tools/desktop ensure:electron 2026-10-24T10:35:35.9218977Z vp run --filter @t3tools/desktop ensure:electron 2026-10-24T10:35:35.9228318Z shell: /usr/bin/bash -e {0} 2026-10-24T10:35:35.9228450Z env: 2026-10-24T10:35:35.9228745Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 182 2026-10-24T10:35:35.9228896Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 428 2026-10-24T10:35:35.9229044Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T10:35:35.9229184Z ##[endgroup] 2026-10-24T10:35:36.1080678Z ~/apps/desktop$ node scripts/ensure-electron-runtime.mjs ⊘ cache disabled 2026-10-24T10:35:36.7240019Z /home/runner/_work/t3code/t3code/node_modules/.pnpm/electron@44.9.3_supports-color@8.1.1/node_modules/electron/dist/electron 2026-10-24T10:35:36.7258895Z 2026-10-24T10:35:36.7353404Z ##[group]Run vp run knip:check 2026-10-24T10:35:36.7353629Z vp run knip:check 2026-10-24T10:35:36.7375438Z shell: /usr/bin/bash -e {0} 2026-10-24T10:35:36.7375568Z env: 2026-10-24T10:35:36.7375683Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 182 2026-10-24T10:35:36.7375831Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 428 2026-10-24T10:35:36.7375970Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T10:35:36.7376107Z ##[endgroup] 2026-10-24T10:35:36.8950430Z $ knip --include files,dependencies --no-config-hints ⊘ cache disabled 2026-10-24T10:35:40.9545489Z 2026-10-24T10:35:40.9548519Z $ 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-24T10:35:49.7456336Z 2026-10-24T10:35:49.7457416Z --- 2026-10-24T10:35:49.7457732Z vp run: 2/2 successful. (Run `vp run --last-details` for full details) 2026-10-24T10:35:49.7544283Z ##[group]Run vp run --filter @t3tools/source-control-github generate --check 2026-10-24T10:35:49.7544571Z vp run --filter @t3tools/source-control-github generate --check 2026-10-24T10:35:49.7554888Z shell: /usr/bin/bash -e {0} 2026-10-24T10:35:49.7555077Z env: 2026-10-24T10:35:49.7555209Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 182 2026-10-24T10:35:49.7555360Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 428 2026-10-24T10:35:49.7555504Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T10:35:49.7555645Z ##[endgroup] 2026-10-24T10:35:49.9018538Z ~/packages/source-control-github$ graphqlgen --check ⊘ cache disabled 2026-10-24T10:35:50.1063943Z 2026-10-24T10:35:50.1152199Z ##[group]Run vp run --filter t3 generate --check 2026-10-24T10:35:50.1152418Z vp run --filter t3 generate --check 2026-10-24T10:35:50.1161567Z shell: /usr/bin/bash -e {0} 2026-10-24T10:35:50.1161701Z env: 2026-10-24T10:35:50.1161832Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 182 2026-10-24T10:35:50.1161986Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 428 2026-10-24T10:35:50.1162128Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T10:35:50.1162268Z ##[endgroup] 2026-10-24T10:35:50.2686753Z ~/apps/server$ graphqlgen --check ⊘ cache disabled 2026-10-24T10:35:50.4309494Z 2026-10-24T10:35:50.4395681Z ##[group]Run vp check 2026-10-24T10:35:50.4395839Z vp check 2026-10-24T10:35:50.4404851Z shell: /usr/bin/bash -e {0} 2026-10-24T10:35:50.4404979Z env: 2026-10-24T10:35:50.4405091Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 182 2026-10-24T10:35:50.4405240Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 428 2026-10-24T10:35:50.4405381Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T10:35:50.4405514Z ##[endgroup] 2026-10-24T10:35:51.0462534Z pass: All 5690 files are correctly formatted (453ms, 8 threads) 2026-10-24T10:35:58.0097995Z warn: Lint warnings found 2026-10-24T10:35:58.0099967Z ⚠ 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-24T10:35:58.0100651Z ╭─[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:521:13] 2026-10-24T10:35:58.0100921Z 520 │ })).delivery; 2026-10-24T10:35:58.0101323Z 521 │ ╭─▶ while (delivery.outcome === "accepted") { 2026-10-24T10:35:58.0101642Z 522 │ │ yield* Effect.yieldNow; 2026-10-24T10:35:58.0101926Z 523 │ │ delivery = (yield* service.getWebhookDelivery({ 2026-10-24T10:35:58.0102375Z 524 │ │ id: task.id, 2026-10-24T10:35:58.0102618Z 525 │ │ deliveryId: deliveryId!, 2026-10-24T10:35:58.0102848Z 526 │ │ })).delivery; 2026-10-24T10:35:58.0103110Z 527 │ ╰─▶ } 2026-10-24T10:35:58.0103372Z 528 │ assert.equal(delivery.outcome, "dispatch_failed"); 2026-10-24T10:35:58.0103584Z ╰──── 2026-10-24T10:35:58.0103666Z 2026-10-24T10:35:58.0103885Z ⚠ eslint(no-unused-vars): Function 'describeSchedule' is declared but never used. 2026-10-24T10:35:58.0104229Z ╭─[apps/server/src/scheduledTasks/Schedule.ts:79:10] 2026-10-24T10:35:58.0104422Z 78 │ 2026-10-24T10:35:58.0104627Z 79 │ function describeSchedule(schedule: ScheduledTaskSchedule): string { 2026-10-24T10:35:58.0104894Z ·  ────────┬─────── 2026-10-24T10:35:58.0105154Z · ╰── 'describeSchedule' is declared here 2026-10-24T10:35:58.0105503Z 80 │ if (schedule.type === "webhook") return "On webhook"; 2026-10-24T10:35:58.0105683Z ╰──── 2026-10-24T10:35:58.0105852Z  help: Consider removing this declaration. 2026-10-24T10:35:58.0105977Z 2026-10-24T10:35:58.0106190Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:35:58.0106555Z ╭─[apps/mobile/src/state/use-thread-outbox-drain.ts:1315:5] 2026-10-24T10:35:58.0106797Z 1314 │ queuedMessagesByThreadKey, 2026-10-24T10:35:58.0106973Z 1315 │ retryTick, 2026-10-24T10:35:58.0107132Z ·  ────┬──── 2026-10-24T10:35:58.0107371Z · ╰── Unnecessary dependency `retryTick` 2026-10-24T10:35:58.0107597Z 1316 │ restoreQueuedMessage, 2026-10-24T10:35:58.0107754Z ╰──── 2026-10-24T10:35:58.0108116Z  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-24T10:35:58.0108739Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0109044Z 2026-10-24T10:35:58.0109308Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:35:58.0109703Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2139:5] 2026-10-24T10:35:58.0109911Z 2137 │ ); 2026-10-24T10:35:58.0110052Z 2138 │ useEffect(() => { 2026-10-24T10:35:58.0110369Z ·  ────┬──── 2026-10-24T10:35:58.0110651Z · ╰── This is the containing effect 2026-10-24T10:35:58.0110870Z 2139 │ setExpandedVideo(null); 2026-10-24T10:35:58.0111054Z ·  ────────┬─────── 2026-10-24T10:35:58.0111362Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.0111633Z 2140 │ setExpandedFile(null); 2026-10-24T10:35:58.0111785Z ╰──── 2026-10-24T10:35:58.0112459Z  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-24T10:35:58.0113343Z  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-24T10:35:58.0113656Z 2026-10-24T10:35:58.0113896Z ⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used. 2026-10-24T10:35:58.0114262Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:66:10] 2026-10-24T10:35:58.0114551Z 65 │ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets"; 2026-10-24T10:35:58.0114849Z 66 │ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks"; 2026-10-24T10:35:58.0115108Z ·  ───────────┬─────────── 2026-10-24T10:35:58.0115395Z · ╰── 'isMarkdownFileLinkLabel' is imported here 2026-10-24T10:35:58.0115728Z 67 │ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments"; 2026-10-24T10:35:58.0115956Z ╰──── 2026-10-24T10:35:58.0116110Z  help: Consider removing this import. 2026-10-24T10:35:58.0116228Z 2026-10-24T10:35:58.0116442Z ⚠ eslint(no-unused-vars): Identifier 'createContext' is imported but never used. 2026-10-24T10:35:58.0116781Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:92:3] 2026-10-24T10:35:58.0116988Z 91 │ import { 2026-10-24T10:35:58.0117126Z 92 │ createContext, 2026-10-24T10:35:58.0117281Z ·  ──────┬────── 2026-10-24T10:35:58.0117512Z · ╰── 'createContext' is imported here 2026-10-24T10:35:58.0117711Z 93 │ memo, 2026-10-24T10:35:58.0117834Z ╰──── 2026-10-24T10:35:58.0117987Z  help: Consider removing this import. 2026-10-24T10:35:58.0118102Z 2026-10-24T10:35:58.0118331Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-24T10:35:58.0118683Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:108:3] 2026-10-24T10:35:58.0118893Z 107 │ import { 2026-10-24T10:35:58.0119033Z 108 │ ActivityIndicator, 2026-10-24T10:35:58.0119206Z ·  ────────┬──────── 2026-10-24T10:35:58.0119448Z · ╰── 'ActivityIndicator' is imported here 2026-10-24T10:35:58.0119654Z 109 │ Image, 2026-10-24T10:35:58.0119779Z ╰──── 2026-10-24T10:35:58.0119932Z  help: Consider removing this import. 2026-10-24T10:35:58.0120048Z 2026-10-24T10:35:58.0120256Z ⚠ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used. 2026-10-24T10:35:58.0120674Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:115:3] 2026-10-24T10:35:58.0120926Z 114 │ Pressable, 2026-10-24T10:35:58.0121068Z 115 │ ScrollView, 2026-10-24T10:35:58.0121247Z ·  ─────┬──── 2026-10-24T10:35:58.0121467Z · ╰── 'ScrollView' is imported here 2026-10-24T10:35:58.0121673Z 116 │ StyleSheet, 2026-10-24T10:35:58.0121801Z ╰──── 2026-10-24T10:35:58.0121952Z  help: Consider removing this import. 2026-10-24T10:35:58.0122069Z 2026-10-24T10:35:58.0122276Z ⚠ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used. 2026-10-24T10:35:58.0122612Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:117:11] 2026-10-24T10:35:58.0122824Z 116 │ StyleSheet, 2026-10-24T10:35:58.0122967Z 117 │ Text as NativeText, 2026-10-24T10:35:58.0123148Z ·  ─────┬──── 2026-10-24T10:35:58.0123388Z · ╰── 'NativeText' is imported here 2026-10-24T10:35:58.0123601Z 118 │ type ColorValue, 2026-10-24T10:35:58.0123738Z ╰──── 2026-10-24T10:35:58.0123892Z  help: Consider removing this import. 2026-10-24T10:35:58.0124004Z 2026-10-24T10:35:58.0124227Z ⚠ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used. 2026-10-24T10:35:58.0124578Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:140:10] 2026-10-24T10:35:58.0124862Z 139 │ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic"; 2026-10-24T10:35:58.0125142Z 140 │ import { tryOpenExternalUrl } from "../../lib/openExternalUrl"; 2026-10-24T10:35:58.0125373Z ·  ─────────┬──────── 2026-10-24T10:35:58.0125636Z · ╰── 'tryOpenExternalUrl' is imported here 2026-10-24T10:35:58.0125950Z 141 │ import { downloadAndShareAttachment } from "../../lib/attachmentDownload"; 2026-10-24T10:35:58.0126162Z ╰──── 2026-10-24T10:35:58.0126318Z  help: Consider removing this import. 2026-10-24T10:35:58.0126434Z 2026-10-24T10:35:58.0126655Z ⚠ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used. 2026-10-24T10:35:58.0127008Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:143:10] 2026-10-24T10:35:58.0127291Z 142 │ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks"; 2026-10-24T10:35:58.0127572Z 143 │ import { faviconUrlForOrigin } from "@t3tools/shared/favicon"; 2026-10-24T10:35:58.0127804Z ·  ─────────┬───────── 2026-10-24T10:35:58.0128071Z · ╰── 'faviconUrlForOrigin' is imported here 2026-10-24T10:35:58.0128288Z 144 │ import { 2026-10-24T10:35:58.0128413Z ╰──── 2026-10-24T10:35:58.0128565Z  help: Consider removing this import. 2026-10-24T10:35:58.0128682Z 2026-10-24T10:35:58.0128900Z ⚠ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used. 2026-10-24T10:35:58.0129246Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:157:10] 2026-10-24T10:35:58.0129550Z 156 │ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile"; 2026-10-24T10:35:58.0129847Z 157 │ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer"; 2026-10-24T10:35:58.0130090Z ·  ────────┬─────── 2026-10-24T10:35:58.0130339Z · ╰── 'MediaVideoPlayer' is imported here 2026-10-24T10:35:58.0130703Z 158 │ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia"; 2026-10-24T10:35:58.0130964Z ╰──── 2026-10-24T10:35:58.0131153Z  help: Consider removing this import. 2026-10-24T10:35:58.0131269Z 2026-10-24T10:35:58.0131498Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used. 2026-10-24T10:35:58.0131850Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:161:3] 2026-10-24T10:35:58.0132084Z 160 │ attachmentVideoPreviewSource, 2026-10-24T10:35:58.0132260Z 161 │ mediaVideoPreviewUri, 2026-10-24T10:35:58.0132443Z ·  ──────────┬───────── 2026-10-24T10:35:58.0132699Z · ╰── 'mediaVideoPreviewUri' is imported here 2026-10-24T10:35:58.0132929Z 162 │ mediaVideoThumbnailKey, 2026-10-24T10:35:58.0133084Z ╰──── 2026-10-24T10:35:58.0133244Z  help: Consider removing this import. 2026-10-24T10:35:58.0133356Z 2026-10-24T10:35:58.0133587Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used. 2026-10-24T10:35:58.0133943Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:162:3] 2026-10-24T10:35:58.0134157Z 161 │ mediaVideoPreviewUri, 2026-10-24T10:35:58.0134397Z 162 │ mediaVideoThumbnailKey, 2026-10-24T10:35:58.0134588Z ·  ───────────┬────────── 2026-10-24T10:35:58.0134849Z · ╰── 'mediaVideoThumbnailKey' is imported here 2026-10-24T10:35:58.0135085Z 163 │ type MediaVideoPreviewSource, 2026-10-24T10:35:58.0135241Z ╰──── 2026-10-24T10:35:58.0135391Z  help: Consider removing this import. 2026-10-24T10:35:58.0135505Z 2026-10-24T10:35:58.0135731Z ⚠ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used. 2026-10-24T10:35:58.0136078Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:163:8] 2026-10-24T10:35:58.0136305Z 162 │ mediaVideoThumbnailKey, 2026-10-24T10:35:58.0136476Z 163 │ type MediaVideoPreviewSource, 2026-10-24T10:35:58.0136675Z ·  ───────────┬─────────── 2026-10-24T10:35:58.0136945Z · ╰── 'MediaVideoPreviewSource' is imported here 2026-10-24T10:35:58.0137198Z 164 │ } from "../../lib/videoPreviewSource"; 2026-10-24T10:35:58.0137353Z ╰──── 2026-10-24T10:35:58.0137504Z  help: Consider removing this import. 2026-10-24T10:35:58.0137619Z 2026-10-24T10:35:58.0137830Z ⚠ eslint(no-unused-vars): Type 'ReviewDiffTheme' is imported but never used. 2026-10-24T10:35:58.0138165Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:171:15] 2026-10-24T10:35:58.0138495Z 170 │ import { parseReviewCommentMessageSegments } from "../review/reviewCommentSelection"; 2026-10-24T10:35:58.0138821Z 171 │ import type { ReviewDiffTheme } from "../review/shikiReviewHighlighter"; 2026-10-24T10:35:58.0139071Z ·  ───────┬─────── 2026-10-24T10:35:58.0139326Z · ╰── 'ReviewDiffTheme' is imported here 2026-10-24T10:35:58.0139538Z 172 │ import { 2026-10-24T10:35:58.0139661Z ╰──── 2026-10-24T10:35:58.0139817Z  help: Consider removing this import. 2026-10-24T10:35:58.0139928Z 2026-10-24T10:35:58.0140166Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used. 2026-10-24T10:35:58.0140605Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:186:3] 2026-10-24T10:35:58.0140843Z 185 │ import { 2026-10-24T10:35:58.0140992Z 186 │ resolveMarkdownFontSizes, 2026-10-24T10:35:58.0141201Z ·  ────────────┬─────────── 2026-10-24T10:35:58.0141464Z · ╰── 'resolveMarkdownFontSizes' is imported here 2026-10-24T10:35:58.0141711Z 187 │ resolveNativeMarkdownTypography, 2026-10-24T10:35:58.0141870Z ╰──── 2026-10-24T10:35:58.0142023Z  help: Consider removing this import. 2026-10-24T10:35:58.0142138Z 2026-10-24T10:35:58.0142364Z ⚠ eslint(no-unused-vars): Identifier 'markdownLinkIconSource' is imported but never used. 2026-10-24T10:35:58.0142722Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:191:10] 2026-10-24T10:35:58.0143012Z 190 │ import { PierreEntryIcon } from "../../components/PierreEntryIcon"; 2026-10-24T10:35:58.0143306Z 191 │ import { markdownLinkIconSource } from "../../lib/markdownLinkIcons"; 2026-10-24T10:35:58.0143555Z ·  ───────────┬────────── 2026-10-24T10:35:58.0143829Z · ╰── 'markdownLinkIconSource' is imported here 2026-10-24T10:35:58.0144049Z 192 │ import { 2026-10-24T10:35:58.0144174Z ╰──── 2026-10-24T10:35:58.0144326Z  help: Consider removing this import. 2026-10-24T10:35:58.0144441Z 2026-10-24T10:35:58.0144710Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used. 2026-10-24T10:35:58.0145096Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:194:3] 2026-10-24T10:35:58.0145755Z 193 │ normalizeNativeMarkdownUrl, 2026-10-24T10:35:58.0145960Z 194 │ resolveMarkdownInlineCodePresentation, 2026-10-24T10:35:58.0146194Z ·  ──────────────────┬────────────────── 2026-10-24T10:35:58.0146507Z · ╰── 'resolveMarkdownInlineCodePresentation' is imported here 2026-10-24T10:35:58.0146771Z 195 │ resolveMarkdownLinkIcon, 2026-10-24T10:35:58.0146925Z ╰──── 2026-10-24T10:35:58.0147076Z  help: Consider removing this import. 2026-10-24T10:35:58.0147193Z 2026-10-24T10:35:58.0147428Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownLinkIcon' is imported but never used. 2026-10-24T10:35:58.0147783Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:195:3] 2026-10-24T10:35:58.0148027Z 194 │ resolveMarkdownInlineCodePresentation, 2026-10-24T10:35:58.0148214Z 195 │ resolveMarkdownLinkIcon, 2026-10-24T10:35:58.0148482Z ·  ───────────┬─────────── 2026-10-24T10:35:58.0148787Z · ╰── 'resolveMarkdownLinkIcon' is imported here 2026-10-24T10:35:58.0149034Z 196 │ resolveMarkdownLinkPresentation, 2026-10-24T10:35:58.0149193Z ╰──── 2026-10-24T10:35:58.0149355Z  help: Consider removing this import. 2026-10-24T10:35:58.0149467Z 2026-10-24T10:35:58.0149704Z ⚠ eslint(no-unused-vars): Identifier 'useMarkdownCodeHighlight' is imported but never used. 2026-10-24T10:35:58.0150072Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:234:10] 2026-10-24T10:35:58.0150346Z 233 │ import { ThreadMcpApp } from "./McpAppWebView"; 2026-10-24T10:35:58.0150634Z 234 │ import { useMarkdownCodeHighlight } from "./markdownCodeHighlightState"; 2026-10-24T10:35:58.0150907Z ·  ────────────┬─────────── 2026-10-24T10:35:58.0151228Z · ╰── 'useMarkdownCodeHighlight' is imported here 2026-10-24T10:35:58.0151457Z 235 │ import { 2026-10-24T10:35:58.0151582Z ╰──── 2026-10-24T10:35:58.0151742Z  help: Consider removing this import. 2026-10-24T10:35:58.0151857Z 2026-10-24T10:35:58.0152069Z ⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used. 2026-10-24T10:35:58.0152413Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:238:3] 2026-10-24T10:35:58.0152627Z 237 │ useAssetUrl, 2026-10-24T10:35:58.0152778Z 238 │ useAssetUrlState, 2026-10-24T10:35:58.0152949Z ·  ────────┬─────── 2026-10-24T10:35:58.0153193Z · ╰── 'useAssetUrlState' is imported here 2026-10-24T10:35:58.0153415Z 239 │ useRefreshAssetUrl, 2026-10-24T10:35:58.0153566Z ╰──── 2026-10-24T10:35:58.0153717Z  help: Consider removing this import. 2026-10-24T10:35:58.0153831Z 2026-10-24T10:35:58.0154038Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:35:58.0154385Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2141:7] 2026-10-24T10:35:58.0171930Z 2140 │ setExpandedFile(null); 2026-10-24T10:35:58.0172241Z 2141 │ }, [props.environmentId, props.threadId, props.contentPresentation.kind]); 2026-10-24T10:35:58.0172661Z ·  ─────────┬───────── ───────┬────── ───────────────┬────────────── 2026-10-24T10:35:58.0173193Z · │ │ ╰── Unnecessary dependency `props.contentPresentation.kind` 2026-10-24T10:35:58.0173685Z · │ ╰── Unnecessary dependency `props.threadId` 2026-10-24T10:35:58.0174048Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-24T10:35:58.0174366Z 2142 │ const horizontalPadding = props.layoutVariant === "split" ? 20 : 16; 2026-10-24T10:35:58.0174592Z ╰──── 2026-10-24T10:35:58.0174967Z  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-24T10:35:58.0175587Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0175891Z 2026-10-24T10:35:58.0176203Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:35:58.0176624Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2609:7] 2026-10-24T10:35:58.0176916Z 2608 │ reportHeaderMaterialVisibility(false); 2026-10-24T10:35:58.0177151Z 2609 │ }, [feedThreadKey, reportHeaderMaterialVisibility]); 2026-10-24T10:35:58.0177364Z ·  ──────┬────── 2026-10-24T10:35:58.0177611Z · ╰── Unnecessary dependency `feedThreadKey` 2026-10-24T10:35:58.0177815Z 2610 │ 2026-10-24T10:35:58.0177924Z ╰──── 2026-10-24T10:35:58.0178273Z  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-24T10:35:58.0178874Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0179181Z 2026-10-24T10:35:58.0179385Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:35:58.0179721Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2625:7] 2026-10-24T10:35:58.0179925Z 2624 │ } 2026-10-24T10:35:58.0180123Z 2625 │ }, [listMountKey, props.contentInsetEndAdjustment, listRef]); 2026-10-24T10:35:58.0180345Z ·  ──────┬───── 2026-10-24T10:35:58.0180586Z · ╰── Unnecessary dependency `listMountKey` 2026-10-24T10:35:58.0180784Z 2626 │ 2026-10-24T10:35:58.0180892Z ╰──── 2026-10-24T10:35:58.0181284Z  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-24T10:35:58.0181886Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0182184Z 2026-10-24T10:35:58.0182385Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:35:58.0182718Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2782:7] 2026-10-24T10:35:58.0182918Z 2781 │ } 2026-10-24T10:35:58.0183177Z 2782 │ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]); 2026-10-24T10:35:58.0183573Z ·  ───────┬─────── ─────────┬──────── ────────┬─────── 2026-10-24T10:35:58.0184048Z · │ │ ╰── Unnecessary dependency `expandedWorkRows` 2026-10-24T10:35:58.0184579Z · │ ╰── Unnecessary dependency `expandedWorkGroups` 2026-10-24T10:35:58.0184945Z · ╰── Unnecessary dependency `expandedTurnIds` 2026-10-24T10:35:58.0185158Z 2783 │ 2026-10-24T10:35:58.0185365Z ╰──── 2026-10-24T10:35:58.0185717Z  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-24T10:35:58.0186309Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0186606Z 2026-10-24T10:35:58.0186893Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T10:35:58.0187277Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:613:9] 2026-10-24T10:35:58.0187488Z 612 │ }; 2026-10-24T10:35:58.0187685Z 613 │ }, [props.environmentId, attachment.id, httpBaseUrl]), 2026-10-24T10:35:58.0188029Z ·  ─────────┬───────── ──────┬────── ─────┬───── 2026-10-24T10:35:58.0188472Z · │ │ ╰── Unnecessary dependency `httpBaseUrl` 2026-10-24T10:35:58.0188900Z · │ ╰── Unnecessary dependency `attachment.id` 2026-10-24T10:35:58.0189274Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-24T10:35:58.0189507Z 614 │ ); 2026-10-24T10:35:58.0189631Z ╰──── 2026-10-24T10:35:58.0190012Z  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-24T10:35:58.0190632Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0190933Z 2026-10-24T10:35:58.0191278Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T10:35:58.0191648Z ╭─[apps/mobile/src/state/use-model-option-memory.ts:21:7] 2026-10-24T10:35:58.0191868Z 20 │ [instanceId]: { 2026-10-24T10:35:58.0192046Z 21 │ ...(state[instanceId] ?? {}), 2026-10-24T10:35:58.0192261Z ·  ──────────────────────────── 2026-10-24T10:35:58.0192451Z 22 │ [model]: options, 2026-10-24T10:35:58.0192591Z ╰──── 2026-10-24T10:35:58.0192920Z  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-24T10:35:58.0193185Z 2026-10-24T10:35:58.0193395Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:35:58.0193731Z ╭─[apps/mobile/src/components/ComposerEditor.tsx:82:6] 2026-10-24T10:35:58.0193933Z 81 │ }, 2026-10-24T10:35:58.0194068Z 82 │ [draftKey], 2026-10-24T10:35:58.0194227Z ·  ────┬─── 2026-10-24T10:35:58.0194537Z · ╰── Unnecessary dependency `draftKey` 2026-10-24T10:35:58.0194788Z 83 │ ); 2026-10-24T10:35:58.0194904Z ╰──── 2026-10-24T10:35:58.0195257Z  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-24T10:35:58.0195849Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0196146Z 2026-10-24T10:35:58.0196368Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T10:35:58.0196689Z ╭─[apps/mobile/src/Stack.tsx:1079:21] 2026-10-24T10:35:58.0196876Z 1078 │ } 2026-10-24T10:35:58.0197402Z ·  ───────────────────────────────────────────── 2026-10-24T10:35:58.0197635Z 1080 │ screenOptions={({ route }) => 2026-10-24T10:35:58.0197796Z ╰──── 2026-10-24T10:35:58.0198223Z  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-24T10:35:58.0198562Z 2026-10-24T10:35:58.0198832Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:35:58.0199257Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:123:7] 2026-10-24T10:35:58.0199491Z 118 │ 2026-10-24T10:35:58.0199619Z 119 │ useEffect(() => { 2026-10-24T10:35:58.0199779Z ·  ────┬──── 2026-10-24T10:35:58.0200015Z · ╰── This is the containing effect 2026-10-24T10:35:58.0200245Z 120 │ if (orientationSettled) return; 2026-10-24T10:35:58.0200468Z 121 │ const orientation = getNativeShowcaseOrientation(); 2026-10-24T10:35:58.0200674Z 122 │ if (orientation === null) { 2026-10-24T10:35:58.0200858Z 123 │ setOrientationSettled(true); 2026-10-24T10:35:58.0201057Z ·  ──────────┬────────── 2026-10-24T10:35:58.0201376Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.0201613Z 124 │ return; 2026-10-24T10:35:58.0201747Z ╰──── 2026-10-24T10:35:58.0202424Z  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-24T10:35:58.0203304Z  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-24T10:35:58.0203612Z 2026-10-24T10:35:58.0203873Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:35:58.0204298Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:304:7] 2026-10-24T10:35:58.0204529Z 292 │ 2026-10-24T10:35:58.0204659Z 293 │ useEffect(() => { 2026-10-24T10:35:58.0204817Z ·  ────┬──── 2026-10-24T10:35:58.0205041Z · ╰── This is the containing effect 2026-10-24T10:35:58.0205318Z 294 │ if ( 2026-10-24T10:35:58.0205495Z 295 │ scene === null || 2026-10-24T10:35:58.0205662Z 296 │ requestedScene === null || 2026-10-24T10:35:58.0205841Z 297 │ scene !== requestedScene || 2026-10-24T10:35:58.0206013Z 298 │ !hasFixture || 2026-10-24T10:35:58.0206173Z 299 │ !orientationSettled || 2026-10-24T10:35:58.0206340Z 300 │ !themeApplied || 2026-10-24T10:35:58.0206546Z 301 │ (scene === "agent-activity" && !agentActivityStaged) || 2026-10-24T10:35:58.0206822Z 302 │ !isShowcaseNativeContentReady({ scene, themeId, renderSignal }) 2026-10-24T10:35:58.0207029Z 303 │ ) { 2026-10-24T10:35:58.0207171Z 304 │ setReadyScene(null); 2026-10-24T10:35:58.0207343Z ·  ──────┬────── 2026-10-24T10:35:58.0207614Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.0207861Z 305 │ return; 2026-10-24T10:35:58.0207995Z ╰──── 2026-10-24T10:35:58.0208659Z  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-24T10:35:58.0209530Z  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-24T10:35:58.0209838Z 2026-10-24T10:35:58.0210119Z ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'. 2026-10-24T10:35:58.0210560Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:128:9] 2026-10-24T10:35:58.0210815Z 127 │ let cancelled = false; 2026-10-24T10:35:58.0211003Z 128 │ let lastOutcome: string | null = null; 2026-10-24T10:35:58.0211228Z ·  ─────┬───── 2026-10-24T10:35:58.0211462Z · ╰── 'lastOutcome' is declared here 2026-10-24T10:35:58.0211789Z 129 │ void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), { 2026-10-24T10:35:58.0212024Z ╰──── 2026-10-24T10:35:58.0212193Z  help: Consider removing this declaration. 2026-10-24T10:35:58.0212315Z 2026-10-24T10:35:58.0212500Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T10:35:58.0212880Z ╭─[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:116:34] 2026-10-24T10:35:58.0213151Z 115 │ return [...commands]; 2026-10-24T10:35:58.0213383Z 116 │ }, [activeThreadRef, pathname, registrationVersion, navigation]); 2026-10-24T10:35:58.0213649Z ·  ─────────┬───────── 2026-10-24T10:35:58.0213963Z · ╰── Unnecessary dependency `registrationVersion` 2026-10-24T10:35:58.0214197Z 117 │ 2026-10-24T10:35:58.0214314Z ╰──── 2026-10-24T10:35:58.0214687Z  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-24T10:35:58.0215303Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0215599Z 2026-10-24T10:35:58.0215900Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T10:35:58.0216300Z ╭─[apps/mobile/src/state/use-composer-drafts.ts:1022:15] 2026-10-24T10:35:58.0216519Z 1021 │ instanceId, 2026-10-24T10:35:58.0216760Z 1022 │ { ...(persisted.modelOptionMemory[instanceId] ?? {}), ...models }, 2026-10-24T10:35:58.0217064Z ·  ────────────────────────────────────────────────── 2026-10-24T10:35:58.0217271Z 1023 │ ]), 2026-10-24T10:35:58.0217405Z ╰──── 2026-10-24T10:35:58.0217735Z  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-24T10:35:58.0217998Z 2026-10-24T10:35:58.0218208Z ⚠ eslint(no-unused-vars): Identifier 'Fiber' is imported but never used. 2026-10-24T10:35:58.0218503Z ╭─[apps/server/src/ws.ts:10:13] 2026-10-24T10:35:58.0218710Z  9 │ import * as Effect from "effect/Effect"; 2026-10-24T10:35:58.0218903Z 10 │ import * as Fiber from "effect/Fiber"; 2026-10-24T10:35:58.0219094Z ·  ──┬── 2026-10-24T10:35:58.0219322Z · ╰── 'Fiber' is imported here 2026-10-24T10:35:58.0219571Z 11 │ import * as FileSystem from "effect/FileSystem"; 2026-10-24T10:35:58.0219745Z ╰──── 2026-10-24T10:35:58.0219904Z  help: Consider removing this import. 2026-10-24T10:35:58.0220017Z 2026-10-24T10:35:58.0220229Z ⚠ eslint(no-unused-vars): Identifier 'Schedule' is imported but never used. 2026-10-24T10:35:58.0220529Z ╭─[apps/server/src/ws.ts:17:13] 2026-10-24T10:35:58.0220728Z 16 │ import * as Ref from "effect/Ref"; 2026-10-24T10:35:58.0220929Z 17 │ import * as Schedule from "effect/Schedule"; 2026-10-24T10:35:58.0221152Z ·  ────┬─── 2026-10-24T10:35:58.0221392Z · ╰── 'Schedule' is imported here 2026-10-24T10:35:58.0221625Z 18 │ import * as Schema from "effect/Schema"; 2026-10-24T10:35:58.0221786Z ╰──── 2026-10-24T10:35:58.0221949Z  help: Consider removing this import. 2026-10-24T10:35:58.0222066Z 2026-10-24T10:35:58.0222370Z ⚠ eslint(no-unused-vars): Variable 'projectSetupScriptRunner' is declared but never used. Unused variables should start with a '_'. 2026-10-24T10:35:58.0222757Z ╭─[apps/server/src/ws.ts:1285:13] 2026-10-24T10:35:58.0223029Z 1284 │ const usageLimitSources = yield* UsageLimitSources.UsageLimitSources; 2026-10-24T10:35:58.0223408Z 1285 │ const projectSetupScriptRunner = yield* ProjectSetupScriptRunner.ProjectSetupScriptRunner; 2026-10-24T10:35:58.0223723Z ·  ────────────┬─────────── 2026-10-24T10:35:58.0224021Z · ╰── 'projectSetupScriptRunner' is declared here 2026-10-24T10:35:58.0224374Z 1286 │ const worktreeSetupTracker = yield* WorktreeSetupTracker.WorktreeSetupTracker; 2026-10-24T10:35:58.0224613Z ╰──── 2026-10-24T10:35:58.0224780Z  help: Consider removing this declaration. 2026-10-24T10:35:58.0224902Z 2026-10-24T10:35:58.0225167Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:35:58.0225646Z ╭─[apps/mobile/src/features/terminal/terminalLaunchContext.ts:117:5] 2026-10-24T10:35:58.0226084Z 112 │ const [entry, setEntry] = useState(() => ({ key: input.targetKey, location: candidate })); 2026-10-24T10:35:58.0226419Z 113 │ useEffect(() => { 2026-10-24T10:35:58.0226585Z ·  ────┬──── 2026-10-24T10:35:58.0226809Z · ╰── This is the containing effect 2026-10-24T10:35:58.0227121Z 114 │ if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) { 2026-10-24T10:35:58.0227355Z 115 │ return; 2026-10-24T10:35:58.0227495Z 116 │ } 2026-10-24T10:35:58.0227686Z 117 │ setEntry({ key: input.targetKey, location: candidate }); 2026-10-24T10:35:58.0227894Z ·  ────┬─── 2026-10-24T10:35:58.0228158Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.0228452Z 118 │ }, [candidate, entry.key, entry.location, input.targetKey]); 2026-10-24T10:35:58.0228654Z ╰──── 2026-10-24T10:35:58.0229323Z  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-24T10:35:58.0230190Z  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-24T10:35:58.0230498Z 2026-10-24T10:35:58.0230650Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:35:58.0230925Z ╭─[apps/mobile/src/native/StackHeader.tsx:185:9] 2026-10-24T10:35:58.0231148Z 184 │ "options", 2026-10-24T10:35:58.0231340Z 185 │ latestOptionFunctionsRef.current, 2026-10-24T10:35:58.0231573Z ·  ────────────────┬─────────────── 2026-10-24T10:35:58.0231897Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T10:35:58.0232188Z 186 │ optionFunctionWrappersRef.current, 2026-10-24T10:35:58.0232359Z ╰──── 2026-10-24T10:35:58.0232899Z  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-24T10:35:58.0233632Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:35:58.0233916Z 2026-10-24T10:35:58.0234119Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:35:58.0234426Z ╭─[apps/mobile/src/native/StackHeader.tsx:186:9] 2026-10-24T10:35:58.0234647Z 185 │ latestOptionFunctionsRef.current, 2026-10-24T10:35:58.0234858Z 186 │ optionFunctionWrappersRef.current, 2026-10-24T10:35:58.0235081Z ·  ────────────────┬──────────────── 2026-10-24T10:35:58.0235392Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T10:35:58.0235671Z 187 │ ) as NativeStackNavigationOptions) 2026-10-24T10:35:58.0235832Z ╰──── 2026-10-24T10:35:58.0236360Z  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-24T10:35:58.0237083Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:35:58.0237362Z 2026-10-24T10:35:58.0237558Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T10:35:58.0237911Z ╭─[apps/mobile/src/features/terminal/TerminalContextSheet.tsx:72:15] 2026-10-24T10:35:58.0238141Z 71 │ { 2026-10-24T10:35:58.0272379Z 167 │ const record = 2026-10-24T10:35:58.0272545Z 168 │ token.type === "context" 2026-10-24T10:35:58.0272813Z 169 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-24T10:35:58.0273129Z 170 │ : undefined; 2026-10-24T10:35:58.0273473Z 171 │ const presentation = contextChipPresentation( 2026-10-24T10:35:58.0273705Z 172 │ token.type === "context" ? token.kind : token.type, 2026-10-24T10:35:58.0273896Z 173 │ record, 2026-10-24T10:35:58.0274032Z 174 │ ); 2026-10-24T10:35:58.0274183Z 175 │ const icon = contextChipIcon( 2026-10-24T10:35:58.0274351Z 176 │ presentation, 2026-10-24T10:35:58.0274580Z 177 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-24T10:35:58.0274793Z 178 │ ); 2026-10-24T10:35:58.0274922Z 179 │ return { 2026-10-24T10:35:58.0275068Z 180 │ type: token.type, 2026-10-24T10:35:58.0275228Z 181 │ source: token.source, 2026-10-24T10:35:58.0275397Z 182 │ start: token.start, 2026-10-24T10:35:58.0275561Z 183 │ end: token.end, 2026-10-24T10:35:58.0275799Z 184 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-24T10:35:58.0276018Z 185 │ label: 2026-10-24T10:35:58.0276171Z 186 │ token.type === "skill" 2026-10-24T10:35:58.0276376Z 187 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-24T10:35:58.0276579Z 188 │ : token.type === "context" 2026-10-24T10:35:58.0276916Z 189 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-24T10:35:58.0277225Z 190 │ : basename(token.value), 2026-10-24T10:35:58.0277473Z 191 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-24T10:35:58.0277716Z 192 │ iconUri: contextChipIconUri(icon), 2026-10-24T10:35:58.0277921Z 193 │ tintsIcon: icon.kind === "chip", 2026-10-24T10:35:58.0278085Z 194 │ }; 2026-10-24T10:35:58.0278212Z 195 │ }), 2026-10-24T10:35:58.0278335Z 196 │ ); 2026-10-24T10:35:58.0278533Z 197 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-24T10:35:58.0278837Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-24T10:35:58.0279190Z · ╰── This dependency list is missing values used by the callback 2026-10-24T10:35:58.0279523Z 198 │ // Every render resolves against the snapshot history, so a render whose 2026-10-24T10:35:58.0279722Z ╰──── 2026-10-24T10:35:58.0279990Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T10:35:58.0280518Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0280822Z 2026-10-24T10:35:58.0281013Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T10:35:58.0281374Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:259:5] 2026-10-24T10:35:58.0281659Z 251 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-24T10:35:58.0281907Z 252 │ nativeEventSnapshotsRef.current.push({ 2026-10-24T10:35:58.0282124Z ·  ───────────┬─────────── 2026-10-24T10:35:58.0282769Z · ╰── 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-24T10:35:58.0283318Z 253 │ eventCount: acknowledgedEventCount, 2026-10-24T10:35:58.0283492Z 254 │ value, 2026-10-24T10:35:58.0283649Z 255 │ selection: nextSelection, 2026-10-24T10:35:58.0283804Z 256 │ }); 2026-10-24T10:35:58.0283956Z 257 │ return acknowledgedEventCount; 2026-10-24T10:35:58.0284115Z 258 │ }, 2026-10-24T10:35:58.0284233Z 259 │ [], 2026-10-24T10:35:58.0284369Z ·  ─┬ 2026-10-24T10:35:58.0284636Z · ╰── This dependency list is missing values used by the callback 2026-10-24T10:35:58.0284876Z 260 │ ); 2026-10-24T10:35:58.0284987Z ╰──── 2026-10-24T10:35:58.0285250Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T10:35:58.0285781Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0286092Z 2026-10-24T10:35:58.0286354Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:35:58.0286771Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:643:5] 2026-10-24T10:35:58.0287000Z 638 │ 2026-10-24T10:35:58.0287124Z 639 │ useEffect(() => { 2026-10-24T10:35:58.0287280Z ·  ────┬──── 2026-10-24T10:35:58.0287497Z · ╰── This is the containing effect 2026-10-24T10:35:58.0287742Z 640 │ if (pendingLaunchEntry.key === launchTargetKey) { 2026-10-24T10:35:58.0287925Z 641 │ return; 2026-10-24T10:35:58.0288049Z 642 │ } 2026-10-24T10:35:58.0288195Z 643 │ setPendingLaunchEntry({ 2026-10-24T10:35:58.0288377Z ·  ──────────┬────────── 2026-10-24T10:35:58.0288650Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.0288887Z 644 │ key: launchTargetKey, 2026-10-24T10:35:58.0289027Z ╰──── 2026-10-24T10:35:58.0289685Z  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-24T10:35:58.0290543Z  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-24T10:35:58.0290844Z 2026-10-24T10:35:58.0291138Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:35:58.0291557Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5] 2026-10-24T10:35:58.0291782Z 648 │ 2026-10-24T10:35:58.0291908Z 649 │ useEffect(() => { 2026-10-24T10:35:58.0292063Z ·  ────┬──── 2026-10-24T10:35:58.0292278Z · ╰── This is the containing effect 2026-10-24T10:35:58.0292526Z 650 │ if (initialAttachGridEntry.key === launchTargetKey) { 2026-10-24T10:35:58.0292715Z 651 │ return; 2026-10-24T10:35:58.0292843Z 652 │ } 2026-10-24T10:35:58.0292988Z 653 │ setInitialAttachGridEntry({ 2026-10-24T10:35:58.0293181Z ·  ────────────┬──────────── 2026-10-24T10:35:58.0293521Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.0293814Z 654 │ key: launchTargetKey, 2026-10-24T10:35:58.0293955Z ╰──── 2026-10-24T10:35:58.0294610Z  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-24T10:35:58.0295485Z  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-24T10:35:58.0295793Z 2026-10-24T10:35:58.0296059Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:35:58.0296475Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7] 2026-10-24T10:35:58.0296700Z 743 │ 2026-10-24T10:35:58.0296822Z 744 │ useEffect(() => { 2026-10-24T10:35:58.0296973Z ·  ────┬──── 2026-10-24T10:35:58.0297185Z · ╰── This is the containing effect 2026-10-24T10:35:58.0297422Z 745 │ if (!routeEnvironmentId || !routeThreadId) { 2026-10-24T10:35:58.0297606Z 746 │ setLastGridSize({ 2026-10-24T10:35:58.0297775Z ·  ───────┬─────── 2026-10-24T10:35:58.0298042Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.0298292Z 747 │ cols: DEFAULT_TERMINAL_COLS, 2026-10-24T10:35:58.0298442Z ╰──── 2026-10-24T10:35:58.0299106Z  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-24T10:35:58.0299966Z  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-24T10:35:58.0300267Z 2026-10-24T10:35:58.0300472Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:35:58.0300842Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24] 2026-10-24T10:35:58.0301107Z 537 │ }); 2026-10-24T10:35:58.0301300Z 538 │ }, [terminal.buffer, terminal.buffer.length, terminalKey]); 2026-10-24T10:35:58.0301549Z ·  ───────────┬────────── 2026-10-24T10:35:58.0301917Z · ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead 2026-10-24T10:35:58.0302311Z 539 │ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null; 2026-10-24T10:35:58.0302533Z ╰──── 2026-10-24T10:35:58.0302884Z  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-24T10:35:58.0303475Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0303770Z 2026-10-24T10:35:58.0304033Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:35:58.0304428Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7] 2026-10-24T10:35:58.0304701Z 708 │ sentInitialInputKeyRef.current = null; 2026-10-24T10:35:58.0304878Z 709 │ }, [terminalKey]); 2026-10-24T10:35:58.0305040Z ·  ─────┬───── 2026-10-24T10:35:58.0305444Z · ╰── Unnecessary dependency `terminalKey` 2026-10-24T10:35:58.0305647Z 710 │ 2026-10-24T10:35:58.0305760Z ╰──── 2026-10-24T10:35:58.0306107Z  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-24T10:35:58.0306704Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0307007Z 2026-10-24T10:35:58.0307210Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:35:58.0307579Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52] 2026-10-24T10:35:58.0307814Z 799 │ }; 2026-10-24T10:35:58.0308062Z 800 │ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]); 2026-10-24T10:35:58.0308432Z ·  ────────────┬──────────── ─────┬───── 2026-10-24T10:35:58.0308829Z · │ ╰── Unnecessary dependency `terminalKey` 2026-10-24T10:35:58.0309261Z · ╰── Unnecessary dependency `terminal.lifecycleVersion` 2026-10-24T10:35:58.0309514Z 801 │ 2026-10-24T10:35:58.0309629Z ╰──── 2026-10-24T10:35:58.0309976Z  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-24T10:35:58.0310577Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0310876Z 2026-10-24T10:35:58.0311025Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:35:58.0311382Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24] 2026-10-24T10:35:58.0311609Z 792 │ } 2026-10-24T10:35:58.0311785Z 793 │ const pasteSession = pasteSessionRef.current; 2026-10-24T10:35:58.0312028Z ·  ───────────┬─────────── 2026-10-24T10:35:58.0312314Z · ╰── Cannot access ref value during render 2026-10-24T10:35:58.0312532Z 794 │ 2026-10-24T10:35:58.0312643Z ╰──── 2026-10-24T10:35:58.0313173Z  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-24T10:35:58.0313891Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:35:58.0314171Z 2026-10-24T10:35:58.0314635Z ⚠ 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-24T10:35:58.0315153Z ╭─[packages/shared/src/otelEnvironment.ts:146:14] 2026-10-24T10:35:58.0315349Z 145 │ name, 2026-10-24T10:35:58.0315565Z 146 │ (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()), 2026-10-24T10:35:58.0315834Z ·  ────────────────────────── 2026-10-24T10:35:58.0316076Z 147 │ `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`, 2026-10-24T10:35:58.0316267Z ╰──── 2026-10-24T10:35:58.0316326Z 2026-10-24T10:35:58.0316536Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T10:35:58.0316885Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:231:6] 2026-10-24T10:35:58.0317210Z 227 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-24T10:35:58.0317491Z 228 │ nativeEventSnapshotsRef.current, 2026-10-24T10:35:58.0317697Z ·  ───────────┬─────────── 2026-10-24T10:35:58.0318283Z · ╰── 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-24T10:35:58.0318781Z 229 │ mostRecentEventCount, 2026-10-24T10:35:58.0318938Z 230 │ ); 2026-10-24T10:35:58.0319131Z 231 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-24T10:35:58.0319411Z ·  ──────────────────────────┬────────────────────────── 2026-10-24T10:35:58.0319760Z · ╰── This dependency list is missing values used by the callback 2026-10-24T10:35:58.0320046Z 232 │ const assumedValue = props.value; 2026-10-24T10:35:58.0320203Z ╰──── 2026-10-24T10:35:58.0320434Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T10:35:58.0320923Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0321254Z 2026-10-24T10:35:58.0321478Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T10:35:58.0321831Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:239:7] 2026-10-24T10:35:58.0322130Z 238 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-24T10:35:58.0322446Z 239 │ nativeEventSnapshotsRef.current, 2026-10-24T10:35:58.0322688Z ·  ───────────┬─────────── 2026-10-24T10:35:58.0323257Z · ╰── 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-24T10:35:58.0323748Z 240 │ controlledEventCount, 2026-10-24T10:35:58.0323908Z 241 │ assumedValue, 2026-10-24T10:35:58.0324049Z 242 │ ); 2026-10-24T10:35:58.0324282Z 243 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-24T10:35:58.0324592Z ·  ───────────┬────────── 2026-10-24T10:35:58.0324952Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-24T10:35:58.0325244Z 244 │ const acceptNativeEvent = useCallback( 2026-10-24T10:35:58.0325409Z ╰──── 2026-10-24T10:35:58.0325887Z  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-24T10:35:58.0326588Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0326885Z 2026-10-24T10:35:58.0327033Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:35:58.0327330Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29] 2026-10-24T10:35:58.0327615Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T10:35:58.0327878Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T10:35:58.0328129Z ·  ─────────────┬──────────── 2026-10-24T10:35:58.0328430Z · ╰── Cannot access ref value during render 2026-10-24T10:35:58.0328650Z 165 │ }); 2026-10-24T10:35:58.0328775Z ╰──── 2026-10-24T10:35:58.0329305Z  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-24T10:35:58.0330026Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:35:58.0330311Z 2026-10-24T10:35:58.0330460Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:35:58.0330756Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29] 2026-10-24T10:35:58.0331029Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T10:35:58.0331320Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T10:35:58.0331568Z ·  ─────────────┬──────────── 2026-10-24T10:35:58.0331906Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T10:35:58.0332162Z 165 │ }); 2026-10-24T10:35:58.0332289Z ╰──── 2026-10-24T10:35:58.0332890Z  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-24T10:35:58.0333651Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:35:58.0333932Z 2026-10-24T10:35:58.0334077Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:35:58.0334371Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:166:23] 2026-10-24T10:35:58.0334575Z 165 │ }); 2026-10-24T10:35:58.0334740Z 166 │ confirmedTokensRef.current = tokens; 2026-10-24T10:35:58.0334975Z ·  ─────────┬────────────┬─── 2026-10-24T10:35:58.0335300Z · │ ╰── Cannot update ref value during render 2026-10-24T10:35:58.0335602Z · ╰── This value is a ref 2026-10-24T10:35:58.0335805Z 167 │ return JSON.stringify( 2026-10-24T10:35:58.0335950Z ╰──── 2026-10-24T10:35:58.0336477Z  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-24T10:35:58.0337190Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:35:58.0337474Z 2026-10-24T10:35:58.0337623Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:35:58.0337917Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:208:5] 2026-10-24T10:35:58.0338145Z 207 │ mostRecentEventCount, 2026-10-24T10:35:58.0338326Z 208 │ nativeEventSnapshotsRef.current, 2026-10-24T10:35:58.0338544Z ·  ───────────────┬─────────────── 2026-10-24T10:35:58.0338849Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T10:35:58.0339094Z 209 │ ); 2026-10-24T10:35:58.0339211Z ╰──── 2026-10-24T10:35:58.0339740Z  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-24T10:35:58.0340467Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:35:58.0340754Z 2026-10-24T10:35:58.0340902Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:35:58.0341231Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:214:5] 2026-10-24T10:35:58.0341456Z 213 │ mostRecentEventCount, 2026-10-24T10:35:58.0341637Z 214 │ nativeEventSnapshotsRef.current, 2026-10-24T10:35:58.0341852Z ·  ───────────────┬─────────────── 2026-10-24T10:35:58.0342162Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T10:35:58.0342402Z 215 │ ); 2026-10-24T10:35:58.0342523Z ╰──── 2026-10-24T10:35:58.0343122Z  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-24T10:35:58.0343891Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:35:58.0344177Z 2026-10-24T10:35:58.0344367Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T10:35:58.0344697Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:199:6] 2026-10-24T10:35:58.0344969Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T10:35:58.0345299Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T10:35:58.0345540Z ·  ─────────┬──────── 2026-10-24T10:35:58.0346143Z · ╰── 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-24T10:35:58.0346620Z 165 │ }); 2026-10-24T10:35:58.0346785Z 166 │ confirmedTokensRef.current = tokens; 2026-10-24T10:35:58.0346965Z 167 │ return JSON.stringify( 2026-10-24T10:35:58.0347227Z 168 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-24T10:35:58.0347471Z 169 │ const record = 2026-10-24T10:35:58.0347643Z 170 │ token.type === "context" 2026-10-24T10:35:58.0347913Z 171 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-24T10:35:58.0348156Z 172 │ : undefined; 2026-10-24T10:35:58.0348355Z 173 │ const presentation = contextChipPresentation( 2026-10-24T10:35:58.0348603Z 174 │ token.type === "context" ? token.kind : token.type, 2026-10-24T10:35:58.0348800Z 175 │ record, 2026-10-24T10:35:58.0348941Z 176 │ ); 2026-10-24T10:35:58.0349103Z 177 │ const icon = contextChipIcon( 2026-10-24T10:35:58.0349277Z 178 │ presentation, 2026-10-24T10:35:58.0349515Z 179 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-24T10:35:58.0349730Z 180 │ ); 2026-10-24T10:35:58.0349867Z 181 │ return { 2026-10-24T10:35:58.0350018Z 182 │ type: token.type, 2026-10-24T10:35:58.0350191Z 183 │ source: token.source, 2026-10-24T10:35:58.0350361Z 184 │ start: token.start, 2026-10-24T10:35:58.0350522Z 185 │ end: token.end, 2026-10-24T10:35:58.0350767Z 186 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-24T10:35:58.0350998Z 187 │ label: 2026-10-24T10:35:58.0351202Z 188 │ token.type === "skill" 2026-10-24T10:35:58.0351417Z 189 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-24T10:35:58.0351635Z 190 │ : token.type === "context" 2026-10-24T10:35:58.0351979Z 191 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-24T10:35:58.0352299Z 192 │ : basename(token.value), 2026-10-24T10:35:58.0357985Z 193 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-24T10:35:58.0358256Z 194 │ iconUri: contextChipIconUri(icon), 2026-10-24T10:35:58.0358452Z 195 │ tintsIcon: icon.kind === "chip", 2026-10-24T10:35:58.0358615Z 196 │ }; 2026-10-24T10:35:58.0358739Z 197 │ }), 2026-10-24T10:35:58.0358961Z 198 │ ); 2026-10-24T10:35:58.0359206Z 199 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-24T10:35:58.0359513Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-24T10:35:58.0359872Z · ╰── This dependency list is missing values used by the callback 2026-10-24T10:35:58.0360206Z 200 │ // Every render resolves against the snapshot history, so a render whose 2026-10-24T10:35:58.0360407Z ╰──── 2026-10-24T10:35:58.0360670Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T10:35:58.0361232Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0361530Z 2026-10-24T10:35:58.0361730Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T10:35:58.0362065Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:261:5] 2026-10-24T10:35:58.0362344Z 253 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-24T10:35:58.0362588Z 254 │ nativeEventSnapshotsRef.current.push({ 2026-10-24T10:35:58.0362798Z ·  ───────────┬─────────── 2026-10-24T10:35:58.0363389Z · ╰── 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-24T10:35:58.0363908Z 255 │ eventCount: acknowledgedEventCount, 2026-10-24T10:35:58.0364082Z 256 │ value, 2026-10-24T10:35:58.0364246Z 257 │ selection: nextSelection, 2026-10-24T10:35:58.0364412Z 258 │ }); 2026-10-24T10:35:58.0364566Z 259 │ return acknowledgedEventCount; 2026-10-24T10:35:58.0364721Z 260 │ }, 2026-10-24T10:35:58.0364841Z 261 │ [], 2026-10-24T10:35:58.0364975Z ·  ─┬ 2026-10-24T10:35:58.0365243Z · ╰── This dependency list is missing values used by the callback 2026-10-24T10:35:58.0365478Z 262 │ ); 2026-10-24T10:35:58.0365593Z ╰──── 2026-10-24T10:35:58.0365852Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T10:35:58.0366372Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0366667Z 2026-10-24T10:35:58.0367209Z ⚠ 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-24T10:35:58.0367806Z ╭─[apps/server/src/usage/UsageService.test.ts:2615:7] 2026-10-24T10:35:58.0368048Z 2614 │ let orphanedAt: number | undefined; 2026-10-24T10:35:58.0368406Z 2615 │ ╭─▶ for (let interruptAt = 1; interruptAt <= 31; interruptAt += 1) { 2026-10-24T10:35:58.0368751Z 2616 │ │ const tasks: Array<() => void> = []; 2026-10-24T10:35:58.0369052Z 2617 │ │ const dispatcher: Scheduler.SchedulerDispatcher = { 2026-10-24T10:35:58.0369357Z 2618 │ │ scheduleTask: (task) => tasks.push(task), 2026-10-24T10:35:58.0369609Z 2619 │ │ flush: () => { 2026-10-24T10:35:58.0369849Z 2620 │ │ let task: (() => void) | undefined; 2026-10-24T10:35:58.0370139Z 2621 │ │ while ((task = tasks.shift()) !== undefined) task(); 2026-10-24T10:35:58.0370378Z 2622 │ │ }, 2026-10-24T10:35:58.0370558Z 2623 │ │ }; 2026-10-24T10:35:58.0370724Z 2624 │ │ 2026-10-24T10:35:58.0370978Z 2625 │ │ let requestFiber: Fiber.Fiber | undefined; 2026-10-24T10:35:58.0371285Z 2626 │ │ let requestChecks = 0; 2026-10-24T10:35:58.0371537Z 2627 │ │ const scheduler: Scheduler.Scheduler = { 2026-10-24T10:35:58.0371798Z 2628 │ │ executionMode: "async", 2026-10-24T10:35:58.0372048Z 2629 │ │ makeDispatcher: () => dispatcher, 2026-10-24T10:35:58.0372292Z 2630 │ │ shouldYield: (fiber) => { 2026-10-24T10:35:58.0372552Z 2631 │ │ if (fiber !== requestFiber) return false; 2026-10-24T10:35:58.0372804Z 2632 │ │ requestChecks += 1; 2026-10-24T10:35:58.0373067Z 2633 │ │ if (requestChecks !== interruptAt) return false; 2026-10-24T10:35:58.0373333Z 2634 │ │ fiber.interruptUnsafe(); 2026-10-24T10:35:58.0373555Z 2635 │ │ return true; 2026-10-24T10:35:58.0373750Z 2636 │ │ }, 2026-10-24T10:35:58.0373926Z 2637 │ │ }; 2026-10-24T10:35:58.0374101Z 2638 │ │ 2026-10-24T10:35:58.0374312Z 2639 │ │ const input: UsageSummaryInput = { 2026-10-24T10:35:58.0374542Z 2640 │ │ ...WINDOW, 2026-10-24T10:35:58.0374778Z 2641 │ │ sinceDay: UsageDay.make("2026-09-01"), 2026-10-24T10:35:58.0375118Z 2642 │ │ untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`), 2026-10-24T10:35:58.0375388Z 2643 │ │ }; 2026-10-24T10:35:58.0375597Z 2644 │ │ const first = yield* service 2026-10-24T10:35:58.0375829Z 2645 │ │ .readSummary(input) 2026-10-24T10:35:58.0376034Z 2646 │ │ .pipe( 2026-10-24T10:35:58.0376238Z 2647 │ │ Effect.exit, 2026-10-24T10:35:58.0376591Z 2648 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-24T10:35:58.0376895Z 2649 │ │ Effect.forkChild, 2026-10-24T10:35:58.0377093Z 2650 │ │ ); 2026-10-24T10:35:58.0377294Z 2651 │ │ requestFiber = first; 2026-10-24T10:35:58.0377517Z 2652 │ │ yield* Effect.yieldNow; 2026-10-24T10:35:58.0377743Z 2653 │ │ dispatcher.flush(); 2026-10-24T10:35:58.0377928Z 2654 │ │ 2026-10-24T10:35:58.0378167Z 2655 │ │ const second = yield* service.readSummary(input).pipe( 2026-10-24T10:35:58.0378422Z 2656 │ │ Effect.match({ 2026-10-24T10:35:58.0378661Z 2657 │ │ onFailure: (error) => error.reason, 2026-10-24T10:35:58.0378929Z 2658 │ │ onSuccess: () => "success" as const, 2026-10-24T10:35:58.0379151Z 2659 │ │ }), 2026-10-24T10:35:58.0379408Z 2660 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-24T10:35:58.0379669Z 2661 │ │ Effect.forkChild, 2026-10-24T10:35:58.0379863Z 2662 │ │ ); 2026-10-24T10:35:58.0380063Z 2663 │ │ yield* Effect.yieldNow; 2026-10-24T10:35:58.0380284Z 2664 │ │ dispatcher.flush(); 2026-10-24T10:35:58.0380528Z 2665 │ │ const secondExit = second.pollUnsafe(); 2026-10-24T10:35:58.0380787Z 2666 │ │ if (secondExit === undefined) { 2026-10-24T10:35:58.0381041Z 2667 │ │ second.interruptUnsafe(); 2026-10-24T10:35:58.0381319Z 2668 │ │ orphanedAt = interruptAt; 2026-10-24T10:35:58.0381532Z 2669 │ │ break; 2026-10-24T10:35:58.0381716Z 2670 │ │ } 2026-10-24T10:35:58.0381932Z 2671 │ │ if (Exit.isFailure(secondExit)) { 2026-10-24T10:35:58.0382227Z 2672 │ │ assert.fail("the matching request fiber was interrupted"); 2026-10-24T10:35:58.0382463Z 2673 │ │ } 2026-10-24T10:35:58.0382709Z 2674 │ │ assert.strictEqual(secondExit.value, "invalidWindow"); 2026-10-24T10:35:58.0383004Z 2675 │ ╰─▶ } 2026-10-24T10:35:58.0383194Z 2676 │ 2026-10-24T10:35:58.0383311Z ╰──── 2026-10-24T10:35:58.0383378Z 2026-10-24T10:35:58.0383572Z ⚠ react(static-components): Cannot create components during render 2026-10-24T10:35:58.0383930Z ╭─[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10] 2026-10-24T10:35:58.0384189Z 196 │ const { onInput, onResize } = props; 2026-10-24T10:35:58.0384440Z 197 │ const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView(); 2026-10-24T10:35:58.0384734Z ·  ────────────────┬─────────────── 2026-10-24T10:35:58.0385060Z · ╰── The component is created during render here 2026-10-24T10:35:58.0385534Z 198 │ const hasNativeSurface = Boolean(NativeTerminalSurfaceView); 2026-10-24T10:35:58.0385728Z 199 │ 2026-10-24T10:35:58.0385851Z 200 │ useEffect(() => { 2026-10-24T10:35:58.0386100Z 201 │ terminalDebugLog("native:surface", { 2026-10-24T10:35:58.0386334Z 202 │ terminalKey: props.terminalKey, 2026-10-24T10:35:58.0386512Z 203 │ native: hasNativeSurface, 2026-10-24T10:35:58.0386746Z 204 │ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(), 2026-10-24T10:35:58.0386974Z 205 │ bufferLen: props.buffer.length, 2026-10-24T10:35:58.0387154Z 206 │ isRunning: props.isRunning, 2026-10-24T10:35:58.0387305Z 207 │ }); 2026-10-24T10:35:58.0387534Z 208 │ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]); 2026-10-24T10:35:58.0387790Z 209 │ const handleNativeInput = useCallback( 2026-10-24T10:35:58.0388012Z 210 │ (event: NativeSyntheticEvent) => { 2026-10-24T10:35:58.0388239Z 211 │ if (!props.isRunning || props.readOnly) { 2026-10-24T10:35:58.0388415Z 212 │ return; 2026-10-24T10:35:58.0388553Z 213 │ } 2026-10-24T10:35:58.0388710Z 214 │ terminalDebugLog("native:onInput", { 2026-10-24T10:35:58.0388968Z 215 │ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)), 2026-10-24T10:35:58.0389181Z 216 │ }); 2026-10-24T10:35:58.0389338Z 217 │ onInput(event.nativeEvent.data); 2026-10-24T10:35:58.0389494Z 218 │ }, 2026-10-24T10:35:58.0389655Z 219 │ [onInput, props.isRunning, props.readOnly], 2026-10-24T10:35:58.0389826Z 220 │ ); 2026-10-24T10:35:58.0389976Z 221 │ const handleNativeResize = useCallback( 2026-10-24T10:35:58.0390195Z 222 │ (event: NativeSyntheticEvent) => { 2026-10-24T10:35:58.0390387Z 223 │ onResize({ 2026-10-24T10:35:58.0390545Z 224 │ cols: event.nativeEvent.cols, 2026-10-24T10:35:58.0390727Z 225 │ rows: event.nativeEvent.rows, 2026-10-24T10:35:58.0390890Z 226 │ }); 2026-10-24T10:35:58.0391014Z 227 │ }, 2026-10-24T10:35:58.0391169Z 228 │ [onResize], 2026-10-24T10:35:58.0391294Z 229 │ ); 2026-10-24T10:35:58.0391408Z 230 │ 2026-10-24T10:35:58.0391550Z 231 │ if (NativeTerminalSurfaceView) { 2026-10-24T10:35:58.0391711Z 232 │ return ( 2026-10-24T10:35:58.0391863Z 233 │ 2026-10-24T10:35:58.0392039Z 234 │ ( 2026-10-24T10:35:58.0397333Z 223 │ 2026-10-24T10:35:58.0397547Z ·  ─────────────── 2026-10-24T10:35:58.0397753Z 224 │ {lineIndex > 0 ? "\n" : ""} 2026-10-24T10:35:58.0397908Z ╰──── 2026-10-24T10:35:58.0398108Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T10:35:58.0398262Z 2026-10-24T10:35:58.0398464Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T10:35:58.0398804Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25] 2026-10-24T10:35:58.0399035Z 226 │ (null); 2026-10-24T10:35:58.0407764Z 495 │ const showcasedReviewDrawRef = useRef(null); 2026-10-24T10:35:58.0408041Z 496 │ const [isPullRefreshing, setIsPullRefreshing] = useState(false); 2026-10-24T10:35:58.0408283Z 497 │ const handlePullToRefresh = async () => { 2026-10-24T10:35:58.0408469Z 498 │ setIsPullRefreshing(true); 2026-10-24T10:35:58.0408648Z 499 │ await refreshSelectedSection(); 2026-10-24T10:35:58.0408827Z 500 │ setIsPullRefreshing(false); 2026-10-24T10:35:58.0408975Z 501 │ }; 2026-10-24T10:35:58.0409181Z 502 │ const reviewFileNavigatorRef = useRef(null); 2026-10-24T10:35:58.0409482Z 503 │ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : []; 2026-10-24T10:35:58.0409745Z 504 │ const fileVisibility = useReviewFileVisibility({ 2026-10-24T10:35:58.0409950Z 505 │ threadKey: reviewCache.threadKey, 2026-10-24T10:35:58.0410144Z 506 │ sectionId: selectedSection?.id ?? null, 2026-10-24T10:35:58.0410317Z 507 │ files: reviewFiles, 2026-10-24T10:35:58.0410510Z 508 │ cachedExpandedFileIds: selectedSection?.id 2026-10-24T10:35:58.0410761Z 509 │ ? reviewCache.expandedFileIdsBySection[selectedSection.id] 2026-10-24T10:35:58.0410967Z 510 │ : undefined, 2026-10-24T10:35:58.0411175Z 511 │ cachedViewedFileIds: selectedSection?.id 2026-10-24T10:35:58.0411407Z 512 │ ? reviewCache.viewedFileIdsBySection[selectedSection.id] 2026-10-24T10:35:58.0411603Z 513 │ : undefined, 2026-10-24T10:35:58.0411733Z 514 │ }); 2026-10-24T10:35:58.0411988Z 515 │ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility; 2026-10-24T10:35:58.0412312Z 516 │ const commentSelection = useReviewCommentSelectionController({ 2026-10-24T10:35:58.0412516Z 517 │ environmentId, 2026-10-24T10:35:58.0412653Z 518 │ threadId, 2026-10-24T10:35:58.0412790Z 519 │ selectedSection, 2026-10-24T10:35:58.0413026Z 520 │ nativeReviewDiffData, 2026-10-24T10:35:58.0413199Z 521 │ }); 2026-10-24T10:35:58.0413368Z 522 │ const nativeBridge = useNativeReviewDiffBridge({ 2026-10-24T10:35:58.0413570Z 523 │ threadKey: reviewCache.threadKey, 2026-10-24T10:35:58.0413758Z 524 │ sectionId: selectedSection?.id ?? null, 2026-10-24T10:35:58.0413937Z 525 │ diff: selectedSection?.diff, 2026-10-24T10:35:58.0414109Z 526 │ data: nativeReviewDiffData, 2026-10-24T10:35:58.0414270Z 527 │ collapsedFileIds, 2026-10-24T10:35:58.0414334Z 528 │ viewedFileIds, 2026-10-24T10:35:58.0414445Z 529 │ selectedRowIds: commentSelection.selectedRowIds, 2026-10-24T10:35:58.0414542Z 530 │ canHighlight: parsedDiff.kind === "files", 2026-10-24T10:35:58.0414596Z 531 │ }); 2026-10-24T10:35:58.0414670Z 532 │ const showcaseReviewKey = 2026-10-24T10:35:58.0414808Z 533 │ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection 2026-10-24T10:35:58.0415023Z 534 │ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}` 2026-10-24T10:35:58.0415084Z 535 │ : null; 2026-10-24T10:35:58.0415252Z 536 │ const handleNativeDebug = (event: NativeSyntheticEvent>) => { 2026-10-24T10:35:58.0415332Z 537 │ nativeBridge.onDebug(event); 2026-10-24T10:35:58.0415389Z 538 │ if ( 2026-10-24T10:35:58.0415469Z 539 │ showcaseReviewKey === null || 2026-10-24T10:35:58.0415591Z 540 │ showcasedReviewDrawRef.current === showcaseReviewKey || 2026-10-24T10:35:58.0415700Z 541 │ !isNativeReviewDiffDrawEvent(event.nativeEvent) 2026-10-24T10:35:58.0415755Z 542 │ ) { 2026-10-24T10:35:58.0415815Z 543 │ return; 2026-10-24T10:35:58.0415870Z 544 │ } 2026-10-24T10:35:58.0415987Z 545 │ showcasedReviewDrawRef.current = showcaseReviewKey; 2026-10-24T10:35:58.0416153Z 546 │ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId }); 2026-10-24T10:35:58.0416207Z 547 │ }; 2026-10-24T10:35:58.0416259Z 548 │ 2026-10-24T10:35:58.0416376Z 549 │ const handleSelectFile = async (fileId: string | null) => { 2026-10-24T10:35:58.0416456Z 550 │ loadVisibleFile(fileId, true); 2026-10-24T10:35:58.0416546Z 551 │ commentSelection.clearSelection(); 2026-10-24T10:35:58.0416667Z 552 │ if (fileId !== null && collapsedFileIds.includes(fileId)) { 2026-10-24T10:35:58.0416746Z 553 │ toggleExpandedFile(fileId); 2026-10-24T10:35:58.0416799Z 554 │ } 2026-10-24T10:35:58.0416911Z 555 │ const nativeView = nativeReviewDiffViewRef.current; 2026-10-24T10:35:58.0416982Z 556 │ if (!nativeView) return; 2026-10-24T10:35:58.0417076Z 557 │ const result = await settlePromise(() => 2026-10-24T10:35:58.0417256Z 558 │ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true), 2026-10-24T10:35:58.0417315Z 559 │ ); 2026-10-24T10:35:58.0417403Z 560 │ if (AsyncResult.isFailure(result)) { 2026-10-24T10:35:58.0417584Z 561 │ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result)); 2026-10-24T10:35:58.0417638Z 562 │ } 2026-10-24T10:35:58.0417691Z 563 │ }; 2026-10-24T10:35:58.0417775Z 564 │ const handleVisibleFileChange = ( 2026-10-24T10:35:58.0417907Z 565 │ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>, 2026-10-24T10:35:58.0417965Z 566 │ ) => { 2026-10-24T10:35:58.0418074Z 567 │ loadVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-24T10:35:58.0418243Z 568 │ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-24T10:35:58.0418295Z 569 │ }; 2026-10-24T10:35:58.0418430Z 570 │ const renderInspector = () => ( 2026-10-24T10:35:58.0418533Z 571 │ void handleSelectFile(fileId)} 2026-10-24T10:35:58.0419353Z 577 │ /> 2026-10-24T10:35:58.0419406Z 578 │ ); 2026-10-24T10:35:58.0419458Z 579 │ 2026-10-24T10:35:58.0419642Z 580 │ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => { 2026-10-24T10:35:58.0419731Z 581 │ const { fileId } = event.nativeEvent; 2026-10-24T10:35:58.0419794Z 582 │ if (fileId) { 2026-10-24T10:35:58.0419883Z 583 │ loadVisibleFile(fileId, true); 2026-10-24T10:35:58.0419963Z 584 │ toggleExpandedFile(fileId); 2026-10-24T10:35:58.0420016Z 585 │ } 2026-10-24T10:35:58.0420069Z 586 │ }; 2026-10-24T10:35:58.0420121Z 587 │ 2026-10-24T10:35:58.0420209Z 588 │ const handleNativeToggleViewedFile = ( 2026-10-24T10:35:58.0420327Z 589 │ event: NativeSyntheticEvent<{ readonly fileId?: string }>, 2026-10-24T10:35:58.0420382Z 590 │ ) => { 2026-10-24T10:35:58.0420468Z 591 │ const { fileId } = event.nativeEvent; 2026-10-24T10:35:58.0420529Z 592 │ if (fileId) { 2026-10-24T10:35:58.0420605Z 593 │ toggleViewedFile(fileId); 2026-10-24T10:35:58.0420659Z 594 │ } 2026-10-24T10:35:58.0420711Z 595 │ }; 2026-10-24T10:35:58.0420762Z 596 │ 2026-10-24T10:35:58.0420834Z 597 │ const parsedDiffNotice = 2026-10-24T10:35:58.0421003Z 598 │ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null; 2026-10-24T10:35:58.0421163Z 599 │ const hasCachedSelectedDiff = selectedSection?.diff != null; 2026-10-24T10:35:58.0421320Z 600 │ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null); 2026-10-24T10:35:58.0421441Z 601 │ const sectionMenu = buildReviewSectionMenu(reviewSections); 2026-10-24T10:35:58.0421601Z 602 │ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({ 2026-10-24T10:35:58.0421710Z 603 │ hasEnvironmentPresentation: environment.isReady, 2026-10-24T10:35:58.0421813Z 604 │ isEnvironmentConnected: isEnvironmentReady, 2026-10-24T10:35:58.0421884Z 605 │ hasCachedSelectedDiff, 2026-10-24T10:35:58.0421950Z 606 │ hasAnyCachedDiff, 2026-10-24T10:35:58.0422002Z 607 │ }); 2026-10-24T10:35:58.0422093Z 608 │ const handleRetryEnvironment = () => { 2026-10-24T10:35:58.0422185Z 609 │ void retryEnvironment(environmentId); 2026-10-24T10:35:58.0422241Z 610 │ }; 2026-10-24T10:35:58.0422325Z 611 │ const handleReturnToThread = () => { 2026-10-24T10:35:58.0422405Z 612 │ if (navigation.canGoBack()) { 2026-10-24T10:35:58.0422474Z 613 │ navigation.goBack(); 2026-10-24T10:35:58.0422533Z 614 │ return; 2026-10-24T10:35:58.0422585Z 615 │ } 2026-10-24T10:35:58.0422668Z 616 │ navigation.navigate("Thread", { 2026-10-24T10:35:58.0422756Z 617 │ environmentId: String(environmentId), 2026-10-24T10:35:58.0422833Z 618 │ threadId: String(threadId), 2026-10-24T10:35:58.0422887Z 619 │ }); 2026-10-24T10:35:58.0422939Z 620 │ }; 2026-10-24T10:35:58.0423018Z 621 │ const androidHeaderSubtitle = [ 2026-10-24T10:35:58.0423089Z 622 │ selectedSection?.title, 2026-10-24T10:35:58.0423230Z 623 │ headerDiffSummary.additions, 2026-10-24T10:35:58.0423343Z 624 │ headerDiffSummary.deletions, 2026-10-24T10:35:58.0423396Z 625 │ ] 2026-10-24T10:35:58.0423500Z 626 │ .filter((part): part is string => Boolean(part)) 2026-10-24T10:35:58.0423563Z 627 │ .join(" · "); 2026-10-24T10:35:58.0423614Z 628 │ 2026-10-24T10:35:58.0423692Z 629 │ const showChangedFilesPane = 2026-10-24T10:35:58.0423764Z 630 │ !showConnectionNotice && 2026-10-24T10:35:58.0423838Z 631 │ selectedSection !== null && 2026-10-24T10:35:58.0423918Z 632 │ parsedDiff.kind === "files" && 2026-10-24T10:35:58.0423997Z 633 │ NativeReviewDiffView !== null; 2026-10-24T10:35:58.0424168Z 634 │ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined); 2026-10-24T10:35:58.0424343Z 635 │ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane; 2026-10-24T10:35:58.0424403Z 636 │ 2026-10-24T10:35:58.0424479Z 637 │ const listHeader = (() => { 2026-10-24T10:35:58.0424564Z 638 │ const children: ReactElement[] = []; 2026-10-24T10:35:58.0424616Z 639 │ 2026-10-24T10:35:58.0424678Z 640 │ if (error) { 2026-10-24T10:35:58.0424745Z 641 │ children.push( 2026-10-24T10:35:58.0424803Z 642 │ 2026-10-24T10:35:58.0425550Z 649 │ Review unavailable 2026-10-24T10:35:58.0425717Z 650 │ {error} 2026-10-24T10:35:58.0425782Z 651 │ , 2026-10-24T10:35:58.0425839Z 652 │ ); 2026-10-24T10:35:58.0425891Z 653 │ } 2026-10-24T10:35:58.0425942Z 654 │ 2026-10-24T10:35:58.0426013Z 655 │ if (parsedDiffNotice) { 2026-10-24T10:35:58.0426175Z 656 │ children.push(); 2026-10-24T10:35:58.0426228Z 657 │ } 2026-10-24T10:35:58.0426279Z 658 │ 2026-10-24T10:35:58.0426354Z 659 │ if (children.length === 0) { 2026-10-24T10:35:58.0426418Z 660 │ return null; 2026-10-24T10:35:58.0426470Z 661 │ } 2026-10-24T10:35:58.0426522Z 662 │ 2026-10-24T10:35:58.0426592Z 663 │ return <>{children}; 2026-10-24T10:35:58.0426646Z 664 │ })(); 2026-10-24T10:35:58.0426722Z 665 │ const headerSubtitle = [ 2026-10-24T10:35:58.0426803Z 666 │ headerDiffSummary.additions, 2026-10-24T10:35:58.0426881Z 667 │ headerDiffSummary.deletions, 2026-10-24T10:35:58.0426961Z 668 │ pendingReviewCommentCount > 0 2026-10-24T10:35:58.0427136Z 669 │ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}` 2026-10-24T10:35:58.0427199Z 670 │ : null, 2026-10-24T10:35:58.0427252Z 671 │ ] 2026-10-24T10:35:58.0427315Z 672 │ .filter(Boolean) 2026-10-24T10:35:58.0427379Z 673 │ .join(" · "); 2026-10-24T10:35:58.0427512Z 674 │ const headerTitleText = selectedSection?.title ?? "Review changes"; 2026-10-24T10:35:58.0427563Z 675 │ 2026-10-24T10:35:58.0427619Z 676 │ return ( 2026-10-24T10:35:58.0427675Z 677 │ <> 2026-10-24T10:35:58.0427740Z 678 │ 2026-10-24T10:35:58.0429198Z 694 │ 2026-10-24T10:35:58.0429262Z 695 │ 2026-10-24T10:35:58.0429384Z 696 │ 2026-10-24T10:35:58.0429465Z 697 │ {showConnectionNotice ? ( 2026-10-24T10:35:58.0429607Z 698 │ 2026-10-24T10:35:58.0429697Z 699 │ 2026-10-24T10:35:58.0430708Z 711 │ 2026-10-24T10:35:58.0430867Z 712 │ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? ( 2026-10-24T10:35:58.0430928Z 713 │ 2026-10-24T10:35:58.0431402Z 719 │ 2026-10-24T10:35:58.0431756Z 723 │ {listHeader} 2026-10-24T10:35:58.0431877Z 724 │ 2026-10-24T10:35:58.0431961Z 725 │ { 2026-10-24T10:35:58.0433693Z ·  ────┬──── 2026-10-24T10:35:58.0433829Z · ╰── This is the containing effect 2026-10-24T10:35:58.0433900Z 57 │ scheduler.reset(); 2026-10-24T10:35:58.0433997Z 58 │ highlightedRowIdsRef.current = new Set(); 2026-10-24T10:35:58.0434084Z 59 │ visibleChunkIndexRef.current = 0; 2026-10-24T10:35:58.0434201Z 60 │ setVisibleRange({ firstRowIndex: 0, lastRowIndex: 80 }); 2026-10-24T10:35:58.0434280Z ·  ───────┬─────── 2026-10-24T10:35:58.0434451Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.0434567Z 61 │ setTokensPatchJson(createEmptyTokenPatch(resetKey)); 2026-10-24T10:35:58.0434619Z ╰──── 2026-10-24T10:35:58.0435231Z  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-24T10:35:58.0435565Z  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-24T10:35:58.0435569Z 2026-10-24T10:35:58.0435775Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:35:58.0435950Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:63:7] 2026-10-24T10:35:58.0436031Z 62 │ return () => scheduler.cancel(); 2026-10-24T10:35:58.0436134Z 63 │ }, [enabled, resetKey, rows.length, scheduler]); 2026-10-24T10:35:58.0436262Z ·  ───┬─── ─────┬───── 2026-10-24T10:35:58.0436467Z · │ ╰── Unnecessary dependency `rows.length` 2026-10-24T10:35:58.0436609Z · ╰── Unnecessary dependency `enabled` 2026-10-24T10:35:58.0436661Z 64 │ 2026-10-24T10:35:58.0436711Z ╰──── 2026-10-24T10:35:58.0437007Z  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-24T10:35:58.0437323Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0437326Z 2026-10-24T10:35:58.0437496Z ⚠ eslint(no-empty-pattern): Empty array binding pattern 2026-10-24T10:35:58.0437710Z ╭─[apps/server/src/pullRequest/PullRequestService.test.ts:1526:12] 2026-10-24T10:35:58.0437794Z 1525 │ 2026-10-24T10:35:58.0437859Z 1526 │ for (const [] of [ 2026-10-24T10:35:58.0437932Z ·  ── 2026-10-24T10:35:58.0438002Z 1527 │ ["github", "github.com"], 2026-10-24T10:35:58.0438054Z ╰──── 2026-10-24T10:35:58.0438335Z  help: Passing non-iterable values (null, undefined, numbers, booleans, etc.) will result in a runtime error because these values are not iterable. 2026-10-24T10:35:58.0438337Z 2026-10-24T10:35:58.0438526Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T10:35:58.0438635Z ╭─[packages/shared/src/qrCode.ts:458:44] 2026-10-24T10:35:58.0438698Z 457 │ ): Array { 2026-10-24T10:35:58.0438805Z 458 │ let result: Array = divisor.map((_) => 0); 2026-10-24T10:35:58.0438915Z ·  ┬ 2026-10-24T10:35:58.0439068Z · ╰── '_' is declared here 2026-10-24T10:35:58.0439137Z 459 │ for (const b of data) { 2026-10-24T10:35:58.0439190Z ╰──── 2026-10-24T10:35:58.0439293Z  help: Consider removing this parameter. 2026-10-24T10:35:58.0439296Z 2026-10-24T10:35:58.0439556Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:35:58.0439723Z ╭─[apps/mobile/src/features/review/ReviewCommentComposerSheet.tsx:103:7] 2026-10-24T10:35:58.0439776Z 100 │ 2026-10-24T10:35:58.0439840Z 101 │ useEffect(() => { 2026-10-24T10:35:58.0439912Z ·  ────┬──── 2026-10-24T10:35:58.0440049Z · ╰── This is the containing effect 2026-10-24T10:35:58.0440154Z 102 │ if (!target || selectedLines.length === 0) { 2026-10-24T10:35:58.0440238Z 103 │ setHighlightedLinesById({}); 2026-10-24T10:35:58.0440334Z ·  ───────────┬─────────── 2026-10-24T10:35:58.0440508Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.0440569Z 104 │ return; 2026-10-24T10:35:58.0440620Z ╰──── 2026-10-24T10:35:58.0441248Z  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-24T10:35:58.0441581Z  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-24T10:35:58.0441588Z 2026-10-24T10:35:58.0441850Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:35:58.0442040Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:107:5] 2026-10-24T10:35:58.0442093Z 104 │ 2026-10-24T10:35:58.0442156Z 105 │ useEffect(() => { 2026-10-24T10:35:58.0442227Z ·  ────┬──── 2026-10-24T10:35:58.0442357Z · ╰── This is the containing effect 2026-10-24T10:35:58.0442436Z 106 │ clearReviewCommentTarget(); 2026-10-24T10:35:58.0442533Z 107 │ setPendingNativeCommentSelection(null); 2026-10-24T10:35:58.0442694Z ·  ────────────────┬─────────────── 2026-10-24T10:35:58.0442904Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.0442977Z 108 │ }, [selectedSection?.id]); 2026-10-24T10:35:58.0443029Z ╰──── 2026-10-24T10:35:58.0443624Z  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-24T10:35:58.0443956Z  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-24T10:35:58.0443959Z 2026-10-24T10:35:58.0444221Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:35:58.0444412Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7] 2026-10-24T10:35:58.0444464Z 109 │ 2026-10-24T10:35:58.0444527Z 110 │ useEffect(() => { 2026-10-24T10:35:58.0444599Z ·  ────┬──── 2026-10-24T10:35:58.0444727Z · ╰── This is the containing effect 2026-10-24T10:35:58.0444815Z 111 │ if (activeCommentTarget === null) { 2026-10-24T10:35:58.0444913Z 112 │ setPendingNativeCommentSelection(null); 2026-10-24T10:35:58.0445021Z ·  ────────────────┬─────────────── 2026-10-24T10:35:58.0445201Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.0445256Z 113 │ } 2026-10-24T10:35:58.0445313Z ╰──── 2026-10-24T10:35:58.0445925Z  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-24T10:35:58.0446251Z  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-24T10:35:58.0446253Z 2026-10-24T10:35:58.0446456Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:35:58.0446643Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7] 2026-10-24T10:35:58.0446791Z 107 │ setPendingNativeCommentSelection(null); 2026-10-24T10:35:58.0446900Z 108 │ }, [selectedSection?.id]); 2026-10-24T10:35:58.0446988Z ·  ─────────┬───────── 2026-10-24T10:35:58.0447154Z · ╰── Unnecessary dependency `selectedSection?.id` 2026-10-24T10:35:58.0447206Z 109 │ 2026-10-24T10:35:58.0447256Z ╰──── 2026-10-24T10:35:58.0447549Z  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-24T10:35:58.0447864Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0447867Z 2026-10-24T10:35:58.0448056Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T10:35:58.0448176Z ╭─[apps/mobile/src/lib/useHoverGesture.ts:8:15] 2026-10-24T10:35:58.0448236Z 7 │ () => 2026-10-24T10:35:58.0448300Z 8 │ Gesture.Hover() 2026-10-24T10:35:58.0448376Z ·  ──┬── 2026-10-24T10:35:58.0448512Z · ╰── `Hover` may be a component 2026-10-24T10:35:58.0448587Z 9 │ .manualActivation(true) 2026-10-24T10:35:58.0448638Z ╰──── 2026-10-24T10:35:58.0448922Z  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-24T10:35:58.0449386Z  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-24T10:35:58.0449391Z 2026-10-24T10:35:58.0449650Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:35:58.0449840Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:119:10] 2026-10-24T10:35:58.0449893Z 117 │ 2026-10-24T10:35:58.0449955Z 118 │ useEffect(() => { 2026-10-24T10:35:58.0450027Z ·  ────┬──── 2026-10-24T10:35:58.0450156Z · ╰── This is the containing effect 2026-10-24T10:35:58.0450236Z 119 │ void refreshNotifications(); 2026-10-24T10:35:58.0450325Z ·  ──────────┬───────── 2026-10-24T10:35:58.0450500Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.0450651Z 120 │ const subscription = AppState.addEventListener("change", (state) => { 2026-10-24T10:35:58.0450706Z ╰──── 2026-10-24T10:35:58.0451352Z  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-24T10:35:58.0451681Z  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-24T10:35:58.0451684Z 2026-10-24T10:35:58.0451940Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:35:58.0452184Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7] 2026-10-24T10:35:58.0452266Z 125 │ 2026-10-24T10:35:58.0452327Z 126 │ useEffect(() => { 2026-10-24T10:35:58.0452399Z ·  ────┬──── 2026-10-24T10:35:58.0452528Z · ╰── This is the containing effect 2026-10-24T10:35:58.0452594Z 127 │ if (!isLoaded) { 2026-10-24T10:35:58.0452683Z 128 │ setLiveActivityStatus("checking"); 2026-10-24T10:35:58.0452772Z ·  ──────────┬────────── 2026-10-24T10:35:58.0452944Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.0453005Z 129 │ return; 2026-10-24T10:35:58.0453055Z ╰──── 2026-10-24T10:35:58.0453667Z  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-24T10:35:58.0454001Z  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-24T10:35:58.0454004Z 2026-10-24T10:35:58.0454243Z ⚠ eslint(no-unneeded-ternary): Unnecessary use of boolean literals in conditional expression 2026-10-24T10:35:58.0454371Z ╭─[packages/shared/src/serverSettings.test.ts:35:7] 2026-10-24T10:35:58.0454557Z 34 │ const fallback = fallbackTextGenerationModelSelection(providerInstances, (instanceId) => 2026-10-24T10:35:58.0454654Z 35 │ instanceId === configured ? true : false, 2026-10-24T10:35:58.0454775Z ·  ──────────────────────────────────────── 2026-10-24T10:35:58.0454833Z 36 │ ); 2026-10-24T10:35:58.0454883Z ╰──── 2026-10-24T10:35:58.0454978Z  help: Remove this ternary operator 2026-10-24T10:35:58.0454981Z 2026-10-24T10:35:58.0455468Z ⚠ 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-24T10:35:58.0455594Z ╭─[packages/shared/src/atomicWrite.test.ts:139:5] 2026-10-24T10:35:58.0455669Z 138 │ Effect.gen(function* () { 2026-10-24T10:35:58.0455868Z 139 │ ╭─▶ while (fiber.pollUnsafe() === undefined) { 2026-10-24T10:35:58.0456000Z 140 │ │ yield* TestClock.adjust("100 millis"); 2026-10-24T10:35:58.0456330Z 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-24T10:35:58.0456517Z 142 │ │ yield* Effect.promise(() => new Promise((resolve) => setImmediate(resolve))); 2026-10-24T10:35:58.0456646Z 143 │ ╰─▶ } 2026-10-24T10:35:58.0456732Z 144 │ return yield* Fiber.join(fiber); 2026-10-24T10:35:58.0456784Z ╰──── 2026-10-24T10:35:58.0456787Z 2026-10-24T10:35:58.0457261Z ⚠ 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-24T10:35:58.0457494Z ╭─[apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts:223:5] 2026-10-24T10:35:58.0457601Z 222 │ let idlePasses = 0; 2026-10-24T10:35:58.0457746Z 223 │ ╭─▶ for (;;) { 2026-10-24T10:35:58.0457884Z 224 │ │ yield* Effect.promise(() => Promise.resolve()); 2026-10-24T10:35:58.0458028Z 225 │ │ const pending = backgroundRuntime.pending.shift(); 2026-10-24T10:35:58.0458125Z 226 │ │ if (!pending) { 2026-10-24T10:35:58.0458221Z 227 │ │ idlePasses++; 2026-10-24T10:35:58.0458328Z 228 │ │ if (idlePasses >= 3) { 2026-10-24T10:35:58.0458414Z 229 │ │ return; 2026-10-24T10:35:58.0458493Z 230 │ │ } 2026-10-24T10:35:58.0458585Z 231 │ │ continue; 2026-10-24T10:35:58.0458664Z 232 │ │ } 2026-10-24T10:35:58.0458757Z 233 │ │ idlePasses = 0; 2026-10-24T10:35:58.0458873Z 234 │ │ const exit = yield* Effect.exit( 2026-10-24T10:35:58.0459095Z 235 │ │ pending.operation as Effect.Effect, 2026-10-24T10:35:58.0459172Z 236 │ │ ); 2026-10-24T10:35:58.0459276Z 237 │ │ yield* Effect.sync(() => { 2026-10-24T10:35:58.0459382Z 238 │ │ pending.resolve(exit); 2026-10-24T10:35:58.0459460Z 239 │ │ }); 2026-10-24T10:35:58.0459589Z 240 │ ╰─▶ } 2026-10-24T10:35:58.0459652Z 241 │ }, 2026-10-24T10:35:58.0459707Z ╰──── 2026-10-24T10:35:58.0459710Z 2026-10-24T10:35:58.0459915Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:35:58.0460063Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7] 2026-10-24T10:35:58.0460157Z 256 │ return () => cancelAnimationFrame(frame); 2026-10-24T10:35:58.0460238Z 257 │ }, [props.path, targetIndex]); 2026-10-24T10:35:58.0460316Z ·  ─────┬──── 2026-10-24T10:35:58.0460465Z · ╰── Unnecessary dependency `props.path` 2026-10-24T10:35:58.0460516Z 258 │ 2026-10-24T10:35:58.0460568Z ╰──── 2026-10-24T10:35:58.0460872Z  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-24T10:35:58.0461226Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0461232Z 2026-10-24T10:35:58.0461427Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T10:35:58.0461574Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23] 2026-10-24T10:35:58.0461647Z 292 │ 2026-10-24T10:35:58.0462817Z ·  ─────────── 2026-10-24T10:35:58.0462883Z 310 │ {body} 2026-10-24T10:35:58.0462934Z ╰──── 2026-10-24T10:35:58.0463085Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T10:35:58.0463088Z 2026-10-24T10:35:58.0463349Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:35:58.0463492Z ╭─[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5] 2026-10-24T10:35:58.0463553Z 150 │ 2026-10-24T10:35:58.0463619Z 151 │ useEffect(() => { 2026-10-24T10:35:58.0463693Z ·  ────┬──── 2026-10-24T10:35:58.0463822Z · ╰── This is the containing effect 2026-10-24T10:35:58.0463907Z 152 │ if (!controlledSelectedPath) { 2026-10-24T10:35:58.0463969Z 153 │ return; 2026-10-24T10:35:58.0464027Z 154 │ } 2026-10-24T10:35:58.0464107Z 155 │ setExpandedPaths((current) => { 2026-10-24T10:35:58.0464188Z ·  ────────┬─────── 2026-10-24T10:35:58.0464362Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.0464490Z 156 │ const ancestors = ancestorPaths(controlledSelectedPath); 2026-10-24T10:35:58.0464546Z ╰──── 2026-10-24T10:35:58.0465165Z  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-24T10:35:58.0465569Z  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-24T10:35:58.0465572Z 2026-10-24T10:35:58.0465788Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T10:35:58.0465931Z ╭─[packages/shared/src/composerContextLegacySend.ts:19:45] 2026-10-24T10:35:58.0466061Z 18 │ const occurrences = collectComposerContextReferences(text); 2026-10-24T10:35:58.0466173Z 19 │ for (const occurrence of [...occurrences].reverse()) { 2026-10-24T10:35:58.0466286Z ·  ─────── 2026-10-24T10:35:58.0466400Z 20 │ const record = recordsById.get(occurrence.contextId); 2026-10-24T10:35:58.0466450Z ╰──── 2026-10-24T10:35:58.0466713Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T10:35:58.0466716Z 2026-10-24T10:35:58.0466924Z ⚠ eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used. 2026-10-24T10:35:58.0467029Z ╭─[infra/relay/src/http/Api.ts:69:13] 2026-10-24T10:35:58.0467169Z 68 │ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts"; 2026-10-24T10:35:58.0467361Z 69 │ import * as HookForwarder from "../hooks/HookForwarder.ts"; 2026-10-24T10:35:58.0467488Z ·  ──────┬────── 2026-10-24T10:35:58.0467637Z · ╰── 'HookForwarder' is imported here 2026-10-24T10:35:58.0467740Z 70 │ import * as HeldHooks from "../hooks/HeldHooks.ts"; 2026-10-24T10:35:58.0467792Z ╰──── 2026-10-24T10:35:58.0467893Z  help: Consider removing this import. 2026-10-24T10:35:58.0467895Z 2026-10-24T10:35:58.0468135Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-24T10:35:58.0468274Z ╭─[apps/web/src/components/chat/useComposerSend.ts:985:13] 2026-10-24T10:35:58.0468397Z 984 │ const changedBeforeDecline = draftChangedSinceSend(); 2026-10-24T10:35:58.0468652Z 985 │ ╭─▶ const pendingIdsBeforeDecline = pendingApprovalsRef.current.map( 2026-10-24T10:35:58.0468781Z 986 │ │ (approval) => approval.requestId, 2026-10-24T10:35:58.0468918Z 987 │ ╰─▶ ); 2026-10-24T10:35:58.0469058Z 988 │ const approvalResponding = approvalsToDecline.some((approval) => 2026-10-24T10:35:58.0469111Z ╰──── 2026-10-24T10:35:58.0469189Z  help: Switch to `Set` 2026-10-24T10:35:58.0469192Z 2026-10-24T10:35:58.0469401Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:35:58.0469564Z ╭─[apps/mobile/src/features/workspace/WorkspaceToolbar.ios.tsx:114:33] 2026-10-24T10:35:58.0469661Z 113 │ return () => cancelAnimationFrame(frame); 2026-10-24T10:35:58.0469767Z 114 │ }, [restoreSearch, tabActive, bottomSearch]); 2026-10-24T10:35:58.0469879Z ·  ──────┬───── 2026-10-24T10:35:58.0470048Z · ╰── Unnecessary dependency `bottomSearch` 2026-10-24T10:35:58.0470154Z 115 │ const composeButton = nativeToolbarCompose ? ( 2026-10-24T10:35:58.0470207Z ╰──── 2026-10-24T10:35:58.0470501Z  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-24T10:35:58.0470819Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0470823Z 2026-10-24T10:35:58.0470993Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T10:35:58.0471228Z ╭─[apps/server/src/provider/Drivers/CodexDriver.test.ts:466:14] 2026-10-24T10:35:58.0471312Z 465 │ 2026-10-24T10:35:58.0471418Z 466 │ for (const {} of ["direct", "wrapper"] as const) { 2026-10-24T10:35:58.0471489Z ·  ── 2026-10-24T10:35:58.0471545Z 467 │ } 2026-10-24T10:35:58.0471597Z ╰──── 2026-10-24T10:35:58.0471835Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T10:35:58.0471837Z 2026-10-24T10:35:58.0472021Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T10:35:58.0472185Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:100:85] 2026-10-24T10:35:58.0472290Z  99 │ const startEditor = startScheduledTaskEditor; 2026-10-24T10:35:58.0472481Z 100 │ const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]); 2026-10-24T10:35:58.0472632Z ·  ─────┬───── 2026-10-24T10:35:58.0472843Z · ╰── Unnecessary dependency `startEditor` 2026-10-24T10:35:58.0472924Z 101 │ const readEditor = useCallback( 2026-10-24T10:35:58.0472978Z ╰──── 2026-10-24T10:35:58.0473292Z  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-24T10:35:58.0473615Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0473619Z 2026-10-24T10:35:58.0473803Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T10:35:58.0473968Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:121:7] 2026-10-24T10:35:58.0474033Z 120 │ setEditor, 2026-10-24T10:35:58.0474098Z 121 │ startEditor, 2026-10-24T10:35:58.0474179Z ·  ─────┬───── 2026-10-24T10:35:58.0474326Z · ╰── Unnecessary dependency `startEditor` 2026-10-24T10:35:58.0474390Z 122 │ hasChanges, 2026-10-24T10:35:58.0474440Z ╰──── 2026-10-24T10:35:58.0474754Z  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-24T10:35:58.0475073Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0475079Z 2026-10-24T10:35:58.0475247Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T10:35:58.0475366Z ╭─[apps/server/src/processRunner.test.ts:266:14] 2026-10-24T10:35:58.0475419Z 265 │ 2026-10-24T10:35:58.0475525Z 266 │ for (const {} of ["timeout", "success"] as const) { 2026-10-24T10:35:58.0475603Z ·  ── 2026-10-24T10:35:58.0475656Z 267 │ } 2026-10-24T10:35:58.0475709Z ╰──── 2026-10-24T10:35:58.0475945Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T10:35:58.0475947Z 2026-10-24T10:35:58.0476224Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T10:35:58.0476401Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:773:7] 2026-10-24T10:35:58.0476505Z 772 │ if (settingsSheetPresentation.isActive) { 2026-10-24T10:35:58.0476636Z 773 │ settingsRoutePresentation.present(settingsRouteSession); 2026-10-24T10:35:58.0476731Z ·  ────────────┬──────────── 2026-10-24T10:35:58.0476907Z · ╰── Missing dependency `settingsRoutePresentation` 2026-10-24T10:35:58.0476962Z 774 │ } 2026-10-24T10:35:58.0477170Z 775 │ }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]); 2026-10-24T10:35:58.0477277Z ·  ────────────────┬──────────────── 2026-10-24T10:35:58.0477573Z · ╰── Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead 2026-10-24T10:35:58.0477629Z 776 │ 2026-10-24T10:35:58.0477681Z ╰──── 2026-10-24T10:35:58.0478112Z  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-24T10:35:58.0478431Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0478433Z 2026-10-24T10:35:58.0478590Z ⚠ react(immutability): This value cannot be modified 2026-10-24T10:35:58.0478735Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:391:5] 2026-10-24T10:35:58.0478902Z 387 │ typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0; 2026-10-24T10:35:58.0479041Z 388 │ const animatedBorderRadius = useSharedValue(targetBorderRadius); 2026-10-24T10:35:58.0479134Z ·  ──────────┬───────── 2026-10-24T10:35:58.0479289Z · ╰── `animatedBorderRadius` originates here 2026-10-24T10:35:58.0479450Z 389 │ const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android"; 2026-10-24T10:35:58.0479520Z 390 │ useLayoutEffect(() => { 2026-10-24T10:35:58.0479621Z 391 │ animatedBorderRadius.value = shouldAnimate 2026-10-24T10:35:58.0479709Z ·  ──────────┬───────── 2026-10-24T10:35:58.0479868Z · ╰── `animatedBorderRadius` cannot be modified 2026-10-24T10:35:58.0479959Z 392 │ ? withTiming(targetBorderRadius, { 2026-10-24T10:35:58.0480019Z ╰──── 2026-10-24T10:35:58.0480292Z  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-24T10:35:58.0480605Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:35:58.0480608Z 2026-10-24T10:35:58.0480853Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T10:35:58.0481009Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:290:50] 2026-10-24T10:35:58.0481068Z 289 │ return ( 2026-10-24T10:35:58.0481233Z 290 │ 2026-10-24T10:35:58.0481407Z ·  ───────────── 2026-10-24T10:35:58.0481509Z 291 │ {props.children} 2026-10-24T10:35:58.0481560Z ╰──── 2026-10-24T10:35:58.0481788Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T10:35:58.0481928Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T10:35:58.0481930Z 2026-10-24T10:35:58.0482172Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T10:35:58.0482328Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:654:44] 2026-10-24T10:35:58.0482386Z 653 │ return ( 2026-10-24T10:35:58.0482507Z 654 │ 2026-10-24T10:35:58.0482627Z ·  ───────────── 2026-10-24T10:35:58.0482699Z 655 │ {props.children} 2026-10-24T10:35:58.0482749Z ╰──── 2026-10-24T10:35:58.0482968Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T10:35:58.0483104Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T10:35:58.0483107Z 2026-10-24T10:35:58.0483344Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T10:35:58.0483504Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1462:55] 2026-10-24T10:35:58.0483564Z 1461 │ return ( 2026-10-24T10:35:58.0483730Z 1462 │ 2026-10-24T10:35:58.0483869Z ·  ──────────────────── 2026-10-24T10:35:58.0483969Z 1463 │ 2026-10-24T10:35:58.0485028Z 220 │ {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")} 2026-10-24T10:35:58.0485140Z ·  ──┬─ 2026-10-24T10:35:58.0485307Z · ╰── 'U+001B' is a control character. 2026-10-24T10:35:58.0485374Z 221 │ 2026-10-24T10:35:58.0485428Z ╰──── 2026-10-24T10:35:58.0485662Z  help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression. 2026-10-24T10:35:58.0485664Z 2026-10-24T10:35:58.0486145Z ⚠ 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-24T10:35:58.0486340Z ╭─[apps/server/src/project/ProjectService.test.ts:94:3] 2026-10-24T10:35:58.0486430Z 93 │ ) { 2026-10-24T10:35:58.0486635Z 94 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T10:35:58.0486812Z 95 │ │ const project = Option.getOrThrow(yield* service.getById(projectId)); 2026-10-24T10:35:58.0486938Z 96 │ │ if (predicate(project)) return project; 2026-10-24T10:35:58.0487043Z 97 │ │ yield* Effect.yieldNow; 2026-10-24T10:35:58.0487169Z 98 │ ╰─▶ } 2026-10-24T10:35:58.0487323Z 99 │ return yield* Effect.die(`Project ${projectId} was not enriched in time.`); 2026-10-24T10:35:58.0487374Z ╰──── 2026-10-24T10:35:58.0487376Z 2026-10-24T10:35:58.0487859Z ⚠ 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-24T10:35:58.0488022Z ╭─[apps/server/src/project/ProjectEnrichmentService.test.ts:28:3] 2026-10-24T10:35:58.0488080Z 27 │ ) { 2026-10-24T10:35:58.0488279Z 28 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T10:35:58.0488424Z 29 │ │ const available = yield* service.peek(workspaceRoot); 2026-10-24T10:35:58.0488552Z 30 │ │ if (predicate(available)) return available; 2026-10-24T10:35:58.0488654Z 31 │ │ yield* Effect.yieldNow; 2026-10-24T10:35:58.0488777Z 32 │ ╰─▶ } 2026-10-24T10:35:58.0488963Z 33 │ return yield* Effect.die(`Project metadata for ${workspaceRoot} was not resolved in time.`); 2026-10-24T10:35:58.0489019Z ╰──── 2026-10-24T10:35:58.0489021Z 2026-10-24T10:35:58.0489204Z ⚠ eslint(no-unused-vars): Type 'Scope' is imported but never used. 2026-10-24T10:35:58.0489339Z ╭─[apps/server/src/provider/ProviderAuthService.ts:15:18] 2026-10-24T10:35:58.0489424Z 14 │ import * as Layer from "effect/Layer"; 2026-10-24T10:35:58.0489516Z 15 │ import type * as Scope from "effect/Scope"; 2026-10-24T10:35:58.0489597Z ·  ──┬── 2026-10-24T10:35:58.0489733Z · ╰── 'Scope' is imported here 2026-10-24T10:35:58.0489819Z 16 │ import * as Stream from "effect/Stream"; 2026-10-24T10:35:58.0489872Z ╰──── 2026-10-24T10:35:58.0489976Z  help: Consider removing this import. 2026-10-24T10:35:58.0489981Z 2026-10-24T10:35:58.0490148Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T10:35:58.0490285Z ╭─[apps/web/src/components/CustomSnoozeDialog.tsx:140:58] 2026-10-24T10:35:58.0490423Z 139 │ {...(weekStartsOn === undefined ? {} : { weekStartsOn })} 2026-10-24T10:35:58.0490577Z 140 │ disabled={{ before: new Date(new Date().setHours(0, 0, 0, 0)) }} 2026-10-24T10:35:58.0490701Z ·  ─────┬──── 2026-10-24T10:35:58.0490874Z · ╰── Cannot call impure function 2026-10-24T10:35:58.0490972Z 141 │ onSelect={(selected) => { 2026-10-24T10:35:58.0491025Z ╰──── 2026-10-24T10:35:58.0491402Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T10:35:58.0491738Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T10:35:58.0491742Z 2026-10-24T10:35:58.0492178Z ⚠ 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-24T10:35:58.0492326Z ╭─[apps/server/src/provider/acp/AntigravityProtocol.ts:263:20] 2026-10-24T10:35:58.0492410Z 262 │ ...(update._meta !== undefined 2026-10-24T10:35:58.0492584Z 263 │ ? { _meta: Schema.is(Schema.Record(Schema.String, Schema.Json))(meta) ? meta : null } 2026-10-24T10:35:58.0492674Z ·  ───────── 2026-10-24T10:35:58.0492736Z 264 │ : {}), 2026-10-24T10:35:58.0492788Z ╰──── 2026-10-24T10:35:58.0492791Z 2026-10-24T10:35:58.0493017Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T10:35:58.0493135Z ╭─[packages/shared/src/serverSettings.ts:346:9] 2026-10-24T10:35:58.0493238Z 345 │ const entry: ProjectSettingsOverrides = { 2026-10-24T10:35:58.0493369Z 346 │ ...(entries.get(projectId) ?? currentEntries[projectId] ?? {}), 2026-10-24T10:35:58.0493522Z ·  ────────────────────────────────────────────────────────────── 2026-10-24T10:35:58.0493578Z 347 │ }; 2026-10-24T10:35:58.0493630Z ╰──── 2026-10-24T10:35:58.0493905Z  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-24T10:35:58.0493912Z 2026-10-24T10:35:58.0494135Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in Array.prototype.reduce() 2026-10-24T10:35:58.0494253Z ╭─[packages/shared/src/serverSettings.ts:448:24] 2026-10-24T10:35:58.0494321Z 447 │ const favorites = 2026-10-24T10:35:58.0494430Z 448 │ setModelFavorites?.reduce((current, change) => { 2026-10-24T10:35:58.0494518Z ·  ───┬── 2026-10-24T10:35:58.0494645Z · ╰── For this reduce 2026-10-24T10:35:58.0494728Z 449 │ const exists = current.some( 2026-10-24T10:35:58.0494902Z 450 │ (favorite) => favorite.provider === change.provider && favorite.model === change.model, 2026-10-24T10:35:58.0495010Z 451 │ ); 2026-10-24T10:35:58.0495119Z 452 │ return change.favorite 2026-10-24T10:35:58.0495180Z 453 │ ? exists 2026-10-24T10:35:58.0495243Z 454 │ ? current 2026-10-24T10:35:58.0495380Z 455 │ : [...current, { provider: change.provider, model: change.model }] 2026-10-24T10:35:58.0495463Z ·  ─────┬──── 2026-10-24T10:35:58.0495585Z · ╰── From this spread 2026-10-24T10:35:58.0495656Z 456 │ : current.filter( 2026-10-24T10:35:58.0495708Z ╰──── 2026-10-24T10:35:58.0495912Z  help: Consider using `Object.assign()` or `Array.prototype.push()` to mutate the accumulator instead. 2026-10-24T10:35:58.0496074Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T10:35:58.0496078Z 2026-10-24T10:35:58.0496272Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-24T10:35:58.0496395Z ╭─[packages/shared/src/serverSettings.ts:466:3] 2026-10-24T10:35:58.0496454Z 464 │ null; 2026-10-24T10:35:58.0496568Z 465 │ let nextModelPreferences = initialModelPreferences; 2026-10-24T10:35:58.0496658Z ·  ──────────┬───────── 2026-10-24T10:35:58.0496785Z · ╰── From this accumulator 2026-10-24T10:35:58.0496884Z 466 │ for (const change of setModelsHidden ?? []) { 2026-10-24T10:35:58.0496953Z ·  ─┬─ 2026-10-24T10:35:58.0497059Z · ╰── For this loop 2026-10-24T10:35:58.0497197Z 467 │ const preferences = nextModelPreferences?.[change.provider] ?? { 2026-10-24T10:35:58.0497263Z 468 │ hiddenModels: [], 2026-10-24T10:35:58.0497336Z 469 │ modelOrder: [], 2026-10-24T10:35:58.0497394Z 470 │ }; 2026-10-24T10:35:58.0497574Z 471 │ const hiddenModels = preferences.hiddenModels.filter((model) => model !== change.model); 2026-10-24T10:35:58.0497684Z 472 │ if (change.hidden) hiddenModels.push(change.model); 2026-10-24T10:35:58.0497759Z 473 │ nextModelPreferences = { 2026-10-24T10:35:58.0497838Z 474 │ ...nextModelPreferences, 2026-10-24T10:35:58.0497934Z ·  ───────────┬─────────── 2026-10-24T10:35:58.0498058Z · ╰── From this spread 2026-10-24T10:35:58.0498174Z 475 │ [change.provider]: { ...preferences, hiddenModels }, 2026-10-24T10:35:58.0498226Z ╰──── 2026-10-24T10:35:58.0498382Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-24T10:35:58.0498546Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T10:35:58.0498552Z 2026-10-24T10:35:58.0498766Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T10:35:58.0498901Z ╭─[apps/web/src/lib/composerContextReferences.ts:90:40] 2026-10-24T10:35:58.0498976Z 89 │ let cursor = prompt.length; 2026-10-24T10:35:58.0499085Z 90 │ for (const occurrence of occurrences.reverse()) { 2026-10-24T10:35:58.0499188Z ·  ─────── 2026-10-24T10:35:58.0499270Z 91 │ let { start, end } = occurrence; 2026-10-24T10:35:58.0499322Z ╰──── 2026-10-24T10:35:58.0499586Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T10:35:58.0499590Z 2026-10-24T10:35:58.0499873Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T10:35:58.0500031Z ╭─[apps/server/src/terminal/Manager.test.ts:731:31] 2026-10-24T10:35:58.0500087Z 730 │ ); 2026-10-24T10:35:58.0500263Z 731 │ const snapshot = events.filter((event) => event.type === "snapshot").at(-1)?.snapshot; 2026-10-24T10:35:58.0500359Z ·  ────── 2026-10-24T10:35:58.0500474Z 732 │ expect(snapshot?.history).toBe("aa😀\rEND"); 2026-10-24T10:35:58.0500525Z ╰──── 2026-10-24T10:35:58.0500697Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T10:35:58.0500700Z 2026-10-24T10:35:58.0500997Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-24T10:35:58.0501154Z ╭─[apps/server/src/provider/AntigravityAuth.ts:285:20] 2026-10-24T10:35:58.0501211Z 284 │ }, 2026-10-24T10:35:58.0501295Z 285 │ (effect, flow, stopSessions) => 2026-10-24T10:35:58.0501387Z ·  ──────┬───── 2026-10-24T10:35:58.0501543Z · ╰── 'stopSessions' is declared here 2026-10-24T10:35:58.0501608Z 286 │ effect.pipe( 2026-10-24T10:35:58.0501659Z ╰──── 2026-10-24T10:35:58.0501763Z  help: Consider removing this parameter. 2026-10-24T10:35:58.0501766Z 2026-10-24T10:35:58.0502252Z ⚠ 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-24T10:35:58.0502406Z ╭─[apps/server/src/background/HostPowerMonitor.test.ts:133:11] 2026-10-24T10:35:58.0502539Z 132 │ const monitor = yield* HostPowerMonitor.HostPowerMonitor; 2026-10-24T10:35:58.0502689Z 133 │ ╭─▶ for ( 2026-10-24T10:35:58.0502794Z 134 │ │ let attempt = 0; 2026-10-24T10:35:58.0502965Z 135 │ │ attempt < 100 && (yield* monitor.snapshot).onBattery !== "true"; 2026-10-24T10:35:58.0503062Z 136 │ │ attempt += 1 2026-10-24T10:35:58.0503145Z 137 │ │ ) { 2026-10-24T10:35:58.0503256Z 138 │ │ yield* Effect.yieldNow; 2026-10-24T10:35:58.0503401Z 139 │ ╰─▶ } 2026-10-24T10:35:58.0503529Z 140 │ expect((yield* monitor.snapshot).onBattery).toBe("true"); 2026-10-24T10:35:58.0503581Z ╰──── 2026-10-24T10:35:58.0503583Z 2026-10-24T10:35:58.0503880Z ⚠ eslint(no-unused-vars): Variable 'revokeActiveMcpThread' is declared but never used. Unused variables should start with a '_'. 2026-10-24T10:35:58.0504009Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:218:7] 2026-10-24T10:35:58.0504063Z 217 │ 2026-10-24T10:35:58.0504213Z 218 │ const revokeActiveMcpThread = (threadId: ThreadId): Effect.Effect => 2026-10-24T10:35:58.0504303Z ·  ──────────┬────────── 2026-10-24T10:35:58.0504466Z · ╰── 'revokeActiveMcpThread' is declared here 2026-10-24T10:35:58.0504709Z 219 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeThread(threadId) : Effect.void; 2026-10-24T10:35:58.0504799Z ╰──── 2026-10-24T10:35:58.0504904Z  help: Consider removing this declaration. 2026-10-24T10:35:58.0504907Z 2026-10-24T10:35:58.0542961Z ⚠ eslint(no-unused-vars): Variable 'revokeAllActiveMcpCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-24T10:35:58.0543208Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:221:7] 2026-10-24T10:35:58.0543263Z 220 │ 2026-10-24T10:35:58.0543408Z 221 │ const revokeAllActiveMcpCredentials = (): Effect.Effect => 2026-10-24T10:35:58.0543530Z ·  ──────────────┬────────────── 2026-10-24T10:35:58.0543727Z · ╰── 'revokeAllActiveMcpCredentials' is declared here 2026-10-24T10:35:58.0543909Z 222 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void; 2026-10-24T10:35:58.0543969Z ╰──── 2026-10-24T10:35:58.0544080Z  help: Consider removing this declaration. 2026-10-24T10:35:58.0544085Z 2026-10-24T10:35:58.0544356Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T10:35:58.0544485Z ╭─[apps/server/src/serverRuntimeStartup.ts:728:7] 2026-10-24T10:35:58.0544538Z 727 │ 2026-10-24T10:35:58.0544624Z 728 │ const layer = layerWithOptions(); 2026-10-24T10:35:58.0544697Z ·  ──┬── 2026-10-24T10:35:58.0544825Z · ╰── 'layer' is declared here 2026-10-24T10:35:58.0544876Z ╰──── 2026-10-24T10:35:58.0544980Z  help: Consider removing this declaration. 2026-10-24T10:35:58.0544983Z 2026-10-24T10:35:58.0545247Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T10:35:58.0545391Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:121:27] 2026-10-24T10:35:58.0545559Z 120 │ const scope = makeScope(options.capabilities ?? new Set(["preview", "worktree"])); 2026-10-24T10:35:58.0545650Z 121 │ const dispatch = vi.fn((_: unknown) => 2026-10-24T10:35:58.0545737Z ·  ┬ 2026-10-24T10:35:58.0545873Z · ╰── '_' is declared here 2026-10-24T10:35:58.0545973Z 122 │ (options.dispatchGate ?? Effect.void).pipe( 2026-10-24T10:35:58.0546024Z ╰──── 2026-10-24T10:35:58.0546128Z  help: Consider removing this parameter. 2026-10-24T10:35:58.0546130Z 2026-10-24T10:35:58.0546323Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T10:35:58.0546462Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:134:39] 2026-10-24T10:35:58.0546518Z 133 │ ); 2026-10-24T10:35:58.0546623Z 134 │ const listLocalBranchNames = vi.fn((_: string) => 2026-10-24T10:35:58.0546721Z ·  ┬ 2026-10-24T10:35:58.0546864Z · ╰── '_' is declared here 2026-10-24T10:35:58.0546932Z 135 │ Effect.succeed( 2026-10-24T10:35:58.0546984Z ╰──── 2026-10-24T10:35:58.0547085Z  help: Consider removing this parameter. 2026-10-24T10:35:58.0547087Z 2026-10-24T10:35:58.0547269Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T10:35:58.0547406Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:178:31] 2026-10-24T10:35:58.0547607Z 177 │ }); 2026-10-24T10:35:58.0547752Z 178 │ const sendToThread = vi.fn((_: unknown) => { 2026-10-24T10:35:58.0547839Z ·  ┬ 2026-10-24T10:35:58.0547973Z · ╰── '_' is declared here 2026-10-24T10:35:58.0548074Z 179 │ switch (options.continuation ?? "queued") { 2026-10-24T10:35:58.0548125Z ╰──── 2026-10-24T10:35:58.0548223Z  help: Consider removing this parameter. 2026-10-24T10:35:58.0548226Z 2026-10-24T10:35:58.0548410Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T10:35:58.0548545Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:203:33] 2026-10-24T10:35:58.0548600Z 202 │ ); 2026-10-24T10:35:58.0548696Z 203 │ const removeWorktree = vi.fn((_: unknown) => 2026-10-24T10:35:58.0548794Z ·  ┬ 2026-10-24T10:35:58.0548934Z · ╰── '_' is declared here 2026-10-24T10:35:58.0549015Z 204 │ options.removeWorktreeFails 2026-10-24T10:35:58.0549066Z ╰──── 2026-10-24T10:35:58.0549164Z  help: Consider removing this parameter. 2026-10-24T10:35:58.0549167Z 2026-10-24T10:35:58.0549347Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T10:35:58.0549482Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:208:36] 2026-10-24T10:35:58.0549535Z 207 │ ); 2026-10-24T10:35:58.0549636Z 208 │ const deleteLocalBranch = vi.fn((_: unknown) => 2026-10-24T10:35:58.0549731Z ·  ┬ 2026-10-24T10:35:58.0549874Z · ╰── '_' is declared here 2026-10-24T10:35:58.0549961Z 209 │ options.deleteLocalBranchFails 2026-10-24T10:35:58.0550013Z ╰──── 2026-10-24T10:35:58.0550112Z  help: Consider removing this parameter. 2026-10-24T10:35:58.0550115Z 2026-10-24T10:35:58.0550296Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T10:35:58.0550429Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:213:42] 2026-10-24T10:35:58.0550482Z 212 │ ); 2026-10-24T10:35:58.0550596Z 213 │ const fetchWorktreeBaseCommit = vi.fn((_: unknown) => 2026-10-24T10:35:58.0550695Z ·  ┬ 2026-10-24T10:35:58.0550838Z · ╰── '_' is declared here 2026-10-24T10:35:58.0550928Z 214 │ options.fetchWorktreeBaseFails 2026-10-24T10:35:58.0550981Z ╰──── 2026-10-24T10:35:58.0551112Z  help: Consider removing this parameter. 2026-10-24T10:35:58.0551115Z 2026-10-24T10:35:58.0551294Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T10:35:58.0551427Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:254:30] 2026-10-24T10:35:58.0551480Z 253 │ ); 2026-10-24T10:35:58.0551571Z 254 │ const localStatus = vi.fn((_: unknown) => 2026-10-24T10:35:58.0551658Z ·  ┬ 2026-10-24T10:35:58.0551791Z · ╰── '_' is declared here 2026-10-24T10:35:58.0551859Z 255 │ Effect.succeed({ 2026-10-24T10:35:58.0551910Z ╰──── 2026-10-24T10:35:58.0552007Z  help: Consider removing this parameter. 2026-10-24T10:35:58.0552064Z 2026-10-24T10:35:58.0552274Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T10:35:58.0552408Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:264:32] 2026-10-24T10:35:58.0552462Z 263 │ ); 2026-10-24T10:35:58.0552612Z 264 │ const refreshStatus = vi.fn((_: string) => Effect.die("refreshStatus stub")); 2026-10-24T10:35:58.0552702Z ·  ┬ 2026-10-24T10:35:58.0552838Z · ╰── '_' is declared here 2026-10-24T10:35:58.0552987Z 265 │ const runForThread = vi.fn((input: { readonly worktreePath: string }) => { 2026-10-24T10:35:58.0553037Z ╰──── 2026-10-24T10:35:58.0553134Z  help: Consider removing this parameter. 2026-10-24T10:35:58.0553137Z 2026-10-24T10:35:58.0553599Z ⚠ 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-24T10:35:58.0553735Z ╭─[apps/server/src/assets/AssetAccess.test.ts:1043:32] 2026-10-24T10:35:58.0553873Z 1042 │ expect(error._tag).toBe("AssetGitHubMediaUrlValidationError"); 2026-10-24T10:35:58.0554061Z 1043 │ const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(AssetAccessError))(error); 2026-10-24T10:35:58.0554177Z ·  ─────────────────── 2026-10-24T10:35:58.0554271Z 1044 │ expect(encoded).not.toContain(url); 2026-10-24T10:35:58.0554322Z ╰──── 2026-10-24T10:35:58.0554325Z 2026-10-24T10:35:58.0554501Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T10:35:58.0554646Z ╭─[apps/server/src/process/externalLauncher.test.ts:186:12] 2026-10-24T10:35:58.0554699Z 185 │ 2026-10-24T10:35:58.0554800Z 186 │ for (const {} of ["darwin", "linux"] as const) { 2026-10-24T10:35:58.0554870Z ·  ── 2026-10-24T10:35:58.0554924Z 187 │ } 2026-10-24T10:35:58.0554975Z ╰──── 2026-10-24T10:35:58.0555212Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T10:35:58.0555215Z 2026-10-24T10:35:58.0555382Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T10:35:58.0555523Z ╭─[apps/server/src/process/externalLauncher.test.ts:189:12] 2026-10-24T10:35:58.0555574Z 188 │ 2026-10-24T10:35:58.0555639Z 189 │ for (const {} of [ 2026-10-24T10:35:58.0555714Z ·  ── 2026-10-24T10:35:58.0555807Z 190 │ { kind: "browser", folderVerb: "none" }, 2026-10-24T10:35:58.0555858Z ╰──── 2026-10-24T10:35:58.0556085Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T10:35:58.0556088Z 2026-10-24T10:35:58.0556251Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T10:35:58.0556390Z ╭─[apps/server/src/process/externalLauncher.test.ts:311:12] 2026-10-24T10:35:58.0556441Z 310 │ 2026-10-24T10:35:58.0556570Z 311 │ for (const {} of ["rejected", "spawn-error", "stalled"] as const) { 2026-10-24T10:35:58.0556640Z ·  ── 2026-10-24T10:35:58.0556692Z 312 │ } 2026-10-24T10:35:58.0556742Z ╰──── 2026-10-24T10:35:58.0557028Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T10:35:58.0557061Z 2026-10-24T10:35:58.0557225Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T10:35:58.0557363Z ╭─[apps/server/src/process/externalLauncher.test.ts:314:12] 2026-10-24T10:35:58.0557414Z 313 │ 2026-10-24T10:35:58.0557477Z 314 │ for (const {} of [ 2026-10-24T10:35:58.0557544Z ·  ── 2026-10-24T10:35:58.0557598Z 315 │ { 2026-10-24T10:35:58.0557649Z ╰──── 2026-10-24T10:35:58.0557876Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T10:35:58.0557879Z 2026-10-24T10:35:58.0558247Z ⚠ 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-24T10:35:58.0558382Z ╭─[apps/server/src/vcs/GitVcsDriverCore.test.ts:1786:34] 2026-10-24T10:35:58.0558520Z 1785 │ const stat = branch.files!.find((file) => file.path === path)!; 2026-10-24T10:35:58.0558671Z 1786 │ const request = yield* Schema.decodeEffect(ReviewDiffPreviewInput)({ 2026-10-24T10:35:58.0558786Z ·  ─────────────────── 2026-10-24T10:35:58.0558848Z 1787 │ cwd, 2026-10-24T10:35:58.0558899Z ╰──── 2026-10-24T10:35:58.0558902Z 2026-10-24T10:35:58.0559150Z ⚠ eslint(no-unused-vars): Function 'normalizeTerminalContextSelection' is declared but never used. 2026-10-24T10:35:58.0559264Z ╭─[apps/web/src/lib/terminalContext.ts:56:10] 2026-10-24T10:35:58.0559315Z 55 │ 2026-10-24T10:35:58.0559421Z 56 │ function normalizeTerminalContextSelection( 2026-10-24T10:35:58.0559533Z ·  ────────────────┬──────────────── 2026-10-24T10:35:58.0559728Z · ╰── 'normalizeTerminalContextSelection' is declared here 2026-10-24T10:35:58.0559815Z 57 │ selection: TerminalContextSelection, 2026-10-24T10:35:58.0559866Z ╰──── 2026-10-24T10:35:58.0559970Z  help: Consider removing this declaration. 2026-10-24T10:35:58.0559972Z 2026-10-24T10:35:58.0560216Z ⚠ unicorn(prefer-string-starts-ends-with): Prefer String#startsWith over a regex with a caret. 2026-10-24T10:35:58.0560339Z ╭─[apps/server/src/vcs/GitVcsDriverCore.ts:509:11] 2026-10-24T10:35:58.0560439Z 508 │ GIT_DIAGNOSTIC_LINE_PATTERN.test(line) || 2026-10-24T10:35:58.0560634Z 509 │ (!/^remote:/.test(line) && SSH_TRANSPORT_REFUSAL_PATTERN.test(line)), 2026-10-24T10:35:58.0560760Z ·  ─────────────── 2026-10-24T10:35:58.0560814Z 510 │ ) 2026-10-24T10:35:58.0560865Z ╰──── 2026-10-24T10:35:58.0561019Z  help: Replace `/^remote:/.test(line)` with `line.startsWith('remote:')`. 2026-10-24T10:35:58.0561022Z 2026-10-24T10:35:58.0561509Z ⚠ 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-24T10:35:58.0561633Z ╭─[apps/server/src/serverSettings.test.ts:1741:32] 2026-10-24T10:35:58.0561806Z 1740 │ const model = createModelSelection(ProviderInstanceId.make("codex"), "gpt-5.5"); 2026-10-24T10:35:58.0561998Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-24T10:35:58.0562115Z ·  ─────────────────── 2026-10-24T10:35:58.0562226Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-24T10:35:58.0562276Z ╰──── 2026-10-24T10:35:58.0562279Z 2026-10-24T10:35:58.0562725Z ⚠ 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-24T10:35:58.0562847Z ╭─[apps/server/src/serverSettings.test.ts:1742:34] 2026-10-24T10:35:58.0563030Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-24T10:35:58.0563137Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-24T10:35:58.0563257Z ·  ─────────────────── 2026-10-24T10:35:58.0563378Z 1743 │ Schema.fromJsonString(Schema.Array(ProjectScript)), 2026-10-24T10:35:58.0563429Z ╰──── 2026-10-24T10:35:58.0563432Z 2026-10-24T10:35:58.0563637Z ⚠ eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used. 2026-10-24T10:35:58.0563730Z ╭─[apps/web/src/types.ts:22:3] 2026-10-24T10:35:58.0563800Z 21 │ EnvironmentThreadShell, 2026-10-24T10:35:58.0563866Z 22 │ ThreadRunSummary, 2026-10-24T10:35:58.0563945Z ·  ────────┬─────── 2026-10-24T10:35:58.0564090Z · ╰── 'ThreadRunSummary' is imported here 2026-10-24T10:35:58.0564159Z 23 │ ThreadRuntimeSummary, 2026-10-24T10:35:58.0564210Z ╰──── 2026-10-24T10:35:58.0564308Z  help: Consider removing this import. 2026-10-24T10:35:58.0564319Z 2026-10-24T10:35:58.0564550Z ⚠ eslint(no-unused-vars): Function 'resolveThreadWorkspaceCwd' is declared but never used. 2026-10-24T10:35:58.0564668Z ╭─[apps/server/src/checkpointing/Utils.ts:12:10] 2026-10-24T10:35:58.0564719Z 11 │ 2026-10-24T10:35:58.0564817Z 12 │ function resolveThreadWorkspaceCwd(input: { 2026-10-24T10:35:58.0564915Z ·  ────────────┬──────────── 2026-10-24T10:35:58.0565086Z · ╰── 'resolveThreadWorkspaceCwd' is declared here 2026-10-24T10:35:58.0565151Z 13 │ readonly thread: { 2026-10-24T10:35:58.0565202Z ╰──── 2026-10-24T10:35:58.0565305Z  help: Consider removing this declaration. 2026-10-24T10:35:58.0565307Z 2026-10-24T10:35:58.0565576Z ⚠ eslint(no-unused-vars): Function 'nonEmptyString' is declared but never used. 2026-10-24T10:35:58.0565758Z ╭─[packages/client-runtime/src/work-log/presentation.ts:234:10] 2026-10-24T10:35:58.0565809Z 233 │ 2026-10-24T10:35:58.0565927Z 234 │ function nonEmptyString(value: unknown): string | null { 2026-10-24T10:35:58.0566011Z ·  ───────┬────── 2026-10-24T10:35:58.0566157Z · ╰── 'nonEmptyString' is declared here 2026-10-24T10:35:58.0566301Z 235 │ return typeof value === "string" && value.trim().length > 0 ? value : null; 2026-10-24T10:35:58.0566350Z ╰──── 2026-10-24T10:35:58.0566453Z  help: Consider removing this declaration. 2026-10-24T10:35:58.0566455Z 2026-10-24T10:35:58.0566663Z ⚠ typescript(no-extraneous-class): Unexpected class with only a constructor. 2026-10-24T10:35:58.0566793Z ╭─[apps/desktop/src/preview/Manager.test.ts:158:18] 2026-10-24T10:35:58.0566894Z 157 │ BrowserWindow: browserWindowConstructor, 2026-10-24T10:35:58.0567056Z 158 │ ╭─▶ ClipboardItem: class { 2026-10-24T10:35:58.0567188Z 159 │ │ constructor(data: Record) { 2026-10-24T10:35:58.0567306Z 160 │ │ clipboardItemConstructor(data); 2026-10-24T10:35:58.0567379Z 161 │ │ } 2026-10-24T10:35:58.0567506Z 162 │ ╰─▶ }, 2026-10-24T10:35:58.0567570Z 163 │ clipboard: { 2026-10-24T10:35:58.0567620Z ╰──── 2026-10-24T10:35:58.0567789Z  help: Try replacing this class with a standalone function or deleting it entirely 2026-10-24T10:35:58.0567792Z 2026-10-24T10:35:58.0568075Z ⚠ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'. 2026-10-24T10:35:58.0568226Z ╭─[apps/web/src/components/preview/PreviewPanelShell.tsx:61:9] 2026-10-24T10:35:58.0568280Z 60 │ ) { 2026-10-24T10:35:58.0568448Z 61 │ const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded"; 2026-10-24T10:35:58.0568530Z ·  ──────┬────── 2026-10-24T10:35:58.0568670Z · ╰── 'useDragRegion' is declared here 2026-10-24T10:35:58.0568761Z 62 │ const isInline = props.mode === "inline"; 2026-10-24T10:35:58.0568811Z ╰──── 2026-10-24T10:35:58.0568915Z  help: Consider removing this declaration. 2026-10-24T10:35:58.0568917Z 2026-10-24T10:35:58.0569192Z ⚠ unicorn(prefer-add-event-listener): Prefer `addEventListener()` over their `on`-function counterparts. 2026-10-24T10:35:58.0569337Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:12:14] 2026-10-24T10:35:58.0569494Z 11 │ addEventListener(_type: string, listener: (event: { data: string }) => void) { 2026-10-24T10:35:58.0569573Z 12 │ this.onmessage = listener; 2026-10-24T10:35:58.0569652Z ·  ───────── 2026-10-24T10:35:58.0569707Z 13 │ } 2026-10-24T10:35:58.0569755Z ╰──── 2026-10-24T10:35:58.0570081Z  help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on` replaces any previously registered handler. 2026-10-24T10:35:58.0570084Z 2026-10-24T10:35:58.0570296Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-24T10:35:58.0570496Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:16:9] 2026-10-24T10:35:58.0570591Z 15 │ constructor() { 2026-10-24T10:35:58.0570655Z 16 │ source = this; 2026-10-24T10:35:58.0570728Z ·  ────── 2026-10-24T10:35:58.0570785Z 17 │ } 2026-10-24T10:35:58.0570835Z ╰──── 2026-10-24T10:35:58.0571141Z  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-24T10:35:58.0571144Z 2026-10-24T10:35:58.0571357Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-24T10:35:58.0571528Z ╭─[apps/server/src/sourceControl/SourceControlProviderRegistry.ts:15:13] 2026-10-24T10:35:58.0571599Z 14 │ } from "@t3tools/contracts"; 2026-10-24T10:35:58.0571697Z 15 │ import type {} from "@t3tools/contracts"; 2026-10-24T10:35:58.0571769Z ·  ── 2026-10-24T10:35:58.0571954Z 16 │ import { detectSourceControlProviderFromRemoteUrl } from "@t3tools/shared/sourceControl"; 2026-10-24T10:35:58.0572004Z ╰──── 2026-10-24T10:35:58.0572084Z  help: Remove empty braces 2026-10-24T10:35:58.0572087Z 2026-10-24T10:35:58.0572318Z ⚠ eslint(no-unused-vars): Function 'assertUserMessagesExclude' is declared but never used. 2026-10-24T10:35:58.0572483Z ╭─[apps/server/src/orchestration-v2/testkit/fixtures/shared.ts:1398:10] 2026-10-24T10:35:58.0572537Z 1397 │ 2026-10-24T10:35:58.0572625Z 1398 │ function assertUserMessagesExclude( 2026-10-24T10:35:58.0572729Z ·  ────────────┬──────────── 2026-10-24T10:35:58.0572909Z · ╰── 'assertUserMessagesExclude' is declared here 2026-10-24T10:35:58.0573021Z 1399 │ projection: OrchestrationV2ThreadProjection, 2026-10-24T10:35:58.0573071Z ╰──── 2026-10-24T10:35:58.0573173Z  help: Consider removing this declaration. 2026-10-24T10:35:58.0573176Z 2026-10-24T10:35:58.0573380Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T10:35:58.0573516Z ╭─[packages/client-runtime/src/state/usageAccess.ts:3:8] 2026-10-24T10:35:58.0573589Z 2 │ AuthDiagnosticsReadScope, 2026-10-24T10:35:58.0573659Z 3 │ type AuthSessionState, 2026-10-24T10:35:58.0573741Z ·  ────────┬─────── 2026-10-24T10:35:58.0573889Z · ╰── 'AuthSessionState' is imported here 2026-10-24T10:35:58.0573957Z 4 │ sessionGrantsScope, 2026-10-24T10:35:58.0574008Z ╰──── 2026-10-24T10:35:58.0574112Z  help: Consider removing this import. 2026-10-24T10:35:58.0574118Z 2026-10-24T10:35:58.0574379Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:35:58.0574510Z ╭─[apps/mobile/src/state/use-vcs-action-state.ts:86:5] 2026-10-24T10:35:58.0574617Z 83 │ const [nowMs, setNowMs] = useState(() => Date.now()); 2026-10-24T10:35:58.0574681Z 84 │ useEffect(() => { 2026-10-24T10:35:58.0574752Z ·  ────┬──── 2026-10-24T10:35:58.0574880Z · ╰── This is the containing effect 2026-10-24T10:35:58.0574968Z 85 │ if (!actionState.isRunning) return; 2026-10-24T10:35:58.0575036Z 86 │ setNowMs(Date.now()); 2026-10-24T10:35:58.0575106Z ·  ────┬─── 2026-10-24T10:35:58.0575332Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.0575515Z 87 │ const interval = setInterval(() => setNowMs(Date.now()), 1000); 2026-10-24T10:35:58.0575565Z ╰──── 2026-10-24T10:35:58.0576188Z  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-24T10:35:58.0576525Z  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-24T10:35:58.0576528Z 2026-10-24T10:35:58.0576686Z ⚠ eslint(no-new): Do not use 'new' for side effects. 2026-10-24T10:35:58.0576816Z ╭─[apps/server/src/mcp/McpToolAccess.test.ts:168:3] 2026-10-24T10:35:58.0576931Z 167 │ // @ts-expect-error a declaration constructed directly 2026-10-24T10:35:58.0577027Z 168 │ new McpToolAccess.Declaration(unchecked); 2026-10-24T10:35:58.0577123Z ·  ───────────────────────────── 2026-10-24T10:35:58.0577251Z 169 │ // @ts-expect-error a handlers layer built outside McpToolAccess 2026-10-24T10:35:58.0577302Z ╰──── 2026-10-24T10:35:58.0577461Z  help: Assign the result of 'new' to a variable or compare it to a reference. 2026-10-24T10:35:58.0577464Z 2026-10-24T10:35:58.0577947Z ⚠ 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-24T10:35:58.0578110Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1680:7] 2026-10-24T10:35:58.0578207Z 1679 │ yield* harness.replaceSession; 2026-10-24T10:35:58.0578422Z 1680 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T10:35:58.0578578Z 1681 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) { 2026-10-24T10:35:58.0578664Z 1682 │ │ break; 2026-10-24T10:35:58.0578744Z 1683 │ │ } 2026-10-24T10:35:58.0578852Z 1684 │ │ yield* Effect.yieldNow; 2026-10-24T10:35:58.0578986Z 1685 │ ╰─▶ } 2026-10-24T10:35:58.0579060Z 1686 │ yield* Queue.offer( 2026-10-24T10:35:58.0579112Z ╰──── 2026-10-24T10:35:58.0579177Z 2026-10-24T10:35:58.0579686Z ⚠ 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-24T10:35:58.0579848Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1789:7] 2026-10-24T10:35:58.0579939Z 1788 │ yield* harness.replaceSession; 2026-10-24T10:35:58.0580148Z 1789 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T10:35:58.0580309Z 1790 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break; 2026-10-24T10:35:58.0580417Z 1791 │ │ yield* Effect.yieldNow; 2026-10-24T10:35:58.0580556Z 1792 │ ╰─▶ } 2026-10-24T10:35:58.0580690Z 1793 │ expect(yield* Ref.get(harness.subscriptionCount)).toBe(2); 2026-10-24T10:35:58.0580741Z ╰──── 2026-10-24T10:35:58.0580744Z 2026-10-24T10:35:58.0580950Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T10:35:58.0581110Z ╭─[packages/client-runtime/src/state/filesystem.ts:3:8] 2026-10-24T10:35:58.0581180Z 2 │ AuthFilesystemReadScope, 2026-10-24T10:35:58.0581249Z 3 │ type AuthSessionState, 2026-10-24T10:35:58.0581332Z ·  ────────┬─────── 2026-10-24T10:35:58.0581479Z · ╰── 'AuthSessionState' is imported here 2026-10-24T10:35:58.0581552Z 4 │ type FilesystemBrowseEntry, 2026-10-24T10:35:58.0581603Z ╰──── 2026-10-24T10:35:58.0581706Z  help: Consider removing this import. 2026-10-24T10:35:58.0581711Z 2026-10-24T10:35:58.0581903Z ⚠ eslint(no-unused-vars): Identifier 'Arr' is imported but never used. 2026-10-24T10:35:58.0582036Z ╭─[packages/client-runtime/src/state/threadSort.ts:4:13] 2026-10-24T10:35:58.0582154Z 3 │ import type { EnvironmentThreadShell } from "./models.ts"; 2026-10-24T10:35:58.0582235Z 4 │ import * as Arr from "effect/Array"; 2026-10-24T10:35:58.0582306Z ·  ─┬─ 2026-10-24T10:35:58.0582428Z · ╰── 'Arr' is imported here 2026-10-24T10:35:58.0582512Z 5 │ import * as Order from "effect/Order"; 2026-10-24T10:35:58.0582561Z ╰──── 2026-10-24T10:35:58.0582660Z  help: Consider removing this import. 2026-10-24T10:35:58.0582663Z 2026-10-24T10:35:58.0582862Z ⚠ eslint(no-unused-vars): Identifier 'Order' is imported but never used. 2026-10-24T10:35:58.0582998Z ╭─[packages/client-runtime/src/state/threadSort.ts:5:13] 2026-10-24T10:35:58.0583077Z 4 │ import * as Arr from "effect/Array"; 2026-10-24T10:35:58.0583160Z 5 │ import * as Order from "effect/Order"; 2026-10-24T10:35:58.0583232Z ·  ──┬── 2026-10-24T10:35:58.0583362Z · ╰── 'Order' is imported here 2026-10-24T10:35:58.0583413Z 6 │ 2026-10-24T10:35:58.0583463Z ╰──── 2026-10-24T10:35:58.0583559Z  help: Consider removing this import. 2026-10-24T10:35:58.0583561Z 2026-10-24T10:35:58.0584087Z ⚠ 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-24T10:35:58.0584264Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:169:7] 2026-10-24T10:35:58.0584327Z 168 │ }); 2026-10-24T10:35:58.0584530Z 169 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T10:35:58.0584725Z 170 │ │ if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break; 2026-10-24T10:35:58.0584831Z 171 │ │ yield* Effect.yieldNow; 2026-10-24T10:35:58.0584962Z 172 │ ╰─▶ } 2026-10-24T10:35:58.0585018Z 173 │ 2026-10-24T10:35:58.0585069Z ╰──── 2026-10-24T10:35:58.0585071Z 2026-10-24T10:35:58.0585604Z ⚠ 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-24T10:35:58.0585756Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:178:7] 2026-10-24T10:35:58.0585866Z 177 │ yield* Deferred.succeed(releaseSave, undefined); 2026-10-24T10:35:58.0586059Z 178 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T10:35:58.0586192Z 179 │ │ if ((yield* Ref.get(saved)).length > 0) break; 2026-10-24T10:35:58.0586295Z 180 │ │ yield* Effect.yieldNow; 2026-10-24T10:35:58.0586425Z 181 │ ╰─▶ } 2026-10-24T10:35:58.0586478Z 182 │ 2026-10-24T10:35:58.0586527Z ╰──── 2026-10-24T10:35:58.0586536Z 2026-10-24T10:35:58.0587000Z ⚠ 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-24T10:35:58.0587146Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7] 2026-10-24T10:35:58.0587273Z 306 │ yield* Deferred.succeed(releaseUnenrichedSave, undefined); 2026-10-24T10:35:58.0587462Z 307 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T10:35:58.0587585Z 308 │ │ const values = yield* Ref.get(saved); 2026-10-24T10:35:58.0587783Z 309 │ │ if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) { 2026-10-24T10:35:58.0587875Z 310 │ │ break; 2026-10-24T10:35:58.0587955Z 311 │ │ } 2026-10-24T10:35:58.0588060Z 312 │ │ yield* Effect.yieldNow; 2026-10-24T10:35:58.0588190Z 313 │ ╰─▶ } 2026-10-24T10:35:58.0588244Z 314 │ 2026-10-24T10:35:58.0588293Z ╰──── 2026-10-24T10:35:58.0588296Z 2026-10-24T10:35:58.0588638Z ⚠ 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-24T10:35:58.0588783Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:50:18] 2026-10-24T10:35:58.0588947Z 49 │ for (const tool of ["sendMessage", "followupTask", "interruptAgent", "listAgents"]) { 2026-10-24T10:35:58.0589183Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-24T10:35:58.0589303Z ·  ───────── 2026-10-24T10:35:58.0589482Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-24T10:35:58.0589533Z ╰──── 2026-10-24T10:35:58.0589535Z 2026-10-24T10:35:58.0589869Z ⚠ 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-24T10:35:58.0590013Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:51:18] 2026-10-24T10:35:58.0590181Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-24T10:35:58.0590363Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-24T10:35:58.0590451Z ·  ───────── 2026-10-24T10:35:58.0590504Z 52 │ } 2026-10-24T10:35:58.0590554Z ╰──── 2026-10-24T10:35:58.0590557Z 2026-10-24T10:35:58.0590896Z ⚠ 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-24T10:35:58.0591038Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:55:5] 2026-10-24T10:35:58.0591127Z 54 │ assert.equal( 2026-10-24T10:35:58.0591302Z 55 │ Schema.is(CodexSchema.ServerNotification__CollabAgentToolCallStatus)("interrupted"), 2026-10-24T10:35:58.0591374Z ·  ───────── 2026-10-24T10:35:58.0591430Z 56 │ true, 2026-10-24T10:35:58.0591479Z ╰──── 2026-10-24T10:35:58.0591483Z 2026-10-24T10:35:58.0591827Z ⚠ 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-24T10:35:58.0591970Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:59:5] 2026-10-24T10:35:58.0592032Z 58 │ assert.equal( 2026-10-24T10:35:58.0592217Z 59 │ Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentToolCallStatus)("interrupted"), 2026-10-24T10:35:58.0592287Z ·  ───────── 2026-10-24T10:35:58.0592345Z 60 │ true, 2026-10-24T10:35:58.0592394Z ╰──── 2026-10-24T10:35:58.0592397Z 2026-10-24T10:35:58.0592731Z ⚠ 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-24T10:35:58.0592878Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:103:16] 2026-10-24T10:35:58.0592934Z 102 │ 2026-10-24T10:35:58.0593108Z 103 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse)(resumeResponse), true); 2026-10-24T10:35:58.0593191Z ·  ───────── 2026-10-24T10:35:58.0593243Z 104 │ }); 2026-10-24T10:35:58.0593294Z ╰──── 2026-10-24T10:35:58.0593296Z 2026-10-24T10:35:58.0593556Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T10:35:58.0593718Z ╭─[apps/server/src/orchestration-v2/ThreadPullRequestService.ts:413:7] 2026-10-24T10:35:58.0593770Z 412 │ 2026-10-24T10:35:58.0593899Z 413 │ const layer = Layer.effect(ThreadPullRequestServiceV2, make); 2026-10-24T10:35:58.0593969Z ·  ──┬── 2026-10-24T10:35:58.0594094Z · ╰── 'layer' is declared here 2026-10-24T10:35:58.0594196Z ╰──── 2026-10-24T10:35:58.0594332Z  help: Consider removing this declaration. 2026-10-24T10:35:58.0594335Z 2026-10-24T10:35:58.0594505Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T10:35:58.0594655Z ╭─[apps/web/src/components/chat/useThreadLifecycle.tsx:178:58] 2026-10-24T10:35:58.0594764Z 177 │ if (snoozeClockState.shell !== activeThreadShell) { 2026-10-24T10:35:58.0594926Z 178 │ setSnoozeClockState({ shell: activeThreadShell, now: new Date().toISOString() }); 2026-10-24T10:35:58.0595049Z ·  ─────┬──── 2026-10-24T10:35:58.0595224Z · ╰── Cannot call impure function 2026-10-24T10:35:58.0595276Z 179 │ } 2026-10-24T10:35:58.0595333Z ╰──── 2026-10-24T10:35:58.0595622Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T10:35:58.0595929Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T10:35:58.0595931Z 2026-10-24T10:35:58.0596195Z ⚠ eslint(no-unused-vars): Function 'promptResponseHasMissingXAiStopReason' is declared but never used. 2026-10-24T10:35:58.0596348Z ╭─[packages/provider-grok/src/server/xaiAcpExtension.ts:1620:10] 2026-10-24T10:35:58.0596402Z 1619 │ 2026-10-24T10:35:58.0596617Z 1620 │ function promptResponseHasMissingXAiStopReason(response: EffectAcpSchema.PromptResponse): boolean { 2026-10-24T10:35:58.0596740Z ·  ──────────────────┬────────────────── 2026-10-24T10:35:58.0596951Z · ╰── 'promptResponseHasMissingXAiStopReason' is declared here 2026-10-24T10:35:58.0597030Z 1621 │ const meta = response._meta; 2026-10-24T10:35:58.0597081Z ╰──── 2026-10-24T10:35:58.0597184Z  help: Consider removing this declaration. 2026-10-24T10:35:58.0597187Z 2026-10-24T10:35:58.0597453Z ⚠ eslint(no-unused-vars): Variable 'layerDaemon' is declared but never used. Unused variables should start with a '_'. 2026-10-24T10:35:58.0597590Z ╭─[apps/server/src/orchestration-v2/EffectWorker.ts:914:7] 2026-10-24T10:35:58.0597641Z 913 │ 2026-10-24T10:35:58.0597833Z 914 │ const layerDaemon: Layer.Layer = Layer.effectDiscard( 2026-10-24T10:35:58.0597908Z ·  ─────┬───── 2026-10-24T10:35:58.0598051Z · ╰── 'layerDaemon' is declared here 2026-10-24T10:35:58.0598140Z 915 │ runDaemon.pipe(Effect.forkScoped), 2026-10-24T10:35:58.0598191Z ╰──── 2026-10-24T10:35:58.0598292Z  help: Consider removing this declaration. 2026-10-24T10:35:58.0598294Z 2026-10-24T10:35:58.0598670Z ⚠ 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-24T10:35:58.0598794Z ╭─[apps/server/src/auth/RpcAuthorization.ts:237:17] 2026-10-24T10:35:58.0598933Z 236 │ const requiredScopesForSettingsUpdate = (payload: unknown) => { 2026-10-24T10:35:58.0599067Z 237 │ const input = Schema.decodeUnknownSync(SettingsUpdate)(payload); 2026-10-24T10:35:58.0599231Z ·  ──────────────────────── 2026-10-24T10:35:58.0599402Z 238 │ const scopes = requiredScopesForServerSettingsPatch(input.patch); 2026-10-24T10:35:58.0599452Z ╰──── 2026-10-24T10:35:58.0599455Z 2026-10-24T10:35:58.0599823Z ⚠ 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-24T10:35:58.0599945Z ╭─[apps/server/src/auth/RpcAuthorization.ts:256:26] 2026-10-24T10:35:58.0600045Z 255 │ if (method === WS_METHODS.assetsCreateUrl) { 2026-10-24T10:35:58.0600203Z 256 │ const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload); 2026-10-24T10:35:58.0600315Z ·  ──────────────────────── 2026-10-24T10:35:58.0600374Z 257 │ return [ 2026-10-24T10:35:58.0600425Z ╰──── 2026-10-24T10:35:58.0600427Z 2026-10-24T10:35:58.0600688Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T10:35:58.0600820Z ╭─[packages/provider-grok/src/server/adapter.ts:408:7] 2026-10-24T10:35:58.0600870Z 407 │ 2026-10-24T10:35:58.0600941Z 408 │ const layer: Layer.Layer< 2026-10-24T10:35:58.0601010Z ·  ──┬── 2026-10-24T10:35:58.0601158Z · ╰── 'layer' is declared here 2026-10-24T10:35:58.0601249Z 409 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T10:35:58.0601300Z ╰──── 2026-10-24T10:35:58.0601402Z  help: Consider removing this declaration. 2026-10-24T10:35:58.0601405Z 2026-10-24T10:35:58.0601607Z ⚠ eslint(no-unused-vars): Identifier 'identity' is imported but never used. 2026-10-24T10:35:58.0601713Z ╭─[apps/server/src/auth/http.ts:28:10] 2026-10-24T10:35:58.0601804Z 27 │ import * as Schema from "effect/Schema"; 2026-10-24T10:35:58.0601897Z 28 │ import { identity } from "effect/Function"; 2026-10-24T10:35:58.0601972Z ·  ────┬─── 2026-10-24T10:35:58.0602106Z · ╰── 'identity' is imported here 2026-10-24T10:35:58.0602190Z 29 │ import * as Layer from "effect/Layer"; 2026-10-24T10:35:58.0602240Z ╰──── 2026-10-24T10:35:58.0602337Z  help: Consider removing this import. 2026-10-24T10:35:58.0602339Z 2026-10-24T10:35:58.0602809Z ⚠ 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-24T10:35:58.0602989Z ╭─[packages/contracts/src/baseSchemas.test.ts:39:9] 2026-10-24T10:35:58.0603086Z 38 │ JSON.stringify( 2026-10-24T10:35:58.0603205Z 39 │ Schema.encodeUnknownSync(Schema.toCodecJson(Named))([ 2026-10-24T10:35:58.0603301Z ·  ──────────────────────── 2026-10-24T10:35:58.0603366Z 40 │ { name: "a" }, 2026-10-24T10:35:58.0603416Z ╰──── 2026-10-24T10:35:58.0603419Z 2026-10-24T10:35:58.0603872Z ⚠ 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-24T10:35:58.0604008Z ╭─[packages/contracts/src/composerContext.test.ts:181:18] 2026-10-24T10:35:58.0604142Z 180 │ it("sends a message without the records the wire cannot carry", () => { 2026-10-24T10:35:58.0604329Z 181 │ const wire = Schema.encodeUnknownSync(Schema.toCodecJson(OrchestrationMessageContext))({ 2026-10-24T10:35:58.0604438Z ·  ──────────────────────── 2026-10-24T10:35:58.0604503Z 182 │ version: 1, 2026-10-24T10:35:58.0604553Z ╰──── 2026-10-24T10:35:58.0604555Z 2026-10-24T10:35:58.0604926Z ⚠ 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-24T10:35:58.0605039Z ╭─[packages/contracts/src/auth.test.ts:17:12] 2026-10-24T10:35:58.0605200Z 16 │ it("decodes legacy review credentials without offering them in new grants", () => { 2026-10-24T10:35:58.0605370Z 17 │ expect(Schema.decodeUnknownSync(AuthEnvironmentScopes)(["review:write"])).toEqual([ 2026-10-24T10:35:58.0605476Z ·  ──────────────────────── 2026-10-24T10:35:58.0605544Z 18 │ "review:write", 2026-10-24T10:35:58.0605594Z ╰──── 2026-10-24T10:35:58.0605596Z 2026-10-24T10:35:58.0605965Z ⚠ 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-24T10:35:58.0606074Z ╭─[packages/contracts/src/auth.test.ts:20:18] 2026-10-24T10:35:58.0606130Z 19 │ ]); 2026-10-24T10:35:58.0606295Z 20 │ expect(() => Schema.decodeUnknownSync(AuthGrantScopes)(["review:write"])).toThrow(); 2026-10-24T10:35:58.0606399Z ·  ──────────────────────── 2026-10-24T10:35:58.0606531Z 21 │ expect(AuthStandardClientScopes).not.toContain("review:write"); 2026-10-24T10:35:58.0606580Z ╰──── 2026-10-24T10:35:58.0606583Z 2026-10-24T10:35:58.0606957Z ⚠ 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-24T10:35:58.0607070Z ╭─[packages/contracts/src/auth.test.ts:58:21] 2026-10-24T10:35:58.0607242Z 57 │ it("ignores unknown response permissions without falling back to broader scopes", () => { 2026-10-24T10:35:58.0607365Z 58 │ const session = Schema.decodeUnknownSync(AuthSessionState)({ 2026-10-24T10:35:58.0607475Z ·  ──────────────────────── 2026-10-24T10:35:58.0607543Z 59 │ authenticated: true, 2026-10-24T10:35:58.0607593Z ╰──── 2026-10-24T10:35:58.0607596Z 2026-10-24T10:35:58.0607795Z ⚠ eslint(no-unused-vars): Type 'EnvironmentId' is imported but never used. 2026-10-24T10:35:58.0607986Z ╭─[packages/client-runtime/src/state/sharedSettings.ts:2:3] 2026-10-24T10:35:58.0608079Z 1 │ import type { 2026-10-24T10:35:58.0608141Z 2 │ EnvironmentId, 2026-10-24T10:35:58.0608215Z ·  ──────┬────── 2026-10-24T10:35:58.0608351Z · ╰── 'EnvironmentId' is imported here 2026-10-24T10:35:58.0608437Z 3 │ ExecutionEnvironmentCapabilities, 2026-10-24T10:35:58.0608486Z ╰──── 2026-10-24T10:35:58.0608585Z  help: Consider removing this import. 2026-10-24T10:35:58.0608587Z 2026-10-24T10:35:58.0608786Z ⚠ eslint(no-unused-vars): Identifier 'Duration' is imported but never used. 2026-10-24T10:35:58.0608922Z ╭─[packages/provider-pi/src/server/adapter.test.ts:24:13] 2026-10-24T10:35:58.0609016Z 23 │ import * as Deferred from "effect/Deferred"; 2026-10-24T10:35:58.0609114Z 24 │ import * as Duration from "effect/Duration"; 2026-10-24T10:35:58.0609195Z ·  ────┬─── 2026-10-24T10:35:58.0609333Z · ╰── 'Duration' is imported here 2026-10-24T10:35:58.0609419Z 25 │ import * as Effect from "effect/Effect"; 2026-10-24T10:35:58.0609468Z ╰──── 2026-10-24T10:35:58.0609563Z  help: Consider removing this import. 2026-10-24T10:35:58.0609566Z 2026-10-24T10:35:58.0609756Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-24T10:35:58.0609881Z ╭─[packages/client-runtime/src/state/shell.ts:189:5] 2026-10-24T10:35:58.0609990Z 186 │ let waiting = yield* Ref.get(awaitingCompletion); 2026-10-24T10:35:58.0610059Z 187 │ let next = initial; 2026-10-24T10:35:58.0610130Z ·  ──┬─ 2026-10-24T10:35:58.0610259Z · ╰── From this accumulator 2026-10-24T10:35:58.0610339Z 188 │ let receivedSnapshot = false; 2026-10-24T10:35:58.0610414Z 189 │ for (const item of items) { 2026-10-24T10:35:58.0610482Z ·  ─┬─ 2026-10-24T10:35:58.0610587Z · ╰── For this loop 2026-10-24T10:35:58.0610674Z 190 │ if (item.kind === "synchronized") { 2026-10-24T10:35:58.0610740Z 191 │ waiting = false; 2026-10-24T10:35:58.0610830Z 192 │ if (Option.isSome(next.snapshot)) { 2026-10-24T10:35:58.0610948Z 193 │ next = { ...next, status: "live", error: Option.none() }; 2026-10-24T10:35:58.0611032Z ·  ───┬─── 2026-10-24T10:35:58.0611196Z · ╰── From this spread 2026-10-24T10:35:58.0611255Z 194 │ } 2026-10-24T10:35:58.0611312Z ╰──── 2026-10-24T10:35:58.0611473Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-24T10:35:58.0611631Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T10:35:58.0611634Z 2026-10-24T10:35:58.0611837Z ⚠ eslint(no-unsafe-optional-chaining): Unsafe usage of optional chaining 2026-10-24T10:35:58.0612005Z ╭─[apps/server/src/orchestration-v2/ThreadLaunchService.test.ts:1783:8] 2026-10-24T10:35:58.0612069Z 1782 │ assert.equal( 2026-10-24T10:35:58.0612216Z 1783 │ (stored.context?.records[0] as { attachmentId: string }).attachmentId, 2026-10-24T10:35:58.0612319Z ·  ────────────────────────── 2026-10-24T10:35:58.0612400Z 1784 │ stored.attachments[0]?.id, 2026-10-24T10:35:58.0612450Z ╰──── 2026-10-24T10:35:58.0612689Z  help: If this short-circuits with 'undefined' the evaluation will throw TypeError 2026-10-24T10:35:58.0612728Z 2026-10-24T10:35:58.0613210Z ⚠ 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-24T10:35:58.0613380Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7] 2026-10-24T10:35:58.0613482Z 565 │ let afterSequence = created[0]!.sequence; 2026-10-24T10:35:58.0613683Z 566 │ ╭─▶ for (let index = 1; index <= 32; index += 1) { 2026-10-24T10:35:58.0613786Z 567 │ │ const nextEvent = { 2026-10-24T10:35:58.0613952Z 568 │ │ id: EventId.make(`event:foundation-stream-race:${index}`), 2026-10-24T10:35:58.0614086Z 569 │ │ type: "thread.metadata-updated" as const, 2026-10-24T10:35:58.0614175Z 570 │ │ threadId, 2026-10-24T10:35:58.0614280Z 571 │ │ providerInstanceId, 2026-10-24T10:35:58.0614380Z 572 │ │ occurredAt: now, 2026-10-24T10:35:58.0614531Z 573 │ │ payload: { ...thread, title: `Race update ${index}` }, 2026-10-24T10:35:58.0614657Z 574 │ │ } satisfies OrchestrationV2DomainEvent; 2026-10-24T10:35:58.0614772Z 575 │ │ const reader = yield* eventSink 2026-10-24T10:35:58.0614893Z 576 │ │ .stream({ threadId, afterSequence }) 2026-10-24T10:35:58.0615032Z 577 │ │ .pipe(Stream.runHead, Effect.forkChild); 2026-10-24T10:35:58.0615140Z 578 │ │ yield* Effect.yieldNow; 2026-10-24T10:35:58.0615305Z 579 │ │ const written = yield* eventSink.write({ events: [nextEvent] }); 2026-10-24T10:35:58.0615434Z 580 │ │ const received = yield* Fiber.join(reader); 2026-10-24T10:35:58.0615548Z 581 │ │ if (Option.isNone(received)) { 2026-10-24T10:35:58.0615748Z 582 │ │ return yield* Effect.die("The event stream ended before delivering the live event."); 2026-10-24T10:35:58.0615827Z 583 │ │ } 2026-10-24T10:35:58.0615989Z 584 │ │ assert.equal(received.value.sequence, written[0]?.sequence); 2026-10-24T10:35:58.0616141Z 585 │ │ assert.equal(received.value.event.id, nextEvent.id); 2026-10-24T10:35:58.0616272Z 586 │ │ afterSequence = received.value.sequence; 2026-10-24T10:35:58.0616403Z 587 │ ╰─▶ } 2026-10-24T10:35:58.0616461Z 588 │ }), 2026-10-24T10:35:58.0616513Z ╰──── 2026-10-24T10:35:58.0616515Z 2026-10-24T10:35:58.0616979Z ⚠ 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-24T10:35:58.0617154Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:2327:9] 2026-10-24T10:35:58.0617232Z 2326 │ let settled = false; 2026-10-24T10:35:58.0617446Z 2327 │ ╭─▶ while (!settled) { 2026-10-24T10:35:58.0617634Z 2328 │ │ settled = (yield* outbox.listByCommandId(commandId)).every( 2026-10-24T10:35:58.0617766Z 2329 │ │ (effect) => effect.status === "succeeded", 2026-10-24T10:35:58.0617848Z 2330 │ │ ); 2026-10-24T10:35:58.0617972Z 2331 │ │ if (!settled) yield* Effect.yieldNow; 2026-10-24T10:35:58.0618107Z 2332 │ ╰─▶ } 2026-10-24T10:35:58.0618225Z 2333 │ }).pipe(Effect.provide(layerWorker), Effect.scoped); 2026-10-24T10:35:58.0618277Z ╰──── 2026-10-24T10:35:58.0618279Z 2026-10-24T10:35:58.0618758Z ⚠ 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-24T10:35:58.0618897Z ╭─[packages/client-runtime/src/rpc/session.test.ts:226:3] 2026-10-24T10:35:58.0618952Z 225 │ ) { 2026-10-24T10:35:58.0619156Z 226 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T10:35:58.0619268Z 227 │ │ const socket = sockets[index]; 2026-10-24T10:35:58.0619356Z 228 │ │ if (socket) { 2026-10-24T10:35:58.0619448Z 229 │ │ return socket; 2026-10-24T10:35:58.0619521Z 230 │ │ } 2026-10-24T10:35:58.0619622Z 231 │ │ yield* Effect.yieldNow; 2026-10-24T10:35:58.0619746Z 232 │ ╰─▶ } 2026-10-24T10:35:58.0619928Z 233 │ return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket.")); 2026-10-24T10:35:58.0619981Z ╰──── 2026-10-24T10:35:58.0619983Z 2026-10-24T10:35:58.0620444Z ⚠ 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-24T10:35:58.0620578Z ╭─[packages/client-runtime/src/rpc/session.test.ts:240:3] 2026-10-24T10:35:58.0620634Z 239 │ ) { 2026-10-24T10:35:58.0620838Z 240 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T10:35:58.0621055Z 241 │ │ const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index]; 2026-10-24T10:35:58.0621181Z 242 │ │ if (request) { 2026-10-24T10:35:58.0621278Z 243 │ │ return request; 2026-10-24T10:35:58.0621350Z 244 │ │ } 2026-10-24T10:35:58.0621450Z 245 │ │ yield* Effect.yieldNow; 2026-10-24T10:35:58.0621574Z 246 │ ╰─▶ } 2026-10-24T10:35:58.0621741Z 247 │ return yield* Effect.die(new Error("Expected the RPC protocol to send a request.")); 2026-10-24T10:35:58.0621791Z ╰──── 2026-10-24T10:35:58.0621793Z 2026-10-24T10:35:58.0622267Z ⚠ 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-24T10:35:58.0622456Z ╭─[packages/client-runtime/src/rpc/client.test.ts:131:9] 2026-10-24T10:35:58.0622544Z 130 │ ) { 2026-10-24T10:35:58.0622752Z 131 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T10:35:58.0622875Z 132 │ │ if (subscriptions.length >= count) { 2026-10-24T10:35:58.0622967Z 133 │ │ return; 2026-10-24T10:35:58.0623049Z 134 │ │ } 2026-10-24T10:35:58.0623156Z 135 │ │ yield* Effect.yieldNow; 2026-10-24T10:35:58.0623287Z 136 │ ╰─▶ } 2026-10-24T10:35:58.0623452Z 137 │ return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`)); 2026-10-24T10:35:58.0623503Z ╰──── 2026-10-24T10:35:58.0623506Z 2026-10-24T10:35:58.0623976Z ⚠ 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-24T10:35:58.0624112Z ╭─[packages/client-runtime/src/rpc/client.test.ts:252:7] 2026-10-24T10:35:58.0624276Z 251 │ yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient))); 2026-10-24T10:35:58.0624532Z 252 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) { 2026-10-24T10:35:58.0624638Z 253 │ │ yield* Effect.yieldNow; 2026-10-24T10:35:58.0624769Z 254 │ ╰─▶ } 2026-10-24T10:35:58.0624897Z 255 │ yield* SubscriptionRef.set(activeSession, Option.none()); 2026-10-24T10:35:58.0624952Z ╰──── 2026-10-24T10:35:58.0624955Z 2026-10-24T10:35:58.0625501Z ⚠ 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-24T10:35:58.0625634Z ╭─[packages/client-runtime/src/rpc/client.test.ts:258:7] 2026-10-24T10:35:58.0625689Z 257 │ 2026-10-24T10:35:58.0625942Z 258 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-24T10:35:58.0626047Z 259 │ │ yield* Effect.yieldNow; 2026-10-24T10:35:58.0626250Z 260 │ ╰─▶ } 2026-10-24T10:35:58.0626394Z 261 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-24T10:35:58.0626444Z ╰──── 2026-10-24T10:35:58.0626446Z 2026-10-24T10:35:58.0626919Z ⚠ 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-24T10:35:58.0627051Z ╭─[packages/client-runtime/src/rpc/client.test.ts:322:7] 2026-10-24T10:35:58.0627111Z 321 │ ); 2026-10-24T10:35:58.0627368Z 322 │ ╭─▶ for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) { 2026-10-24T10:35:58.0627472Z 323 │ │ yield* Effect.yieldNow; 2026-10-24T10:35:58.0627609Z 324 │ ╰─▶ } 2026-10-24T10:35:58.0627667Z 325 │ 2026-10-24T10:35:58.0627717Z ╰──── 2026-10-24T10:35:58.0627720Z 2026-10-24T10:35:58.0628181Z ⚠ 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-24T10:35:58.0628313Z ╭─[packages/client-runtime/src/rpc/client.test.ts:330:7] 2026-10-24T10:35:58.0628478Z 329 │ yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient))); 2026-10-24T10:35:58.0628728Z 330 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-24T10:35:58.0628836Z 331 │ │ yield* Effect.yieldNow; 2026-10-24T10:35:58.0628967Z 332 │ ╰─▶ } 2026-10-24T10:35:58.0629070Z 333 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-24T10:35:58.0629121Z ╰──── 2026-10-24T10:35:58.0629123Z 2026-10-24T10:35:58.0629391Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-24T10:35:58.0629525Z ╭─[apps/server/src/telemetry/AnalyticsService.ts:340:7] 2026-10-24T10:35:58.0629578Z 339 │ 2026-10-24T10:35:58.0629679Z 340 │ const layerTest = AnalyticsService.layerTest; 2026-10-24T10:35:58.0629753Z ·  ────┬──── 2026-10-24T10:35:58.0629888Z · ╰── 'layerTest' is declared here 2026-10-24T10:35:58.0629940Z ╰──── 2026-10-24T10:35:58.0630052Z  help: Consider removing this declaration. 2026-10-24T10:35:58.0630058Z 2026-10-24T10:35:58.0630317Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T10:35:58.0630448Z ╭─[packages/provider-pi/src/server/adapter.ts:3405:7] 2026-10-24T10:35:58.0630500Z 3404 │ 2026-10-24T10:35:58.0630689Z 3405 │ const layer: Layer.Layer = 2026-10-24T10:35:58.0630760Z ·  ──┬── 2026-10-24T10:35:58.0630885Z · ╰── 'layer' is declared here 2026-10-24T10:35:58.0630949Z 3406 │ Layer.effect( 2026-10-24T10:35:58.0631001Z ╰──── 2026-10-24T10:35:58.0631134Z  help: Consider removing this declaration. 2026-10-24T10:35:58.0631136Z 2026-10-24T10:35:58.0631669Z ⚠ 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-24T10:35:58.0631860Z ╭─[packages/client-runtime/src/connection/supervisor.test.ts:135:3] 2026-10-24T10:35:58.0631973Z 134 │ let lastState = yield* SubscriptionRef.get(state); 2026-10-24T10:35:58.0632185Z 135 │ ╭─▶ for (let iteration = 0; iteration < 100; iteration += 1) { 2026-10-24T10:35:58.0632320Z 136 │ │ lastState = yield* SubscriptionRef.get(state); 2026-10-24T10:35:58.0632426Z 137 │ │ if (predicate(lastState)) { 2026-10-24T10:35:58.0632525Z 138 │ │ return lastState; 2026-10-24T10:35:58.0632605Z 139 │ │ } 2026-10-24T10:35:58.0632706Z 140 │ │ yield* Effect.yieldNow; 2026-10-24T10:35:58.0632831Z 141 │ ╰─▶ } 2026-10-24T10:35:58.0632906Z 142 │ return yield* Effect.die( 2026-10-24T10:35:58.0632957Z ╰──── 2026-10-24T10:35:58.0632959Z 2026-10-24T10:35:58.0633171Z ⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used. 2026-10-24T10:35:58.0633310Z ╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10] 2026-10-24T10:35:58.0633361Z 21 │ 2026-10-24T10:35:58.0633519Z 22 │ function summarizePayload(payload: unknown): Readonly> { 2026-10-24T10:35:58.0633605Z ·  ────────┬─────── 2026-10-24T10:35:58.0633763Z · ╰── 'summarizePayload' is declared here 2026-10-24T10:35:58.0633871Z 23 │ if (payload === null) return { valueType: "null" }; 2026-10-24T10:35:58.0633921Z ╰──── 2026-10-24T10:35:58.0634024Z  help: Consider removing this declaration. 2026-10-24T10:35:58.0634026Z 2026-10-24T10:35:58.0634217Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T10:35:58.0634375Z ╭─[apps/mobile/src/features/threads/ThreadQueueControl.tsx:602:27] 2026-10-24T10:35:58.0634545Z 601 │ const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success)); 2026-10-24T10:35:58.0634621Z 602 │ const gesture = Gesture.Pan() 2026-10-24T10:35:58.0634708Z ·  ─┬─ 2026-10-24T10:35:58.0634854Z · ╰── `Pan` may be a component 2026-10-24T10:35:58.0634932Z 603 │ .enabled(!props.disabled) 2026-10-24T10:35:58.0634983Z ╰──── 2026-10-24T10:35:58.0635266Z  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-24T10:35:58.0635726Z  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-24T10:35:58.0635728Z 2026-10-24T10:35:58.0635937Z ⚠ eslint(no-unused-vars): Identifier 'HostProcess' is imported but never used. 2026-10-24T10:35:58.0636101Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:25:13] 2026-10-24T10:35:58.0636240Z 24 │ import * as Schema from "effect/Schema"; 2026-10-24T10:35:58.0636387Z 25 │ import * as HostProcess from "@t3tools/shared/HostProcess"; 2026-10-24T10:35:58.0636470Z ·  ─────┬───── 2026-10-24T10:35:58.0636611Z · ╰── 'HostProcess' is imported here 2026-10-24T10:35:58.0636661Z 26 │ 2026-10-24T10:35:58.0636712Z ╰──── 2026-10-24T10:35:58.0636810Z  help: Consider removing this import. 2026-10-24T10:35:58.0636813Z 2026-10-24T10:35:58.0637085Z ⚠ eslint(no-unused-vars): Variable 'serverConfig' is declared but never used. Unused variables should start with a '_'. 2026-10-24T10:35:58.0637249Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:124:11] 2026-10-24T10:35:58.0637333Z 123 │ const path = yield* Path.Path; 2026-10-24T10:35:58.0637457Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-24T10:35:58.0637541Z ·  ──────┬───── 2026-10-24T10:35:58.0637678Z · ╰── 'serverConfig' is declared here 2026-10-24T10:35:58.0637821Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-24T10:35:58.0637872Z ╰──── 2026-10-24T10:35:58.0637975Z  help: Consider removing this declaration. 2026-10-24T10:35:58.0637978Z 2026-10-24T10:35:58.0638251Z ⚠ eslint(no-unused-vars): Variable 'serverSettings' is declared but never used. Unused variables should start with a '_'. 2026-10-24T10:35:58.0638412Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:125:11] 2026-10-24T10:35:58.0638528Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-24T10:35:58.0638674Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-24T10:35:58.0638761Z ·  ───────┬────── 2026-10-24T10:35:58.0638904Z · ╰── 'serverSettings' is declared here 2026-10-24T10:35:58.0639041Z 126 │ const gitWorkflow = yield* GitWorkflowService.GitWorkflowService; 2026-10-24T10:35:58.0639091Z ╰──── 2026-10-24T10:35:58.0639193Z  help: Consider removing this declaration. 2026-10-24T10:35:58.0639196Z 2026-10-24T10:35:58.0639349Z ⚠ react(immutability): This value cannot be modified 2026-10-24T10:35:58.0639513Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:42:5] 2026-10-24T10:35:58.0639563Z 35 │ 2026-10-24T10:35:58.0639702Z 36 │ const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0); 2026-10-24T10:35:58.0639793Z ·  ────────┬──────── 2026-10-24T10:35:58.0639946Z · ╰── `inspectorProgress` originates here 2026-10-24T10:35:58.0640041Z 37 │ const { renderedInspectorWidth } = props; 2026-10-24T10:35:58.0640175Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-24T10:35:58.0640224Z 39 │ 2026-10-24T10:35:58.0640305Z 40 │ const onClosed = props.onClosed; 2026-10-24T10:35:58.0640370Z 41 │ useEffect(() => { 2026-10-24T10:35:58.0640459Z 42 │ inspectorProgress.value = withTiming( 2026-10-24T10:35:58.0640540Z ·  ────────┬──────── 2026-10-24T10:35:58.0640689Z · ╰── `inspectorProgress` cannot be modified 2026-10-24T10:35:58.0640767Z 43 │ inspectorVisible ? 1 : 0, 2026-10-24T10:35:58.0640817Z ╰──── 2026-10-24T10:35:58.0641175Z  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-24T10:35:58.0641524Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:35:58.0641527Z 2026-10-24T10:35:58.0641681Z ⚠ react(immutability): This value cannot be modified 2026-10-24T10:35:58.0641840Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:67:7] 2026-10-24T10:35:58.0641932Z 37 │ const { renderedInspectorWidth } = props; 2026-10-24T10:35:58.0642065Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-24T10:35:58.0642155Z ·  ──────────┬───────── 2026-10-24T10:35:58.0642320Z · ╰── `renderedContentWidth` originates here 2026-10-24T10:35:58.0642373Z 39 │ 2026-10-24T10:35:58.0642453Z 40 │ const onClosed = props.onClosed; 2026-10-24T10:35:58.0642517Z 41 │ useEffect(() => { 2026-10-24T10:35:58.0642605Z 42 │ inspectorProgress.value = withTiming( 2026-10-24T10:35:58.0642680Z 43 │ inspectorVisible ? 1 : 0, 2026-10-24T10:35:58.0642752Z 44 │ WORKSPACE_PANE_TIMING, 2026-10-24T10:35:58.0642818Z 45 │ (finished) => { 2026-10-24T10:35:58.0642957Z 46 │ if (finished === true && !inspectorVisible && onClosed !== undefined) { 2026-10-24T10:35:58.0643027Z 47 │ runOnJS(onClosed)(); 2026-10-24T10:35:58.0643085Z 48 │ } 2026-10-24T10:35:58.0643141Z 49 │ }, 2026-10-24T10:35:58.0643194Z 50 │ ); 2026-10-24T10:35:58.0643324Z 51 │ const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0; 2026-10-24T10:35:58.0643409Z 52 │ renderedInspectorWidth.set( 2026-10-24T10:35:58.0643555Z 53 │ resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING), 2026-10-24T10:35:58.0643609Z 54 │ ); 2026-10-24T10:35:58.0643661Z 55 │ }, [ 2026-10-24T10:35:58.0643729Z 56 │ inspectorProgress, 2026-10-24T10:35:58.0643795Z 57 │ inspectorVisible, 2026-10-24T10:35:58.0643856Z 58 │ inspectorWidth, 2026-10-24T10:35:58.0643915Z 59 │ onClosed, 2026-10-24T10:35:58.0643986Z 60 │ renderedInspectorWidth, 2026-10-24T10:35:58.0644045Z 61 │ resizing, 2026-10-24T10:35:58.0644097Z 62 │ ]); 2026-10-24T10:35:58.0644147Z 63 │ 2026-10-24T10:35:58.0644209Z 64 │ useEffect(() => { 2026-10-24T10:35:58.0644299Z 65 │ const targetWidth = inspectorWidth ?? 0; 2026-10-24T10:35:58.0644382Z 66 │ if (!inspectorVisible || resizing) { 2026-10-24T10:35:58.0644486Z 67 │ renderedContentWidth.value = targetWidth; 2026-10-24T10:35:58.0644576Z ·  ──────────┬───────── 2026-10-24T10:35:58.0644736Z · ╰── `renderedContentWidth` cannot be modified 2026-10-24T10:35:58.0644794Z 68 │ return; 2026-10-24T10:35:58.0644844Z ╰──── 2026-10-24T10:35:58.0645108Z  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-24T10:35:58.0645419Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:35:58.0645421Z 2026-10-24T10:35:58.0645614Z ⚠ eslint(require-yield): This generator function does not have `yield` 2026-10-24T10:35:58.0645818Z ╭─[packages/provider-acp/src/server/mcpOverAcpBridge.ts:81:78] 2026-10-24T10:35:58.0645907Z  80 │ 2026-10-24T10:35:58.0646181Z  81 │ ╭─▶ export const makeAcpMcpOverAcpBridge = Effect.fn("AcpMcpOverAcpBridge.make")(function* ( 2026-10-24T10:35:58.0646303Z  82 │ │ options: AcpMcpOverAcpBridgeOptions, 2026-10-24T10:35:58.0646425Z  83 │ │ ): Effect.fn.Return { 2026-10-24T10:35:58.0646594Z  84 │ │ const fetchImplementation = options.fetchImplementation ?? fetch; 2026-10-24T10:35:58.0646730Z  85 │ │ const connections = new Map(); 2026-10-24T10:35:58.0646799Z  86 │ │ 2026-10-24T10:35:58.0647011Z  87 │ │ const connectionFor = (connectionId: string): Effect.Effect => 2026-10-24T10:35:58.0647121Z  88 │ │ Effect.suspend(() => { 2026-10-24T10:35:58.0647261Z  89 │ │ const connection = connections.get(connectionId); 2026-10-24T10:35:58.0647372Z  90 │ │ return connection === undefined 2026-10-24T10:35:58.0647589Z  91 │ │ ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`)) 2026-10-24T10:35:58.0647701Z  92 │ │ : Effect.succeed(connection); 2026-10-24T10:35:58.0647777Z  93 │ │ }); 2026-10-24T10:35:58.0647846Z  94 │ │ 2026-10-24T10:35:58.0647930Z  95 │ │ const send = ( 2026-10-24T10:35:58.0648030Z  96 │ │ connection: Connection, 2026-10-24T10:35:58.0648123Z  97 │ │ message: unknown, 2026-10-24T10:35:58.0648357Z  98 │ │ ): Effect.Effect, AcpMcpOverAcpError> => 2026-10-24T10:35:58.0648476Z  99 │ │ connection.mutex.withPermits(1)( 2026-10-24T10:35:58.0648583Z 100 │ │ Effect.gen(function* () { 2026-10-24T10:35:58.0648706Z 101 │ │ const body = JSON.stringify(message); 2026-10-24T10:35:58.0648848Z 102 │ │ if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) { 2026-10-24T10:35:58.0649058Z 103 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB.")); 2026-10-24T10:35:58.0649137Z 104 │ │ } 2026-10-24T10:35:58.0649270Z 105 │ │ const response = yield* Effect.tryPromise({ 2026-10-24T10:35:58.0649374Z 106 │ │ try: (signal) => 2026-10-24T10:35:58.0649508Z 107 │ │ fetchImplementation(options.endpoint, { 2026-10-24T10:35:58.0649609Z 108 │ │ method: "POST", 2026-10-24T10:35:58.0649701Z 109 │ │ signal, 2026-10-24T10:35:58.0649798Z 110 │ │ headers: { 2026-10-24T10:35:58.0649924Z 111 │ │ "content-type": "application/json", 2026-10-24T10:35:58.0650067Z 112 │ │ accept: "application/json, text/event-stream", 2026-10-24T10:35:58.0650200Z 113 │ │ authorization: options.authorization, 2026-10-24T10:35:58.0650326Z 114 │ │ ...(connection.sessionId === null 2026-10-24T10:35:58.0650420Z 115 │ │ ? {} 2026-10-24T10:35:58.0650627Z 116 │ │ : { "mcp-session-id": connection.sessionId }), 2026-10-24T10:35:58.0650795Z 117 │ │ ...(connection.protocolVersion === null 2026-10-24T10:35:58.0650887Z 118 │ │ ? {} 2026-10-24T10:35:58.0651055Z 119 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-24T10:35:58.0651185Z 120 │ │ }, 2026-10-24T10:35:58.0651276Z 121 │ │ body, 2026-10-24T10:35:58.0651360Z 122 │ │ }), 2026-10-24T10:35:58.0651463Z 123 │ │ catch: bridgeError, 2026-10-24T10:35:58.0651543Z 124 │ │ }); 2026-10-24T10:35:58.0651764Z 125 │ │ connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId; 2026-10-24T10:35:58.0651867Z 126 │ │ if (!response.ok) { 2026-10-24T10:35:58.0651975Z 127 │ │ yield* Effect.promise( 2026-10-24T10:35:58.0652160Z 128 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-24T10:35:58.0652242Z 129 │ │ ); 2026-10-24T10:35:58.0652353Z 130 │ │ return yield* Effect.fail( 2026-10-24T10:35:58.0652567Z 131 │ │ new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`), 2026-10-24T10:35:58.0652647Z 132 │ │ ); 2026-10-24T10:35:58.0652726Z 133 │ │ } 2026-10-24T10:35:58.0652947Z 134 │ │ const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))]; 2026-10-24T10:35:58.0653072Z 135 │ │ for (const payload of payloads) { 2026-10-24T10:35:58.0653292Z 136 │ │ connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion; 2026-10-24T10:35:58.0653369Z 137 │ │ } 2026-10-24T10:35:58.0653467Z 138 │ │ return payloads; 2026-10-24T10:35:58.0653592Z 139 │ │ }).pipe(Effect.mapError(bridgeError)), 2026-10-24T10:35:58.0653666Z 140 │ │ ); 2026-10-24T10:35:58.0653736Z 141 │ │ 2026-10-24T10:35:58.0653913Z 142 │ │ const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* ( 2026-10-24T10:35:58.0654095Z 143 │ │ request: AcpSchema.DisconnectMcpRequest, 2026-10-24T10:35:58.0654313Z 144 │ │ ): Effect.fn.Return { 2026-10-24T10:35:58.0654478Z 145 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T10:35:58.0654605Z 146 │ │ connections.delete(request.connectionId); 2026-10-24T10:35:58.0654728Z 147 │ │ const sessionId = connection.sessionId; 2026-10-24T10:35:58.0654832Z 148 │ │ if (sessionId !== null) { 2026-10-24T10:35:58.0654961Z 149 │ │ const response = yield* Effect.tryPromise({ 2026-10-24T10:35:58.0655058Z 150 │ │ try: (signal) => 2026-10-24T10:35:58.0655188Z 151 │ │ fetchImplementation(options.endpoint, { 2026-10-24T10:35:58.0655294Z 152 │ │ method: "DELETE", 2026-10-24T10:35:58.0655385Z 153 │ │ signal, 2026-10-24T10:35:58.0655479Z 154 │ │ headers: { 2026-10-24T10:35:58.0655610Z 155 │ │ authorization: options.authorization, 2026-10-24T10:35:58.0655727Z 156 │ │ "mcp-session-id": sessionId, 2026-10-24T10:35:58.0655858Z 157 │ │ ...(connection.protocolVersion === null 2026-10-24T10:35:58.0655948Z 158 │ │ ? {} 2026-10-24T10:35:58.0656111Z 159 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-24T10:35:58.0656194Z 160 │ │ }, 2026-10-24T10:35:58.0656281Z 161 │ │ }), 2026-10-24T10:35:58.0656383Z 162 │ │ catch: bridgeError, 2026-10-24T10:35:58.0656460Z 163 │ │ }); 2026-10-24T10:35:58.0656597Z 164 │ │ if (!response.ok && response.status !== 404) { 2026-10-24T10:35:58.0656706Z 165 │ │ return yield* Effect.fail( 2026-10-24T10:35:58.0656817Z 166 │ │ new AcpMcpOverAcpError( 2026-10-24T10:35:58.0657003Z 167 │ │ `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`, 2026-10-24T10:35:58.0657083Z 168 │ │ ), 2026-10-24T10:35:58.0657161Z 169 │ │ ); 2026-10-24T10:35:58.0657239Z 170 │ │ } 2026-10-24T10:35:58.0657343Z 171 │ │ yield* Effect.promise( 2026-10-24T10:35:58.0657532Z 172 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-24T10:35:58.0657612Z 173 │ │ ); 2026-10-24T10:35:58.0657687Z 174 │ │ } 2026-10-24T10:35:58.0657776Z 175 │ │ return {}; 2026-10-24T10:35:58.0657853Z 176 │ │ }); 2026-10-24T10:35:58.0657923Z 177 │ │ 2026-10-24T10:35:58.0658005Z 178 │ │ return { 2026-10-24T10:35:58.0658181Z 179 │ │ connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) { 2026-10-24T10:35:58.0658304Z 180 │ │ if (request.serverId !== "t3-code") { 2026-10-24T10:35:58.0658413Z 181 │ │ return yield* Effect.fail( 2026-10-24T10:35:58.0658663Z 182 │ │ new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`), 2026-10-24T10:35:58.0658779Z 183 │ │ ); 2026-10-24T10:35:58.0658858Z 184 │ │ } 2026-10-24T10:35:58.0658986Z 185 │ │ if (connections.size >= MAX_CONNECTIONS) { 2026-10-24T10:35:58.0659202Z 186 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections.")); 2026-10-24T10:35:58.0659279Z 187 │ │ } 2026-10-24T10:35:58.0659440Z 188 │ │ const connectionId = yield* options.allocateConnectionId; 2026-10-24T10:35:58.0659556Z 189 │ │ connections.set(connectionId, { 2026-10-24T10:35:58.0659676Z 190 │ │ mutex: yield* Semaphore.make(1), 2026-10-24T10:35:58.0659782Z 191 │ │ sessionId: null, 2026-10-24T10:35:58.0659895Z 192 │ │ protocolVersion: null, 2026-10-24T10:35:58.0659997Z 193 │ │ nextRequestId: 0, 2026-10-24T10:35:58.0660079Z 194 │ │ }); 2026-10-24T10:35:58.0660185Z 195 │ │ return { connectionId }; 2026-10-24T10:35:58.0660263Z 196 │ │ }), 2026-10-24T10:35:58.0660436Z 197 │ │ message: Effect.fn("mcpOverAcpBridge.message")(function* (request) { 2026-10-24T10:35:58.0660602Z 198 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T10:35:58.0660730Z 199 │ │ const id = ++connection.nextRequestId; 2026-10-24T10:35:58.0660860Z 200 │ │ const payloads = yield* send(connection, { 2026-10-24T10:35:58.0660964Z 201 │ │ jsonrpc: "2.0", 2026-10-24T10:35:58.0661051Z 202 │ │ id, 2026-10-24T10:35:58.0661192Z 203 │ │ method: request.method, 2026-10-24T10:35:58.0661359Z 204 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-24T10:35:58.0661436Z 205 │ │ }); 2026-10-24T10:35:58.0661631Z 206 │ │ const response = payloads.find((payload) => asEnvelope(payload)?.id === id); 2026-10-24T10:35:58.0661756Z 207 │ │ const envelope = asEnvelope(response); 2026-10-24T10:35:58.0661862Z 208 │ │ if (envelope === null) { 2026-10-24T10:35:58.0661974Z 209 │ │ return yield* Effect.fail( 2026-10-24T10:35:58.0662169Z 210 │ │ new AcpMcpOverAcpError("MCP server did not return a matching response."), 2026-10-24T10:35:58.0662254Z 211 │ │ ); 2026-10-24T10:35:58.0662333Z 212 │ │ } 2026-10-24T10:35:58.0662458Z 213 │ │ if (envelope.error !== undefined) { 2026-10-24T10:35:58.0662659Z 214 │ │ return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error))); 2026-10-24T10:35:58.0662740Z 215 │ │ } 2026-10-24T10:35:58.0662920Z 216 │ │ return (envelope.result ?? null) as AcpSchema.MessageMcpResponse; 2026-10-24T10:35:58.0663001Z 217 │ │ }), 2026-10-24T10:35:58.0663218Z 218 │ │ notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) { 2026-10-24T10:35:58.0663480Z 219 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T10:35:58.0663690Z 220 │ │ yield* send(connection, { 2026-10-24T10:35:58.0663815Z 221 │ │ jsonrpc: "2.0", 2026-10-24T10:35:58.0663956Z 222 │ │ method: request.method, 2026-10-24T10:35:58.0664150Z 223 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-24T10:35:58.0664357Z 224 │ │ }); 2026-10-24T10:35:58.0664461Z 225 │ │ }), 2026-10-24T10:35:58.0664592Z 226 │ │ disconnect, 2026-10-24T10:35:58.0664741Z 227 │ │ dispose: Effect.suspend(() => 2026-10-24T10:35:58.0664873Z 228 │ │ Effect.forEach( 2026-10-24T10:35:58.0665023Z 229 │ │ [...connections.keys()], 2026-10-24T10:35:58.0665291Z 230 │ │ (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore), 2026-10-24T10:35:58.0665432Z 231 │ │ { discard: true }, 2026-10-24T10:35:58.0665543Z 232 │ │ ), 2026-10-24T10:35:58.0665646Z 233 │ │ ), 2026-10-24T10:35:58.0665749Z 234 │ │ }; 2026-10-24T10:35:58.0665923Z 235 │ ╰─▶ }); 2026-10-24T10:35:58.0666009Z ╰──── 2026-10-24T10:35:58.0666300Z  help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed. 2026-10-24T10:35:58.0666303Z 2026-10-24T10:35:58.0666605Z ⚠ eslint(no-unused-vars): Variable 'layerUnavailable' is declared but never used. Unused variables should start with a '_'. 2026-10-24T10:35:58.0666815Z ╭─[apps/server/src/orchestration-v2/Orchestrator.ts:12366:7] 2026-10-24T10:35:58.0666903Z 12365 │ 2026-10-24T10:35:58.0667078Z 12366 │ const layerUnavailable: Layer.Layer = Layer.succeed( 2026-10-24T10:35:58.0667281Z ·  ────────┬─────── 2026-10-24T10:35:58.0667472Z · ╰── 'layerUnavailable' is declared here 2026-10-24T10:35:58.0667588Z 12367 │ OrchestratorV2, 2026-10-24T10:35:58.0667675Z ╰──── 2026-10-24T10:35:58.0667797Z  help: Consider removing this declaration. 2026-10-24T10:35:58.0667800Z 2026-10-24T10:35:58.0668184Z ⚠ eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'. 2026-10-24T10:35:58.0668414Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1444:7] 2026-10-24T10:35:58.0668502Z 1443 │ 2026-10-24T10:35:58.0668651Z 1444 │ const layerCodexAppServerClientFactoryCommand = ( 2026-10-24T10:35:58.0668787Z ·  ───────────────────┬─────────────────── 2026-10-24T10:35:58.0669050Z · ╰── 'layerCodexAppServerClientFactoryCommand' is declared here 2026-10-24T10:35:58.0669214Z 1445 │ options: CodexClient.CodexAppServerClientOptions & { 2026-10-24T10:35:58.0669300Z ╰──── 2026-10-24T10:35:58.0669427Z  help: Consider removing this declaration. 2026-10-24T10:35:58.0669614Z 2026-10-24T10:35:58.0669899Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T10:35:58.0670560Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1680:7] 2026-10-24T10:35:58.0670932Z 1679 │ 2026-10-24T10:35:58.0671176Z 1680 │ const layer: Layer.Layer< 2026-10-24T10:35:58.0671391Z ·  ──┬── 2026-10-24T10:35:58.0671687Z · ╰── 'layer' is declared here 2026-10-24T10:35:58.0671966Z 1681 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T10:35:58.0672217Z ╰──── 2026-10-24T10:35:58.0672432Z  help: Consider removing this declaration. 2026-10-24T10:35:58.0672591Z 2026-10-24T10:35:58.0672833Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:35:58.0673361Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:155:7] 2026-10-24T10:35:58.0673656Z 154 │ } 2026-10-24T10:35:58.0673899Z 155 │ }, [wrappedRender]); 2026-10-24T10:35:58.0674142Z ·  ──────┬────── 2026-10-24T10:35:58.0674477Z · ╰── Unnecessary dependency `wrappedRender` 2026-10-24T10:35:58.0674734Z 156 │ 2026-10-24T10:35:58.0674903Z ╰──── 2026-10-24T10:35:58.0675366Z  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-24T10:35:58.0676029Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0676376Z 2026-10-24T10:35:58.0676758Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T10:35:58.0677222Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:800:42] 2026-10-24T10:35:58.0677528Z 799 │ > 2026-10-24T10:35:58.0677763Z 800 │ 2026-10-24T10:35:58.0678118Z ·  ──────────────────── 2026-10-24T10:35:58.0678391Z 801 │ 2026-10-24T10:35:58.0678644Z ╰──── 2026-10-24T10:35:58.0678978Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T10:35:58.0679427Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T10:35:58.0679645Z 2026-10-24T10:35:58.0679932Z ⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`. 2026-10-24T10:35:58.0680321Z ╭─[apps/web/src/terminal/ghostty/core.ts:194:19] 2026-10-24T10:35:58.0680638Z 193 │ const count = Math.min(CHUNK_SIZE, graphemeLength - start); 2026-10-24T10:35:58.0680925Z 194 │ const codes = new Array(count); 2026-10-24T10:35:58.0681259Z ·  ──────────────────────── 2026-10-24T10:35:58.0681546Z 195 │ for (let index = 0; index < count; index += 1) { 2026-10-24T10:35:58.0681795Z ╰──── 2026-10-24T10:35:58.0682335Z  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-24T10:35:58.0682758Z 2026-10-24T10:35:58.0683018Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T10:35:58.0683656Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:1998:15] 2026-10-24T10:35:58.0683979Z 1997 │ assert.equal( 2026-10-24T10:35:58.0684306Z 1998 │ items.filter((item) => item.type === "assistant_message").at(-1)?.text, 2026-10-24T10:35:58.0684596Z ·  ────── 2026-10-24T10:35:58.0684848Z 1999 │ "authoritative answer", 2026-10-24T10:35:58.0685050Z ╰──── 2026-10-24T10:35:58.0685356Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T10:35:58.0685556Z 2026-10-24T10:35:58.0686078Z ⚠ 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-24T10:35:58.0686746Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:3951:7] 2026-10-24T10:35:58.0687258Z 3950 │ const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped); 2026-10-24T10:35:58.0687719Z 3951 │ ╭─▶ while (!responseLifecycle.includes("failed")) { 2026-10-24T10:35:58.0688098Z 3952 │ │ yield* Effect.yieldNow; 2026-10-24T10:35:58.0688418Z 3953 │ ╰─▶ } 2026-10-24T10:35:58.0688742Z 3954 │ const responseExit = yield* Fiber.join(responseFiber); 2026-10-24T10:35:58.0688996Z ╰──── 2026-10-24T10:35:58.0689076Z 2026-10-24T10:35:58.0689588Z ⚠ 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-24T10:35:58.0690260Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6062:9] 2026-10-24T10:35:58.0690563Z 6061 │ .pipe(Effect.forkScoped); 2026-10-24T10:35:58.0691047Z 6062 │ ╭─▶ while (promptGates.length < 1) { 2026-10-24T10:35:58.0691418Z 6063 │ │ yield* Effect.yieldNow; 2026-10-24T10:35:58.0691760Z 6064 │ ╰─▶ } 2026-10-24T10:35:58.0692117Z 6065 │ assert.isDefined(sessionUpdateHandler, "session update handler must be wired"); 2026-10-24T10:35:58.0692428Z ╰──── 2026-10-24T10:35:58.0692517Z 2026-10-24T10:35:58.0693013Z ⚠ 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-24T10:35:58.0693678Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6197:9] 2026-10-24T10:35:58.0694013Z 6196 │ .pipe(Effect.forkScoped); 2026-10-24T10:35:58.0694349Z 6197 │ ╭─▶ while (promptGates.length < 2) { 2026-10-24T10:35:58.0694815Z 6198 │ │ yield* Effect.yieldNow; 2026-10-24T10:35:58.0695137Z 6199 │ ╰─▶ } 2026-10-24T10:35:58.0695532Z 6200 │ if (sessionUpdateHandler === undefined || capturedMutation.current === null) { 2026-10-24T10:35:58.0695808Z ╰──── 2026-10-24T10:35:58.0695890Z 2026-10-24T10:35:58.0696236Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T10:35:58.0696673Z ╭─[scripts/lib/cli-external-packages.test.ts:114:11] 2026-10-24T10:35:58.0696922Z 113 │ const declared = { 2026-10-24T10:35:58.0697202Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-24T10:35:58.0697560Z ·  ──────────────────────────────── 2026-10-24T10:35:58.0697867Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T10:35:58.0698085Z ╰──── 2026-10-24T10:35:58.0698496Z  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-24T10:35:58.0698792Z 2026-10-24T10:35:58.0699040Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T10:35:58.0699463Z ╭─[scripts/lib/cli-external-packages.test.ts:115:11] 2026-10-24T10:35:58.0699756Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-24T10:35:58.0700028Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T10:35:58.0700342Z ·  ──────────────────────────────────────── 2026-10-24T10:35:58.0700726Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-24T10:35:58.0700958Z ╰──── 2026-10-24T10:35:58.0701382Z  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-24T10:35:58.0701670Z 2026-10-24T10:35:58.0701939Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T10:35:58.0702367Z ╭─[scripts/lib/cli-external-packages.test.ts:116:11] 2026-10-24T10:35:58.0706528Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T10:35:58.0706775Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-24T10:35:58.0707011Z ·  ──────────────────────────────────── 2026-10-24T10:35:58.0707195Z 117 │ }; 2026-10-24T10:35:58.0707318Z ╰──── 2026-10-24T10:35:58.0707642Z  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-24T10:35:58.0707901Z 2026-10-24T10:35:58.0708053Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:35:58.0708374Z ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14] 2026-10-24T10:35:58.0708630Z 26 │ const latestInput = useRef(input); 2026-10-24T10:35:58.0708921Z 27 │ latestInput.current = input; 2026-10-24T10:35:58.0709179Z ·  ─────┬─────────┬─── 2026-10-24T10:35:58.0709487Z · │ ╰── Cannot update ref value during render 2026-10-24T10:35:58.0709783Z · ╰── This value is a ref 2026-10-24T10:35:58.0709983Z 28 │ const mounted = useRef(true); 2026-10-24T10:35:58.0710128Z ╰──── 2026-10-24T10:35:58.0710657Z  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-24T10:35:58.0711435Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:35:58.0711728Z 2026-10-24T10:35:58.0711942Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-24T10:35:58.0712256Z ╭─[packages/contracts/src/rpc.ts:297:8] 2026-10-24T10:35:58.0712445Z 296 │ } from "./device.ts"; 2026-10-24T10:35:58.0712622Z 297 │ import {} from "./previewAutomation.ts"; 2026-10-24T10:35:58.0712804Z ·  ── 2026-10-24T10:35:58.0712945Z 298 │ import { 2026-10-24T10:35:58.0713065Z ╰──── 2026-10-24T10:35:58.0713200Z  help: Remove empty braces 2026-10-24T10:35:58.0713302Z 2026-10-24T10:35:58.0713566Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T10:35:58.0713992Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10597:7] 2026-10-24T10:35:58.0714222Z 10596 │ 2026-10-24T10:35:58.0714355Z 10597 │ const layer: Layer.Layer< 2026-10-24T10:35:58.0714519Z ·  ──┬── 2026-10-24T10:35:58.0714731Z · ╰── 'layer' is declared here 2026-10-24T10:35:58.0714958Z 10598 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T10:35:58.0715121Z ╰──── 2026-10-24T10:35:58.0715283Z  help: Consider removing this declaration. 2026-10-24T10:35:58.0715403Z 2026-10-24T10:35:58.0715561Z ⚠ react(immutability): This value cannot be modified 2026-10-24T10:35:58.0715888Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5] 2026-10-24T10:35:58.0716114Z 90 │ }) { 2026-10-24T10:35:58.0716288Z 91 │ const rotation = useSharedValue(props.hidden ? 1 : 0); 2026-10-24T10:35:58.0716498Z ·  ────┬─── 2026-10-24T10:35:58.0716724Z · ╰── `rotation` originates here 2026-10-24T10:35:58.0716931Z 92 │ useLayoutEffect(() => { 2026-10-24T10:35:58.0717164Z 93 │ rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING); 2026-10-24T10:35:58.0717387Z ·  ────┬─── 2026-10-24T10:35:58.0717604Z · ╰── `rotation` cannot be modified 2026-10-24T10:35:58.0717815Z 94 │ }, [props.hidden, rotation]); 2026-10-24T10:35:58.0717960Z ╰──── 2026-10-24T10:35:58.0718283Z  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-24T10:35:58.0718918Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:35:58.0719252Z 2026-10-24T10:35:58.0719437Z ⚠ react(immutability): This value cannot be modified 2026-10-24T10:35:58.0719767Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:269:5] 2026-10-24T10:35:58.0720033Z 266 │ const variant = props.variant ?? "plain"; 2026-10-24T10:35:58.0720277Z 267 │ const loadingVisibility = useSharedValue(props.loading ? 1 : 0); 2026-10-24T10:35:58.0720505Z ·  ────────┬──────── 2026-10-24T10:35:58.0720752Z · ╰── `loadingVisibility` originates here 2026-10-24T10:35:58.0720968Z 268 │ useLayoutEffect(() => { 2026-10-24T10:35:58.0721243Z 269 │ loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING); 2026-10-24T10:35:58.0721496Z ·  ────────┬──────── 2026-10-24T10:35:58.0721744Z · ╰── `loadingVisibility` cannot be modified 2026-10-24T10:35:58.0721983Z 270 │ }, [loadingVisibility, props.loading]); 2026-10-24T10:35:58.0722151Z ╰──── 2026-10-24T10:35:58.0722469Z  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-24T10:35:58.0723031Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:35:58.0723322Z 2026-10-24T10:35:58.0723479Z ⚠ react(immutability): This value cannot be modified 2026-10-24T10:35:58.0723806Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:328:5] 2026-10-24T10:35:58.0724050Z 325 │ }) { 2026-10-24T10:35:58.0724279Z 326 │ const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0); 2026-10-24T10:35:58.0724533Z ·  ─────────┬───────── 2026-10-24T10:35:58.0724787Z · ╰── `recordingVisibility` originates here 2026-10-24T10:35:58.0725006Z 327 │ useLayoutEffect(() => { 2026-10-24T10:35:58.0725281Z 328 │ recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING); 2026-10-24T10:35:58.0725564Z ·  ─────────┬───────── 2026-10-24T10:35:58.0725811Z · ╰── `recordingVisibility` cannot be modified 2026-10-24T10:35:58.0726053Z 329 │ }, [props.phase, recordingVisibility]); 2026-10-24T10:35:58.0726208Z ╰──── 2026-10-24T10:35:58.0726534Z  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-24T10:35:58.0727114Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:35:58.0727406Z 2026-10-24T10:35:58.0727564Z ⚠ react(immutability): This value cannot be modified 2026-10-24T10:35:58.0727885Z ╭─[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5] 2026-10-24T10:35:58.0728158Z 65 │ const [expanded, setExpanded] = useState(false); 2026-10-24T10:35:58.0728359Z 66 │ const progress = useSharedValue(0); 2026-10-24T10:35:58.0728535Z ·  ────┬─── 2026-10-24T10:35:58.0728753Z · ╰── `progress` originates here 2026-10-24T10:35:58.0729015Z 67 │ useEffect(() => { 2026-10-24T10:35:58.0729255Z 68 │ progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING); 2026-10-24T10:35:58.0729459Z ·  ────┬─── 2026-10-24T10:35:58.0729673Z · ╰── `progress` cannot be modified 2026-10-24T10:35:58.0729877Z 69 │ }, [expanded, progress]); 2026-10-24T10:35:58.0730018Z ╰──── 2026-10-24T10:35:58.0730336Z  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-24T10:35:58.0730899Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:35:58.0731223Z 2026-10-24T10:35:58.0731369Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:35:58.0731686Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:122:38] 2026-10-24T10:35:58.0732015Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-24T10:35:58.0732304Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-24T10:35:58.0732562Z ·  ───────────┬────────── 2026-10-24T10:35:58.0732863Z · ╰── Cannot access ref value during render 2026-10-24T10:35:58.0733146Z 123 │ const sessionRef = useRef(null); 2026-10-24T10:35:58.0733329Z ╰──── 2026-10-24T10:35:58.0733861Z  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-24T10:35:58.0734586Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:35:58.0734864Z 2026-10-24T10:35:58.0735007Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:35:58.0735316Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8] 2026-10-24T10:35:58.0735527Z 125 │ 2026-10-24T10:35:58.0735698Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T10:35:58.0735902Z ·  ─────────┬──────── 2026-10-24T10:35:58.0736148Z · ╰── Cannot access ref value during render 2026-10-24T10:35:58.0736396Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T10:35:58.0736567Z ╰──── 2026-10-24T10:35:58.0737092Z  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-24T10:35:58.0737806Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:35:58.0738085Z 2026-10-24T10:35:58.0738228Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:35:58.0738538Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7] 2026-10-24T10:35:58.0738750Z 125 │ 2026-10-24T10:35:58.0738914Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T10:35:58.0739176Z ·  ─────────┬───────── 2026-10-24T10:35:58.0739459Z · ╰── Cannot access ref value during render 2026-10-24T10:35:58.0739703Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T10:35:58.0739868Z ╰──── 2026-10-24T10:35:58.0740390Z  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-24T10:35:58.0741132Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:35:58.0741417Z 2026-10-24T10:35:58.0741562Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:35:58.0741879Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31] 2026-10-24T10:35:58.0742097Z 125 │ 2026-10-24T10:35:58.0742261Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T10:35:58.0742490Z ·  ─────────┬───────── 2026-10-24T10:35:58.0742777Z · ╰── Cannot access ref value during render 2026-10-24T10:35:58.0743036Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T10:35:58.0743197Z ╰──── 2026-10-24T10:35:58.0743717Z  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-24T10:35:58.0744435Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:35:58.0744714Z 2026-10-24T10:35:58.0744858Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:35:58.0745164Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30] 2026-10-24T10:35:58.0745608Z 125 │ 2026-10-24T10:35:58.0745773Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T10:35:58.0746005Z ·  ──────────┬───────── 2026-10-24T10:35:58.0746290Z · ╰── Cannot access ref value during render 2026-10-24T10:35:58.0746554Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T10:35:58.0746718Z ╰──── 2026-10-24T10:35:58.0747328Z  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-24T10:35:58.0748105Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:35:58.0748389Z 2026-10-24T10:35:58.0748533Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:35:58.0748840Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46] 2026-10-24T10:35:58.0749117Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T10:35:58.0749436Z 127 │ ╭─▶ const recorder = createLazyVoiceRecorder({ 2026-10-24T10:35:58.0749810Z 128 │ │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-24T10:35:58.0750117Z 129 │ │ onStatus: (status: RecordingStatus) => { 2026-10-24T10:35:58.0750414Z 130 │ │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-24T10:35:58.0750697Z 131 │ │ isFinished: status.isFinished, 2026-10-24T10:35:58.0751007Z 132 │ │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-24T10:35:58.0751312Z 133 │ │ error: status.error, 2026-10-24T10:35:58.0751525Z 134 │ │ url: status.url, 2026-10-24T10:35:58.0751716Z 135 │ │ }); 2026-10-24T10:35:58.0751890Z 136 │ │ }, 2026-10-24T10:35:58.0752191Z 137 │ │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-24T10:35:58.0752494Z 138 │ │ selectInput: (inputs) => { 2026-10-24T10:35:58.0752766Z 139 │ │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-24T10:35:58.0753069Z 140 │ │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-24T10:35:58.0753384Z 141 │ │ const known = microphoneOrder(preferences.value.microphones); 2026-10-24T10:35:58.0753688Z 142 │ │ const order = rememberMicrophones(known, inputs); 2026-10-24T10:35:58.0753936Z 143 │ │ if (order !== known) { 2026-10-24T10:35:58.0754190Z 144 │ │ registry.set(updateMobilePreferencesAtom, { 2026-10-24T10:35:58.0754453Z 145 │ │ transform: (current) => ({ 2026-10-24T10:35:58.0754789Z 146 │ │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-24T10:35:58.0755074Z 147 │ │ }), 2026-10-24T10:35:58.0755256Z 148 │ │ }); 2026-10-24T10:35:58.0755427Z 149 │ │ } 2026-10-24T10:35:58.0755660Z 150 │ │ return preferredMicrophoneInput(inputs, order); 2026-10-24T10:35:58.0755883Z 151 │ │ }, 2026-10-24T10:35:58.0756106Z 152 │ ├─▶ }); 2026-10-24T10:35:58.0756482Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T10:35:58.0756941Z 153 │ recorderRef.current = recorder; 2026-10-24T10:35:58.0757134Z ╰──── 2026-10-24T10:35:58.0757656Z  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-24T10:35:58.0758374Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:35:58.0758653Z 2026-10-24T10:35:58.0758796Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:35:58.0759105Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16] 2026-10-24T10:35:58.0759325Z 152 │ }); 2026-10-24T10:35:58.0759471Z 153 │ recorderRef.current = recorder; 2026-10-24T10:35:58.0759690Z ·  ─────┬─────────┬─── 2026-10-24T10:35:58.0759994Z · │ ╰── Cannot update ref value during render 2026-10-24T10:35:58.0760284Z · ╰── This value is a ref 2026-10-24T10:35:58.0760512Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T10:35:58.0760680Z ╰──── 2026-10-24T10:35:58.0761227Z  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-24T10:35:58.0761946Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:35:58.0762227Z 2026-10-24T10:35:58.0762372Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:35:58.0762678Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48] 2026-10-24T10:35:58.0762927Z 153 │ recorderRef.current = recorder; 2026-10-24T10:35:58.0763224Z 154 │ ╭─▶ sessionRef.current = new VoiceInputSession({ 2026-10-24T10:35:58.0763494Z 155 │ │ recorder, 2026-10-24T10:35:58.0763721Z 156 │ │ getTranscriber: getLocalVoiceTranscriber, 2026-10-24T10:35:58.0763978Z 157 │ │ requestPermission: async () => { 2026-10-24T10:35:58.0764269Z 158 │ │ const permission = await requestRecordingPermissionsAsync(); 2026-10-24T10:35:58.0764636Z 159 │ │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-24T10:35:58.0764912Z 160 │ │ }, 2026-10-24T10:35:58.0765151Z 161 │ │ configureRecording: configureVoiceRecordingAudio, 2026-10-24T10:35:58.0765439Z 162 │ │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-24T10:35:58.0765720Z 163 │ │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-24T10:35:58.0765974Z 164 │ │ onStateChange: (nextState) => 2026-10-24T10:35:58.0766189Z 165 │ │ setState({ 2026-10-24T10:35:58.0766394Z 166 │ │ state: nextState, 2026-10-24T10:35:58.0766647Z 167 │ │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-24T10:35:58.0766987Z 168 │ │ label: sessionRef.current?.label ?? null, 2026-10-24T10:35:58.0767233Z 169 │ │ }), 2026-10-24T10:35:58.0767458Z 170 │ ├─▶ }); 2026-10-24T10:35:58.0767790Z · ╰──── Cannot access ref value during render 2026-10-24T10:35:58.0768032Z 171 │ } 2026-10-24T10:35:58.0768146Z ╰──── 2026-10-24T10:35:58.0768670Z  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-24T10:35:58.0769394Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:35:58.0769675Z 2026-10-24T10:35:58.0769819Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:35:58.0770127Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15] 2026-10-24T10:35:58.0770372Z 153 │ recorderRef.current = recorder; 2026-10-24T10:35:58.0770576Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T10:35:58.0770802Z ·  ─────┬────────┬─── 2026-10-24T10:35:58.0771128Z · │ ╰── Cannot update ref value during render 2026-10-24T10:35:58.0771415Z · ╰── This value is a ref 2026-10-24T10:35:58.0771599Z 155 │ recorder, 2026-10-24T10:35:58.0771724Z ╰──── 2026-10-24T10:35:58.0772251Z  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-24T10:35:58.0772966Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:35:58.0773242Z 2026-10-24T10:35:58.0773384Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:35:58.0773690Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7] 2026-10-24T10:35:58.0773936Z 184 │ return () => subscription.remove(); 2026-10-24T10:35:58.0774104Z 185 │ }, [controller]); 2026-10-24T10:35:58.0774260Z ·  ─────┬──── 2026-10-24T10:35:58.0774499Z · ╰── Cannot access ref value during render 2026-10-24T10:35:58.0774698Z 186 │ 2026-10-24T10:35:58.0774805Z ╰──── 2026-10-24T10:35:58.0775325Z  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-24T10:35:58.0776054Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:35:58.0776337Z 2026-10-24T10:35:58.0776482Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:35:58.0776789Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6] 2026-10-24T10:35:58.0777092Z 184 │ return () => subscription.remove(); 2026-10-24T10:35:58.0777294Z 185 │ }, [controller]); 2026-10-24T10:35:58.0777450Z ·  ──────┬───── 2026-10-24T10:35:58.0777685Z · ╰── Cannot access ref value during render 2026-10-24T10:35:58.0777879Z 186 │ 2026-10-24T10:35:58.0777985Z ╰──── 2026-10-24T10:35:58.0778506Z  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-24T10:35:58.0779225Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:35:58.0779508Z 2026-10-24T10:35:58.0779662Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:35:58.0779969Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6] 2026-10-24T10:35:58.0780185Z 191 │ }, 2026-10-24T10:35:58.0780318Z 192 │ [controller, recorder], 2026-10-24T10:35:58.0780481Z ·  ─────┬──── 2026-10-24T10:35:58.0780711Z · ╰── Cannot access ref value during render 2026-10-24T10:35:58.0780905Z 193 │ ); 2026-10-24T10:35:58.0781014Z ╰──── 2026-10-24T10:35:58.0781702Z  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-24T10:35:58.0782436Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:35:58.0782725Z 2026-10-24T10:35:58.0782869Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:35:58.0783175Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20] 2026-10-24T10:35:58.0783430Z 174 │ const controller = session.controller; 2026-10-24T10:35:58.0783623Z 175 │ const recorder = recorderRef.current; 2026-10-24T10:35:58.0783830Z ·  ─────────┬───────── 2026-10-24T10:35:58.0784096Z · ╰── Cannot access ref value during render 2026-10-24T10:35:58.0784302Z 176 │ 2026-10-24T10:35:58.0784407Z ╰──── 2026-10-24T10:35:58.0784936Z  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-24T10:35:58.0785726Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:35:58.0786002Z 2026-10-24T10:35:58.0786145Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:35:58.0786449Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5] 2026-10-24T10:35:58.0786669Z 191 │ }, 2026-10-24T10:35:58.0786801Z 192 │ [controller, recorder], 2026-10-24T10:35:58.0786979Z ·  ───────────┬────────── 2026-10-24T10:35:58.0787300Z · ╰── Cannot access ref value during render 2026-10-24T10:35:58.0787541Z 193 │ ); 2026-10-24T10:35:58.0787650Z ╰──── 2026-10-24T10:35:58.0788169Z  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-24T10:35:58.0788882Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:35:58.0789161Z 2026-10-24T10:35:58.0789306Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:35:58.0789611Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20] 2026-10-24T10:35:58.0789864Z 245 │ return () => clearInterval(intervalId); 2026-10-24T10:35:58.0790086Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-24T10:35:58.0790302Z ·  ─────┬──── 2026-10-24T10:35:58.0790563Z · ╰── Cannot access ref value during render 2026-10-24T10:35:58.0790767Z 247 │ 2026-10-24T10:35:58.0790875Z ╰──── 2026-10-24T10:35:58.0791432Z  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-24T10:35:58.0792165Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:35:58.0792448Z 2026-10-24T10:35:58.0792595Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:35:58.0792905Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6] 2026-10-24T10:35:58.0793153Z 245 │ return () => clearInterval(intervalId); 2026-10-24T10:35:58.0793368Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-24T10:35:58.0793621Z ·  ────────────────────────┬─────────────────────── 2026-10-24T10:35:58.0793911Z · ╰── Cannot access ref value during render 2026-10-24T10:35:58.0794116Z 247 │ 2026-10-24T10:35:58.0794223Z ╰──── 2026-10-24T10:35:58.0794755Z  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-24T10:35:58.0795545Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:35:58.0795865Z 2026-10-24T10:35:58.0796009Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:35:58.0796314Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5] 2026-10-24T10:35:58.0796542Z 260 │ setOwnerFocused, 2026-10-24T10:35:58.0796687Z 261 │ session, 2026-10-24T10:35:58.0796827Z ·  ───┬─── 2026-10-24T10:35:58.0797051Z · ╰── Cannot access ref value during render 2026-10-24T10:35:58.0797250Z 262 │ stop, 2026-10-24T10:35:58.0797367Z ╰──── 2026-10-24T10:35:58.0797900Z  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-24T10:35:58.0798634Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:35:58.0798915Z 2026-10-24T10:35:58.0799065Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:35:58.0799378Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10] 2026-10-24T10:35:58.0799596Z 250 │ 2026-10-24T10:35:58.0799798Z 251 │ ╭─▶ return { 2026-10-24T10:35:58.0800154Z 252 │ │ isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null, 2026-10-24T10:35:58.0800448Z 253 │ │ state, 2026-10-24T10:35:58.0800636Z 254 │ │ audioLevels, 2026-10-24T10:35:58.0800836Z 255 │ │ elapsedSeconds, 2026-10-24T10:35:58.0801102Z 256 │ │ isBusy: voiceInputBlocksSubmission(state), 2026-10-24T10:35:58.0801324Z 257 │ │ ownerKey, 2026-10-24T10:35:58.0801499Z 258 │ │ label, 2026-10-24T10:35:58.0801681Z 259 │ │ focusedOwners, 2026-10-24T10:35:58.0801883Z 260 │ │ setOwnerFocused, 2026-10-24T10:35:58.0802072Z 261 │ │ session, 2026-10-24T10:35:58.0802245Z 262 │ │ stop, 2026-10-24T10:35:58.0802419Z 263 │ │ cancel, 2026-10-24T10:35:58.0802649Z 264 │ ├─▶ }; 2026-10-24T10:35:58.0802983Z · ╰──── Cannot access ref value during render 2026-10-24T10:35:58.0803222Z 265 │ } 2026-10-24T10:35:58.0803333Z ╰──── 2026-10-24T10:35:58.0803855Z  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-24T10:35:58.0804569Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:35:58.0804848Z 2026-10-24T10:35:58.0805006Z ⚠ react(immutability): This value cannot be modified 2026-10-24T10:35:58.0805378Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-24T10:35:58.0805739Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-24T10:35:58.0806032Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-24T10:35:58.0806249Z ·  ─────┬───── 2026-10-24T10:35:58.0806489Z · ╰── `audioLevels` originates here 2026-10-24T10:35:58.0806742Z 123 │ const sessionRef = useRef(null); 2026-10-24T10:35:58.0807020Z 124 │ const recorderRef = useRef | null>(null); 2026-10-24T10:35:58.0807226Z 125 │ 2026-10-24T10:35:58.0807392Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T10:35:58.0807608Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T10:35:58.0807869Z 128 │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-24T10:35:58.0808114Z 129 │ onStatus: (status: RecordingStatus) => { 2026-10-24T10:35:58.0808344Z 130 │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-24T10:35:58.0808564Z 131 │ isFinished: status.isFinished, 2026-10-24T10:35:58.0808811Z 132 │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-24T10:35:58.0809037Z 133 │ error: status.error, 2026-10-24T10:35:58.0809197Z 134 │ url: status.url, 2026-10-24T10:35:58.0809340Z 135 │ }); 2026-10-24T10:35:58.0809464Z 136 │ }, 2026-10-24T10:35:58.0809693Z 137 │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-24T10:35:58.0809936Z 138 │ selectInput: (inputs) => { 2026-10-24T10:35:58.0810162Z 139 │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-24T10:35:58.0810410Z 140 │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-24T10:35:58.0810670Z 141 │ const known = microphoneOrder(preferences.value.microphones); 2026-10-24T10:35:58.0810922Z 142 │ const order = rememberMicrophones(known, inputs); 2026-10-24T10:35:58.0811145Z 143 │ if (order !== known) { 2026-10-24T10:35:58.0811341Z 144 │ registry.set(updateMobilePreferencesAtom, { 2026-10-24T10:35:58.0811543Z 145 │ transform: (current) => ({ 2026-10-24T10:35:58.0811816Z 146 │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-24T10:35:58.0812051Z 147 │ }), 2026-10-24T10:35:58.0812187Z 148 │ }); 2026-10-24T10:35:58.0812313Z 149 │ } 2026-10-24T10:35:58.0812497Z 150 │ return preferredMicrophoneInput(inputs, order); 2026-10-24T10:35:58.0812679Z 151 │ }, 2026-10-24T10:35:58.0812798Z 152 │ }); 2026-10-24T10:35:58.0812942Z 153 │ recorderRef.current = recorder; 2026-10-24T10:35:58.0813144Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T10:35:58.0813319Z 155 │ recorder, 2026-10-24T10:35:58.0813490Z 156 │ getTranscriber: getLocalVoiceTranscriber, 2026-10-24T10:35:58.0813689Z 157 │ requestPermission: async () => { 2026-10-24T10:35:58.0813922Z 158 │ const permission = await requestRecordingPermissionsAsync(); 2026-10-24T10:35:58.0814221Z 159 │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-24T10:35:58.0814441Z 160 │ }, 2026-10-24T10:35:58.0814617Z 161 │ configureRecording: configureVoiceRecordingAudio, 2026-10-24T10:35:58.0814844Z 162 │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-24T10:35:58.0815123Z 163 │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-24T10:35:58.0815355Z 164 │ onStateChange: (nextState) => 2026-10-24T10:35:58.0815518Z 165 │ setState({ 2026-10-24T10:35:58.0815665Z 166 │ state: nextState, 2026-10-24T10:35:58.0815855Z 167 │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-24T10:35:58.0816073Z 168 │ label: sessionRef.current?.label ?? null, 2026-10-24T10:35:58.0816240Z 169 │ }), 2026-10-24T10:35:58.0816364Z 170 │ }); 2026-10-24T10:35:58.0816478Z 171 │ } 2026-10-24T10:35:58.0816586Z 172 │ 2026-10-24T10:35:58.0816725Z 173 │ const session = sessionRef.current; 2026-10-24T10:35:58.0816914Z 174 │ const controller = session.controller; 2026-10-24T10:35:58.0817102Z 175 │ const recorder = recorderRef.current; 2026-10-24T10:35:58.0817252Z 176 │ 2026-10-24T10:35:58.0817379Z 177 │ useEffect(() => { 2026-10-24T10:35:58.0817613Z 178 │ const subscription = AppState.addEventListener("change", (nextState) => { 2026-10-24T10:35:58.0817914Z 179 │ // iOS reports `inactive` while its permission dialog is open. Only the 2026-10-24T10:35:58.0818202Z 180 │ // real background state cancels preparation; recorder status handles 2026-10-24T10:35:58.0818451Z 181 │ // calls and route interruptions during capture. 2026-10-24T10:35:58.0818706Z 182 │ if (nextState === "background") controller.appMovedToBackground(); 2026-10-24T10:35:58.0818910Z 183 │ }); 2026-10-24T10:35:58.0819057Z 184 │ return () => subscription.remove(); 2026-10-24T10:35:58.0819225Z 185 │ }, [controller]); 2026-10-24T10:35:58.0819356Z 186 │ 2026-10-24T10:35:58.0819471Z 187 │ useEffect( 2026-10-24T10:35:58.0819604Z 188 │ () => () => { 2026-10-24T10:35:58.0819761Z 189 │ controller.dispose(); 2026-10-24T10:35:58.0819923Z 190 │ recorder.release(); 2026-10-24T10:35:58.0820063Z 191 │ }, 2026-10-24T10:35:58.0820195Z 192 │ [controller, recorder], 2026-10-24T10:35:58.0820336Z 193 │ ); 2026-10-24T10:35:58.0820445Z 194 │ 2026-10-24T10:35:58.0820565Z 195 │ useEffect(() => { 2026-10-24T10:35:58.0820737Z 196 │ if (state.phase !== "recording") return; 2026-10-24T10:35:58.0820898Z 197 │ 2026-10-24T10:35:58.0821133Z 198 │ const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`; 2026-10-24T10:35:58.0821399Z 199 │ const activation = activateKeepAwakeAsync(tag); 2026-10-24T10:35:58.0821601Z 200 │ void activation.catch(() => {}); 2026-10-24T10:35:58.0821764Z 201 │ return () => { 2026-10-24T10:35:58.0821993Z 202 │ // Release after activation settles, even if the recording ends immediately. 2026-10-24T10:35:58.0822294Z 203 │ void activation.then(() => deactivateKeepAwake(tag)).catch(() => {}); 2026-10-24T10:35:58.0822500Z 204 │ }; 2026-10-24T10:35:58.0822642Z 205 │ }, [keepAwakeId, state.phase]); 2026-10-24T10:35:58.0822793Z 206 │ 2026-10-24T10:35:58.0822910Z 207 │ useEffect(() => { 2026-10-24T10:35:58.0823131Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-24T10:35:58.0823183Z 209 │ 2026-10-24T10:35:58.0823303Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-24T10:35:58.0823459Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-24T10:35:58.0823561Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-24T10:35:58.0823639Z ·  ─────┬───── 2026-10-24T10:35:58.0823844Z · ╰── `audioLevels` cannot be modified 2026-10-24T10:35:58.0823933Z 213 │ } 2026-10-24T10:35:58.0823986Z ╰──── 2026-10-24T10:35:58.0824255Z  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-24T10:35:58.0824572Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:35:58.0824575Z 2026-10-24T10:35:58.0824782Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T10:35:58.0824944Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-24T10:35:58.0824996Z 206 │ 2026-10-24T10:35:58.0825059Z 207 │ useEffect(() => { 2026-10-24T10:35:58.0825137Z ·  ───┬─── 2026-10-24T10:35:58.0825575Z · ╰── This function may (indirectly) reassign or modify `audioLevels` after render 2026-10-24T10:35:58.0825718Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-24T10:35:58.0825768Z 209 │ 2026-10-24T10:35:58.0825888Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-24T10:35:58.0826043Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-24T10:35:58.0826144Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-24T10:35:58.0826220Z ·  ─────┬───── 2026-10-24T10:35:58.0826353Z · ╰── This modifies `audioLevels` 2026-10-24T10:35:58.0826408Z 213 │ } 2026-10-24T10:35:58.0826458Z ╰──── 2026-10-24T10:35:58.0826808Z  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-24T10:35:58.0827124Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:35:58.0827126Z 2026-10-24T10:35:58.0827392Z ⚠ eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used. 2026-10-24T10:35:58.0827578Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:960:10] 2026-10-24T10:35:58.0827630Z 959 │ 2026-10-24T10:35:58.0827739Z 960 │ function layerClaudeAgentSdkReplayQueryRunner( 2026-10-24T10:35:58.0827855Z ·  ──────────────────┬───────────────── 2026-10-24T10:35:58.0828063Z · ╰── 'layerClaudeAgentSdkReplayQueryRunner' is declared here 2026-10-24T10:35:58.0828172Z 961 │ transcript: ClaudeAgentSdkReplayTranscript, 2026-10-24T10:35:58.0828221Z ╰──── 2026-10-24T10:35:58.0828325Z  help: Consider removing this declaration. 2026-10-24T10:35:58.0828327Z 2026-10-24T10:35:58.0828559Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T10:35:58.0828704Z ╭─[packages/client-runtime/src/operations/projects.ts:228:51] 2026-10-24T10:35:58.0828764Z 227 │ ): string { 2026-10-24T10:35:58.0828919Z 228 │ const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? ""; 2026-10-24T10:35:58.0829033Z ·  ────── 2026-10-24T10:35:58.0829239Z 229 │ return target.owner ? `${target.owner}/${folderName}` : folderName; 2026-10-24T10:35:58.0829331Z ╰──── 2026-10-24T10:35:58.0829505Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T10:35:58.0829508Z 2026-10-24T10:35:58.0829815Z ⚠ eslint(no-unused-vars): Variable 'layerFromProviderAdapter' is declared but never used. Unused variables should start with a '_'. 2026-10-24T10:35:58.0829978Z ╭─[apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts:346:7] 2026-10-24T10:35:58.0830029Z 345 │ 2026-10-24T10:35:58.0830133Z 346 │ const layerFromProviderAdapter: Layer.Layer< 2026-10-24T10:35:58.0830227Z ·  ────────────┬─────────── 2026-10-24T10:35:58.0830397Z · ╰── 'layerFromProviderAdapter' is declared here 2026-10-24T10:35:58.0830480Z 347 │ ProviderAdapterRegistryV2, 2026-10-24T10:35:58.0830535Z ╰──── 2026-10-24T10:35:58.0830641Z  help: Consider removing this declaration. 2026-10-24T10:35:58.0830643Z 2026-10-24T10:35:58.0830930Z ⚠ eslint(no-unused-vars): Variable 'legacyCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-24T10:35:58.0831116Z ╭─[packages/provider-cursor/src/server/credentialStore.test.ts:15:7] 2026-10-24T10:35:58.0831168Z 14 │ 2026-10-24T10:35:58.0831243Z 15 │ const legacyCredentials = { 2026-10-24T10:35:58.0831327Z ·  ────────┬──────── 2026-10-24T10:35:58.0831475Z · ╰── 'legacyCredentials' is declared here 2026-10-24T10:35:58.0831542Z 16 │ version: 1 as const, 2026-10-24T10:35:58.0831592Z ╰──── 2026-10-24T10:35:58.0831702Z  help: Consider removing this declaration. 2026-10-24T10:35:58.0831708Z 2026-10-24T10:35:58.0831904Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T10:35:58.0832054Z ╭─[apps/mobile/src/components/ComposerContextSheet.tsx:267:25] 2026-10-24T10:35:58.0832163Z 266 │ {record.elements?.map((element, index) => ( 2026-10-24T10:35:58.0832335Z 267 │ 2026-10-24T10:35:58.0832489Z ·  ─────────────────────────────────────────────────────── 2026-10-24T10:35:58.0832564Z 268 │ { 2026-10-24T10:35:58.0835265Z ·  ────┬──── 2026-10-24T10:35:58.0835403Z · ╰── This is the containing effect 2026-10-24T10:35:58.0835501Z 59 │ const controller = new AbortController(); 2026-10-24T10:35:58.0835573Z 60 │ setLoadState("pending"); 2026-10-24T10:35:58.0835647Z ·  ──────┬───── 2026-10-24T10:35:58.0835815Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.0835978Z 61 │ // A renewed signature is used on Retry, not as a reason to reset the native player. 2026-10-24T10:35:58.0836027Z ╰──── 2026-10-24T10:35:58.0836647Z  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-24T10:35:58.0836985Z  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-24T10:35:58.0836990Z 2026-10-24T10:35:58.0837195Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:35:58.0837331Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:71:7] 2026-10-24T10:35:58.0837413Z 70 │ return () => controller.abort(); 2026-10-24T10:35:58.0837508Z 71 │ }, [player, props.playRequested, attempt]); 2026-10-24T10:35:58.0837682Z ·  ───┬── ─────────┬───────── ───┬─── 2026-10-24T10:35:58.0837911Z · │ │ ╰── Unnecessary dependency `attempt` 2026-10-24T10:35:58.0838189Z · │ ╰── Unnecessary dependency `props.playRequested` 2026-10-24T10:35:58.0838361Z · ╰── Unnecessary dependency `player_0` 2026-10-24T10:35:58.0838412Z 72 │ 2026-10-24T10:35:58.0838465Z ╰──── 2026-10-24T10:35:58.0838765Z  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-24T10:35:58.0839085Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0839088Z 2026-10-24T10:35:58.0839347Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:35:58.0839499Z ╭─[apps/mobile/src/components/VideoPreviewModal.ios.tsx:63:55] 2026-10-24T10:35:58.0839560Z 61 │ }, []); 2026-10-24T10:35:58.0839623Z 62 │ useEffect(() => { 2026-10-24T10:35:58.0839695Z ·  ────┬──── 2026-10-24T10:35:58.0839821Z · ╰── This is the containing effect 2026-10-24T10:35:58.0839972Z 63 │ if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl); 2026-10-24T10:35:58.0840097Z ·  ───────┬────── 2026-10-24T10:35:58.0840302Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.0840382Z 64 │ }, [playbackUrl, resolvedUrl]); 2026-10-24T10:35:58.0840433Z ╰──── 2026-10-24T10:35:58.0841059Z  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-24T10:35:58.0841416Z  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-24T10:35:58.0841421Z 2026-10-24T10:35:58.0841706Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-24T10:35:58.0841841Z ╭─[packages/provider-cursor/src/server/auth.ts:249:20] 2026-10-24T10:35:58.0841896Z 248 │ }, 2026-10-24T10:35:58.0841978Z 249 │ (effect, flow, stopSessions) => 2026-10-24T10:35:58.0842075Z ·  ──────┬───── 2026-10-24T10:35:58.0842228Z · ╰── 'stopSessions' is declared here 2026-10-24T10:35:58.0842294Z 250 │ effect.pipe( 2026-10-24T10:35:58.0842345Z ╰──── 2026-10-24T10:35:58.0842447Z  help: Consider removing this parameter. 2026-10-24T10:35:58.0842449Z 2026-10-24T10:35:58.0842707Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:35:58.0842839Z ╭─[apps/mobile/src/components/ProjectFavicon.tsx:172:5] 2026-10-24T10:35:58.0843033Z 167 │ const [activeFaviconRequest, setActiveFaviconRequest] = useState(null); 2026-10-24T10:35:58.0843102Z 168 │ useLayoutEffect(() => { 2026-10-24T10:35:58.0843181Z ·  ───────┬─────── 2026-10-24T10:35:58.0843382Z · ╰── This is the containing effect 2026-10-24T10:35:58.0843511Z 169 │ if (faviconRequest === null) return; 2026-10-24T10:35:58.0843562Z 170 │ 2026-10-24T10:35:58.0843697Z 171 │ const endRequest = beginProjectFaviconRequest(faviconRequest); 2026-10-24T10:35:58.0843794Z 172 │ setActiveFaviconRequest(faviconRequest); 2026-10-24T10:35:58.0843884Z ·  ───────────┬─────────── 2026-10-24T10:35:58.0844057Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.0844127Z 173 │ return endRequest; 2026-10-24T10:35:58.0844178Z ╰──── 2026-10-24T10:35:58.0844798Z  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-24T10:35:58.0845129Z  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-24T10:35:58.0845133Z 2026-10-24T10:35:58.0845598Z ⚠ 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-24T10:35:58.0845720Z ╭─[packages/effect-acp/src/errors.test.ts:129:28] 2026-10-24T10:35:58.0845814Z 128 │ const secret = "acp-summary-secret"; 2026-10-24T10:35:58.0845926Z 129 │ const cause = yield* Schema.decodeUnknownEffect( 2026-10-24T10:35:58.0846049Z ·  ────────────────────────── 2026-10-24T10:35:58.0846120Z 130 │ Schema.Struct({ 2026-10-24T10:35:58.0846171Z ╰──── 2026-10-24T10:35:58.0846173Z 2026-10-24T10:35:58.0846556Z ⚠ 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-24T10:35:58.0846671Z ╭─[packages/effect-acp/src/client.ts:1269:11] 2026-10-24T10:35:58.0846823Z 1268 │ extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) => 2026-10-24T10:35:58.0847003Z 1269 │ Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe( 2026-10-24T10:35:58.0847108Z ·  ────────────────────────── 2026-10-24T10:35:58.0847264Z 1270 │ Effect.mapError(() => AcpError.AcpRequestError.invalidParams()), 2026-10-24T10:35:58.0847319Z ╰──── 2026-10-24T10:35:58.0847322Z 2026-10-24T10:35:58.0847786Z ⚠ 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-24T10:35:58.0847911Z ╭─[packages/effect-acp/src/protocol.test.ts:500:31] 2026-10-24T10:35:58.0847964Z 499 │ 2026-10-24T10:35:58.0848077Z 500 │ const response = yield* Schema.decodeUnknownEffect( 2026-10-24T10:35:58.0848195Z ·  ────────────────────────── 2026-10-24T10:35:58.0848308Z 501 │ Schema.fromJsonString(JsonRpcErrorResponse), 2026-10-24T10:35:58.0848359Z ╰──── 2026-10-24T10:35:58.0848361Z 2026-10-24T10:35:58.0848690Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:35:58.0848858Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:68:5] 2026-10-24T10:35:58.0848963Z 66 │ const { id: attachmentId, fileUri } = attachment; 2026-10-24T10:35:58.0849031Z 67 │ useEffect(() => { 2026-10-24T10:35:58.0849100Z ·  ────┬──── 2026-10-24T10:35:58.0849229Z · ╰── This is the containing effect 2026-10-24T10:35:58.0849293Z 68 │ setUri(null); 2026-10-24T10:35:58.0849365Z ·  ───┬── 2026-10-24T10:35:58.0849530Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.0849593Z 69 │ setError(null); 2026-10-24T10:35:58.0849643Z ╰──── 2026-10-24T10:35:58.0850264Z  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-24T10:35:58.0850598Z  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-24T10:35:58.0850600Z 2026-10-24T10:35:58.0850805Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:35:58.0850941Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:91:7] 2026-10-24T10:35:58.0850995Z 90 │ }; 2026-10-24T10:35:58.0851069Z 91 │ }, [attachmentId, fileUri]); 2026-10-24T10:35:58.0851217Z ·  ──────┬───── ───┬─── 2026-10-24T10:35:58.0851403Z · │ ╰── Unnecessary dependency `fileUri` 2026-10-24T10:35:58.0851553Z · ╰── Unnecessary dependency `attachmentId` 2026-10-24T10:35:58.0851689Z 92 │ const mimeType = videoMimeType(attachment) ?? attachment.mimeType; 2026-10-24T10:35:58.0851739Z ╰──── 2026-10-24T10:35:58.0852033Z  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-24T10:35:58.0852355Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0852357Z 2026-10-24T10:35:58.0852582Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T10:35:58.0852726Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:213:34] 2026-10-24T10:35:58.0852790Z 212 │ useEffect(() => { 2026-10-24T10:35:58.0852904Z 213 │ if (!isFocused && hasSource) props.onRequestClose(); 2026-10-24T10:35:58.0853002Z ·  ──┬── 2026-10-24T10:35:58.0853155Z · ╰── Missing dependency `props` 2026-10-24T10:35:58.0853262Z 214 │ }, [isFocused, hasSource, props.onRequestClose]); 2026-10-24T10:35:58.0853377Z ·  ──────────┬───────── 2026-10-24T10:35:58.0853610Z · ╰── Overly precise dependency `props.onRequestClose`, use `props` instead 2026-10-24T10:35:58.0853754Z 215 │ const { source } = props; 2026-10-24T10:35:58.0853837Z ╰──── 2026-10-24T10:35:58.0854259Z  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-24T10:35:58.0854578Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0854581Z 2026-10-24T10:35:58.0854753Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T10:35:58.0854876Z ╭─[apps/web/src/hooks/useThreadActions.ts:821:56] 2026-10-24T10:35:58.0854979Z 820 │ const resolved = resolveThreadTarget(target); 2026-10-24T10:35:58.0855146Z 821 │ if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) { 2026-10-24T10:35:58.0855271Z ·  ─────┬──── 2026-10-24T10:35:58.0855440Z · ╰── Cannot call impure function 2026-10-24T10:35:58.0855521Z 822 │ return AsyncResult.failure( 2026-10-24T10:35:58.0855573Z ╰──── 2026-10-24T10:35:58.0855859Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T10:35:58.0856165Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T10:35:58.0856168Z 2026-10-24T10:35:58.0856344Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T10:35:58.0856466Z ╭─[apps/web/src/hooks/useThreadActions.ts:709:46] 2026-10-24T10:35:58.0856537Z 708 │ const wokeAt = resolved 2026-10-24T10:35:58.0856672Z 709 │ ? threadWokeAt(resolved.thread, { now: new Date().toISOString() }) 2026-10-24T10:35:58.0856784Z ·  ─────┬──── 2026-10-24T10:35:58.0856945Z · ╰── Cannot call impure function 2026-10-24T10:35:58.0857008Z 710 │ : null; 2026-10-24T10:35:58.0857059Z ╰──── 2026-10-24T10:35:58.0857343Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T10:35:58.0857647Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T10:35:58.0857652Z 2026-10-24T10:35:58.0857865Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T10:35:58.0857990Z ╭─[apps/mobile/src/lib/markdownDocument.ts:259:28] 2026-10-24T10:35:58.0858092Z 258 │ visit(parser.parse(markdown), false, false); 2026-10-24T10:35:58.0858177Z 259 │ for (const edit of edits.reverse()) 2026-10-24T10:35:58.0858272Z ·  ─────── 2026-10-24T10:35:58.0858439Z 260 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-24T10:35:58.0858490Z ╰──── 2026-10-24T10:35:58.0858749Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T10:35:58.0858825Z 2026-10-24T10:35:58.0859071Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T10:35:58.0859195Z ╭─[apps/mobile/src/lib/markdownDocument.ts:290:28] 2026-10-24T10:35:58.0859277Z 289 │ visit(parser.parse(markdown)); 2026-10-24T10:35:58.0859360Z 290 │ for (const edit of edits.reverse()) 2026-10-24T10:35:58.0859453Z ·  ─────── 2026-10-24T10:35:58.0859615Z 291 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-24T10:35:58.0859666Z ╰──── 2026-10-24T10:35:58.0859925Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T10:35:58.0859928Z 2026-10-24T10:35:58.0860144Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T10:35:58.0860269Z ╭─[apps/mobile/src/lib/markdownDocument.ts:344:38] 2026-10-24T10:35:58.0860348Z 343 │ visit(parser.parse(markdown)); 2026-10-24T10:35:58.0860452Z 344 │ for (const lineStart of lineStarts.reverse()) { 2026-10-24T10:35:58.0860553Z ·  ─────── 2026-10-24T10:35:58.0860718Z 345 │ // The header row may be a lazy line without its container markers (`>` or list indent), 2026-10-24T10:35:58.0860770Z ╰──── 2026-10-24T10:35:58.0861027Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T10:35:58.0861029Z 2026-10-24T10:35:58.0861205Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:35:58.0861368Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39] 2026-10-24T10:35:58.0861426Z 276 │ 2026-10-24T10:35:58.0861610Z 277 │ ╭─▶ return createElement(RawNativeView, { 2026-10-24T10:35:58.0861704Z 278 │ │ ...nativeProps, 2026-10-24T10:35:58.0861855Z 279 │ │ refreshEnabled: props.onPullToRefresh !== undefined, 2026-10-24T10:35:58.0861949Z 280 │ │ ref: nativeRef, 2026-10-24T10:35:58.0862081Z 281 │ ├─▶ }); 2026-10-24T10:35:58.0862322Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T10:35:58.0862375Z 282 │ } 2026-10-24T10:35:58.0862430Z ╰──── 2026-10-24T10:35:58.0862986Z  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-24T10:35:58.0863425Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:35:58.0863427Z 2026-10-24T10:35:58.0863573Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:35:58.0863728Z ╭─[apps/mobile/src/features/home/thread-swipe-actions.tsx:494:27] 2026-10-24T10:35:58.0863786Z 493 │ > 2026-10-24T10:35:58.0863865Z 494 │ {props.children(close)} 2026-10-24T10:35:58.0863952Z ·  ──┬── 2026-10-24T10:35:58.0864119Z · ╰── Cannot access ref value during render 2026-10-24T10:35:58.0864200Z 495 │ 2026-10-24T10:35:58.0864250Z ╰──── 2026-10-24T10:35:58.0864726Z  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-24T10:35:58.0865026Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:35:58.0865028Z 2026-10-24T10:35:58.0865356Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:35:58.0865537Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:329:7] 2026-10-24T10:35:58.0865593Z 324 │ }; 2026-10-24T10:35:58.0865659Z 325 │ useEffect(() => { 2026-10-24T10:35:58.0865733Z ·  ────┬──── 2026-10-24T10:35:58.0865864Z · ╰── This is the containing effect 2026-10-24T10:35:58.0865964Z 326 │ if (!guidesEnabled && section === "guide") { 2026-10-24T10:35:58.0866059Z 327 │ requestedSection.current = "overview"; 2026-10-24T10:35:58.0866233Z 328 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-24T10:35:58.0866307Z 329 │ setSection("overview"); 2026-10-24T10:35:58.0866384Z ·  ─────┬──── 2026-10-24T10:35:58.0866553Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.0866614Z 330 │ } 2026-10-24T10:35:58.0866667Z ╰──── 2026-10-24T10:35:58.0867270Z  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-24T10:35:58.0867601Z  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-24T10:35:58.0867603Z 2026-10-24T10:35:58.0867813Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T10:35:58.0867990Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:331:6] 2026-10-24T10:35:58.0868168Z 326 │ if (!guidesEnabled && section === "guide") { 2026-10-24T10:35:58.0868300Z 327 │ requestedSection.current = "overview"; 2026-10-24T10:35:58.0868382Z ·  ────────┬─────── 2026-10-24T10:35:58.0868832Z · ╰── 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-24T10:35:58.0868995Z 328 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-24T10:35:58.0869143Z ·  ─────────┬───────── ──────┬────── 2026-10-24T10:35:58.0869663Z · │ ╰── 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-24T10:35:58.0870126Z · ╰── 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-24T10:35:58.0870201Z 329 │ setSection("overview"); 2026-10-24T10:35:58.0870255Z 330 │ } 2026-10-24T10:35:58.0870348Z 331 │ }, [guidesEnabled, section, insets.top]); 2026-10-24T10:35:58.0870458Z ·  ──────────────────┬───────────────── 2026-10-24T10:35:58.0870656Z · ╰── This dependency list is missing values used by the callback 2026-10-24T10:35:58.0870744Z 332 │ const tabContent = activityContent; 2026-10-24T10:35:58.0870804Z ╰──── 2026-10-24T10:35:58.0870975Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T10:35:58.0871325Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0871328Z 2026-10-24T10:35:58.0871536Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T10:35:58.0871710Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:868:6] 2026-10-24T10:35:58.0871767Z 851 │ if ( 2026-10-24T10:35:58.0871884Z 852 │ lastSelection.current.path === route.params.path && 2026-10-24T10:35:58.0871964Z ·  ──────┬────── 2026-10-24T10:35:58.0872416Z · ╰── 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-24T10:35:58.0872546Z 853 │ lastSelection.current.id === route.params.fileSelectionId 2026-10-24T10:35:58.0872601Z 854 │ ) 2026-10-24T10:35:58.0872663Z 855 │ return; 2026-10-24T10:35:58.0872844Z 856 │ lastSelection.current = { path: route.params.path, id: route.params.fileSelectionId }; 2026-10-24T10:35:58.0872981Z 857 │ if (route.params.focus) navigation.setParams({ focus: undefined }); 2026-10-24T10:35:58.0873067Z 858 │ setJumpPath(route.params.path); 2026-10-24T10:35:58.0873140Z 859 │ setSelectedRowId(null); 2026-10-24T10:35:58.0873221Z 860 │ jumpStarted.current = false; 2026-10-24T10:35:58.0873440Z 861 │ const file = data.files.find((entry) => entry.path === route.params.path); 2026-10-24T10:35:58.0873564Z 862 │ if (!file || !nativeView.current) return; 2026-10-24T10:35:58.0873654Z ·  ─────┬──── 2026-10-24T10:35:58.0874098Z · ╰── 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-24T10:35:58.0874227Z 863 │ setCollapsedIds((ids) => ids.filter((id) => id !== file.id)); 2026-10-24T10:35:58.0874305Z 864 │ jumpStarted.current = true; 2026-10-24T10:35:58.0874442Z 865 │ void nativeView.current.scrollToFile(file.id, false).catch(() => { 2026-10-24T10:35:58.0874524Z 866 │ jumpStarted.current = false; 2026-10-24T10:35:58.0874581Z 867 │ }); 2026-10-24T10:35:58.0874785Z 868 │ }, [route.params.path, route.params.fileSelectionId, route.params.focus, data.files, navigation]); 2026-10-24T10:35:58.0874990Z ·  ──────────────────────────────────────────────┬────────────────────────────────────────────── 2026-10-24T10:35:58.0875215Z · ╰── This dependency list is missing values used by the callback 2026-10-24T10:35:58.0875327Z 869 │ const appliedFilter = useRef(filter.hideTestFiles); 2026-10-24T10:35:58.0875380Z ╰──── 2026-10-24T10:35:58.0875548Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T10:35:58.0875870Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0875872Z 2026-10-24T10:35:58.0876140Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:35:58.0876297Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:523:5] 2026-10-24T10:35:58.0877971Z 521 │ }, []); 2026-10-24T10:35:58.0878048Z 522 │ useEffect(() => { 2026-10-24T10:35:58.0878123Z ·  ────┬──── 2026-10-24T10:35:58.0878259Z · ╰── This is the containing effect 2026-10-24T10:35:58.0878344Z 523 │ setKeyboardStateSuspect(false); 2026-10-24T10:35:58.0878435Z ·  ───────────┬─────────── 2026-10-24T10:35:58.0878608Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.0878710Z 524 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-24T10:35:58.0878760Z ╰──── 2026-10-24T10:35:58.0879369Z  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-24T10:35:58.0879702Z  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-24T10:35:58.0879704Z 2026-10-24T10:35:58.0879965Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:35:58.0880118Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:888:7] 2026-10-24T10:35:58.0880276Z 885 │ const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0); 2026-10-24T10:35:58.0880426Z 886 │ useEffect(() => { 2026-10-24T10:35:58.0880528Z ·  ────┬──── 2026-10-24T10:35:58.0880656Z · ╰── This is the containing effect 2026-10-24T10:35:58.0880817Z 887 │ if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) { 2026-10-24T10:35:58.0880930Z 888 │ setLastKnownKeyboardHeight(liveKeyboardHeight); 2026-10-24T10:35:58.0881028Z ·  ─────────────┬──────────── 2026-10-24T10:35:58.0881235Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.0881288Z 889 │ } 2026-10-24T10:35:58.0881338Z ╰──── 2026-10-24T10:35:58.0881958Z  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-24T10:35:58.0882294Z  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-24T10:35:58.0882296Z 2026-10-24T10:35:58.0882554Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:35:58.0882708Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1135:5] 2026-10-24T10:35:58.0882762Z 1133 │ 2026-10-24T10:35:58.0882828Z 1134 │ useEffect(() => { 2026-10-24T10:35:58.0882900Z ·  ────┬──── 2026-10-24T10:35:58.0883036Z · ╰── This is the containing effect 2026-10-24T10:35:58.0883115Z 1135 │ setAnchorMessageId(null); 2026-10-24T10:35:58.0883200Z ·  ─────────┬──────── 2026-10-24T10:35:58.0883375Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.0883455Z 1136 │ setSubmittedMessageId(null); 2026-10-24T10:35:58.0883506Z ╰──── 2026-10-24T10:35:58.0884102Z  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-24T10:35:58.0884500Z  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-24T10:35:58.0884538Z 2026-10-24T10:35:58.0884743Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:35:58.0884895Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:524:7] 2026-10-24T10:35:58.0884979Z 523 │ setKeyboardStateSuspect(false); 2026-10-24T10:35:58.0885078Z 524 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-24T10:35:58.0885217Z ·  ────────┬──────── ─────────┬──────── 2026-10-24T10:35:58.0885430Z · │ ╰── Unnecessary dependency `liveKeyboardHeight` 2026-10-24T10:35:58.0885591Z · ╰── Unnecessary dependency `isKeyboardVisible` 2026-10-24T10:35:58.0885727Z 525 │ const handleOwnedInputFocusChange = (focused: boolean) => { 2026-10-24T10:35:58.0885781Z ╰──── 2026-10-24T10:35:58.0886076Z  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-24T10:35:58.0886389Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0886392Z 2026-10-24T10:35:58.0886597Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:35:58.0886752Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1083:7] 2026-10-24T10:35:58.0886838Z 1082 │ userInputInsetProgress.set(1); 2026-10-24T10:35:58.0887002Z 1083 │ }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]); 2026-10-24T10:35:58.0887104Z ·  ────────────┬─────────── 2026-10-24T10:35:58.0887290Z · ╰── Unnecessary dependency `activeUserInputRequestId` 2026-10-24T10:35:58.0887398Z 1084 │ const showContent = props.showContent ?? true; 2026-10-24T10:35:58.0887448Z ╰──── 2026-10-24T10:35:58.0887746Z  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-24T10:35:58.0888063Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0888065Z 2026-10-24T10:35:58.0888267Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:35:58.0888430Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1141:15] 2026-10-24T10:35:58.0888500Z 1140 │ freeze.set(false); 2026-10-24T10:35:58.0888581Z 1141 │ }, [freeze, selectedThreadKey]); 2026-10-24T10:35:58.0888675Z ·  ────────┬──────── 2026-10-24T10:35:58.0888840Z · ╰── Unnecessary dependency `selectedThreadKey` 2026-10-24T10:35:58.0888892Z 1142 │ 2026-10-24T10:35:58.0888943Z ╰──── 2026-10-24T10:35:58.0889234Z  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-24T10:35:58.0889549Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0889552Z 2026-10-24T10:35:58.0889784Z ⚠ react(immutability): This value cannot be modified 2026-10-24T10:35:58.0889973Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:971:5] 2026-10-24T10:35:58.0890084Z 966 │ const composerPopoverHeight = useSharedValue(0); 2026-10-24T10:35:58.0890189Z 967 │ const floatingControlCoverage = useSharedValue( 2026-10-24T10:35:58.0890283Z ·  ───────────┬─────────── 2026-10-24T10:35:58.0890447Z · ╰── `floatingControlCoverage` originates here 2026-10-24T10:35:58.0890573Z 968 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-24T10:35:58.0890627Z 969 │ ); 2026-10-24T10:35:58.0890691Z 970 │ useEffect(() => { 2026-10-24T10:35:58.0890793Z 971 │ floatingControlCoverage.value = withTiming( 2026-10-24T10:35:58.0890890Z ·  ───────────┬─────────── 2026-10-24T10:35:58.0891055Z · ╰── `floatingControlCoverage` cannot be modified 2026-10-24T10:35:58.0891211Z 972 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-24T10:35:58.0891261Z ╰──── 2026-10-24T10:35:58.0891528Z  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-24T10:35:58.0891841Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:35:58.0891843Z 2026-10-24T10:35:58.0892002Z ⚠ react(immutability): This value cannot be modified 2026-10-24T10:35:58.0892158Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:989:7] 2026-10-24T10:35:58.0892349Z 979 │ const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null; 2026-10-24T10:35:58.0892472Z 980 │ const combinedContentInsetEndAdjustment = useSharedValue( 2026-10-24T10:35:58.0892581Z ·  ────────────────┬──────────────── 2026-10-24T10:35:58.0892770Z · ╰── `combinedContentInsetEndAdjustment` originates here 2026-10-24T10:35:58.0892897Z 981 │ Math.max(0, estimatedOverlayHeight - nativeInsetOvercount), 2026-10-24T10:35:58.0892951Z 982 │ ); 2026-10-24T10:35:58.0893021Z 983 │ useAnimatedReaction( 2026-10-24T10:35:58.0893077Z 984 │ () => 2026-10-24T10:35:58.0893168Z 985 │ contentInsetEndAdjustment.value + 2026-10-24T10:35:58.0893255Z 986 │ floatingControlCoverage.value + 2026-10-24T10:35:58.0893459Z 987 │ (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0), 2026-10-24T10:35:58.0893524Z 988 │ (value) => { 2026-10-24T10:35:58.0893637Z 989 │ combinedContentInsetEndAdjustment.value = value; 2026-10-24T10:35:58.0893746Z ·  ────────────────┬──────────────── 2026-10-24T10:35:58.0893940Z · ╰── `combinedContentInsetEndAdjustment` cannot be modified 2026-10-24T10:35:58.0893995Z 990 │ }, 2026-10-24T10:35:58.0894045Z ╰──── 2026-10-24T10:35:58.0894310Z  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-24T10:35:58.0894623Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:35:58.0894625Z 2026-10-24T10:35:58.0894903Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:35:58.0895067Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:533:25] 2026-10-24T10:35:58.0895198Z 532 │ // range) the boundary string is identical and the chain would die. 2026-10-24T10:35:58.0895288Z 533 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-24T10:35:58.0895389Z ·  ───────┬────── 2026-10-24T10:35:58.0895556Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T10:35:58.0895696Z 534 │ const v2SearchQuery = props.searchQuery.trim().toLocaleLowerCase(); 2026-10-24T10:35:58.0895746Z ╰──── 2026-10-24T10:35:58.0896053Z  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-24T10:35:58.0896371Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0896373Z 2026-10-24T10:35:58.0896544Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T10:35:58.0896671Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:524:53] 2026-10-24T10:35:58.0896758Z 523 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-24T10:35:58.0896915Z 524 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-24T10:35:58.0897035Z ·  ─────┬──── 2026-10-24T10:35:58.0897209Z · ╰── Cannot call impure function 2026-10-24T10:35:58.0897291Z 525 │ const id = setTimeout(() => { 2026-10-24T10:35:58.0897340Z ╰──── 2026-10-24T10:35:58.0897632Z  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-24T10:35:58.0897939Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T10:35:58.0897942Z 2026-10-24T10:35:58.0898203Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:35:58.0898375Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:79:5] 2026-10-24T10:35:58.0898426Z 76 │ 2026-10-24T10:35:58.0898496Z 77 │ useEffect(() => { 2026-10-24T10:35:58.0898572Z ·  ────┬──── 2026-10-24T10:35:58.0898701Z · ╰── This is the containing effect 2026-10-24T10:35:58.0898829Z 78 │ const { host, code } = parsePairingUrl(connectionPairingUrl); 2026-10-24T10:35:58.0898896Z 79 │ setHostInput(host); 2026-10-24T10:35:58.0898972Z ·  ──────┬───── 2026-10-24T10:35:58.0899139Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.0899204Z 80 │ setCodeInput(code); 2026-10-24T10:35:58.0899255Z ╰──── 2026-10-24T10:35:58.0899928Z  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-24T10:35:58.0900292Z  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-24T10:35:58.0900294Z 2026-10-24T10:35:58.0900557Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:35:58.0900727Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:89:5] 2026-10-24T10:35:58.0900779Z 82 │ 2026-10-24T10:35:58.0900842Z 83 │ useEffect(() => { 2026-10-24T10:35:58.0900912Z ·  ────┬──── 2026-10-24T10:35:58.0901038Z · ╰── This is the containing effect 2026-10-24T10:35:58.0901156Z 84 │ if (routePairingUrl.length === 0) { 2026-10-24T10:35:58.0901220Z 85 │ return; 2026-10-24T10:35:58.0901276Z 86 │ } 2026-10-24T10:35:58.0901326Z 87 │ 2026-10-24T10:35:58.0901442Z 88 │ const { host, code } = parsePairingUrl(routePairingUrl); 2026-10-24T10:35:58.0901507Z 89 │ setHostInput(host); 2026-10-24T10:35:58.0901582Z ·  ──────┬───── 2026-10-24T10:35:58.0901748Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.0901812Z 90 │ setCodeInput(code); 2026-10-24T10:35:58.0901863Z ╰──── 2026-10-24T10:35:58.0902474Z  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-24T10:35:58.0902805Z  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-24T10:35:58.0902810Z 2026-10-24T10:35:58.0903068Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:35:58.0903238Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:95:7] 2026-10-24T10:35:58.0903289Z 92 │ 2026-10-24T10:35:58.0903350Z 93 │ useEffect(() => { 2026-10-24T10:35:58.0903418Z ·  ────┬──── 2026-10-24T10:35:58.0903545Z · ╰── This is the containing effect 2026-10-24T10:35:58.0903628Z 94 │ if (pairingConnectionError) { 2026-10-24T10:35:58.0903698Z 95 │ setIsSubmitting(false); 2026-10-24T10:35:58.0903783Z ·  ───────┬─────── 2026-10-24T10:35:58.0903959Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.0904012Z 96 │ } 2026-10-24T10:35:58.0904061Z ╰──── 2026-10-24T10:35:58.0904674Z  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-24T10:35:58.0904998Z  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-24T10:35:58.0905001Z 2026-10-24T10:35:58.0905296Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:35:58.0905500Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:152:27] 2026-10-24T10:35:58.0905688Z 151 │ 2026-10-24T10:35:58.0905767Z 152 │ {props.children(open)} 2026-10-24T10:35:58.0905858Z ·  ──┬─ 2026-10-24T10:35:58.0906017Z · ╰── Cannot access ref value during render 2026-10-24T10:35:58.0906078Z 153 │ 2026-10-24T10:35:58.0906128Z ╰──── 2026-10-24T10:35:58.0906617Z  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-24T10:35:58.0906916Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:35:58.0906919Z 2026-10-24T10:35:58.0907120Z ⚠ react(memo-dependencies): Found missing/extra memoization dependencies 2026-10-24T10:35:58.0907271Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:140:9] 2026-10-24T10:35:58.0907353Z 139 │ if (action.id !== undefined) { 2026-10-24T10:35:58.0907431Z 140 │ props.onPressAction?.({ 2026-10-24T10:35:58.0907502Z ·  ──┬── 2026-10-24T10:35:58.0907634Z · ╰── Missing dependency `props` 2026-10-24T10:35:58.0907727Z 141 │ nativeEvent: { event: action.id }, 2026-10-24T10:35:58.0907883Z 142 │ } as Parameters>[0]); 2026-10-24T10:35:58.0907941Z 143 │ } 2026-10-24T10:35:58.0907994Z 144 │ }, 2026-10-24T10:35:58.0908074Z 145 │ [close, props.onPressAction], 2026-10-24T10:35:58.0908166Z ·  ─────────┬───────── 2026-10-24T10:35:58.0908386Z · ╰── Overly precise dependency `props.onPressAction`, use `props` instead 2026-10-24T10:35:58.0908438Z 146 │ ); 2026-10-24T10:35:58.0908488Z ╰──── 2026-10-24T10:35:58.0908970Z  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-24T10:35:58.0909358Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0909398Z 2026-10-24T10:35:58.0909554Z ⚠ react(immutability): This value cannot be modified 2026-10-24T10:35:58.0909710Z ╭─[apps/mobile/src/features/connection/ConnectionStatusDot.tsx:58:7] 2026-10-24T10:35:58.0909805Z 53 │ function usePulseAnimation(pulse: boolean) { 2026-10-24T10:35:58.0909896Z 54 │ const pulseProgress = useSharedValue(0); 2026-10-24T10:35:58.0909978Z ·  ──────┬────── 2026-10-24T10:35:58.0910117Z · ╰── `pulseProgress` originates here 2026-10-24T10:35:58.0910169Z 55 │ 2026-10-24T10:35:58.0910232Z 56 │ useEffect(() => { 2026-10-24T10:35:58.0910293Z 57 │ if (pulse) { 2026-10-24T10:35:58.0910379Z 58 │ pulseProgress.value = withRepeat( 2026-10-24T10:35:58.0910464Z ·  ──────┬────── 2026-10-24T10:35:58.0910613Z · ╰── `pulseProgress` cannot be modified 2026-10-24T10:35:58.0910679Z 59 │ withTiming(1, { 2026-10-24T10:35:58.0910729Z ╰──── 2026-10-24T10:35:58.0911000Z  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-24T10:35:58.0911339Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:35:58.0911342Z 2026-10-24T10:35:58.0911538Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T10:35:58.0911714Z ╭─[apps/web/src/components/pullRequest/PullRequestChecksPopover.tsx:88:15] 2026-10-24T10:35:58.0911778Z 87 │
  • { 2026-10-24T10:35:58.0912921Z ·  ────┬──── 2026-10-24T10:35:58.0913053Z · ╰── This is the containing effect 2026-10-24T10:35:58.0913120Z 57 │ setDecodedSize(null); 2026-10-24T10:35:58.0913197Z ·  ───────┬────── 2026-10-24T10:35:58.0913364Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.0913432Z 58 │ }, [props.sourceKey]); 2026-10-24T10:35:58.0913482Z ╰──── 2026-10-24T10:35:58.0914099Z  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-24T10:35:58.0914498Z  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-24T10:35:58.0914531Z 2026-10-24T10:35:58.0914790Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:35:58.0914937Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5] 2026-10-24T10:35:58.0914989Z 59 │ 2026-10-24T10:35:58.0915051Z 60 │ useEffect(() => { 2026-10-24T10:35:58.0915119Z ·  ────┬──── 2026-10-24T10:35:58.0915244Z · ╰── This is the containing effect 2026-10-24T10:35:58.0915310Z 61 │ setFailedUri(null); 2026-10-24T10:35:58.0915384Z ·  ──────┬───── 2026-10-24T10:35:58.0915556Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.0915622Z 62 │ }, [props.uri]); 2026-10-24T10:35:58.0915672Z ╰──── 2026-10-24T10:35:58.0916282Z  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-24T10:35:58.0916609Z  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-24T10:35:58.0916611Z 2026-10-24T10:35:58.0916829Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-24T10:35:58.0916983Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10] 2026-10-24T10:35:58.0917112Z 6 │ import { parse, SvgAst, type JsxAST } from "react-native-svg"; 2026-10-24T10:35:58.0917295Z 7 │ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native"; 2026-10-24T10:35:58.0917382Z ·  ────────┬──────── 2026-10-24T10:35:58.0917533Z · ╰── 'ActivityIndicator' is imported here 2026-10-24T10:35:58.0917584Z 8 │ 2026-10-24T10:35:58.0917634Z ╰──── 2026-10-24T10:35:58.0917731Z  help: Consider removing this import. 2026-10-24T10:35:58.0917734Z 2026-10-24T10:35:58.0917938Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:35:58.0918089Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7] 2026-10-24T10:35:58.0918162Z 57 │ setDecodedSize(null); 2026-10-24T10:35:58.0918233Z 58 │ }, [props.sourceKey]); 2026-10-24T10:35:58.0918312Z ·  ───────┬─────── 2026-10-24T10:35:58.0918468Z · ╰── Unnecessary dependency `props.sourceKey` 2026-10-24T10:35:58.0918519Z 59 │ 2026-10-24T10:35:58.0918568Z ╰──── 2026-10-24T10:35:58.0918866Z  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-24T10:35:58.0919185Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0919187Z 2026-10-24T10:35:58.0919392Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:35:58.0919609Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7] 2026-10-24T10:35:58.0919718Z 61 │ setFailedUri(null); 2026-10-24T10:35:58.0919780Z 62 │ }, [props.uri]); 2026-10-24T10:35:58.0919852Z ·  ────┬──── 2026-10-24T10:35:58.0919994Z · ╰── Unnecessary dependency `props.uri` 2026-10-24T10:35:58.0920043Z 63 │ 2026-10-24T10:35:58.0920093Z ╰──── 2026-10-24T10:35:58.0920385Z  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-24T10:35:58.0920700Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0920703Z 2026-10-24T10:35:58.0920966Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:35:58.0921155Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:40:5] 2026-10-24T10:35:58.0921268Z 37 │ const [initialized, setInitialized] = useState(false); 2026-10-24T10:35:58.0921335Z 38 │ useLayoutEffect(() => { 2026-10-24T10:35:58.0921412Z ·  ───────┬─────── 2026-10-24T10:35:58.0921541Z · ╰── This is the containing effect 2026-10-24T10:35:58.0921601Z 39 │ reset(); 2026-10-24T10:35:58.0921667Z 40 │ setInitialized(true); 2026-10-24T10:35:58.0921742Z ·  ───────┬────── 2026-10-24T10:35:58.0921909Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.0921976Z 41 │ }, [reset]); 2026-10-24T10:35:58.0922030Z ╰──── 2026-10-24T10:35:58.0922644Z  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-24T10:35:58.0922973Z  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-24T10:35:58.0922975Z 2026-10-24T10:35:58.0923234Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:35:58.0923395Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:93:5] 2026-10-24T10:35:58.0923449Z 88 │ 2026-10-24T10:35:58.0923514Z 89 │ useEffect(() => { 2026-10-24T10:35:58.0923580Z ·  ────┬──── 2026-10-24T10:35:58.0923707Z · ╰── This is the containing effect 2026-10-24T10:35:58.0923869Z 90 │ if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return; 2026-10-24T10:35:58.0923971Z 91 │ const branchName = initialProjectRef.branch; 2026-10-24T10:35:58.0924035Z 92 │ let active = true; 2026-10-24T10:35:58.0924130Z 93 │ setPendingCheckouts((count) => count + 1); 2026-10-24T10:35:58.0924213Z ·  ─────────┬───────── 2026-10-24T10:35:58.0924384Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.0924538Z 94 │ // Serialize replacements: ignoring a stale result cannot undo its Git mutation. 2026-10-24T10:35:58.0924659Z ╰──── 2026-10-24T10:35:58.0925299Z  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-24T10:35:58.0925629Z  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-24T10:35:58.0925631Z 2026-10-24T10:35:58.0925839Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-24T10:35:58.0925961Z ╭─[apps/web/src/contextMenuFallback.test.ts:38:9] 2026-10-24T10:35:58.0926027Z 37 │ get isConnected() { 2026-10-24T10:35:58.0926122Z 38 │ let current: FakeElement | null = this; 2026-10-24T10:35:58.0926195Z ·  ─────── 2026-10-24T10:35:58.0926266Z 39 │ while (current?.parent) { 2026-10-24T10:35:58.0926318Z ╰──── 2026-10-24T10:35:58.0926601Z  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-24T10:35:58.0926603Z 2026-10-24T10:35:58.0926761Z ⚠ react(immutability): This value cannot be modified 2026-10-24T10:35:58.0926919Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-24T10:35:58.0926973Z  86 │ 2026-10-24T10:35:58.0927065Z  87 │ const cardCoverage = props.cardCoverage; 2026-10-24T10:35:58.0927145Z ·  ──────┬───── 2026-10-24T10:35:58.0927288Z · ╰── `cardCoverage` originates here 2026-10-24T10:35:58.0927371Z  88 │ const barHeightRef = useRef(0); 2026-10-24T10:35:58.0927449Z  89 │ const cardHeightRef = useRef(0); 2026-10-24T10:35:58.0927535Z  90 │ const cardHeight = useSharedValue(0); 2026-10-24T10:35:58.0927626Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-24T10:35:58.0927692Z  92 │ if (!cardCoverage) { 2026-10-24T10:35:58.0927751Z  93 │ return; 2026-10-24T10:35:58.0927804Z  94 │ } 2026-10-24T10:35:58.0927953Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T10:35:58.0928039Z  96 │ if (coverage === cardCoverage.value) { 2026-10-24T10:35:58.0928097Z  97 │ return; 2026-10-24T10:35:58.0928151Z  98 │ } 2026-10-24T10:35:58.0928230Z  99 │ if (cardCoverage.value === 0) { 2026-10-24T10:35:58.0928312Z 100 │ cardCoverage.value = coverage; 2026-10-24T10:35:58.0928394Z ·  ──────┬───── 2026-10-24T10:35:58.0928539Z · ╰── `cardCoverage` cannot be modified 2026-10-24T10:35:58.0928597Z 101 │ return; 2026-10-24T10:35:58.0928649Z ╰──── 2026-10-24T10:35:58.0928951Z  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-24T10:35:58.0929267Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:35:58.0929270Z 2026-10-24T10:35:58.0929424Z ⚠ react(immutability): This value cannot be modified 2026-10-24T10:35:58.0929581Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7] 2026-10-24T10:35:58.0929731Z  89 │ const cardHeightRef = useRef(0); 2026-10-24T10:35:58.0929849Z  90 │ const cardHeight = useSharedValue(0); 2026-10-24T10:35:58.0929925Z ·  ─────┬──── 2026-10-24T10:35:58.0930060Z · ╰── `cardHeight` originates here 2026-10-24T10:35:58.0930154Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-24T10:35:58.0930220Z  92 │ if (!cardCoverage) { 2026-10-24T10:35:58.0930277Z  93 │ return; 2026-10-24T10:35:58.0930329Z  94 │ } 2026-10-24T10:35:58.0930478Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T10:35:58.0930565Z  96 │ if (coverage === cardCoverage.value) { 2026-10-24T10:35:58.0930621Z  97 │ return; 2026-10-24T10:35:58.0930673Z  98 │ } 2026-10-24T10:35:58.0930758Z  99 │ if (cardCoverage.value === 0) { 2026-10-24T10:35:58.0930842Z 100 │ cardCoverage.value = coverage; 2026-10-24T10:35:58.0930898Z 101 │ return; 2026-10-24T10:35:58.0930950Z 102 │ } 2026-10-24T10:35:58.0931051Z 103 │ cardCoverage.value = withTiming(coverage, { 2026-10-24T10:35:58.0931173Z 104 │ duration: USER_INPUT_TOGGLE_DURATION_MS, 2026-10-24T10:35:58.0931258Z 105 │ easing: Easing.out(Easing.cubic), 2026-10-24T10:35:58.0931313Z 106 │ }); 2026-10-24T10:35:58.0931378Z 107 │ }, [cardCoverage]); 2026-10-24T10:35:58.0931461Z 108 │ const handleBarLayout = useCallback( 2026-10-24T10:35:58.0931541Z 109 │ (event: LayoutChangeEvent) => { 2026-10-24T10:35:58.0931667Z 110 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T10:35:58.0931734Z 111 │ notifyCoverage(); 2026-10-24T10:35:58.0931787Z 112 │ }, 2026-10-24T10:35:58.0931859Z 113 │ [notifyCoverage], 2026-10-24T10:35:58.0931914Z 114 │ ); 2026-10-24T10:35:58.0931997Z 115 │ const handleCardLayout = useCallback( 2026-10-24T10:35:58.0932076Z 116 │ (event: LayoutChangeEvent) => { 2026-10-24T10:35:58.0932201Z 117 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T10:35:58.0932314Z 118 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-24T10:35:58.0932392Z ·  ─────┬──── 2026-10-24T10:35:58.0932531Z · ╰── `cardHeight` cannot be modified 2026-10-24T10:35:58.0932597Z 119 │ notifyCoverage(); 2026-10-24T10:35:58.0932648Z ╰──── 2026-10-24T10:35:58.0932919Z  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-24T10:35:58.0933301Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:35:58.0933339Z 2026-10-24T10:35:58.0933545Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T10:35:58.0933702Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-24T10:35:58.0933788Z  90 │ const cardHeight = useSharedValue(0); 2026-10-24T10:35:58.0933881Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-24T10:35:58.0933985Z ·  ───┬─── 2026-10-24T10:35:58.0934228Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-24T10:35:58.0934294Z  92 │ if (!cardCoverage) { 2026-10-24T10:35:58.0934358Z  93 │ return; 2026-10-24T10:35:58.0934412Z  94 │ } 2026-10-24T10:35:58.0934561Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T10:35:58.0934646Z  96 │ if (coverage === cardCoverage.value) { 2026-10-24T10:35:58.0934703Z  97 │ return; 2026-10-24T10:35:58.0934756Z  98 │ } 2026-10-24T10:35:58.0934835Z  99 │ if (cardCoverage.value === 0) { 2026-10-24T10:35:58.0934917Z 100 │ cardCoverage.value = coverage; 2026-10-24T10:35:58.0934993Z ·  ──────┬───── 2026-10-24T10:35:58.0935130Z · ╰── This modifies `cardCoverage` 2026-10-24T10:35:58.0935189Z 101 │ return; 2026-10-24T10:35:58.0935240Z ╰──── 2026-10-24T10:35:58.0935595Z  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-24T10:35:58.0935910Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:35:58.0935912Z 2026-10-24T10:35:58.0936115Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T10:35:58.0936271Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-24T10:35:58.0936351Z  99 │ if (cardCoverage.value === 0) { 2026-10-24T10:35:58.0936430Z 100 │ cardCoverage.value = coverage; 2026-10-24T10:35:58.0936507Z ·  ──────┬───── 2026-10-24T10:35:58.0936641Z · ╰── This modifies `cardCoverage` 2026-10-24T10:35:58.0936699Z 101 │ return; 2026-10-24T10:35:58.0936756Z 102 │ } 2026-10-24T10:35:58.0936860Z 103 │ cardCoverage.value = withTiming(coverage, { 2026-10-24T10:35:58.0936957Z 104 │ duration: USER_INPUT_TOGGLE_DURATION_MS, 2026-10-24T10:35:58.0937041Z 105 │ easing: Easing.out(Easing.cubic), 2026-10-24T10:35:58.0937096Z 106 │ }); 2026-10-24T10:35:58.0937161Z 107 │ }, [cardCoverage]); 2026-10-24T10:35:58.0937243Z 108 │ const handleBarLayout = useCallback( 2026-10-24T10:35:58.0937321Z 109 │ (event: LayoutChangeEvent) => { 2026-10-24T10:35:58.0937427Z ·  ───────────────┬─────────────── 2026-10-24T10:35:58.0937654Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-24T10:35:58.0937779Z 110 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T10:35:58.0937828Z ╰──── 2026-10-24T10:35:58.0938251Z  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-24T10:35:58.0938597Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:35:58.0938600Z 2026-10-24T10:35:58.0938803Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T10:35:58.0938959Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7] 2026-10-24T10:35:58.0939043Z 115 │ const handleCardLayout = useCallback( 2026-10-24T10:35:58.0939124Z 116 │ (event: LayoutChangeEvent) => { 2026-10-24T10:35:58.0939227Z ·  ───────────────┬─────────────── 2026-10-24T10:35:58.0939456Z · ╰── This function may (indirectly) reassign or modify `cardHeight` after render 2026-10-24T10:35:58.0939584Z 117 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T10:35:58.0939700Z 118 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-24T10:35:58.0939775Z ·  ─────┬──── 2026-10-24T10:35:58.0939905Z · ╰── This modifies `cardHeight` 2026-10-24T10:35:58.0939971Z 119 │ notifyCoverage(); 2026-10-24T10:35:58.0940023Z ╰──── 2026-10-24T10:35:58.0940358Z  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-24T10:35:58.0940675Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:35:58.0940680Z 2026-10-24T10:35:58.0940940Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:35:58.0941116Z ╭─[apps/mobile/src/features/threads/use-worktree-setup.ts:30:40] 2026-10-24T10:35:58.0941280Z 28 │ const snapshot = resolveWorktreeSetupSnapshot(input.threadId, query.data, live); 2026-10-24T10:35:58.0941344Z 29 │ useEffect(() => { 2026-10-24T10:35:58.0941414Z ·  ────┬──── 2026-10-24T10:35:58.0941542Z · ╰── This is the containing effect 2026-10-24T10:35:58.0941667Z 30 │ if (snapshot && snapshot !== live) setHeld({ key, snapshot }); 2026-10-24T10:35:58.0941771Z ·  ───┬─── 2026-10-24T10:35:58.0941969Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.0942043Z 31 │ }, [key, live, snapshot]); 2026-10-24T10:35:58.0942093Z ╰──── 2026-10-24T10:35:58.0942708Z  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-24T10:35:58.0943037Z  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-24T10:35:58.0943040Z 2026-10-24T10:35:58.0943397Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T10:35:58.0943600Z ╭─[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9] 2026-10-24T10:35:58.0943689Z 35 │ >; 2026-10-24T10:35:58.0944727Z 54 │ ╭─▶ children = cloneElement(child, { 2026-10-24T10:35:58.0944831Z 55 │ │ onTouchStart: (event) => { 2026-10-24T10:35:58.0944992Z 56 │ │ // Reset for a new touch, not onPressIn, which also fires when a 2026-10-24T10:35:58.0945150Z 57 │ │ // finger moves out of the row and back during the same gesture. 2026-10-24T10:35:58.0945344Z 58 │ │ menuPress.current.isPreparing = false; 2026-10-24T10:35:58.0945513Z 59 │ │ menuPress.current.suppressPress = menuPress.current.isOpen; 2026-10-24T10:35:58.0945626Z 60 │ │ pendingPress.current = null; 2026-10-24T10:35:58.0945746Z 61 │ │ child.props.onTouchStart?.(event); 2026-10-24T10:35:58.0945828Z 62 │ │ }, 2026-10-24T10:35:58.0945933Z 63 │ │ onPress: (event) => { 2026-10-24T10:35:58.0946104Z 64 │ │ // Accessibility clicks have no touch identifier and must not inherit 2026-10-24T10:35:58.0946240Z 65 │ │ // cancellation from a previous physical gesture. 2026-10-24T10:35:58.0946407Z 66 │ │ const isTouch = typeof event.nativeEvent.identifier === "number"; 2026-10-24T10:35:58.0946600Z 67 │ │ if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) { 2026-10-24T10:35:58.0946686Z 68 │ │ return; 2026-10-24T10:35:58.0946762Z 69 │ │ } 2026-10-24T10:35:58.0946901Z 70 │ │ if (isTouch && menuPress.current.isPreparing) { 2026-10-24T10:35:58.0947079Z 71 │ │ // A release can arrive between native menu preparation and display. 2026-10-24T10:35:58.0947249Z 72 │ │ // Let UIKit's display/cancel callback decide this press's outcome. 2026-10-24T10:35:58.0947349Z 73 │ │ event.persist(); 2026-10-24T10:35:58.0947510Z 74 │ │ pendingPress.current = () => child.props.onPress?.(event); 2026-10-24T10:35:58.0947596Z 75 │ │ return; 2026-10-24T10:35:58.0947671Z 76 │ │ } 2026-10-24T10:35:58.0947783Z 77 │ │ child.props.onPress?.(event); 2026-10-24T10:35:58.0947858Z 78 │ │ }, 2026-10-24T10:35:58.0947987Z 79 │ ├─▶ }); 2026-10-24T10:35:58.0948305Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T10:35:58.0948449Z 80 │ menuProps.onMenuInteractionStart = () => { 2026-10-24T10:35:58.0948501Z ╰──── 2026-10-24T10:35:58.0948972Z  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-24T10:35:58.0949265Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:35:58.0949267Z 2026-10-24T10:35:58.0949425Z ⚠ react(immutability): This value cannot be modified 2026-10-24T10:35:58.0949595Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:111:5] 2026-10-24T10:35:58.0949652Z 107 │ ); 2026-10-24T10:35:58.0949805Z 108 │ const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0); 2026-10-24T10:35:58.0949894Z ·  ─────────┬──────── 2026-10-24T10:35:58.0950048Z · ╰── `separationProgress` originates here 2026-10-24T10:35:58.0950101Z 109 │ 2026-10-24T10:35:58.0950166Z 110 │ useEffect(() => { 2026-10-24T10:35:58.0950340Z 111 │ separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING); 2026-10-24T10:35:58.0950423Z ·  ─────────┬──────── 2026-10-24T10:35:58.0950578Z · ╰── `separationProgress` cannot be modified 2026-10-24T10:35:58.0950693Z 112 │ }, [props.showScrollToEnd, separationProgress]); 2026-10-24T10:35:58.0950747Z ╰──── 2026-10-24T10:35:58.0951018Z  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-24T10:35:58.0951350Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:35:58.0951353Z 2026-10-24T10:35:58.0951509Z ⚠ react(immutability): This value cannot be modified 2026-10-24T10:35:58.0951674Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-24T10:35:58.0951786Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-24T10:35:58.0951902Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-24T10:35:58.0951988Z ·  ──────┬───── 2026-10-24T10:35:58.0952128Z · ╰── `capsuleWidth` originates here 2026-10-24T10:35:58.0952239Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T10:35:58.0952354Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T10:35:58.0952458Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T10:35:58.0952555Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T10:35:58.0952614Z 134 │ return; 2026-10-24T10:35:58.0952666Z 135 │ } 2026-10-24T10:35:58.0952772Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T10:35:58.0952857Z 137 │ measuredWidthRef.current = width; 2026-10-24T10:35:58.0952999Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T10:35:58.0953074Z ·  ──────┬───── 2026-10-24T10:35:58.0953283Z · ╰── `capsuleWidth` cannot be modified 2026-10-24T10:35:58.0953367Z 139 │ }; 2026-10-24T10:35:58.0953416Z ╰──── 2026-10-24T10:35:58.0953686Z  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-24T10:35:58.0953997Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:35:58.0953999Z 2026-10-24T10:35:58.0954155Z ⚠ react(immutability): This value cannot be modified 2026-10-24T10:35:58.0954317Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-24T10:35:58.0954427Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-24T10:35:58.0954547Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-24T10:35:58.0954627Z ·  ──────┬───── 2026-10-24T10:35:58.0954764Z · ╰── `capsuleWidth` originates here 2026-10-24T10:35:58.0954873Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T10:35:58.0954987Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T10:35:58.0955092Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T10:35:58.0955187Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T10:35:58.0955244Z 134 │ return; 2026-10-24T10:35:58.0955297Z 135 │ } 2026-10-24T10:35:58.0955401Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T10:35:58.0955486Z 137 │ measuredWidthRef.current = width; 2026-10-24T10:35:58.0955631Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T10:35:58.0955686Z 139 │ }; 2026-10-24T10:35:58.0955776Z 140 │ const hasStatus = props.status !== null; 2026-10-24T10:35:58.0955910Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-24T10:35:58.0955973Z 142 │ useEffect(() => { 2026-10-24T10:35:58.0956039Z 143 │ if (!hasStatus) { 2026-10-24T10:35:58.0956124Z 144 │ measuredWidthRef.current = null; 2026-10-24T10:35:58.0956201Z 145 │ capsuleWidth.value = null; 2026-10-24T10:35:58.0956276Z ·  ──────┬───── 2026-10-24T10:35:58.0956419Z · ╰── `capsuleWidth` cannot be modified 2026-10-24T10:35:58.0956473Z 146 │ } 2026-10-24T10:35:58.0956521Z ╰──── 2026-10-24T10:35:58.0956862Z  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-24T10:35:58.0957202Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:35:58.0957204Z 2026-10-24T10:35:58.0957408Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T10:35:58.0957573Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-24T10:35:58.0957707Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-24T10:35:58.0957772Z 142 │ useEffect(() => { 2026-10-24T10:35:58.0957849Z ·  ───┬─── 2026-10-24T10:35:58.0958076Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-24T10:35:58.0958141Z 143 │ if (!hasStatus) { 2026-10-24T10:35:58.0958228Z 144 │ measuredWidthRef.current = null; 2026-10-24T10:35:58.0958304Z 145 │ capsuleWidth.value = null; 2026-10-24T10:35:58.0958381Z ·  ──────┬───── 2026-10-24T10:35:58.0958515Z · ╰── This modifies `capsuleWidth` 2026-10-24T10:35:58.0958568Z 146 │ } 2026-10-24T10:35:58.0958619Z ╰──── 2026-10-24T10:35:58.0958967Z  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-24T10:35:58.0959276Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:35:58.0959280Z 2026-10-24T10:35:58.0959486Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T10:35:58.0959652Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-24T10:35:58.0959765Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T10:35:58.0959880Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T10:35:58.0960002Z ·  ───────────────┬─────────────── 2026-10-24T10:35:58.0960248Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-24T10:35:58.0960353Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T10:35:58.0960448Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T10:35:58.0960511Z 134 │ return; 2026-10-24T10:35:58.0960568Z 135 │ } 2026-10-24T10:35:58.0960673Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T10:35:58.0960759Z 137 │ measuredWidthRef.current = width; 2026-10-24T10:35:58.0960898Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T10:35:58.0960974Z ·  ──────┬───── 2026-10-24T10:35:58.0961135Z · ╰── This modifies `capsuleWidth` 2026-10-24T10:35:58.0961188Z 139 │ }; 2026-10-24T10:35:58.0961237Z ╰──── 2026-10-24T10:35:58.0961577Z  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-24T10:35:58.0961959Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:35:58.0961994Z 2026-10-24T10:35:58.0962150Z ⚠ react(immutability): This value cannot be modified 2026-10-24T10:35:58.0962297Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:174:5] 2026-10-24T10:35:58.0962442Z 170 │ const expandedAngle = props.collapsedDirection === "right" ? 90 : 180; 2026-10-24T10:35:58.0962579Z 171 │ const rotation = useSharedValue(props.expanded ? expandedAngle : 0); 2026-10-24T10:35:58.0962654Z ·  ────┬─── 2026-10-24T10:35:58.0962784Z · ╰── `rotation` originates here 2026-10-24T10:35:58.0962835Z 172 │ 2026-10-24T10:35:58.0962906Z 173 │ useLayoutEffect(() => { 2026-10-24T10:35:58.0963040Z 174 │ rotation.value = withTiming(props.expanded ? expandedAngle : 0, { 2026-10-24T10:35:58.0963116Z ·  ────┬─── 2026-10-24T10:35:58.0963250Z · ╰── `rotation` cannot be modified 2026-10-24T10:35:58.0963349Z 175 │ duration: THREAD_DISCLOSURE_TRANSITION_MS, 2026-10-24T10:35:58.0963399Z ╰──── 2026-10-24T10:35:58.0963662Z  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-24T10:35:58.0963965Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:35:58.0963968Z 2026-10-24T10:35:58.0964162Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T10:35:58.0964320Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:1246:23] 2026-10-24T10:35:58.0964388Z 1245 │ = 2026-10-24T10:35:58.0965608Z ·  ──┬── 2026-10-24T10:35:58.0965734Z · ╰── 'layer' is declared here 2026-10-24T10:35:58.0965797Z 3756 │ Layer.effect( 2026-10-24T10:35:58.0965846Z ╰──── 2026-10-24T10:35:58.0965951Z  help: Consider removing this declaration. 2026-10-24T10:35:58.0965953Z 2026-10-24T10:35:58.0966211Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:35:58.0966372Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:444:5] 2026-10-24T10:35:58.0966431Z 434 │ : null; 2026-10-24T10:35:58.0966496Z 435 │ useEffect(() => { 2026-10-24T10:35:58.0966566Z ·  ────┬──── 2026-10-24T10:35:58.0966767Z · ╰── This is the containing effect 2026-10-24T10:35:58.0966863Z 436 │ if ( 2026-10-24T10:35:58.0966940Z 437 │ props.active === false || 2026-10-24T10:35:58.0967016Z 438 │ activeDraftKey !== null || 2026-10-24T10:35:58.0967098Z 439 │ editingPendingTask !== null || 2026-10-24T10:35:58.0967171Z 440 │ selectedProject === null 2026-10-24T10:35:58.0967226Z 441 │ ) { 2026-10-24T10:35:58.0967285Z 442 │ return; 2026-10-24T10:35:58.0967338Z 443 │ } 2026-10-24T10:35:58.0967405Z 444 │ setActiveDraftKey( 2026-10-24T10:35:58.0967487Z ·  ────────┬──────── 2026-10-24T10:35:58.0967658Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.0967729Z 445 │ createNewTaskDraft({ 2026-10-24T10:35:58.0967778Z ╰──── 2026-10-24T10:35:58.0968390Z  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-24T10:35:58.0968724Z  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-24T10:35:58.0968727Z 2026-10-24T10:35:58.0968975Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T10:35:58.0969141Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1244:36] 2026-10-24T10:35:58.0969245Z 1243 │ 2026-10-24T10:35:58.0969448Z 1244 │ {props.children} 2026-10-24T10:35:58.0969562Z ·  ───────────── 2026-10-24T10:35:58.0969636Z 1245 │ 2026-10-24T10:35:58.0969687Z ╰──── 2026-10-24T10:35:58.0969913Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T10:35:58.0970051Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T10:35:58.0970053Z 2026-10-24T10:35:58.0970313Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:35:58.0970477Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:215:7] 2026-10-24T10:35:58.0970536Z 211 │ }; 2026-10-24T10:35:58.0970601Z 212 │ useEffect(() => { 2026-10-24T10:35:58.0970672Z ·  ────┬──── 2026-10-24T10:35:58.0970800Z · ╰── This is the containing effect 2026-10-24T10:35:58.0970976Z 213 │ const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null; 2026-10-24T10:35:58.0971039Z 214 │ if (inserted) { 2026-10-24T10:35:58.0971148Z 215 │ setSelection((current) => 2026-10-24T10:35:58.0971224Z ·  ──────┬───── 2026-10-24T10:35:58.0971393Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.0971564Z 216 │ current.start === inserted.start && current.end === inserted.end ? current : inserted, 2026-10-24T10:35:58.0971614Z ╰──── 2026-10-24T10:35:58.0972302Z  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-24T10:35:58.0972670Z  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-24T10:35:58.0972672Z 2026-10-24T10:35:58.0972936Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:35:58.0973101Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:296:7] 2026-10-24T10:35:58.0973178Z 284 │ }, [hasWorkspaceSnapshot]); 2026-10-24T10:35:58.0973240Z 285 │ useEffect(() => { 2026-10-24T10:35:58.0973315Z ·  ────┬──── 2026-10-24T10:35:58.0973445Z · ╰── This is the containing effect 2026-10-24T10:35:58.0973594Z 286 │ if (!environmentId || !projectCwd || !selectedProviderInstanceId) return; 2026-10-24T10:35:58.0973745Z 287 │ const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`; 2026-10-24T10:35:58.0973815Z 288 │ const now = Date.now(); 2026-10-24T10:35:58.0973931Z 289 │ const lastRequest = workspaceRefreshKeyRef.current; 2026-10-24T10:35:58.0973988Z 290 │ if ( 2026-10-24T10:35:58.0974063Z 291 │ lastRequest?.key === key && 2026-10-24T10:35:58.0974202Z 292 │ now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS 2026-10-24T10:35:58.0974255Z 293 │ ) 2026-10-24T10:35:58.0974314Z 294 │ return; 2026-10-24T10:35:58.0974497Z 295 │ if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) { 2026-10-24T10:35:58.0974586Z 296 │ setWorkspaceRefreshRetry(null); 2026-10-24T10:35:58.0974680Z ·  ────────────┬─────────── 2026-10-24T10:35:58.0974857Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.0974915Z 297 │ return; 2026-10-24T10:35:58.0974967Z ╰──── 2026-10-24T10:35:58.0975584Z  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-24T10:35:58.0975919Z  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-24T10:35:58.0975925Z 2026-10-24T10:35:58.0976130Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:35:58.0976293Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:326:5] 2026-10-24T10:35:58.0976347Z 325 │ }, [ 2026-10-24T10:35:58.0976411Z 326 │ draftMessage, 2026-10-24T10:35:58.0976487Z ·  ──────┬───── 2026-10-24T10:35:58.0976632Z · ╰── Unnecessary dependency `draftMessage` 2026-10-24T10:35:58.0976697Z 327 │ environmentId, 2026-10-24T10:35:58.0976747Z ╰──── 2026-10-24T10:35:58.0977048Z  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-24T10:35:58.0977433Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0977464Z 2026-10-24T10:35:58.0977653Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T10:35:58.0977828Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:555:70] 2026-10-24T10:35:58.0977909Z 554 │ assert.deepStrictEqual( 2026-10-24T10:35:58.0978075Z 555 │ (yield* Ref.get(fixture.syncCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-24T10:35:58.0978197Z ·  ┬ 2026-10-24T10:35:58.0978366Z · ╰── '_' is declared here 2026-10-24T10:35:58.0978427Z 556 │ [ 2026-10-24T10:35:58.0978477Z ╰──── 2026-10-24T10:35:58.0978579Z  help: Consider removing this parameter. 2026-10-24T10:35:58.0978581Z 2026-10-24T10:35:58.0978770Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T10:35:58.0978946Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:1155:70] 2026-10-24T10:35:58.0979028Z 1154 │ assert.deepStrictEqual( 2026-10-24T10:35:58.0979195Z 1155 │ (yield* Ref.get(fixture.linkCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-24T10:35:58.0979318Z ·  ┬ 2026-10-24T10:35:58.0979489Z · ╰── '_' is declared here 2026-10-24T10:35:58.0979553Z 1156 │ [ 2026-10-24T10:35:58.0979603Z ╰──── 2026-10-24T10:35:58.0979707Z  help: Consider removing this parameter. 2026-10-24T10:35:58.0979710Z 2026-10-24T10:35:58.0979972Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:35:58.0980148Z ╭─[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:60:5] 2026-10-24T10:35:58.0980198Z 58 │ 2026-10-24T10:35:58.0980262Z 59 │ useEffect(() => { 2026-10-24T10:35:58.0980332Z ·  ────┬──── 2026-10-24T10:35:58.0980462Z · ╰── This is the containing effect 2026-10-24T10:35:58.0980541Z 60 │ setMountedModes((current) => { 2026-10-24T10:35:58.0980620Z ·  ───────┬─────── 2026-10-24T10:35:58.0980794Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.0980878Z 61 │ if (current.has(props.mode)) { 2026-10-24T10:35:58.0980928Z ╰──── 2026-10-24T10:35:58.0981576Z  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-24T10:35:58.0981904Z  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-24T10:35:58.0981906Z 2026-10-24T10:35:58.0982143Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T10:35:58.0982362Z ╭─[packages/provider-opencode/src/server/OpenCodeRuntime.environment.test.ts:53:14] 2026-10-24T10:35:58.0982413Z 52 │ 2026-10-24T10:35:58.0982477Z 53 │ for (const {} of [ 2026-10-24T10:35:58.0982548Z ·  ── 2026-10-24T10:35:58.0982613Z 54 │ { healthy: true }, 2026-10-24T10:35:58.0982663Z ╰──── 2026-10-24T10:35:58.0982893Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T10:35:58.0982896Z 2026-10-24T10:35:58.0983116Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T10:35:58.0983291Z ╭─[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:249:7] 2026-10-24T10:35:58.0983369Z 248 │ mountedRef.current = false; 2026-10-24T10:35:58.0983452Z 249 │ flow.setBranchQuery(""); 2026-10-24T10:35:58.0983523Z ·  ──┬─ 2026-10-24T10:35:58.0983648Z · ╰── Missing dependency `flow` 2026-10-24T10:35:58.0983702Z 250 │ }; 2026-10-24T10:35:58.0983774Z 251 │ }, [flow.setBranchQuery]); 2026-10-24T10:35:58.0983862Z ·  ─────────┬───────── 2026-10-24T10:35:58.0984070Z · ╰── Overly precise dependency `flow.setBranchQuery`, use `flow` instead 2026-10-24T10:35:58.0984121Z 252 │ 2026-10-24T10:35:58.0984171Z ╰──── 2026-10-24T10:35:58.0984601Z  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-24T10:35:58.0984928Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0984933Z 2026-10-24T10:35:58.0985102Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T10:35:58.0985313Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:697:76] 2026-10-24T10:35:58.0985495Z 696 │ const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() })); 2026-10-24T10:35:58.0985663Z 697 │ if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() }); 2026-10-24T10:35:58.0985801Z ·  ─────┬──── 2026-10-24T10:35:58.0986086Z · ╰── Cannot call impure function 2026-10-24T10:35:58.0986265Z 698 │ const snoozeGateNow = new Date(snoozeGateClock.now).toISOString(); 2026-10-24T10:35:58.0986316Z ╰──── 2026-10-24T10:35:58.0986608Z  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-24T10:35:58.0986910Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T10:35:58.0986913Z 2026-10-24T10:35:58.0987080Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T10:35:58.0987237Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:718:71] 2026-10-24T10:35:58.0987316Z 717 │ const snoozePresets = useMemo( 2026-10-24T10:35:58.0987505Z 718 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-24T10:35:58.0987638Z ·  ─────┬──── 2026-10-24T10:35:58.0987821Z · ╰── Cannot call impure function 2026-10-24T10:35:58.0987938Z 719 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-24T10:35:58.0987988Z ╰──── 2026-10-24T10:35:58.0988268Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T10:35:58.0988569Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T10:35:58.0988576Z 2026-10-24T10:35:58.0988762Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T10:35:58.0988918Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:719:6] 2026-10-24T10:35:58.0989097Z 718 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-24T10:35:58.0989210Z 719 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-24T10:35:58.0989304Z ·  ────────────┬─────────── 2026-10-24T10:35:58.0989484Z · ╰── Unnecessary dependency `props.snoozePresetMinute` 2026-10-24T10:35:58.0989537Z 720 │ ); 2026-10-24T10:35:58.0989586Z ╰──── 2026-10-24T10:35:58.0989907Z  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-24T10:35:58.0990223Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0990226Z 2026-10-24T10:35:58.0990407Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T10:35:58.0990561Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:765:7] 2026-10-24T10:35:58.0990630Z 764 │ thread.pinnedAt, 2026-10-24T10:35:58.0990692Z 765 │ variant, 2026-10-24T10:35:58.0990764Z ·  ───┬─── 2026-10-24T10:35:58.0990900Z · ╰── Unnecessary dependency `variant` 2026-10-24T10:35:58.0990955Z 766 │ ], 2026-10-24T10:35:58.0991005Z ╰──── 2026-10-24T10:35:58.0991420Z  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-24T10:35:58.0991776Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.0991779Z 2026-10-24T10:35:58.0991974Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T10:35:58.0992135Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1215:21] 2026-10-24T10:35:58.0992265Z 1214 │ {providerDrivers.slice(0, -1).map((driver, index) => ( 2026-10-24T10:35:58.0992401Z 1215 │ 2026-10-24T10:35:58.0992520Z ·  ────────────────────────── 2026-10-24T10:35:58.0992635Z 1216 │ 2026-10-24T10:35:58.0992687Z ╰──── 2026-10-24T10:35:58.0992832Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T10:35:58.0992835Z 2026-10-24T10:35:58.0993095Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:35:58.0993246Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:361:7] 2026-10-24T10:35:58.0993384Z 355 │ }, [cancelledIncomingShareId, navigation, props.incomingShareId]); 2026-10-24T10:35:58.0993450Z 356 │ useEffect(() => { 2026-10-24T10:35:58.0993520Z ·  ────┬──── 2026-10-24T10:35:58.0993649Z · ╰── This is the containing effect 2026-10-24T10:35:58.0993744Z 357 │ if (!isReturningToProjectPicker) { 2026-10-24T10:35:58.0993807Z 358 │ return; 2026-10-24T10:35:58.0993860Z 359 │ } 2026-10-24T10:35:58.0993957Z 360 │ if (requestedInitialProjectAvailable) { 2026-10-24T10:35:58.0994050Z 361 │ setIsReturningToProjectPicker(false); 2026-10-24T10:35:58.0994154Z ·  ──────────────┬────────────── 2026-10-24T10:35:58.0994330Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.0994389Z 362 │ return; 2026-10-24T10:35:58.0994440Z ╰──── 2026-10-24T10:35:58.0995064Z  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-24T10:35:58.0995395Z  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-24T10:35:58.0995398Z 2026-10-24T10:35:58.0995660Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:35:58.0995813Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:504:9] 2026-10-24T10:35:58.0995865Z 447 │ 2026-10-24T10:35:58.0995929Z 448 │ useEffect(() => { 2026-10-24T10:35:58.0995999Z ·  ────┬──── 2026-10-24T10:35:58.0996127Z · ╰── This is the containing effect 2026-10-24T10:35:58.0996228Z 449 │ if (props.pendingTaskId || props.draftId) { 2026-10-24T10:35:58.0996359Z 450 │ return; 2026-10-24T10:35:58.0996444Z 451 │ } 2026-10-24T10:35:58.0996589Z 452 │ if (lastInitialProjectRefRef.current !== props.initialProjectRef) { 2026-10-24T10:35:58.0996722Z 453 │ lastInitialProjectRefRef.current = props.initialProjectRef; 2026-10-24T10:35:58.0996829Z 454 │ appliedInitialProjectKeyRef.current = null; 2026-10-24T10:35:58.0996881Z 455 │ } 2026-10-24T10:35:58.0997024Z 456 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-24T10:35:58.0997153Z 457 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-24T10:35:58.0997257Z 458 │ if (initialEnvironmentId && initialProjectId) { 2026-10-24T10:35:58.0997328Z 459 │ const directProject = 2026-10-24T10:35:58.0997395Z 460 │ projects.find( 2026-10-24T10:35:58.0997460Z 461 │ (project) => 2026-10-24T10:35:58.0997643Z 462 │ project.environmentId === initialEnvironmentId && project.id === initialProjectId, 2026-10-24T10:35:58.0997705Z 463 │ ) ?? null; 2026-10-24T10:35:58.0997758Z 464 │ 2026-10-24T10:35:58.0997827Z 465 │ if (directProject) { 2026-10-24T10:35:58.0997966Z 466 │ // Apply the route's project once. Re-applying on every change would 2026-10-24T10:35:58.0998102Z 467 │ // instantly revert environment/project switches made in the picker. 2026-10-24T10:35:58.0998263Z 468 │ const directProjectKey = `${directProject.environmentId}:${directProject.id}`; 2026-10-24T10:35:58.0998402Z 469 │ if (appliedInitialProjectKeyRef.current === directProjectKey) { 2026-10-24T10:35:58.0998463Z 470 │ return; 2026-10-24T10:35:58.0998519Z 471 │ } 2026-10-24T10:35:58.0998616Z 472 │ if (props.initialProjectRef?.branch) { 2026-10-24T10:35:58.0998683Z 473 │ if ( 2026-10-24T10:35:58.0998830Z 474 │ selectedProject?.environmentId !== directProject.environmentId || 2026-10-24T10:35:58.0998929Z 475 │ selectedProject.id !== directProject.id 2026-10-24T10:35:58.0998986Z 476 │ ) { 2026-10-24T10:35:58.0999071Z 477 │ setProject(directProject); 2026-10-24T10:35:58.0999131Z 478 │ return; 2026-10-24T10:35:58.0999188Z 479 │ } 2026-10-24T10:35:58.0999270Z 480 │ if (!flow.draftKey) return; 2026-10-24T10:35:58.0999411Z 481 │ // The route completes checkout before mounting this composer. Local 2026-10-24T10:35:58.0999554Z 482 │ // mode reuses an existing worktree; worktree mode would create another. 2026-10-24T10:35:58.0999664Z 483 │ updateComposerDraftSettings(flow.draftKey, { 2026-10-24T10:35:58.0999741Z 484 │ workspaceSelection: { 2026-10-24T10:35:58.0999816Z 485 │ mode: "local", 2026-10-24T10:35:58.0999923Z 486 │ branch: props.initialProjectRef.branch, 2026-10-24T10:35:58.1000060Z 487 │ worktreePath: props.initialProjectRef.worktreePath ?? null, 2026-10-24T10:35:58.1000143Z 488 │ startFromOrigin: false, 2026-10-24T10:35:58.1000201Z 489 │ }, 2026-10-24T10:35:58.1000258Z 490 │ }); 2026-10-24T10:35:58.1000315Z 491 │ } 2026-10-24T10:35:58.1000443Z 492 │ appliedInitialProjectKeyRef.current = directProjectKey; 2026-10-24T10:35:58.1000501Z 493 │ if ( 2026-10-24T10:35:58.1000640Z 494 │ selectedProject?.environmentId === directProject.environmentId && 2026-10-24T10:35:58.1000740Z 495 │ selectedProject.id === directProject.id 2026-10-24T10:35:58.1000797Z 496 │ ) { 2026-10-24T10:35:58.1000859Z 497 │ return; 2026-10-24T10:35:58.1000984Z 498 │ } 2026-10-24T10:35:58.1001126Z 499 │ setProject(directProject); 2026-10-24T10:35:58.1001187Z 500 │ return; 2026-10-24T10:35:58.1001242Z 501 │ } 2026-10-24T10:35:58.1001291Z 502 │ 2026-10-24T10:35:58.1001370Z 503 │ if (projects.length > 0) { 2026-10-24T10:35:58.1001467Z 504 │ setIsReturningToProjectPicker(true); 2026-10-24T10:35:58.1001574Z ·  ──────────────┬────────────── 2026-10-24T10:35:58.1001759Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.1001816Z 505 │ } 2026-10-24T10:35:58.1001868Z ╰──── 2026-10-24T10:35:58.1002489Z  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-24T10:35:58.1002823Z  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-24T10:35:58.1002826Z 2026-10-24T10:35:58.1003086Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:35:58.1003241Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:604:5] 2026-10-24T10:35:58.1003294Z 545 │ 2026-10-24T10:35:58.1003357Z 546 │ useEffect(() => { 2026-10-24T10:35:58.1003428Z ·  ────┬──── 2026-10-24T10:35:58.1003556Z · ╰── This is the containing effect 2026-10-24T10:35:58.1003655Z 547 │ const shareId = props.incomingShareId; 2026-10-24T10:35:58.1003737Z 548 │ const draftKey = flow.draftKey; 2026-10-24T10:35:58.1003837Z 549 │ const destinationProject = selectedProject; 2026-10-24T10:35:58.1003981Z 550 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-24T10:35:58.1004110Z 551 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-24T10:35:58.1004197Z 552 │ const selectedProjectMatchesRoute = 2026-10-24T10:35:58.1004273Z 553 │ !initialEnvironmentId || 2026-10-24T10:35:58.1004343Z 554 │ !initialProjectId || 2026-10-24T10:35:58.1004476Z 555 │ (destinationProject?.environmentId === initialEnvironmentId && 2026-10-24T10:35:58.1004580Z 556 │ destinationProject.id === initialProjectId); 2026-10-24T10:35:58.1004638Z 557 │ if ( 2026-10-24T10:35:58.1004707Z 558 │ !shareId || 2026-10-24T10:35:58.1004773Z 559 │ !draftKey || 2026-10-24T10:35:58.1004845Z 560 │ !destinationProject || 2026-10-24T10:35:58.1004932Z 561 │ !selectedProjectMatchesRoute || 2026-10-24T10:35:58.1005022Z 562 │ cancelledIncomingShareId === shareId 2026-10-24T10:35:58.1005077Z 563 │ ) { 2026-10-24T10:35:58.1005135Z 564 │ return; 2026-10-24T10:35:58.1005188Z 565 │ } 2026-10-24T10:35:58.1005284Z 566 │ const importKey = `${shareId}:${draftKey}`; 2026-10-24T10:35:58.1005339Z 567 │ if ( 2026-10-24T10:35:58.1005450Z 568 │ startedShareImportKeyRef.current === importKey || 2026-10-24T10:35:58.1005562Z 569 │ cancellingShareImportKeyRef.current === importKey 2026-10-24T10:35:58.1005617Z 570 │ ) { 2026-10-24T10:35:58.1005675Z 571 │ return; 2026-10-24T10:35:58.1005729Z 572 │ } 2026-10-24T10:35:58.1005779Z 573 │ 2026-10-24T10:35:58.1005928Z 574 │ if (!incomingShare) { 2026-10-24T10:35:58.1006160Z 575 │ if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) { 2026-10-24T10:35:58.1006291Z 576 │ alertedUnavailableIncomingShareIdRef.current = shareId; 2026-10-24T10:35:58.1006357Z 577 │ Dialog.alert( 2026-10-24T10:35:58.1006442Z 578 │ "Shared content unavailable", 2026-10-24T10:35:58.1006615Z 579 │ "The shared content is no longer in the inbox. You can continue editing this task draft.", 2026-10-24T10:35:58.1006673Z 580 │ ); 2026-10-24T10:35:58.1006728Z 581 │ } 2026-10-24T10:35:58.1006787Z 582 │ return; 2026-10-24T10:35:58.1006839Z 583 │ } 2026-10-24T10:35:58.1006890Z 584 │ 2026-10-24T10:35:58.1006945Z 585 │ if ( 2026-10-24T10:35:58.1007112Z 586 │ incomingShare.attachments.some((attachment) => attachment.type === "file") && 2026-10-24T10:35:58.1007216Z 587 │ selectedEnvironmentServerConfig === null 2026-10-24T10:35:58.1007273Z 588 │ ) { 2026-10-24T10:35:58.1007330Z 589 │ return; 2026-10-24T10:35:58.1007384Z 590 │ } 2026-10-24T10:35:58.1007435Z 591 │ 2026-10-24T10:35:58.1007573Z 592 │ if (alertedUnavailableIncomingShareIdRef.current === shareId) { 2026-10-24T10:35:58.1007695Z 593 │ alertedUnavailableIncomingShareIdRef.current = null; 2026-10-24T10:35:58.1007747Z 594 │ } 2026-10-24T10:35:58.1007855Z 595 │ startedShareImportKeyRef.current = importKey; 2026-10-24T10:35:58.1007923Z 596 │ const draftBackup = 2026-10-24T10:35:58.1008112Z 597 │ shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey); 2026-10-24T10:35:58.1008249Z 598 │ shareImportDraftBackupRef.current.set(importKey, draftBackup); 2026-10-24T10:35:58.1008345Z 599 │ const importToken = Symbol(importKey); 2026-10-24T10:35:58.1008427Z 600 │ let didReserveShare = false; 2026-10-24T10:35:58.1008504Z 601 │ let didConsumeShare = false; 2026-10-24T10:35:58.1008582Z 602 │ let needsDraftRestore = false; 2026-10-24T10:35:58.1008694Z 603 │ activeShareImportTokenRef.current = importToken; 2026-10-24T10:35:58.1008779Z 604 │ setImportingShareKey(importKey); 2026-10-24T10:35:58.1008866Z ·  ──────────┬───────── 2026-10-24T10:35:58.1009041Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.1009109Z 605 │ void (async () => { 2026-10-24T10:35:58.1009161Z ╰──── 2026-10-24T10:35:58.1009782Z  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-24T10:35:58.1010117Z  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-24T10:35:58.1010120Z 2026-10-24T10:35:58.1010325Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:35:58.1010479Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:524:5] 2026-10-24T10:35:58.1010555Z 523 │ props.initialProjectRef, 2026-10-24T10:35:58.1010628Z 524 │ props.incomingShareId, 2026-10-24T10:35:58.1010714Z ·  ──────────┬────────── 2026-10-24T10:35:58.1010964Z · ╰── Unnecessary dependency `props.incomingShareId` 2026-10-24T10:35:58.1011095Z 525 │ props.pendingTaskId, 2026-10-24T10:35:58.1011147Z ╰──── 2026-10-24T10:35:58.1011444Z  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-24T10:35:58.1011766Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.1011769Z 2026-10-24T10:35:58.1011990Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T10:35:58.1012143Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:543:5] 2026-10-24T10:35:58.1012258Z 542 │ loadedBranchesProjectKeyRef.current = projectKey; 2026-10-24T10:35:58.1012331Z 543 │ flow.loadBranches(); 2026-10-24T10:35:58.1012403Z ·  ──┬─ 2026-10-24T10:35:58.1012527Z · ╰── Missing dependency `flow` 2026-10-24T10:35:58.1012621Z 544 │ }, [flow.loadBranches, selectedProject]); 2026-10-24T10:35:58.1012705Z ·  ────────┬──────── 2026-10-24T10:35:58.1012909Z · ╰── Overly precise dependency `flow.loadBranches`, use `flow` instead 2026-10-24T10:35:58.1012963Z 545 │ 2026-10-24T10:35:58.1013014Z ╰──── 2026-10-24T10:35:58.1013446Z  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-24T10:35:58.1013772Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.1013778Z 2026-10-24T10:35:58.1013984Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:35:58.1014138Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:766:5] 2026-10-24T10:35:58.1014201Z 765 │ flow.draftKey, 2026-10-24T10:35:58.1014278Z 766 │ hasImportedIncomingShare, 2026-10-24T10:35:58.1014371Z ·  ────────────┬─────────── 2026-10-24T10:35:58.1014553Z · ╰── Unnecessary dependency `hasImportedIncomingShare` 2026-10-24T10:35:58.1014615Z 767 │ incomingShare, 2026-10-24T10:35:58.1014697Z 768 │ isIncomingShareInboxLoading, 2026-10-24T10:35:58.1014867Z ·  ─────────────┬───────────── 2026-10-24T10:35:58.1015092Z · ╰── Unnecessary dependency `isIncomingShareInboxLoading` 2026-10-24T10:35:58.1015171Z 769 │ isIncomingShareUnavailable, 2026-10-24T10:35:58.1015244Z 770 │ props.incomingShareId, 2026-10-24T10:35:58.1015338Z 771 │ props.initialProjectRef?.environmentId, 2026-10-24T10:35:58.1015427Z 772 │ props.initialProjectRef?.projectId, 2026-10-24T10:35:58.1015499Z 773 │ releaseShareReservation, 2026-10-24T10:35:58.1015561Z 774 │ reserveShare, 2026-10-24T10:35:58.1015646Z 775 │ selectedEnvironmentServerConfig, 2026-10-24T10:35:58.1015713Z 776 │ selectedProject, 2026-10-24T10:35:58.1015781Z 777 │ shareImportAttempt, 2026-10-24T10:35:58.1015867Z ·  ─────────┬──────── 2026-10-24T10:35:58.1016043Z · ╰── Unnecessary dependency `shareImportAttempt` 2026-10-24T10:35:58.1016101Z 778 │ ]); 2026-10-24T10:35:58.1016149Z ╰──── 2026-10-24T10:35:58.1016448Z  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-24T10:35:58.1016766Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.1016769Z 2026-10-24T10:35:58.1017035Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:35:58.1017196Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-24T10:35:58.1017257Z 259 │ .join("|"); 2026-10-24T10:35:58.1017325Z 260 │ useEffect(() => { 2026-10-24T10:35:58.1017399Z ·  ────┬──── 2026-10-24T10:35:58.1017529Z · ╰── This is the containing effect 2026-10-24T10:35:58.1017588Z 261 │ stop(); 2026-10-24T10:35:58.1017657Z ·  ──┬─ 2026-10-24T10:35:58.1017820Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.1017885Z 262 │ }, [orderVersion]); 2026-10-24T10:35:58.1017935Z ╰──── 2026-10-24T10:35:58.1018536Z  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-24T10:35:58.1018870Z  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-24T10:35:58.1018876Z 2026-10-24T10:35:58.1019097Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T10:35:58.1019257Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-24T10:35:58.1019319Z 260 │ useEffect(() => { 2026-10-24T10:35:58.1019379Z 261 │ stop(); 2026-10-24T10:35:58.1019447Z ·  ──┬─ 2026-10-24T10:35:58.1019570Z · ╰── Missing dependency `stop` 2026-10-24T10:35:58.1019636Z 262 │ }, [orderVersion]); 2026-10-24T10:35:58.1019714Z ·  ──────┬───── 2026-10-24T10:35:58.1020026Z · ╰── Unnecessary dependency `orderVersion` 2026-10-24T10:35:58.1020124Z 263 │ useEffect( 2026-10-24T10:35:58.1020175Z ╰──── 2026-10-24T10:35:58.1020601Z  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-24T10:35:58.1020911Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.1020913Z 2026-10-24T10:35:58.1021059Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:35:58.1021249Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9] 2026-10-24T10:35:58.1021327Z 95 │ const latest = useRef(props); 2026-10-24T10:35:58.1021402Z 96 │ latest.current = props; 2026-10-24T10:35:58.1021510Z ·  ───┬──────┬─── 2026-10-24T10:35:58.1021689Z · │ ╰── Cannot update ref value during render 2026-10-24T10:35:58.1021804Z · ╰── This value is a ref 2026-10-24T10:35:58.1021873Z 97 │ const gesture = useMemo( 2026-10-24T10:35:58.1021924Z ╰──── 2026-10-24T10:35:58.1022391Z  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-24T10:35:58.1022685Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:35:58.1022693Z 2026-10-24T10:35:58.1022842Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:35:58.1023006Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18] 2026-10-24T10:35:58.1023071Z 103 │ .runOnJS(true) 2026-10-24T10:35:58.1023170Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T10:35:58.1023288Z ·  ───────────────┬────────────── 2026-10-24T10:35:58.1023495Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T10:35:58.1023631Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T10:35:58.1023680Z ╰──── 2026-10-24T10:35:58.1024163Z  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-24T10:35:58.1024468Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:35:58.1024470Z 2026-10-24T10:35:58.1024615Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:35:58.1024776Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19] 2026-10-24T10:35:58.1024874Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T10:35:58.1025008Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T10:35:58.1025151Z ·  ──────────────────────────┬───────────────────────── 2026-10-24T10:35:58.1025497Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T10:35:58.1025668Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T10:35:58.1025718Z ╰──── 2026-10-24T10:35:58.1026194Z  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-24T10:35:58.1026490Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:35:58.1026493Z 2026-10-24T10:35:58.1026636Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:35:58.1026800Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16] 2026-10-24T10:35:58.1026932Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T10:35:58.1027056Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T10:35:58.1027196Z ·  ──────────────────────────┬───────────────────────── 2026-10-24T10:35:58.1027405Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T10:35:58.1027530Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T10:35:58.1027582Z ╰──── 2026-10-24T10:35:58.1028053Z  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-24T10:35:58.1028352Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:35:58.1028354Z 2026-10-24T10:35:58.1028499Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:35:58.1028660Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21] 2026-10-24T10:35:58.1028783Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T10:35:58.1028906Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T10:35:58.1029043Z ·  ───────────────────────┬────────────────────── 2026-10-24T10:35:58.1029260Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T10:35:58.1029332Z 108 │ [props.disabled], 2026-10-24T10:35:58.1029384Z ╰──── 2026-10-24T10:35:58.1029862Z  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-24T10:35:58.1030159Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:35:58.1030161Z 2026-10-24T10:35:58.1030305Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:35:58.1030466Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:249:9] 2026-10-24T10:35:58.1030652Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-24T10:35:58.1030792Z 249 │ latest.current = { rows, planners, moveThread }; 2026-10-24T10:35:58.1030898Z ·  ───┬──────┬─── 2026-10-24T10:35:58.1031108Z · │ ╰── Cannot update ref value during render 2026-10-24T10:35:58.1031223Z · ╰── This value is a ref 2026-10-24T10:35:58.1031274Z 250 │ 2026-10-24T10:35:58.1031325Z ╰──── 2026-10-24T10:35:58.1031789Z  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-24T10:35:58.1032091Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:35:58.1032096Z 2026-10-24T10:35:58.1032239Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:35:58.1032395Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:247:22] 2026-10-24T10:35:58.1032514Z 246 │ const [preview, setPreview] = useState(null); 2026-10-24T10:35:58.1032633Z 247 │ const translateY = useRef(new Animated.Value(0)).current; 2026-10-24T10:35:58.1032759Z ·  ──────────────────┬────────────────── 2026-10-24T10:35:58.1032927Z · ╰── Cannot access ref value during render 2026-10-24T10:35:58.1033040Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-24T10:35:58.1033097Z ╰──── 2026-10-24T10:35:58.1033572Z  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-24T10:35:58.1033866Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:35:58.1033870Z 2026-10-24T10:35:58.1034039Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T10:35:58.1034201Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:324:16] 2026-10-24T10:35:58.1034265Z 323 │ update(0); 2026-10-24T10:35:58.1034346Z 324 │ let last = performance.now(); 2026-10-24T10:35:58.1034507Z ·  ────────┬──────── 2026-10-24T10:35:58.1034677Z · ╰── Cannot call impure function 2026-10-24T10:35:58.1034746Z 325 │ const tick = () => { 2026-10-24T10:35:58.1034796Z ╰──── 2026-10-24T10:35:58.1035096Z  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-24T10:35:58.1035390Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T10:35:58.1035393Z 2026-10-24T10:35:58.1035585Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T10:35:58.1035747Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15] 2026-10-24T10:35:58.1035810Z  98 │ () => 2026-10-24T10:35:58.1035878Z  99 │ Gesture.Pan() 2026-10-24T10:35:58.1035953Z ·  ─┬─ 2026-10-24T10:35:58.1036085Z · ╰── `Pan` may be a component 2026-10-24T10:35:58.1036163Z 100 │ .enabled(!props.disabled) 2026-10-24T10:35:58.1036215Z ╰──── 2026-10-24T10:35:58.1036493Z  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-24T10:35:58.1036948Z  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-24T10:35:58.1036950Z 2026-10-24T10:35:58.1037145Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T10:35:58.1037305Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5] 2026-10-24T10:35:58.1037372Z 103 │ .runOnJS(true) 2026-10-24T10:35:58.1037473Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T10:35:58.1037561Z ·  ───┬── 2026-10-24T10:35:58.1038006Z · ╰── 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-24T10:35:58.1038139Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T10:35:58.1038263Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T10:35:58.1038392Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T10:35:58.1038460Z 108 │ [props.disabled], 2026-10-24T10:35:58.1038541Z ·  ────────┬─────── 2026-10-24T10:35:58.1038731Z · ╰── This dependency list is missing values used by the callback 2026-10-24T10:35:58.1038786Z 109 │ ); 2026-10-24T10:35:58.1038835Z ╰──── 2026-10-24T10:35:58.1039043Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T10:35:58.1039363Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.1039365Z 2026-10-24T10:35:58.1039538Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T10:35:58.1039759Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:372:47] 2026-10-24T10:35:58.1039920Z 371 │ const { open, onOpenChange, onSnooze, timestampFormat } = props; 2026-10-24T10:35:58.1040078Z 372 │ const presets = open ? resolveSnoozePresets(new Date(), timestampFormat) : []; 2026-10-24T10:35:58.1040195Z ·  ─────┬──── 2026-10-24T10:35:58.1040361Z · ╰── Cannot call impure function 2026-10-24T10:35:58.1040420Z 373 │ return ( 2026-10-24T10:35:58.1040471Z ╰──── 2026-10-24T10:35:58.1040755Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T10:35:58.1041061Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T10:35:58.1041066Z 2026-10-24T10:35:58.1041261Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T10:35:58.1041408Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:853:39] 2026-10-24T10:35:58.1041502Z 852 │ if (snoozeGateClock.thread !== thread) { 2026-10-24T10:35:58.1041631Z 853 │ setSnoozeGateClock({ thread, now: new Date().toISOString() }); 2026-10-24T10:35:58.1041742Z ·  ─────┬──── 2026-10-24T10:35:58.1041899Z · ╰── Cannot call impure function 2026-10-24T10:35:58.1041954Z 854 │ } 2026-10-24T10:35:58.1042004Z ╰──── 2026-10-24T10:35:58.1042290Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T10:35:58.1042590Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T10:35:58.1042592Z 2026-10-24T10:35:58.1042852Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:35:58.1044186Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:285:5] 2026-10-24T10:35:58.1044313Z 283 │ const [snoozeWakeTick, bumpSnoozeWakeTick] = useState(0); 2026-10-24T10:35:58.1044377Z 284 │ useEffect(() => { 2026-10-24T10:35:58.1044451Z ·  ────┬──── 2026-10-24T10:35:58.1044589Z · ╰── This is the containing effect 2026-10-24T10:35:58.1044681Z 285 │ setNow(new Date().toISOString()); 2026-10-24T10:35:58.1044750Z ·  ───┬── 2026-10-24T10:35:58.1044916Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.1045054Z 286 │ const id = setInterval(() => setNow(new Date().toISOString()), 60_000); 2026-10-24T10:35:58.1045105Z ╰──── 2026-10-24T10:35:58.1045707Z  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-24T10:35:58.1046120Z  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-24T10:35:58.1046162Z 2026-10-24T10:35:58.1046369Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:35:58.1046538Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:365:25] 2026-10-24T10:35:58.1046670Z 364 │ // range) the boundary string is identical and the chain would die. 2026-10-24T10:35:58.1046759Z 365 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-24T10:35:58.1046862Z ·  ───────┬────── 2026-10-24T10:35:58.1047028Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T10:35:58.1047141Z 366 │ const listItems = ((): readonly SidebarListItem[] => { 2026-10-24T10:35:58.1047191Z ╰──── 2026-10-24T10:35:58.1047493Z  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-24T10:35:58.1047814Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:35:58.1047816Z 2026-10-24T10:35:58.1047984Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T10:35:58.1048150Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:356:53] 2026-10-24T10:35:58.1048236Z 355 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-24T10:35:58.1048394Z 356 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-24T10:35:58.1048516Z ·  ─────┬──── 2026-10-24T10:35:58.1048690Z · ╰── Cannot call impure function 2026-10-24T10:35:58.1048771Z 357 │ const id = setTimeout(() => { 2026-10-24T10:35:58.1048821Z ╰──── 2026-10-24T10:35:58.1049108Z  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-24T10:35:58.1049402Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T10:35:58.1049404Z 2026-10-24T10:35:58.1049648Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-24T10:35:58.1049812Z ╭─[apps/web/src/components/pullRequest/pullRequestList.logic.ts:265:9] 2026-10-24T10:35:58.1049878Z 264 │ ): boolean { 2026-10-24T10:35:58.1050034Z 265 │ const labels = entry.labels.map((label) => label.name.trim().toLowerCase()); 2026-10-24T10:35:58.1050201Z ·  ───────────────────────────────────────────────────────────────────── 2026-10-24T10:35:58.1050346Z 266 │ const holds = (label: string) => labels.includes(label.trim().toLowerCase()); 2026-10-24T10:35:58.1050397Z ╰──── 2026-10-24T10:35:58.1050473Z  help: Switch to `Set` 2026-10-24T10:35:58.1050475Z 2026-10-24T10:35:58.1050670Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T10:35:58.1050835Z ╭─[apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx:814:17] 2026-10-24T10:35:58.1050898Z 813 │
    { 2026-10-24T10:35:58.1053938Z ·  ────┬──── 2026-10-24T10:35:58.1054067Z · ╰── This is the containing effect 2026-10-24T10:35:58.1054160Z 400 │ setInspectorSelection((current) => { 2026-10-24T10:35:58.1054246Z ·  ──────────┬────────── 2026-10-24T10:35:58.1054421Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:35:58.1054524Z 401 │ if (props.renderInspector === undefined) { 2026-10-24T10:35:58.1054575Z ╰──── 2026-10-24T10:35:58.1055243Z  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-24T10:35:58.1055603Z  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-24T10:35:58.1055606Z 2026-10-24T10:35:58.1055826Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T10:35:58.1055978Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:528:24] 2026-10-24T10:35:58.1056141Z 527 │ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top; 2026-10-24T10:35:58.1056312Z 528 │ ╭─▶ const GitInspector = () => ( 2026-10-24T10:35:58.1056416Z 529 │ │ 2026-10-24T10:35:58.1057032Z 534 │ ╰─▶ ); 2026-10-24T10:35:58.1057113Z 535 │ const FilesInspector = () => 2026-10-24T10:35:58.1057163Z ╰──── 2026-10-24T10:35:58.1057383Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-24T10:35:58.1057386Z 2026-10-24T10:35:58.1057608Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T10:35:58.1057762Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:535:26] 2026-10-24T10:35:58.1057819Z 534 │ ); 2026-10-24T10:35:58.1057985Z 535 │ ╭─▶ const FilesInspector = () => 2026-10-24T10:35:58.1058137Z 536 │ │ selectedThread !== null && selectedThreadCwd !== null ? ( 2026-10-24T10:35:58.1058245Z 537 │ │ 2026-10-24T10:35:58.1059218Z 545 │ ╰─▶ ) : null; 2026-10-24T10:35:58.1059372Z 546 │ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset); 2026-10-24T10:35:58.1059421Z ╰──── 2026-10-24T10:35:58.1059641Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-24T10:35:58.1059644Z 2026-10-24T10:35:58.1060005Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T10:35:58.1060195Z ╭─[apps/web/src/components/settings/SettingInheritance.tsx:163:24] 2026-10-24T10:35:58.1060251Z 162 │ keys, 2026-10-24T10:35:58.1060322Z 163 │ overridingProjects = [], 2026-10-24T10:35:58.1060404Z ·  ── 2026-10-24T10:35:58.1060469Z 164 │ onClearOverrides, 2026-10-24T10:35:58.1060518Z ╰──── 2026-10-24T10:35:58.1060840Z  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-24T10:35:58.1060842Z 2026-10-24T10:35:58.1061150Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T10:35:58.1061324Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:473:19] 2026-10-24T10:35:58.1061388Z 472 │ onFilters, 2026-10-24T10:35:58.1061454Z 473 │ authorOptions = [], 2026-10-24T10:35:58.1061530Z ·  ── 2026-10-24T10:35:58.1061597Z 474 │ labelOptions = [], 2026-10-24T10:35:58.1061647Z ╰──── 2026-10-24T10:35:58.1061967Z  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-24T10:35:58.1061969Z 2026-10-24T10:35:58.1062254Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T10:35:58.1062422Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:474:18] 2026-10-24T10:35:58.1062488Z 473 │ authorOptions = [], 2026-10-24T10:35:58.1062557Z 474 │ labelOptions = [], 2026-10-24T10:35:58.1062634Z ·  ── 2026-10-24T10:35:58.1062697Z 475 │ optionScope, 2026-10-24T10:35:58.1062747Z ╰──── 2026-10-24T10:35:58.1063066Z  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-24T10:35:58.1063068Z 2026-10-24T10:35:58.1063274Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T10:35:58.1063441Z ╭─[apps/web/src/components/settings/ProviderSettingsPanel.logic.ts:4:8] 2026-10-24T10:35:58.1063515Z 3 │ AuthProvidersManageScope, 2026-10-24T10:35:58.1063582Z 4 │ type AuthSessionState, 2026-10-24T10:35:58.1063666Z ·  ────────┬─────── 2026-10-24T10:35:58.1063820Z · ╰── 'AuthSessionState' is imported here 2026-10-24T10:35:58.1063890Z 5 │ type EnvironmentId, 2026-10-24T10:35:58.1063939Z ╰──── 2026-10-24T10:35:58.1064039Z  help: Consider removing this import. 2026-10-24T10:35:58.1064042Z 2026-10-24T10:35:58.1064212Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T10:35:58.1064345Z ╭─[apps/web/src/components/CommandPalette.tsx:1996:20] 2026-10-24T10:35:58.1064464Z 1995 │ title: inferProjectTitleFromPath(destinationPath), 2026-10-24T10:35:58.1064558Z 1996 │ createdAt: new Date().toISOString(), 2026-10-24T10:35:58.1064650Z ·  ─────┬──── 2026-10-24T10:35:58.1064796Z · ╰── Cannot call impure function 2026-10-24T10:35:58.1064973Z 1997 │ remoteUrl: addProjectCloneFlow.remoteUrl, 2026-10-24T10:35:58.1065062Z ╰──── 2026-10-24T10:35:58.1065390Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T10:35:58.1065687Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T10:35:58.1065689Z 2026-10-24T10:35:58.1065770Z Found 0 errors and 362 warnings in 5420 files (6.9s, 8 threads) 2026-10-24T10:35:58.1564656Z Post job cleanup. 2026-10-24T10:35:58.2161853Z Cache hit occurred on the primary key electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309, not saving cache. 2026-10-24T10:35:58.2244032Z Post job cleanup. 2026-10-24T10:35:58.2256471Z ##[start-action display=Cache full pnpm store;id=__b845a95d-d47e-4079-bc78-a4a9859d6589.__actions_cache] 2026-10-24T10:35:58.2614159Z Post job cleanup. 2026-10-24T10:35:58.3254574Z Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-8600a8d4a7fcc9519d421cef0c77201c793c5d8afbbef2897636b5b9305a9b7d, not saving cache. 2026-10-24T10:35:58.3290260Z ##[end-action id=__b845a95d-d47e-4079-bc78-a4a9859d6589.__actions_cache;outcome=success;conclusion=success;duration_ms=103] 2026-10-24T10:35:58.3292563Z ##[start-action display=Cache Vite+;id=__b845a95d-d47e-4079-bc78-a4a9859d6589.vp_cache] 2026-10-24T10:35:58.3316248Z Post job cleanup. 2026-10-24T10:35:58.3953659Z Cache hit occurred on the primary key vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0, not saving cache. 2026-10-24T10:35:58.3986328Z ##[end-action id=__b845a95d-d47e-4079-bc78-a4a9859d6589.vp_cache;outcome=success;conclusion=success;duration_ms=69] 2026-10-24T10:35:58.4030509Z Post job cleanup. 2026-10-24T10:35:58.4471712Z [command]/usr/local/bin/git version 2026-10-24T10:35:58.4505475Z git version 2.55.0 2026-10-24T10:35:58.4525013Z Temporarily overriding HOME='/home/runner/_work/_temp/d0ab4df1-b12a-47e0-a10f-1ae6f47bcd5b' before making global git config changes 2026-10-24T10:35:58.4525440Z Adding repository directory to the temporary git global config as a safe directory 2026-10-24T10:35:58.4528238Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-24T10:35:58.4661314Z Removing SSH command configuration 2026-10-24T10:35:58.4664434Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-24T10:35:58.4689812Z [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-24T10:35:58.4830847Z fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules 2026-10-24T10:35:58.4858945Z ##[warning]The process '/usr/local/bin/git' failed with exit code 128 2026-10-24T10:35:58.4902776Z A job completed hook has been configured by the self-hosted runner administrator 2026-10-24T10:35:58.4916302Z ##[group]Run '/job_completed.sh' 2026-10-24T10:35:58.4921839Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T10:35:58.4922008Z env: 2026-10-24T10:35:58.4922121Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 182 2026-10-24T10:35:58.4922270Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 428 2026-10-24T10:35:58.4922412Z BLACKSMITH_CHECK_RUN_ID: 120850399005 2026-10-24T10:35:58.4922556Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-24T10:35:58.4922695Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-24T10:35:58.4922833Z ##[endgroup] 2026-10-24T10:35:58.5000051Z Docker container cache not activated, skipping hash computation. 2026-10-24T10:35:58.5276647Z No active SSH sessions detected. Proceeding with shutdown immediately. 2026-10-24T10:35:58.5319802Z Cleaning up orphan processes