2026-10-23T21:41:38.1707034Z Current runner version: '2.337.0' 2026-10-23T21:41:38.1711548Z Runner name: 'blacksmith-8vcpu-ubuntu-2404-lgxucs2awtzdtv74' 2026-10-23T21:41:38.1712474Z Runner group name: 'blacksmith scale sets - blacksmith-8vcpu-ubuntu-2404' 2026-10-23T21:41:38.1713395Z Machine name: 'ip-172-31-73-130' 2026-10-23T21:41:38.1715300Z ##[group]GITHUB_TOKEN Permissions 2026-10-23T21:41:38.1716770Z Contents: read 2026-10-23T21:41:38.1717223Z Metadata: read 2026-10-23T21:41:38.1717681Z ##[endgroup] 2026-10-23T21:41:38.1719294Z Secret source: Actions 2026-10-23T21:41:38.1719917Z Cache mode: write 2026-10-23T21:41:38.1720611Z Prepare workflow directory 2026-10-23T21:41:38.1928531Z Prepare all required actions 2026-10-23T21:41:38.1958059Z Getting action download info 2026-10-23T21:41:38.3119841Z Download action repository 'actions/checkout@v6' (SHA:d23441a48e516b6c34aea4fa41551a30e30af803) 2026-10-23T21:41:38.3676093Z Download action repository 'actions/cache@v6' (SHA:55cc8345863c7cc4c66a329aec7e433d2d1c52a9) 2026-10-23T21:41:38.5008752Z Setting BLACKSMITH_ACTIONS_RESULTS_URL to https://results-receiver.actions.githubusercontent.com/ 2026-10-23T21:41:38.5055380Z Complete job name: Lint 2026-10-23T21:41:38.5466642Z A job started hook has been configured by the self-hosted runner administrator 2026-10-23T21:41:38.5539097Z ##[group]Run '/setup.sh' 2026-10-23T21:41:38.5552362Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T21:41:38.5552788Z env: 2026-10-23T21:41:38.5553016Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 201 2026-10-23T21:41:38.5553314Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 516 2026-10-23T21:41:38.5553597Z BLACKSMITH_CHECK_RUN_ID: 120670937783 2026-10-23T21:41:38.5553882Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-23T21:41:38.5554159Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-23T21:41:38.5554421Z ##[endgroup] 2026-10-23T21:41:38.5854669Z Logging daemon started (blacksmithd for logs) 2026-10-23T21:41:38.5988690Z Results daemon started (blacksmithd for results) 2026-10-23T21:41:38.6139109Z Background adoption and SSH setup started (PID: 3063) 2026-10-23T21:41:38.6140752Z 2026-10-23T21:41:38.6141264Z ---------------------------------------- 2026-10-23T21:41:38.6141783Z View this job: https://app.blacksmith.sh/pingdotgg/runs/40028603783/jobs/120670937783 2026-10-23T21:41:38.6142213Z SSH Access (using your GitHub SSH key): 2026-10-23T21:41:38.6142647Z ssh -p 64002 runner@blacksmith-8vcpu-ubuntu-2404-lgxucs2awtzdtv74.vm.blacksmith.sh 2026-10-23T21:41:38.6142959Z 2026-10-23T21:41:38.6143067Z No GitHub SSH key? Add one at: 2026-10-23T21:41:38.6143566Z https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account 2026-10-23T21:41:38.6143975Z 2026-10-23T21:41:38.6144081Z ---------------------------------------- 2026-10-23T21:41:38.6144258Z 2026-10-23T21:41:38.6144403Z VM ID: blacksmith-8vcpu-ubuntu-2404-lgxucs2awtzdtv74 2026-10-23T21:41:38.6144733Z Host: production-152.236.41.28-x8664 2026-10-23T21:41:38.6145012Z Host Agent PID: 2874247 2026-10-23T21:41:38.6145257Z Host Agent Git SHA: af74fd76b 2026-10-23T21:41:38.6145540Z Host CPU Manufacturer: AuthenticAMD 2026-10-23T21:41:38.6145919Z Blacksmith Host Generation: gen 2 2026-10-23T21:41:38.6146214Z Petname: production-neat-shad-9d0cf92c 2026-10-23T21:41:38.6146500Z Region: us-east 2026-10-23T21:41:38.6146741Z Rootfs Version: ubuntu24-full-x64-081926 2026-10-23T21:41:38.6152300Z OS Version: Ubuntu 24.04.4 LTS 2026-10-23T21:41:38.6153113Z 2026-10-23T21:41:38.6153298Z Enabling Blacksmith transparent cache 2026-10-23T21:41:38.6508640Z ##[group]Run actions/checkout@v6 2026-10-23T21:41:38.6508967Z with: 2026-10-23T21:41:38.6509321Z sparse-checkout: /* !/.repos/ !/apps/mobile/modules/t3-terminal/Vendor/**/*.a 2026-10-23T21:41:38.6509728Z sparse-checkout-cone-mode: false 2026-10-23T21:41:38.6510026Z repository: pingdotgg/t3code 2026-10-23T21:41:38.6511988Z token: *** 2026-10-23T21:41:38.6512208Z ssh-strict: true 2026-10-23T21:41:38.6512432Z ssh-user: git 2026-10-23T21:41:38.6512666Z persist-credentials: true 2026-10-23T21:41:38.6513264Z clean: true 2026-10-23T21:41:38.6513507Z fetch-depth: 1 2026-10-23T21:41:38.6513732Z fetch-tags: false 2026-10-23T21:41:38.6513971Z show-progress: true 2026-10-23T21:41:38.6514214Z lfs: false 2026-10-23T21:41:38.6514434Z submodules: false 2026-10-23T21:41:38.6514673Z set-safe-directory: true 2026-10-23T21:41:38.6514945Z allow-unsafe-pr-checkout: false 2026-10-23T21:41:38.6515222Z env: 2026-10-23T21:41:38.6515493Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 201 2026-10-23T21:41:38.6515873Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 516 2026-10-23T21:41:38.6516238Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T21:41:38.6516503Z ##[endgroup] 2026-10-23T21:41:38.7613509Z Syncing repository: pingdotgg/t3code 2026-10-23T21:41:38.7615339Z ##[group]Getting Git version info 2026-10-23T21:41:38.7615696Z Working directory is '/home/runner/_work/t3code/t3code' 2026-10-23T21:41:38.7616329Z [command]/usr/local/bin/git version 2026-10-23T21:41:38.7730608Z git version 2.55.0 2026-10-23T21:41:38.7747414Z ##[endgroup] 2026-10-23T21:41:38.7756613Z Temporarily overriding HOME='/home/runner/_work/_temp/4aed9bec-89bb-4c49-8004-74685e2f5c77' before making global git config changes 2026-10-23T21:41:38.7757531Z Adding repository directory to the temporary git global config as a safe directory 2026-10-23T21:41:38.7759967Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-23T21:41:38.7805835Z Deleting the contents of '/home/runner/_work/t3code/t3code' 2026-10-23T21:41:38.7807723Z ##[group]Determining repository object format 2026-10-23T21:41:38.7808634Z ##[endgroup] 2026-10-23T21:41:38.7809100Z ##[group]Initializing the repository 2026-10-23T21:41:38.7811109Z [command]/usr/local/bin/git init /home/runner/_work/t3code/t3code 2026-10-23T21:41:38.7865527Z hint: Using 'master' as the name for the initial branch. This default branch name 2026-10-23T21:41:38.7866602Z hint: will change to "main" in Git 3.0. To configure the initial branch name 2026-10-23T21:41:38.7867220Z hint: to use in all of your new repositories, which will suppress this warning, 2026-10-23T21:41:38.7867803Z hint: call: 2026-10-23T21:41:38.7868164Z hint: 2026-10-23T21:41:38.7868523Z hint: git config --global init.defaultBranch 2026-10-23T21:41:38.7868856Z hint: 2026-10-23T21:41:38.7869176Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and 2026-10-23T21:41:38.7869664Z hint: 'development'. The just-created branch can be renamed via this command: 2026-10-23T21:41:38.7870066Z hint: 2026-10-23T21:41:38.7870292Z hint: git branch -m 2026-10-23T21:41:38.7870549Z hint: 2026-10-23T21:41:38.7870883Z hint: Disable this message with "git config set advice.defaultBranchName false" 2026-10-23T21:41:38.7871451Z Initialized empty Git repository in /home/runner/_work/t3code/t3code/.git/ 2026-10-23T21:41:38.7872496Z [command]/usr/local/bin/git remote add origin https://github.com/pingdotgg/t3code 2026-10-23T21:41:38.7916588Z ##[endgroup] 2026-10-23T21:41:38.7917036Z ##[group]Disabling automatic garbage collection 2026-10-23T21:41:38.7918424Z [command]/usr/local/bin/git config --local gc.auto 0 2026-10-23T21:41:38.7946699Z ##[endgroup] 2026-10-23T21:41:38.7947123Z ##[group]Setting up auth 2026-10-23T21:41:38.7947409Z Removing SSH command configuration 2026-10-23T21:41:38.7952511Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-23T21:41:38.7979579Z [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-23T21:41:38.8169310Z Removing HTTP extra header 2026-10-23T21:41:38.8174671Z [command]/usr/local/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader 2026-10-23T21:41:38.8204570Z [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-23T21:41:38.8312612Z Removing includeIf entries pointing to credentials config files 2026-10-23T21:41:38.8318272Z [command]/usr/local/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: 2026-10-23T21:41:38.8349611Z [command]/usr/local/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url 2026-10-23T21:41:38.8455127Z [command]/usr/local/bin/git config --file /home/runner/_work/_temp/git-credentials-ece298bf-7903-4819-bd95-1fd930cc5071.config http.https://github.com/.extraheader AUTHORIZATION: basic *** 2026-10-23T21:41:38.8489006Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git.path /home/runner/_work/_temp/git-credentials-ece298bf-7903-4819-bd95-1fd930cc5071.config 2026-10-23T21:41:38.8515201Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git/worktrees/*.path /home/runner/_work/_temp/git-credentials-ece298bf-7903-4819-bd95-1fd930cc5071.config 2026-10-23T21:41:38.8541685Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-ece298bf-7903-4819-bd95-1fd930cc5071.config 2026-10-23T21:41:38.8564573Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-ece298bf-7903-4819-bd95-1fd930cc5071.config 2026-10-23T21:41:38.8593897Z ##[endgroup] 2026-10-23T21:41:38.8594268Z ##[group]Fetching the repository 2026-10-23T21:41:38.8599758Z [command]/usr/local/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --filter=blob:none --depth=1 origin +5fd726b043ff9e8f4c6d7baede62a5c89d1618a0:refs/remotes/pull/24235/merge 2026-10-23T21:41:39.5838474Z From https://github.com/pingdotgg/t3code 2026-10-23T21:41:39.5839753Z * [new ref] 5fd726b043ff9e8f4c6d7baede62a5c89d1618a0 -> pull/24235/merge 2026-10-23T21:41:39.5872257Z ##[endgroup] 2026-10-23T21:41:39.5873244Z ##[group]Determining the checkout info 2026-10-23T21:41:39.5874183Z ##[endgroup] 2026-10-23T21:41:39.5874988Z ##[group]Setting up sparse checkout 2026-10-23T21:41:39.5876734Z [command]/usr/local/bin/git config core.sparseCheckout true 2026-10-23T21:41:39.5906250Z [command]/usr/local/bin/git rev-parse --git-path info/sparse-checkout 2026-10-23T21:41:39.5925163Z .git/info/sparse-checkout 2026-10-23T21:41:39.5929051Z ##[endgroup] 2026-10-23T21:41:39.5930014Z ##[group]Checking out the ref 2026-10-23T21:41:39.5932117Z [command]/usr/local/bin/git checkout --progress --force refs/remotes/pull/24235/merge 2026-10-23T21:41:46.5875139Z Updating files: 0% (1/6309) 2026-10-23T21:41:46.5903953Z Updating files: 1% (64/6309) 2026-10-23T21:41:46.5921653Z Updating files: 2% (127/6309) 2026-10-23T21:41:46.5944836Z Updating files: 3% (190/6309) 2026-10-23T21:41:46.5966405Z Updating files: 4% (253/6309) 2026-10-23T21:41:46.6000049Z Updating files: 5% (316/6309) 2026-10-23T21:41:46.6025271Z Updating files: 6% (379/6309) 2026-10-23T21:41:46.6098316Z Updating files: 7% (442/6309) 2026-10-23T21:41:46.6131523Z Updating files: 8% (505/6309) 2026-10-23T21:41:46.6152751Z Updating files: 9% (568/6309) 2026-10-23T21:41:46.6155413Z Updating files: 9% (624/6309) 2026-10-23T21:41:46.6444472Z Updating files: 10% (631/6309) 2026-10-23T21:41:46.6459922Z Updating files: 11% (694/6309) 2026-10-23T21:41:46.6470687Z Updating files: 12% (758/6309) 2026-10-23T21:41:46.6485768Z Updating files: 13% (821/6309) 2026-10-23T21:41:46.6501731Z Updating files: 14% (884/6309) 2026-10-23T21:41:46.6519430Z Updating files: 15% (947/6309) 2026-10-23T21:41:46.6538436Z Updating files: 16% (1010/6309) 2026-10-23T21:41:46.6552647Z Updating files: 17% (1073/6309) 2026-10-23T21:41:46.6571172Z Updating files: 18% (1136/6309) 2026-10-23T21:41:46.6586901Z Updating files: 19% (1199/6309) 2026-10-23T21:41:46.6610524Z Updating files: 20% (1262/6309) 2026-10-23T21:41:46.6629216Z Updating files: 21% (1325/6309) 2026-10-23T21:41:46.6648578Z Updating files: 22% (1388/6309) 2026-10-23T21:41:46.6661913Z Updating files: 23% (1452/6309) 2026-10-23T21:41:46.6674579Z Updating files: 24% (1515/6309) 2026-10-23T21:41:46.6691734Z Updating files: 25% (1578/6309) 2026-10-23T21:41:46.6705313Z Updating files: 26% (1641/6309) 2026-10-23T21:41:46.6719167Z Updating files: 27% (1704/6309) 2026-10-23T21:41:46.6739490Z Updating files: 28% (1767/6309) 2026-10-23T21:41:46.6772720Z Updating files: 29% (1830/6309) 2026-10-23T21:41:46.6793002Z Updating files: 30% (1893/6309) 2026-10-23T21:41:46.6816165Z Updating files: 31% (1956/6309) 2026-10-23T21:41:46.6846633Z Updating files: 32% (2019/6309) 2026-10-23T21:41:46.6876456Z Updating files: 33% (2082/6309) 2026-10-23T21:41:46.6946794Z Updating files: 34% (2146/6309) 2026-10-23T21:41:46.7003304Z Updating files: 35% (2209/6309) 2026-10-23T21:41:46.7038419Z Updating files: 36% (2272/6309) 2026-10-23T21:41:46.7069997Z Updating files: 37% (2335/6309) 2026-10-23T21:41:46.7112740Z Updating files: 38% (2398/6309) 2026-10-23T21:41:46.7139652Z Updating files: 39% (2461/6309) 2026-10-23T21:41:46.7172349Z Updating files: 40% (2524/6309) 2026-10-23T21:41:46.7206804Z Updating files: 41% (2587/6309) 2026-10-23T21:41:46.7224311Z Updating files: 42% (2650/6309) 2026-10-23T21:41:46.7234162Z Updating files: 43% (2713/6309) 2026-10-23T21:41:46.7257511Z Updating files: 44% (2776/6309) 2026-10-23T21:41:46.7287949Z Updating files: 45% (2840/6309) 2026-10-23T21:41:46.7312891Z Updating files: 46% (2903/6309) 2026-10-23T21:41:46.7339975Z Updating files: 47% (2966/6309) 2026-10-23T21:41:46.7368961Z Updating files: 48% (3029/6309) 2026-10-23T21:41:46.7399201Z Updating files: 49% (3092/6309) 2026-10-23T21:41:46.7436631Z Updating files: 50% (3155/6309) 2026-10-23T21:41:46.7455455Z Updating files: 51% (3218/6309) 2026-10-23T21:41:46.7491898Z Updating files: 52% (3281/6309) 2026-10-23T21:41:46.7515805Z Updating files: 53% (3344/6309) 2026-10-23T21:41:46.7537645Z Updating files: 54% (3407/6309) 2026-10-23T21:41:46.7561340Z Updating files: 55% (3470/6309) 2026-10-23T21:41:46.7579759Z Updating files: 56% (3534/6309) 2026-10-23T21:41:46.7598744Z Updating files: 57% (3597/6309) 2026-10-23T21:41:46.7616923Z Updating files: 58% (3660/6309) 2026-10-23T21:41:46.7994326Z Updating files: 59% (3723/6309) 2026-10-23T21:41:46.8008392Z Updating files: 60% (3786/6309) 2026-10-23T21:41:46.8024919Z Updating files: 61% (3849/6309) 2026-10-23T21:41:46.8042945Z Updating files: 62% (3912/6309) 2026-10-23T21:41:46.8064730Z Updating files: 63% (3975/6309) 2026-10-23T21:41:46.8091194Z Updating files: 64% (4038/6309) 2026-10-23T21:41:46.8112912Z Updating files: 65% (4101/6309) 2026-10-23T21:41:46.8129130Z Updating files: 66% (4164/6309) 2026-10-23T21:41:46.8158388Z Updating files: 67% (4228/6309) 2026-10-23T21:41:46.8172674Z Updating files: 68% (4291/6309) 2026-10-23T21:41:46.8194779Z Updating files: 69% (4354/6309) 2026-10-23T21:41:46.8208577Z Updating files: 70% (4417/6309) 2026-10-23T21:41:46.8227168Z Updating files: 71% (4480/6309) 2026-10-23T21:41:46.8244931Z Updating files: 72% (4543/6309) 2026-10-23T21:41:46.8271977Z Updating files: 73% (4606/6309) 2026-10-23T21:41:46.8535159Z Updating files: 74% (4669/6309) 2026-10-23T21:41:46.8720042Z Updating files: 75% (4732/6309) 2026-10-23T21:41:46.8743755Z Updating files: 76% (4795/6309) 2026-10-23T21:41:46.8764325Z Updating files: 77% (4858/6309) 2026-10-23T21:41:46.8792822Z Updating files: 78% (4922/6309) 2026-10-23T21:41:46.8813030Z Updating files: 79% (4985/6309) 2026-10-23T21:41:46.8830163Z Updating files: 80% (5048/6309) 2026-10-23T21:41:46.8849936Z Updating files: 81% (5111/6309) 2026-10-23T21:41:46.8870541Z Updating files: 82% (5174/6309) 2026-10-23T21:41:46.8889259Z Updating files: 83% (5237/6309) 2026-10-23T21:41:46.8910483Z Updating files: 84% (5300/6309) 2026-10-23T21:41:46.8930359Z Updating files: 85% (5363/6309) 2026-10-23T21:41:46.8952132Z Updating files: 86% (5426/6309) 2026-10-23T21:41:46.9023091Z Updating files: 87% (5489/6309) 2026-10-23T21:41:46.9057592Z Updating files: 88% (5552/6309) 2026-10-23T21:41:46.9077187Z Updating files: 89% (5616/6309) 2026-10-23T21:41:46.9106194Z Updating files: 90% (5679/6309) 2026-10-23T21:41:46.9145794Z Updating files: 91% (5742/6309) 2026-10-23T21:41:46.9161705Z Updating files: 92% (5805/6309) 2026-10-23T21:41:46.9178895Z Updating files: 93% (5868/6309) 2026-10-23T21:41:46.9199679Z Updating files: 94% (5931/6309) 2026-10-23T21:41:46.9224058Z Updating files: 95% (5994/6309) 2026-10-23T21:41:46.9278331Z Updating files: 96% (6057/6309) 2026-10-23T21:41:46.9306827Z Updating files: 97% (6120/6309) 2026-10-23T21:41:46.9356019Z Updating files: 98% (6183/6309) 2026-10-23T21:41:46.9377383Z Updating files: 99% (6246/6309) 2026-10-23T21:41:46.9377549Z Updating files: 100% (6309/6309) 2026-10-23T21:41:46.9377691Z Updating files: 100% (6309/6309), done. 2026-10-23T21:41:46.9532050Z Note: switching to 'refs/remotes/pull/24235/merge'. 2026-10-23T21:41:46.9532188Z 2026-10-23T21:41:46.9532329Z You are in 'detached HEAD' state. You can look around, make experimental 2026-10-23T21:41:46.9532572Z changes and commit them, and you can discard any commits you make in this 2026-10-23T21:41:46.9532808Z state without impacting any branches by switching back to a branch. 2026-10-23T21:41:46.9532951Z 2026-10-23T21:41:46.9533048Z If you want to create a new branch to retain commits you create, you may 2026-10-23T21:41:46.9533276Z do so (now or later) by using -c with the switch command. Example: 2026-10-23T21:41:46.9533405Z 2026-10-23T21:41:46.9533469Z git switch -c 2026-10-23T21:41:46.9533562Z 2026-10-23T21:41:46.9533616Z Or undo this operation with: 2026-10-23T21:41:46.9533702Z 2026-10-23T21:41:46.9533778Z git switch - 2026-10-23T21:41:46.9533851Z 2026-10-23T21:41:46.9533959Z Turn off this advice by setting config variable advice.detachedHead to false 2026-10-23T21:41:46.9534113Z 2026-10-23T21:41:46.9534285Z HEAD is now at 5fd726b Merge ed20e7cf51e579c19b97ab1ba7079f726923940e into 9a391eb3f55b738113b61768cf2d8263b4f3ac2e 2026-10-23T21:41:46.9546001Z ##[endgroup] 2026-10-23T21:41:46.9583133Z [command]/usr/local/bin/git log -1 --format=%H 2026-10-23T21:41:46.9605454Z 5fd726b043ff9e8f4c6d7baede62a5c89d1618a0 2026-10-23T21:41:46.9694454Z ##[group]Run files="$(git ls-files .github/pr-assets)" 2026-10-23T21:41:46.9694709Z files="$(git ls-files .github/pr-assets)" 2026-10-23T21:41:46.9694899Z if test -n "$files"; then 2026-10-23T21:41:46.9695132Z  printf 'PR evidence must be uploaded to GitHub, not committed:\n%s\n' "$files" >&2 2026-10-23T21:41:46.9695350Z  exit 1 2026-10-23T21:41:46.9695460Z fi 2026-10-23T21:41:46.9708914Z shell: /usr/bin/bash -e {0} 2026-10-23T21:41:46.9709058Z env: 2026-10-23T21:41:46.9709181Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 201 2026-10-23T21:41:46.9709338Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 516 2026-10-23T21:41:46.9709487Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T21:41:46.9709632Z ##[endgroup] 2026-10-23T21:41:46.9871653Z Prepare all required actions 2026-10-23T21:41:46.9871973Z Getting action download info 2026-10-23T21:41:47.0757119Z Download action repository 'voidzero-dev/setup-vp@v1' (SHA:250f29ce396baf5e8f24498e17c0dfdebabc26eb) 2026-10-23T21:41:47.1874945Z ##[group]Run ./.github/actions/setup-ci-deps 2026-10-23T21:41:47.1875121Z env: 2026-10-23T21:41:47.1875237Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 201 2026-10-23T21:41:47.1875382Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 516 2026-10-23T21:41:47.1875540Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T21:41:47.1875693Z ##[endgroup] 2026-10-23T21:41:47.2887732Z ##[start-action display=Resolve Vite+ version;id=__self.vp] 2026-10-23T21:41:47.2904797Z ##[group]Run echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-23T21:41:47.2905281Z echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-23T21:41:47.2905570Z echo "node=$(jq -r '.engines.node' package.json)" >> "$GITHUB_OUTPUT" 2026-10-23T21:41:47.2905803Z echo "pnpm=$(jq -r '.packageManager' package.json)" >> "$GITHUB_OUTPUT" 2026-10-23T21:41:47.2918527Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T21:41:47.2918690Z env: 2026-10-23T21:41:47.2918818Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 201 2026-10-23T21:41:47.2918968Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 516 2026-10-23T21:41:47.2919106Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T21:41:47.2919246Z ##[endgroup] 2026-10-23T21:41:47.2996074Z ##[end-action id=__self.vp;outcome=success;conclusion=success;duration_ms=10] 2026-10-23T21:41:47.2997798Z ##[start-action display=Cache Vite+;id=__self.vp_cache] 2026-10-23T21:41:47.3047505Z ##[group]Run actions/cache@v6 2026-10-23T21:41:47.3047648Z with: 2026-10-23T21:41:47.3047751Z path: ~/.vite-plus 2026-10-23T21:41:47.3047911Z key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-23T21:41:47.3048153Z enableCrossOsArchive: false 2026-10-23T21:41:47.3048319Z fail-on-cache-miss: false 2026-10-23T21:41:47.3048441Z lookup-only: false 2026-10-23T21:41:47.3048546Z save-always: false 2026-10-23T21:41:47.3048658Z env: 2026-10-23T21:41:47.3048765Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 201 2026-10-23T21:41:47.3048912Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 516 2026-10-23T21:41:47.3049050Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T21:41:47.3049178Z ##[endgroup] 2026-10-23T21:41:47.5154912Z Cache hit for: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-23T21:41:47.9152445Z Received 170349591 of 170349591 (100.0%), 433.2 MBs/sec 2026-10-23T21:41:47.9154223Z Cache Size: ~162 MB (170349591 B) 2026-10-23T21:41:47.9246693Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/2968a8ba-4145-47a6-8693-f0bcc7ed7399/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-23T21:41:48.6364172Z Cache restored successfully 2026-10-23T21:41:48.6509629Z Cache restored from key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-23T21:41:48.6565789Z ##[end-action id=__self.vp_cache;outcome=success;conclusion=success;duration_ms=1356] 2026-10-23T21:41:48.6568410Z ##[start-action display=Use cached Vite+;id=__self.__run] 2026-10-23T21:41:48.6596123Z ##[group]Run echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-23T21:41:48.6596462Z echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-23T21:41:48.6596736Z "$HOME/.vite-plus/bin/vp" env use "26.12.1" 2026-10-23T21:41:48.6611832Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T21:41:48.6612004Z env: 2026-10-23T21:41:48.6612129Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 201 2026-10-23T21:41:48.6612275Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 516 2026-10-23T21:41:48.6612460Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T21:41:48.6612631Z ##[endgroup] 2026-10-23T21:41:48.6653268Z Using Node.js v26.12.1 (resolved from 26.12.1) 2026-10-23T21:41:48.6661501Z ##[end-action id=__self.__run;outcome=success;conclusion=success;duration_ms=9] 2026-10-23T21:41:48.6663094Z ##[start-action display=Setup Vite+;id=__self.__voidzero-dev_setup-vp] 2026-10-23T21:41:48.6667567Z ##[end-action id=__self.__voidzero-dev_setup-vp;outcome=skipped;conclusion=skipped;duration_ms=0] 2026-10-23T21:41:48.6668685Z ##[start-action display=Resolve pnpm store path;id=__self.pnpm_store] 2026-10-23T21:41:48.6680517Z ##[group]Run store_path="$(vp pm cache dir)" 2026-10-23T21:41:48.6680735Z store_path="$(vp pm cache dir)" 2026-10-23T21:41:48.6680964Z echo "path=$store_path" >> "$GITHUB_OUTPUT" 2026-10-23T21:41:48.6694288Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T21:41:48.6694529Z env: 2026-10-23T21:41:48.6706057Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 201 2026-10-23T21:41:48.6706399Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 516 2026-10-23T21:41:48.6706543Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T21:41:48.6706703Z ##[endgroup] 2026-10-23T21:41:48.6846437Z ##[end-action id=__self.pnpm_store;outcome=success;conclusion=success;duration_ms=17] 2026-10-23T21:41:48.6848557Z ##[start-action display=Cache full pnpm store;id=__self.__actions_cache] 2026-10-23T21:41:48.7538440Z ##[group]Run actions/cache@v6 2026-10-23T21:41:48.7538677Z with: 2026-10-23T21:41:48.7538877Z path: /home/runner/.local/share/pnpm/store/v11 2026-10-23T21:41:48.7539291Z key: pnpm-full-v1-Linux-X64-3cb0b4d7cff93dc8fe33f2ea73cac71ca25a36270fcb648b9b4a9320151012ef 2026-10-23T21:41:48.7539709Z restore-keys: pnpm-full-v1-Linux-X64- 2026-10-23T21:41:48.7539936Z enableCrossOsArchive: false 2026-10-23T21:41:48.7540143Z fail-on-cache-miss: false 2026-10-23T21:41:48.7540334Z lookup-only: false 2026-10-23T21:41:48.7540519Z save-always: false 2026-10-23T21:41:48.7540727Z env: 2026-10-23T21:41:48.7540907Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 201 2026-10-23T21:41:48.7541128Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 516 2026-10-23T21:41:48.7541335Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T21:41:48.7541534Z ##[endgroup] 2026-10-23T21:41:48.9698440Z Cache hit for restore-key: pnpm-full-v1-Linux-X64-2baa264059789b1dde4bbc8fdc5b8342f31f2fc8e6176e5c5e486efdd242b36c 2026-10-23T21:41:50.0174690Z Received 536870912 of 994615207 (54.0%), 505.9 MBs/sec 2026-10-23T21:41:50.6970795Z Received 994615207 of 994615207 (100.0%), 560.9 MBs/sec 2026-10-23T21:41:50.6971145Z Cache Size: ~949 MB (994615207 B) 2026-10-23T21:41:50.7023940Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/cd41aae7-cf1a-44c6-b62a-5d6d022de2c6/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-23T21:41:56.0655179Z Cache restored successfully 2026-10-23T21:41:56.1111101Z Cache restored from key: pnpm-full-v1-Linux-X64-2baa264059789b1dde4bbc8fdc5b8342f31f2fc8e6176e5c5e486efdd242b36c 2026-10-23T21:41:56.1183000Z ##[end-action id=__self.__actions_cache;outcome=success;conclusion=success;duration_ms=7433] 2026-10-23T21:41:56.1185560Z ##[start-action display=Install dependencies;id=__self.__run_2] 2026-10-23T21:41:56.1195994Z ##[group]Run vp install 2026-10-23T21:41:56.1196135Z vp install 2026-10-23T21:41:56.1209309Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T21:41:56.1209472Z env: 2026-10-23T21:41:56.1209584Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 201 2026-10-23T21:41:56.1209729Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 516 2026-10-23T21:41:56.1209873Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T21:41:56.1210006Z ##[endgroup] 2026-10-23T21:41:56.1551240Z Scope: all 33 workspace projects 2026-10-23T21:41:56.2607975Z ? Verifying lockfile against supply-chain policies (2088 entries)... 2026-10-23T21:41:56.5175685Z Packages are hard linked from the content-addressable store to the virtual store. 2026-10-23T21:41:56.5176020Z Content-addressable store is at: /home/runner/.local/share/pnpm/store/v11 2026-10-23T21:41:56.5176240Z Virtual store is at: node_modules/.pnpm 2026-10-23T21:41:59.1435636Z ✓ Lockfile passes supply-chain policies (2088 entries in 2.9s) 2026-10-23T21:41:59.1435917Z Lockfile is up to date, resolution step is skipped 2026-10-23T21:41:59.1624996Z Packages: +1721 2026-10-23T21:41:59.1625176Z ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2026-10-23T21:41:59.1946708Z Progress: resolved 1721, reused 1717, downloaded 1, added 1721, done 2026-10-23T21:42:00.0853339Z . prepare$ vp config --no-agent 2026-10-23T21:42:00.1997270Z . prepare: Done 2026-10-23T21:42:00.2010184Z 2026-10-23T21:42:00.2010854Z devDependencies: 2026-10-23T21:42:00.2011019Z + @coderabbitai/config 1.1.0 2026-10-23T21:42:00.2011155Z + @shadcn/lint 0.1.5 2026-10-23T21:42:00.2011304Z + @types/node 24.12.4 2026-10-23T21:42:00.2011426Z + knip 6.34.0 2026-10-23T21:42:00.2011563Z + typescript <- @tsc-rs/typescript 0.8.0 2026-10-23T21:42:00.2011705Z + vite-plus 1.3.0 2026-10-23T21:42:00.2011774Z 2026-10-23T21:42:00.2034424Z Done in 4.1s using pnpm v12.14.0 2026-10-23T21:42:00.2185676Z ##[end-action id=__self.__run_2;outcome=success;conclusion=success;duration_ms=4099] 2026-10-23T21:42:00.2696115Z ##[group]Run actions/cache@v6 2026-10-23T21:42:00.2696303Z with: 2026-10-23T21:42:00.2696421Z path: ~/.cache/electron 2026-10-23T21:42:00.2696650Z key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-23T21:42:00.2696889Z enableCrossOsArchive: false 2026-10-23T21:42:00.2697037Z fail-on-cache-miss: false 2026-10-23T21:42:00.2697163Z lookup-only: false 2026-10-23T21:42:00.2697285Z save-always: false 2026-10-23T21:42:00.2697414Z env: 2026-10-23T21:42:00.2697549Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 201 2026-10-23T21:42:00.2697709Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 516 2026-10-23T21:42:00.2697872Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T21:42:00.2698011Z ##[endgroup] 2026-10-23T21:42:00.4801006Z Cache hit for: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-23T21:42:00.6449148Z Received 122906203 of 122906203 (100.0%), 797.4 MBs/sec 2026-10-23T21:42:00.6449631Z Cache Size: ~117 MB (122906203 B) 2026-10-23T21:42:00.6507198Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/47867013-1937-490b-b7bb-052a7b0ed797/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-23T21:42:00.7320800Z Cache restored successfully 2026-10-23T21:42:00.7468937Z Cache restored from key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-23T21:42:00.7624482Z ##[group]Run vp run --filter @t3tools/desktop ensure:electron 2026-10-23T21:42:00.7624942Z vp run --filter @t3tools/desktop ensure:electron 2026-10-23T21:42:00.7642876Z shell: /usr/bin/bash -e {0} 2026-10-23T21:42:00.7643016Z env: 2026-10-23T21:42:00.7643376Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 201 2026-10-23T21:42:00.7643533Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 516 2026-10-23T21:42:00.7643677Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T21:42:00.7643822Z ##[endgroup] 2026-10-23T21:42:00.9300367Z ~/apps/desktop$ node scripts/ensure-electron-runtime.mjs ⊘ cache disabled 2026-10-23T21:42:01.4934194Z /home/runner/_work/t3code/t3code/node_modules/.pnpm/electron@44.9.3_supports-color@8.1.1/node_modules/electron/dist/electron 2026-10-23T21:42:01.4981685Z 2026-10-23T21:42:01.5062498Z ##[group]Run vp run knip:check 2026-10-23T21:42:01.5062671Z vp run knip:check 2026-10-23T21:42:01.5075373Z shell: /usr/bin/bash -e {0} 2026-10-23T21:42:01.5075504Z env: 2026-10-23T21:42:01.5075616Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 201 2026-10-23T21:42:01.5075765Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 516 2026-10-23T21:42:01.5075959Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T21:42:01.5076216Z ##[endgroup] 2026-10-23T21:42:01.6605944Z $ knip --include files,dependencies --no-config-hints ⊘ cache disabled 2026-10-23T21:42:05.5434463Z 2026-10-23T21:42:05.5437439Z $ 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-23T21:42:14.0491475Z 2026-10-23T21:42:14.0492781Z --- 2026-10-23T21:42:14.0493068Z vp run: 2/2 successful. (Run `vp run --last-details` for full details) 2026-10-23T21:42:14.0574120Z ##[group]Run vp run --filter @t3tools/source-control-github generate --check 2026-10-23T21:42:14.0574578Z vp run --filter @t3tools/source-control-github generate --check 2026-10-23T21:42:14.0592086Z shell: /usr/bin/bash -e {0} 2026-10-23T21:42:14.0592292Z env: 2026-10-23T21:42:14.0592467Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 201 2026-10-23T21:42:14.0592713Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 516 2026-10-23T21:42:14.0592940Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T21:42:14.0593164Z ##[endgroup] 2026-10-23T21:42:14.2148927Z ~/packages/source-control-github$ graphqlgen --check ⊘ cache disabled 2026-10-23T21:42:14.4094007Z 2026-10-23T21:42:14.4173919Z ##[group]Run vp run --filter t3 generate --check 2026-10-23T21:42:14.4174178Z vp run --filter t3 generate --check 2026-10-23T21:42:14.4188765Z shell: /usr/bin/bash -e {0} 2026-10-23T21:42:14.4188894Z env: 2026-10-23T21:42:14.4189016Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 201 2026-10-23T21:42:14.4189167Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 516 2026-10-23T21:42:14.4189306Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T21:42:14.4189442Z ##[endgroup] 2026-10-23T21:42:14.5777231Z ~/apps/server$ graphqlgen --check ⊘ cache disabled 2026-10-23T21:42:14.7278270Z 2026-10-23T21:42:14.7353243Z ##[group]Run vp check 2026-10-23T21:42:14.7353404Z vp check 2026-10-23T21:42:14.7366558Z shell: /usr/bin/bash -e {0} 2026-10-23T21:42:14.7366688Z env: 2026-10-23T21:42:14.7366798Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 201 2026-10-23T21:42:14.7366947Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 516 2026-10-23T21:42:14.7367087Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T21:42:14.7367219Z ##[endgroup] 2026-10-23T21:42:15.2887308Z pass: All 5666 files are correctly formatted (406ms, 8 threads) 2026-10-23T21:42:21.0431125Z warn: Lint warnings found 2026-10-23T21:42:21.0432043Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-23T21:42:21.0432408Z ╭─[packages/shared/src/composerContextLegacySend.ts:19:45] 2026-10-23T21:42:21.0432713Z 18 │ const occurrences = collectComposerContextReferences(text); 2026-10-23T21:42:21.0432964Z 19 │ for (const occurrence of [...occurrences].reverse()) { 2026-10-23T21:42:21.0433248Z ·  ─────── 2026-10-23T21:42:21.0433477Z 20 │ const record = recordsById.get(occurrence.contextId); 2026-10-23T21:42:21.0433655Z ╰──── 2026-10-23T21:42:21.0433995Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-23T21:42:21.0434238Z 2026-10-23T21:42:21.0434506Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T21:42:21.0434940Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:215:7] 2026-10-23T21:42:21.0435166Z 211 │ }; 2026-10-23T21:42:21.0435303Z 212 │ useEffect(() => { 2026-10-23T21:42:21.0435468Z ·  ────┬──── 2026-10-23T21:42:21.0435685Z · ╰── This is the containing effect 2026-10-23T21:42:21.0435991Z 213 │ const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null; 2026-10-23T21:42:21.0436231Z 214 │ if (inserted) { 2026-10-23T21:42:21.0436391Z 215 │ setSelection((current) => 2026-10-23T21:42:21.0436562Z ·  ──────┬───── 2026-10-23T21:42:21.0436838Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.0437265Z 216 │ current.start === inserted.start && current.end === inserted.end ? current : inserted, 2026-10-23T21:42:21.0437487Z ╰──── 2026-10-23T21:42:21.0438120Z  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-23T21:42:21.0438979Z  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-23T21:42:21.0439274Z 2026-10-23T21:42:21.0439529Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T21:42:21.0439936Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:296:7] 2026-10-23T21:42:21.0440172Z 284 │ }, [hasWorkspaceSnapshot]); 2026-10-23T21:42:21.0440336Z 285 │ useEffect(() => { 2026-10-23T21:42:21.0440483Z ·  ────┬──── 2026-10-23T21:42:21.0440699Z · ╰── This is the containing effect 2026-10-23T21:42:21.0440975Z 286 │ if (!environmentId || !projectCwd || !selectedProviderInstanceId) return; 2026-10-23T21:42:21.0441274Z 287 │ const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`; 2026-10-23T21:42:21.0441494Z 288 │ const now = Date.now(); 2026-10-23T21:42:21.0441696Z 289 │ const lastRequest = workspaceRefreshKeyRef.current; 2026-10-23T21:42:21.0441882Z 290 │ if ( 2026-10-23T21:42:21.0442031Z 291 │ lastRequest?.key === key && 2026-10-23T21:42:21.0442411Z 292 │ now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS 2026-10-23T21:42:21.0442666Z 293 │ ) 2026-10-23T21:42:21.0442794Z 294 │ return; 2026-10-23T21:42:21.0443033Z 295 │ if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) { 2026-10-23T21:42:21.0443335Z 296 │ setWorkspaceRefreshRetry(null); 2026-10-23T21:42:21.0443539Z ·  ────────────┬─────────── 2026-10-23T21:42:21.0443824Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.0444055Z 297 │ return; 2026-10-23T21:42:21.0444187Z ╰──── 2026-10-23T21:42:21.0446042Z  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-23T21:42:21.0446935Z  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-23T21:42:21.0447230Z 2026-10-23T21:42:21.0447441Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T21:42:21.0447798Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:326:5] 2026-10-23T21:42:21.0448016Z 325 │ }, [ 2026-10-23T21:42:21.0448145Z 326 │ draftMessage, 2026-10-23T21:42:21.0448303Z ·  ──────┬───── 2026-10-23T21:42:21.0448544Z · ╰── Unnecessary dependency `draftMessage` 2026-10-23T21:42:21.0448753Z 327 │ environmentId, 2026-10-23T21:42:21.0448891Z ╰──── 2026-10-23T21:42:21.0449248Z  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-23T21:42:21.0449810Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.0450091Z 2026-10-23T21:42:21.0450322Z ⚠ eslint(no-unneeded-ternary): Unnecessary use of boolean literals in conditional expression 2026-10-23T21:42:21.0450665Z ╭─[packages/shared/src/serverSettings.test.ts:35:7] 2026-10-23T21:42:21.0450976Z 34 │ const fallback = fallbackTextGenerationModelSelection(providerInstances, (instanceId) => 2026-10-23T21:42:21.0451254Z 35 │ instanceId === configured ? true : false, 2026-10-23T21:42:21.0451491Z ·  ──────────────────────────────────────── 2026-10-23T21:42:21.0451671Z 36 │ ); 2026-10-23T21:42:21.0451792Z ╰──── 2026-10-23T21:42:21.0451938Z  help: Remove this ternary operator 2026-10-23T21:42:21.0452050Z 2026-10-23T21:42:21.0452233Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-23T21:42:21.0452530Z ╭─[apps/mobile/src/lib/useHoverGesture.ts:8:15] 2026-10-23T21:42:21.0452706Z 7 │ () => 2026-10-23T21:42:21.0452841Z 8 │ Gesture.Hover() 2026-10-23T21:42:21.0452995Z ·  ──┬── 2026-10-23T21:42:21.0453271Z · ╰── `Hover` may be a component 2026-10-23T21:42:21.0453482Z 9 │ .manualActivation(true) 2026-10-23T21:42:21.0453628Z ╰──── 2026-10-23T21:42:21.0454127Z  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-23T21:42:21.0454867Z  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-23T21:42:21.0455255Z 2026-10-23T21:42:21.0455507Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T21:42:21.0455906Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:40:5] 2026-10-23T21:42:21.0456180Z 37 │ const [initialized, setInitialized] = useState(false); 2026-10-23T21:42:21.0456377Z 38 │ useLayoutEffect(() => { 2026-10-23T21:42:21.0456547Z ·  ───────┬─────── 2026-10-23T21:42:21.0456770Z · ╰── This is the containing effect 2026-10-23T21:42:21.0456965Z 39 │ reset(); 2026-10-23T21:42:21.0457105Z 40 │ setInitialized(true); 2026-10-23T21:42:21.0457267Z ·  ───────┬────── 2026-10-23T21:42:21.0457523Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.0457763Z 41 │ }, [reset]); 2026-10-23T21:42:21.0457883Z ╰──── 2026-10-23T21:42:21.0458517Z  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-23T21:42:21.0459335Z  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-23T21:42:21.0459631Z 2026-10-23T21:42:21.0459880Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T21:42:21.0460274Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:93:5] 2026-10-23T21:42:21.0460482Z 88 │ 2026-10-23T21:42:21.0460602Z 89 │ useEffect(() => { 2026-10-23T21:42:21.0460753Z ·  ────┬──── 2026-10-23T21:42:21.0460961Z · ╰── This is the containing effect 2026-10-23T21:42:21.0461251Z 90 │ if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return; 2026-10-23T21:42:21.0461517Z 91 │ const branchName = initialProjectRef.branch; 2026-10-23T21:42:21.0461702Z 92 │ let active = true; 2026-10-23T21:42:21.0461875Z 93 │ setPendingCheckouts((count) => count + 1); 2026-10-23T21:42:21.0462071Z ·  ─────────┬───────── 2026-10-23T21:42:21.0462336Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.0462649Z 94 │ // Serialize replacements: ignoring a stale result cannot undo its Git mutation. 2026-10-23T21:42:21.0462850Z ╰──── 2026-10-23T21:42:21.0463505Z  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-23T21:42:21.0464393Z  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-23T21:42:21.0464718Z 2026-10-23T21:42:21.0464907Z ⚠ eslint(no-unused-vars): Identifier 'Arr' is imported but never used. 2026-10-23T21:42:21.0465218Z ╭─[packages/client-runtime/src/state/threadSort.ts:4:13] 2026-10-23T21:42:21.0465472Z 3 │ import type { EnvironmentThreadShell } from "./models.ts"; 2026-10-23T21:42:21.0465675Z 4 │ import * as Arr from "effect/Array"; 2026-10-23T21:42:21.0465846Z ·  ─┬─ 2026-10-23T21:42:21.0466053Z · ╰── 'Arr' is imported here 2026-10-23T21:42:21.0466263Z 5 │ import * as Order from "effect/Order"; 2026-10-23T21:42:21.0466408Z ╰──── 2026-10-23T21:42:21.0466563Z  help: Consider removing this import. 2026-10-23T21:42:21.0466680Z 2026-10-23T21:42:21.0466868Z ⚠ eslint(no-unused-vars): Identifier 'Order' is imported but never used. 2026-10-23T21:42:21.0467172Z ╭─[packages/client-runtime/src/state/threadSort.ts:5:13] 2026-10-23T21:42:21.0467385Z 4 │ import * as Arr from "effect/Array"; 2026-10-23T21:42:21.0467556Z 5 │ import * as Order from "effect/Order"; 2026-10-23T21:42:21.0467726Z ·  ──┬── 2026-10-23T21:42:21.0467941Z · ╰── 'Order' is imported here 2026-10-23T21:42:21.0468124Z 6 │ 2026-10-23T21:42:21.0468227Z ╰──── 2026-10-23T21:42:21.0468377Z  help: Consider removing this import. 2026-10-23T21:42:21.0468485Z 2026-10-23T21:42:21.0468713Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-23T21:42:21.0469049Z ╭─[apps/server/src/terminal/Manager.test.ts:731:31] 2026-10-23T21:42:21.0469238Z 730 │ ); 2026-10-23T21:42:21.0469482Z 731 │ const snapshot = events.filter((event) => event.type === "snapshot").at(-1)?.snapshot; 2026-10-23T21:42:21.0469754Z ·  ────── 2026-10-23T21:42:21.0469977Z 732 │ expect(snapshot?.history).toBe("aa😀\rEND"); 2026-10-23T21:42:21.0470255Z ╰──── 2026-10-23T21:42:21.0470503Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-23T21:42:21.0470675Z 2026-10-23T21:42:21.0470932Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T21:42:21.0471350Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:335:7] 2026-10-23T21:42:21.0471577Z 330 │ }; 2026-10-23T21:42:21.0471705Z 331 │ useEffect(() => { 2026-10-23T21:42:21.0471857Z ·  ────┬──── 2026-10-23T21:42:21.0472076Z · ╰── This is the containing effect 2026-10-23T21:42:21.0472307Z 332 │ if (!guidesEnabled && section === "guide") { 2026-10-23T21:42:21.0472520Z 333 │ requestedSection.current = "overview"; 2026-10-23T21:42:21.0472794Z 334 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-23T21:42:21.0473033Z 335 │ setSection("overview"); 2026-10-23T21:42:21.0473198Z ·  ─────┬──── 2026-10-23T21:42:21.0473491Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.0473708Z 336 │ } 2026-10-23T21:42:21.0473828Z ╰──── 2026-10-23T21:42:21.0474531Z  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-23T21:42:21.0475382Z  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-23T21:42:21.0475669Z 2026-10-23T21:42:21.0475871Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-23T21:42:21.0476237Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:337:6] 2026-10-23T21:42:21.0476501Z 332 │ if (!guidesEnabled && section === "guide") { 2026-10-23T21:42:21.0476714Z 333 │ requestedSection.current = "overview"; 2026-10-23T21:42:21.0476906Z ·  ────────┬─────── 2026-10-23T21:42:21.0477435Z · ╰── 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-23T21:42:21.0477979Z 334 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-23T21:42:21.0478327Z ·  ─────────┬───────── ──────┬────── 2026-10-23T21:42:21.0478992Z · │ ╰── 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-23T21:42:21.0479853Z · ╰── 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-23T21:42:21.0480309Z 335 │ setSection("overview"); 2026-10-23T21:42:21.0480463Z 336 │ } 2026-10-23T21:42:21.0480619Z 337 │ }, [guidesEnabled, section, insets.top]); 2026-10-23T21:42:21.0480856Z ·  ──────────────────┬───────────────── 2026-10-23T21:42:21.0481177Z · ╰── This dependency list is missing values used by the callback 2026-10-23T21:42:21.0481450Z 338 │ const tabContent = activityContent; 2026-10-23T21:42:21.0481601Z ╰──── 2026-10-23T21:42:21.0481884Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-23T21:42:21.0482391Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.0482679Z 2026-10-23T21:42:21.0482883Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-23T21:42:21.0483260Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:873:6] 2026-10-23T21:42:21.0483513Z 856 │ if ( 2026-10-23T21:42:21.0483695Z 857 │ lastSelection.current.path === route.params.path && 2026-10-23T21:42:21.0483905Z ·  ──────┬────── 2026-10-23T21:42:21.0484436Z · ╰── 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-23T21:42:21.0485016Z 858 │ lastSelection.current.id === route.params.fileSelectionId 2026-10-23T21:42:21.0485204Z 859 │ ) 2026-10-23T21:42:21.0485329Z 860 │ return; 2026-10-23T21:42:21.0485575Z 861 │ lastSelection.current = { path: route.params.path, id: route.params.fileSelectionId }; 2026-10-23T21:42:21.0485882Z 862 │ if (route.params.focus) navigation.setParams({ focus: undefined }); 2026-10-23T21:42:21.0486114Z 863 │ setJumpPath(route.params.path); 2026-10-23T21:42:21.0486289Z 864 │ setSelectedRowId(null); 2026-10-23T21:42:21.0486457Z 865 │ jumpStarted.current = false; 2026-10-23T21:42:21.0486698Z 866 │ const file = data.files.find((entry) => entry.path === route.params.path); 2026-10-23T21:42:21.0486951Z 867 │ if (!file || !nativeView.current) return; 2026-10-23T21:42:21.0487151Z ·  ─────┬──── 2026-10-23T21:42:21.0487683Z · ╰── 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-23T21:42:21.0488188Z 868 │ setCollapsedIds((ids) => ids.filter((id) => id !== file.id)); 2026-10-23T21:42:21.0488400Z 869 │ jumpStarted.current = true; 2026-10-23T21:42:21.0488633Z 870 │ void nativeView.current.scrollToFile(file.id, false).catch(() => { 2026-10-23T21:42:21.0488863Z 871 │ jumpStarted.current = false; 2026-10-23T21:42:21.0489015Z 872 │ }); 2026-10-23T21:42:21.0489270Z 873 │ }, [route.params.path, route.params.fileSelectionId, route.params.focus, data.files, navigation]); 2026-10-23T21:42:21.0489750Z ·  ──────────────────────────────────────────────┬────────────────────────────────────────────── 2026-10-23T21:42:21.0490232Z · ╰── This dependency list is missing values used by the callback 2026-10-23T21:42:21.0490550Z 874 │ const appliedFilter = useRef(filter.hideTestFiles); 2026-10-23T21:42:21.0490725Z ╰──── 2026-10-23T21:42:21.0490946Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-23T21:42:21.0491413Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.0491697Z 2026-10-23T21:42:21.0492055Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T21:42:21.0492483Z ╭─[apps/server/src/serverRuntimeStartup.ts:728:7] 2026-10-23T21:42:21.0492679Z 727 │ 2026-10-23T21:42:21.0492820Z 728 │ const layer = layerWithOptions(); 2026-10-23T21:42:21.0492997Z ·  ──┬── 2026-10-23T21:42:21.0493221Z · ╰── 'layer' is declared here 2026-10-23T21:42:21.0493436Z ╰──── 2026-10-23T21:42:21.0493598Z  help: Consider removing this declaration. 2026-10-23T21:42:21.0493720Z 2026-10-23T21:42:21.0493983Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-23T21:42:21.0494352Z ╭─[apps/server/src/telemetry/AnalyticsService.ts:340:7] 2026-10-23T21:42:21.0494552Z 339 │ 2026-10-23T21:42:21.0494732Z 340 │ const layerTest = AnalyticsService.layerTest; 2026-10-23T21:42:21.0494936Z ·  ────┬──── 2026-10-23T21:42:21.0495161Z · ╰── 'layerTest' is declared here 2026-10-23T21:42:21.0495354Z ╰──── 2026-10-23T21:42:21.0495524Z  help: Consider removing this declaration. 2026-10-23T21:42:21.0495642Z 2026-10-23T21:42:21.0495828Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-23T21:42:21.0496136Z ╭─[packages/client-runtime/src/state/shell.ts:189:5] 2026-10-23T21:42:21.0496378Z 186 │ let waiting = yield* Ref.get(awaitingCompletion); 2026-10-23T21:42:21.0496574Z 187 │ let next = initial; 2026-10-23T21:42:21.0496730Z ·  ──┬─ 2026-10-23T21:42:21.0512355Z · ╰── From this accumulator 2026-10-23T21:42:21.0512681Z 188 │ let receivedSnapshot = false; 2026-10-23T21:42:21.0512879Z 189 │ for (const item of items) { 2026-10-23T21:42:21.0513056Z ·  ─┬─ 2026-10-23T21:42:21.0513281Z · ╰── For this loop 2026-10-23T21:42:21.0513499Z 190 │ if (item.kind === "synchronized") { 2026-10-23T21:42:21.0513679Z 191 │ waiting = false; 2026-10-23T21:42:21.0513860Z 192 │ if (Option.isSome(next.snapshot)) { 2026-10-23T21:42:21.0514098Z 193 │ next = { ...next, status: "live", error: Option.none() }; 2026-10-23T21:42:21.0514318Z ·  ───┬─── 2026-10-23T21:42:21.0514560Z · ╰── From this spread 2026-10-23T21:42:21.0514760Z 194 │ } 2026-10-23T21:42:21.0514881Z ╰──── 2026-10-23T21:42:21.0515102Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-23T21:42:21.0515424Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-23T21:42:21.0515588Z 2026-10-23T21:42:21.0515802Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-23T21:42:21.0516131Z ╭─[packages/client-runtime/src/state/filesystem.ts:3:8] 2026-10-23T21:42:21.0516343Z 2 │ AuthFilesystemReadScope, 2026-10-23T21:42:21.0516505Z 3 │ type AuthSessionState, 2026-10-23T21:42:21.0516678Z ·  ────────┬─────── 2026-10-23T21:42:21.0516926Z · ╰── 'AuthSessionState' is imported here 2026-10-23T21:42:21.0517150Z 4 │ type FilesystemBrowseEntry, 2026-10-23T21:42:21.0517290Z ╰──── 2026-10-23T21:42:21.0517553Z  help: Consider removing this import. 2026-10-23T21:42:21.0517714Z 2026-10-23T21:42:21.0518188Z ⚠ 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-23T21:42:21.0518758Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:169:7] 2026-10-23T21:42:21.0518974Z 168 │ }); 2026-10-23T21:42:21.0519261Z 169 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-23T21:42:21.0519658Z 170 │ │ if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break; 2026-10-23T21:42:21.0519965Z 171 │ │ yield* Effect.yieldNow; 2026-10-23T21:42:21.0520226Z 172 │ ╰─▶ } 2026-10-23T21:42:21.0520425Z 173 │ 2026-10-23T21:42:21.0520539Z ╰──── 2026-10-23T21:42:21.0520596Z 2026-10-23T21:42:21.0521064Z ⚠ 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-23T21:42:21.0521619Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:178:7] 2026-10-23T21:42:21.0521882Z 177 │ yield* Deferred.succeed(releaseSave, undefined); 2026-10-23T21:42:21.0522205Z 178 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-23T21:42:21.0522528Z 179 │ │ if ((yield* Ref.get(saved)).length > 0) break; 2026-10-23T21:42:21.0522778Z 180 │ │ yield* Effect.yieldNow; 2026-10-23T21:42:21.0523035Z 181 │ ╰─▶ } 2026-10-23T21:42:21.0523465Z 182 │ 2026-10-23T21:42:21.0523736Z ╰──── 2026-10-23T21:42:21.0523798Z 2026-10-23T21:42:21.0524309Z ⚠ 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-23T21:42:21.0525006Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7] 2026-10-23T21:42:21.0525303Z 306 │ yield* Deferred.succeed(releaseUnenrichedSave, undefined); 2026-10-23T21:42:21.0525679Z 307 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-23T21:42:21.0526000Z 308 │ │ const values = yield* Ref.get(saved); 2026-10-23T21:42:21.0526338Z 309 │ │ if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) { 2026-10-23T21:42:21.0526615Z 310 │ │ break; 2026-10-23T21:42:21.0526799Z 311 │ │ } 2026-10-23T21:42:21.0527005Z 312 │ │ yield* Effect.yieldNow; 2026-10-23T21:42:21.0527269Z 313 │ ╰─▶ } 2026-10-23T21:42:21.0527467Z 314 │ 2026-10-23T21:42:21.0527585Z ╰──── 2026-10-23T21:42:21.0527646Z 2026-10-23T21:42:21.0527916Z ⚠ unicorn(prefer-add-event-listener): Prefer `addEventListener()` over their `on`-function counterparts. 2026-10-23T21:42:21.0528480Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:12:14] 2026-10-23T21:42:21.0528861Z 11 │ addEventListener(_type: string, listener: (event: { data: string }) => void) { 2026-10-23T21:42:21.0529102Z 12 │ this.onmessage = listener; 2026-10-23T21:42:21.0529293Z ·  ───────── 2026-10-23T21:42:21.0529444Z 13 │ } 2026-10-23T21:42:21.0529564Z ╰──── 2026-10-23T21:42:21.0529956Z  help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on` replaces any previously registered handler. 2026-10-23T21:42:21.0530260Z 2026-10-23T21:42:21.0530475Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-23T21:42:21.0530822Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:16:9] 2026-10-23T21:42:21.0531051Z 15 │ constructor() { 2026-10-23T21:42:21.0531203Z 16 │ source = this; 2026-10-23T21:42:21.0531362Z ·  ────── 2026-10-23T21:42:21.0531506Z 17 │ } 2026-10-23T21:42:21.0531626Z ╰──── 2026-10-23T21:42:21.0531950Z  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-23T21:42:21.0532208Z 2026-10-23T21:42:21.0532495Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-23T21:42:21.0532887Z ╭─[packages/provider-cursor/src/server/auth.ts:249:20] 2026-10-23T21:42:21.0533082Z 248 │ }, 2026-10-23T21:42:21.0533265Z 249 │ (effect, flow, stopSessions) => 2026-10-23T21:42:21.0533460Z ·  ──────┬───── 2026-10-23T21:42:21.0533741Z · ╰── 'stopSessions' is declared here 2026-10-23T21:42:21.0533965Z 250 │ effect.pipe( 2026-10-23T21:42:21.0534107Z ╰──── 2026-10-23T21:42:21.0534265Z  help: Consider removing this parameter. 2026-10-23T21:42:21.0534381Z 2026-10-23T21:42:21.0534588Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-23T21:42:21.0534916Z ╭─[packages/client-runtime/src/state/usageAccess.ts:3:8] 2026-10-23T21:42:21.0535132Z 2 │ AuthDiagnosticsReadScope, 2026-10-23T21:42:21.0535294Z 3 │ type AuthSessionState, 2026-10-23T21:42:21.0535471Z ·  ────────┬─────── 2026-10-23T21:42:21.0535726Z · ╰── 'AuthSessionState' is imported here 2026-10-23T21:42:21.0535955Z 4 │ sessionGrantsScope, 2026-10-23T21:42:21.0536098Z ╰──── 2026-10-23T21:42:21.0536250Z  help: Consider removing this import. 2026-10-23T21:42:21.0536363Z 2026-10-23T21:42:21.0536647Z ⚠ eslint(no-unused-vars): Variable 'legacyCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-23T21:42:21.0537072Z ╭─[packages/provider-cursor/src/server/credentialStore.test.ts:15:7] 2026-10-23T21:42:21.0537290Z 14 │ 2026-10-23T21:42:21.0537416Z 15 │ const legacyCredentials = { 2026-10-23T21:42:21.0537594Z ·  ────────┬──────── 2026-10-23T21:42:21.0537845Z · ╰── 'legacyCredentials' is declared here 2026-10-23T21:42:21.0538061Z 16 │ version: 1 as const, 2026-10-23T21:42:21.0538194Z ╰──── 2026-10-23T21:42:21.0538412Z  help: Consider removing this declaration. 2026-10-23T21:42:21.0538558Z 2026-10-23T21:42:21.0538729Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T21:42:21.0539043Z ╭─[apps/server/src/process/externalLauncher.test.ts:186:12] 2026-10-23T21:42:21.0539242Z 185 │ 2026-10-23T21:42:21.0539401Z 186 │ for (const {} of ["darwin", "linux"] as const) { 2026-10-23T21:42:21.0539592Z ·  ── 2026-10-23T21:42:21.0539728Z 187 │ } 2026-10-23T21:42:21.0539840Z ╰──── 2026-10-23T21:42:21.0540122Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T21:42:21.0540338Z 2026-10-23T21:42:21.0540505Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T21:42:21.0540819Z ╭─[apps/server/src/process/externalLauncher.test.ts:189:12] 2026-10-23T21:42:21.0541023Z 188 │ 2026-10-23T21:42:21.0541141Z 189 │ for (const {} of [ 2026-10-23T21:42:21.0541292Z ·  ── 2026-10-23T21:42:21.0541466Z 190 │ { kind: "browser", folderVerb: "none" }, 2026-10-23T21:42:21.0541625Z ╰──── 2026-10-23T21:42:21.0541902Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T21:42:21.0542124Z 2026-10-23T21:42:21.0542285Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T21:42:21.0542587Z ╭─[apps/server/src/process/externalLauncher.test.ts:311:12] 2026-10-23T21:42:21.0542784Z 310 │ 2026-10-23T21:42:21.0542969Z 311 │ for (const {} of ["rejected", "spawn-error", "stalled"] as const) { 2026-10-23T21:42:21.0543243Z ·  ── 2026-10-23T21:42:21.0543382Z 312 │ } 2026-10-23T21:42:21.0543492Z ╰──── 2026-10-23T21:42:21.0543767Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T21:42:21.0543983Z 2026-10-23T21:42:21.0544151Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T21:42:21.0544454Z ╭─[apps/server/src/process/externalLauncher.test.ts:314:12] 2026-10-23T21:42:21.0544652Z 313 │ 2026-10-23T21:42:21.0544772Z 314 │ for (const {} of [ 2026-10-23T21:42:21.0544920Z ·  ── 2026-10-23T21:42:21.0545056Z 315 │ { 2026-10-23T21:42:21.0545169Z ╰──── 2026-10-23T21:42:21.0545440Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T21:42:21.0545740Z 2026-10-23T21:42:21.0545983Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-23T21:42:21.0546294Z ╭─[apps/mobile/src/Stack.tsx:1052:21] 2026-10-23T21:42:21.0546484Z 1051 │ } 2026-10-23T21:42:21.0546998Z ·  ───────────────────────────────────────────── 2026-10-23T21:42:21.0547219Z 1053 │ screenListeners={{ 2026-10-23T21:42:21.0547365Z ╰──── 2026-10-23T21:42:21.0547778Z  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-23T21:42:21.0548106Z 2026-10-23T21:42:21.0548574Z ⚠ 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-23T21:42:21.0549138Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1228:7] 2026-10-23T21:42:21.0549393Z 1227 │ yield* harness.replaceSession; 2026-10-23T21:42:21.0549720Z 1228 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T21:42:21.0550077Z 1229 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) { 2026-10-23T21:42:21.0550319Z 1230 │ │ break; 2026-10-23T21:42:21.0550507Z 1231 │ │ } 2026-10-23T21:42:21.0550715Z 1232 │ │ yield* Effect.yieldNow; 2026-10-23T21:42:21.0550980Z 1233 │ ╰─▶ } 2026-10-23T21:42:21.0551191Z 1234 │ yield* Queue.offer( 2026-10-23T21:42:21.0551341Z ╰──── 2026-10-23T21:42:21.0551394Z 2026-10-23T21:42:21.0551846Z ⚠ 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-23T21:42:21.0552406Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1337:7] 2026-10-23T21:42:21.0552650Z 1336 │ yield* harness.replaceSession; 2026-10-23T21:42:21.0552971Z 1337 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T21:42:21.0553377Z 1338 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break; 2026-10-23T21:42:21.0553952Z 1339 │ │ yield* Effect.yieldNow; 2026-10-23T21:42:21.0554251Z 1340 │ ╰─▶ } 2026-10-23T21:42:21.0554543Z 1341 │ expect(yield* Ref.get(harness.subscriptionCount)).toBe(2); 2026-10-23T21:42:21.0554743Z ╰──── 2026-10-23T21:42:21.0554808Z 2026-10-23T21:42:21.0555079Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T21:42:21.0555483Z ╭─[apps/mobile/src/components/VideoPreviewModal.ios.tsx:63:55] 2026-10-23T21:42:21.0555700Z 61 │ }, []); 2026-10-23T21:42:21.0555831Z 62 │ useEffect(() => { 2026-10-23T21:42:21.0555989Z ·  ────┬──── 2026-10-23T21:42:21.0556371Z · ╰── This is the containing effect 2026-10-23T21:42:21.0556705Z 63 │ if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl); 2026-10-23T21:42:21.0556992Z ·  ───────┬────── 2026-10-23T21:42:21.0557333Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.0557611Z 64 │ }, [playbackUrl, resolvedUrl]); 2026-10-23T21:42:21.0557760Z ╰──── 2026-10-23T21:42:21.0558462Z  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-23T21:42:21.0559331Z  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-23T21:42:21.0559635Z 2026-10-23T21:42:21.0559897Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T21:42:21.0560284Z ╭─[apps/mobile/src/components/ProjectFavicon.tsx:158:5] 2026-10-23T21:42:21.0560615Z 153 │ const [activeFaviconRequest, setActiveFaviconRequest] = useState(null); 2026-10-23T21:42:21.0560872Z 154 │ useLayoutEffect(() => { 2026-10-23T21:42:21.0561042Z ·  ───────┬─────── 2026-10-23T21:42:21.0561279Z · ╰── This is the containing effect 2026-10-23T21:42:21.0561523Z 155 │ if (faviconRequest === null) return; 2026-10-23T21:42:21.0561690Z 156 │ 2026-10-23T21:42:21.0561886Z 157 │ const endRequest = beginProjectFaviconRequest(faviconRequest); 2026-10-23T21:42:21.0562127Z 158 │ setActiveFaviconRequest(faviconRequest); 2026-10-23T21:42:21.0562339Z ·  ───────────┬─────────── 2026-10-23T21:42:21.0562618Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.0562866Z 159 │ return endRequest; 2026-10-23T21:42:21.0563011Z ╰──── 2026-10-23T21:42:21.0563698Z  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-23T21:42:21.0564546Z  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-23T21:42:21.0564921Z 2026-10-23T21:42:21.0565119Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T21:42:21.0565458Z ╭─[apps/mobile/src/components/ComposerContextSheet.tsx:267:25] 2026-10-23T21:42:21.0565721Z 266 │ {record.elements?.map((element, index) => ( 2026-10-23T21:42:21.0566006Z 267 │ 2026-10-23T21:42:21.0566358Z ·  ─────────────────────────────────────────────────────── 2026-10-23T21:42:21.0566607Z 268 │ 2026-10-23T21:42:21.0568473Z ·  ──────┬───── 2026-10-23T21:42:21.0568735Z · ╰── 'stopSessions' is declared here 2026-10-23T21:42:21.0568949Z 286 │ effect.pipe( 2026-10-23T21:42:21.0569082Z ╰──── 2026-10-23T21:42:21.0569243Z  help: Consider removing this parameter. 2026-10-23T21:42:21.0569361Z 2026-10-23T21:42:21.0569620Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T21:42:21.0569998Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:68:5] 2026-10-23T21:42:21.0570243Z 66 │ const { id: attachmentId, fileUri } = attachment; 2026-10-23T21:42:21.0570422Z 67 │ useEffect(() => { 2026-10-23T21:42:21.0570575Z ·  ────┬──── 2026-10-23T21:42:21.0570796Z · ╰── This is the containing effect 2026-10-23T21:42:21.0571001Z 68 │ setUri(null); 2026-10-23T21:42:21.0571144Z ·  ───┬── 2026-10-23T21:42:21.0571404Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.0571633Z 69 │ setError(null); 2026-10-23T21:42:21.0571766Z ╰──── 2026-10-23T21:42:21.0572405Z  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-23T21:42:21.0573299Z  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-23T21:42:21.0573589Z 2026-10-23T21:42:21.0573791Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T21:42:21.0574123Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:91:7] 2026-10-23T21:42:21.0574317Z 90 │ }; 2026-10-23T21:42:21.0574458Z 91 │ }, [attachmentId, fileUri]); 2026-10-23T21:42:21.0574684Z ·  ──────┬───── ───┬─── 2026-10-23T21:42:21.0574998Z · │ ╰── Unnecessary dependency `fileUri` 2026-10-23T21:42:21.0575319Z · ╰── Unnecessary dependency `attachmentId` 2026-10-23T21:42:21.0575595Z 92 │ const mimeType = videoMimeType(attachment) ?? attachment.mimeType; 2026-10-23T21:42:21.0575784Z ╰──── 2026-10-23T21:42:21.0576116Z  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-23T21:42:21.0576681Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.0577032Z 2026-10-23T21:42:21.0577387Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T21:42:21.0577735Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:213:34] 2026-10-23T21:42:21.0577946Z 212 │ useEffect(() => { 2026-10-23T21:42:21.0578147Z 213 │ if (!isFocused && hasSource) props.onRequestClose(); 2026-10-23T21:42:21.0578371Z ·  ──┬── 2026-10-23T21:42:21.0578630Z · ╰── Missing dependency `props` 2026-10-23T21:42:21.0578877Z 214 │ }, [isFocused, hasSource, props.onRequestClose]); 2026-10-23T21:42:21.0579109Z ·  ──────────┬───────── 2026-10-23T21:42:21.0579469Z · ╰── Overly precise dependency `props.onRequestClose`, use `props` instead 2026-10-23T21:42:21.0579757Z 215 │ const { source } = props; 2026-10-23T21:42:21.0579896Z ╰──── 2026-10-23T21:42:21.0580360Z  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-23T21:42:21.0581030Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.0581313Z 2026-10-23T21:42:21.0581516Z ⚠ typescript(no-extraneous-class): Unexpected class with only a constructor. 2026-10-23T21:42:21.0581837Z ╭─[apps/desktop/src/preview/Manager.test.ts:158:18] 2026-10-23T21:42:21.0582074Z 157 │ BrowserWindow: browserWindowConstructor, 2026-10-23T21:42:21.0582349Z 158 │ ╭─▶ ClipboardItem: class { 2026-10-23T21:42:21.0582644Z 159 │ │ constructor(data: Record) { 2026-10-23T21:42:21.0582900Z 160 │ │ clipboardItemConstructor(data); 2026-10-23T21:42:21.0583103Z 161 │ │ } 2026-10-23T21:42:21.0583414Z 162 │ ╰─▶ }, 2026-10-23T21:42:21.0583608Z 163 │ clipboard: { 2026-10-23T21:42:21.0583738Z ╰──── 2026-10-23T21:42:21.0583954Z  help: Try replacing this class with a standalone function or deleting it entirely 2026-10-23T21:42:21.0584122Z 2026-10-23T21:42:21.0584355Z ⚠ eslint(no-unused-vars): Function 'resolveThreadWorkspaceCwd' is declared but never used. 2026-10-23T21:42:21.0584688Z ╭─[apps/server/src/checkpointing/Utils.ts:12:10] 2026-10-23T21:42:21.0584864Z 11 │ 2026-10-23T21:42:21.0585014Z 12 │ function resolveThreadWorkspaceCwd(input: { 2026-10-23T21:42:21.0585232Z ·  ────────────┬──────────── 2026-10-23T21:42:21.0585516Z · ╰── 'resolveThreadWorkspaceCwd' is declared here 2026-10-23T21:42:21.0585748Z 13 │ readonly thread: { 2026-10-23T21:42:21.0585877Z ╰──── 2026-10-23T21:42:21.0586030Z  help: Consider removing this declaration. 2026-10-23T21:42:21.0586143Z 2026-10-23T21:42:21.0586288Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.0586552Z ╭─[apps/mobile/src/components/ui/Menu.tsx:54:36] 2026-10-23T21:42:21.0586919Z 53 │ const child = children as ReactElement>; 2026-10-23T21:42:21.0587312Z 54 │ ╭─▶ children = cloneElement(child, { 2026-10-23T21:42:21.0587585Z 55 │ │ onTouchStart: (event) => { 2026-10-23T21:42:21.0587862Z 56 │ │ // Reset for a new touch, not onPressIn, which also fires when a 2026-10-23T21:42:21.0588177Z 57 │ │ // finger moves out of the row and back during the same gesture. 2026-10-23T21:42:21.0588469Z 58 │ │ menuPress.current.isPreparing = false; 2026-10-23T21:42:21.0588775Z 59 │ │ menuPress.current.suppressPress = menuPress.current.isOpen; 2026-10-23T21:42:21.0589055Z 60 │ │ pendingPress.current = null; 2026-10-23T21:42:21.0589302Z 61 │ │ child.props.onTouchStart?.(event); 2026-10-23T21:42:21.0589508Z 62 │ │ }, 2026-10-23T21:42:21.0589697Z 63 │ │ onPress: (event) => { 2026-10-23T21:42:21.0589975Z 64 │ │ // Accessibility clicks have no touch identifier and must not inherit 2026-10-23T21:42:21.0590288Z 65 │ │ // cancellation from a previous physical gesture. 2026-10-23T21:42:21.0590592Z 66 │ │ const isTouch = typeof event.nativeEvent.identifier === "number"; 2026-10-23T21:42:21.0590947Z 67 │ │ if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) { 2026-10-23T21:42:21.0591217Z 68 │ │ return; 2026-10-23T21:42:21.0591396Z 69 │ │ } 2026-10-23T21:42:21.0591630Z 70 │ │ if (isTouch && menuPress.current.isPreparing) { 2026-10-23T21:42:21.0591950Z 71 │ │ // A release can arrive between native menu preparation and display. 2026-10-23T21:42:21.0592280Z 72 │ │ // Let UIKit's display/cancel callback decide this press's outcome. 2026-10-23T21:42:21.0592547Z 73 │ │ event.persist(); 2026-10-23T21:42:21.0592817Z 74 │ │ pendingPress.current = () => child.props.onPress?.(event); 2026-10-23T21:42:21.0593066Z 75 │ │ return; 2026-10-23T21:42:21.0593275Z 76 │ │ } 2026-10-23T21:42:21.0593485Z 77 │ │ child.props.onPress?.(event); 2026-10-23T21:42:21.0593683Z 78 │ │ }, 2026-10-23T21:42:21.0593964Z 79 │ ├─▶ }); 2026-10-23T21:42:21.0594381Z · ╰──── Passing a ref to a function may read its value during render 2026-10-23T21:42:21.0594711Z 80 │ menuProps.onMenuInteractionStart = () => { 2026-10-23T21:42:21.0594898Z ╰──── 2026-10-23T21:42:21.0595412Z  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-23T21:42:21.0596118Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.0596386Z 2026-10-23T21:42:21.0596592Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T21:42:21.0596933Z ╭─[apps/mobile/src/state/use-thread-outbox-drain.ts:1315:5] 2026-10-23T21:42:21.0597157Z 1314 │ queuedMessagesByThreadKey, 2026-10-23T21:42:21.0597318Z 1315 │ retryTick, 2026-10-23T21:42:21.0597469Z ·  ────┬──── 2026-10-23T21:42:21.0597700Z · ╰── Unnecessary dependency `retryTick` 2026-10-23T21:42:21.0597918Z 1316 │ restoreQueuedMessage, 2026-10-23T21:42:21.0598060Z ╰──── 2026-10-23T21:42:21.0598407Z  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-23T21:42:21.0598990Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.0599288Z 2026-10-23T21:42:21.0599744Z ⚠ 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-23T21:42:21.0600279Z ╭─[packages/contracts/src/baseSchemas.test.ts:39:9] 2026-10-23T21:42:21.0600481Z 38 │ JSON.stringify( 2026-10-23T21:42:21.0600683Z 39 │ Schema.encodeUnknownSync(Schema.toCodecJson(Named))([ 2026-10-23T21:42:21.0600915Z ·  ──────────────────────── 2026-10-23T21:42:21.0601087Z 40 │ { name: "a" }, 2026-10-23T21:42:21.0601228Z ╰──── 2026-10-23T21:42:21.0601283Z 2026-10-23T21:42:21.0601428Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.0601742Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:152:27] 2026-10-23T21:42:21.0602085Z 151 │ 2026-10-23T21:42:21.0602346Z 152 │ {props.children(open)} 2026-10-23T21:42:21.0602537Z ·  ──┬─ 2026-10-23T21:42:21.0602807Z · ╰── Cannot access ref value during render 2026-10-23T21:42:21.0603026Z 153 │ 2026-10-23T21:42:21.0603156Z ╰──── 2026-10-23T21:42:21.0603708Z  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-23T21:42:21.0604471Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.0604914Z 2026-10-23T21:42:21.0605113Z ⚠ react(memo-dependencies): Found missing/extra memoization dependencies 2026-10-23T21:42:21.0605457Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:140:9] 2026-10-23T21:42:21.0605695Z 139 │ if (action.id !== undefined) { 2026-10-23T21:42:21.0605875Z 140 │ props.onPressAction?.({ 2026-10-23T21:42:21.0606042Z ·  ──┬── 2026-10-23T21:42:21.0606266Z · ╰── Missing dependency `props` 2026-10-23T21:42:21.0606496Z 141 │ nativeEvent: { event: action.id }, 2026-10-23T21:42:21.0606761Z 142 │ } as Parameters>[0]); 2026-10-23T21:42:21.0606975Z 143 │ } 2026-10-23T21:42:21.0607098Z 144 │ }, 2026-10-23T21:42:21.0607245Z 145 │ [close, props.onPressAction], 2026-10-23T21:42:21.0607442Z ·  ─────────┬───────── 2026-10-23T21:42:21.0607772Z · ╰── Overly precise dependency `props.onPressAction`, use `props` instead 2026-10-23T21:42:21.0608034Z 146 │ ); 2026-10-23T21:42:21.0608149Z ╰──── 2026-10-23T21:42:21.0608678Z  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-23T21:42:21.0609417Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.0609711Z 2026-10-23T21:42:21.0609917Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-23T21:42:21.0610232Z ╭─[packages/contracts/src/rpc.ts:295:8] 2026-10-23T21:42:21.0610414Z 294 │ } from "./device.ts"; 2026-10-23T21:42:21.0610592Z 295 │ import {} from "./previewAutomation.ts"; 2026-10-23T21:42:21.0610766Z ·  ── 2026-10-23T21:42:21.0610912Z 296 │ import { 2026-10-23T21:42:21.0611030Z ╰──── 2026-10-23T21:42:21.0611164Z  help: Remove empty braces 2026-10-23T21:42:21.0611267Z 2026-10-23T21:42:21.0611476Z ⚠ eslint(no-unused-vars): Function 'nonEmptyString' is declared but never used. 2026-10-23T21:42:21.0611826Z ╭─[packages/client-runtime/src/work-log/presentation.ts:234:10] 2026-10-23T21:42:21.0612039Z 233 │ 2026-10-23T21:42:21.0612213Z 234 │ function nonEmptyString(value: unknown): string | null { 2026-10-23T21:42:21.0612433Z ·  ───────┬────── 2026-10-23T21:42:21.0612682Z · ╰── 'nonEmptyString' is declared here 2026-10-23T21:42:21.0612972Z 235 │ return typeof value === "string" && value.trim().length > 0 ? value : null; 2026-10-23T21:42:21.0613170Z ╰──── 2026-10-23T21:42:21.0613370Z  help: Consider removing this declaration. 2026-10-23T21:42:21.0613486Z 2026-10-23T21:42:21.0613851Z ⚠ 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-23T21:42:21.0614373Z ╭─[packages/contracts/src/auth.test.ts:17:12] 2026-10-23T21:42:21.0614705Z 16 │ it("decodes legacy review credentials without offering them in new grants", () => { 2026-10-23T21:42:21.0615038Z 17 │ expect(Schema.decodeUnknownSync(AuthEnvironmentScopes)(["review:write"])).toEqual([ 2026-10-23T21:42:21.0615319Z ·  ──────────────────────── 2026-10-23T21:42:21.0615505Z 18 │ "review:write", 2026-10-23T21:42:21.0615643Z ╰──── 2026-10-23T21:42:21.0615699Z 2026-10-23T21:42:21.0616057Z ⚠ 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-23T21:42:21.0616496Z ╭─[packages/contracts/src/auth.test.ts:20:18] 2026-10-23T21:42:21.0616680Z 19 │ ]); 2026-10-23T21:42:21.0616913Z 20 │ expect(() => Schema.decodeUnknownSync(AuthGrantScopes)(["review:write"])).toThrow(); 2026-10-23T21:42:21.0617203Z ·  ──────────────────────── 2026-10-23T21:42:21.0617451Z 21 │ expect(AuthStandardClientScopes).not.toContain("review:write"); 2026-10-23T21:42:21.0617643Z ╰──── 2026-10-23T21:42:21.0617700Z 2026-10-23T21:42:21.0618057Z ⚠ 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-23T21:42:21.0618493Z ╭─[packages/contracts/src/auth.test.ts:58:21] 2026-10-23T21:42:21.0618780Z 57 │ it("ignores unknown response permissions without falling back to broader scopes", () => { 2026-10-23T21:42:21.0619074Z 58 │ const session = Schema.decodeUnknownSync(AuthSessionState)({ 2026-10-23T21:42:21.0619328Z ·  ──────────────────────── 2026-10-23T21:42:21.0619522Z 59 │ authenticated: true, 2026-10-23T21:42:21.0619666Z ╰──── 2026-10-23T21:42:21.0619721Z 2026-10-23T21:42:21.0619886Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T21:42:21.0620205Z ╭─[apps/server/src/provider/Drivers/CodexDriver.test.ts:466:14] 2026-10-23T21:42:21.0620414Z 465 │ 2026-10-23T21:42:21.0620581Z 466 │ for (const {} of ["direct", "wrapper"] as const) { 2026-10-23T21:42:21.0620769Z ·  ── 2026-10-23T21:42:21.0620916Z 467 │ } 2026-10-23T21:42:21.0621027Z ╰──── 2026-10-23T21:42:21.0621312Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T21:42:21.0621536Z 2026-10-23T21:42:21.0622011Z ⚠ 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-23T21:42:21.0622589Z ╭─[packages/client-runtime/src/connection/supervisor.test.ts:135:3] 2026-10-23T21:42:21.0622861Z 134 │ let lastState = yield* SubscriptionRef.get(state); 2026-10-23T21:42:21.0623215Z 135 │ ╭─▶ for (let iteration = 0; iteration < 100; iteration += 1) { 2026-10-23T21:42:21.0623586Z 136 │ │ lastState = yield* SubscriptionRef.get(state); 2026-10-23T21:42:21.0623840Z 137 │ │ if (predicate(lastState)) { 2026-10-23T21:42:21.0624058Z 138 │ │ return lastState; 2026-10-23T21:42:21.0624244Z 139 │ │ } 2026-10-23T21:42:21.0624502Z 140 │ │ yield* Effect.yieldNow; 2026-10-23T21:42:21.0624777Z 141 │ ╰─▶ } 2026-10-23T21:42:21.0624988Z 142 │ return yield* Effect.die( 2026-10-23T21:42:21.0625134Z ╰──── 2026-10-23T21:42:21.0625191Z 2026-10-23T21:42:21.0625397Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T21:42:21.0625708Z ╭─[apps/mobile/src/state/thread-order.ts:29:7] 2026-10-23T21:42:21.0625910Z 28 │ getPendingThreadOrder(); 2026-10-23T21:42:21.0626079Z 29 │ }, [nowMinute, snoozeWakeTick]); 2026-10-23T21:42:21.0626310Z ·  ────┬──── ───────┬────── 2026-10-23T21:42:21.0626640Z · │ ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-23T21:42:21.0626976Z · ╰── Unnecessary dependency `nowMinute` 2026-10-23T21:42:21.0627191Z 30 │ return pending; 2026-10-23T21:42:21.0627329Z ╰──── 2026-10-23T21:42:21.0627674Z  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-23T21:42:21.0628258Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.0628547Z 2026-10-23T21:42:21.0628747Z ⚠ eslint(no-unsafe-optional-chaining): Unsafe usage of optional chaining 2026-10-23T21:42:21.0629112Z ╭─[apps/server/src/orchestration-v2/ThreadLaunchService.test.ts:1783:8] 2026-10-23T21:42:21.0629347Z 1782 │ assert.equal( 2026-10-23T21:42:21.0629581Z 1783 │ (stored.context?.records[0] as { attachmentId: string }).attachmentId, 2026-10-23T21:42:21.0629841Z ·  ────────────────────────── 2026-10-23T21:42:21.0630040Z 1784 │ stored.attachments[0]?.id, 2026-10-23T21:42:21.0630195Z ╰──── 2026-10-23T21:42:21.0630419Z  help: If this short-circuits with 'undefined' the evaluation will throw TypeError 2026-10-23T21:42:21.0630591Z 2026-10-23T21:42:21.0631044Z ⚠ 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-23T21:42:21.0631584Z ╭─[packages/contracts/src/composerContext.test.ts:181:18] 2026-10-23T21:42:21.0631870Z 180 │ it("sends a message without the records the wire cannot carry", () => { 2026-10-23T21:42:21.0632196Z 181 │ const wire = Schema.encodeUnknownSync(Schema.toCodecJson(OrchestrationMessageContext))({ 2026-10-23T21:42:21.0632493Z ·  ──────────────────────── 2026-10-23T21:42:21.0632675Z 182 │ version: 1, 2026-10-23T21:42:21.0632810Z ╰──── 2026-10-23T21:42:21.0632868Z 2026-10-23T21:42:21.0633340Z ⚠ 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-23T21:42:21.0633860Z ╭─[apps/server/src/serverSettings.test.ts:1741:32] 2026-10-23T21:42:21.0634159Z 1740 │ const model = createModelSelection(ProviderInstanceId.make("codex"), "gpt-5.5"); 2026-10-23T21:42:21.0634577Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-23T21:42:21.0634921Z ·  ─────────────────── 2026-10-23T21:42:21.0635155Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-23T21:42:21.0635332Z ╰──── 2026-10-23T21:42:21.0635389Z 2026-10-23T21:42:21.0635829Z ⚠ 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-23T21:42:21.0636344Z ╭─[apps/server/src/serverSettings.test.ts:1742:34] 2026-10-23T21:42:21.0636662Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-23T21:42:21.0636955Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-23T21:42:21.0637203Z ·  ─────────────────── 2026-10-23T21:42:21.0637444Z 1743 │ Schema.fromJsonString(Schema.Array(ProjectScript)), 2026-10-23T21:42:21.0637629Z ╰──── 2026-10-23T21:42:21.0637682Z 2026-10-23T21:42:21.0637944Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T21:42:21.0638327Z ╭─[apps/mobile/src/state/use-vcs-action-state.ts:86:5] 2026-10-23T21:42:21.0638581Z 83 │ const [nowMs, setNowMs] = useState(() => Date.now()); 2026-10-23T21:42:21.0638770Z 84 │ useEffect(() => { 2026-10-23T21:42:21.0638926Z ·  ────┬──── 2026-10-23T21:42:21.0639150Z · ╰── This is the containing effect 2026-10-23T21:42:21.0639377Z 85 │ if (!actionState.isRunning) return; 2026-10-23T21:42:21.0639547Z 86 │ setNowMs(Date.now()); 2026-10-23T21:42:21.0639715Z ·  ────┬─── 2026-10-23T21:42:21.0639971Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.0640267Z 87 │ const interval = setInterval(() => setNowMs(Date.now()), 1000); 2026-10-23T21:42:21.0640453Z ╰──── 2026-10-23T21:42:21.0641105Z  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-23T21:42:21.0641957Z  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-23T21:42:21.0642258Z 2026-10-23T21:42:21.0642545Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-23T21:42:21.0642926Z ╭─[apps/mobile/src/state/use-composer-drafts.ts:1022:15] 2026-10-23T21:42:21.0643139Z 1021 │ instanceId, 2026-10-23T21:42:21.0643848Z 1022 │ { ...(persisted.modelOptionMemory[instanceId] ?? {}), ...models }, 2026-10-23T21:42:21.0644155Z ·  ────────────────────────────────────────────────── 2026-10-23T21:42:21.0644366Z 1023 │ ]), 2026-10-23T21:42:21.0644500Z ╰──── 2026-10-23T21:42:21.0645078Z  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-23T21:42:21.0645332Z 2026-10-23T21:42:21.0645762Z ⚠ 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-23T21:42:21.0646293Z ╭─[apps/server/src/provider/acp/AntigravityProtocol.ts:263:20] 2026-10-23T21:42:21.0646529Z 262 │ ...(update._meta !== undefined 2026-10-23T21:42:21.0646795Z 263 │ ? { _meta: Schema.is(Schema.Record(Schema.String, Schema.Json))(meta) ? meta : null } 2026-10-23T21:42:21.0647057Z ·  ───────── 2026-10-23T21:42:21.0647223Z 264 │ : {}), 2026-10-23T21:42:21.0647351Z ╰──── 2026-10-23T21:42:21.0647405Z 2026-10-23T21:42:21.0647632Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-23T21:42:21.0647977Z ╭─[apps/mobile/src/state/use-model-option-memory.ts:21:7] 2026-10-23T21:42:21.0648193Z 20 │ [instanceId]: { 2026-10-23T21:42:21.0648359Z 21 │ ...(state[instanceId] ?? {}), 2026-10-23T21:42:21.0648564Z ·  ──────────────────────────── 2026-10-23T21:42:21.0648746Z 22 │ [model]: options, 2026-10-23T21:42:21.0648881Z ╰──── 2026-10-23T21:42:21.0649196Z  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-23T21:42:21.0649449Z 2026-10-23T21:42:21.0649658Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-23T21:42:21.0650026Z ╭─[apps/server/src/sourceControl/SourceControlProviderRegistry.ts:15:13] 2026-10-23T21:42:21.0650272Z 14 │ } from "@t3tools/contracts"; 2026-10-23T21:42:21.0650455Z 15 │ import type {} from "@t3tools/contracts"; 2026-10-23T21:42:21.0650643Z ·  ── 2026-10-23T21:42:21.0650911Z 16 │ import { detectSourceControlProviderFromRemoteUrl } from "@t3tools/shared/sourceControl"; 2026-10-23T21:42:21.0651151Z ╰──── 2026-10-23T21:42:21.0651288Z  help: Remove empty braces 2026-10-23T21:42:21.0651391Z 2026-10-23T21:42:21.0651855Z ⚠ 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-23T21:42:21.0652413Z ╭─[apps/server/src/background/HostPowerMonitor.test.ts:133:11] 2026-10-23T21:42:21.0652701Z 132 │ const monitor = yield* HostPowerMonitor.HostPowerMonitor; 2026-10-23T21:42:21.0652990Z 133 │ ╭─▶ for ( 2026-10-23T21:42:21.0653351Z 134 │ │ let attempt = 0; 2026-10-23T21:42:21.0653679Z 135 │ │ attempt < 100 && (yield* monitor.snapshot).onBattery !== "true"; 2026-10-23T21:42:21.0653949Z 136 │ │ attempt += 1 2026-10-23T21:42:21.0654143Z 137 │ │ ) { 2026-10-23T21:42:21.0654356Z 138 │ │ yield* Effect.yieldNow; 2026-10-23T21:42:21.0654621Z 139 │ ╰─▶ } 2026-10-23T21:42:21.0654883Z 140 │ expect((yield* monitor.snapshot).onBattery).toBe("true"); 2026-10-23T21:42:21.0655070Z ╰──── 2026-10-23T21:42:21.0655129Z 2026-10-23T21:42:21.0655327Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T21:42:21.0655670Z ╭─[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9] 2026-10-23T21:42:21.0655919Z 35 │ { 2026-10-23T21:42:21.0676752Z ·  ────┬──── 2026-10-23T21:42:21.0676972Z · ╰── This is the containing effect 2026-10-23T21:42:21.0677171Z 436 │ if ( 2026-10-23T21:42:21.0683954Z 437 │ props.active === false || 2026-10-23T21:42:21.0684159Z 438 │ activeDraftKey !== null || 2026-10-23T21:42:21.0684341Z 439 │ editingPendingTask !== null || 2026-10-23T21:42:21.0684522Z 440 │ selectedProject === null 2026-10-23T21:42:21.0684684Z 441 │ ) { 2026-10-23T21:42:21.0684905Z 442 │ return; 2026-10-23T21:42:21.0685032Z 443 │ } 2026-10-23T21:42:21.0685161Z 444 │ setActiveDraftKey( 2026-10-23T21:42:21.0685339Z ·  ────────┬──────── 2026-10-23T21:42:21.0685620Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.0685864Z 445 │ createNewTaskDraft({ 2026-10-23T21:42:21.0686000Z ╰──── 2026-10-23T21:42:21.0686650Z  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-23T21:42:21.0687608Z  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-23T21:42:21.0687949Z 2026-10-23T21:42:21.0688195Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-23T21:42:21.0688594Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1244:36] 2026-10-23T21:42:21.0688866Z 1243 │ 2026-10-23T21:42:21.0689174Z 1244 │ {props.children} 2026-10-23T21:42:21.0689487Z ·  ───────────── 2026-10-23T21:42:21.0689677Z 1245 │ 2026-10-23T21:42:21.0689820Z ╰──── 2026-10-23T21:42:21.0690099Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-23T21:42:21.0690452Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-23T21:42:21.0690624Z 2026-10-23T21:42:21.0690783Z ⚠ react(immutability): This value cannot be modified 2026-10-23T21:42:21.0691085Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:174:5] 2026-10-23T21:42:21.0691379Z 170 │ const expandedAngle = props.collapsedDirection === "right" ? 90 : 180; 2026-10-23T21:42:21.0691670Z 171 │ const rotation = useSharedValue(props.expanded ? expandedAngle : 0); 2026-10-23T21:42:21.0691897Z ·  ────┬─── 2026-10-23T21:42:21.0692127Z · ╰── `rotation` originates here 2026-10-23T21:42:21.0692317Z 172 │ 2026-10-23T21:42:21.0692442Z 173 │ useLayoutEffect(() => { 2026-10-23T21:42:21.0692671Z 174 │ rotation.value = withTiming(props.expanded ? expandedAngle : 0, { 2026-10-23T21:42:21.0692890Z ·  ────┬─── 2026-10-23T21:42:21.0693118Z · ╰── `rotation` cannot be modified 2026-10-23T21:42:21.0693396Z 175 │ duration: THREAD_DISCLOSURE_TRANSITION_MS, 2026-10-23T21:42:21.0693568Z ╰──── 2026-10-23T21:42:21.0693883Z  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-23T21:42:21.0694445Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T21:42:21.0694731Z 2026-10-23T21:42:21.0694925Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T21:42:21.0695279Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:1246:23] 2026-10-23T21:42:21.0695499Z 1245 │ { 2026-10-23T21:42:21.0697810Z ·  ────┬──── 2026-10-23T21:42:21.0698031Z · ╰── This is the containing effect 2026-10-23T21:42:21.0698268Z 59 │ const controller = new AbortController(); 2026-10-23T21:42:21.0698449Z 60 │ setLoadState("pending"); 2026-10-23T21:42:21.0698617Z ·  ──────┬───── 2026-10-23T21:42:21.0698876Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.0699199Z 61 │ // A renewed signature is used on Retry, not as a reason to reset the native player. 2026-10-23T21:42:21.0699415Z ╰──── 2026-10-23T21:42:21.0700066Z  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-23T21:42:21.0700911Z  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-23T21:42:21.0701212Z 2026-10-23T21:42:21.0701416Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T21:42:21.0701742Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:71:7] 2026-10-23T21:42:21.0701965Z 70 │ return () => controller.abort(); 2026-10-23T21:42:21.0702161Z 71 │ }, [player, props.playRequested, attempt]); 2026-10-23T21:42:21.0702466Z ·  ───┬── ─────────┬───────── ───┬─── 2026-10-23T21:42:21.0702880Z · │ │ ╰── Unnecessary dependency `attempt` 2026-10-23T21:42:21.0703345Z · │ ╰── Unnecessary dependency `props.playRequested` 2026-10-23T21:42:21.0703680Z · ╰── Unnecessary dependency `player_0` 2026-10-23T21:42:21.0703876Z 72 │ 2026-10-23T21:42:21.0703983Z ╰──── 2026-10-23T21:42:21.0704329Z  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-23T21:42:21.0704905Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.0705194Z 2026-10-23T21:42:21.0705459Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T21:42:21.0705844Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2121:5] 2026-10-23T21:42:21.0706049Z 2119 │ ); 2026-10-23T21:42:21.0706181Z 2120 │ useEffect(() => { 2026-10-23T21:42:21.0706340Z ·  ────┬──── 2026-10-23T21:42:21.0706560Z · ╰── This is the containing effect 2026-10-23T21:42:21.0706774Z 2121 │ setExpandedVideo(null); 2026-10-23T21:42:21.0706949Z ·  ────────┬─────── 2026-10-23T21:42:21.0707219Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.0707462Z 2122 │ setExpandedFile(null); 2026-10-23T21:42:21.0707603Z ╰──── 2026-10-23T21:42:21.0708361Z  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-23T21:42:21.0709229Z  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-23T21:42:21.0709522Z 2026-10-23T21:42:21.0709754Z ⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used. 2026-10-23T21:42:21.0710102Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:62:10] 2026-10-23T21:42:21.0710380Z 61 │ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets"; 2026-10-23T21:42:21.0710668Z 62 │ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks"; 2026-10-23T21:42:21.0710919Z ·  ───────────┬─────────── 2026-10-23T21:42:21.0711195Z · ╰── 'isMarkdownFileLinkLabel' is imported here 2026-10-23T21:42:21.0711515Z 63 │ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments"; 2026-10-23T21:42:21.0711730Z ╰──── 2026-10-23T21:42:21.0711885Z  help: Consider removing this import. 2026-10-23T21:42:21.0712001Z 2026-10-23T21:42:21.0712206Z ⚠ eslint(no-unused-vars): Identifier 'createContext' is imported but never used. 2026-10-23T21:42:21.0712535Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:88:3] 2026-10-23T21:42:21.0712727Z 87 │ import { 2026-10-23T21:42:21.0712864Z 88 │ createContext, 2026-10-23T21:42:21.0713021Z ·  ──────┬────── 2026-10-23T21:42:21.0713295Z · ╰── 'createContext' is imported here 2026-10-23T21:42:21.0713570Z 89 │ memo, 2026-10-23T21:42:21.0713688Z ╰──── 2026-10-23T21:42:21.0713838Z  help: Consider removing this import. 2026-10-23T21:42:21.0713950Z 2026-10-23T21:42:21.0714161Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-23T21:42:21.0714497Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:104:3] 2026-10-23T21:42:21.0714697Z 103 │ import { 2026-10-23T21:42:21.0714830Z 104 │ ActivityIndicator, 2026-10-23T21:42:21.0714997Z ·  ────────┬──────── 2026-10-23T21:42:21.0715242Z · ╰── 'ActivityIndicator' is imported here 2026-10-23T21:42:21.0715452Z 105 │ Image, 2026-10-23T21:42:21.0715574Z ╰──── 2026-10-23T21:42:21.0715721Z  help: Consider removing this import. 2026-10-23T21:42:21.0715832Z 2026-10-23T21:42:21.0716031Z ⚠ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used. 2026-10-23T21:42:21.0716354Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:111:3] 2026-10-23T21:42:21.0716556Z 110 │ Pressable, 2026-10-23T21:42:21.0716693Z 111 │ ScrollView, 2026-10-23T21:42:21.0716839Z ·  ─────┬──── 2026-10-23T21:42:21.0717058Z · ╰── 'ScrollView' is imported here 2026-10-23T21:42:21.0717255Z 112 │ StyleSheet, 2026-10-23T21:42:21.0717384Z ╰──── 2026-10-23T21:42:21.0717532Z  help: Consider removing this import. 2026-10-23T21:42:21.0717645Z 2026-10-23T21:42:21.0717910Z ⚠ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used. 2026-10-23T21:42:21.0718274Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:113:11] 2026-10-23T21:42:21.0718476Z 112 │ StyleSheet, 2026-10-23T21:42:21.0718613Z 113 │ Text as NativeText, 2026-10-23T21:42:21.0718777Z ·  ─────┬──── 2026-10-23T21:42:21.0719012Z · ╰── 'NativeText' is imported here 2026-10-23T21:42:21.0719217Z 114 │ type ColorValue, 2026-10-23T21:42:21.0719350Z ╰──── 2026-10-23T21:42:21.0719497Z  help: Consider removing this import. 2026-10-23T21:42:21.0719609Z 2026-10-23T21:42:21.0719824Z ⚠ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used. 2026-10-23T21:42:21.0720171Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:136:10] 2026-10-23T21:42:21.0720455Z 135 │ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic"; 2026-10-23T21:42:21.0720720Z 136 │ import { tryOpenExternalUrl } from "../../lib/openExternalUrl"; 2026-10-23T21:42:21.0720948Z ·  ─────────┬──────── 2026-10-23T21:42:21.0721205Z · ╰── 'tryOpenExternalUrl' is imported here 2026-10-23T21:42:21.0721508Z 137 │ import { downloadAndShareAttachment } from "../../lib/attachmentDownload"; 2026-10-23T21:42:21.0721717Z ╰──── 2026-10-23T21:42:21.0721869Z  help: Consider removing this import. 2026-10-23T21:42:21.0721978Z 2026-10-23T21:42:21.0722193Z ⚠ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used. 2026-10-23T21:42:21.0722541Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:139:10] 2026-10-23T21:42:21.0722818Z 138 │ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks"; 2026-10-23T21:42:21.0723092Z 139 │ import { faviconUrlForOrigin } from "@t3tools/shared/favicon"; 2026-10-23T21:42:21.0723358Z ·  ─────────┬───────── 2026-10-23T21:42:21.0723618Z · ╰── 'faviconUrlForOrigin' is imported here 2026-10-23T21:42:21.0723829Z 140 │ import { 2026-10-23T21:42:21.0723949Z ╰──── 2026-10-23T21:42:21.0724098Z  help: Consider removing this import. 2026-10-23T21:42:21.0724210Z 2026-10-23T21:42:21.0724423Z ⚠ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used. 2026-10-23T21:42:21.0724757Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:153:10] 2026-10-23T21:42:21.0725112Z 152 │ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile"; 2026-10-23T21:42:21.0725404Z 153 │ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer"; 2026-10-23T21:42:21.0725639Z ·  ────────┬─────── 2026-10-23T21:42:21.0725886Z · ╰── 'MediaVideoPlayer' is imported here 2026-10-23T21:42:21.0726175Z 154 │ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia"; 2026-10-23T21:42:21.0726372Z ╰──── 2026-10-23T21:42:21.0726518Z  help: Consider removing this import. 2026-10-23T21:42:21.0726629Z 2026-10-23T21:42:21.0726849Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used. 2026-10-23T21:42:21.0727195Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:157:3] 2026-10-23T21:42:21.0727489Z 156 │ attachmentVideoPreviewSource, 2026-10-23T21:42:21.0727694Z 157 │ mediaVideoPreviewUri, 2026-10-23T21:42:21.0727863Z ·  ──────────┬───────── 2026-10-23T21:42:21.0728109Z · ╰── 'mediaVideoPreviewUri' is imported here 2026-10-23T21:42:21.0728333Z 158 │ mediaVideoThumbnailKey, 2026-10-23T21:42:21.0728475Z ╰──── 2026-10-23T21:42:21.0728628Z  help: Consider removing this import. 2026-10-23T21:42:21.0728736Z 2026-10-23T21:42:21.0728959Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used. 2026-10-23T21:42:21.0729307Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:158:3] 2026-10-23T21:42:21.0729517Z 157 │ mediaVideoPreviewUri, 2026-10-23T21:42:21.0729678Z 158 │ mediaVideoThumbnailKey, 2026-10-23T21:42:21.0729861Z ·  ───────────┬────────── 2026-10-23T21:42:21.0730122Z · ╰── 'mediaVideoThumbnailKey' is imported here 2026-10-23T21:42:21.0730356Z 159 │ type MediaVideoPreviewSource, 2026-10-23T21:42:21.0730504Z ╰──── 2026-10-23T21:42:21.0730652Z  help: Consider removing this import. 2026-10-23T21:42:21.0730764Z 2026-10-23T21:42:21.0730974Z ⚠ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used. 2026-10-23T21:42:21.0731314Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:159:8] 2026-10-23T21:42:21.0731519Z 158 │ mediaVideoThumbnailKey, 2026-10-23T21:42:21.0731691Z 159 │ type MediaVideoPreviewSource, 2026-10-23T21:42:21.0731885Z ·  ───────────┬─────────── 2026-10-23T21:42:21.0732162Z · ╰── 'MediaVideoPreviewSource' is imported here 2026-10-23T21:42:21.0732412Z 160 │ } from "../../lib/videoPreviewSource"; 2026-10-23T21:42:21.0732567Z ╰──── 2026-10-23T21:42:21.0732716Z  help: Consider removing this import. 2026-10-23T21:42:21.0732829Z 2026-10-23T21:42:21.0733025Z ⚠ eslint(no-unused-vars): Type 'ReviewDiffTheme' is imported but never used. 2026-10-23T21:42:21.0733382Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:167:15] 2026-10-23T21:42:21.0733701Z 166 │ import { parseReviewCommentMessageSegments } from "../review/reviewCommentSelection"; 2026-10-23T21:42:21.0734014Z 167 │ import type { ReviewDiffTheme } from "../review/shikiReviewHighlighter"; 2026-10-23T21:42:21.0734253Z ·  ───────┬─────── 2026-10-23T21:42:21.0734561Z · ╰── 'ReviewDiffTheme' is imported here 2026-10-23T21:42:21.0734804Z 168 │ import { 2026-10-23T21:42:21.0734935Z ╰──── 2026-10-23T21:42:21.0735081Z  help: Consider removing this import. 2026-10-23T21:42:21.0735192Z 2026-10-23T21:42:21.0735421Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used. 2026-10-23T21:42:21.0735770Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:182:3] 2026-10-23T21:42:21.0735970Z 181 │ import { 2026-10-23T21:42:21.0736108Z 182 │ resolveMarkdownFontSizes, 2026-10-23T21:42:21.0736295Z ·  ────────────┬─────────── 2026-10-23T21:42:21.0736552Z · ╰── 'resolveMarkdownFontSizes' is imported here 2026-10-23T21:42:21.0736799Z 183 │ resolveNativeMarkdownTypography, 2026-10-23T21:42:21.0736957Z ╰──── 2026-10-23T21:42:21.0737114Z  help: Consider removing this import. 2026-10-23T21:42:21.0737232Z 2026-10-23T21:42:21.0737456Z ⚠ eslint(no-unused-vars): Identifier 'markdownLinkIconSource' is imported but never used. 2026-10-23T21:42:21.0737794Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:187:10] 2026-10-23T21:42:21.0738072Z 186 │ import { PierreEntryIcon } from "../../components/PierreEntryIcon"; 2026-10-23T21:42:21.0738350Z 187 │ import { markdownLinkIconSource } from "../../lib/markdownLinkIcons"; 2026-10-23T21:42:21.0738595Z ·  ───────────┬────────── 2026-10-23T21:42:21.0738862Z · ╰── 'markdownLinkIconSource' is imported here 2026-10-23T21:42:21.0739084Z 188 │ import { 2026-10-23T21:42:21.0739203Z ╰──── 2026-10-23T21:42:21.0739358Z  help: Consider removing this import. 2026-10-23T21:42:21.0739474Z 2026-10-23T21:42:21.0739734Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used. 2026-10-23T21:42:21.0740112Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:190:3] 2026-10-23T21:42:21.0740327Z 189 │ normalizeNativeMarkdownUrl, 2026-10-23T21:42:21.0740519Z 190 │ resolveMarkdownInlineCodePresentation, 2026-10-23T21:42:21.0740748Z ·  ──────────────────┬────────────────── 2026-10-23T21:42:21.0741067Z · ╰── 'resolveMarkdownInlineCodePresentation' is imported here 2026-10-23T21:42:21.0741326Z 191 │ resolveMarkdownLinkIcon, 2026-10-23T21:42:21.0741472Z ╰──── 2026-10-23T21:42:21.0741618Z  help: Consider removing this import. 2026-10-23T21:42:21.0741731Z 2026-10-23T21:42:21.0741958Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownLinkIcon' is imported but never used. 2026-10-23T21:42:21.0742309Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:191:3] 2026-10-23T21:42:21.0742541Z 190 │ resolveMarkdownInlineCodePresentation, 2026-10-23T21:42:21.0742724Z 191 │ resolveMarkdownLinkIcon, 2026-10-23T21:42:21.0742902Z ·  ───────────┬─────────── 2026-10-23T21:42:21.0743163Z · ╰── 'resolveMarkdownLinkIcon' is imported here 2026-10-23T21:42:21.0743438Z 192 │ resolveMarkdownLinkPresentation, 2026-10-23T21:42:21.0743593Z ╰──── 2026-10-23T21:42:21.0743687Z  help: Consider removing this import. 2026-10-23T21:42:21.0743694Z 2026-10-23T21:42:21.0743976Z ⚠ eslint(no-unused-vars): Identifier 'useMarkdownCodeHighlight' is imported but never used. 2026-10-23T21:42:21.0744147Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:230:10] 2026-10-23T21:42:21.0744250Z 229 │ import { ThreadMcpApp } from "./McpAppWebView"; 2026-10-23T21:42:21.0744393Z 230 │ import { useMarkdownCodeHighlight } from "./markdownCodeHighlightState"; 2026-10-23T21:42:21.0744495Z ·  ────────────┬─────────── 2026-10-23T21:42:21.0744666Z · ╰── 'useMarkdownCodeHighlight' is imported here 2026-10-23T21:42:21.0744725Z 231 │ import { 2026-10-23T21:42:21.0744778Z ╰──── 2026-10-23T21:42:21.0744871Z  help: Consider removing this import. 2026-10-23T21:42:21.0744873Z 2026-10-23T21:42:21.0745083Z ⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used. 2026-10-23T21:42:21.0745220Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:234:3] 2026-10-23T21:42:21.0745289Z 233 │ useAssetUrl, 2026-10-23T21:42:21.0745354Z 234 │ useAssetUrlState, 2026-10-23T21:42:21.0745439Z ·  ────────┬─────── 2026-10-23T21:42:21.0745586Z · ╰── 'useAssetUrlState' is imported here 2026-10-23T21:42:21.0745655Z 235 │ useRefreshAssetUrl, 2026-10-23T21:42:21.0745706Z ╰──── 2026-10-23T21:42:21.0745801Z  help: Consider removing this import. 2026-10-23T21:42:21.0745803Z 2026-10-23T21:42:21.0746003Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T21:42:21.0746139Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2123:7] 2026-10-23T21:42:21.0746209Z 2122 │ setExpandedFile(null); 2026-10-23T21:42:21.0746371Z 2123 │ }, [props.environmentId, props.threadId, props.contentPresentation.kind]); 2026-10-23T21:42:21.0746624Z ·  ─────────┬───────── ───────┬────── ───────────────┬────────────── 2026-10-23T21:42:21.0746920Z · │ │ ╰── Unnecessary dependency `props.contentPresentation.kind` 2026-10-23T21:42:21.0747122Z · │ ╰── Unnecessary dependency `props.threadId` 2026-10-23T21:42:21.0747291Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-23T21:42:21.0747431Z 2124 │ const horizontalPadding = props.layoutVariant === "split" ? 20 : 16; 2026-10-23T21:42:21.0747485Z ╰──── 2026-10-23T21:42:21.0747788Z  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-23T21:42:21.0748097Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.0748100Z 2026-10-23T21:42:21.0748304Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T21:42:21.0748440Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2590:7] 2026-10-23T21:42:21.0748537Z 2589 │ reportHeaderMaterialVisibility(false); 2026-10-23T21:42:21.0748649Z 2590 │ }, [feedThreadKey, reportHeaderMaterialVisibility]); 2026-10-23T21:42:21.0748731Z ·  ──────┬────── 2026-10-23T21:42:21.0748945Z · ╰── Unnecessary dependency `feedThreadKey` 2026-10-23T21:42:21.0749031Z 2591 │ 2026-10-23T21:42:21.0749081Z ╰──── 2026-10-23T21:42:21.0749366Z  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-23T21:42:21.0749671Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.0749673Z 2026-10-23T21:42:21.0749877Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T21:42:21.0750015Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2606:7] 2026-10-23T21:42:21.0750069Z 2605 │ } 2026-10-23T21:42:21.0750204Z 2606 │ }, [listMountKey, props.contentInsetEndAdjustment, listRef]); 2026-10-23T21:42:21.0750291Z ·  ──────┬───── 2026-10-23T21:42:21.0750445Z · ╰── Unnecessary dependency `listMountKey` 2026-10-23T21:42:21.0750496Z 2607 │ 2026-10-23T21:42:21.0750549Z ╰──── 2026-10-23T21:42:21.0750833Z  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-23T21:42:21.0751134Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.0751137Z 2026-10-23T21:42:21.0751332Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T21:42:21.0751471Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2763:7] 2026-10-23T21:42:21.0751533Z 2762 │ } 2026-10-23T21:42:21.0751714Z 2763 │ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]); 2026-10-23T21:42:21.0751938Z ·  ───────┬─────── ─────────┬──────── ────────┬─────── 2026-10-23T21:42:21.0752198Z · │ │ ╰── Unnecessary dependency `expandedWorkRows` 2026-10-23T21:42:21.0752406Z · │ ╰── Unnecessary dependency `expandedWorkGroups` 2026-10-23T21:42:21.0752566Z · ╰── Unnecessary dependency `expandedTurnIds` 2026-10-23T21:42:21.0752621Z 2764 │ 2026-10-23T21:42:21.0752672Z ╰──── 2026-10-23T21:42:21.0753011Z  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-23T21:42:21.0753379Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.0753382Z 2026-10-23T21:42:21.0753565Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T21:42:21.0753697Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:605:9] 2026-10-23T21:42:21.0753755Z 604 │ }; 2026-10-23T21:42:21.0753873Z 605 │ }, [props.environmentId, attachment.id, httpBaseUrl]), 2026-10-23T21:42:21.0754086Z ·  ─────────┬───────── ──────┬────── ─────┬───── 2026-10-23T21:42:21.0754335Z · │ │ ╰── Unnecessary dependency `httpBaseUrl` 2026-10-23T21:42:21.0754542Z · │ ╰── Unnecessary dependency `attachment.id` 2026-10-23T21:42:21.0754713Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-23T21:42:21.0754770Z 606 │ ); 2026-10-23T21:42:21.0754824Z ╰──── 2026-10-23T21:42:21.0755129Z  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-23T21:42:21.0755436Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.0755440Z 2026-10-23T21:42:21.0755586Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.0755707Z ╭─[apps/mobile/src/native/StackHeader.tsx:185:9] 2026-10-23T21:42:21.0755770Z 184 │ "options", 2026-10-23T21:42:21.0755867Z 185 │ latestOptionFunctionsRef.current, 2026-10-23T21:42:21.0755981Z ·  ────────────────┬─────────────── 2026-10-23T21:42:21.0756174Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T21:42:21.0756271Z 186 │ optionFunctionWrappersRef.current, 2026-10-23T21:42:21.0756320Z ╰──── 2026-10-23T21:42:21.0756791Z  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-23T21:42:21.0757080Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.0757083Z 2026-10-23T21:42:21.0757228Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.0757345Z ╭─[apps/mobile/src/native/StackHeader.tsx:186:9] 2026-10-23T21:42:21.0757441Z 185 │ latestOptionFunctionsRef.current, 2026-10-23T21:42:21.0757534Z 186 │ optionFunctionWrappersRef.current, 2026-10-23T21:42:21.0757650Z ·  ────────────────┬──────────────── 2026-10-23T21:42:21.0757894Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T21:42:21.0758022Z 187 │ ) as NativeStackNavigationOptions) 2026-10-23T21:42:21.0758074Z ╰──── 2026-10-23T21:42:21.0758533Z  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-23T21:42:21.0758818Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.0758820Z 2026-10-23T21:42:21.0759019Z ⚠ eslint(no-unused-vars): Identifier 'Duration' is imported but never used. 2026-10-23T21:42:21.0759155Z ╭─[packages/provider-pi/src/server/adapter.test.ts:24:13] 2026-10-23T21:42:21.0759253Z 23 │ import * as Deferred from "effect/Deferred"; 2026-10-23T21:42:21.0759346Z 24 │ import * as Duration from "effect/Duration"; 2026-10-23T21:42:21.0759424Z ·  ────┬─── 2026-10-23T21:42:21.0759564Z · ╰── 'Duration' is imported here 2026-10-23T21:42:21.0759653Z 25 │ import * as Effect from "effect/Effect"; 2026-10-23T21:42:21.0759706Z ╰──── 2026-10-23T21:42:21.0759800Z  help: Consider removing this import. 2026-10-23T21:42:21.0759803Z 2026-10-23T21:42:21.0760016Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T21:42:21.0760190Z ╭─[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:370:7] 2026-10-23T21:42:21.0760269Z 369 │ mountedRef.current = false; 2026-10-23T21:42:21.0760342Z 370 │ flow.setBranchQuery(""); 2026-10-23T21:42:21.0760419Z ·  ──┬─ 2026-10-23T21:42:21.0760550Z · ╰── Missing dependency `flow` 2026-10-23T21:42:21.0760609Z 371 │ }; 2026-10-23T21:42:21.0760678Z 372 │ }, [flow.setBranchQuery]); 2026-10-23T21:42:21.0760768Z ·  ─────────┬───────── 2026-10-23T21:42:21.0760975Z · ╰── Overly precise dependency `flow.setBranchQuery`, use `flow` instead 2026-10-23T21:42:21.0761029Z 373 │ 2026-10-23T21:42:21.0761078Z ╰──── 2026-10-23T21:42:21.0761491Z  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-23T21:42:21.0761803Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.0761808Z 2026-10-23T21:42:21.0762063Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T21:42:21.0762233Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10578:7] 2026-10-23T21:42:21.0762285Z 10577 │ 2026-10-23T21:42:21.0762362Z 10578 │ const layer: Layer.Layer< 2026-10-23T21:42:21.0762435Z ·  ──┬── 2026-10-23T21:42:21.0762567Z · ╰── 'layer' is declared here 2026-10-23T21:42:21.0762658Z 10579 │ ProviderAdapter.ProviderAdapterV2, 2026-10-23T21:42:21.0762711Z ╰──── 2026-10-23T21:42:21.0762815Z  help: Consider removing this declaration. 2026-10-23T21:42:21.0762818Z 2026-10-23T21:42:21.0763120Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T21:42:21.0763286Z ╭─[packages/provider-pi/src/server/adapter.ts:3405:7] 2026-10-23T21:42:21.0763421Z 3404 │ 2026-10-23T21:42:21.0763606Z 3405 │ const layer: Layer.Layer = 2026-10-23T21:42:21.0763676Z ·  ──┬── 2026-10-23T21:42:21.0763801Z · ╰── 'layer' is declared here 2026-10-23T21:42:21.0763864Z 3406 │ Layer.effect( 2026-10-23T21:42:21.0763917Z ╰──── 2026-10-23T21:42:21.0764019Z  help: Consider removing this declaration. 2026-10-23T21:42:21.0764021Z 2026-10-23T21:42:21.0764168Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.0764323Z ╭─[apps/mobile/src/features/home/thread-swipe-actions.tsx:494:27] 2026-10-23T21:42:21.0764382Z 493 │ > 2026-10-23T21:42:21.0764461Z 494 │ {props.children(close)} 2026-10-23T21:42:21.0764551Z ·  ──┬── 2026-10-23T21:42:21.0764715Z · ╰── Cannot access ref value during render 2026-10-23T21:42:21.0764854Z 495 │ 2026-10-23T21:42:21.0764907Z ╰──── 2026-10-23T21:42:21.0765368Z  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-23T21:42:21.0765658Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.0765663Z 2026-10-23T21:42:21.0765911Z ⚠ eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used. 2026-10-23T21:42:21.0766090Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:960:10] 2026-10-23T21:42:21.0766143Z 959 │ 2026-10-23T21:42:21.0766249Z 960 │ function layerClaudeAgentSdkReplayQueryRunner( 2026-10-23T21:42:21.0766371Z ·  ──────────────────┬───────────────── 2026-10-23T21:42:21.0766569Z · ╰── 'layerClaudeAgentSdkReplayQueryRunner' is declared here 2026-10-23T21:42:21.0766669Z 961 │ transcript: ClaudeAgentSdkReplayTranscript, 2026-10-23T21:42:21.0766719Z ╰──── 2026-10-23T21:42:21.0766829Z  help: Consider removing this declaration. 2026-10-23T21:42:21.0766834Z 2026-10-23T21:42:21.0767026Z ⚠ eslint(no-unused-vars): Identifier 'Image' is imported but never used. 2026-10-23T21:42:21.0767168Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:17:10] 2026-10-23T21:42:21.0767299Z 16 │ import type { NativeSyntheticEvent, ViewProps } from "react-native"; 2026-10-23T21:42:21.0767414Z 17 │ import { Image, Platform, StyleSheet } from "react-native"; 2026-10-23T21:42:21.0767486Z ·  ──┬── 2026-10-23T21:42:21.0767615Z · ╰── 'Image' is imported here 2026-10-23T21:42:21.0767667Z 18 │ 2026-10-23T21:42:21.0767720Z ╰──── 2026-10-23T21:42:21.0767816Z  help: Consider removing this import. 2026-10-23T21:42:21.0767819Z 2026-10-23T21:42:21.0768095Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-23T21:42:21.0768283Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:227:6] 2026-10-23T21:42:21.0768443Z 223 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-23T21:42:21.0768535Z 224 │ nativeEventSnapshotsRef.current, 2026-10-23T21:42:21.0768629Z ·  ───────────┬─────────── 2026-10-23T21:42:21.0769087Z · ╰── 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-23T21:42:21.0769159Z 225 │ mostRecentEventCount, 2026-10-23T21:42:21.0769215Z 226 │ ); 2026-10-23T21:42:21.0769343Z 227 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-23T21:42:21.0769495Z ·  ──────────────────────────┬────────────────────────── 2026-10-23T21:42:21.0769690Z · ╰── This dependency list is missing values used by the callback 2026-10-23T21:42:21.0769775Z 228 │ const assumedValue = props.value; 2026-10-23T21:42:21.0769830Z ╰──── 2026-10-23T21:42:21.0769997Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-23T21:42:21.0770300Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.0770303Z 2026-10-23T21:42:21.0770515Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T21:42:21.0770661Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:235:7] 2026-10-23T21:42:21.0770806Z 234 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-23T21:42:21.0770892Z 235 │ nativeEventSnapshotsRef.current, 2026-10-23T21:42:21.0770986Z ·  ───────────┬─────────── 2026-10-23T21:42:21.0771437Z · ╰── 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-23T21:42:21.0771509Z 236 │ controlledEventCount, 2026-10-23T21:42:21.0771574Z 237 │ assumedValue, 2026-10-23T21:42:21.0771627Z 238 │ ); 2026-10-23T21:42:21.0771781Z 239 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-23T21:42:21.0771976Z ·  ───────────┬────────── 2026-10-23T21:42:21.0772222Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-23T21:42:21.0772310Z 240 │ const acceptNativeEvent = useCallback( 2026-10-23T21:42:21.0772364Z ╰──── 2026-10-23T21:42:21.0772777Z  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-23T21:42:21.0773080Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.0773083Z 2026-10-23T21:42:21.0773265Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.0773414Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:160:29] 2026-10-23T21:42:21.0773537Z 159 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T21:42:21.0773652Z 160 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T21:42:21.0773775Z ·  ─────────────┬──────────── 2026-10-23T21:42:21.0773946Z · ╰── Cannot access ref value during render 2026-10-23T21:42:21.0774004Z 161 │ }); 2026-10-23T21:42:21.0774056Z ╰──── 2026-10-23T21:42:21.0774523Z  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-23T21:42:21.0774805Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.0774811Z 2026-10-23T21:42:21.0774953Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.0775099Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:160:29] 2026-10-23T21:42:21.0775219Z 159 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T21:42:21.0775333Z 160 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T21:42:21.0775450Z ·  ─────────────┬──────────── 2026-10-23T21:42:21.0775666Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T21:42:21.0775726Z 161 │ }); 2026-10-23T21:42:21.0775779Z ╰──── 2026-10-23T21:42:21.0776227Z  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-23T21:42:21.0776509Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.0776511Z 2026-10-23T21:42:21.0776658Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.0776801Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:23] 2026-10-23T21:42:21.0776855Z 161 │ }); 2026-10-23T21:42:21.0776999Z 162 │ confirmedTokensRef.current = tokens; 2026-10-23T21:42:21.0777161Z ·  ─────────┬────────────┬─── 2026-10-23T21:42:21.0777351Z · │ ╰── Cannot update ref value during render 2026-10-23T21:42:21.0777472Z · ╰── This value is a ref 2026-10-23T21:42:21.0777542Z 163 │ return JSON.stringify( 2026-10-23T21:42:21.0777595Z ╰──── 2026-10-23T21:42:21.0778049Z  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-23T21:42:21.0778337Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.0778342Z 2026-10-23T21:42:21.0778482Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.0778624Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:204:5] 2026-10-23T21:42:21.0778694Z 203 │ mostRecentEventCount, 2026-10-23T21:42:21.0778782Z 204 │ nativeEventSnapshotsRef.current, 2026-10-23T21:42:21.0778889Z ·  ───────────────┬─────────────── 2026-10-23T21:42:21.0779077Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T21:42:21.0779134Z 205 │ ); 2026-10-23T21:42:21.0779188Z ╰──── 2026-10-23T21:42:21.0779644Z  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-23T21:42:21.0779928Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.0779931Z 2026-10-23T21:42:21.0780077Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.0780215Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:210:5] 2026-10-23T21:42:21.0780284Z 209 │ mostRecentEventCount, 2026-10-23T21:42:21.0780368Z 210 │ nativeEventSnapshotsRef.current, 2026-10-23T21:42:21.0780475Z ·  ───────────────┬─────────────── 2026-10-23T21:42:21.0780662Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T21:42:21.0780723Z 211 │ ); 2026-10-23T21:42:21.0780774Z ╰──── 2026-10-23T21:42:21.0781229Z  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-23T21:42:21.0781517Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.0781519Z 2026-10-23T21:42:21.0781709Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-23T21:42:21.0781850Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:195:6] 2026-10-23T21:42:21.0781969Z 159 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T21:42:21.0782126Z 160 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T21:42:21.0782273Z ·  ─────────┬──────── 2026-10-23T21:42:21.0782730Z · ╰── 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-23T21:42:21.0782784Z 161 │ }); 2026-10-23T21:42:21.0782874Z 162 │ confirmedTokensRef.current = tokens; 2026-10-23T21:42:21.0782944Z 163 │ return JSON.stringify( 2026-10-23T21:42:21.0783106Z 164 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-23T21:42:21.0783171Z 165 │ const record = 2026-10-23T21:42:21.0783261Z 166 │ token.type === "context" 2026-10-23T21:42:21.0783459Z 167 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-23T21:42:21.0783531Z 168 │ : undefined; 2026-10-23T21:42:21.0783636Z 169 │ const presentation = contextChipPresentation( 2026-10-23T21:42:21.0783748Z 170 │ token.type === "context" ? token.kind : token.type, 2026-10-23T21:42:21.0783811Z 171 │ record, 2026-10-23T21:42:21.0783870Z 172 │ ); 2026-10-23T21:42:21.0783952Z 173 │ const icon = contextChipIcon( 2026-10-23T21:42:21.0784022Z 174 │ presentation, 2026-10-23T21:42:21.0784165Z 175 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-23T21:42:21.0784227Z 176 │ ); 2026-10-23T21:42:21.0784287Z 177 │ return { 2026-10-23T21:42:21.0784358Z 178 │ type: token.type, 2026-10-23T21:42:21.0784439Z 179 │ source: token.source, 2026-10-23T21:42:21.0784513Z 180 │ start: token.start, 2026-10-23T21:42:21.0784576Z 181 │ end: token.end, 2026-10-23T21:42:21.0784664Z 182 │ accent: presentation.accent, 2026-10-23T21:42:21.0784727Z 183 │ label: 2026-10-23T21:42:21.0784801Z 184 │ token.type === "skill" 2026-10-23T21:42:21.0784906Z 185 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-23T21:42:21.0784987Z 186 │ : token.type === "context" 2026-10-23T21:42:21.0785221Z 187 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-23T21:42:21.0785304Z 188 │ : basename(token.value), 2026-10-23T21:42:21.0785444Z 189 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-23T21:42:21.0785542Z 190 │ iconUri: contextChipIconUri(icon), 2026-10-23T21:42:21.0785638Z 191 │ tintsIcon: icon.kind === "chip", 2026-10-23T21:42:21.0785698Z 192 │ }; 2026-10-23T21:42:21.0785755Z 193 │ }), 2026-10-23T21:42:21.0785812Z 194 │ ); 2026-10-23T21:42:21.0785914Z 195 │ }, [props.value, props.context, skillLabels]); 2026-10-23T21:42:21.0786036Z ·  ────────────────────┬──────────────────── 2026-10-23T21:42:21.0786238Z · ╰── This dependency list is missing values used by the callback 2026-10-23T21:42:21.0786374Z 196 │ // Every render resolves against the snapshot history, so a render whose 2026-10-23T21:42:21.0786428Z ╰──── 2026-10-23T21:42:21.0786628Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-23T21:42:21.0786988Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.0787023Z 2026-10-23T21:42:21.0787210Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-23T21:42:21.0787350Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:257:5] 2026-10-23T21:42:21.0787482Z 249 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-23T21:42:21.0787582Z 250 │ nativeEventSnapshotsRef.current.push({ 2026-10-23T21:42:21.0787678Z ·  ───────────┬─────────── 2026-10-23T21:42:21.0788136Z · ╰── 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-23T21:42:21.0788228Z 251 │ eventCount: acknowledgedEventCount, 2026-10-23T21:42:21.0788287Z 252 │ value, 2026-10-23T21:42:21.0788367Z 253 │ selection: nextSelection, 2026-10-23T21:42:21.0788427Z 254 │ }); 2026-10-23T21:42:21.0788511Z 255 │ return acknowledgedEventCount; 2026-10-23T21:42:21.0788563Z 256 │ }, 2026-10-23T21:42:21.0788619Z 257 │ [], 2026-10-23T21:42:21.0788690Z ·  ─┬ 2026-10-23T21:42:21.0788872Z · ╰── This dependency list is missing values used by the callback 2026-10-23T21:42:21.0788923Z 258 │ ); 2026-10-23T21:42:21.0788976Z ╰──── 2026-10-23T21:42:21.0789177Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-23T21:42:21.0789490Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.0789495Z 2026-10-23T21:42:21.0789824Z ⚠ eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'. 2026-10-23T21:42:21.0789991Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1444:7] 2026-10-23T21:42:21.0790049Z 1443 │ 2026-10-23T21:42:21.0790167Z 1444 │ const layerCodexAppServerClientFactoryCommand = ( 2026-10-23T21:42:21.0790291Z ·  ───────────────────┬─────────────────── 2026-10-23T21:42:21.0790495Z · ╰── 'layerCodexAppServerClientFactoryCommand' is declared here 2026-10-23T21:42:21.0790663Z 1445 │ options: CodexClient.CodexAppServerClientOptions & { 2026-10-23T21:42:21.0790750Z ╰──── 2026-10-23T21:42:21.0790853Z  help: Consider removing this declaration. 2026-10-23T21:42:21.0790856Z 2026-10-23T21:42:21.0791109Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T21:42:21.0791276Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1680:7] 2026-10-23T21:42:21.0791332Z 1679 │ 2026-10-23T21:42:21.0791404Z 1680 │ const layer: Layer.Layer< 2026-10-23T21:42:21.0791472Z ·  ──┬── 2026-10-23T21:42:21.0791606Z · ╰── 'layer' is declared here 2026-10-23T21:42:21.0791702Z 1681 │ ProviderAdapter.ProviderAdapterV2, 2026-10-23T21:42:21.0791757Z ╰──── 2026-10-23T21:42:21.0791863Z  help: Consider removing this declaration. 2026-10-23T21:42:21.0791868Z 2026-10-23T21:42:21.0792073Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-23T21:42:21.0792210Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:229:6] 2026-10-23T21:42:21.0792372Z 225 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-23T21:42:21.0792458Z 226 │ nativeEventSnapshotsRef.current, 2026-10-23T21:42:21.0792552Z ·  ───────────┬─────────── 2026-10-23T21:42:21.0793003Z · ╰── 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-23T21:42:21.0793075Z 227 │ mostRecentEventCount, 2026-10-23T21:42:21.0793132Z 228 │ ); 2026-10-23T21:42:21.0793270Z 229 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-23T21:42:21.0793445Z ·  ──────────────────────────┬────────────────────────── 2026-10-23T21:42:21.0793645Z · ╰── This dependency list is missing values used by the callback 2026-10-23T21:42:21.0793725Z 230 │ const assumedValue = props.value; 2026-10-23T21:42:21.0793778Z ╰──── 2026-10-23T21:42:21.0793944Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-23T21:42:21.0794248Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.0794251Z 2026-10-23T21:42:21.0794471Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T21:42:21.0794605Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:237:7] 2026-10-23T21:42:21.0794747Z 236 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-23T21:42:21.0794837Z 237 │ nativeEventSnapshotsRef.current, 2026-10-23T21:42:21.0794930Z ·  ───────────┬─────────── 2026-10-23T21:42:21.0795374Z · ╰── 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-23T21:42:21.0795447Z 238 │ controlledEventCount, 2026-10-23T21:42:21.0795514Z 239 │ assumedValue, 2026-10-23T21:42:21.0795570Z 240 │ ); 2026-10-23T21:42:21.0795773Z 241 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-23T21:42:21.0795986Z ·  ───────────┬────────── 2026-10-23T21:42:21.0796199Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-23T21:42:21.0796289Z 242 │ const acceptNativeEvent = useCallback( 2026-10-23T21:42:21.0796339Z ╰──── 2026-10-23T21:42:21.0796755Z  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-23T21:42:21.0797062Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.0797068Z 2026-10-23T21:42:21.0797219Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.0797358Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:162:29] 2026-10-23T21:42:21.0797475Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T21:42:21.0797589Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T21:42:21.0797708Z ·  ─────────────┬──────────── 2026-10-23T21:42:21.0797875Z · ╰── Cannot access ref value during render 2026-10-23T21:42:21.0797927Z 163 │ }); 2026-10-23T21:42:21.0797981Z ╰──── 2026-10-23T21:42:21.0798446Z  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-23T21:42:21.0798733Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.0798736Z 2026-10-23T21:42:21.0798886Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.0799022Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:162:29] 2026-10-23T21:42:21.0799139Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T21:42:21.0799250Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T21:42:21.0799372Z ·  ─────────────┬──────────── 2026-10-23T21:42:21.0799581Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T21:42:21.0799641Z 163 │ }); 2026-10-23T21:42:21.0799694Z ╰──── 2026-10-23T21:42:21.0800151Z  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-23T21:42:21.0800432Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.0800434Z 2026-10-23T21:42:21.0800576Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.0800712Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:23] 2026-10-23T21:42:21.0800820Z 163 │ }); 2026-10-23T21:42:21.0800944Z 164 │ confirmedTokensRef.current = tokens; 2026-10-23T21:42:21.0801069Z ·  ─────────┬────────────┬─── 2026-10-23T21:42:21.0801257Z · │ ╰── Cannot update ref value during render 2026-10-23T21:42:21.0801376Z · ╰── This value is a ref 2026-10-23T21:42:21.0801448Z 165 │ return JSON.stringify( 2026-10-23T21:42:21.0801498Z ╰──── 2026-10-23T21:42:21.0801954Z  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-23T21:42:21.0802242Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.0802247Z 2026-10-23T21:42:21.0802390Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.0802524Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:206:5] 2026-10-23T21:42:21.0802592Z 205 │ mostRecentEventCount, 2026-10-23T21:42:21.0802680Z 206 │ nativeEventSnapshotsRef.current, 2026-10-23T21:42:21.0802788Z ·  ───────────────┬─────────────── 2026-10-23T21:42:21.0802975Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T21:42:21.0803029Z 207 │ ); 2026-10-23T21:42:21.0803083Z ╰──── 2026-10-23T21:42:21.0803577Z  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-23T21:42:21.0803860Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.0803863Z 2026-10-23T21:42:21.0804007Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.0804141Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:212:5] 2026-10-23T21:42:21.0804215Z 211 │ mostRecentEventCount, 2026-10-23T21:42:21.0804302Z 212 │ nativeEventSnapshotsRef.current, 2026-10-23T21:42:21.0804407Z ·  ───────────────┬─────────────── 2026-10-23T21:42:21.0804595Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T21:42:21.0804653Z 213 │ ); 2026-10-23T21:42:21.0804705Z ╰──── 2026-10-23T21:42:21.0805213Z  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-23T21:42:21.0805494Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.0805496Z 2026-10-23T21:42:21.0805685Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-23T21:42:21.0805817Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:197:6] 2026-10-23T21:42:21.0805997Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T21:42:21.0806146Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T21:42:21.0806256Z ·  ─────────┬──────── 2026-10-23T21:42:21.0806716Z · ╰── 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-23T21:42:21.0806774Z 163 │ }); 2026-10-23T21:42:21.0806865Z 164 │ confirmedTokensRef.current = tokens; 2026-10-23T21:42:21.0806932Z 165 │ return JSON.stringify( 2026-10-23T21:42:21.0807094Z 166 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-23T21:42:21.0807162Z 167 │ const record = 2026-10-23T21:42:21.0807247Z 168 │ token.type === "context" 2026-10-23T21:42:21.0807410Z 169 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-23T21:42:21.0807479Z 170 │ : undefined; 2026-10-23T21:42:21.0807587Z 171 │ const presentation = contextChipPresentation( 2026-10-23T21:42:21.0807696Z 172 │ token.type === "context" ? token.kind : token.type, 2026-10-23T21:42:21.0807757Z 173 │ record, 2026-10-23T21:42:21.0807816Z 174 │ ); 2026-10-23T21:42:21.0807898Z 175 │ const icon = contextChipIcon( 2026-10-23T21:42:21.0807964Z 176 │ presentation, 2026-10-23T21:42:21.0808104Z 177 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-23T21:42:21.0808165Z 178 │ ); 2026-10-23T21:42:21.0808225Z 179 │ return { 2026-10-23T21:42:21.0808291Z 180 │ type: token.type, 2026-10-23T21:42:21.0808369Z 181 │ source: token.source, 2026-10-23T21:42:21.0808443Z 182 │ start: token.start, 2026-10-23T21:42:21.0808508Z 183 │ end: token.end, 2026-10-23T21:42:21.0808594Z 184 │ accent: presentation.accent, 2026-10-23T21:42:21.0808656Z 185 │ label: 2026-10-23T21:42:21.0808733Z 186 │ token.type === "skill" 2026-10-23T21:42:21.0808839Z 187 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-23T21:42:21.0808918Z 188 │ : token.type === "context" 2026-10-23T21:42:21.0809150Z 189 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-23T21:42:21.0809233Z 190 │ : basename(token.value), 2026-10-23T21:42:21.0809376Z 191 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-23T21:42:21.0809470Z 192 │ iconUri: contextChipIconUri(icon), 2026-10-23T21:42:21.0809560Z 193 │ tintsIcon: icon.kind === "chip", 2026-10-23T21:42:21.0809619Z 194 │ }; 2026-10-23T21:42:21.0809677Z 195 │ }), 2026-10-23T21:42:21.0809729Z 196 │ ); 2026-10-23T21:42:21.0809830Z 197 │ }, [props.value, props.context, skillLabels]); 2026-10-23T21:42:21.0809956Z ·  ────────────────────┬──────────────────── 2026-10-23T21:42:21.0810154Z · ╰── This dependency list is missing values used by the callback 2026-10-23T21:42:21.0810290Z 198 │ // Every render resolves against the snapshot history, so a render whose 2026-10-23T21:42:21.0810343Z ╰──── 2026-10-23T21:42:21.0810544Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-23T21:42:21.0810902Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.0810933Z 2026-10-23T21:42:21.0811119Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-23T21:42:21.0811252Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:259:5] 2026-10-23T21:42:21.0811384Z 251 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-23T21:42:21.0811484Z 252 │ nativeEventSnapshotsRef.current.push({ 2026-10-23T21:42:21.0811578Z ·  ───────────┬─────────── 2026-10-23T21:42:21.0812030Z · ╰── 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-23T21:42:21.0812127Z 253 │ eventCount: acknowledgedEventCount, 2026-10-23T21:42:21.0812189Z 254 │ value, 2026-10-23T21:42:21.0812267Z 255 │ selection: nextSelection, 2026-10-23T21:42:21.0812323Z 256 │ }); 2026-10-23T21:42:21.0812407Z 257 │ return acknowledgedEventCount; 2026-10-23T21:42:21.0812461Z 258 │ }, 2026-10-23T21:42:21.0812516Z 259 │ [], 2026-10-23T21:42:21.0812581Z ·  ─┬ 2026-10-23T21:42:21.0812766Z · ╰── This dependency list is missing values used by the callback 2026-10-23T21:42:21.0812820Z 260 │ ); 2026-10-23T21:42:21.0812873Z ╰──── 2026-10-23T21:42:21.0813070Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-23T21:42:21.0813417Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.0813422Z 2026-10-23T21:42:21.0813652Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-23T21:42:21.0813795Z ╭─[packages/client-runtime/src/operations/projects.ts:228:51] 2026-10-23T21:42:21.0813854Z 227 │ ): string { 2026-10-23T21:42:21.0814010Z 228 │ const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? ""; 2026-10-23T21:42:21.0814125Z ·  ────── 2026-10-23T21:42:21.0814257Z 229 │ return target.owner ? `${target.owner}/${folderName}` : folderName; 2026-10-23T21:42:21.0814306Z ╰──── 2026-10-23T21:42:21.0814537Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-23T21:42:21.0814569Z 2026-10-23T21:42:21.0814769Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T21:42:21.0814899Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:542:25] 2026-10-23T21:42:21.0815028Z 541 │ // range) the boundary string is identical and the chain would die. 2026-10-23T21:42:21.0815116Z 542 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-23T21:42:21.0815219Z ·  ───────┬────── 2026-10-23T21:42:21.0815385Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-23T21:42:21.0815520Z 543 │ const v2SearchQuery = props.searchQuery.trim().toLocaleLowerCase(); 2026-10-23T21:42:21.0815569Z ╰──── 2026-10-23T21:42:21.0815868Z  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-23T21:42:21.0816169Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.0816171Z 2026-10-23T21:42:21.0816338Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T21:42:21.0816462Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:533:53] 2026-10-23T21:42:21.0816547Z 532 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-23T21:42:21.0816702Z 533 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-23T21:42:21.0816823Z ·  ─────┬──── 2026-10-23T21:42:21.0816995Z · ╰── Cannot call impure function 2026-10-23T21:42:21.0817073Z 534 │ const id = setTimeout(() => { 2026-10-23T21:42:21.0817127Z ╰──── 2026-10-23T21:42:21.0817405Z  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-23T21:42:21.0817690Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T21:42:21.0817693Z 2026-10-23T21:42:21.0817911Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-23T21:42:21.0818087Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:1998:15] 2026-10-23T21:42:21.0818157Z 1997 │ assert.equal( 2026-10-23T21:42:21.0818308Z 1998 │ items.filter((item) => item.type === "assistant_message").at(-1)?.text, 2026-10-23T21:42:21.0818386Z ·  ────── 2026-10-23T21:42:21.0818463Z 1999 │ "authoritative answer", 2026-10-23T21:42:21.0818521Z ╰──── 2026-10-23T21:42:21.0818688Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-23T21:42:21.0818690Z 2026-10-23T21:42:21.0819146Z ⚠ 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-23T21:42:21.0819317Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:3951:7] 2026-10-23T21:42:21.0819552Z 3950 │ const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped); 2026-10-23T21:42:21.0819793Z 3951 │ ╭─▶ while (!responseLifecycle.includes("failed")) { 2026-10-23T21:42:21.0819904Z 3952 │ │ yield* Effect.yieldNow; 2026-10-23T21:42:21.0820035Z 3953 │ ╰─▶ } 2026-10-23T21:42:21.0820158Z 3954 │ const responseExit = yield* Fiber.join(responseFiber); 2026-10-23T21:42:21.0820208Z ╰──── 2026-10-23T21:42:21.0820210Z 2026-10-23T21:42:21.0820662Z ⚠ 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-23T21:42:21.0820833Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6062:9] 2026-10-23T21:42:21.0820922Z 6061 │ .pipe(Effect.forkScoped); 2026-10-23T21:42:21.0821108Z 6062 │ ╭─▶ while (promptGates.length < 1) { 2026-10-23T21:42:21.0821216Z 6063 │ │ yield* Effect.yieldNow; 2026-10-23T21:42:21.0821356Z 6064 │ ╰─▶ } 2026-10-23T21:42:21.0821520Z 6065 │ assert.isDefined(sessionUpdateHandler, "session update handler must be wired"); 2026-10-23T21:42:21.0821572Z ╰──── 2026-10-23T21:42:21.0821574Z 2026-10-23T21:42:21.0822028Z ⚠ 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-23T21:42:21.0822198Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6197:9] 2026-10-23T21:42:21.0822283Z 6196 │ .pipe(Effect.forkScoped); 2026-10-23T21:42:21.0822471Z 6197 │ ╭─▶ while (promptGates.length < 2) { 2026-10-23T21:42:21.0822581Z 6198 │ │ yield* Effect.yieldNow; 2026-10-23T21:42:21.0822718Z 6199 │ ╰─▶ } 2026-10-23T21:42:21.0822881Z 6200 │ if (sessionUpdateHandler === undefined || capturedMutation.current === null) { 2026-10-23T21:42:21.0822932Z ╰──── 2026-10-23T21:42:21.0822935Z 2026-10-23T21:42:21.0823413Z ⚠ 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-23T21:42:21.0823552Z ╭─[packages/client-runtime/src/rpc/session.test.ts:226:3] 2026-10-23T21:42:21.0823610Z 225 │ ) { 2026-10-23T21:42:21.0823808Z 226 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T21:42:21.0823917Z 227 │ │ const socket = sockets[index]; 2026-10-23T21:42:21.0824005Z 228 │ │ if (socket) { 2026-10-23T21:42:21.0824099Z 229 │ │ return socket; 2026-10-23T21:42:21.0824171Z 230 │ │ } 2026-10-23T21:42:21.0824273Z 231 │ │ yield* Effect.yieldNow; 2026-10-23T21:42:21.0824443Z 232 │ ╰─▶ } 2026-10-23T21:42:21.0824646Z 233 │ return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket.")); 2026-10-23T21:42:21.0824696Z ╰──── 2026-10-23T21:42:21.0824698Z 2026-10-23T21:42:21.0825147Z ⚠ 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-23T21:42:21.0825280Z ╭─[packages/client-runtime/src/rpc/session.test.ts:240:3] 2026-10-23T21:42:21.0825339Z 239 │ ) { 2026-10-23T21:42:21.0825538Z 240 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T21:42:21.0825750Z 241 │ │ const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index]; 2026-10-23T21:42:21.0825843Z 242 │ │ if (request) { 2026-10-23T21:42:21.0825936Z 243 │ │ return request; 2026-10-23T21:42:21.0826009Z 244 │ │ } 2026-10-23T21:42:21.0826107Z 245 │ │ yield* Effect.yieldNow; 2026-10-23T21:42:21.0826234Z 246 │ ╰─▶ } 2026-10-23T21:42:21.0826396Z 247 │ return yield* Effect.die(new Error("Expected the RPC protocol to send a request.")); 2026-10-23T21:42:21.0826447Z ╰──── 2026-10-23T21:42:21.0826449Z 2026-10-23T21:42:21.0826902Z ⚠ 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-23T21:42:21.0827033Z ╭─[packages/client-runtime/src/rpc/client.test.ts:131:9] 2026-10-23T21:42:21.0827093Z 130 │ ) { 2026-10-23T21:42:21.0827299Z 131 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T21:42:21.0827419Z 132 │ │ if (subscriptions.length >= count) { 2026-10-23T21:42:21.0827506Z 133 │ │ return; 2026-10-23T21:42:21.0827586Z 134 │ │ } 2026-10-23T21:42:21.0827690Z 135 │ │ yield* Effect.yieldNow; 2026-10-23T21:42:21.0827822Z 136 │ ╰─▶ } 2026-10-23T21:42:21.0827986Z 137 │ return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`)); 2026-10-23T21:42:21.0828042Z ╰──── 2026-10-23T21:42:21.0828044Z 2026-10-23T21:42:21.0828491Z ⚠ 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-23T21:42:21.0828618Z ╭─[packages/client-runtime/src/rpc/client.test.ts:252:7] 2026-10-23T21:42:21.0828773Z 251 │ yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient))); 2026-10-23T21:42:21.0829025Z 252 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) { 2026-10-23T21:42:21.0829128Z 253 │ │ yield* Effect.yieldNow; 2026-10-23T21:42:21.0829305Z 254 │ ╰─▶ } 2026-10-23T21:42:21.0829453Z 255 │ yield* SubscriptionRef.set(activeSession, Option.none()); 2026-10-23T21:42:21.0829505Z ╰──── 2026-10-23T21:42:21.0829507Z 2026-10-23T21:42:21.0829950Z ⚠ 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-23T21:42:21.0830079Z ╭─[packages/client-runtime/src/rpc/client.test.ts:258:7] 2026-10-23T21:42:21.0830132Z 257 │ 2026-10-23T21:42:21.0830374Z 258 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-23T21:42:21.0830476Z 259 │ │ yield* Effect.yieldNow; 2026-10-23T21:42:21.0830612Z 260 │ ╰─▶ } 2026-10-23T21:42:21.0830719Z 261 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-23T21:42:21.0830770Z ╰──── 2026-10-23T21:42:21.0830772Z 2026-10-23T21:42:21.0831217Z ⚠ 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-23T21:42:21.0831347Z ╭─[packages/client-runtime/src/rpc/client.test.ts:322:7] 2026-10-23T21:42:21.0831405Z 321 │ ); 2026-10-23T21:42:21.0831658Z 322 │ ╭─▶ for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) { 2026-10-23T21:42:21.0831762Z 323 │ │ yield* Effect.yieldNow; 2026-10-23T21:42:21.0831893Z 324 │ ╰─▶ } 2026-10-23T21:42:21.0831949Z 325 │ 2026-10-23T21:42:21.0832003Z ╰──── 2026-10-23T21:42:21.0832005Z 2026-10-23T21:42:21.0832445Z ⚠ 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-23T21:42:21.0832574Z ╭─[packages/client-runtime/src/rpc/client.test.ts:330:7] 2026-10-23T21:42:21.0832731Z 329 │ yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient))); 2026-10-23T21:42:21.0832980Z 330 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-23T21:42:21.0833082Z 331 │ │ yield* Effect.yieldNow; 2026-10-23T21:42:21.0833239Z 332 │ ╰─▶ } 2026-10-23T21:42:21.0833346Z 333 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-23T21:42:21.0833400Z ╰──── 2026-10-23T21:42:21.0833402Z 2026-10-23T21:42:21.0833847Z ⚠ 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-23T21:42:21.0833975Z ╭─[apps/server/src/usage/UsageService.test.ts:2383:7] 2026-10-23T21:42:21.0834074Z 2382 │ let orphanedAt: number | undefined; 2026-10-23T21:42:21.0834357Z 2383 │ ╭─▶ for (let interruptAt = 1; interruptAt <= 31; interruptAt += 1) { 2026-10-23T21:42:21.0834508Z 2384 │ │ const tasks: Array<() => void> = []; 2026-10-23T21:42:21.0834656Z 2385 │ │ const dispatcher: Scheduler.SchedulerDispatcher = { 2026-10-23T21:42:21.0834792Z 2386 │ │ scheduleTask: (task) => tasks.push(task), 2026-10-23T21:42:21.0834891Z 2387 │ │ flush: () => { 2026-10-23T21:42:21.0835015Z 2388 │ │ let task: (() => void) | undefined; 2026-10-23T21:42:21.0835160Z 2389 │ │ while ((task = tasks.shift()) !== undefined) task(); 2026-10-23T21:42:21.0835243Z 2390 │ │ }, 2026-10-23T21:42:21.0835323Z 2391 │ │ }; 2026-10-23T21:42:21.0835398Z 2392 │ │ 2026-10-23T21:42:21.0835558Z 2393 │ │ let requestFiber: Fiber.Fiber | undefined; 2026-10-23T21:42:21.0835662Z 2394 │ │ let requestChecks = 0; 2026-10-23T21:42:21.0835795Z 2395 │ │ const scheduler: Scheduler.Scheduler = { 2026-10-23T21:42:21.0835902Z 2396 │ │ executionMode: "async", 2026-10-23T21:42:21.0836023Z 2397 │ │ makeDispatcher: () => dispatcher, 2026-10-23T21:42:21.0836134Z 2398 │ │ shouldYield: (fiber) => { 2026-10-23T21:42:21.0836269Z 2399 │ │ if (fiber !== requestFiber) return false; 2026-10-23T21:42:21.0836372Z 2400 │ │ requestChecks += 1; 2026-10-23T21:42:21.0836517Z 2401 │ │ if (requestChecks !== interruptAt) return false; 2026-10-23T21:42:21.0836633Z 2402 │ │ fiber.interruptUnsafe(); 2026-10-23T21:42:21.0836733Z 2403 │ │ return true; 2026-10-23T21:42:21.0836816Z 2404 │ │ }, 2026-10-23T21:42:21.0836895Z 2405 │ │ }; 2026-10-23T21:42:21.0836963Z 2406 │ │ 2026-10-23T21:42:21.0837087Z 2407 │ │ const input: UsageSummaryInput = { 2026-10-23T21:42:21.0837179Z 2408 │ │ ...WINDOW, 2026-10-23T21:42:21.0837307Z 2409 │ │ sinceDay: UsageDay.make("2026-09-01"), 2026-10-23T21:42:21.0837499Z 2410 │ │ untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`), 2026-10-23T21:42:21.0837584Z 2411 │ │ }; 2026-10-23T21:42:21.0837701Z 2412 │ │ const first = yield* service 2026-10-23T21:42:21.0837806Z 2413 │ │ .readSummary(input) 2026-10-23T21:42:21.0837894Z 2414 │ │ .pipe( 2026-10-23T21:42:21.0837991Z 2415 │ │ Effect.exit, 2026-10-23T21:42:21.0838148Z 2416 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-23T21:42:21.0838251Z 2417 │ │ Effect.forkChild, 2026-10-23T21:42:21.0838329Z 2418 │ │ ); 2026-10-23T21:42:21.0838431Z 2419 │ │ requestFiber = first; 2026-10-23T21:42:21.0838537Z 2420 │ │ yield* Effect.yieldNow; 2026-10-23T21:42:21.0838697Z 2421 │ │ dispatcher.flush(); 2026-10-23T21:42:21.0838796Z 2422 │ │ 2026-10-23T21:42:21.0838949Z 2423 │ │ const second = yield* service.readSummary(input).pipe( 2026-10-23T21:42:21.0839045Z 2424 │ │ Effect.match({ 2026-10-23T21:42:21.0839171Z 2425 │ │ onFailure: (error) => error.reason, 2026-10-23T21:42:21.0839291Z 2426 │ │ onSuccess: () => "success" as const, 2026-10-23T21:42:21.0839377Z 2427 │ │ }), 2026-10-23T21:42:21.0839531Z 2428 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-23T21:42:21.0839631Z 2429 │ │ Effect.forkChild, 2026-10-23T21:42:21.0839708Z 2430 │ │ ); 2026-10-23T21:42:21.0839816Z 2431 │ │ yield* Effect.yieldNow; 2026-10-23T21:42:21.0839918Z 2432 │ │ dispatcher.flush(); 2026-10-23T21:42:21.0840044Z 2433 │ │ const secondExit = second.pollUnsafe(); 2026-10-23T21:42:21.0840157Z 2434 │ │ if (secondExit === undefined) { 2026-10-23T21:42:21.0840269Z 2435 │ │ second.interruptUnsafe(); 2026-10-23T21:42:21.0840376Z 2436 │ │ orphanedAt = interruptAt; 2026-10-23T21:42:21.0840462Z 2437 │ │ break; 2026-10-23T21:42:21.0840538Z 2438 │ │ } 2026-10-23T21:42:21.0840656Z 2439 │ │ if (Exit.isFailure(secondExit)) { 2026-10-23T21:42:21.0840811Z 2440 │ │ assert.fail("the matching request fiber was interrupted"); 2026-10-23T21:42:21.0840893Z 2441 │ │ } 2026-10-23T21:42:21.0841045Z 2442 │ │ assert.strictEqual(secondExit.value, "invalidWindow"); 2026-10-23T21:42:21.0841176Z 2443 │ ╰─▶ } 2026-10-23T21:42:21.0841233Z 2444 │ 2026-10-23T21:42:21.0841291Z ╰──── 2026-10-23T21:42:21.0841294Z 2026-10-23T21:42:21.0841553Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T21:42:21.0841719Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:285:5] 2026-10-23T21:42:21.0841836Z 283 │ const [snoozeWakeTick, bumpSnoozeWakeTick] = useState(0); 2026-10-23T21:42:21.0841903Z 284 │ useEffect(() => { 2026-10-23T21:42:21.0841972Z ·  ────┬──── 2026-10-23T21:42:21.0842164Z · ╰── This is the containing effect 2026-10-23T21:42:21.0842276Z 285 │ setNow(new Date().toISOString()); 2026-10-23T21:42:21.0842344Z ·  ───┬── 2026-10-23T21:42:21.0842509Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.0842643Z 286 │ const id = setInterval(() => setNow(new Date().toISOString()), 60_000); 2026-10-23T21:42:21.0842693Z ╰──── 2026-10-23T21:42:21.0843325Z  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-23T21:42:21.0843649Z  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-23T21:42:21.0843654Z 2026-10-23T21:42:21.0843857Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T21:42:21.0844026Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:365:25] 2026-10-23T21:42:21.0844155Z 364 │ // range) the boundary string is identical and the chain would die. 2026-10-23T21:42:21.0844245Z 365 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-23T21:42:21.0844348Z ·  ───────┬────── 2026-10-23T21:42:21.0844516Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-23T21:42:21.0844628Z 366 │ const listItems = ((): readonly SidebarListItem[] => { 2026-10-23T21:42:21.0844687Z ╰──── 2026-10-23T21:42:21.0845031Z  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-23T21:42:21.0845334Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.0845336Z 2026-10-23T21:42:21.0845506Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T21:42:21.0845669Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:356:53] 2026-10-23T21:42:21.0845754Z 355 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-23T21:42:21.0845905Z 356 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-23T21:42:21.0846035Z ·  ─────┬──── 2026-10-23T21:42:21.0846209Z · ╰── Cannot call impure function 2026-10-23T21:42:21.0846295Z 357 │ const id = setTimeout(() => { 2026-10-23T21:42:21.0846345Z ╰──── 2026-10-23T21:42:21.0846627Z  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-23T21:42:21.0846914Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T21:42:21.0846916Z 2026-10-23T21:42:21.0847181Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-23T21:42:21.0847367Z ╭─[apps/server/src/usage/UsageService.ts:169:7] 2026-10-23T21:42:21.0847463Z 168 │ 2026-10-23T21:42:21.0847543Z 169 │ const layerTest = Layer.succeed( 2026-10-23T21:42:21.0883605Z ·  ────┬──── 2026-10-23T21:42:21.0883845Z · ╰── 'layerTest' is declared here 2026-10-23T21:42:21.0883914Z 170 │ UsageService, 2026-10-23T21:42:21.0883967Z ╰──── 2026-10-23T21:42:21.0884107Z  help: Consider removing this declaration. 2026-10-23T21:42:21.0884128Z 2026-10-23T21:42:21.0884330Z ⚠ eslint(no-unused-vars): Identifier 'Fiber' is imported but never used. 2026-10-23T21:42:21.0884429Z ╭─[apps/server/src/ws.ts:10:13] 2026-10-23T21:42:21.0884515Z  9 │ import * as Effect from "effect/Effect"; 2026-10-23T21:42:21.0884600Z 10 │ import * as Fiber from "effect/Fiber"; 2026-10-23T21:42:21.0884688Z ·  ──┬── 2026-10-23T21:42:21.0884901Z · ╰── 'Fiber' is imported here 2026-10-23T21:42:21.0885001Z 11 │ import * as FileSystem from "effect/FileSystem"; 2026-10-23T21:42:21.0885054Z ╰──── 2026-10-23T21:42:21.0885148Z  help: Consider removing this import. 2026-10-23T21:42:21.0885151Z 2026-10-23T21:42:21.0885348Z ⚠ eslint(no-unused-vars): Identifier 'Schedule' is imported but never used. 2026-10-23T21:42:21.0885438Z ╭─[apps/server/src/ws.ts:17:13] 2026-10-23T21:42:21.0885516Z 16 │ import * as Ref from "effect/Ref"; 2026-10-23T21:42:21.0885604Z 17 │ import * as Schedule from "effect/Schedule"; 2026-10-23T21:42:21.0885679Z ·  ────┬─── 2026-10-23T21:42:21.0885821Z · ╰── 'Schedule' is imported here 2026-10-23T21:42:21.0885905Z 18 │ import * as Schema from "effect/Schema"; 2026-10-23T21:42:21.0885952Z ╰──── 2026-10-23T21:42:21.0886047Z  help: Consider removing this import. 2026-10-23T21:42:21.0886049Z 2026-10-23T21:42:21.0886342Z ⚠ eslint(no-unused-vars): Variable 'projectSetupScriptRunner' is declared but never used. Unused variables should start with a '_'. 2026-10-23T21:42:21.0886441Z ╭─[apps/server/src/ws.ts:1285:13] 2026-10-23T21:42:21.0886590Z 1284 │ const usageLimitSources = yield* UsageLimitSources.UsageLimitSources; 2026-10-23T21:42:21.0886783Z 1285 │ const projectSetupScriptRunner = yield* ProjectSetupScriptRunner.ProjectSetupScriptRunner; 2026-10-23T21:42:21.0886889Z ·  ────────────┬─────────── 2026-10-23T21:42:21.0887070Z · ╰── 'projectSetupScriptRunner' is declared here 2026-10-23T21:42:21.0887233Z 1286 │ const worktreeSetupTracker = yield* WorktreeSetupTracker.WorktreeSetupTracker; 2026-10-23T21:42:21.0887285Z ╰──── 2026-10-23T21:42:21.0887383Z  help: Consider removing this declaration. 2026-10-23T21:42:21.0887385Z 2026-10-23T21:42:21.0887838Z ⚠ 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-23T21:42:21.0887961Z ╭─[packages/shared/src/atomicWrite.test.ts:139:5] 2026-10-23T21:42:21.0888033Z 138 │ Effect.gen(function* () { 2026-10-23T21:42:21.0888396Z 139 │ ╭─▶ while (fiber.pollUnsafe() === undefined) { 2026-10-23T21:42:21.0888576Z 140 │ │ yield* TestClock.adjust("100 millis"); 2026-10-23T21:42:21.0888887Z 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-23T21:42:21.0889066Z 142 │ │ yield* Effect.promise(() => new Promise((resolve) => setImmediate(resolve))); 2026-10-23T21:42:21.0889194Z 143 │ ╰─▶ } 2026-10-23T21:42:21.0889278Z 144 │ return yield* Fiber.join(fiber); 2026-10-23T21:42:21.0889328Z ╰──── 2026-10-23T21:42:21.0889330Z 2026-10-23T21:42:21.0889513Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T21:42:21.0889687Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:555:70] 2026-10-23T21:42:21.0889768Z 554 │ assert.deepStrictEqual( 2026-10-23T21:42:21.0889927Z 555 │ (yield* Ref.get(fixture.syncCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-23T21:42:21.0890044Z ·  ┬ 2026-10-23T21:42:21.0890204Z · ╰── '_' is declared here 2026-10-23T21:42:21.0890265Z 556 │ [ 2026-10-23T21:42:21.0890314Z ╰──── 2026-10-23T21:42:21.0890413Z  help: Consider removing this parameter. 2026-10-23T21:42:21.0890415Z 2026-10-23T21:42:21.0890592Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T21:42:21.0890766Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:1155:70] 2026-10-23T21:42:21.0890848Z 1154 │ assert.deepStrictEqual( 2026-10-23T21:42:21.0891005Z 1155 │ (yield* Ref.get(fixture.linkCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-23T21:42:21.0891119Z ·  ┬ 2026-10-23T21:42:21.0891277Z · ╰── '_' is declared here 2026-10-23T21:42:21.0891336Z 1156 │ [ 2026-10-23T21:42:21.0891386Z ╰──── 2026-10-23T21:42:21.0891481Z  help: Consider removing this parameter. 2026-10-23T21:42:21.0891483Z 2026-10-23T21:42:21.0891633Z ⚠ react(immutability): This value cannot be modified 2026-10-23T21:42:21.0891792Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-23T21:42:21.0891847Z  86 │ 2026-10-23T21:42:21.0891937Z  87 │ const cardCoverage = props.cardCoverage; 2026-10-23T21:42:21.0892018Z ·  ──────┬───── 2026-10-23T21:42:21.0892152Z · ╰── `cardCoverage` originates here 2026-10-23T21:42:21.0892228Z  88 │ const barHeightRef = useRef(0); 2026-10-23T21:42:21.0892303Z  89 │ const cardHeightRef = useRef(0); 2026-10-23T21:42:21.0892385Z  90 │ const cardHeight = useSharedValue(0); 2026-10-23T21:42:21.0892476Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-23T21:42:21.0892542Z  92 │ if (!cardCoverage) { 2026-10-23T21:42:21.0892599Z  93 │ return; 2026-10-23T21:42:21.0892652Z  94 │ } 2026-10-23T21:42:21.0892796Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-23T21:42:21.0892933Z  96 │ if (coverage === cardCoverage.value) { 2026-10-23T21:42:21.0893016Z  97 │ return; 2026-10-23T21:42:21.0893067Z  98 │ } 2026-10-23T21:42:21.0893143Z  99 │ if (cardCoverage.value === 0) { 2026-10-23T21:42:21.0893250Z 100 │ cardCoverage.value = coverage; 2026-10-23T21:42:21.0893329Z ·  ──────┬───── 2026-10-23T21:42:21.0893470Z · ╰── `cardCoverage` cannot be modified 2026-10-23T21:42:21.0893526Z 101 │ return; 2026-10-23T21:42:21.0893574Z ╰──── 2026-10-23T21:42:21.0893860Z  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-23T21:42:21.0894169Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T21:42:21.0894174Z 2026-10-23T21:42:21.0894325Z ⚠ react(immutability): This value cannot be modified 2026-10-23T21:42:21.0894476Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7] 2026-10-23T21:42:21.0894552Z  89 │ const cardHeightRef = useRef(0); 2026-10-23T21:42:21.0894633Z  90 │ const cardHeight = useSharedValue(0); 2026-10-23T21:42:21.0894709Z ·  ─────┬──── 2026-10-23T21:42:21.0894843Z · ╰── `cardHeight` originates here 2026-10-23T21:42:21.0894931Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-23T21:42:21.0894996Z  92 │ if (!cardCoverage) { 2026-10-23T21:42:21.0895051Z  93 │ return; 2026-10-23T21:42:21.0895105Z  94 │ } 2026-10-23T21:42:21.0895253Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-23T21:42:21.0895339Z  96 │ if (coverage === cardCoverage.value) { 2026-10-23T21:42:21.0895393Z  97 │ return; 2026-10-23T21:42:21.0895446Z  98 │ } 2026-10-23T21:42:21.0895521Z  99 │ if (cardCoverage.value === 0) { 2026-10-23T21:42:21.0895600Z 100 │ cardCoverage.value = coverage; 2026-10-23T21:42:21.0895656Z 101 │ return; 2026-10-23T21:42:21.0895708Z 102 │ } 2026-10-23T21:42:21.0895805Z 103 │ cardCoverage.value = withTiming(coverage, { 2026-10-23T21:42:21.0895899Z 104 │ duration: USER_INPUT_TOGGLE_DURATION_MS, 2026-10-23T21:42:21.0895982Z 105 │ easing: Easing.out(Easing.cubic), 2026-10-23T21:42:21.0896034Z 106 │ }); 2026-10-23T21:42:21.0896098Z 107 │ }, [cardCoverage]); 2026-10-23T21:42:21.0896180Z 108 │ const handleBarLayout = useCallback( 2026-10-23T21:42:21.0896262Z 109 │ (event: LayoutChangeEvent) => { 2026-10-23T21:42:21.0896386Z 110 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-23T21:42:21.0896450Z 111 │ notifyCoverage(); 2026-10-23T21:42:21.0896503Z 112 │ }, 2026-10-23T21:42:21.0896566Z 113 │ [notifyCoverage], 2026-10-23T21:42:21.0896616Z 114 │ ); 2026-10-23T21:42:21.0896698Z 115 │ const handleCardLayout = useCallback( 2026-10-23T21:42:21.0896774Z 116 │ (event: LayoutChangeEvent) => { 2026-10-23T21:42:21.0896896Z 117 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-23T21:42:21.0897004Z 118 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-23T21:42:21.0897079Z ·  ─────┬──── 2026-10-23T21:42:21.0897217Z · ╰── `cardHeight` cannot be modified 2026-10-23T21:42:21.0897281Z 119 │ notifyCoverage(); 2026-10-23T21:42:21.0897394Z ╰──── 2026-10-23T21:42:21.0897681Z  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-23T21:42:21.0897972Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T21:42:21.0897975Z 2026-10-23T21:42:21.0898172Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T21:42:21.0898321Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-23T21:42:21.0898404Z  90 │ const cardHeight = useSharedValue(0); 2026-10-23T21:42:21.0898495Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-23T21:42:21.0898603Z ·  ───┬─── 2026-10-23T21:42:21.0898838Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-23T21:42:21.0898903Z  92 │ if (!cardCoverage) { 2026-10-23T21:42:21.0898960Z  93 │ return; 2026-10-23T21:42:21.0899011Z  94 │ } 2026-10-23T21:42:21.0899153Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-23T21:42:21.0899236Z  96 │ if (coverage === cardCoverage.value) { 2026-10-23T21:42:21.0899292Z  97 │ return; 2026-10-23T21:42:21.0899342Z  98 │ } 2026-10-23T21:42:21.0899418Z  99 │ if (cardCoverage.value === 0) { 2026-10-23T21:42:21.0899500Z 100 │ cardCoverage.value = coverage; 2026-10-23T21:42:21.0899577Z ·  ──────┬───── 2026-10-23T21:42:21.0899721Z · ╰── This modifies `cardCoverage` 2026-10-23T21:42:21.0899782Z 101 │ return; 2026-10-23T21:42:21.0899836Z ╰──── 2026-10-23T21:42:21.0900166Z  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-23T21:42:21.0900457Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T21:42:21.0900459Z 2026-10-23T21:42:21.0900655Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T21:42:21.0900802Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-23T21:42:21.0900883Z  99 │ if (cardCoverage.value === 0) { 2026-10-23T21:42:21.0900968Z 100 │ cardCoverage.value = coverage; 2026-10-23T21:42:21.0901049Z ·  ──────┬───── 2026-10-23T21:42:21.0901181Z · ╰── This modifies `cardCoverage` 2026-10-23T21:42:21.0901238Z 101 │ return; 2026-10-23T21:42:21.0901289Z 102 │ } 2026-10-23T21:42:21.0901385Z 103 │ cardCoverage.value = withTiming(coverage, { 2026-10-23T21:42:21.0901477Z 104 │ duration: USER_INPUT_TOGGLE_DURATION_MS, 2026-10-23T21:42:21.0901560Z 105 │ easing: Easing.out(Easing.cubic), 2026-10-23T21:42:21.0901613Z 106 │ }); 2026-10-23T21:42:21.0901674Z 107 │ }, [cardCoverage]); 2026-10-23T21:42:21.0901756Z 108 │ const handleBarLayout = useCallback( 2026-10-23T21:42:21.0901833Z 109 │ (event: LayoutChangeEvent) => { 2026-10-23T21:42:21.0901941Z ·  ───────────────┬─────────────── 2026-10-23T21:42:21.0902216Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-23T21:42:21.0902396Z 110 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-23T21:42:21.0902446Z ╰──── 2026-10-23T21:42:21.0902768Z  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-23T21:42:21.0903059Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T21:42:21.0903063Z 2026-10-23T21:42:21.0903266Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T21:42:21.0903504Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7] 2026-10-23T21:42:21.0903588Z 115 │ const handleCardLayout = useCallback( 2026-10-23T21:42:21.0903665Z 116 │ (event: LayoutChangeEvent) => { 2026-10-23T21:42:21.0903768Z ·  ───────────────┬─────────────── 2026-10-23T21:42:21.0903984Z · ╰── This function may (indirectly) reassign or modify `cardHeight` after render 2026-10-23T21:42:21.0904105Z 117 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-23T21:42:21.0904216Z 118 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-23T21:42:21.0904290Z ·  ─────┬──── 2026-10-23T21:42:21.0904420Z · ╰── This modifies `cardHeight` 2026-10-23T21:42:21.0904485Z 119 │ notifyCoverage(); 2026-10-23T21:42:21.0904536Z ╰──── 2026-10-23T21:42:21.0904860Z  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-23T21:42:21.0905159Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T21:42:21.0905162Z 2026-10-23T21:42:21.0905430Z ⚠ eslint(no-unused-vars): Variable 'layerUnavailable' is declared but never used. Unused variables should start with a '_'. 2026-10-23T21:42:21.0905571Z ╭─[apps/server/src/orchestration-v2/Orchestrator.ts:12340:7] 2026-10-23T21:42:21.0905626Z 12339 │ 2026-10-23T21:42:21.0905761Z 12340 │ const layerUnavailable: Layer.Layer = Layer.succeed( 2026-10-23T21:42:21.0905848Z ·  ────────┬─────── 2026-10-23T21:42:21.0906045Z · ╰── 'layerUnavailable' is declared here 2026-10-23T21:42:21.0906144Z 12341 │ OrchestratorV2, 2026-10-23T21:42:21.0906195Z ╰──── 2026-10-23T21:42:21.0906296Z  help: Consider removing this declaration. 2026-10-23T21:42:21.0906299Z 2026-10-23T21:42:21.0906739Z ⚠ 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-23T21:42:21.0906864Z ╭─[apps/server/src/assets/AssetAccess.test.ts:1043:32] 2026-10-23T21:42:21.0906996Z 1042 │ expect(error._tag).toBe("AssetGitHubMediaUrlValidationError"); 2026-10-23T21:42:21.0907177Z 1043 │ const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(AssetAccessError))(error); 2026-10-23T21:42:21.0907297Z ·  ─────────────────── 2026-10-23T21:42:21.0907389Z 1044 │ expect(encoded).not.toContain(url); 2026-10-23T21:42:21.0907440Z ╰──── 2026-10-23T21:42:21.0907443Z 2026-10-23T21:42:21.0907632Z ⚠ eslint(no-unused-vars): Type 'EnvironmentId' is imported but never used. 2026-10-23T21:42:21.0907765Z ╭─[packages/client-runtime/src/state/sharedSettings.ts:2:3] 2026-10-23T21:42:21.0907827Z 1 │ import type { 2026-10-23T21:42:21.0907891Z 2 │ EnvironmentId, 2026-10-23T21:42:21.0907964Z ·  ──────┬────── 2026-10-23T21:42:21.0908098Z · ╰── 'EnvironmentId' is imported here 2026-10-23T21:42:21.0908184Z 3 │ ExecutionEnvironmentCapabilities, 2026-10-23T21:42:21.0908235Z ╰──── 2026-10-23T21:42:21.0908335Z  help: Consider removing this import. 2026-10-23T21:42:21.0908342Z 2026-10-23T21:42:21.0908533Z ⚠ eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used. 2026-10-23T21:42:21.0908622Z ╭─[apps/web/src/types.ts:22:3] 2026-10-23T21:42:21.0908692Z 21 │ EnvironmentThreadShell, 2026-10-23T21:42:21.0908755Z 22 │ ThreadRunSummary, 2026-10-23T21:42:21.0908831Z ·  ────────┬─────── 2026-10-23T21:42:21.0908969Z · ╰── 'ThreadRunSummary' is imported here 2026-10-23T21:42:21.0909036Z 23 │ ThreadRuntimeSummary, 2026-10-23T21:42:21.0909085Z ╰──── 2026-10-23T21:42:21.0909177Z  help: Consider removing this import. 2026-10-23T21:42:21.0909179Z 2026-10-23T21:42:21.0909636Z ⚠ 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-23T21:42:21.0909789Z ╭─[apps/server/src/project/ProjectEnrichmentService.test.ts:28:3] 2026-10-23T21:42:21.0909842Z 27 │ ) { 2026-10-23T21:42:21.0910045Z 28 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T21:42:21.0910185Z 29 │ │ const available = yield* service.peek(workspaceRoot); 2026-10-23T21:42:21.0910307Z 30 │ │ if (predicate(available)) return available; 2026-10-23T21:42:21.0910406Z 31 │ │ yield* Effect.yieldNow; 2026-10-23T21:42:21.0910527Z 32 │ ╰─▶ } 2026-10-23T21:42:21.0910748Z 33 │ return yield* Effect.die(`Project metadata for ${workspaceRoot} was not resolved in time.`); 2026-10-23T21:42:21.0910822Z ╰──── 2026-10-23T21:42:21.0910824Z 2026-10-23T21:42:21.0911017Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T21:42:21.0911146Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:454:7] 2026-10-23T21:42:21.0911227Z 453 │ showAuxiliaryPane("inspector"); 2026-10-23T21:42:21.0911327Z 454 │ }, [environmentId, showAuxiliaryPane, threadId]); 2026-10-23T21:42:21.0911474Z ·  ──────┬────── ────┬─── 2026-10-23T21:42:21.0911668Z · │ ╰── Unnecessary dependency `threadId` 2026-10-23T21:42:21.0911820Z · ╰── Unnecessary dependency `environmentId` 2026-10-23T21:42:21.0911879Z 455 │ const { 2026-10-23T21:42:21.0911929Z ╰──── 2026-10-23T21:42:21.0912208Z  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-23T21:42:21.0912505Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.0912508Z 2026-10-23T21:42:21.0912687Z ⚠ react(static-components): Cannot create components during render 2026-10-23T21:42:21.0912819Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:725:20] 2026-10-23T21:42:21.0912878Z 492 │ // same check. 2026-10-23T21:42:21.0913000Z 493 │ const NativeReviewDiffView = resolveNativeReviewDiffView(); 2026-10-23T21:42:21.0913124Z ·  ─────────────┬───────────── 2026-10-23T21:42:21.0913354Z · ╰── The component is created during render here 2026-10-23T21:42:21.0913497Z 494 │ const nativeReviewDiffViewRef = useRef(null); 2026-10-23T21:42:21.0913610Z 495 │ const showcasedReviewDrawRef = useRef(null); 2026-10-23T21:42:21.0913735Z 496 │ const [isPullRefreshing, setIsPullRefreshing] = useState(false); 2026-10-23T21:42:21.0913826Z 497 │ const handlePullToRefresh = async () => { 2026-10-23T21:42:21.0913899Z 498 │ setIsPullRefreshing(true); 2026-10-23T21:42:21.0913978Z 499 │ await refreshSelectedSection(); 2026-10-23T21:42:21.0914052Z 500 │ setIsPullRefreshing(false); 2026-10-23T21:42:21.0914104Z 501 │ }; 2026-10-23T21:42:21.0914244Z 502 │ const reviewFileNavigatorRef = useRef(null); 2026-10-23T21:42:21.0914383Z 503 │ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : []; 2026-10-23T21:42:21.0914484Z 504 │ const fileVisibility = useReviewFileVisibility({ 2026-10-23T21:42:21.0914566Z 505 │ threadKey: reviewCache.threadKey, 2026-10-23T21:42:21.0914651Z 506 │ sectionId: selectedSection?.id ?? null, 2026-10-23T21:42:21.0914717Z 507 │ files: reviewFiles, 2026-10-23T21:42:21.0914811Z 508 │ cachedExpandedFileIds: selectedSection?.id 2026-10-23T21:42:21.0914937Z 509 │ ? reviewCache.expandedFileIdsBySection[selectedSection.id] 2026-10-23T21:42:21.0914998Z 510 │ : undefined, 2026-10-23T21:42:21.0915089Z 511 │ cachedViewedFileIds: selectedSection?.id 2026-10-23T21:42:21.0915207Z 512 │ ? reviewCache.viewedFileIdsBySection[selectedSection.id] 2026-10-23T21:42:21.0915316Z 513 │ : undefined, 2026-10-23T21:42:21.0915395Z 514 │ }); 2026-10-23T21:42:21.0915574Z 515 │ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility; 2026-10-23T21:42:21.0915698Z 516 │ const commentSelection = useReviewCommentSelectionController({ 2026-10-23T21:42:21.0915759Z 517 │ environmentId, 2026-10-23T21:42:21.0915816Z 518 │ threadId, 2026-10-23T21:42:21.0915880Z 519 │ selectedSection, 2026-10-23T21:42:21.0915949Z 520 │ nativeReviewDiffData, 2026-10-23T21:42:21.0916002Z 521 │ }); 2026-10-23T21:42:21.0916102Z 522 │ const nativeBridge = useNativeReviewDiffBridge({ 2026-10-23T21:42:21.0916185Z 523 │ threadKey: reviewCache.threadKey, 2026-10-23T21:42:21.0916271Z 524 │ sectionId: selectedSection?.id ?? null, 2026-10-23T21:42:21.0916346Z 525 │ diff: selectedSection?.diff, 2026-10-23T21:42:21.0916423Z 526 │ data: nativeReviewDiffData, 2026-10-23T21:42:21.0916493Z 527 │ collapsedFileIds, 2026-10-23T21:42:21.0916553Z 528 │ viewedFileIds, 2026-10-23T21:42:21.0916660Z 529 │ selectedRowIds: commentSelection.selectedRowIds, 2026-10-23T21:42:21.0916752Z 530 │ canHighlight: parsedDiff.kind === "files", 2026-10-23T21:42:21.0916804Z 531 │ }); 2026-10-23T21:42:21.0916873Z 532 │ const showcaseReviewKey = 2026-10-23T21:42:21.0916998Z 533 │ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection 2026-10-23T21:42:21.0917194Z 534 │ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}` 2026-10-23T21:42:21.0917252Z 535 │ : null; 2026-10-23T21:42:21.0917410Z 536 │ const handleNativeDebug = (event: NativeSyntheticEvent>) => { 2026-10-23T21:42:21.0917486Z 537 │ nativeBridge.onDebug(event); 2026-10-23T21:42:21.0917545Z 538 │ if ( 2026-10-23T21:42:21.0917626Z 539 │ showcaseReviewKey === null || 2026-10-23T21:42:21.0917741Z 540 │ showcasedReviewDrawRef.current === showcaseReviewKey || 2026-10-23T21:42:21.0917844Z 541 │ !isNativeReviewDiffDrawEvent(event.nativeEvent) 2026-10-23T21:42:21.0917904Z 542 │ ) { 2026-10-23T21:42:21.0917969Z 543 │ return; 2026-10-23T21:42:21.0918023Z 544 │ } 2026-10-23T21:42:21.0918131Z 545 │ showcasedReviewDrawRef.current = showcaseReviewKey; 2026-10-23T21:42:21.0918288Z 546 │ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId }); 2026-10-23T21:42:21.0918340Z 547 │ }; 2026-10-23T21:42:21.0918392Z 548 │ 2026-10-23T21:42:21.0918503Z 549 │ const handleSelectFile = async (fileId: string | null) => { 2026-10-23T21:42:21.0918581Z 550 │ loadVisibleFile(fileId, true); 2026-10-23T21:42:21.0918671Z 551 │ commentSelection.clearSelection(); 2026-10-23T21:42:21.0918789Z 552 │ if (fileId !== null && collapsedFileIds.includes(fileId)) { 2026-10-23T21:42:21.0918864Z 553 │ toggleExpandedFile(fileId); 2026-10-23T21:42:21.0918917Z 554 │ } 2026-10-23T21:42:21.0919024Z 555 │ const nativeView = nativeReviewDiffViewRef.current; 2026-10-23T21:42:21.0919096Z 556 │ if (!nativeView) return; 2026-10-23T21:42:21.0919184Z 557 │ const result = await settlePromise(() => 2026-10-23T21:42:21.0919350Z 558 │ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true), 2026-10-23T21:42:21.0919403Z 559 │ ); 2026-10-23T21:42:21.0919490Z 560 │ if (AsyncResult.isFailure(result)) { 2026-10-23T21:42:21.0919662Z 561 │ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result)); 2026-10-23T21:42:21.0919716Z 562 │ } 2026-10-23T21:42:21.0919826Z 563 │ }; 2026-10-23T21:42:21.0919934Z 564 │ const handleVisibleFileChange = ( 2026-10-23T21:42:21.0920058Z 565 │ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>, 2026-10-23T21:42:21.0920115Z 566 │ ) => { 2026-10-23T21:42:21.0920220Z 567 │ loadVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-23T21:42:21.0920381Z 568 │ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-23T21:42:21.0920431Z 569 │ }; 2026-10-23T21:42:21.0920508Z 570 │ const renderInspector = () => ( 2026-10-23T21:42:21.0920575Z 571 │ void handleSelectFile(fileId)} 2026-10-23T21:42:21.0921069Z 577 │ /> 2026-10-23T21:42:21.0921121Z 578 │ ); 2026-10-23T21:42:21.0921172Z 579 │ 2026-10-23T21:42:21.0921347Z 580 │ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => { 2026-10-23T21:42:21.0921431Z 581 │ const { fileId } = event.nativeEvent; 2026-10-23T21:42:21.0921491Z 582 │ if (fileId) { 2026-10-23T21:42:21.0921570Z 583 │ loadVisibleFile(fileId, true); 2026-10-23T21:42:21.0921644Z 584 │ toggleExpandedFile(fileId); 2026-10-23T21:42:21.0921697Z 585 │ } 2026-10-23T21:42:21.0921749Z 586 │ }; 2026-10-23T21:42:21.0921805Z 587 │ 2026-10-23T21:42:21.0921892Z 588 │ const handleNativeToggleViewedFile = ( 2026-10-23T21:42:21.0922009Z 589 │ event: NativeSyntheticEvent<{ readonly fileId?: string }>, 2026-10-23T21:42:21.0922066Z 590 │ ) => { 2026-10-23T21:42:21.0922149Z 591 │ const { fileId } = event.nativeEvent; 2026-10-23T21:42:21.0922208Z 592 │ if (fileId) { 2026-10-23T21:42:21.0922282Z 593 │ toggleViewedFile(fileId); 2026-10-23T21:42:21.0922333Z 594 │ } 2026-10-23T21:42:21.0922383Z 595 │ }; 2026-10-23T21:42:21.0922432Z 596 │ 2026-10-23T21:42:21.0922501Z 597 │ const parsedDiffNotice = 2026-10-23T21:42:21.0922655Z 598 │ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null; 2026-10-23T21:42:21.0922768Z 599 │ const hasCachedSelectedDiff = selectedSection?.diff != null; 2026-10-23T21:42:21.0922917Z 600 │ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null); 2026-10-23T21:42:21.0923031Z 601 │ const sectionMenu = buildReviewSectionMenu(reviewSections); 2026-10-23T21:42:21.0923189Z 602 │ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({ 2026-10-23T21:42:21.0923324Z 603 │ hasEnvironmentPresentation: environment.isReady, 2026-10-23T21:42:21.0923424Z 604 │ isEnvironmentConnected: isEnvironmentReady, 2026-10-23T21:42:21.0923493Z 605 │ hasCachedSelectedDiff, 2026-10-23T21:42:21.0923556Z 606 │ hasAnyCachedDiff, 2026-10-23T21:42:21.0923606Z 607 │ }); 2026-10-23T21:42:21.0923689Z 608 │ const handleRetryEnvironment = () => { 2026-10-23T21:42:21.0923771Z 609 │ void retryEnvironment(environmentId); 2026-10-23T21:42:21.0923822Z 610 │ }; 2026-10-23T21:42:21.0923902Z 611 │ const handleReturnToThread = () => { 2026-10-23T21:42:21.0923976Z 612 │ if (navigation.canGoBack()) { 2026-10-23T21:42:21.0924044Z 613 │ navigation.goBack(); 2026-10-23T21:42:21.0924101Z 614 │ return; 2026-10-23T21:42:21.0924151Z 615 │ } 2026-10-23T21:42:21.0924281Z 616 │ navigation.navigate("Thread", { 2026-10-23T21:42:21.0924395Z 617 │ environmentId: String(environmentId), 2026-10-23T21:42:21.0924468Z 618 │ threadId: String(threadId), 2026-10-23T21:42:21.0924521Z 619 │ }); 2026-10-23T21:42:21.0924573Z 620 │ }; 2026-10-23T21:42:21.0924649Z 621 │ const androidHeaderSubtitle = [ 2026-10-23T21:42:21.0924716Z 622 │ selectedSection?.title, 2026-10-23T21:42:21.0924850Z 623 │ headerDiffSummary.additions, 2026-10-23T21:42:21.0924927Z 624 │ headerDiffSummary.deletions, 2026-10-23T21:42:21.0924978Z 625 │ ] 2026-10-23T21:42:21.0925079Z 626 │ .filter((part): part is string => Boolean(part)) 2026-10-23T21:42:21.0925142Z 627 │ .join(" · "); 2026-10-23T21:42:21.0925192Z 628 │ 2026-10-23T21:42:21.0925267Z 629 │ const showChangedFilesPane = 2026-10-23T21:42:21.0925344Z 630 │ !showConnectionNotice && 2026-10-23T21:42:21.0925418Z 631 │ selectedSection !== null && 2026-10-23T21:42:21.0925497Z 632 │ parsedDiff.kind === "files" && 2026-10-23T21:42:21.0925574Z 633 │ NativeReviewDiffView !== null; 2026-10-23T21:42:21.0925733Z 634 │ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined); 2026-10-23T21:42:21.0925901Z 635 │ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane; 2026-10-23T21:42:21.0925952Z 636 │ 2026-10-23T21:42:21.0926024Z 637 │ const listHeader = (() => { 2026-10-23T21:42:21.0926106Z 638 │ const children: ReactElement[] = []; 2026-10-23T21:42:21.0926159Z 639 │ 2026-10-23T21:42:21.0926219Z 640 │ if (error) { 2026-10-23T21:42:21.0926282Z 641 │ children.push( 2026-10-23T21:42:21.0926342Z 642 │ 2026-10-23T21:42:21.0926983Z 649 │ Review unavailable 2026-10-23T21:42:21.0927132Z 650 │ {error} 2026-10-23T21:42:21.0927192Z 651 │ , 2026-10-23T21:42:21.0927246Z 652 │ ); 2026-10-23T21:42:21.0927295Z 653 │ } 2026-10-23T21:42:21.0927346Z 654 │ 2026-10-23T21:42:21.0927417Z 655 │ if (parsedDiffNotice) { 2026-10-23T21:42:21.0927576Z 656 │ children.push(); 2026-10-23T21:42:21.0927629Z 657 │ } 2026-10-23T21:42:21.0927680Z 658 │ 2026-10-23T21:42:21.0927754Z 659 │ if (children.length === 0) { 2026-10-23T21:42:21.0927814Z 660 │ return null; 2026-10-23T21:42:21.0927864Z 661 │ } 2026-10-23T21:42:21.0927914Z 662 │ 2026-10-23T21:42:21.0927980Z 663 │ return <>{children}; 2026-10-23T21:42:21.0928032Z 664 │ })(); 2026-10-23T21:42:21.0928100Z 665 │ const headerSubtitle = [ 2026-10-23T21:42:21.0928177Z 666 │ headerDiffSummary.additions, 2026-10-23T21:42:21.0928254Z 667 │ headerDiffSummary.deletions, 2026-10-23T21:42:21.0928332Z 668 │ pendingReviewCommentCount > 0 2026-10-23T21:42:21.0928497Z 669 │ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}` 2026-10-23T21:42:21.0928556Z 670 │ : null, 2026-10-23T21:42:21.0928688Z 671 │ ] 2026-10-23T21:42:21.0928790Z 672 │ .filter(Boolean) 2026-10-23T21:42:21.0928853Z 673 │ .join(" · "); 2026-10-23T21:42:21.0929025Z 674 │ const headerTitleText = selectedSection?.title ?? "Review changes"; 2026-10-23T21:42:21.0929078Z 675 │ 2026-10-23T21:42:21.0929134Z 676 │ return ( 2026-10-23T21:42:21.0929187Z 677 │ <> 2026-10-23T21:42:21.0929250Z 678 │ 2026-10-23T21:42:21.0930523Z 694 │ 2026-10-23T21:42:21.0930585Z 695 │ 2026-10-23T21:42:21.0930702Z 696 │ 2026-10-23T21:42:21.0930779Z 697 │ {showConnectionNotice ? ( 2026-10-23T21:42:21.0930918Z 698 │ 2026-10-23T21:42:21.0931006Z 699 │ 2026-10-23T21:42:21.0931978Z 711 │ 2026-10-23T21:42:21.0932129Z 712 │ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? ( 2026-10-23T21:42:21.0932187Z 713 │ 2026-10-23T21:42:21.0932606Z 719 │ 2026-10-23T21:42:21.0933031Z 723 │ {listHeader} 2026-10-23T21:42:21.0933148Z 724 │ 2026-10-23T21:42:21.0933262Z 725 │ ({ thread, now: Date.now() })); 2026-10-23T21:42:21.0934884Z 697 │ if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() }); 2026-10-23T21:42:21.0935019Z ·  ─────┬──── 2026-10-23T21:42:21.0935199Z · ╰── Cannot call impure function 2026-10-23T21:42:21.0935336Z 698 │ const snoozeGateNow = new Date(snoozeGateClock.now).toISOString(); 2026-10-23T21:42:21.0935387Z ╰──── 2026-10-23T21:42:21.0935665Z  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-23T21:42:21.0935945Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T21:42:21.0935948Z 2026-10-23T21:42:21.0936110Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T21:42:21.0936261Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:718:71] 2026-10-23T21:42:21.0936337Z 717 │ const snoozePresets = useMemo( 2026-10-23T21:42:21.0936507Z 718 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-23T21:42:21.0936697Z ·  ─────┬──── 2026-10-23T21:42:21.0936902Z · ╰── Cannot call impure function 2026-10-23T21:42:21.0937012Z 719 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-23T21:42:21.0937062Z ╰──── 2026-10-23T21:42:21.0937325Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T21:42:21.0937602Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T21:42:21.0937604Z 2026-10-23T21:42:21.0937781Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T21:42:21.0937935Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:719:6] 2026-10-23T21:42:21.0938102Z 718 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-23T21:42:21.0938212Z 719 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-23T21:42:21.0938303Z ·  ────────────┬─────────── 2026-10-23T21:42:21.0938478Z · ╰── Unnecessary dependency `props.snoozePresetMinute` 2026-10-23T21:42:21.0938531Z 720 │ ); 2026-10-23T21:42:21.0938581Z ╰──── 2026-10-23T21:42:21.0938880Z  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-23T21:42:21.0939180Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.0939185Z 2026-10-23T21:42:21.0939360Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T21:42:21.0939512Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:765:7] 2026-10-23T21:42:21.0939578Z 764 │ thread.pinnedAt, 2026-10-23T21:42:21.0939636Z 765 │ variant, 2026-10-23T21:42:21.0939709Z ·  ───┬─── 2026-10-23T21:42:21.0939842Z · ╰── Unnecessary dependency `variant` 2026-10-23T21:42:21.0939896Z 766 │ ], 2026-10-23T21:42:21.0939944Z ╰──── 2026-10-23T21:42:21.0940248Z  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-23T21:42:21.0940546Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.0940549Z 2026-10-23T21:42:21.0940736Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T21:42:21.0940892Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1215:21] 2026-10-23T21:42:21.0941016Z 1214 │ {providerDrivers.slice(0, -1).map((driver, index) => ( 2026-10-23T21:42:21.0941146Z 1215 │ 2026-10-23T21:42:21.0941263Z ·  ────────────────────────── 2026-10-23T21:42:21.0941367Z 1216 │ 2026-10-23T21:42:21.0941465Z ╰──── 2026-10-23T21:42:21.0941634Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-23T21:42:21.0941637Z 2026-10-23T21:42:21.0941824Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T21:42:21.0941972Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:223:31] 2026-10-23T21:42:21.0942075Z 222 │ ? snippetTokens.map((line, lineIndex) => ( 2026-10-23T21:42:21.0942167Z 223 │ 2026-10-23T21:42:21.0942274Z ·  ─────────────── 2026-10-23T21:42:21.0942366Z 224 │ {lineIndex > 0 ? "\n" : ""} 2026-10-23T21:42:21.0942415Z ╰──── 2026-10-23T21:42:21.0942555Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-23T21:42:21.0942558Z 2026-10-23T21:42:21.0942747Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T21:42:21.0942893Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25] 2026-10-23T21:42:21.0942966Z 226 │ { 2026-10-23T21:42:21.0945558Z ·  ────┬──── 2026-10-23T21:42:21.0945685Z · ╰── This is the containing effect 2026-10-23T21:42:21.0945785Z 102 │ if (!target || selectedLines.length === 0) { 2026-10-23T21:42:21.0945867Z 103 │ setHighlightedLinesById({}); 2026-10-23T21:42:21.0945959Z ·  ───────────┬─────────── 2026-10-23T21:42:21.0946178Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.0946277Z 104 │ return; 2026-10-23T21:42:21.0946325Z ╰──── 2026-10-23T21:42:21.0946901Z  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-23T21:42:21.0947207Z  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-23T21:42:21.0947209Z 2026-10-23T21:42:21.0947455Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T21:42:21.0947639Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:107:5] 2026-10-23T21:42:21.0947693Z 104 │ 2026-10-23T21:42:21.0947755Z 105 │ useEffect(() => { 2026-10-23T21:42:21.0947825Z ·  ────┬──── 2026-10-23T21:42:21.0947952Z · ╰── This is the containing effect 2026-10-23T21:42:21.0948030Z 106 │ clearReviewCommentTarget(); 2026-10-23T21:42:21.0948123Z 107 │ setPendingNativeCommentSelection(null); 2026-10-23T21:42:21.0948230Z ·  ────────────────┬─────────────── 2026-10-23T21:42:21.0948404Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.0948475Z 108 │ }, [selectedSection?.id]); 2026-10-23T21:42:21.0948525Z ╰──── 2026-10-23T21:42:21.0949103Z  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-23T21:42:21.0949413Z  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-23T21:42:21.0949416Z 2026-10-23T21:42:21.0949667Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T21:42:21.0949847Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7] 2026-10-23T21:42:21.0949898Z 109 │ 2026-10-23T21:42:21.0949965Z 110 │ useEffect(() => { 2026-10-23T21:42:21.0950037Z ·  ────┬──── 2026-10-23T21:42:21.0950168Z · ╰── This is the containing effect 2026-10-23T21:42:21.0950252Z 111 │ if (activeCommentTarget === null) { 2026-10-23T21:42:21.0950347Z 112 │ setPendingNativeCommentSelection(null); 2026-10-23T21:42:21.0950458Z ·  ────────────────┬─────────────── 2026-10-23T21:42:21.0950636Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.0950690Z 113 │ } 2026-10-23T21:42:21.0950738Z ╰──── 2026-10-23T21:42:21.0951351Z  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-23T21:42:21.0951685Z  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-23T21:42:21.0951687Z 2026-10-23T21:42:21.0951883Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T21:42:21.0952062Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7] 2026-10-23T21:42:21.0952157Z 107 │ setPendingNativeCommentSelection(null); 2026-10-23T21:42:21.0952228Z 108 │ }, [selectedSection?.id]); 2026-10-23T21:42:21.0952312Z ·  ─────────┬───────── 2026-10-23T21:42:21.0952472Z · ╰── Unnecessary dependency `selectedSection?.id` 2026-10-23T21:42:21.0952522Z 109 │ 2026-10-23T21:42:21.0952578Z ╰──── 2026-10-23T21:42:21.0952859Z  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-23T21:42:21.0953152Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.0953154Z 2026-10-23T21:42:21.0953438Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T21:42:21.0953605Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:60:5] 2026-10-23T21:42:21.0953657Z 55 │ 2026-10-23T21:42:21.0953722Z 56 │ useEffect(() => { 2026-10-23T21:42:21.0953793Z ·  ────┬──── 2026-10-23T21:42:21.0953925Z · ╰── This is the containing effect 2026-10-23T21:42:21.0953992Z 57 │ scheduler.reset(); 2026-10-23T21:42:21.0954088Z 58 │ highlightedRowIdsRef.current = new Set(); 2026-10-23T21:42:21.0954174Z 59 │ visibleChunkIndexRef.current = 0; 2026-10-23T21:42:21.0954286Z 60 │ setVisibleRange({ firstRowIndex: 0, lastRowIndex: 80 }); 2026-10-23T21:42:21.0954365Z ·  ───────┬─────── 2026-10-23T21:42:21.0954532Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.0954641Z 61 │ setTokensPatchJson(createEmptyTokenPatch(resetKey)); 2026-10-23T21:42:21.0954689Z ╰──── 2026-10-23T21:42:21.0955307Z  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-23T21:42:21.0955640Z  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-23T21:42:21.0955643Z 2026-10-23T21:42:21.0955837Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T21:42:21.0956007Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:63:7] 2026-10-23T21:42:21.0956084Z 62 │ return () => scheduler.cancel(); 2026-10-23T21:42:21.0956184Z 63 │ }, [enabled, resetKey, rows.length, scheduler]); 2026-10-23T21:42:21.0956312Z ·  ───┬─── ─────┬───── 2026-10-23T21:42:21.0956509Z · │ ╰── Unnecessary dependency `rows.length` 2026-10-23T21:42:21.0956646Z · ╰── Unnecessary dependency `enabled` 2026-10-23T21:42:21.0956699Z 64 │ 2026-10-23T21:42:21.0956753Z ╰──── 2026-10-23T21:42:21.0957032Z  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-23T21:42:21.0957329Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.0957332Z 2026-10-23T21:42:21.0957787Z ⚠ 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-23T21:42:21.0957922Z ╭─[apps/server/src/project/ProjectService.test.ts:94:3] 2026-10-23T21:42:21.0957977Z 93 │ ) { 2026-10-23T21:42:21.0958175Z 94 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T21:42:21.0958343Z 95 │ │ const project = Option.getOrThrow(yield* service.getById(projectId)); 2026-10-23T21:42:21.0958462Z 96 │ │ if (predicate(project)) return project; 2026-10-23T21:42:21.0958562Z 97 │ │ yield* Effect.yieldNow; 2026-10-23T21:42:21.0958687Z 98 │ ╰─▶ } 2026-10-23T21:42:21.0958830Z 99 │ return yield* Effect.die(`Project ${projectId} was not enriched in time.`); 2026-10-23T21:42:21.0958887Z ╰──── 2026-10-23T21:42:21.0958893Z 2026-10-23T21:42:21.0959101Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T21:42:21.0959240Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:772:7] 2026-10-23T21:42:21.0959337Z 771 │ if (settingsSheetPresentation.isActive) { 2026-10-23T21:42:21.0959461Z 772 │ settingsRoutePresentation.present(settingsRouteSession); 2026-10-23T21:42:21.0959555Z ·  ────────────┬──────────── 2026-10-23T21:42:21.0959726Z · ╰── Missing dependency `settingsRoutePresentation` 2026-10-23T21:42:21.0959778Z 773 │ } 2026-10-23T21:42:21.0959972Z 774 │ }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]); 2026-10-23T21:42:21.0960131Z ·  ────────────────┬──────────────── 2026-10-23T21:42:21.0960426Z · ╰── Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead 2026-10-23T21:42:21.0960476Z 775 │ 2026-10-23T21:42:21.0960525Z ╰──── 2026-10-23T21:42:21.0960925Z  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-23T21:42:21.0961221Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.0961224Z 2026-10-23T21:42:21.0961376Z ⚠ react(immutability): This value cannot be modified 2026-10-23T21:42:21.0961518Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:390:5] 2026-10-23T21:42:21.0961678Z 386 │ typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0; 2026-10-23T21:42:21.0961810Z 387 │ const animatedBorderRadius = useSharedValue(targetBorderRadius); 2026-10-23T21:42:21.0961900Z ·  ──────────┬───────── 2026-10-23T21:42:21.0962052Z · ╰── `animatedBorderRadius` originates here 2026-10-23T21:42:21.0962205Z 388 │ const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android"; 2026-10-23T21:42:21.0962277Z 389 │ useLayoutEffect(() => { 2026-10-23T21:42:21.0962377Z 390 │ animatedBorderRadius.value = shouldAnimate 2026-10-23T21:42:21.0962462Z ·  ──────────┬───────── 2026-10-23T21:42:21.0962625Z · ╰── `animatedBorderRadius` cannot be modified 2026-10-23T21:42:21.0962715Z 391 │ ? withTiming(targetBorderRadius, { 2026-10-23T21:42:21.0962768Z ╰──── 2026-10-23T21:42:21.0963019Z  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-23T21:42:21.0963347Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T21:42:21.0963350Z 2026-10-23T21:42:21.0963675Z ⚠ 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-23T21:42:21.0963818Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:50:18] 2026-10-23T21:42:21.0963979Z 49 │ for (const tool of ["sendMessage", "followupTask", "interruptAgent", "listAgents"]) { 2026-10-23T21:42:21.0964141Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-23T21:42:21.0964227Z ·  ───────── 2026-10-23T21:42:21.0964404Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-23T21:42:21.0964454Z ╰──── 2026-10-23T21:42:21.0964457Z 2026-10-23T21:42:21.0964817Z ⚠ 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-23T21:42:21.0964958Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:51:18] 2026-10-23T21:42:21.0965119Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-23T21:42:21.0965356Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-23T21:42:21.0965478Z ·  ───────── 2026-10-23T21:42:21.0965529Z 52 │ } 2026-10-23T21:42:21.0965581Z ╰──── 2026-10-23T21:42:21.0965583Z 2026-10-23T21:42:21.0965901Z ⚠ 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-23T21:42:21.0966038Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:55:5] 2026-10-23T21:42:21.0966099Z 54 │ assert.equal( 2026-10-23T21:42:21.0966265Z 55 │ Schema.is(CodexSchema.ServerNotification__CollabAgentToolCallStatus)("interrupted"), 2026-10-23T21:42:21.0966336Z ·  ───────── 2026-10-23T21:42:21.0966394Z 56 │ true, 2026-10-23T21:42:21.0966443Z ╰──── 2026-10-23T21:42:21.0966451Z 2026-10-23T21:42:21.0966776Z ⚠ 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-23T21:42:21.0966914Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:59:5] 2026-10-23T21:42:21.0966974Z 58 │ assert.equal( 2026-10-23T21:42:21.0967146Z 59 │ Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentToolCallStatus)("interrupted"), 2026-10-23T21:42:21.0967217Z ·  ───────── 2026-10-23T21:42:21.0967275Z 60 │ true, 2026-10-23T21:42:21.0967326Z ╰──── 2026-10-23T21:42:21.0967328Z 2026-10-23T21:42:21.0967644Z ⚠ 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-23T21:42:21.0967792Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:103:16] 2026-10-23T21:42:21.0967846Z 102 │ 2026-10-23T21:42:21.0968007Z 103 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse)(resumeResponse), true); 2026-10-23T21:42:21.0968089Z ·  ───────── 2026-10-23T21:42:21.0968142Z 104 │ }); 2026-10-23T21:42:21.0968192Z ╰──── 2026-10-23T21:42:21.0968194Z 2026-10-23T21:42:21.0968444Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T21:42:21.0968594Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:361:7] 2026-10-23T21:42:21.0968724Z 355 │ }, [cancelledIncomingShareId, navigation, props.incomingShareId]); 2026-10-23T21:42:21.0968791Z 356 │ useEffect(() => { 2026-10-23T21:42:21.0968859Z ·  ────┬──── 2026-10-23T21:42:21.0968993Z · ╰── This is the containing effect 2026-10-23T21:42:21.0969081Z 357 │ if (!isReturningToProjectPicker) { 2026-10-23T21:42:21.0969142Z 358 │ return; 2026-10-23T21:42:21.0969195Z 359 │ } 2026-10-23T21:42:21.0969288Z 360 │ if (requestedInitialProjectAvailable) { 2026-10-23T21:42:21.0969381Z 361 │ setIsReturningToProjectPicker(false); 2026-10-23T21:42:21.0969488Z ·  ──────────────┬────────────── 2026-10-23T21:42:21.0969662Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.0969720Z 362 │ return; 2026-10-23T21:42:21.0969772Z ╰──── 2026-10-23T21:42:21.0970402Z  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-23T21:42:21.0970748Z  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-23T21:42:21.0970750Z 2026-10-23T21:42:21.0970998Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T21:42:21.0971144Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:504:9] 2026-10-23T21:42:21.0971200Z 447 │ 2026-10-23T21:42:21.0971266Z 448 │ useEffect(() => { 2026-10-23T21:42:21.0971338Z ·  ────┬──── 2026-10-23T21:42:21.0971468Z · ╰── This is the containing effect 2026-10-23T21:42:21.0971570Z 449 │ if (props.pendingTaskId || props.draftId) { 2026-10-23T21:42:21.0971627Z 450 │ return; 2026-10-23T21:42:21.0971680Z 451 │ } 2026-10-23T21:42:21.0971813Z 452 │ if (lastInitialProjectRefRef.current !== props.initialProjectRef) { 2026-10-23T21:42:21.0971945Z 453 │ lastInitialProjectRefRef.current = props.initialProjectRef; 2026-10-23T21:42:21.0972047Z 454 │ appliedInitialProjectKeyRef.current = null; 2026-10-23T21:42:21.0972099Z 455 │ } 2026-10-23T21:42:21.0972231Z 456 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-23T21:42:21.0972356Z 457 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-23T21:42:21.0972457Z 458 │ if (initialEnvironmentId && initialProjectId) { 2026-10-23T21:42:21.0972526Z 459 │ const directProject = 2026-10-23T21:42:21.0972597Z 460 │ projects.find( 2026-10-23T21:42:21.0972664Z 461 │ (project) => 2026-10-23T21:42:21.0972831Z 462 │ project.environmentId === initialEnvironmentId && project.id === initialProjectId, 2026-10-23T21:42:21.0972891Z 463 │ ) ?? null; 2026-10-23T21:42:21.0972940Z 464 │ 2026-10-23T21:42:21.0973007Z 465 │ if (directProject) { 2026-10-23T21:42:21.0973140Z 466 │ // Apply the route's project once. Re-applying on every change would 2026-10-23T21:42:21.0973286Z 467 │ // instantly revert environment/project switches made in the picker. 2026-10-23T21:42:21.0973472Z 468 │ const directProjectKey = `${directProject.environmentId}:${directProject.id}`; 2026-10-23T21:42:21.0973604Z 469 │ if (appliedInitialProjectKeyRef.current === directProjectKey) { 2026-10-23T21:42:21.0973664Z 470 │ return; 2026-10-23T21:42:21.0973726Z 471 │ } 2026-10-23T21:42:21.0973822Z 472 │ if (props.initialProjectRef?.branch) { 2026-10-23T21:42:21.0973883Z 473 │ if ( 2026-10-23T21:42:21.0974020Z 474 │ selectedProject?.environmentId !== directProject.environmentId || 2026-10-23T21:42:21.0974119Z 475 │ selectedProject.id !== directProject.id 2026-10-23T21:42:21.0974174Z 476 │ ) { 2026-10-23T21:42:21.0974261Z 477 │ setProject(directProject); 2026-10-23T21:42:21.0974323Z 478 │ return; 2026-10-23T21:42:21.0974380Z 479 │ } 2026-10-23T21:42:21.0974460Z 480 │ if (!flow.draftKey) return; 2026-10-23T21:42:21.0974596Z 481 │ // The route completes checkout before mounting this composer. Local 2026-10-23T21:42:21.0974735Z 482 │ // mode reuses an existing worktree; worktree mode would create another. 2026-10-23T21:42:21.0974889Z 483 │ updateComposerDraftSettings(flow.draftKey, { 2026-10-23T21:42:21.0974997Z 484 │ workspaceSelection: { 2026-10-23T21:42:21.0975065Z 485 │ mode: "local", 2026-10-23T21:42:21.0975166Z 486 │ branch: props.initialProjectRef.branch, 2026-10-23T21:42:21.0975295Z 487 │ worktreePath: props.initialProjectRef.worktreePath ?? null, 2026-10-23T21:42:21.0975377Z 488 │ startFromOrigin: false, 2026-10-23T21:42:21.0975435Z 489 │ }, 2026-10-23T21:42:21.0975493Z 490 │ }); 2026-10-23T21:42:21.0975547Z 491 │ } 2026-10-23T21:42:21.0975671Z 492 │ appliedInitialProjectKeyRef.current = directProjectKey; 2026-10-23T21:42:21.0975730Z 493 │ if ( 2026-10-23T21:42:21.0975866Z 494 │ selectedProject?.environmentId === directProject.environmentId && 2026-10-23T21:42:21.0975964Z 495 │ selectedProject.id === directProject.id 2026-10-23T21:42:21.0976024Z 496 │ ) { 2026-10-23T21:42:21.0976086Z 497 │ return; 2026-10-23T21:42:21.0976143Z 498 │ } 2026-10-23T21:42:21.0976219Z 499 │ setProject(directProject); 2026-10-23T21:42:21.0976280Z 500 │ return; 2026-10-23T21:42:21.0976335Z 501 │ } 2026-10-23T21:42:21.0976387Z 502 │ 2026-10-23T21:42:21.0976463Z 503 │ if (projects.length > 0) { 2026-10-23T21:42:21.0976559Z 504 │ setIsReturningToProjectPicker(true); 2026-10-23T21:42:21.0976670Z ·  ──────────────┬────────────── 2026-10-23T21:42:21.0976845Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.0976897Z 505 │ } 2026-10-23T21:42:21.0976949Z ╰──── 2026-10-23T21:42:21.0977529Z  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-23T21:42:21.0977839Z  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-23T21:42:21.0977842Z 2026-10-23T21:42:21.0978091Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T21:42:21.0978240Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:604:5] 2026-10-23T21:42:21.0978290Z 545 │ 2026-10-23T21:42:21.0978352Z 546 │ useEffect(() => { 2026-10-23T21:42:21.0978428Z ·  ────┬──── 2026-10-23T21:42:21.0978557Z · ╰── This is the containing effect 2026-10-23T21:42:21.0978650Z 547 │ const shareId = props.incomingShareId; 2026-10-23T21:42:21.0978730Z 548 │ const draftKey = flow.draftKey; 2026-10-23T21:42:21.0978825Z 549 │ const destinationProject = selectedProject; 2026-10-23T21:42:21.0978960Z 550 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-23T21:42:21.0979084Z 551 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-23T21:42:21.0979171Z 552 │ const selectedProjectMatchesRoute = 2026-10-23T21:42:21.0979248Z 553 │ !initialEnvironmentId || 2026-10-23T21:42:21.0979316Z 554 │ !initialProjectId || 2026-10-23T21:42:21.0979443Z 555 │ (destinationProject?.environmentId === initialEnvironmentId && 2026-10-23T21:42:21.0979593Z 556 │ destinationProject.id === initialProjectId); 2026-10-23T21:42:21.0979674Z 557 │ if ( 2026-10-23T21:42:21.0979737Z 558 │ !shareId || 2026-10-23T21:42:21.0979800Z 559 │ !draftKey || 2026-10-23T21:42:21.0979871Z 560 │ !destinationProject || 2026-10-23T21:42:21.0979954Z 561 │ !selectedProjectMatchesRoute || 2026-10-23T21:42:21.0980045Z 562 │ cancelledIncomingShareId === shareId 2026-10-23T21:42:21.0980101Z 563 │ ) { 2026-10-23T21:42:21.0980160Z 564 │ return; 2026-10-23T21:42:21.0980210Z 565 │ } 2026-10-23T21:42:21.0980305Z 566 │ const importKey = `${shareId}:${draftKey}`; 2026-10-23T21:42:21.0980360Z 567 │ if ( 2026-10-23T21:42:21.0980467Z 568 │ startedShareImportKeyRef.current === importKey || 2026-10-23T21:42:21.0980571Z 569 │ cancellingShareImportKeyRef.current === importKey 2026-10-23T21:42:21.0980627Z 570 │ ) { 2026-10-23T21:42:21.0980689Z 571 │ return; 2026-10-23T21:42:21.0980745Z 572 │ } 2026-10-23T21:42:21.0980794Z 573 │ 2026-10-23T21:42:21.0980862Z 574 │ if (!incomingShare) { 2026-10-23T21:42:21.0981052Z 575 │ if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) { 2026-10-23T21:42:21.0981173Z 576 │ alertedUnavailableIncomingShareIdRef.current = shareId; 2026-10-23T21:42:21.0981238Z 577 │ Dialog.alert( 2026-10-23T21:42:21.0981321Z 578 │ "Shared content unavailable", 2026-10-23T21:42:21.0981487Z 579 │ "The shared content is no longer in the inbox. You can continue editing this task draft.", 2026-10-23T21:42:21.0981543Z 580 │ ); 2026-10-23T21:42:21.0981596Z 581 │ } 2026-10-23T21:42:21.0981651Z 582 │ return; 2026-10-23T21:42:21.0981703Z 583 │ } 2026-10-23T21:42:21.0981753Z 584 │ 2026-10-23T21:42:21.0981814Z 585 │ if ( 2026-10-23T21:42:21.0981970Z 586 │ incomingShare.attachments.some((attachment) => attachment.type === "file") && 2026-10-23T21:42:21.0982068Z 587 │ selectedEnvironmentServerConfig === null 2026-10-23T21:42:21.0982119Z 588 │ ) { 2026-10-23T21:42:21.0982177Z 589 │ return; 2026-10-23T21:42:21.0982230Z 590 │ } 2026-10-23T21:42:21.0982279Z 591 │ 2026-10-23T21:42:21.0982410Z 592 │ if (alertedUnavailableIncomingShareIdRef.current === shareId) { 2026-10-23T21:42:21.0982528Z 593 │ alertedUnavailableIncomingShareIdRef.current = null; 2026-10-23T21:42:21.0982581Z 594 │ } 2026-10-23T21:42:21.0982682Z 595 │ startedShareImportKeyRef.current = importKey; 2026-10-23T21:42:21.0982749Z 596 │ const draftBackup = 2026-10-23T21:42:21.0982975Z 597 │ shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey); 2026-10-23T21:42:21.0983136Z 598 │ shareImportDraftBackupRef.current.set(importKey, draftBackup); 2026-10-23T21:42:21.0983232Z 599 │ const importToken = Symbol(importKey); 2026-10-23T21:42:21.0983334Z 600 │ let didReserveShare = false; 2026-10-23T21:42:21.0983413Z 601 │ let didConsumeShare = false; 2026-10-23T21:42:21.0983492Z 602 │ let needsDraftRestore = false; 2026-10-23T21:42:21.0983597Z 603 │ activeShareImportTokenRef.current = importToken; 2026-10-23T21:42:21.0983678Z 604 │ setImportingShareKey(importKey); 2026-10-23T21:42:21.0983765Z ·  ──────────┬───────── 2026-10-23T21:42:21.0983937Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.0983999Z 605 │ void (async () => { 2026-10-23T21:42:21.0984051Z ╰──── 2026-10-23T21:42:21.0984633Z  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-23T21:42:21.0984945Z  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-23T21:42:21.0984947Z 2026-10-23T21:42:21.0985145Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T21:42:21.0985292Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:524:5] 2026-10-23T21:42:21.0985371Z 523 │ props.initialProjectRef, 2026-10-23T21:42:21.0985443Z 524 │ props.incomingShareId, 2026-10-23T21:42:21.0985535Z ·  ──────────┬────────── 2026-10-23T21:42:21.0985700Z · ╰── Unnecessary dependency `props.incomingShareId` 2026-10-23T21:42:21.0985770Z 525 │ props.pendingTaskId, 2026-10-23T21:42:21.0985821Z ╰──── 2026-10-23T21:42:21.0986101Z  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-23T21:42:21.0986399Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.0986401Z 2026-10-23T21:42:21.0986606Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T21:42:21.0986760Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:543:5] 2026-10-23T21:42:21.0986873Z 542 │ loadedBranchesProjectKeyRef.current = projectKey; 2026-10-23T21:42:21.0986940Z 543 │ flow.loadBranches(); 2026-10-23T21:42:21.0987005Z ·  ──┬─ 2026-10-23T21:42:21.0987130Z · ╰── Missing dependency `flow` 2026-10-23T21:42:21.0987219Z 544 │ }, [flow.loadBranches, selectedProject]); 2026-10-23T21:42:21.0987303Z ·  ────────┬──────── 2026-10-23T21:42:21.0987496Z · ╰── Overly precise dependency `flow.loadBranches`, use `flow` instead 2026-10-23T21:42:21.0987552Z 545 │ 2026-10-23T21:42:21.0987604Z ╰──── 2026-10-23T21:42:21.0988064Z  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-23T21:42:21.0988387Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.0988393Z 2026-10-23T21:42:21.0988589Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T21:42:21.0988742Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:766:5] 2026-10-23T21:42:21.0988809Z 765 │ flow.draftKey, 2026-10-23T21:42:21.0988887Z 766 │ hasImportedIncomingShare, 2026-10-23T21:42:21.0988979Z ·  ────────────┬─────────── 2026-10-23T21:42:21.0989152Z · ╰── Unnecessary dependency `hasImportedIncomingShare` 2026-10-23T21:42:21.0989222Z 767 │ incomingShare, 2026-10-23T21:42:21.0989312Z 768 │ isIncomingShareInboxLoading, 2026-10-23T21:42:21.0989412Z ·  ─────────────┬───────────── 2026-10-23T21:42:21.0989593Z · ╰── Unnecessary dependency `isIncomingShareInboxLoading` 2026-10-23T21:42:21.0989676Z 769 │ isIncomingShareUnavailable, 2026-10-23T21:42:21.0989750Z 770 │ props.incomingShareId, 2026-10-23T21:42:21.0989840Z 771 │ props.initialProjectRef?.environmentId, 2026-10-23T21:42:21.0989931Z 772 │ props.initialProjectRef?.projectId, 2026-10-23T21:42:21.0990006Z 773 │ releaseShareReservation, 2026-10-23T21:42:21.0990162Z 774 │ reserveShare, 2026-10-23T21:42:21.0990250Z 775 │ selectedEnvironmentServerConfig, 2026-10-23T21:42:21.0990322Z 776 │ selectedProject, 2026-10-23T21:42:21.0990393Z 777 │ shareImportAttempt, 2026-10-23T21:42:21.0990489Z ·  ─────────┬──────── 2026-10-23T21:42:21.0990659Z · ╰── Unnecessary dependency `shareImportAttempt` 2026-10-23T21:42:21.0990717Z 778 │ ]); 2026-10-23T21:42:21.0990771Z ╰──── 2026-10-23T21:42:21.0991052Z  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-23T21:42:21.0991350Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.0991353Z 2026-10-23T21:42:21.0991535Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T21:42:21.0991696Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:100:85] 2026-10-23T21:42:21.0991822Z  99 │ const startEditor = startScheduledTaskEditor; 2026-10-23T21:42:21.0992052Z 100 │ const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]); 2026-10-23T21:42:21.0992322Z ·  ─────┬───── 2026-10-23T21:42:21.0992548Z · ╰── Unnecessary dependency `startEditor` 2026-10-23T21:42:21.0992644Z 101 │ const readEditor = useCallback( 2026-10-23T21:42:21.0992716Z ╰──── 2026-10-23T21:42:21.0993065Z  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-23T21:42:21.0993495Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.0993527Z 2026-10-23T21:42:21.0993730Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T21:42:21.0993901Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:121:7] 2026-10-23T21:42:21.0994023Z 120 │ setEditor, 2026-10-23T21:42:21.0994128Z 121 │ startEditor, 2026-10-23T21:42:21.0994233Z ·  ─────┬───── 2026-10-23T21:42:21.0994389Z · ╰── Unnecessary dependency `startEditor` 2026-10-23T21:42:21.0994473Z 122 │ hasChanges, 2026-10-23T21:42:21.0994577Z ╰──── 2026-10-23T21:42:21.0994912Z  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-23T21:42:21.0995222Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.0995242Z 2026-10-23T21:42:21.0995434Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T21:42:21.0995691Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:121:27] 2026-10-23T21:42:21.0995889Z 120 │ const scope = makeScope(options.capabilities ?? new Set(["preview", "worktree"])); 2026-10-23T21:42:21.0996007Z 121 │ const dispatch = vi.fn((_: unknown) => 2026-10-23T21:42:21.0996105Z ·  ┬ 2026-10-23T21:42:21.0996286Z · ╰── '_' is declared here 2026-10-23T21:42:21.0996448Z 122 │ (options.dispatchGate ?? Effect.void).pipe( 2026-10-23T21:42:21.0996534Z ╰──── 2026-10-23T21:42:21.0996649Z  help: Consider removing this parameter. 2026-10-23T21:42:21.0996652Z 2026-10-23T21:42:21.0996863Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T21:42:21.0997036Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:134:39] 2026-10-23T21:42:21.0997127Z 133 │ ); 2026-10-23T21:42:21.0997245Z 134 │ const listLocalBranchNames = vi.fn((_: string) => 2026-10-23T21:42:21.0997380Z ·  ┬ 2026-10-23T21:42:21.0997542Z · ╰── '_' is declared here 2026-10-23T21:42:21.0997726Z 135 │ Effect.succeed( 2026-10-23T21:42:21.0997809Z ╰──── 2026-10-23T21:42:21.0997929Z  help: Consider removing this parameter. 2026-10-23T21:42:21.0997935Z 2026-10-23T21:42:21.0998225Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T21:42:21.0998397Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:178:31] 2026-10-23T21:42:21.0998488Z 177 │ }); 2026-10-23T21:42:21.0998597Z 178 │ const sendToThread = vi.fn((_: unknown) => { 2026-10-23T21:42:21.0998711Z ·  ┬ 2026-10-23T21:42:21.0998871Z · ╰── '_' is declared here 2026-10-23T21:42:21.0999018Z 179 │ switch (options.continuation ?? "queued") { 2026-10-23T21:42:21.0999081Z ╰──── 2026-10-23T21:42:21.0999207Z  help: Consider removing this parameter. 2026-10-23T21:42:21.0999210Z 2026-10-23T21:42:21.0999476Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T21:42:21.0999675Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:203:33] 2026-10-23T21:42:21.0999752Z 202 │ ); 2026-10-23T21:42:21.0999884Z 203 │ const removeWorktree = vi.fn((_: unknown) => 2026-10-23T21:42:21.1000022Z ·  ┬ 2026-10-23T21:42:21.1000180Z · ╰── '_' is declared here 2026-10-23T21:42:21.1000285Z 204 │ options.removeWorktreeFails 2026-10-23T21:42:21.1000376Z ╰──── 2026-10-23T21:42:21.1000591Z  help: Consider removing this parameter. 2026-10-23T21:42:21.1000593Z 2026-10-23T21:42:21.1000804Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T21:42:21.1000974Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:208:36] 2026-10-23T21:42:21.1001052Z 207 │ ); 2026-10-23T21:42:21.1001186Z 208 │ const deleteLocalBranch = vi.fn((_: unknown) => 2026-10-23T21:42:21.1001343Z ·  ┬ 2026-10-23T21:42:21.1001501Z · ╰── '_' is declared here 2026-10-23T21:42:21.1001608Z 209 │ options.deleteLocalBranchFails 2026-10-23T21:42:21.1001701Z ╰──── 2026-10-23T21:42:21.1001829Z  help: Consider removing this parameter. 2026-10-23T21:42:21.1001832Z 2026-10-23T21:42:21.1002041Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T21:42:21.1002178Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:213:42] 2026-10-23T21:42:21.1002288Z 212 │ ); 2026-10-23T21:42:21.1002434Z 213 │ const fetchWorktreeBaseCommit = vi.fn((_: unknown) => 2026-10-23T21:42:21.1002582Z ·  ┬ 2026-10-23T21:42:21.1002734Z · ╰── '_' is declared here 2026-10-23T21:42:21.1002853Z 214 │ options.fetchWorktreeBaseFails 2026-10-23T21:42:21.1002945Z ╰──── 2026-10-23T21:42:21.1003143Z  help: Consider removing this parameter. 2026-10-23T21:42:21.1003146Z 2026-10-23T21:42:21.1003367Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T21:42:21.1003521Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:254:30] 2026-10-23T21:42:21.1003626Z 253 │ ); 2026-10-23T21:42:21.1003743Z 254 │ const localStatus = vi.fn((_: unknown) => 2026-10-23T21:42:21.1003849Z ·  ┬ 2026-10-23T21:42:21.1004015Z · ╰── '_' is declared here 2026-10-23T21:42:21.1004122Z 255 │ Effect.succeed({ 2026-10-23T21:42:21.1004210Z ╰──── 2026-10-23T21:42:21.1004324Z  help: Consider removing this parameter. 2026-10-23T21:42:21.1004327Z 2026-10-23T21:42:21.1004529Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T21:42:21.1004680Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:264:32] 2026-10-23T21:42:21.1004845Z 263 │ ); 2026-10-23T21:42:21.1005020Z 264 │ const refreshStatus = vi.fn((_: string) => Effect.die("refreshStatus stub")); 2026-10-23T21:42:21.1005120Z ·  ┬ 2026-10-23T21:42:21.1005361Z · ╰── '_' is declared here 2026-10-23T21:42:21.1005578Z 265 │ const runForThread = vi.fn((input: { readonly worktreePath: string }) => { 2026-10-23T21:42:21.1005744Z ╰──── 2026-10-23T21:42:21.1005851Z  help: Consider removing this parameter. 2026-10-23T21:42:21.1005854Z 2026-10-23T21:42:21.1006142Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T21:42:21.1006312Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:400:5] 2026-10-23T21:42:21.1006413Z 398 │ 2026-10-23T21:42:21.1006493Z 399 │ useEffect(() => { 2026-10-23T21:42:21.1006602Z ·  ────┬──── 2026-10-23T21:42:21.1006782Z · ╰── This is the containing effect 2026-10-23T21:42:21.1006909Z 400 │ setInspectorSelection((current) => { 2026-10-23T21:42:21.1007030Z ·  ──────────┬────────── 2026-10-23T21:42:21.1007239Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.1007368Z 401 │ if (props.renderInspector === undefined) { 2026-10-23T21:42:21.1007443Z ╰──── 2026-10-23T21:42:21.1008116Z  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-23T21:42:21.1008439Z  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-23T21:42:21.1008441Z 2026-10-23T21:42:21.1008691Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-23T21:42:21.1008876Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:528:24] 2026-10-23T21:42:21.1009073Z 527 │ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top; 2026-10-23T21:42:21.1009358Z 528 │ ╭─▶ const GitInspector = () => ( 2026-10-23T21:42:21.1009467Z 529 │ │ 2026-10-23T21:42:21.1010316Z 534 │ ╰─▶ ); 2026-10-23T21:42:21.1010425Z 535 │ const FilesInspector = () => 2026-10-23T21:42:21.1010528Z ╰──── 2026-10-23T21:42:21.1010762Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-23T21:42:21.1010765Z 2026-10-23T21:42:21.1011002Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-23T21:42:21.1011188Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:535:26] 2026-10-23T21:42:21.1011270Z 534 │ ); 2026-10-23T21:42:21.1011457Z 535 │ ╭─▶ const FilesInspector = () => 2026-10-23T21:42:21.1011709Z 536 │ │ selectedThread !== null && selectedThreadCwd !== null ? ( 2026-10-23T21:42:21.1011849Z 537 │ │ 2026-10-23T21:42:21.1013109Z 545 │ ╰─▶ ) : null; 2026-10-23T21:42:21.1013316Z 546 │ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset); 2026-10-23T21:42:21.1013402Z ╰──── 2026-10-23T21:42:21.1013614Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-23T21:42:21.1013617Z 2026-10-23T21:42:21.1013864Z ⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used. 2026-10-23T21:42:21.1014028Z ╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10] 2026-10-23T21:42:21.1014113Z 21 │ 2026-10-23T21:42:21.1014277Z 22 │ function summarizePayload(payload: unknown): Readonly> { 2026-10-23T21:42:21.1014400Z ·  ────────┬─────── 2026-10-23T21:42:21.1014589Z · ╰── 'summarizePayload' is declared here 2026-10-23T21:42:21.1014727Z 23 │ if (payload === null) return { valueType: "null" }; 2026-10-23T21:42:21.1014882Z ╰──── 2026-10-23T21:42:21.1014988Z  help: Consider removing this declaration. 2026-10-23T21:42:21.1014991Z 2026-10-23T21:42:21.1015286Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T21:42:21.1015463Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:512:5] 2026-10-23T21:42:21.1015556Z 510 │ }, []); 2026-10-23T21:42:21.1015633Z 511 │ useEffect(() => { 2026-10-23T21:42:21.1015737Z ·  ────┬──── 2026-10-23T21:42:21.1015904Z · ╰── This is the containing effect 2026-10-23T21:42:21.1016019Z 512 │ setKeyboardStateSuspect(false); 2026-10-23T21:42:21.1016180Z ·  ───────────┬─────────── 2026-10-23T21:42:21.1016405Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.1016559Z 513 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-23T21:42:21.1016641Z ╰──── 2026-10-23T21:42:21.1017226Z  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-23T21:42:21.1017565Z  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-23T21:42:21.1017567Z 2026-10-23T21:42:21.1017854Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T21:42:21.1018045Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:872:7] 2026-10-23T21:42:21.1018301Z 869 │ const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0); 2026-10-23T21:42:21.1018381Z 870 │ useEffect(() => { 2026-10-23T21:42:21.1018474Z ·  ────┬──── 2026-10-23T21:42:21.1018651Z · ╰── This is the containing effect 2026-10-23T21:42:21.1018829Z 871 │ if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) { 2026-10-23T21:42:21.1018967Z 872 │ setLastKnownKeyboardHeight(liveKeyboardHeight); 2026-10-23T21:42:21.1019081Z ·  ─────────────┬──────────── 2026-10-23T21:42:21.1019294Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.1019391Z 873 │ } 2026-10-23T21:42:21.1019468Z ╰──── 2026-10-23T21:42:21.1020051Z  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-23T21:42:21.1020385Z  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-23T21:42:21.1020388Z 2026-10-23T21:42:21.1020679Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T21:42:21.1020862Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1119:5] 2026-10-23T21:42:21.1020947Z 1117 │ 2026-10-23T21:42:21.1021037Z 1118 │ useEffect(() => { 2026-10-23T21:42:21.1021144Z ·  ────┬──── 2026-10-23T21:42:21.1021383Z · ╰── This is the containing effect 2026-10-23T21:42:21.1021491Z 1119 │ setAnchorMessageId(null); 2026-10-23T21:42:21.1021589Z ·  ─────────┬──────── 2026-10-23T21:42:21.1021789Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.1021919Z 1120 │ setSubmittedMessageId(null); 2026-10-23T21:42:21.1022002Z ╰──── 2026-10-23T21:42:21.1022645Z  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-23T21:42:21.1023012Z  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-23T21:42:21.1023015Z 2026-10-23T21:42:21.1023254Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T21:42:21.1023475Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:513:7] 2026-10-23T21:42:21.1023592Z 512 │ setKeyboardStateSuspect(false); 2026-10-23T21:42:21.1023702Z 513 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-23T21:42:21.1023870Z ·  ────────┬──────── ─────────┬──────── 2026-10-23T21:42:21.1024133Z · │ ╰── Unnecessary dependency `liveKeyboardHeight` 2026-10-23T21:42:21.1024325Z · ╰── Unnecessary dependency `isKeyboardVisible` 2026-10-23T21:42:21.1024460Z 514 │ const handleOwnedInputFocusChange = (focused: boolean) => { 2026-10-23T21:42:21.1024539Z ╰──── 2026-10-23T21:42:21.1024926Z  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-23T21:42:21.1025259Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.1025261Z 2026-10-23T21:42:21.1025488Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T21:42:21.1025653Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1067:7] 2026-10-23T21:42:21.1025760Z 1066 │ userInputInsetProgress.set(1); 2026-10-23T21:42:21.1025965Z 1067 │ }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]); 2026-10-23T21:42:21.1026092Z ·  ────────────┬─────────── 2026-10-23T21:42:21.1026279Z · ╰── Unnecessary dependency `activeUserInputRequestId` 2026-10-23T21:42:21.1026415Z 1068 │ const showContent = props.showContent ?? true; 2026-10-23T21:42:21.1026497Z ╰──── 2026-10-23T21:42:21.1026815Z  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-23T21:42:21.1027145Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.1027150Z 2026-10-23T21:42:21.1027355Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T21:42:21.1027529Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1125:15] 2026-10-23T21:42:21.1027645Z 1124 │ freeze.set(false); 2026-10-23T21:42:21.1027755Z 1125 │ }, [freeze, selectedThreadKey]); 2026-10-23T21:42:21.1027860Z ·  ────────┬──────── 2026-10-23T21:42:21.1028053Z · ╰── Unnecessary dependency `selectedThreadKey` 2026-10-23T21:42:21.1028216Z 1126 │ 2026-10-23T21:42:21.1028304Z ╰──── 2026-10-23T21:42:21.1028654Z  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-23T21:42:21.1029015Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.1029018Z 2026-10-23T21:42:21.1029193Z ⚠ react(immutability): This value cannot be modified 2026-10-23T21:42:21.1029389Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:955:5] 2026-10-23T21:42:21.1029522Z 950 │ const composerPopoverHeight = useSharedValue(0); 2026-10-23T21:42:21.1029636Z 951 │ const floatingControlCoverage = useSharedValue( 2026-10-23T21:42:21.1029764Z ·  ───────────┬─────────── 2026-10-23T21:42:21.1029962Z · ╰── `floatingControlCoverage` originates here 2026-10-23T21:42:21.1030127Z 952 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-23T21:42:21.1030195Z 953 │ ); 2026-10-23T21:42:21.1030293Z 954 │ useEffect(() => { 2026-10-23T21:42:21.1030415Z 955 │ floatingControlCoverage.value = withTiming( 2026-10-23T21:42:21.1030551Z ·  ───────────┬─────────── 2026-10-23T21:42:21.1030729Z · ╰── `floatingControlCoverage` cannot be modified 2026-10-23T21:42:21.1030883Z 956 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-23T21:42:21.1031039Z ╰──── 2026-10-23T21:42:21.1031329Z  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-23T21:42:21.1031665Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T21:42:21.1031671Z 2026-10-23T21:42:21.1031840Z ⚠ react(immutability): This value cannot be modified 2026-10-23T21:42:21.1032018Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:973:7] 2026-10-23T21:42:21.1032216Z 963 │ const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null; 2026-10-23T21:42:21.1032387Z 964 │ const combinedContentInsetEndAdjustment = useSharedValue( 2026-10-23T21:42:21.1032513Z ·  ────────────────┬──────────────── 2026-10-23T21:42:21.1032726Z · ╰── `combinedContentInsetEndAdjustment` originates here 2026-10-23T21:42:21.1032883Z 965 │ Math.max(0, estimatedOverlayHeight - nativeInsetOvercount), 2026-10-23T21:42:21.1032974Z 966 │ ); 2026-10-23T21:42:21.1033087Z 967 │ useAnimatedReaction( 2026-10-23T21:42:21.1033157Z 968 │ () => 2026-10-23T21:42:21.1033310Z 969 │ contentInsetEndAdjustment.value + 2026-10-23T21:42:21.1033416Z 970 │ floatingControlCoverage.value + 2026-10-23T21:42:21.1033651Z 971 │ (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0), 2026-10-23T21:42:21.1033731Z 972 │ (value) => { 2026-10-23T21:42:21.1033942Z 973 │ combinedContentInsetEndAdjustment.value = value; 2026-10-23T21:42:21.1034083Z ·  ────────────────┬──────────────── 2026-10-23T21:42:21.1034315Z · ╰── `combinedContentInsetEndAdjustment` cannot be modified 2026-10-23T21:42:21.1034394Z 974 │ }, 2026-10-23T21:42:21.1034478Z ╰──── 2026-10-23T21:42:21.1034822Z  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-23T21:42:21.1035167Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T21:42:21.1035170Z 2026-10-23T21:42:21.1039567Z ⚠ 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-23T21:42:21.1039708Z ╭─[packages/shared/src/otelEnvironment.ts:146:14] 2026-10-23T21:42:21.1039764Z 145 │ name, 2026-10-23T21:42:21.1039900Z 146 │ (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()), 2026-10-23T21:42:21.1040009Z ·  ────────────────────────── 2026-10-23T21:42:21.1040134Z 147 │ `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`, 2026-10-23T21:42:21.1040188Z ╰──── 2026-10-23T21:42:21.1040193Z 2026-10-23T21:42:21.1040380Z ⚠ eslint(require-yield): This generator function does not have `yield` 2026-10-23T21:42:21.1040526Z ╭─[packages/provider-acp/src/server/mcpOverAcpBridge.ts:81:78] 2026-10-23T21:42:21.1040581Z  80 │ 2026-10-23T21:42:21.1040847Z  81 │ ╭─▶ export const makeAcpMcpOverAcpBridge = Effect.fn("AcpMcpOverAcpBridge.make")(function* ( 2026-10-23T21:42:21.1040963Z  82 │ │ options: AcpMcpOverAcpBridgeOptions, 2026-10-23T21:42:21.1041083Z  83 │ │ ): Effect.fn.Return { 2026-10-23T21:42:21.1041253Z  84 │ │ const fetchImplementation = options.fetchImplementation ?? fetch; 2026-10-23T21:42:21.1041389Z  85 │ │ const connections = new Map(); 2026-10-23T21:42:21.1041456Z  86 │ │ 2026-10-23T21:42:21.1041667Z  87 │ │ const connectionFor = (connectionId: string): Effect.Effect => 2026-10-23T21:42:21.1041765Z  88 │ │ Effect.suspend(() => { 2026-10-23T21:42:21.1041900Z  89 │ │ const connection = connections.get(connectionId); 2026-10-23T21:42:21.1042007Z  90 │ │ return connection === undefined 2026-10-23T21:42:21.1042215Z  91 │ │ ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`)) 2026-10-23T21:42:21.1042323Z  92 │ │ : Effect.succeed(connection); 2026-10-23T21:42:21.1042487Z  93 │ │ }); 2026-10-23T21:42:21.1042591Z  94 │ │ 2026-10-23T21:42:21.1042678Z  95 │ │ const send = ( 2026-10-23T21:42:21.1042775Z  96 │ │ connection: Connection, 2026-10-23T21:42:21.1042866Z  97 │ │ message: unknown, 2026-10-23T21:42:21.1043019Z  98 │ │ ): Effect.Effect, AcpMcpOverAcpError> => 2026-10-23T21:42:21.1043133Z  99 │ │ connection.mutex.withPermits(1)( 2026-10-23T21:42:21.1043252Z 100 │ │ Effect.gen(function* () { 2026-10-23T21:42:21.1043463Z 101 │ │ const body = JSON.stringify(message); 2026-10-23T21:42:21.1043599Z 102 │ │ if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) { 2026-10-23T21:42:21.1043811Z 103 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB.")); 2026-10-23T21:42:21.1043895Z 104 │ │ } 2026-10-23T21:42:21.1044025Z 105 │ │ const response = yield* Effect.tryPromise({ 2026-10-23T21:42:21.1044119Z 106 │ │ try: (signal) => 2026-10-23T21:42:21.1044247Z 107 │ │ fetchImplementation(options.endpoint, { 2026-10-23T21:42:21.1044346Z 108 │ │ method: "POST", 2026-10-23T21:42:21.1044437Z 109 │ │ signal, 2026-10-23T21:42:21.1044529Z 110 │ │ headers: { 2026-10-23T21:42:21.1044654Z 111 │ │ "content-type": "application/json", 2026-10-23T21:42:21.1044897Z 112 │ │ accept: "application/json, text/event-stream", 2026-10-23T21:42:21.1045030Z 113 │ │ authorization: options.authorization, 2026-10-23T21:42:21.1045154Z 114 │ │ ...(connection.sessionId === null 2026-10-23T21:42:21.1045244Z 115 │ │ ? {} 2026-10-23T21:42:21.1045385Z 116 │ │ : { "mcp-session-id": connection.sessionId }), 2026-10-23T21:42:21.1045514Z 117 │ │ ...(connection.protocolVersion === null 2026-10-23T21:42:21.1045603Z 118 │ │ ? {} 2026-10-23T21:42:21.1045761Z 119 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-23T21:42:21.1045848Z 120 │ │ }, 2026-10-23T21:42:21.1045944Z 121 │ │ body, 2026-10-23T21:42:21.1046029Z 122 │ │ }), 2026-10-23T21:42:21.1046126Z 123 │ │ catch: bridgeError, 2026-10-23T21:42:21.1046205Z 124 │ │ }); 2026-10-23T21:42:21.1046409Z 125 │ │ connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId; 2026-10-23T21:42:21.1046506Z 126 │ │ if (!response.ok) { 2026-10-23T21:42:21.1046608Z 127 │ │ yield* Effect.promise( 2026-10-23T21:42:21.1046785Z 128 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-23T21:42:21.1046864Z 129 │ │ ); 2026-10-23T21:42:21.1047050Z 130 │ │ return yield* Effect.fail( 2026-10-23T21:42:21.1047293Z 131 │ │ new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`), 2026-10-23T21:42:21.1047373Z 132 │ │ ); 2026-10-23T21:42:21.1047450Z 133 │ │ } 2026-10-23T21:42:21.1047654Z 134 │ │ const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))]; 2026-10-23T21:42:21.1047769Z 135 │ │ for (const payload of payloads) { 2026-10-23T21:42:21.1047975Z 136 │ │ connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion; 2026-10-23T21:42:21.1048052Z 137 │ │ } 2026-10-23T21:42:21.1048147Z 138 │ │ return payloads; 2026-10-23T21:42:21.1048272Z 139 │ │ }).pipe(Effect.mapError(bridgeError)), 2026-10-23T21:42:21.1048348Z 140 │ │ ); 2026-10-23T21:42:21.1048416Z 141 │ │ 2026-10-23T21:42:21.1048588Z 142 │ │ const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* ( 2026-10-23T21:42:21.1048711Z 143 │ │ request: AcpSchema.DisconnectMcpRequest, 2026-10-23T21:42:21.1048890Z 144 │ │ ): Effect.fn.Return { 2026-10-23T21:42:21.1049047Z 145 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-23T21:42:21.1049170Z 146 │ │ connections.delete(request.connectionId); 2026-10-23T21:42:21.1049290Z 147 │ │ const sessionId = connection.sessionId; 2026-10-23T21:42:21.1049392Z 148 │ │ if (sessionId !== null) { 2026-10-23T21:42:21.1049525Z 149 │ │ const response = yield* Effect.tryPromise({ 2026-10-23T21:42:21.1049618Z 150 │ │ try: (signal) => 2026-10-23T21:42:21.1049743Z 151 │ │ fetchImplementation(options.endpoint, { 2026-10-23T21:42:21.1049839Z 152 │ │ method: "DELETE", 2026-10-23T21:42:21.1049926Z 153 │ │ signal, 2026-10-23T21:42:21.1050017Z 154 │ │ headers: { 2026-10-23T21:42:21.1050147Z 155 │ │ authorization: options.authorization, 2026-10-23T21:42:21.1050259Z 156 │ │ "mcp-session-id": sessionId, 2026-10-23T21:42:21.1050394Z 157 │ │ ...(connection.protocolVersion === null 2026-10-23T21:42:21.1050487Z 158 │ │ ? {} 2026-10-23T21:42:21.1050645Z 159 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-23T21:42:21.1050724Z 160 │ │ }, 2026-10-23T21:42:21.1050806Z 161 │ │ }), 2026-10-23T21:42:21.1050903Z 162 │ │ catch: bridgeError, 2026-10-23T21:42:21.1050980Z 163 │ │ }); 2026-10-23T21:42:21.1051108Z 164 │ │ if (!response.ok && response.status !== 404) { 2026-10-23T21:42:21.1051216Z 165 │ │ return yield* Effect.fail( 2026-10-23T21:42:21.1051322Z 166 │ │ new AcpMcpOverAcpError( 2026-10-23T21:42:21.1051556Z 167 │ │ `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`, 2026-10-23T21:42:21.1051670Z 168 │ │ ), 2026-10-23T21:42:21.1051748Z 169 │ │ ); 2026-10-23T21:42:21.1051823Z 170 │ │ } 2026-10-23T21:42:21.1051922Z 171 │ │ yield* Effect.promise( 2026-10-23T21:42:21.1052093Z 172 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-23T21:42:21.1052170Z 173 │ │ ); 2026-10-23T21:42:21.1052243Z 174 │ │ } 2026-10-23T21:42:21.1052325Z 175 │ │ return {}; 2026-10-23T21:42:21.1052395Z 176 │ │ }); 2026-10-23T21:42:21.1052462Z 177 │ │ 2026-10-23T21:42:21.1052551Z 178 │ │ return { 2026-10-23T21:42:21.1052723Z 179 │ │ connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) { 2026-10-23T21:42:21.1052838Z 180 │ │ if (request.serverId !== "t3-code") { 2026-10-23T21:42:21.1052948Z 181 │ │ return yield* Effect.fail( 2026-10-23T21:42:21.1053128Z 182 │ │ new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`), 2026-10-23T21:42:21.1053236Z 183 │ │ ); 2026-10-23T21:42:21.1053308Z 184 │ │ } 2026-10-23T21:42:21.1053432Z 185 │ │ if (connections.size >= MAX_CONNECTIONS) { 2026-10-23T21:42:21.1053635Z 186 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections.")); 2026-10-23T21:42:21.1053714Z 187 │ │ } 2026-10-23T21:42:21.1053867Z 188 │ │ const connectionId = yield* options.allocateConnectionId; 2026-10-23T21:42:21.1053980Z 189 │ │ connections.set(connectionId, { 2026-10-23T21:42:21.1054095Z 190 │ │ mutex: yield* Semaphore.make(1), 2026-10-23T21:42:21.1054191Z 191 │ │ sessionId: null, 2026-10-23T21:42:21.1054290Z 192 │ │ protocolVersion: null, 2026-10-23T21:42:21.1054387Z 193 │ │ nextRequestId: 0, 2026-10-23T21:42:21.1054461Z 194 │ │ }); 2026-10-23T21:42:21.1054563Z 195 │ │ return { connectionId }; 2026-10-23T21:42:21.1054633Z 196 │ │ }), 2026-10-23T21:42:21.1054803Z 197 │ │ message: Effect.fn("mcpOverAcpBridge.message")(function* (request) { 2026-10-23T21:42:21.1054964Z 198 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-23T21:42:21.1055084Z 199 │ │ const id = ++connection.nextRequestId; 2026-10-23T21:42:21.1055207Z 200 │ │ const payloads = yield* send(connection, { 2026-10-23T21:42:21.1055302Z 201 │ │ jsonrpc: "2.0", 2026-10-23T21:42:21.1055381Z 202 │ │ id, 2026-10-23T21:42:21.1055483Z 203 │ │ method: request.method, 2026-10-23T21:42:21.1055636Z 204 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-23T21:42:21.1055710Z 205 │ │ }); 2026-10-23T21:42:21.1055952Z 206 │ │ const response = payloads.find((payload) => asEnvelope(payload)?.id === id); 2026-10-23T21:42:21.1056103Z 207 │ │ const envelope = asEnvelope(response); 2026-10-23T21:42:21.1056203Z 208 │ │ if (envelope === null) { 2026-10-23T21:42:21.1056306Z 209 │ │ return yield* Effect.fail( 2026-10-23T21:42:21.1056484Z 210 │ │ new AcpMcpOverAcpError("MCP server did not return a matching response."), 2026-10-23T21:42:21.1056561Z 211 │ │ ); 2026-10-23T21:42:21.1056633Z 212 │ │ } 2026-10-23T21:42:21.1056745Z 213 │ │ if (envelope.error !== undefined) { 2026-10-23T21:42:21.1056934Z 214 │ │ return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error))); 2026-10-23T21:42:21.1057013Z 215 │ │ } 2026-10-23T21:42:21.1057181Z 216 │ │ return (envelope.result ?? null) as AcpSchema.MessageMcpResponse; 2026-10-23T21:42:21.1057251Z 217 │ │ }), 2026-10-23T21:42:21.1057436Z 218 │ │ notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) { 2026-10-23T21:42:21.1057591Z 219 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-23T21:42:21.1057694Z 220 │ │ yield* send(connection, { 2026-10-23T21:42:21.1057785Z 221 │ │ jsonrpc: "2.0", 2026-10-23T21:42:21.1057884Z 222 │ │ method: request.method, 2026-10-23T21:42:21.1058036Z 223 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-23T21:42:21.1058116Z 224 │ │ }); 2026-10-23T21:42:21.1058189Z 225 │ │ }), 2026-10-23T21:42:21.1058277Z 226 │ │ disconnect, 2026-10-23T21:42:21.1058383Z 227 │ │ dispose: Effect.suspend(() => 2026-10-23T21:42:21.1058476Z 228 │ │ Effect.forEach( 2026-10-23T21:42:21.1058578Z 229 │ │ [...connections.keys()], 2026-10-23T21:42:21.1058744Z 230 │ │ (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore), 2026-10-23T21:42:21.1058841Z 231 │ │ { discard: true }, 2026-10-23T21:42:21.1058917Z 232 │ │ ), 2026-10-23T21:42:21.1058989Z 233 │ │ ), 2026-10-23T21:42:21.1059060Z 234 │ │ }; 2026-10-23T21:42:21.1059190Z 235 │ ╰─▶ }); 2026-10-23T21:42:21.1059245Z ╰──── 2026-10-23T21:42:21.1059486Z  help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed. 2026-10-23T21:42:21.1059490Z 2026-10-23T21:42:21.1059653Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T21:42:21.1059839Z ╭─[packages/provider-opencode/src/server/OpenCodeRuntime.environment.test.ts:53:14] 2026-10-23T21:42:21.1059890Z 52 │ 2026-10-23T21:42:21.1059954Z 53 │ for (const {} of [ 2026-10-23T21:42:21.1060026Z ·  ── 2026-10-23T21:42:21.1060091Z 54 │ { healthy: true }, 2026-10-23T21:42:21.1060141Z ╰──── 2026-10-23T21:42:21.1060412Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T21:42:21.1060446Z 2026-10-23T21:42:21.1060634Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T21:42:21.1060802Z ╭─[apps/web/src/components/pullRequest/PullRequestChecksPopover.tsx:88:15] 2026-10-23T21:42:21.1060863Z 87 │
  • { 2026-10-23T21:42:21.1063063Z ·  ───┬── 2026-10-23T21:42:21.1063186Z · ╰── For this reduce 2026-10-23T21:42:21.1063276Z 449 │ const exists = current.some( 2026-10-23T21:42:21.1063471Z 450 │ (favorite) => favorite.provider === change.provider && favorite.model === change.model, 2026-10-23T21:42:21.1063525Z 451 │ ); 2026-10-23T21:42:21.1063595Z 452 │ return change.favorite 2026-10-23T21:42:21.1063654Z 453 │ ? exists 2026-10-23T21:42:21.1063713Z 454 │ ? current 2026-10-23T21:42:21.1063841Z 455 │ : [...current, { provider: change.provider, model: change.model }] 2026-10-23T21:42:21.1063974Z ·  ─────┬──── 2026-10-23T21:42:21.1064124Z · ╰── From this spread 2026-10-23T21:42:21.1064192Z 456 │ : current.filter( 2026-10-23T21:42:21.1064240Z ╰──── 2026-10-23T21:42:21.1064437Z  help: Consider using `Object.assign()` or `Array.prototype.push()` to mutate the accumulator instead. 2026-10-23T21:42:21.1064587Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-23T21:42:21.1064589Z 2026-10-23T21:42:21.1064768Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-23T21:42:21.1064880Z ╭─[packages/shared/src/serverSettings.ts:466:3] 2026-10-23T21:42:21.1064937Z 464 │ null; 2026-10-23T21:42:21.1065048Z 465 │ let nextModelPreferences = initialModelPreferences; 2026-10-23T21:42:21.1065143Z ·  ──────────┬───────── 2026-10-23T21:42:21.1065274Z · ╰── From this accumulator 2026-10-23T21:42:21.1065373Z 466 │ for (const change of setModelsHidden ?? []) { 2026-10-23T21:42:21.1065438Z ·  ─┬─ 2026-10-23T21:42:21.1065539Z · ╰── For this loop 2026-10-23T21:42:21.1065665Z 467 │ const preferences = nextModelPreferences?.[change.provider] ?? { 2026-10-23T21:42:21.1065732Z 468 │ hiddenModels: [], 2026-10-23T21:42:21.1065796Z 469 │ modelOrder: [], 2026-10-23T21:42:21.1065849Z 470 │ }; 2026-10-23T21:42:21.1066018Z 471 │ const hiddenModels = preferences.hiddenModels.filter((model) => model !== change.model); 2026-10-23T21:42:21.1066122Z 472 │ if (change.hidden) hiddenModels.push(change.model); 2026-10-23T21:42:21.1066199Z 473 │ nextModelPreferences = { 2026-10-23T21:42:21.1066274Z 474 │ ...nextModelPreferences, 2026-10-23T21:42:21.1066368Z ·  ───────────┬─────────── 2026-10-23T21:42:21.1066491Z · ╰── From this spread 2026-10-23T21:42:21.1066596Z 475 │ [change.provider]: { ...preferences, hiddenModels }, 2026-10-23T21:42:21.1066646Z ╰──── 2026-10-23T21:42:21.1066792Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-23T21:42:21.1066939Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-23T21:42:21.1066942Z 2026-10-23T21:42:21.1067101Z ⚠ eslint(no-control-regex): Unexpected control character 2026-10-23T21:42:21.1067291Z ╭─[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46] 2026-10-23T21:42:21.1067424Z 219 │ 2026-10-23T21:42:21.1067557Z 220 │ {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")} 2026-10-23T21:42:21.1067662Z ·  ──┬─ 2026-10-23T21:42:21.1067823Z · ╰── 'U+001B' is a control character. 2026-10-23T21:42:21.1067884Z 221 │ 2026-10-23T21:42:21.1067934Z ╰──── 2026-10-23T21:42:21.1068155Z  help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression. 2026-10-23T21:42:21.1068158Z 2026-10-23T21:42:21.1068336Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-23T21:42:21.1068539Z ╭─[apps/mobile/src/features/threads/ThreadQueueControl.tsx:602:27] 2026-10-23T21:42:21.1068730Z 601 │ const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success)); 2026-10-23T21:42:21.1068805Z 602 │ const gesture = Gesture.Pan() 2026-10-23T21:42:21.1068891Z ·  ─┬─ 2026-10-23T21:42:21.1069028Z · ╰── `Pan` may be a component 2026-10-23T21:42:21.1069100Z 603 │ .enabled(!props.disabled) 2026-10-23T21:42:21.1069151Z ╰──── 2026-10-23T21:42:21.1069416Z  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-23T21:42:21.1069853Z  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-23T21:42:21.1069859Z 2026-10-23T21:42:21.1070106Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T21:42:21.1070284Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:119:10] 2026-10-23T21:42:21.1070338Z 117 │ 2026-10-23T21:42:21.1070401Z 118 │ useEffect(() => { 2026-10-23T21:42:21.1070468Z ·  ────┬──── 2026-10-23T21:42:21.1070595Z · ╰── This is the containing effect 2026-10-23T21:42:21.1070673Z 119 │ void refreshNotifications(); 2026-10-23T21:42:21.1070761Z ·  ──────────┬───────── 2026-10-23T21:42:21.1070936Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.1071075Z 120 │ const subscription = AppState.addEventListener("change", (state) => { 2026-10-23T21:42:21.1071124Z ╰──── 2026-10-23T21:42:21.1071697Z  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-23T21:42:21.1072009Z  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-23T21:42:21.1072012Z 2026-10-23T21:42:21.1072261Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T21:42:21.1072444Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7] 2026-10-23T21:42:21.1072495Z 125 │ 2026-10-23T21:42:21.1072557Z 126 │ useEffect(() => { 2026-10-23T21:42:21.1072624Z ·  ────┬──── 2026-10-23T21:42:21.1072749Z · ╰── This is the containing effect 2026-10-23T21:42:21.1072813Z 127 │ if (!isLoaded) { 2026-10-23T21:42:21.1072899Z 128 │ setLiveActivityStatus("checking"); 2026-10-23T21:42:21.1072986Z ·  ──────────┬────────── 2026-10-23T21:42:21.1073151Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.1073246Z 129 │ return; 2026-10-23T21:42:21.1073296Z ╰──── 2026-10-23T21:42:21.1073926Z  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-23T21:42:21.1074260Z  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-23T21:42:21.1074262Z 2026-10-23T21:42:21.1074509Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T21:42:21.1074679Z ╭─[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:60:5] 2026-10-23T21:42:21.1074730Z 58 │ 2026-10-23T21:42:21.1074791Z 59 │ useEffect(() => { 2026-10-23T21:42:21.1074866Z ·  ────┬──── 2026-10-23T21:42:21.1074995Z · ╰── This is the containing effect 2026-10-23T21:42:21.1075074Z 60 │ setMountedModes((current) => { 2026-10-23T21:42:21.1075151Z ·  ───────┬─────── 2026-10-23T21:42:21.1075314Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.1075394Z 61 │ if (current.has(props.mode)) { 2026-10-23T21:42:21.1075444Z ╰──── 2026-10-23T21:42:21.1076013Z  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-23T21:42:21.1076320Z  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-23T21:42:21.1076325Z 2026-10-23T21:42:21.1076571Z ⚠ eslint(no-unused-vars): Function 'promptResponseHasMissingXAiStopReason' is declared but never used. 2026-10-23T21:42:21.1076721Z ╭─[packages/provider-grok/src/server/xaiAcpExtension.ts:1620:10] 2026-10-23T21:42:21.1076774Z 1619 │ 2026-10-23T21:42:21.1076973Z 1620 │ function promptResponseHasMissingXAiStopReason(response: EffectAcpSchema.PromptResponse): boolean { 2026-10-23T21:42:21.1077093Z ·  ──────────────────┬────────────────── 2026-10-23T21:42:21.1077287Z · ╰── 'promptResponseHasMissingXAiStopReason' is declared here 2026-10-23T21:42:21.1077369Z 1621 │ const meta = response._meta; 2026-10-23T21:42:21.1077424Z ╰──── 2026-10-23T21:42:21.1077526Z  help: Consider removing this declaration. 2026-10-23T21:42:21.1077529Z 2026-10-23T21:42:21.1077777Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T21:42:21.1077913Z ╭─[packages/provider-opencode/src/server/adapter.ts:3755:7] 2026-10-23T21:42:21.1077964Z 3754 │ 2026-10-23T21:42:21.1078152Z 3755 │ const layer: Layer.Layer = 2026-10-23T21:42:21.1078221Z ·  ──┬── 2026-10-23T21:42:21.1078344Z · ╰── 'layer' is declared here 2026-10-23T21:42:21.1078406Z 3756 │ Layer.effect( 2026-10-23T21:42:21.1078454Z ╰──── 2026-10-23T21:42:21.1078604Z  help: Consider removing this declaration. 2026-10-23T21:42:21.1078635Z 2026-10-23T21:42:21.1078910Z ⚠ eslint(no-unused-vars): Variable 'revokeActiveMcpThread' is declared but never used. Unused variables should start with a '_'. 2026-10-23T21:42:21.1079036Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:218:7] 2026-10-23T21:42:21.1079086Z 217 │ 2026-10-23T21:42:21.1079227Z 218 │ const revokeActiveMcpThread = (threadId: ThreadId): Effect.Effect => 2026-10-23T21:42:21.1079316Z ·  ──────────┬────────── 2026-10-23T21:42:21.1079466Z · ╰── 'revokeActiveMcpThread' is declared here 2026-10-23T21:42:21.1079645Z 219 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeThread(threadId) : Effect.void; 2026-10-23T21:42:21.1079695Z ╰──── 2026-10-23T21:42:21.1079799Z  help: Consider removing this declaration. 2026-10-23T21:42:21.1079805Z 2026-10-23T21:42:21.1080098Z ⚠ eslint(no-unused-vars): Variable 'revokeAllActiveMcpCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-23T21:42:21.1080216Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:221:7] 2026-10-23T21:42:21.1080267Z 220 │ 2026-10-23T21:42:21.1080395Z 221 │ const revokeAllActiveMcpCredentials = (): Effect.Effect => 2026-10-23T21:42:21.1080502Z ·  ──────────────┬────────────── 2026-10-23T21:42:21.1080671Z · ╰── 'revokeAllActiveMcpCredentials' is declared here 2026-10-23T21:42:21.1080825Z 222 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void; 2026-10-23T21:42:21.1080876Z ╰──── 2026-10-23T21:42:21.1080978Z  help: Consider removing this declaration. 2026-10-23T21:42:21.1080984Z 2026-10-23T21:42:21.1081131Z ⚠ react(immutability): This value cannot be modified 2026-10-23T21:42:21.1081289Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:111:5] 2026-10-23T21:42:21.1081345Z 107 │ ); 2026-10-23T21:42:21.1081489Z 108 │ const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0); 2026-10-23T21:42:21.1081574Z ·  ─────────┬──────── 2026-10-23T21:42:21.1081721Z · ╰── `separationProgress` originates here 2026-10-23T21:42:21.1081772Z 109 │ 2026-10-23T21:42:21.1081838Z 110 │ useEffect(() => { 2026-10-23T21:42:21.1082003Z 111 │ separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING); 2026-10-23T21:42:21.1082091Z ·  ─────────┬──────── 2026-10-23T21:42:21.1082242Z · ╰── `separationProgress` cannot be modified 2026-10-23T21:42:21.1082347Z 112 │ }, [props.showScrollToEnd, separationProgress]); 2026-10-23T21:42:21.1082396Z ╰──── 2026-10-23T21:42:21.1082653Z  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-23T21:42:21.1082943Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T21:42:21.1082946Z 2026-10-23T21:42:21.1083096Z ⚠ react(immutability): This value cannot be modified 2026-10-23T21:42:21.1083290Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-23T21:42:21.1083523Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-23T21:42:21.1083664Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-23T21:42:21.1083744Z ·  ──────┬───── 2026-10-23T21:42:21.1083878Z · ╰── `capsuleWidth` originates here 2026-10-23T21:42:21.1083984Z 130 │ const measuredWidthRef = useRef(null); 2026-10-23T21:42:21.1084096Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-23T21:42:21.1084197Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-23T21:42:21.1084293Z 133 │ if (width === measuredWidthRef.current) { 2026-10-23T21:42:21.1084352Z 134 │ return; 2026-10-23T21:42:21.1084404Z 135 │ } 2026-10-23T21:42:21.1084507Z 136 │ const first = measuredWidthRef.current === null; 2026-10-23T21:42:21.1084597Z 137 │ measuredWidthRef.current = width; 2026-10-23T21:42:21.1084734Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-23T21:42:21.1084862Z ·  ──────┬───── 2026-10-23T21:42:21.1084998Z · ╰── `capsuleWidth` cannot be modified 2026-10-23T21:42:21.1085050Z 139 │ }; 2026-10-23T21:42:21.1085099Z ╰──── 2026-10-23T21:42:21.1085349Z  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-23T21:42:21.1085637Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T21:42:21.1085640Z 2026-10-23T21:42:21.1085788Z ⚠ react(immutability): This value cannot be modified 2026-10-23T21:42:21.1085952Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-23T21:42:21.1086062Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-23T21:42:21.1086172Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-23T21:42:21.1086251Z ·  ──────┬───── 2026-10-23T21:42:21.1086382Z · ╰── `capsuleWidth` originates here 2026-10-23T21:42:21.1086490Z 130 │ const measuredWidthRef = useRef(null); 2026-10-23T21:42:21.1086601Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-23T21:42:21.1086704Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-23T21:42:21.1086795Z 133 │ if (width === measuredWidthRef.current) { 2026-10-23T21:42:21.1086853Z 134 │ return; 2026-10-23T21:42:21.1086906Z 135 │ } 2026-10-23T21:42:21.1087073Z 136 │ const first = measuredWidthRef.current === null; 2026-10-23T21:42:21.1087198Z 137 │ measuredWidthRef.current = width; 2026-10-23T21:42:21.1087334Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-23T21:42:21.1087389Z 139 │ }; 2026-10-23T21:42:21.1087476Z 140 │ const hasStatus = props.status !== null; 2026-10-23T21:42:21.1087601Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-23T21:42:21.1087664Z 142 │ useEffect(() => { 2026-10-23T21:42:21.1087728Z 143 │ if (!hasStatus) { 2026-10-23T21:42:21.1087814Z 144 │ measuredWidthRef.current = null; 2026-10-23T21:42:21.1087888Z 145 │ capsuleWidth.value = null; 2026-10-23T21:42:21.1087965Z ·  ──────┬───── 2026-10-23T21:42:21.1088109Z · ╰── `capsuleWidth` cannot be modified 2026-10-23T21:42:21.1088165Z 146 │ } 2026-10-23T21:42:21.1088215Z ╰──── 2026-10-23T21:42:21.1088465Z  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-23T21:42:21.1088754Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T21:42:21.1088757Z 2026-10-23T21:42:21.1088951Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T21:42:21.1089109Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-23T21:42:21.1089235Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-23T21:42:21.1089297Z 142 │ useEffect(() => { 2026-10-23T21:42:21.1089381Z ·  ───┬─── 2026-10-23T21:42:21.1089598Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-23T21:42:21.1089660Z 143 │ if (!hasStatus) { 2026-10-23T21:42:21.1089743Z 144 │ measuredWidthRef.current = null; 2026-10-23T21:42:21.1089818Z 145 │ capsuleWidth.value = null; 2026-10-23T21:42:21.1089893Z ·  ──────┬───── 2026-10-23T21:42:21.1090024Z · ╰── This modifies `capsuleWidth` 2026-10-23T21:42:21.1090077Z 146 │ } 2026-10-23T21:42:21.1090131Z ╰──── 2026-10-23T21:42:21.1090454Z  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-23T21:42:21.1090746Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T21:42:21.1090751Z 2026-10-23T21:42:21.1090944Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T21:42:21.1091103Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-23T21:42:21.1091212Z 130 │ const measuredWidthRef = useRef(null); 2026-10-23T21:42:21.1091320Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-23T21:42:21.1091444Z ·  ───────────────┬─────────────── 2026-10-23T21:42:21.1091676Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-23T21:42:21.1091832Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-23T21:42:21.1091951Z 133 │ if (width === measuredWidthRef.current) { 2026-10-23T21:42:21.1092011Z 134 │ return; 2026-10-23T21:42:21.1092062Z 135 │ } 2026-10-23T21:42:21.1092163Z 136 │ const first = measuredWidthRef.current === null; 2026-10-23T21:42:21.1092243Z 137 │ measuredWidthRef.current = width; 2026-10-23T21:42:21.1092378Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-23T21:42:21.1092454Z ·  ──────┬───── 2026-10-23T21:42:21.1092585Z · ╰── This modifies `capsuleWidth` 2026-10-23T21:42:21.1092636Z 139 │ }; 2026-10-23T21:42:21.1092687Z ╰──── 2026-10-23T21:42:21.1093012Z  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-23T21:42:21.1093375Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T21:42:21.1093378Z 2026-10-23T21:42:21.1093589Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-23T21:42:21.1093712Z ╭─[scripts/lib/cli-external-packages.test.ts:114:11] 2026-10-23T21:42:21.1093781Z 113 │ const declared = { 2026-10-23T21:42:21.1093869Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-23T21:42:21.1093980Z ·  ──────────────────────────────── 2026-10-23T21:42:21.1094078Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-23T21:42:21.1094129Z ╰──── 2026-10-23T21:42:21.1094386Z  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-23T21:42:21.1094392Z 2026-10-23T21:42:21.1094602Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-23T21:42:21.1094724Z ╭─[scripts/lib/cli-external-packages.test.ts:115:11] 2026-10-23T21:42:21.1094812Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-23T21:42:21.1094910Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-23T21:42:21.1095031Z ·  ──────────────────────────────────────── 2026-10-23T21:42:21.1095123Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-23T21:42:21.1095173Z ╰──── 2026-10-23T21:42:21.1095426Z  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-23T21:42:21.1095432Z 2026-10-23T21:42:21.1095640Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-23T21:42:21.1095762Z ╭─[scripts/lib/cli-external-packages.test.ts:116:11] 2026-10-23T21:42:21.1095861Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-23T21:42:21.1095953Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-23T21:42:21.1096068Z ·  ──────────────────────────────────── 2026-10-23T21:42:21.1096128Z 117 │ }; 2026-10-23T21:42:21.1096175Z ╰──── 2026-10-23T21:42:21.1096423Z  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-23T21:42:21.1096425Z 2026-10-23T21:42:21.1096620Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.1096812Z ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14] 2026-10-23T21:42:21.1096890Z 26 │ const latestInput = useRef(input); 2026-10-23T21:42:21.1096965Z 27 │ latestInput.current = input; 2026-10-23T21:42:21.1097075Z ·  ─────┬─────────┬─── 2026-10-23T21:42:21.1097255Z · │ ╰── Cannot update ref value during render 2026-10-23T21:42:21.1097367Z · ╰── This value is a ref 2026-10-23T21:42:21.1097441Z 28 │ const mounted = useRef(true); 2026-10-23T21:42:21.1097491Z ╰──── 2026-10-23T21:42:21.1097947Z  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-23T21:42:21.1098225Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.1098229Z 2026-10-23T21:42:21.1098368Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.1098525Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:122:38] 2026-10-23T21:42:21.1098676Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-23T21:42:21.1098794Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-23T21:42:21.1098912Z ·  ───────────┬────────── 2026-10-23T21:42:21.1099084Z · ╰── Cannot access ref value during render 2026-10-23T21:42:21.1099201Z 123 │ const sessionRef = useRef(null); 2026-10-23T21:42:21.1099250Z ╰──── 2026-10-23T21:42:21.1099693Z  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-23T21:42:21.1099965Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.1099967Z 2026-10-23T21:42:21.1100105Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.1100261Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8] 2026-10-23T21:42:21.1100314Z 125 │ 2026-10-23T21:42:21.1100417Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T21:42:21.1100503Z ·  ─────────┬──────── 2026-10-23T21:42:21.1100650Z · ╰── Cannot access ref value during render 2026-10-23T21:42:21.1100751Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-23T21:42:21.1100801Z ╰──── 2026-10-23T21:42:21.1101247Z  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-23T21:42:21.1101573Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.1101604Z 2026-10-23T21:42:21.1101744Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.1101894Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7] 2026-10-23T21:42:21.1101945Z 125 │ 2026-10-23T21:42:21.1102048Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T21:42:21.1102134Z ·  ─────────┬───────── 2026-10-23T21:42:21.1102276Z · ╰── Cannot access ref value during render 2026-10-23T21:42:21.1102375Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-23T21:42:21.1102425Z ╰──── 2026-10-23T21:42:21.1102870Z  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-23T21:42:21.1103147Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.1103149Z 2026-10-23T21:42:21.1103295Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.1103476Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31] 2026-10-23T21:42:21.1103526Z 125 │ 2026-10-23T21:42:21.1103629Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T21:42:21.1103739Z ·  ─────────┬───────── 2026-10-23T21:42:21.1103906Z · ╰── Cannot access ref value during render 2026-10-23T21:42:21.1104004Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-23T21:42:21.1104054Z ╰──── 2026-10-23T21:42:21.1104491Z  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-23T21:42:21.1104763Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.1104765Z 2026-10-23T21:42:21.1104901Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.1105049Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30] 2026-10-23T21:42:21.1105099Z 125 │ 2026-10-23T21:42:21.1105248Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T21:42:21.1105400Z ·  ──────────┬───────── 2026-10-23T21:42:21.1105565Z · ╰── Cannot access ref value during render 2026-10-23T21:42:21.1105662Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-23T21:42:21.1105709Z ╰──── 2026-10-23T21:42:21.1106150Z  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-23T21:42:21.1106422Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.1106429Z 2026-10-23T21:42:21.1106568Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.1106717Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46] 2026-10-23T21:42:21.1106824Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T21:42:21.1107013Z 127 │ ╭─▶ const recorder = createLazyVoiceRecorder({ 2026-10-23T21:42:21.1107184Z 128 │ │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-23T21:42:21.1107307Z 129 │ │ onStatus: (status: RecordingStatus) => { 2026-10-23T21:42:21.1107453Z 130 │ │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-23T21:42:21.1107574Z 131 │ │ isFinished: status.isFinished, 2026-10-23T21:42:21.1107750Z 132 │ │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-23T21:42:21.1107852Z 133 │ │ error: status.error, 2026-10-23T21:42:21.1107946Z 134 │ │ url: status.url, 2026-10-23T21:42:21.1108025Z 135 │ │ }); 2026-10-23T21:42:21.1108100Z 136 │ │ }, 2026-10-23T21:42:21.1108287Z 137 │ │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-23T21:42:21.1108388Z 138 │ │ selectInput: (inputs) => { 2026-10-23T21:42:21.1108537Z 139 │ │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-23T21:42:21.1108685Z 140 │ │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-23T21:42:21.1108848Z 141 │ │ const known = microphoneOrder(preferences.value.microphones); 2026-10-23T21:42:21.1108981Z 142 │ │ const order = rememberMicrophones(known, inputs); 2026-10-23T21:42:21.1109078Z 143 │ │ if (order !== known) { 2026-10-23T21:42:21.1109212Z 144 │ │ registry.set(updateMobilePreferencesAtom, { 2026-10-23T21:42:21.1109323Z 145 │ │ transform: (current) => ({ 2026-10-23T21:42:21.1109518Z 146 │ │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-23T21:42:21.1109600Z 147 │ │ }), 2026-10-23T21:42:21.1109683Z 148 │ │ }); 2026-10-23T21:42:21.1109811Z 149 │ │ } 2026-10-23T21:42:21.1109972Z 150 │ │ return preferredMicrophoneInput(inputs, order); 2026-10-23T21:42:21.1110045Z 151 │ │ }, 2026-10-23T21:42:21.1110174Z 152 │ ├─▶ }); 2026-10-23T21:42:21.1110409Z · ╰──── Passing a ref to a function may read its value during render 2026-10-23T21:42:21.1110492Z 153 │ recorderRef.current = recorder; 2026-10-23T21:42:21.1110541Z ╰──── 2026-10-23T21:42:21.1110985Z  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-23T21:42:21.1111264Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.1111270Z 2026-10-23T21:42:21.1111407Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.1111559Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16] 2026-10-23T21:42:21.1111612Z 152 │ }); 2026-10-23T21:42:21.1111692Z 153 │ recorderRef.current = recorder; 2026-10-23T21:42:21.1111804Z ·  ─────┬─────────┬─── 2026-10-23T21:42:21.1111983Z · │ ╰── Cannot update ref value during render 2026-10-23T21:42:21.1112094Z · ╰── This value is a ref 2026-10-23T21:42:21.1112199Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-23T21:42:21.1112253Z ╰──── 2026-10-23T21:42:21.1112695Z  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-23T21:42:21.1112967Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.1112971Z 2026-10-23T21:42:21.1113106Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.1113268Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48] 2026-10-23T21:42:21.1113381Z 153 │ recorderRef.current = recorder; 2026-10-23T21:42:21.1113578Z 154 │ ╭─▶ sessionRef.current = new VoiceInputSession({ 2026-10-23T21:42:21.1113663Z 155 │ │ recorder, 2026-10-23T21:42:21.1113790Z 156 │ │ getTranscriber: getLocalVoiceTranscriber, 2026-10-23T21:42:21.1113902Z 157 │ │ requestPermission: async () => { 2026-10-23T21:42:21.1114060Z 158 │ │ const permission = await requestRecordingPermissionsAsync(); 2026-10-23T21:42:21.1114242Z 159 │ │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-23T21:42:21.1114317Z 160 │ │ }, 2026-10-23T21:42:21.1114453Z 161 │ │ configureRecording: configureVoiceRecordingAudio, 2026-10-23T21:42:21.1114584Z 162 │ │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-23T21:42:21.1114763Z 163 │ │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-23T21:42:21.1114903Z 164 │ │ onStateChange: (nextState) => 2026-10-23T21:42:21.1114991Z 165 │ │ setState({ 2026-10-23T21:42:21.1115093Z 166 │ │ state: nextState, 2026-10-23T21:42:21.1115224Z 167 │ │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-23T21:42:21.1115349Z 168 │ │ label: sessionRef.current?.label ?? null, 2026-10-23T21:42:21.1115427Z 169 │ │ }), 2026-10-23T21:42:21.1115555Z 170 │ ├─▶ }); 2026-10-23T21:42:21.1115754Z · ╰──── Cannot access ref value during render 2026-10-23T21:42:21.1115812Z 171 │ } 2026-10-23T21:42:21.1115862Z ╰──── 2026-10-23T21:42:21.1116305Z  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-23T21:42:21.1116578Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.1116581Z 2026-10-23T21:42:21.1116718Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.1116871Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15] 2026-10-23T21:42:21.1116952Z 153 │ recorderRef.current = recorder; 2026-10-23T21:42:21.1117056Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-23T21:42:21.1117165Z ·  ─────┬────────┬─── 2026-10-23T21:42:21.1117342Z · │ ╰── Cannot update ref value during render 2026-10-23T21:42:21.1117455Z · ╰── This value is a ref 2026-10-23T21:42:21.1117517Z 155 │ recorder, 2026-10-23T21:42:21.1117565Z ╰──── 2026-10-23T21:42:21.1118006Z  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-23T21:42:21.1118288Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.1118292Z 2026-10-23T21:42:21.1118430Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.1118583Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7] 2026-10-23T21:42:21.1118664Z 184 │ return () => subscription.remove(); 2026-10-23T21:42:21.1118728Z 185 │ }, [controller]); 2026-10-23T21:42:21.1118804Z ·  ─────┬──── 2026-10-23T21:42:21.1118946Z · ╰── Cannot access ref value during render 2026-10-23T21:42:21.1118997Z 186 │ 2026-10-23T21:42:21.1119047Z ╰──── 2026-10-23T21:42:21.1119541Z  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-23T21:42:21.1119844Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.1119846Z 2026-10-23T21:42:21.1119983Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.1120133Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6] 2026-10-23T21:42:21.1120217Z 184 │ return () => subscription.remove(); 2026-10-23T21:42:21.1120280Z 185 │ }, [controller]); 2026-10-23T21:42:21.1120354Z ·  ──────┬───── 2026-10-23T21:42:21.1120493Z · ╰── Cannot access ref value during render 2026-10-23T21:42:21.1120543Z 186 │ 2026-10-23T21:42:21.1120593Z ╰──── 2026-10-23T21:42:21.1121037Z  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-23T21:42:21.1121312Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.1121314Z 2026-10-23T21:42:21.1121451Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.1121600Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6] 2026-10-23T21:42:21.1121657Z 191 │ }, 2026-10-23T21:42:21.1121725Z 192 │ [controller, recorder], 2026-10-23T21:42:21.1121799Z ·  ─────┬──── 2026-10-23T21:42:21.1121947Z · ╰── Cannot access ref value during render 2026-10-23T21:42:21.1122001Z 193 │ ); 2026-10-23T21:42:21.1122049Z ╰──── 2026-10-23T21:42:21.1122485Z  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-23T21:42:21.1122756Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.1122758Z 2026-10-23T21:42:21.1122896Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.1123047Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20] 2026-10-23T21:42:21.1123138Z 174 │ const controller = session.controller; 2026-10-23T21:42:21.1123249Z 175 │ const recorder = recorderRef.current; 2026-10-23T21:42:21.1123354Z ·  ─────────┬───────── 2026-10-23T21:42:21.1123509Z · ╰── Cannot access ref value during render 2026-10-23T21:42:21.1123559Z 176 │ 2026-10-23T21:42:21.1123609Z ╰──── 2026-10-23T21:42:21.1124047Z  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-23T21:42:21.1124320Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.1124323Z 2026-10-23T21:42:21.1124515Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.1124695Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5] 2026-10-23T21:42:21.1124748Z 191 │ }, 2026-10-23T21:42:21.1125013Z 192 │ [controller, recorder], 2026-10-23T21:42:21.1125098Z ·  ───────────┬────────── 2026-10-23T21:42:21.1125243Z · ╰── Cannot access ref value during render 2026-10-23T21:42:21.1125295Z 193 │ ); 2026-10-23T21:42:21.1125343Z ╰──── 2026-10-23T21:42:21.1125780Z  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-23T21:42:21.1126056Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.1126061Z 2026-10-23T21:42:21.1126199Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.1126349Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20] 2026-10-23T21:42:21.1126436Z 245 │ return () => clearInterval(intervalId); 2026-10-23T21:42:21.1126540Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-23T21:42:21.1126625Z ·  ─────┬──── 2026-10-23T21:42:21.1126777Z · ╰── Cannot access ref value during render 2026-10-23T21:42:21.1126827Z 247 │ 2026-10-23T21:42:21.1126876Z ╰──── 2026-10-23T21:42:21.1127322Z  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-23T21:42:21.1127594Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.1127596Z 2026-10-23T21:42:21.1127733Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.1127881Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6] 2026-10-23T21:42:21.1127965Z 245 │ return () => clearInterval(intervalId); 2026-10-23T21:42:21.1128069Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-23T21:42:21.1128206Z ·  ────────────────────────┬─────────────────────── 2026-10-23T21:42:21.1128367Z · ╰── Cannot access ref value during render 2026-10-23T21:42:21.1128416Z 247 │ 2026-10-23T21:42:21.1128465Z ╰──── 2026-10-23T21:42:21.1128904Z  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-23T21:42:21.1129176Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.1129178Z 2026-10-23T21:42:21.1129316Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.1129532Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5] 2026-10-23T21:42:21.1129632Z 260 │ setOwnerFocused, 2026-10-23T21:42:21.1129690Z 261 │ session, 2026-10-23T21:42:21.1129759Z ·  ───┬─── 2026-10-23T21:42:21.1129891Z · ╰── Cannot access ref value during render 2026-10-23T21:42:21.1129948Z 262 │ stop, 2026-10-23T21:42:21.1129997Z ╰──── 2026-10-23T21:42:21.1130435Z  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-23T21:42:21.1130705Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.1130707Z 2026-10-23T21:42:21.1130850Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.1131002Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10] 2026-10-23T21:42:21.1131054Z 250 │ 2026-10-23T21:42:21.1131188Z 251 │ ╭─▶ return { 2026-10-23T21:42:21.1131388Z 252 │ │ isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null, 2026-10-23T21:42:21.1131472Z 253 │ │ state, 2026-10-23T21:42:21.1131561Z 254 │ │ audioLevels, 2026-10-23T21:42:21.1131650Z 255 │ │ elapsedSeconds, 2026-10-23T21:42:21.1131776Z 256 │ │ isBusy: voiceInputBlocksSubmission(state), 2026-10-23T21:42:21.1131857Z 257 │ │ ownerKey, 2026-10-23T21:42:21.1131938Z 258 │ │ label, 2026-10-23T21:42:21.1132026Z 259 │ │ focusedOwners, 2026-10-23T21:42:21.1132116Z 260 │ │ setOwnerFocused, 2026-10-23T21:42:21.1132195Z 261 │ │ session, 2026-10-23T21:42:21.1132270Z 262 │ │ stop, 2026-10-23T21:42:21.1132344Z 263 │ │ cancel, 2026-10-23T21:42:21.1132467Z 264 │ ├─▶ }; 2026-10-23T21:42:21.1132663Z · ╰──── Cannot access ref value during render 2026-10-23T21:42:21.1132715Z 265 │ } 2026-10-23T21:42:21.1132764Z ╰──── 2026-10-23T21:42:21.1133292Z  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-23T21:42:21.1133603Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.1133606Z 2026-10-23T21:42:21.1133756Z ⚠ react(immutability): This value cannot be modified 2026-10-23T21:42:21.1133906Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-23T21:42:21.1134057Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-23T21:42:21.1134179Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-23T21:42:21.1134260Z ·  ─────┬───── 2026-10-23T21:42:21.1134397Z · ╰── `audioLevels` originates here 2026-10-23T21:42:21.1134516Z 123 │ const sessionRef = useRef(null); 2026-10-23T21:42:21.1134659Z 124 │ const recorderRef = useRef | null>(null); 2026-10-23T21:42:21.1134710Z 125 │ 2026-10-23T21:42:21.1134816Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T21:42:21.1134911Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-23T21:42:21.1135044Z 128 │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-23T21:42:21.1135134Z 129 │ onStatus: (status: RecordingStatus) => { 2026-10-23T21:42:21.1135247Z 130 │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-23T21:42:21.1135329Z 131 │ isFinished: status.isFinished, 2026-10-23T21:42:21.1135474Z 132 │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-23T21:42:21.1135550Z 133 │ error: status.error, 2026-10-23T21:42:21.1135617Z 134 │ url: status.url, 2026-10-23T21:42:21.1135673Z 135 │ }); 2026-10-23T21:42:21.1135728Z 136 │ }, 2026-10-23T21:42:21.1135888Z 137 │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-23T21:42:21.1135962Z 138 │ selectInput: (inputs) => { 2026-10-23T21:42:21.1136078Z 139 │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-23T21:42:21.1136188Z 140 │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-23T21:42:21.1136314Z 141 │ const known = microphoneOrder(preferences.value.microphones); 2026-10-23T21:42:21.1136419Z 142 │ const order = rememberMicrophones(known, inputs); 2026-10-23T21:42:21.1136487Z 143 │ if (order !== known) { 2026-10-23T21:42:21.1136596Z 144 │ registry.set(updateMobilePreferencesAtom, { 2026-10-23T21:42:21.1136679Z 145 │ transform: (current) => ({ 2026-10-23T21:42:21.1136842Z 146 │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-23T21:42:21.1136900Z 147 │ }), 2026-10-23T21:42:21.1136958Z 148 │ }); 2026-10-23T21:42:21.1137012Z 149 │ } 2026-10-23T21:42:21.1137117Z 150 │ return preferredMicrophoneInput(inputs, order); 2026-10-23T21:42:21.1137172Z 151 │ }, 2026-10-23T21:42:21.1137226Z 152 │ }); 2026-10-23T21:42:21.1137305Z 153 │ recorderRef.current = recorder; 2026-10-23T21:42:21.1137403Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-23T21:42:21.1137461Z 155 │ recorder, 2026-10-23T21:42:21.1137558Z 156 │ getTranscriber: getLocalVoiceTranscriber, 2026-10-23T21:42:21.1137692Z 157 │ requestPermission: async () => { 2026-10-23T21:42:21.1137846Z 158 │ const permission = await requestRecordingPermissionsAsync(); 2026-10-23T21:42:21.1137993Z 159 │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-23T21:42:21.1138049Z 160 │ }, 2026-10-23T21:42:21.1138153Z 161 │ configureRecording: configureVoiceRecordingAudio, 2026-10-23T21:42:21.1138254Z 162 │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-23T21:42:21.1138352Z 163 │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-23T21:42:21.1138430Z 164 │ onStateChange: (nextState) => 2026-10-23T21:42:21.1138492Z 165 │ setState({ 2026-10-23T21:42:21.1138565Z 166 │ state: nextState, 2026-10-23T21:42:21.1138666Z 167 │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-23T21:42:21.1138767Z 168 │ label: sessionRef.current?.label ?? null, 2026-10-23T21:42:21.1138828Z 169 │ }), 2026-10-23T21:42:21.1138881Z 170 │ }); 2026-10-23T21:42:21.1138933Z 171 │ } 2026-10-23T21:42:21.1138987Z 172 │ 2026-10-23T21:42:21.1139070Z 173 │ const session = sessionRef.current; 2026-10-23T21:42:21.1139154Z 174 │ const controller = session.controller; 2026-10-23T21:42:21.1139236Z 175 │ const recorder = recorderRef.current; 2026-10-23T21:42:21.1139289Z 176 │ 2026-10-23T21:42:21.1139354Z 177 │ useEffect(() => { 2026-10-23T21:42:21.1139495Z 178 │ const subscription = AppState.addEventListener("change", (nextState) => { 2026-10-23T21:42:21.1139628Z 179 │ // iOS reports `inactive` while its permission dialog is open. Only the 2026-10-23T21:42:21.1139761Z 180 │ // real background state cancels preparation; recorder status handles 2026-10-23T21:42:21.1139865Z 181 │ // calls and route interruptions during capture. 2026-10-23T21:42:21.1139995Z 182 │ if (nextState === "background") controller.appMovedToBackground(); 2026-10-23T21:42:21.1140048Z 183 │ }); 2026-10-23T21:42:21.1140132Z 184 │ return () => subscription.remove(); 2026-10-23T21:42:21.1140194Z 185 │ }, [controller]); 2026-10-23T21:42:21.1140242Z 186 │ 2026-10-23T21:42:21.1140302Z 187 │ useEffect( 2026-10-23T21:42:21.1140362Z 188 │ () => () => { 2026-10-23T21:42:21.1140430Z 189 │ controller.dispose(); 2026-10-23T21:42:21.1140494Z 190 │ recorder.release(); 2026-10-23T21:42:21.1140548Z 191 │ }, 2026-10-23T21:42:21.1140616Z 192 │ [controller, recorder], 2026-10-23T21:42:21.1140666Z 193 │ ); 2026-10-23T21:42:21.1140716Z 194 │ 2026-10-23T21:42:21.1140777Z 195 │ useEffect(() => { 2026-10-23T21:42:21.1140875Z 196 │ if (state.phase !== "recording") return; 2026-10-23T21:42:21.1140926Z 197 │ 2026-10-23T21:42:21.1141070Z 198 │ const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`; 2026-10-23T21:42:21.1141171Z 199 │ const activation = activateKeepAwakeAsync(tag); 2026-10-23T21:42:21.1141249Z 200 │ void activation.catch(() => {}); 2026-10-23T21:42:21.1141308Z 201 │ return () => { 2026-10-23T21:42:21.1141452Z 202 │ // Release after activation settles, even if the recording ends immediately. 2026-10-23T21:42:21.1141584Z 203 │ void activation.then(() => deactivateKeepAwake(tag)).catch(() => {}); 2026-10-23T21:42:21.1141637Z 204 │ }; 2026-10-23T21:42:21.1141712Z 205 │ }, [keepAwakeId, state.phase]); 2026-10-23T21:42:21.1141761Z 206 │ 2026-10-23T21:42:21.1141823Z 207 │ useEffect(() => { 2026-10-23T21:42:21.1142009Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-23T21:42:21.1142087Z 209 │ 2026-10-23T21:42:21.1142203Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-23T21:42:21.1142352Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-23T21:42:21.1142451Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-23T21:42:21.1142526Z ·  ─────┬───── 2026-10-23T21:42:21.1142668Z · ╰── `audioLevels` cannot be modified 2026-10-23T21:42:21.1142720Z 213 │ } 2026-10-23T21:42:21.1142770Z ╰──── 2026-10-23T21:42:21.1143028Z  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-23T21:42:21.1143374Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T21:42:21.1143380Z 2026-10-23T21:42:21.1143577Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T21:42:21.1143729Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-23T21:42:21.1143778Z 206 │ 2026-10-23T21:42:21.1143842Z 207 │ useEffect(() => { 2026-10-23T21:42:21.1143918Z ·  ───┬─── 2026-10-23T21:42:21.1144131Z · ╰── This function may (indirectly) reassign or modify `audioLevels` after render 2026-10-23T21:42:21.1144259Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-23T21:42:21.1144309Z 209 │ 2026-10-23T21:42:21.1144425Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-23T21:42:21.1144577Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-23T21:42:21.1144675Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-23T21:42:21.1144750Z ·  ─────┬───── 2026-10-23T21:42:21.1144880Z · ╰── This modifies `audioLevels` 2026-10-23T21:42:21.1144932Z 213 │ } 2026-10-23T21:42:21.1144981Z ╰──── 2026-10-23T21:42:21.1145306Z  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-23T21:42:21.1145596Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T21:42:21.1145599Z 2026-10-23T21:42:21.1145754Z ⚠ react(immutability): This value cannot be modified 2026-10-23T21:42:21.1145916Z ╭─[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5] 2026-10-23T21:42:21.1146016Z 65 │ const [expanded, setExpanded] = useState(false); 2026-10-23T21:42:21.1146099Z 66 │ const progress = useSharedValue(0); 2026-10-23T21:42:21.1146172Z ·  ────┬─── 2026-10-23T21:42:21.1146304Z · ╰── `progress` originates here 2026-10-23T21:42:21.1146367Z 67 │ useEffect(() => { 2026-10-23T21:42:21.1146488Z 68 │ progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING); 2026-10-23T21:42:21.1146557Z ·  ────┬─── 2026-10-23T21:42:21.1146690Z · ╰── `progress` cannot be modified 2026-10-23T21:42:21.1146757Z 69 │ }, [expanded, progress]); 2026-10-23T21:42:21.1146858Z ╰──── 2026-10-23T21:42:21.1147134Z  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-23T21:42:21.1147424Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T21:42:21.1147426Z 2026-10-23T21:42:21.1147576Z ⚠ eslint(no-new): Do not use 'new' for side effects. 2026-10-23T21:42:21.1147700Z ╭─[apps/server/src/mcp/McpToolAccess.test.ts:168:3] 2026-10-23T21:42:21.1147812Z 167 │ // @ts-expect-error a declaration constructed directly 2026-10-23T21:42:21.1147905Z 168 │ new McpToolAccess.Declaration(unchecked); 2026-10-23T21:42:21.1148000Z ·  ───────────────────────────── 2026-10-23T21:42:21.1148128Z 169 │ // @ts-expect-error a handlers layer built outside McpToolAccess 2026-10-23T21:42:21.1148180Z ╰──── 2026-10-23T21:42:21.1148331Z  help: Assign the result of 'new' to a variable or compare it to a reference. 2026-10-23T21:42:21.1148333Z 2026-10-23T21:42:21.1148481Z ⚠ react(immutability): This value cannot be modified 2026-10-23T21:42:21.1148644Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5] 2026-10-23T21:42:21.1148697Z 90 │ }) { 2026-10-23T21:42:21.1148806Z 91 │ const rotation = useSharedValue(props.hidden ? 1 : 0); 2026-10-23T21:42:21.1148877Z ·  ────┬─── 2026-10-23T21:42:21.1149006Z · ╰── `rotation` originates here 2026-10-23T21:42:21.1149073Z 92 │ useLayoutEffect(() => { 2026-10-23T21:42:21.1149213Z 93 │ rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING); 2026-10-23T21:42:21.1149282Z ·  ────┬─── 2026-10-23T21:42:21.1149411Z · ╰── `rotation` cannot be modified 2026-10-23T21:42:21.1149485Z 94 │ }, [props.hidden, rotation]); 2026-10-23T21:42:21.1149535Z ╰──── 2026-10-23T21:42:21.1149786Z  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-23T21:42:21.1150075Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T21:42:21.1150078Z 2026-10-23T21:42:21.1150229Z ⚠ react(immutability): This value cannot be modified 2026-10-23T21:42:21.1150430Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:269:5] 2026-10-23T21:42:21.1150523Z 266 │ const variant = props.variant ?? "plain"; 2026-10-23T21:42:21.1150646Z 267 │ const loadingVisibility = useSharedValue(props.loading ? 1 : 0); 2026-10-23T21:42:21.1150731Z ·  ────────┬──────── 2026-10-23T21:42:21.1150875Z · ╰── `loadingVisibility` originates here 2026-10-23T21:42:21.1150943Z 268 │ useLayoutEffect(() => { 2026-10-23T21:42:21.1151090Z 269 │ loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING); 2026-10-23T21:42:21.1151172Z ·  ────────┬──────── 2026-10-23T21:42:21.1151317Z · ╰── `loadingVisibility` cannot be modified 2026-10-23T21:42:21.1151404Z 270 │ }, [loadingVisibility, props.loading]); 2026-10-23T21:42:21.1151455Z ╰──── 2026-10-23T21:42:21.1151753Z  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-23T21:42:21.1152154Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T21:42:21.1152156Z 2026-10-23T21:42:21.1152304Z ⚠ react(immutability): This value cannot be modified 2026-10-23T21:42:21.1152465Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:328:5] 2026-10-23T21:42:21.1152520Z 325 │ }) { 2026-10-23T21:42:21.1152697Z 326 │ const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0); 2026-10-23T21:42:21.1152782Z ·  ─────────┬───────── 2026-10-23T21:42:21.1152933Z · ╰── `recordingVisibility` originates here 2026-10-23T21:42:21.1153002Z 327 │ useLayoutEffect(() => { 2026-10-23T21:42:21.1153182Z 328 │ recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING); 2026-10-23T21:42:21.1153279Z ·  ─────────┬───────── 2026-10-23T21:42:21.1153463Z · ╰── `recordingVisibility` cannot be modified 2026-10-23T21:42:21.1153549Z 329 │ }, [props.phase, recordingVisibility]); 2026-10-23T21:42:21.1153599Z ╰──── 2026-10-23T21:42:21.1153849Z  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-23T21:42:21.1154162Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T21:42:21.1154170Z 2026-10-23T21:42:21.1154311Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.1154465Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39] 2026-10-23T21:42:21.1154520Z 276 │ 2026-10-23T21:42:21.1154699Z 277 │ ╭─▶ return createElement(RawNativeView, { 2026-10-23T21:42:21.1154789Z 278 │ │ ...nativeProps, 2026-10-23T21:42:21.1154928Z 279 │ │ refreshEnabled: props.onPullToRefresh !== undefined, 2026-10-23T21:42:21.1155018Z 280 │ │ ref: nativeRef, 2026-10-23T21:42:21.1155147Z 281 │ ├─▶ }); 2026-10-23T21:42:21.1155467Z · ╰──── Passing a ref to a function may read its value during render 2026-10-23T21:42:21.1155523Z 282 │ } 2026-10-23T21:42:21.1155580Z ╰──── 2026-10-23T21:42:21.1156030Z  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-23T21:42:21.1156306Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.1156309Z 2026-10-23T21:42:21.1156551Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T21:42:21.1156679Z ╭─[packages/provider-grok/src/server/adapter.ts:408:7] 2026-10-23T21:42:21.1156787Z 407 │ 2026-10-23T21:42:21.1156889Z 408 │ const layer: Layer.Layer< 2026-10-23T21:42:21.1156956Z ·  ──┬── 2026-10-23T21:42:21.1157081Z · ╰── 'layer' is declared here 2026-10-23T21:42:21.1157172Z 409 │ ProviderAdapter.ProviderAdapterV2, 2026-10-23T21:42:21.1157225Z ╰──── 2026-10-23T21:42:21.1157325Z  help: Consider removing this declaration. 2026-10-23T21:42:21.1157328Z 2026-10-23T21:42:21.1157523Z ⚠ eslint(no-unused-vars): Identifier 'identity' is imported but never used. 2026-10-23T21:42:21.1157623Z ╭─[apps/server/src/auth/http.ts:28:10] 2026-10-23T21:42:21.1157708Z 27 │ import * as Schema from "effect/Schema"; 2026-10-23T21:42:21.1157798Z 28 │ import { identity } from "effect/Function"; 2026-10-23T21:42:21.1157879Z ·  ────┬─── 2026-10-23T21:42:21.1158016Z · ╰── 'identity' is imported here 2026-10-23T21:42:21.1158099Z 29 │ import * as Layer from "effect/Layer"; 2026-10-23T21:42:21.1158147Z ╰──── 2026-10-23T21:42:21.1158246Z  help: Consider removing this import. 2026-10-23T21:42:21.1158248Z 2026-10-23T21:42:21.1158602Z ⚠ 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-23T21:42:21.1158726Z ╭─[apps/server/src/auth/RpcAuthorization.ts:236:17] 2026-10-23T21:42:21.1158855Z 235 │ const requiredScopesForSettingsUpdate = (payload: unknown) => { 2026-10-23T21:42:21.1159006Z 236 │ const input = Schema.decodeUnknownSync(SettingsUpdate)(payload); 2026-10-23T21:42:21.1159116Z ·  ──────────────────────── 2026-10-23T21:42:21.1159249Z 237 │ const scopes = requiredScopesForServerSettingsPatch(input.patch); 2026-10-23T21:42:21.1159298Z ╰──── 2026-10-23T21:42:21.1159301Z 2026-10-23T21:42:21.1159644Z ⚠ 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-23T21:42:21.1159762Z ╭─[apps/server/src/auth/RpcAuthorization.ts:255:26] 2026-10-23T21:42:21.1159859Z 254 │ if (method === WS_METHODS.assetsCreateUrl) { 2026-10-23T21:42:21.1160007Z 255 │ const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload); 2026-10-23T21:42:21.1160118Z ·  ──────────────────────── 2026-10-23T21:42:21.1160178Z 256 │ return [ 2026-10-23T21:42:21.1160227Z ╰──── 2026-10-23T21:42:21.1160342Z 2026-10-23T21:42:21.1160644Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-23T21:42:21.1160806Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:387:19] 2026-10-23T21:42:21.1160866Z 386 │ onFilters, 2026-10-23T21:42:21.1160934Z 387 │ authorOptions = [], 2026-10-23T21:42:21.1161008Z ·  ── 2026-10-23T21:42:21.1161072Z 388 │ labelOptions = [], 2026-10-23T21:42:21.1161124Z ╰──── 2026-10-23T21:42:21.1161432Z  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-23T21:42:21.1161434Z 2026-10-23T21:42:21.1161707Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-23T21:42:21.1161871Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:388:18] 2026-10-23T21:42:21.1161937Z 387 │ authorOptions = [], 2026-10-23T21:42:21.1162002Z 388 │ labelOptions = [], 2026-10-23T21:42:21.1162077Z ·  ── 2026-10-23T21:42:21.1162131Z 389 │ host, 2026-10-23T21:42:21.1162181Z ╰──── 2026-10-23T21:42:21.1162482Z  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-23T21:42:21.1162485Z 2026-10-23T21:42:21.1162660Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T21:42:21.1162842Z ╭─[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:116:34] 2026-10-23T21:42:21.1162909Z 115 │ return [...commands]; 2026-10-23T21:42:21.1163036Z 116 │ }, [activeThreadRef, pathname, registrationVersion, navigation]); 2026-10-23T21:42:21.1163169Z ·  ─────────┬───────── 2026-10-23T21:42:21.1163416Z · ╰── Unnecessary dependency `registrationVersion` 2026-10-23T21:42:21.1163467Z 117 │ 2026-10-23T21:42:21.1163519Z ╰──── 2026-10-23T21:42:21.1163819Z  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-23T21:42:21.1164119Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.1164127Z 2026-10-23T21:42:21.1164374Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T21:42:21.1164607Z ╭─[apps/server/src/orchestration-v2/ThreadPullRequestService.ts:413:7] 2026-10-23T21:42:21.1164661Z 412 │ 2026-10-23T21:42:21.1164825Z 413 │ const layer = Layer.effect(ThreadPullRequestServiceV2, make); 2026-10-23T21:42:21.1164892Z ·  ──┬── 2026-10-23T21:42:21.1165019Z · ╰── 'layer' is declared here 2026-10-23T21:42:21.1165070Z ╰──── 2026-10-23T21:42:21.1165169Z  help: Consider removing this declaration. 2026-10-23T21:42:21.1165172Z 2026-10-23T21:42:21.1165673Z ⚠ 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-23T21:42:21.1165846Z ╭─[packages/effect-acp/src/protocol.test.ts:500:31] 2026-10-23T21:42:21.1165897Z 499 │ 2026-10-23T21:42:21.1166008Z 500 │ const response = yield* Schema.decodeUnknownEffect( 2026-10-23T21:42:21.1166130Z ·  ────────────────────────── 2026-10-23T21:42:21.1166236Z 501 │ Schema.fromJsonString(JsonRpcErrorResponse), 2026-10-23T21:42:21.1166286Z ╰──── 2026-10-23T21:42:21.1166289Z 2026-10-23T21:42:21.1166540Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T21:42:21.1166704Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:643:5] 2026-10-23T21:42:21.1166761Z 638 │ 2026-10-23T21:42:21.1166830Z 639 │ useEffect(() => { 2026-10-23T21:42:21.1166898Z ·  ────┬──── 2026-10-23T21:42:21.1167027Z · ╰── This is the containing effect 2026-10-23T21:42:21.1167131Z 640 │ if (pendingLaunchEntry.key === launchTargetKey) { 2026-10-23T21:42:21.1167192Z 641 │ return; 2026-10-23T21:42:21.1167246Z 642 │ } 2026-10-23T21:42:21.1167319Z 643 │ setPendingLaunchEntry({ 2026-10-23T21:42:21.1167404Z ·  ──────────┬────────── 2026-10-23T21:42:21.1167574Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.1167644Z 644 │ key: launchTargetKey, 2026-10-23T21:42:21.1167695Z ╰──── 2026-10-23T21:42:21.1168296Z  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-23T21:42:21.1168609Z  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-23T21:42:21.1168612Z 2026-10-23T21:42:21.1168859Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T21:42:21.1169021Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5] 2026-10-23T21:42:21.1169072Z 648 │ 2026-10-23T21:42:21.1169134Z 649 │ useEffect(() => { 2026-10-23T21:42:21.1169204Z ·  ────┬──── 2026-10-23T21:42:21.1169374Z · ╰── This is the containing effect 2026-10-23T21:42:21.1169490Z 650 │ if (initialAttachGridEntry.key === launchTargetKey) { 2026-10-23T21:42:21.1169548Z 651 │ return; 2026-10-23T21:42:21.1169602Z 652 │ } 2026-10-23T21:42:21.1169679Z 653 │ setInitialAttachGridEntry({ 2026-10-23T21:42:21.1169771Z ·  ────────────┬──────────── 2026-10-23T21:42:21.1169939Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.1170009Z 654 │ key: launchTargetKey, 2026-10-23T21:42:21.1170060Z ╰──── 2026-10-23T21:42:21.1170696Z  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-23T21:42:21.1171030Z  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-23T21:42:21.1171032Z 2026-10-23T21:42:21.1171278Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T21:42:21.1171441Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7] 2026-10-23T21:42:21.1171493Z 743 │ 2026-10-23T21:42:21.1171556Z 744 │ useEffect(() => { 2026-10-23T21:42:21.1171624Z ·  ────┬──── 2026-10-23T21:42:21.1171748Z · ╰── This is the containing effect 2026-10-23T21:42:21.1171851Z 745 │ if (!routeEnvironmentId || !routeThreadId) { 2026-10-23T21:42:21.1171919Z 746 │ setLastGridSize({ 2026-10-23T21:42:21.1172000Z ·  ───────┬─────── 2026-10-23T21:42:21.1172164Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.1172244Z 747 │ cols: DEFAULT_TERMINAL_COLS, 2026-10-23T21:42:21.1172294Z ╰──── 2026-10-23T21:42:21.1172880Z  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-23T21:42:21.1173190Z  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-23T21:42:21.1173194Z 2026-10-23T21:42:21.1173477Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T21:42:21.1173640Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24] 2026-10-23T21:42:21.1173695Z 537 │ }); 2026-10-23T21:42:21.1173869Z 538 │ }, [terminal.buffer, terminal.buffer.length, terminalKey]); 2026-10-23T21:42:21.1173980Z ·  ───────────┬────────── 2026-10-23T21:42:21.1174218Z · ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead 2026-10-23T21:42:21.1174374Z 539 │ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null; 2026-10-23T21:42:21.1174422Z ╰──── 2026-10-23T21:42:21.1174706Z  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-23T21:42:21.1175003Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.1175006Z 2026-10-23T21:42:21.1175199Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T21:42:21.1175357Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7] 2026-10-23T21:42:21.1175452Z 708 │ sentInitialInputKeyRef.current = null; 2026-10-23T21:42:21.1175515Z 709 │ }, [terminalKey]); 2026-10-23T21:42:21.1175590Z ·  ─────┬───── 2026-10-23T21:42:21.1175777Z · ╰── Unnecessary dependency `terminalKey` 2026-10-23T21:42:21.1175877Z 710 │ 2026-10-23T21:42:21.1175928Z ╰──── 2026-10-23T21:42:21.1176203Z  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-23T21:42:21.1176493Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.1176497Z 2026-10-23T21:42:21.1176685Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T21:42:21.1176848Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52] 2026-10-23T21:42:21.1176904Z 799 │ }; 2026-10-23T21:42:21.1177081Z 800 │ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]); 2026-10-23T21:42:21.1177261Z ·  ────────────┬──────────── ─────┬───── 2026-10-23T21:42:21.1177485Z · │ ╰── Unnecessary dependency `terminalKey` 2026-10-23T21:42:21.1177688Z · ╰── Unnecessary dependency `terminal.lifecycleVersion` 2026-10-23T21:42:21.1177741Z 801 │ 2026-10-23T21:42:21.1177789Z ╰──── 2026-10-23T21:42:21.1178066Z  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-23T21:42:21.1178361Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.1178367Z 2026-10-23T21:42:21.1178506Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.1178668Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24] 2026-10-23T21:42:21.1178718Z 792 │ } 2026-10-23T21:42:21.1178822Z 793 │ const pasteSession = pasteSessionRef.current; 2026-10-23T21:42:21.1178934Z ·  ───────────┬─────────── 2026-10-23T21:42:21.1179095Z · ╰── Cannot access ref value during render 2026-10-23T21:42:21.1179146Z 794 │ 2026-10-23T21:42:21.1179195Z ╰──── 2026-10-23T21:42:21.1179643Z  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-23T21:42:21.1179920Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.1179923Z 2026-10-23T21:42:21.1180277Z ⚠ 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-23T21:42:21.1180389Z ╭─[packages/effect-acp/src/client.ts:1269:11] 2026-10-23T21:42:21.1180534Z 1268 │ extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) => 2026-10-23T21:42:21.1180743Z 1269 │ Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe( 2026-10-23T21:42:21.1180880Z ·  ────────────────────────── 2026-10-23T21:42:21.1181017Z 1270 │ Effect.mapError(() => AcpError.AcpRequestError.invalidParams()), 2026-10-23T21:42:21.1181070Z ╰──── 2026-10-23T21:42:21.1181073Z 2026-10-23T21:42:21.1181390Z ⚠ 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-23T21:42:21.1181503Z ╭─[packages/effect-acp/src/schema.test.ts:18:12] 2026-10-23T21:42:21.1181657Z 17 │ const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } }; 2026-10-23T21:42:21.1181775Z 18 │ expect(Schema.is(V1.AvailableCommand)(command)).toBe(true); 2026-10-23T21:42:21.1181852Z ·  ───────── 2026-10-23T21:42:21.1181910Z 19 │ expect( 2026-10-23T21:42:21.1181964Z ╰──── 2026-10-23T21:42:21.1181969Z 2026-10-23T21:42:21.1182285Z ⚠ 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-23T21:42:21.1182396Z ╭─[packages/effect-acp/src/schema.test.ts:20:7] 2026-10-23T21:42:21.1182454Z 19 │ expect( 2026-10-23T21:42:21.1182615Z 20 │ Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }), 2026-10-23T21:42:21.1182688Z ·  ───────── 2026-10-23T21:42:21.1182750Z 21 │ ).toBe(true); 2026-10-23T21:42:21.1182802Z ╰──── 2026-10-23T21:42:21.1182804Z 2026-10-23T21:42:21.1182994Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T21:42:21.1183160Z ╭─[apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx:814:17] 2026-10-23T21:42:21.1183236Z 813 │
    { 2026-10-23T21:42:21.1186130Z 201 │ terminalDebugLog("native:surface", { 2026-10-23T21:42:21.1186214Z 202 │ terminalKey: props.terminalKey, 2026-10-23T21:42:21.1186287Z 203 │ native: hasNativeSurface, 2026-10-23T21:42:21.1186413Z 204 │ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(), 2026-10-23T21:42:21.1186496Z 205 │ bufferLen: props.buffer.length, 2026-10-23T21:42:21.1186571Z 206 │ isRunning: props.isRunning, 2026-10-23T21:42:21.1186631Z 207 │ }); 2026-10-23T21:42:21.1186787Z 208 │ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]); 2026-10-23T21:42:21.1186872Z 209 │ const handleNativeInput = useCallback( 2026-10-23T21:42:21.1186982Z 210 │ (event: NativeSyntheticEvent) => { 2026-10-23T21:42:21.1187076Z 211 │ if (!props.isRunning || props.readOnly) { 2026-10-23T21:42:21.1187138Z 212 │ return; 2026-10-23T21:42:21.1187192Z 213 │ } 2026-10-23T21:42:21.1187277Z 214 │ terminalDebugLog("native:onInput", { 2026-10-23T21:42:21.1187421Z 215 │ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)), 2026-10-23T21:42:21.1187479Z 216 │ }); 2026-10-23T21:42:21.1187563Z 217 │ onInput(event.nativeEvent.data); 2026-10-23T21:42:21.1187615Z 218 │ }, 2026-10-23T21:42:21.1187717Z 219 │ [onInput, props.isRunning, props.readOnly], 2026-10-23T21:42:21.1187771Z 220 │ ); 2026-10-23T21:42:21.1187857Z 221 │ const handleNativeResize = useCallback( 2026-10-23T21:42:21.1187965Z 222 │ (event: NativeSyntheticEvent) => { 2026-10-23T21:42:21.1188026Z 223 │ onResize({ 2026-10-23T21:42:21.1188109Z 224 │ cols: event.nativeEvent.cols, 2026-10-23T21:42:21.1188191Z 225 │ rows: event.nativeEvent.rows, 2026-10-23T21:42:21.1188246Z 226 │ }); 2026-10-23T21:42:21.1188299Z 227 │ }, 2026-10-23T21:42:21.1188360Z 228 │ [onResize], 2026-10-23T21:42:21.1188410Z 229 │ ); 2026-10-23T21:42:21.1188461Z 230 │ 2026-10-23T21:42:21.1188544Z 231 │ if (NativeTerminalSurfaceView) { 2026-10-23T21:42:21.1188603Z 232 │ return ( 2026-10-23T21:42:21.1188676Z 233 │ 2026-10-23T21:42:21.1188811Z 234 │ ({ key: input.targetKey, location: candidate })); 2026-10-23T21:42:21.1190428Z 113 │ useEffect(() => { 2026-10-23T21:42:21.1190499Z ·  ────┬──── 2026-10-23T21:42:21.1190629Z · ╰── This is the containing effect 2026-10-23T21:42:21.1190787Z 114 │ if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) { 2026-10-23T21:42:21.1190846Z 115 │ return; 2026-10-23T21:42:21.1190902Z 116 │ } 2026-10-23T21:42:21.1191013Z 117 │ setEntry({ key: input.targetKey, location: candidate }); 2026-10-23T21:42:21.1191087Z ·  ────┬─── 2026-10-23T21:42:21.1191258Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.1191379Z 118 │ }, [candidate, entry.key, entry.location, input.targetKey]); 2026-10-23T21:42:21.1191428Z ╰──── 2026-10-23T21:42:21.1192005Z  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-23T21:42:21.1192316Z  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-23T21:42:21.1192319Z 2026-10-23T21:42:21.1192508Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T21:42:21.1192665Z ╭─[apps/mobile/src/features/terminal/TerminalContextSheet.tsx:72:15] 2026-10-23T21:42:21.1192731Z 71 │ { 2026-10-23T21:42:21.1195685Z ·  ────┬──── 2026-10-23T21:42:21.1195818Z · ╰── This is the containing effect 2026-10-23T21:42:21.1195935Z 30 │ if (snapshot && snapshot !== live) setHeld({ key, snapshot }); 2026-10-23T21:42:21.1196039Z ·  ───┬─── 2026-10-23T21:42:21.1196226Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.1196295Z 31 │ }, [key, live, snapshot]); 2026-10-23T21:42:21.1196344Z ╰──── 2026-10-23T21:42:21.1196924Z  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-23T21:42:21.1197236Z  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-23T21:42:21.1197239Z 2026-10-23T21:42:21.1197501Z ⚠ eslint(no-unused-vars): Variable 'layerDaemon' is declared but never used. Unused variables should start with a '_'. 2026-10-23T21:42:21.1197637Z ╭─[apps/server/src/orchestration-v2/EffectWorker.ts:914:7] 2026-10-23T21:42:21.1197686Z 913 │ 2026-10-23T21:42:21.1197868Z 914 │ const layerDaemon: Layer.Layer = Layer.effectDiscard( 2026-10-23T21:42:21.1197943Z ·  ─────┬───── 2026-10-23T21:42:21.1198081Z · ╰── 'layerDaemon' is declared here 2026-10-23T21:42:21.1198169Z 915 │ runDaemon.pipe(Effect.forkScoped), 2026-10-23T21:42:21.1198220Z ╰──── 2026-10-23T21:42:21.1198322Z  help: Consider removing this declaration. 2026-10-23T21:42:21.1198325Z 2026-10-23T21:42:21.1198477Z ⚠ react(immutability): This value cannot be modified 2026-10-23T21:42:21.1198632Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:42:5] 2026-10-23T21:42:21.1198683Z 35 │ 2026-10-23T21:42:21.1198815Z 36 │ const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0); 2026-10-23T21:42:21.1198900Z ·  ────────┬──────── 2026-10-23T21:42:21.1199046Z · ╰── `inspectorProgress` originates here 2026-10-23T21:42:21.1199136Z 37 │ const { renderedInspectorWidth } = props; 2026-10-23T21:42:21.1199269Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-23T21:42:21.1199323Z 39 │ 2026-10-23T21:42:21.1199399Z 40 │ const onClosed = props.onClosed; 2026-10-23T21:42:21.1199462Z 41 │ useEffect(() => { 2026-10-23T21:42:21.1199548Z 42 │ inspectorProgress.value = withTiming( 2026-10-23T21:42:21.1199627Z ·  ────────┬──────── 2026-10-23T21:42:21.1199768Z · ╰── `inspectorProgress` cannot be modified 2026-10-23T21:42:21.1199845Z 43 │ inspectorVisible ? 1 : 0, 2026-10-23T21:42:21.1199897Z ╰──── 2026-10-23T21:42:21.1200150Z  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-23T21:42:21.1200493Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T21:42:21.1200527Z 2026-10-23T21:42:21.1200678Z ⚠ react(immutability): This value cannot be modified 2026-10-23T21:42:21.1200830Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:67:7] 2026-10-23T21:42:21.1200919Z 37 │ const { renderedInspectorWidth } = props; 2026-10-23T21:42:21.1201044Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-23T21:42:21.1201133Z ·  ──────────┬───────── 2026-10-23T21:42:21.1201283Z · ╰── `renderedContentWidth` originates here 2026-10-23T21:42:21.1201333Z 39 │ 2026-10-23T21:42:21.1201410Z 40 │ const onClosed = props.onClosed; 2026-10-23T21:42:21.1201470Z 41 │ useEffect(() => { 2026-10-23T21:42:21.1201562Z 42 │ inspectorProgress.value = withTiming( 2026-10-23T21:42:21.1201639Z 43 │ inspectorVisible ? 1 : 0, 2026-10-23T21:42:21.1201706Z 44 │ WORKSPACE_PANE_TIMING, 2026-10-23T21:42:21.1201769Z 45 │ (finished) => { 2026-10-23T21:42:21.1201903Z 46 │ if (finished === true && !inspectorVisible && onClosed !== undefined) { 2026-10-23T21:42:21.1201973Z 47 │ runOnJS(onClosed)(); 2026-10-23T21:42:21.1202027Z 48 │ } 2026-10-23T21:42:21.1202081Z 49 │ }, 2026-10-23T21:42:21.1202133Z 50 │ ); 2026-10-23T21:42:21.1202260Z 51 │ const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0; 2026-10-23T21:42:21.1202335Z 52 │ renderedInspectorWidth.set( 2026-10-23T21:42:21.1202474Z 53 │ resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING), 2026-10-23T21:42:21.1202525Z 54 │ ); 2026-10-23T21:42:21.1202576Z 55 │ }, [ 2026-10-23T21:42:21.1202647Z 56 │ inspectorProgress, 2026-10-23T21:42:21.1202713Z 57 │ inspectorVisible, 2026-10-23T21:42:21.1202773Z 58 │ inspectorWidth, 2026-10-23T21:42:21.1202830Z 59 │ onClosed, 2026-10-23T21:42:21.1202898Z 60 │ renderedInspectorWidth, 2026-10-23T21:42:21.1202955Z 61 │ resizing, 2026-10-23T21:42:21.1203006Z 62 │ ]); 2026-10-23T21:42:21.1203059Z 63 │ 2026-10-23T21:42:21.1203119Z 64 │ useEffect(() => { 2026-10-23T21:42:21.1203247Z 65 │ const targetWidth = inspectorWidth ?? 0; 2026-10-23T21:42:21.1203330Z 66 │ if (!inspectorVisible || resizing) { 2026-10-23T21:42:21.1203424Z 67 │ renderedContentWidth.value = targetWidth; 2026-10-23T21:42:21.1203511Z ·  ──────────┬───────── 2026-10-23T21:42:21.1203669Z · ╰── `renderedContentWidth` cannot be modified 2026-10-23T21:42:21.1203780Z 68 │ return; 2026-10-23T21:42:21.1203860Z ╰──── 2026-10-23T21:42:21.1204111Z  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-23T21:42:21.1204402Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T21:42:21.1204405Z 2026-10-23T21:42:21.1204602Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T21:42:21.1204758Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:215:7] 2026-10-23T21:42:21.1204973Z 214 │ } 2026-10-23T21:42:21.1205039Z 215 │ }, [wrappedRender]); 2026-10-23T21:42:21.1205117Z ·  ──────┬────── 2026-10-23T21:42:21.1205271Z · ╰── Unnecessary dependency `wrappedRender` 2026-10-23T21:42:21.1205324Z 216 │ 2026-10-23T21:42:21.1205373Z ╰──── 2026-10-23T21:42:21.1205658Z  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-23T21:42:21.1205954Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.1205957Z 2026-10-23T21:42:21.1206186Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-23T21:42:21.1206344Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:817:35] 2026-10-23T21:42:21.1206399Z 816 │ > 2026-10-23T21:42:21.1206513Z 817 │ 2026-10-23T21:42:21.1206630Z ·  ──────────────────── 2026-10-23T21:42:21.1206720Z 818 │ 2026-10-23T21:42:21.1207686Z 832 │ 2026-10-23T21:42:21.1207808Z ·  ──────────────────── 2026-10-23T21:42:21.1207907Z 833 │ 2026-10-23T21:42:21.1207957Z ╰──── 2026-10-23T21:42:21.1208169Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-23T21:42:21.1208298Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-23T21:42:21.1208301Z 2026-10-23T21:42:21.1208549Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T21:42:21.1208702Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-23T21:42:21.1208830Z 259 │ .join("|"); 2026-10-23T21:42:21.1208947Z 260 │ useEffect(() => { 2026-10-23T21:42:21.1209017Z ·  ────┬──── 2026-10-23T21:42:21.1209148Z · ╰── This is the containing effect 2026-10-23T21:42:21.1209207Z 261 │ stop(); 2026-10-23T21:42:21.1209272Z ·  ──┬─ 2026-10-23T21:42:21.1209436Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.1209498Z 262 │ }, [orderVersion]); 2026-10-23T21:42:21.1209547Z ╰──── 2026-10-23T21:42:21.1210125Z  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-23T21:42:21.1210440Z  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-23T21:42:21.1210446Z 2026-10-23T21:42:21.1210654Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T21:42:21.1210808Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-23T21:42:21.1210870Z 260 │ useEffect(() => { 2026-10-23T21:42:21.1210926Z 261 │ stop(); 2026-10-23T21:42:21.1210991Z ·  ──┬─ 2026-10-23T21:42:21.1211115Z · ╰── Missing dependency `stop` 2026-10-23T21:42:21.1211178Z 262 │ }, [orderVersion]); 2026-10-23T21:42:21.1211254Z ·  ──────┬───── 2026-10-23T21:42:21.1211404Z · ╰── Unnecessary dependency `orderVersion` 2026-10-23T21:42:21.1211465Z 263 │ useEffect( 2026-10-23T21:42:21.1211515Z ╰──── 2026-10-23T21:42:21.1211917Z  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-23T21:42:21.1212214Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.1212216Z 2026-10-23T21:42:21.1212357Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.1212512Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9] 2026-10-23T21:42:21.1212589Z 95 │ const latest = useRef(props); 2026-10-23T21:42:21.1212660Z 96 │ latest.current = props; 2026-10-23T21:42:21.1212763Z ·  ───┬──────┬─── 2026-10-23T21:42:21.1212938Z · │ ╰── Cannot update ref value during render 2026-10-23T21:42:21.1213049Z · ╰── This value is a ref 2026-10-23T21:42:21.1213116Z 97 │ const gesture = useMemo( 2026-10-23T21:42:21.1213169Z ╰──── 2026-10-23T21:42:21.1213658Z  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-23T21:42:21.1213985Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.1214015Z 2026-10-23T21:42:21.1214154Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.1214308Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18] 2026-10-23T21:42:21.1214371Z 103 │ .runOnJS(true) 2026-10-23T21:42:21.1214467Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-23T21:42:21.1214582Z ·  ───────────────┬────────────── 2026-10-23T21:42:21.1214777Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T21:42:21.1214906Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-23T21:42:21.1214956Z ╰──── 2026-10-23T21:42:21.1215407Z  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-23T21:42:21.1215686Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.1215689Z 2026-10-23T21:42:21.1215828Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.1215981Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19] 2026-10-23T21:42:21.1216076Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-23T21:42:21.1216200Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-23T21:42:21.1216351Z ·  ──────────────────────────┬───────────────────────── 2026-10-23T21:42:21.1216557Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T21:42:21.1216676Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-23T21:42:21.1216725Z ╰──── 2026-10-23T21:42:21.1217170Z  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-23T21:42:21.1217444Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.1217447Z 2026-10-23T21:42:21.1217590Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.1217744Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16] 2026-10-23T21:42:21.1217867Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-23T21:42:21.1217984Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-23T21:42:21.1218129Z ·  ──────────────────────────┬───────────────────────── 2026-10-23T21:42:21.1218328Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T21:42:21.1218447Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-23T21:42:21.1218496Z ╰──── 2026-10-23T21:42:21.1218987Z  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-23T21:42:21.1219291Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.1219293Z 2026-10-23T21:42:21.1219433Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.1219584Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21] 2026-10-23T21:42:21.1219700Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-23T21:42:21.1219817Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-23T21:42:21.1219956Z ·  ───────────────────────┬────────────────────── 2026-10-23T21:42:21.1220161Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T21:42:21.1220230Z 108 │ [props.disabled], 2026-10-23T21:42:21.1220279Z ╰──── 2026-10-23T21:42:21.1220722Z  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-23T21:42:21.1220998Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.1221001Z 2026-10-23T21:42:21.1221138Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.1221295Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:249:9] 2026-10-23T21:42:21.1221408Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-23T21:42:21.1221510Z 249 │ latest.current = { rows, planners, moveThread }; 2026-10-23T21:42:21.1221611Z ·  ───┬──────┬─── 2026-10-23T21:42:21.1221789Z · │ ╰── Cannot update ref value during render 2026-10-23T21:42:21.1221900Z · ╰── This value is a ref 2026-10-23T21:42:21.1221951Z 250 │ 2026-10-23T21:42:21.1221999Z ╰──── 2026-10-23T21:42:21.1222439Z  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-23T21:42:21.1222770Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.1222803Z 2026-10-23T21:42:21.1222943Z ⚠ react(refs): Cannot access refs during render 2026-10-23T21:42:21.1223094Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:247:22] 2026-10-23T21:42:21.1223219Z 246 │ const [preview, setPreview] = useState(null); 2026-10-23T21:42:21.1223361Z 247 │ const translateY = useRef(new Animated.Value(0)).current; 2026-10-23T21:42:21.1223487Z ·  ──────────────────┬────────────────── 2026-10-23T21:42:21.1223650Z · ╰── Cannot access ref value during render 2026-10-23T21:42:21.1223761Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-23T21:42:21.1223814Z ╰──── 2026-10-23T21:42:21.1224254Z  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-23T21:42:21.1224529Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T21:42:21.1224532Z 2026-10-23T21:42:21.1224696Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T21:42:21.1224849Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:324:16] 2026-10-23T21:42:21.1224911Z 323 │ update(0); 2026-10-23T21:42:21.1224993Z 324 │ let last = performance.now(); 2026-10-23T21:42:21.1225090Z ·  ────────┬──────── 2026-10-23T21:42:21.1225225Z · ╰── Cannot call impure function 2026-10-23T21:42:21.1225296Z 325 │ const tick = () => { 2026-10-23T21:42:21.1225345Z ╰──── 2026-10-23T21:42:21.1225636Z  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-23T21:42:21.1225913Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T21:42:21.1225917Z 2026-10-23T21:42:21.1226099Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-23T21:42:21.1226258Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15] 2026-10-23T21:42:21.1226316Z  98 │ () => 2026-10-23T21:42:21.1226380Z  99 │ Gesture.Pan() 2026-10-23T21:42:21.1226452Z ·  ─┬─ 2026-10-23T21:42:21.1226581Z · ╰── `Pan` may be a component 2026-10-23T21:42:21.1226659Z 100 │ .enabled(!props.disabled) 2026-10-23T21:42:21.1226706Z ╰──── 2026-10-23T21:42:21.1226971Z  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-23T21:42:21.1227395Z  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-23T21:42:21.1227398Z 2026-10-23T21:42:21.1227713Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-23T21:42:21.1227894Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5] 2026-10-23T21:42:21.1227957Z 103 │ .runOnJS(true) 2026-10-23T21:42:21.1228054Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-23T21:42:21.1228140Z ·  ───┬── 2026-10-23T21:42:21.1228555Z · ╰── 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-23T21:42:21.1228683Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-23T21:42:21.1228806Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-23T21:42:21.1228926Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-23T21:42:21.1228991Z 108 │ [props.disabled], 2026-10-23T21:42:21.1229074Z ·  ────────┬─────── 2026-10-23T21:42:21.1229254Z · ╰── This dependency list is missing values used by the callback 2026-10-23T21:42:21.1229307Z 109 │ ); 2026-10-23T21:42:21.1229357Z ╰──── 2026-10-23T21:42:21.1229551Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-23T21:42:21.1229849Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.1229852Z 2026-10-23T21:42:21.1230305Z ⚠ 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-23T21:42:21.1230470Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7] 2026-10-23T21:42:21.1230570Z 565 │ let afterSequence = created[0]!.sequence; 2026-10-23T21:42:21.1230765Z 566 │ ╭─▶ for (let index = 1; index <= 32; index += 1) { 2026-10-23T21:42:21.1230865Z 567 │ │ const nextEvent = { 2026-10-23T21:42:21.1231023Z 568 │ │ id: EventId.make(`event:foundation-stream-race:${index}`), 2026-10-23T21:42:21.1231153Z 569 │ │ type: "thread.metadata-updated" as const, 2026-10-23T21:42:21.1231247Z 570 │ │ threadId, 2026-10-23T21:42:21.1231348Z 571 │ │ providerInstanceId, 2026-10-23T21:42:21.1231444Z 572 │ │ occurredAt: now, 2026-10-23T21:42:21.1231587Z 573 │ │ payload: { ...thread, title: `Race update ${index}` }, 2026-10-23T21:42:21.1231713Z 574 │ │ } satisfies OrchestrationV2DomainEvent; 2026-10-23T21:42:21.1231822Z 575 │ │ const reader = yield* eventSink 2026-10-23T21:42:21.1231941Z 576 │ │ .stream({ threadId, afterSequence }) 2026-10-23T21:42:21.1232067Z 577 │ │ .pipe(Stream.runHead, Effect.forkChild); 2026-10-23T21:42:21.1232171Z 578 │ │ yield* Effect.yieldNow; 2026-10-23T21:42:21.1232383Z 579 │ │ const written = yield* eventSink.write({ events: [nextEvent] }); 2026-10-23T21:42:21.1232540Z 580 │ │ const received = yield* Fiber.join(reader); 2026-10-23T21:42:21.1232651Z 581 │ │ if (Option.isNone(received)) { 2026-10-23T21:42:21.1232842Z 582 │ │ return yield* Effect.die("The event stream ended before delivering the live event."); 2026-10-23T21:42:21.1232917Z 583 │ │ } 2026-10-23T21:42:21.1233071Z 584 │ │ assert.equal(received.value.sequence, written[0]?.sequence); 2026-10-23T21:42:21.1233222Z 585 │ │ assert.equal(received.value.event.id, nextEvent.id); 2026-10-23T21:42:21.1233387Z 586 │ │ afterSequence = received.value.sequence; 2026-10-23T21:42:21.1233521Z 587 │ ╰─▶ } 2026-10-23T21:42:21.1233582Z 588 │ }), 2026-10-23T21:42:21.1233631Z ╰──── 2026-10-23T21:42:21.1233634Z 2026-10-23T21:42:21.1234082Z ⚠ 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-23T21:42:21.1234249Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:2327:9] 2026-10-23T21:42:21.1234324Z 2326 │ let settled = false; 2026-10-23T21:42:21.1234481Z 2327 │ ╭─▶ while (!settled) { 2026-10-23T21:42:21.1234636Z 2328 │ │ settled = (yield* outbox.listByCommandId(commandId)).every( 2026-10-23T21:42:21.1234769Z 2329 │ │ (effect) => effect.status === "succeeded", 2026-10-23T21:42:21.1234851Z 2330 │ │ ); 2026-10-23T21:42:21.1234972Z 2331 │ │ if (!settled) yield* Effect.yieldNow; 2026-10-23T21:42:21.1235106Z 2332 │ ╰─▶ } 2026-10-23T21:42:21.1235219Z 2333 │ }).pipe(Effect.provide(layerWorker), Effect.scoped); 2026-10-23T21:42:21.1235268Z ╰──── 2026-10-23T21:42:21.1235270Z 2026-10-23T21:42:21.1235538Z ⚠ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'. 2026-10-23T21:42:21.1235679Z ╭─[apps/web/src/components/preview/PreviewPanelShell.tsx:61:9] 2026-10-23T21:42:21.1235730Z 60 │ ) { 2026-10-23T21:42:21.1235894Z 61 │ const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded"; 2026-10-23T21:42:21.1235979Z ·  ──────┬────── 2026-10-23T21:42:21.1236115Z · ╰── 'useDragRegion' is declared here 2026-10-23T21:42:21.1236205Z 62 │ const isInline = props.mode === "inline"; 2026-10-23T21:42:21.1236255Z ╰──── 2026-10-23T21:42:21.1236356Z  help: Consider removing this declaration. 2026-10-23T21:42:21.1236359Z 2026-10-23T21:42:21.1236511Z ⚠ react(immutability): This value cannot be modified 2026-10-23T21:42:21.1236661Z ╭─[apps/mobile/src/features/connection/ConnectionStatusDot.tsx:58:7] 2026-10-23T21:42:21.1236753Z 53 │ function usePulseAnimation(pulse: boolean) { 2026-10-23T21:42:21.1236840Z 54 │ const pulseProgress = useSharedValue(0); 2026-10-23T21:42:21.1236922Z ·  ──────┬────── 2026-10-23T21:42:21.1237107Z · ╰── `pulseProgress` originates here 2026-10-23T21:42:21.1237185Z 55 │ 2026-10-23T21:42:21.1237247Z 56 │ useEffect(() => { 2026-10-23T21:42:21.1237309Z 57 │ if (pulse) { 2026-10-23T21:42:21.1237393Z 58 │ pulseProgress.value = withRepeat( 2026-10-23T21:42:21.1237470Z ·  ──────┬────── 2026-10-23T21:42:21.1237608Z · ╰── `pulseProgress` cannot be modified 2026-10-23T21:42:21.1237673Z 59 │ withTiming(1, { 2026-10-23T21:42:21.1237724Z ╰──── 2026-10-23T21:42:21.1237979Z  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-23T21:42:21.1238275Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T21:42:21.1238280Z 2026-10-23T21:42:21.1238512Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-23T21:42:21.1238661Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:290:50] 2026-10-23T21:42:21.1238720Z 289 │ return ( 2026-10-23T21:42:21.1238849Z 290 │ 2026-10-23T21:42:21.1238969Z ·  ───────────── 2026-10-23T21:42:21.1239036Z 291 │ {props.children} 2026-10-23T21:42:21.1239086Z ╰──── 2026-10-23T21:42:21.1239298Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-23T21:42:21.1239438Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-23T21:42:21.1239443Z 2026-10-23T21:42:21.1239671Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-23T21:42:21.1239819Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:654:44] 2026-10-23T21:42:21.1239876Z 653 │ return ( 2026-10-23T21:42:21.1239991Z 654 │ 2026-10-23T21:42:21.1240103Z ·  ───────────── 2026-10-23T21:42:21.1240168Z 655 │ {props.children} 2026-10-23T21:42:21.1240216Z ╰──── 2026-10-23T21:42:21.1240426Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-23T21:42:21.1240559Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-23T21:42:21.1240564Z 2026-10-23T21:42:21.1240790Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-23T21:42:21.1240946Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1462:55] 2026-10-23T21:42:21.1241003Z 1461 │ return ( 2026-10-23T21:42:21.1241159Z 1462 │ 2026-10-23T21:42:21.1241287Z ·  ──────────────────── 2026-10-23T21:42:21.1241382Z 1463 │ { 2026-10-23T21:42:21.1242433Z ·  ────┬──── 2026-10-23T21:42:21.1242559Z · ╰── This is the containing effect 2026-10-23T21:42:21.1242626Z 57 │ setDecodedSize(null); 2026-10-23T21:42:21.1242702Z ·  ───────┬────── 2026-10-23T21:42:21.1242872Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.1242940Z 58 │ }, [props.sourceKey]); 2026-10-23T21:42:21.1242992Z ╰──── 2026-10-23T21:42:21.1243609Z  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-23T21:42:21.1243916Z  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-23T21:42:21.1243919Z 2026-10-23T21:42:21.1244168Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T21:42:21.1244319Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5] 2026-10-23T21:42:21.1244371Z 59 │ 2026-10-23T21:42:21.1244434Z 60 │ useEffect(() => { 2026-10-23T21:42:21.1244501Z ·  ────┬──── 2026-10-23T21:42:21.1244625Z · ╰── This is the containing effect 2026-10-23T21:42:21.1244689Z 61 │ setFailedUri(null); 2026-10-23T21:42:21.1244762Z ·  ──────┬───── 2026-10-23T21:42:21.1244961Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.1245023Z 62 │ }, [props.uri]); 2026-10-23T21:42:21.1245071Z ╰──── 2026-10-23T21:42:21.1245647Z  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-23T21:42:21.1245955Z  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-23T21:42:21.1245958Z 2026-10-23T21:42:21.1246164Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-23T21:42:21.1246307Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10] 2026-10-23T21:42:21.1246427Z 6 │ import { parse, SvgAst, type JsxAST } from "react-native-svg"; 2026-10-23T21:42:21.1246600Z 7 │ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native"; 2026-10-23T21:42:21.1246687Z ·  ────────┬──────── 2026-10-23T21:42:21.1246909Z · ╰── 'ActivityIndicator' is imported here 2026-10-23T21:42:21.1246999Z 8 │ 2026-10-23T21:42:21.1247048Z ╰──── 2026-10-23T21:42:21.1247145Z  help: Consider removing this import. 2026-10-23T21:42:21.1247147Z 2026-10-23T21:42:21.1247340Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T21:42:21.1247484Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7] 2026-10-23T21:42:21.1247550Z 57 │ setDecodedSize(null); 2026-10-23T21:42:21.1247617Z 58 │ }, [props.sourceKey]); 2026-10-23T21:42:21.1247696Z ·  ───────┬─────── 2026-10-23T21:42:21.1247847Z · ╰── Unnecessary dependency `props.sourceKey` 2026-10-23T21:42:21.1247897Z 59 │ 2026-10-23T21:42:21.1247945Z ╰──── 2026-10-23T21:42:21.1248232Z  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-23T21:42:21.1248534Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.1248537Z 2026-10-23T21:42:21.1248729Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T21:42:21.1248872Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7] 2026-10-23T21:42:21.1248936Z 61 │ setFailedUri(null); 2026-10-23T21:42:21.1248997Z 62 │ }, [props.uri]); 2026-10-23T21:42:21.1249070Z ·  ────┬──── 2026-10-23T21:42:21.1249212Z · ╰── Unnecessary dependency `props.uri` 2026-10-23T21:42:21.1249264Z 63 │ 2026-10-23T21:42:21.1249313Z ╰──── 2026-10-23T21:42:21.1249588Z  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-23T21:42:21.1249879Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.1249882Z 2026-10-23T21:42:21.1250107Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-23T21:42:21.1250263Z ╭─[apps/web/src/components/pullRequest/pullRequestList.logic.ts:187:9] 2026-10-23T21:42:21.1250324Z 186 │ ): boolean { 2026-10-23T21:42:21.1250513Z 187 │ const labels = entry.labels.map((label) => label.name.trim().toLowerCase()); 2026-10-23T21:42:21.1250722Z ·  ───────────────────────────────────────────────────────────────────── 2026-10-23T21:42:21.1250861Z 188 │ const holds = (label: string) => labels.includes(label.trim().toLowerCase()); 2026-10-23T21:42:21.1250910Z ╰──── 2026-10-23T21:42:21.1250984Z  help: Switch to `Set` 2026-10-23T21:42:21.1250987Z 2026-10-23T21:42:21.1251234Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T21:42:21.1251396Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:79:5] 2026-10-23T21:42:21.1251445Z 76 │ 2026-10-23T21:42:21.1251506Z 77 │ useEffect(() => { 2026-10-23T21:42:21.1251573Z ·  ────┬──── 2026-10-23T21:42:21.1251704Z · ╰── This is the containing effect 2026-10-23T21:42:21.1251828Z 78 │ const { host, code } = parsePairingUrl(connectionPairingUrl); 2026-10-23T21:42:21.1251892Z 79 │ setHostInput(host); 2026-10-23T21:42:21.1251963Z ·  ──────┬───── 2026-10-23T21:42:21.1252122Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.1252185Z 80 │ setCodeInput(code); 2026-10-23T21:42:21.1252234Z ╰──── 2026-10-23T21:42:21.1252805Z  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-23T21:42:21.1253115Z  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-23T21:42:21.1253120Z 2026-10-23T21:42:21.1253534Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T21:42:21.1253699Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:89:5] 2026-10-23T21:42:21.1253749Z 82 │ 2026-10-23T21:42:21.1253810Z 83 │ useEffect(() => { 2026-10-23T21:42:21.1253875Z ·  ────┬──── 2026-10-23T21:42:21.1254001Z · ╰── This is the containing effect 2026-10-23T21:42:21.1254087Z 84 │ if (routePairingUrl.length === 0) { 2026-10-23T21:42:21.1254144Z 85 │ return; 2026-10-23T21:42:21.1254195Z 86 │ } 2026-10-23T21:42:21.1254245Z 87 │ 2026-10-23T21:42:21.1254362Z 88 │ const { host, code } = parsePairingUrl(routePairingUrl); 2026-10-23T21:42:21.1254429Z 89 │ setHostInput(host); 2026-10-23T21:42:21.1254500Z ·  ──────┬───── 2026-10-23T21:42:21.1254661Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.1254725Z 90 │ setCodeInput(code); 2026-10-23T21:42:21.1254773Z ╰──── 2026-10-23T21:42:21.1255340Z  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-23T21:42:21.1255690Z  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-23T21:42:21.1255719Z 2026-10-23T21:42:21.1255963Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T21:42:21.1256125Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:95:7] 2026-10-23T21:42:21.1256174Z 92 │ 2026-10-23T21:42:21.1256232Z 93 │ useEffect(() => { 2026-10-23T21:42:21.1256299Z ·  ────┬──── 2026-10-23T21:42:21.1256423Z · ╰── This is the containing effect 2026-10-23T21:42:21.1256503Z 94 │ if (pairingConnectionError) { 2026-10-23T21:42:21.1256571Z 95 │ setIsSubmitting(false); 2026-10-23T21:42:21.1256651Z ·  ───────┬─────── 2026-10-23T21:42:21.1256821Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.1256876Z 96 │ } 2026-10-23T21:42:21.1256924Z ╰──── 2026-10-23T21:42:21.1257489Z  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-23T21:42:21.1257791Z  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-23T21:42:21.1257793Z 2026-10-23T21:42:21.1257989Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-23T21:42:21.1258109Z ╭─[apps/web/src/contextMenuFallback.test.ts:38:9] 2026-10-23T21:42:21.1258175Z 37 │ get isConnected() { 2026-10-23T21:42:21.1258266Z 38 │ let current: FakeElement | null = this; 2026-10-23T21:42:21.1258339Z ·  ─────── 2026-10-23T21:42:21.1258408Z 39 │ while (current?.parent) { 2026-10-23T21:42:21.1258456Z ╰──── 2026-10-23T21:42:21.1258716Z  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-23T21:42:21.1258719Z 2026-10-23T21:42:21.1258963Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T21:42:21.1259129Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:123:7] 2026-10-23T21:42:21.1259178Z 118 │ 2026-10-23T21:42:21.1259242Z 119 │ useEffect(() => { 2026-10-23T21:42:21.1259316Z ·  ────┬──── 2026-10-23T21:42:21.1259447Z · ╰── This is the containing effect 2026-10-23T21:42:21.1259525Z 120 │ if (orientationSettled) return; 2026-10-23T21:42:21.1259634Z 121 │ const orientation = getNativeShowcaseOrientation(); 2026-10-23T21:42:21.1259707Z 122 │ if (orientation === null) { 2026-10-23T21:42:21.1259785Z 123 │ setOrientationSettled(true); 2026-10-23T21:42:21.1259872Z ·  ──────────┬────────── 2026-10-23T21:42:21.1260044Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.1260103Z 124 │ return; 2026-10-23T21:42:21.1260152Z ╰──── 2026-10-23T21:42:21.1260770Z  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-23T21:42:21.1261105Z  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-23T21:42:21.1261108Z 2026-10-23T21:42:21.1261351Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T21:42:21.1261517Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:304:7] 2026-10-23T21:42:21.1261567Z 292 │ 2026-10-23T21:42:21.1261628Z 293 │ useEffect(() => { 2026-10-23T21:42:21.1261698Z ·  ────┬──── 2026-10-23T21:42:21.1261827Z · ╰── This is the containing effect 2026-10-23T21:42:21.1261885Z 294 │ if ( 2026-10-23T21:42:21.1261948Z 295 │ scene === null || 2026-10-23T21:42:21.1262023Z 296 │ requestedScene === null || 2026-10-23T21:42:21.1262098Z 297 │ scene !== requestedScene || 2026-10-23T21:42:21.1262159Z 298 │ !hasFixture || 2026-10-23T21:42:21.1262228Z 299 │ !orientationSettled || 2026-10-23T21:42:21.1262292Z 300 │ !themeApplied || 2026-10-23T21:42:21.1262406Z 301 │ (scene === "agent-activity" && !agentActivityStaged) || 2026-10-23T21:42:21.1262534Z 302 │ !isShowcaseNativeContentReady({ scene, themeId, renderSignal }) 2026-10-23T21:42:21.1262588Z 303 │ ) { 2026-10-23T21:42:21.1262654Z 304 │ setReadyScene(null); 2026-10-23T21:42:21.1262731Z ·  ──────┬────── 2026-10-23T21:42:21.1262902Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.1262965Z 305 │ return; 2026-10-23T21:42:21.1263015Z ╰──── 2026-10-23T21:42:21.1263610Z  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-23T21:42:21.1263912Z  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-23T21:42:21.1263915Z 2026-10-23T21:42:21.1264170Z ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'. 2026-10-23T21:42:21.1264339Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:128:9] 2026-10-23T21:42:21.1264414Z 127 │ let cancelled = false; 2026-10-23T21:42:21.1264502Z 128 │ let lastOutcome: string | null = null; 2026-10-23T21:42:21.1264576Z ·  ─────┬───── 2026-10-23T21:42:21.1264708Z · ╰── 'lastOutcome' is declared here 2026-10-23T21:42:21.1264878Z 129 │ void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), { 2026-10-23T21:42:21.1264927Z ╰──── 2026-10-23T21:42:21.1265028Z  help: Consider removing this declaration. 2026-10-23T21:42:21.1265031Z 2026-10-23T21:42:21.1265193Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T21:42:21.1265308Z ╭─[apps/web/src/hooks/useThreadActions.ts:821:56] 2026-10-23T21:42:21.1265460Z 820 │ const resolved = resolveThreadTarget(target); 2026-10-23T21:42:21.1265653Z 821 │ if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) { 2026-10-23T21:42:21.1265772Z ·  ─────┬──── 2026-10-23T21:42:21.1265935Z · ╰── Cannot call impure function 2026-10-23T21:42:21.1266012Z 822 │ return AsyncResult.failure( 2026-10-23T21:42:21.1266060Z ╰──── 2026-10-23T21:42:21.1266324Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T21:42:21.1266609Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T21:42:21.1266614Z 2026-10-23T21:42:21.1266776Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T21:42:21.1266890Z ╭─[apps/web/src/hooks/useThreadActions.ts:709:46] 2026-10-23T21:42:21.1266958Z 708 │ const wokeAt = resolved 2026-10-23T21:42:21.1267086Z 709 │ ? threadWokeAt(resolved.thread, { now: new Date().toISOString() }) 2026-10-23T21:42:21.1267195Z ·  ─────┬──── 2026-10-23T21:42:21.1267349Z · ╰── Cannot call impure function 2026-10-23T21:42:21.1267406Z 710 │ : null; 2026-10-23T21:42:21.1267455Z ╰──── 2026-10-23T21:42:21.1267721Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T21:42:21.1268001Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T21:42:21.1268003Z 2026-10-23T21:42:21.1268194Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T21:42:21.1268334Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7] 2026-10-23T21:42:21.1268428Z 256 │ return () => cancelAnimationFrame(frame); 2026-10-23T21:42:21.1268505Z 257 │ }, [props.path, targetIndex]); 2026-10-23T21:42:21.1268578Z ·  ─────┬──── 2026-10-23T21:42:21.1268716Z · ╰── Unnecessary dependency `props.path` 2026-10-23T21:42:21.1268767Z 258 │ 2026-10-23T21:42:21.1268817Z ╰──── 2026-10-23T21:42:21.1269099Z  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-23T21:42:21.1269393Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T21:42:21.1269395Z 2026-10-23T21:42:21.1269582Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T21:42:21.1269724Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23] 2026-10-23T21:42:21.1269794Z 292 │ 2026-10-23T21:42:21.1270899Z ·  ─────────── 2026-10-23T21:42:21.1270961Z 310 │ {body} 2026-10-23T21:42:21.1271010Z ╰──── 2026-10-23T21:42:21.1271146Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-23T21:42:21.1271151Z 2026-10-23T21:42:21.1271400Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T21:42:21.1271537Z ╭─[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5] 2026-10-23T21:42:21.1271587Z 150 │ 2026-10-23T21:42:21.1271649Z 151 │ useEffect(() => { 2026-10-23T21:42:21.1271716Z ·  ────┬──── 2026-10-23T21:42:21.1271841Z · ╰── This is the containing effect 2026-10-23T21:42:21.1271921Z 152 │ if (!controlledSelectedPath) { 2026-10-23T21:42:21.1271978Z 153 │ return; 2026-10-23T21:42:21.1272034Z 154 │ } 2026-10-23T21:42:21.1272114Z 155 │ setExpandedPaths((current) => { 2026-10-23T21:42:21.1272191Z ·  ────────┬─────── 2026-10-23T21:42:21.1272359Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T21:42:21.1272481Z 156 │ const ancestors = ancestorPaths(controlledSelectedPath); 2026-10-23T21:42:21.1272529Z ╰──── 2026-10-23T21:42:21.1273097Z  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-23T21:42:21.1273476Z  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-23T21:42:21.1273479Z 2026-10-23T21:42:21.1273640Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T21:42:21.1273798Z ╭─[apps/server/src/processRunner.test.ts:266:14] 2026-10-23T21:42:21.1273878Z 265 │ 2026-10-23T21:42:21.1273981Z 266 │ for (const {} of ["timeout", "success"] as const) { 2026-10-23T21:42:21.1274049Z ·  ── 2026-10-23T21:42:21.1274103Z 267 │ } 2026-10-23T21:42:21.1274154Z ╰──── 2026-10-23T21:42:21.1274373Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T21:42:21.1274375Z 2026-10-23T21:42:21.1274597Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-23T21:42:21.1274732Z ╭─[apps/web/src/components/chat/useComposerSend.ts:985:13] 2026-10-23T21:42:21.1274846Z 984 │ const changedBeforeDecline = draftChangedSinceSend(); 2026-10-23T21:42:21.1275085Z 985 │ ╭─▶ const pendingIdsBeforeDecline = pendingApprovalsRef.current.map( 2026-10-23T21:42:21.1275205Z 986 │ │ (approval) => approval.requestId, 2026-10-23T21:42:21.1275332Z 987 │ ╰─▶ ); 2026-10-23T21:42:21.1275466Z 988 │ const approvalResponding = approvalsToDecline.some((approval) => 2026-10-23T21:42:21.1275516Z ╰──── 2026-10-23T21:42:21.1275588Z  help: Switch to `Set` 2026-10-23T21:42:21.1275591Z 2026-10-23T21:42:21.1275750Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T21:42:21.1275880Z ╭─[apps/web/src/components/CustomSnoozeDialog.tsx:140:58] 2026-10-23T21:42:21.1276015Z 139 │ {...(weekStartsOn === undefined ? {} : { weekStartsOn })} 2026-10-23T21:42:21.1276157Z 140 │ disabled={{ before: new Date(new Date().setHours(0, 0, 0, 0)) }} 2026-10-23T21:42:21.1276275Z ·  ─────┬──── 2026-10-23T21:42:21.1276439Z · ╰── Cannot call impure function 2026-10-23T21:42:21.1276532Z 141 │ onSelect={(selected) => { 2026-10-23T21:42:21.1276581Z ╰──── 2026-10-23T21:42:21.1276845Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T21:42:21.1277121Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T21:42:21.1277128Z 2026-10-23T21:42:21.1277580Z ⚠ 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-23T21:42:21.1277749Z ╭─[apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts:223:5] 2026-10-23T21:42:21.1277821Z 222 │ let idlePasses = 0; 2026-10-23T21:42:21.1277958Z 223 │ ╭─▶ for (;;) { 2026-10-23T21:42:21.1278090Z 224 │ │ yield* Effect.promise(() => Promise.resolve()); 2026-10-23T21:42:21.1278227Z 225 │ │ const pending = backgroundRuntime.pending.shift(); 2026-10-23T21:42:21.1278321Z 226 │ │ if (!pending) { 2026-10-23T21:42:21.1278461Z 227 │ │ idlePasses++; 2026-10-23T21:42:21.1278600Z 228 │ │ if (idlePasses >= 3) { 2026-10-23T21:42:21.1278685Z 229 │ │ return; 2026-10-23T21:42:21.1278760Z 230 │ │ } 2026-10-23T21:42:21.1278841Z 231 │ │ continue; 2026-10-23T21:42:21.1278915Z 232 │ │ } 2026-10-23T21:42:21.1279007Z 233 │ │ idlePasses = 0; 2026-10-23T21:42:21.1279120Z 234 │ │ const exit = yield* Effect.exit( 2026-10-23T21:42:21.1279322Z 235 │ │ pending.operation as Effect.Effect, 2026-10-23T21:42:21.1279397Z 236 │ │ ); 2026-10-23T21:42:21.1279507Z 237 │ │ yield* Effect.sync(() => { 2026-10-23T21:42:21.1279611Z 238 │ │ pending.resolve(exit); 2026-10-23T21:42:21.1279686Z 239 │ │ }); 2026-10-23T21:42:21.1279812Z 240 │ ╰─▶ } 2026-10-23T21:42:21.1279869Z 241 │ }, 2026-10-23T21:42:21.1279919Z ╰──── 2026-10-23T21:42:21.1279923Z 2026-10-23T21:42:21.1280080Z ⚠ eslint(no-empty-pattern): Empty array binding pattern 2026-10-23T21:42:21.1280232Z ╭─[apps/server/src/pullRequest/PullRequestService.test.ts:1429:12] 2026-10-23T21:42:21.1280289Z 1428 │ 2026-10-23T21:42:21.1280354Z 1429 │ for (const [] of [ 2026-10-23T21:42:21.1280422Z ·  ── 2026-10-23T21:42:21.1280492Z 1430 │ ["github", "github.com"], 2026-10-23T21:42:21.1280541Z ╰──── 2026-10-23T21:42:21.1280814Z  help: Passing non-iterable values (null, undefined, numbers, booleans, etc.) will result in a runtime error because these values are not iterable. 2026-10-23T21:42:21.1280820Z 2026-10-23T21:42:21.1280996Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T21:42:21.1281102Z ╭─[packages/shared/src/qrCode.ts:458:44] 2026-10-23T21:42:21.1281164Z 457 │ ): Array { 2026-10-23T21:42:21.1281270Z 458 │ let result: Array = divisor.map((_) => 0); 2026-10-23T21:42:21.1281366Z ·  ┬ 2026-10-23T21:42:21.1281508Z · ╰── '_' is declared here 2026-10-23T21:42:21.1281579Z 459 │ for (const b of data) { 2026-10-23T21:42:21.1281629Z ╰──── 2026-10-23T21:42:21.1281732Z  help: Consider removing this parameter. 2026-10-23T21:42:21.1281738Z 2026-10-23T21:42:21.1281990Z ⚠ eslint(no-unused-vars): Variable 'claudeCaps' is declared but never used. Unused variables should start with a '_'. 2026-10-23T21:42:21.1282095Z ╭─[packages/shared/src/model.test.ts:36:7] 2026-10-23T21:42:21.1282148Z 35 │ 2026-10-23T21:42:21.1282275Z 36 │ const claudeCaps: ModelCapabilities = createModelCapabilities({ 2026-10-23T21:42:21.1282348Z ·  ─────┬──── 2026-10-23T21:42:21.1282482Z · ╰── 'claudeCaps' is declared here 2026-10-23T21:42:21.1282551Z 37 │ optionDescriptors: [ 2026-10-23T21:42:21.1282599Z ╰──── 2026-10-23T21:42:21.1282698Z  help: Consider removing this declaration. 2026-10-23T21:42:21.1282701Z 2026-10-23T21:42:21.1282952Z ⚠ eslint(no-unused-vars): Function 'describeSchedule' is declared but never used. 2026-10-23T21:42:21.1283103Z ╭─[apps/server/src/scheduledTasks/Schedule.ts:79:10] 2026-10-23T21:42:21.1283154Z 78 │ 2026-10-23T21:42:21.1283316Z 79 │ function describeSchedule(schedule: ScheduledTaskSchedule): string { 2026-10-23T21:42:21.1283403Z ·  ────────┬─────── 2026-10-23T21:42:21.1283547Z · ╰── 'describeSchedule' is declared here 2026-10-23T21:42:21.1283650Z 80 │ if (schedule.type === "webhook") return "On webhook"; 2026-10-23T21:42:21.1283698Z ╰──── 2026-10-23T21:42:21.1283799Z  help: Consider removing this declaration. 2026-10-23T21:42:21.1283802Z 2026-10-23T21:42:21.1284250Z ⚠ 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-23T21:42:21.1284430Z ╭─[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:521:13] 2026-10-23T21:42:21.1284496Z 520 │ })).delivery; 2026-10-23T21:42:21.1284686Z 521 │ ╭─▶ while (delivery.outcome === "accepted") { 2026-10-23T21:42:21.1284829Z 522 │ │ yield* Effect.yieldNow; 2026-10-23T21:42:21.1284970Z 523 │ │ delivery = (yield* service.getWebhookDelivery({ 2026-10-23T21:42:21.1285064Z 524 │ │ id: task.id, 2026-10-23T21:42:21.1285180Z 525 │ │ deliveryId: deliveryId!, 2026-10-23T21:42:21.1285281Z 526 │ │ })).delivery; 2026-10-23T21:42:21.1285419Z 527 │ ╰─▶ } 2026-10-23T21:42:21.1285532Z 528 │ assert.equal(delivery.outcome, "dispatch_failed"); 2026-10-23T21:42:21.1285581Z ╰──── 2026-10-23T21:42:21.1285583Z 2026-10-23T21:42:21.1285813Z ⚠ unicorn(prefer-string-starts-ends-with): Prefer String#startsWith over a regex with a caret. 2026-10-23T21:42:21.1285935Z ╭─[apps/server/src/vcs/GitVcsDriverCore.ts:509:11] 2026-10-23T21:42:21.1286031Z 508 │ GIT_DIAGNOSTIC_LINE_PATTERN.test(line) || 2026-10-23T21:42:21.1286159Z 509 │ (!/^remote:/.test(line) && SSH_TRANSPORT_REFUSAL_PATTERN.test(line)), 2026-10-23T21:42:21.1286244Z ·  ─────────────── 2026-10-23T21:42:21.1286297Z 510 │ ) 2026-10-23T21:42:21.1286357Z ╰──── 2026-10-23T21:42:21.1286506Z  help: Replace `/^remote:/.test(line)` with `line.startsWith('remote:')`. 2026-10-23T21:42:21.1286508Z 2026-10-23T21:42:21.1286711Z ⚠ eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used. 2026-10-23T21:42:21.1286811Z ╭─[infra/relay/src/http/Api.ts:69:13] 2026-10-23T21:42:21.1286946Z 68 │ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts"; 2026-10-23T21:42:21.1287055Z 69 │ import * as HookForwarder from "../hooks/HookForwarder.ts"; 2026-10-23T21:42:21.1287138Z ·  ──────┬────── 2026-10-23T21:42:21.1287280Z · ╰── 'HookForwarder' is imported here 2026-10-23T21:42:21.1287379Z 70 │ import * as HeldHooks from "../hooks/HeldHooks.ts"; 2026-10-23T21:42:21.1287427Z ╰──── 2026-10-23T21:42:21.1287587Z  help: Consider removing this import. 2026-10-23T21:42:21.1287628Z 2026-10-23T21:42:21.1287971Z ⚠ 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-23T21:42:21.1288102Z ╭─[apps/server/src/vcs/GitVcsDriverCore.test.ts:1786:34] 2026-10-23T21:42:21.1288232Z 1785 │ const stat = branch.files!.find((file) => file.path === path)!; 2026-10-23T21:42:21.1288373Z 1786 │ const request = yield* Schema.decodeEffect(ReviewDiffPreviewInput)({ 2026-10-23T21:42:21.1288488Z ·  ─────────────────── 2026-10-23T21:42:21.1288549Z 1787 │ cwd, 2026-10-23T21:42:21.1288598Z ╰──── 2026-10-23T21:42:21.1288601Z 2026-10-23T21:42:21.1288767Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T21:42:21.1288915Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:372:47] 2026-10-23T21:42:21.1289040Z 371 │ const { open, onOpenChange, onSnooze, timestampFormat } = props; 2026-10-23T21:42:21.1289188Z 372 │ const presets = open ? resolveSnoozePresets(new Date(), timestampFormat) : []; 2026-10-23T21:42:21.1289296Z ·  ─────┬──── 2026-10-23T21:42:21.1289452Z · ╰── Cannot call impure function 2026-10-23T21:42:21.1289512Z 373 │ return ( 2026-10-23T21:42:21.1289561Z ╰──── 2026-10-23T21:42:21.1289827Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T21:42:21.1290112Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T21:42:21.1290117Z 2026-10-23T21:42:21.1290278Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T21:42:21.1290417Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:853:39] 2026-10-23T21:42:21.1290505Z 852 │ if (snoozeGateClock.thread !== thread) { 2026-10-23T21:42:21.1290629Z 853 │ setSnoozeGateClock({ thread, now: new Date().toISOString() }); 2026-10-23T21:42:21.1290735Z ·  ─────┬──── 2026-10-23T21:42:21.1290886Z · ╰── Cannot call impure function 2026-10-23T21:42:21.1290939Z 854 │ } 2026-10-23T21:42:21.1290986Z ╰──── 2026-10-23T21:42:21.1291253Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T21:42:21.1291537Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T21:42:21.1291539Z 2026-10-23T21:42:21.1291775Z ⚠ eslint(no-unused-vars): Function 'normalizeTerminalContextSelection' is declared but never used. 2026-10-23T21:42:21.1291884Z ╭─[apps/web/src/lib/terminalContext.ts:56:10] 2026-10-23T21:42:21.1291936Z 55 │ 2026-10-23T21:42:21.1292029Z 56 │ function normalizeTerminalContextSelection( 2026-10-23T21:42:21.1292140Z ·  ────────────────┬──────────────── 2026-10-23T21:42:21.1292367Z · ╰── 'normalizeTerminalContextSelection' is declared here 2026-10-23T21:42:21.1292487Z 57 │ selection: TerminalContextSelection, 2026-10-23T21:42:21.1292536Z ╰──── 2026-10-23T21:42:21.1292637Z  help: Consider removing this declaration. 2026-10-23T21:42:21.1292640Z 2026-10-23T21:42:21.1292853Z ⚠ eslint(no-unused-vars): Function 'assertUserMessagesExclude' is declared but never used. 2026-10-23T21:42:21.1293012Z ╭─[apps/server/src/orchestration-v2/testkit/fixtures/shared.ts:1398:10] 2026-10-23T21:42:21.1293064Z 1397 │ 2026-10-23T21:42:21.1293150Z 1398 │ function assertUserMessagesExclude( 2026-10-23T21:42:21.1293278Z ·  ────────────┬──────────── 2026-10-23T21:42:21.1293442Z · ╰── 'assertUserMessagesExclude' is declared here 2026-10-23T21:42:21.1293551Z 1399 │ projection: OrchestrationV2ThreadProjection, 2026-10-23T21:42:21.1293606Z ╰──── 2026-10-23T21:42:21.1293702Z  help: Consider removing this declaration. 2026-10-23T21:42:21.1293704Z 2026-10-23T21:42:21.1293908Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-23T21:42:21.1294037Z ╭─[apps/web/src/lib/composerContextReferences.ts:90:40] 2026-10-23T21:42:21.1294111Z 89 │ let cursor = prompt.length; 2026-10-23T21:42:21.1294210Z 90 │ for (const occurrence of occurrences.reverse()) { 2026-10-23T21:42:21.1294314Z ·  ─────── 2026-10-23T21:42:21.1294391Z 91 │ let { start, end } = occurrence; 2026-10-23T21:42:21.1294440Z ╰──── 2026-10-23T21:42:21.1294692Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-23T21:42:21.1294698Z 2026-10-23T21:42:21.1294868Z ⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`. 2026-10-23T21:42:21.1294984Z ╭─[apps/web/src/terminal/ghostty/core.ts:194:19] 2026-10-23T21:42:21.1295102Z 193 │ const count = Math.min(CHUNK_SIZE, graphemeLength - start); 2026-10-23T21:42:21.1295189Z 194 │ const codes = new Array(count); 2026-10-23T21:42:21.1295295Z ·  ──────────────────────── 2026-10-23T21:42:21.1295395Z 195 │ for (let index = 0; index < count; index += 1) { 2026-10-23T21:42:21.1295444Z ╰──── 2026-10-23T21:42:21.1295898Z  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-23T21:42:21.1296024Z 2026-10-23T21:42:21.1296225Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-23T21:42:21.1296344Z ╭─[apps/mobile/src/lib/markdownDocument.ts:138:28] 2026-10-23T21:42:21.1296421Z 137 │ visit(parser.parse(markdown)); 2026-10-23T21:42:21.1296505Z 138 │ for (const edit of edits.reverse()) 2026-10-23T21:42:21.1296597Z ·  ─────── 2026-10-23T21:42:21.1296755Z 139 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-23T21:42:21.1296806Z ╰──── 2026-10-23T21:42:21.1297056Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-23T21:42:21.1297058Z 2026-10-23T21:42:21.1297267Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-23T21:42:21.1297385Z ╭─[apps/mobile/src/lib/markdownDocument.ts:169:28] 2026-10-23T21:42:21.1297463Z 168 │ visit(parser.parse(markdown)); 2026-10-23T21:42:21.1297545Z 169 │ for (const edit of edits.reverse()) 2026-10-23T21:42:21.1297637Z ·  ─────── 2026-10-23T21:42:21.1297792Z 170 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-23T21:42:21.1297841Z ╰──── 2026-10-23T21:42:21.1298088Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-23T21:42:21.1298091Z 2026-10-23T21:42:21.1298293Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-23T21:42:21.1298409Z ╭─[apps/mobile/src/lib/markdownDocument.ts:223:38] 2026-10-23T21:42:21.1298486Z 222 │ visit(parser.parse(markdown)); 2026-10-23T21:42:21.1298585Z 223 │ for (const lineStart of lineStarts.reverse()) { 2026-10-23T21:42:21.1298684Z ·  ─────── 2026-10-23T21:42:21.1298842Z 224 │ // The header row may be a lazy line without its container markers (`>` or list indent), 2026-10-23T21:42:21.1298895Z ╰──── 2026-10-23T21:42:21.1299142Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-23T21:42:21.1299145Z 2026-10-23T21:42:21.1299306Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T21:42:21.1299436Z ╭─[apps/web/src/components/CommandPalette.tsx:1996:20] 2026-10-23T21:42:21.1299555Z 1995 │ title: inferProjectTitleFromPath(destinationPath), 2026-10-23T21:42:21.1299647Z 1996 │ createdAt: new Date().toISOString(), 2026-10-23T21:42:21.1299734Z ·  ─────┬──── 2026-10-23T21:42:21.1299875Z · ╰── Cannot call impure function 2026-10-23T21:42:21.1299976Z 1997 │ remoteUrl: addProjectCloneFlow.remoteUrl, 2026-10-23T21:42:21.1300028Z ╰──── 2026-10-23T21:42:21.1300296Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T21:42:21.1300624Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T21:42:21.1300658Z 2026-10-23T21:42:21.1300737Z Found 0 errors and 362 warnings in 5400 files (5.7s, 8 threads) 2026-10-23T21:42:21.1746233Z Post job cleanup. 2026-10-23T21:42:21.2357948Z Cache hit occurred on the primary key electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309, not saving cache. 2026-10-23T21:42:21.2424718Z Post job cleanup. 2026-10-23T21:42:21.2451031Z ##[start-action display=Cache full pnpm store;id=__08625919-59f3-45d0-89fc-0ed337f0e1d3.__actions_cache] 2026-10-23T21:42:21.2755153Z Post job cleanup. 2026-10-23T21:42:21.3466497Z [command]/usr/bin/tar --posix -cf cache.tzst --exclude cache.tzst -P -C /home/runner/_work/t3code/t3code --files-from manifest.txt --use-compress-program zstdmt 2026-10-23T21:42:25.5489940Z Sent 994310451 of 994310451 (100.0%), 2017.5 MBs/sec 2026-10-23T21:42:26.0637498Z Cache saved with key: pnpm-full-v1-Linux-X64-3cb0b4d7cff93dc8fe33f2ea73cac71ca25a36270fcb648b9b4a9320151012ef 2026-10-23T21:42:26.0702683Z ##[end-action id=__08625919-59f3-45d0-89fc-0ed337f0e1d3.__actions_cache;outcome=success;conclusion=success;duration_ms=4825] 2026-10-23T21:42:26.0705073Z ##[start-action display=Cache Vite+;id=__08625919-59f3-45d0-89fc-0ed337f0e1d3.vp_cache] 2026-10-23T21:42:26.0733985Z Post job cleanup. 2026-10-23T21:42:26.1429160Z 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-23T21:42:26.1461953Z ##[end-action id=__08625919-59f3-45d0-89fc-0ed337f0e1d3.vp_cache;outcome=success;conclusion=success;duration_ms=75] 2026-10-23T21:42:26.1497228Z Post job cleanup. 2026-10-23T21:42:26.1887317Z [command]/usr/local/bin/git version 2026-10-23T21:42:26.1913843Z git version 2.55.0 2026-10-23T21:42:26.1930262Z Temporarily overriding HOME='/home/runner/_work/_temp/dd17dbf2-7c73-472f-a5f8-c32e08f70e94' before making global git config changes 2026-10-23T21:42:26.1930615Z Adding repository directory to the temporary git global config as a safe directory 2026-10-23T21:42:26.1933013Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-23T21:42:26.1953008Z Removing SSH command configuration 2026-10-23T21:42:26.1955814Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-23T21:42:26.1978159Z [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-23T21:42:26.2101992Z fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules 2026-10-23T21:42:26.2124422Z ##[warning]The process '/usr/local/bin/git' failed with exit code 128 2026-10-23T21:42:26.2160817Z A job completed hook has been configured by the self-hosted runner administrator 2026-10-23T21:42:26.2178023Z ##[group]Run '/job_completed.sh' 2026-10-23T21:42:26.2185790Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T21:42:26.2185956Z env: 2026-10-23T21:42:26.2186078Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 201 2026-10-23T21:42:26.2186225Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 516 2026-10-23T21:42:26.2186364Z BLACKSMITH_CHECK_RUN_ID: 120670937783 2026-10-23T21:42:26.2186502Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-23T21:42:26.2186636Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-23T21:42:26.2186765Z ##[endgroup] 2026-10-23T21:42:26.2257195Z Docker container cache not activated, skipping hash computation. 2026-10-23T21:42:26.2475223Z No active SSH sessions detected. Proceeding with shutdown immediately. 2026-10-23T21:42:26.2518020Z Cleaning up orphan processes