2026-10-21T03:19:50.2081301Z Current runner version: '2.337.0' 2026-10-21T03:19:50.2085769Z Runner name: 'blacksmith-8vcpu-ubuntu-2404-y7ehtj5dxhmyas4y' 2026-10-21T03:19:50.2086747Z Runner group name: 'blacksmith scale sets - blacksmith-8vcpu-ubuntu-2404' 2026-10-21T03:19:50.2087582Z Machine name: 'ip-172-31-73-130' 2026-10-21T03:19:50.2089426Z ##[group]GITHUB_TOKEN Permissions 2026-10-21T03:19:50.2091042Z Contents: read 2026-10-21T03:19:50.2091577Z Metadata: read 2026-10-21T03:19:50.2092046Z ##[endgroup] 2026-10-21T03:19:50.2093714Z Secret source: None 2026-10-21T03:19:50.2094338Z Cache mode: write 2026-10-21T03:19:50.2095421Z Prepare workflow directory 2026-10-21T03:19:50.2333335Z Prepare all required actions 2026-10-21T03:19:50.2364136Z Getting action download info 2026-10-21T03:19:50.3528948Z Download action repository 'actions/checkout@v6' (SHA:d23441a48e516b6c34aea4fa41551a30e30af803) 2026-10-21T03:19:50.4409172Z Setting BLACKSMITH_ACTIONS_RESULTS_URL to https://results-receiver.actions.githubusercontent.com/ 2026-10-21T03:19:50.4452165Z Complete job name: Lint 2026-10-21T03:19:50.4849723Z A job started hook has been configured by the self-hosted runner administrator 2026-10-21T03:19:50.4957537Z ##[group]Run '/setup.sh' 2026-10-21T03:19:50.4968667Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-21T03:19:50.4969110Z env: 2026-10-21T03:19:50.4969349Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 149 2026-10-21T03:19:50.4969658Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 422 2026-10-21T03:19:50.4969955Z BLACKSMITH_CHECK_RUN_ID: 119018884336 2026-10-21T03:19:50.4970310Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-21T03:19:50.4970686Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-21T03:19:50.4970965Z ##[endgroup] 2026-10-21T03:19:50.5245491Z Logging daemon started (blacksmithd for logs) 2026-10-21T03:19:50.5348476Z Results daemon started (blacksmithd for results) 2026-10-21T03:19:50.5490927Z Background adoption and SSH setup started (PID: 3094) 2026-10-21T03:19:50.5491350Z 2026-10-21T03:19:50.5491468Z ---------------------------------------- 2026-10-21T03:19:50.5492035Z View this job: https://app.blacksmith.sh/pingdotgg/runs/39537955925/jobs/119018884336 2026-10-21T03:19:50.5492460Z SSH Access (using your GitHub SSH key): 2026-10-21T03:19:50.5492907Z ssh -p 64003 runner@blacksmith-8vcpu-ubuntu-2404-y7ehtj5dxhmyas4y.vm.blacksmith.sh 2026-10-21T03:19:50.5493222Z 2026-10-21T03:19:50.5493340Z No GitHub SSH key? Add one at: 2026-10-21T03:19:50.5493843Z https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account 2026-10-21T03:19:50.5494251Z 2026-10-21T03:19:50.5494364Z ---------------------------------------- 2026-10-21T03:19:50.5494546Z 2026-10-21T03:19:50.5494691Z VM ID: blacksmith-8vcpu-ubuntu-2404-y7ehtj5dxhmyas4y 2026-10-21T03:19:50.5495085Z Host: production-152.236.31.187-x8664 2026-10-21T03:19:50.5495375Z Host Agent PID: 1163931 2026-10-21T03:19:50.5495627Z Host Agent Git SHA: 6637acf1f 2026-10-21T03:19:50.5495898Z Host CPU Manufacturer: AuthenticAMD 2026-10-21T03:19:50.5496188Z Blacksmith Host Generation: gen 2 2026-10-21T03:19:50.5496487Z Petname: production-whole-garfish-88ae6659 2026-10-21T03:19:50.5496780Z Region: us-east 2026-10-21T03:19:50.5497020Z Rootfs Version: ubuntu24-full-x64-081926 2026-10-21T03:19:50.5503795Z OS Version: Ubuntu 24.04.4 LTS 2026-10-21T03:19:50.5504128Z 2026-10-21T03:19:50.5504326Z Enabling Blacksmith transparent cache 2026-10-21T03:19:50.5767303Z ##[group]Run actions/checkout@v6 2026-10-21T03:19:50.5767631Z with: 2026-10-21T03:19:50.5767968Z sparse-checkout: /* !/.repos/ !/apps/mobile/modules/t3-terminal/Vendor/**/*.a 2026-10-21T03:19:50.5768378Z sparse-checkout-cone-mode: false 2026-10-21T03:19:50.5768660Z repository: pingdotgg/t3code 2026-10-21T03:19:50.5770543Z token: *** 2026-10-21T03:19:50.5770760Z ssh-strict: true 2026-10-21T03:19:50.5770990Z ssh-user: git 2026-10-21T03:19:50.5771218Z persist-credentials: true 2026-10-21T03:19:50.5771471Z clean: true 2026-10-21T03:19:50.5771685Z fetch-depth: 1 2026-10-21T03:19:50.5771905Z fetch-tags: false 2026-10-21T03:19:50.5772315Z show-progress: true 2026-10-21T03:19:50.5772544Z lfs: false 2026-10-21T03:19:50.5772755Z submodules: false 2026-10-21T03:19:50.5772986Z set-safe-directory: true 2026-10-21T03:19:50.5773251Z allow-unsafe-pr-checkout: false 2026-10-21T03:19:50.5773527Z env: 2026-10-21T03:19:50.5773770Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 149 2026-10-21T03:19:50.5774061Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 422 2026-10-21T03:19:50.5774355Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-21T03:19:50.5774624Z ##[endgroup] 2026-10-21T03:19:50.6912386Z Syncing repository: pingdotgg/t3code 2026-10-21T03:19:50.6913782Z ##[group]Getting Git version info 2026-10-21T03:19:50.6914318Z Working directory is '/home/runner/_work/t3code/t3code' 2026-10-21T03:19:50.6915151Z [command]/usr/local/bin/git version 2026-10-21T03:19:50.7011304Z git version 2.55.0 2026-10-21T03:19:50.7025022Z ##[endgroup] 2026-10-21T03:19:50.7037347Z Temporarily overriding HOME='/home/runner/_work/_temp/b2643033-3846-4ba1-bce1-ef81ebfe0216' before making global git config changes 2026-10-21T03:19:50.7038172Z Adding repository directory to the temporary git global config as a safe directory 2026-10-21T03:19:50.7042201Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-21T03:19:50.7089686Z Deleting the contents of '/home/runner/_work/t3code/t3code' 2026-10-21T03:19:50.7092377Z ##[group]Determining repository object format 2026-10-21T03:19:50.7093938Z ##[endgroup] 2026-10-21T03:19:50.7094523Z ##[group]Initializing the repository 2026-10-21T03:19:50.7097224Z [command]/usr/local/bin/git init /home/runner/_work/t3code/t3code 2026-10-21T03:19:50.7170751Z hint: Using 'master' as the name for the initial branch. This default branch name 2026-10-21T03:19:50.7171836Z hint: will change to "main" in Git 3.0. To configure the initial branch name 2026-10-21T03:19:50.7172680Z hint: to use in all of your new repositories, which will suppress this warning, 2026-10-21T03:19:50.7173319Z hint: call: 2026-10-21T03:19:50.7173751Z hint: 2026-10-21T03:19:50.7174229Z hint: git config --global init.defaultBranch 2026-10-21T03:19:50.7174741Z hint: 2026-10-21T03:19:50.7175327Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and 2026-10-21T03:19:50.7176138Z hint: 'development'. The just-created branch can be renamed via this command: 2026-10-21T03:19:50.7176812Z hint: 2026-10-21T03:19:50.7177183Z hint: git branch -m 2026-10-21T03:19:50.7177642Z hint: 2026-10-21T03:19:50.7178161Z hint: Disable this message with "git config set advice.defaultBranchName false" 2026-10-21T03:19:50.7179046Z Initialized empty Git repository in /home/runner/_work/t3code/t3code/.git/ 2026-10-21T03:19:50.7182267Z [command]/usr/local/bin/git remote add origin https://github.com/pingdotgg/t3code 2026-10-21T03:19:50.7241881Z ##[endgroup] 2026-10-21T03:19:50.7242576Z ##[group]Disabling automatic garbage collection 2026-10-21T03:19:50.7247103Z [command]/usr/local/bin/git config --local gc.auto 0 2026-10-21T03:19:50.7278043Z ##[endgroup] 2026-10-21T03:19:50.7278455Z ##[group]Setting up auth 2026-10-21T03:19:50.7278775Z Removing SSH command configuration 2026-10-21T03:19:50.7285079Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-21T03:19:50.7325989Z [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-21T03:19:50.7536333Z Removing HTTP extra header 2026-10-21T03:19:50.7544092Z [command]/usr/local/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader 2026-10-21T03:19:50.7593293Z [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-21T03:19:50.7736350Z Removing includeIf entries pointing to credentials config files 2026-10-21T03:19:50.7740842Z [command]/usr/local/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: 2026-10-21T03:19:50.7776492Z [command]/usr/local/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url 2026-10-21T03:19:50.7918215Z [command]/usr/local/bin/git config --file /home/runner/_work/_temp/git-credentials-4f9d6daf-ffaa-4897-844c-c798dcd8b269.config http.https://github.com/.extraheader AUTHORIZATION: basic *** 2026-10-21T03:19:50.7957028Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git.path /home/runner/_work/_temp/git-credentials-4f9d6daf-ffaa-4897-844c-c798dcd8b269.config 2026-10-21T03:19:50.7985216Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git/worktrees/*.path /home/runner/_work/_temp/git-credentials-4f9d6daf-ffaa-4897-844c-c798dcd8b269.config 2026-10-21T03:19:50.8012383Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-4f9d6daf-ffaa-4897-844c-c798dcd8b269.config 2026-10-21T03:19:50.8036186Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-4f9d6daf-ffaa-4897-844c-c798dcd8b269.config 2026-10-21T03:19:50.8056866Z ##[endgroup] 2026-10-21T03:19:50.8057247Z ##[group]Fetching the repository 2026-10-21T03:19:50.8062748Z [command]/usr/local/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --filter=blob:none --depth=1 origin +8354a7ff0f0391c594f5d8abe4636b90181b1c0a:refs/remotes/pull/22237/merge 2026-10-21T03:19:51.1218730Z From https://github.com/pingdotgg/t3code 2026-10-21T03:19:51.1219867Z * [new ref] 8354a7ff0f0391c594f5d8abe4636b90181b1c0a -> pull/22237/merge 2026-10-21T03:19:51.1246643Z ##[endgroup] 2026-10-21T03:19:51.1247430Z ##[group]Determining the checkout info 2026-10-21T03:19:51.1248298Z ##[endgroup] 2026-10-21T03:19:51.1249106Z ##[group]Setting up sparse checkout 2026-10-21T03:19:51.1251492Z [command]/usr/local/bin/git config core.sparseCheckout true 2026-10-21T03:19:51.1282030Z [command]/usr/local/bin/git rev-parse --git-path info/sparse-checkout 2026-10-21T03:19:51.1313420Z .git/info/sparse-checkout 2026-10-21T03:19:51.1319382Z ##[endgroup] 2026-10-21T03:19:51.1320237Z ##[group]Checking out the ref 2026-10-21T03:19:51.1323571Z [command]/usr/local/bin/git checkout --progress --force refs/remotes/pull/22237/merge 2026-10-21T03:19:58.2314172Z Updating files: 0% (1/6140) 2026-10-21T03:19:58.2343978Z Updating files: 1% (62/6140) 2026-10-21T03:19:58.2363201Z Updating files: 2% (123/6140) 2026-10-21T03:19:58.2381314Z Updating files: 3% (185/6140) 2026-10-21T03:19:58.2407943Z Updating files: 4% (246/6140) 2026-10-21T03:19:58.2439044Z Updating files: 5% (307/6140) 2026-10-21T03:19:58.2465292Z Updating files: 6% (369/6140) 2026-10-21T03:19:58.2528170Z Updating files: 7% (430/6140) 2026-10-21T03:19:58.2558263Z Updating files: 8% (492/6140) 2026-10-21T03:19:58.2581882Z Updating files: 9% (553/6140) 2026-10-21T03:19:58.2871612Z Updating files: 10% (614/6140) 2026-10-21T03:19:58.2890789Z Updating files: 11% (676/6140) 2026-10-21T03:19:58.2903072Z Updating files: 12% (737/6140) 2026-10-21T03:19:58.2915577Z Updating files: 13% (799/6140) 2026-10-21T03:19:58.2934013Z Updating files: 14% (860/6140) 2026-10-21T03:19:58.2953222Z Updating files: 15% (921/6140) 2026-10-21T03:19:58.2972147Z Updating files: 16% (983/6140) 2026-10-21T03:19:58.2988659Z Updating files: 17% (1044/6140) 2026-10-21T03:19:58.3007282Z Updating files: 18% (1106/6140) 2026-10-21T03:19:58.3024367Z Updating files: 19% (1167/6140) 2026-10-21T03:19:58.3044108Z Updating files: 20% (1228/6140) 2026-10-21T03:19:58.3068970Z Updating files: 21% (1290/6140) 2026-10-21T03:19:58.3087401Z Updating files: 22% (1351/6140) 2026-10-21T03:19:58.3101944Z Updating files: 23% (1413/6140) 2026-10-21T03:19:58.3119044Z Updating files: 24% (1474/6140) 2026-10-21T03:19:58.3132831Z Updating files: 25% (1535/6140) 2026-10-21T03:19:58.3153080Z Updating files: 26% (1597/6140) 2026-10-21T03:19:58.3168810Z Updating files: 27% (1658/6140) 2026-10-21T03:19:58.3189137Z Updating files: 28% (1720/6140) 2026-10-21T03:19:58.3220164Z Updating files: 29% (1781/6140) 2026-10-21T03:19:58.3240545Z Updating files: 30% (1842/6140) 2026-10-21T03:19:58.3266257Z Updating files: 31% (1904/6140) 2026-10-21T03:19:58.3289472Z Updating files: 32% (1965/6140) 2026-10-21T03:19:58.3326590Z Updating files: 33% (2027/6140) 2026-10-21T03:19:58.3392438Z Updating files: 34% (2088/6140) 2026-10-21T03:19:58.3455882Z Updating files: 35% (2149/6140) 2026-10-21T03:19:58.3498561Z Updating files: 36% (2211/6140) 2026-10-21T03:19:58.3538879Z Updating files: 37% (2272/6140) 2026-10-21T03:19:58.3580662Z Updating files: 38% (2334/6140) 2026-10-21T03:19:58.3615484Z Updating files: 39% (2395/6140) 2026-10-21T03:19:58.3644109Z Updating files: 40% (2456/6140) 2026-10-21T03:19:58.3676255Z Updating files: 41% (2518/6140) 2026-10-21T03:19:58.3702755Z Updating files: 42% (2579/6140) 2026-10-21T03:19:58.3721342Z Updating files: 43% (2641/6140) 2026-10-21T03:19:58.3732259Z Updating files: 44% (2702/6140) 2026-10-21T03:19:58.3763119Z Updating files: 45% (2763/6140) 2026-10-21T03:19:58.3788077Z Updating files: 46% (2825/6140) 2026-10-21T03:19:58.3814521Z Updating files: 47% (2886/6140) 2026-10-21T03:19:58.3840721Z Updating files: 48% (2948/6140) 2026-10-21T03:19:58.3872931Z Updating files: 49% (3009/6140) 2026-10-21T03:19:58.3910665Z Updating files: 50% (3070/6140) 2026-10-21T03:19:58.3939838Z Updating files: 51% (3132/6140) 2026-10-21T03:19:58.3955119Z Updating files: 52% (3193/6140) 2026-10-21T03:19:58.4000228Z Updating files: 53% (3255/6140) 2026-10-21T03:19:58.4033634Z Updating files: 54% (3316/6140) 2026-10-21T03:19:58.4060274Z Updating files: 55% (3377/6140) 2026-10-21T03:19:58.4081050Z Updating files: 56% (3439/6140) 2026-10-21T03:19:58.4094746Z Updating files: 57% (3500/6140) 2026-10-21T03:19:58.4114297Z Updating files: 58% (3562/6140) 2026-10-21T03:19:58.4520946Z Updating files: 59% (3623/6140) 2026-10-21T03:19:58.4536872Z Updating files: 60% (3684/6140) 2026-10-21T03:19:58.4561205Z Updating files: 61% (3746/6140) 2026-10-21T03:19:58.4582154Z Updating files: 62% (3807/6140) 2026-10-21T03:19:58.4607748Z Updating files: 63% (3869/6140) 2026-10-21T03:19:58.4634643Z Updating files: 64% (3930/6140) 2026-10-21T03:19:58.4653273Z Updating files: 65% (3991/6140) 2026-10-21T03:19:58.4674310Z Updating files: 66% (4053/6140) 2026-10-21T03:19:58.4695195Z Updating files: 67% (4114/6140) 2026-10-21T03:19:58.4715419Z Updating files: 68% (4176/6140) 2026-10-21T03:19:58.4731915Z Updating files: 69% (4237/6140) 2026-10-21T03:19:58.4745772Z Updating files: 70% (4298/6140) 2026-10-21T03:19:58.4770916Z Updating files: 71% (4360/6140) 2026-10-21T03:19:58.4785078Z Updating files: 72% (4421/6140) 2026-10-21T03:19:58.4839179Z Updating files: 73% (4483/6140) 2026-10-21T03:19:58.5309273Z Updating files: 74% (4544/6140) 2026-10-21T03:19:58.5333035Z Updating files: 75% (4605/6140) 2026-10-21T03:19:58.5355846Z Updating files: 76% (4667/6140) 2026-10-21T03:19:58.5379044Z Updating files: 77% (4728/6140) 2026-10-21T03:19:58.5408067Z Updating files: 78% (4790/6140) 2026-10-21T03:19:58.5432686Z Updating files: 79% (4851/6140) 2026-10-21T03:19:58.5462925Z Updating files: 80% (4912/6140) 2026-10-21T03:19:58.5484841Z Updating files: 81% (4974/6140) 2026-10-21T03:19:58.5509100Z Updating files: 82% (5035/6140) 2026-10-21T03:19:58.5532159Z Updating files: 83% (5097/6140) 2026-10-21T03:19:58.5552107Z Updating files: 84% (5158/6140) 2026-10-21T03:19:58.5570190Z Updating files: 85% (5219/6140) 2026-10-21T03:19:58.5596312Z Updating files: 86% (5281/6140) 2026-10-21T03:19:58.5669483Z Updating files: 87% (5342/6140) 2026-10-21T03:19:58.5700362Z Updating files: 88% (5404/6140) 2026-10-21T03:19:58.5721957Z Updating files: 89% (5465/6140) 2026-10-21T03:19:58.5746090Z Updating files: 90% (5526/6140) 2026-10-21T03:19:58.5781667Z Updating files: 91% (5588/6140) 2026-10-21T03:19:58.5801372Z Updating files: 92% (5649/6140) 2026-10-21T03:19:58.5819305Z Updating files: 93% (5711/6140) 2026-10-21T03:19:58.5843297Z Updating files: 94% (5772/6140) 2026-10-21T03:19:58.5874373Z Updating files: 95% (5833/6140) 2026-10-21T03:19:58.5950339Z Updating files: 96% (5895/6140) 2026-10-21T03:19:58.5991533Z Updating files: 97% (5956/6140) 2026-10-21T03:19:58.6038636Z Updating files: 98% (6018/6140) 2026-10-21T03:19:58.6058945Z Updating files: 99% (6079/6140) 2026-10-21T03:19:58.6059364Z Updating files: 100% (6140/6140) 2026-10-21T03:19:58.6059574Z Updating files: 100% (6140/6140), done. 2026-10-21T03:19:58.6225889Z Note: switching to 'refs/remotes/pull/22237/merge'. 2026-10-21T03:19:58.6226189Z 2026-10-21T03:19:58.6226425Z You are in 'detached HEAD' state. You can look around, make experimental 2026-10-21T03:19:58.6226937Z changes and commit them, and you can discard any commits you make in this 2026-10-21T03:19:58.6227454Z state without impacting any branches by switching back to a branch. 2026-10-21T03:19:58.6227740Z 2026-10-21T03:19:58.6227968Z If you want to create a new branch to retain commits you create, you may 2026-10-21T03:19:58.6228455Z do so (now or later) by using -c with the switch command. Example: 2026-10-21T03:19:58.6228739Z 2026-10-21T03:19:58.6228880Z git switch -c 2026-10-21T03:19:58.6229071Z 2026-10-21T03:19:58.6229202Z Or undo this operation with: 2026-10-21T03:19:58.6229399Z 2026-10-21T03:19:58.6229515Z git switch - 2026-10-21T03:19:58.6229687Z 2026-10-21T03:19:58.6229931Z Turn off this advice by setting config variable advice.detachedHead to false 2026-10-21T03:19:58.6230256Z 2026-10-21T03:19:58.6230619Z HEAD is now at 8354a7f Merge ad7e4fb78cbde18558d673069bfd41117388d89e into e64766c56ac6fc1678e6107052feb0047a35337f 2026-10-21T03:19:58.6240594Z ##[endgroup] 2026-10-21T03:19:58.6277915Z [command]/usr/local/bin/git log -1 --format=%H 2026-10-21T03:19:58.6298906Z 8354a7ff0f0391c594f5d8abe4636b90181b1c0a 2026-10-21T03:19:58.6383539Z ##[group]Run files="$(git ls-files .github/pr-assets)" 2026-10-21T03:19:58.6383942Z files="$(git ls-files .github/pr-assets)" 2026-10-21T03:19:58.6384263Z if test -n "$files"; then 2026-10-21T03:19:58.6384691Z  printf 'PR evidence must be uploaded to GitHub, not committed:\n%s\n' "$files" >&2 2026-10-21T03:19:58.6385120Z  exit 1 2026-10-21T03:19:58.6385343Z fi 2026-10-21T03:19:58.6395443Z shell: /usr/bin/bash -e {0} 2026-10-21T03:19:58.6395616Z env: 2026-10-21T03:19:58.6395819Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 149 2026-10-21T03:19:58.6396021Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 422 2026-10-21T03:19:58.6396207Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-21T03:19:58.6396383Z ##[endgroup] 2026-10-21T03:19:58.6546300Z Prepare all required actions 2026-10-21T03:19:58.6546747Z Getting action download info 2026-10-21T03:19:58.7394951Z Download action repository 'actions/cache@v6' (SHA:55cc8345863c7cc4c66a329aec7e433d2d1c52a9) 2026-10-21T03:19:58.8055014Z Download action repository 'voidzero-dev/setup-vp@v1' (SHA:250f29ce396baf5e8f24498e17c0dfdebabc26eb) 2026-10-21T03:19:58.9026691Z ##[group]Run ./.github/actions/setup-ci-deps 2026-10-21T03:19:58.9027013Z env: 2026-10-21T03:19:58.9027254Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 149 2026-10-21T03:19:58.9027558Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 422 2026-10-21T03:19:58.9027853Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-21T03:19:58.9028132Z ##[endgroup] 2026-10-21T03:19:58.9111181Z ##[start-action display=Resolve Vite+ version;id=__self.vp] 2026-10-21T03:19:58.9129882Z ##[group]Run echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-21T03:19:58.9130320Z echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-21T03:19:58.9140048Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-21T03:19:58.9140264Z env: 2026-10-21T03:19:58.9140416Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 149 2026-10-21T03:19:58.9140606Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 422 2026-10-21T03:19:58.9140788Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-21T03:19:58.9140962Z ##[endgroup] 2026-10-21T03:19:58.9191242Z ##[end-action id=__self.vp;outcome=success;conclusion=success;duration_ms=7] 2026-10-21T03:19:58.9192740Z ##[start-action display=Cache Vite+;id=__self.__actions_cache] 2026-10-21T03:19:58.9271682Z ##[group]Run actions/cache@v6 2026-10-21T03:19:58.9271860Z with: 2026-10-21T03:19:58.9272027Z path: ~/.vite-plus 2026-10-21T03:19:58.9272225Z key: vite-plus-home-v1-Linux-X64-1.0.0 2026-10-21T03:19:58.9272425Z enableCrossOsArchive: false 2026-10-21T03:19:58.9272599Z fail-on-cache-miss: false 2026-10-21T03:19:58.9272822Z lookup-only: false 2026-10-21T03:19:58.9273087Z save-always: false 2026-10-21T03:19:58.9273336Z env: 2026-10-21T03:19:58.9273579Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 149 2026-10-21T03:19:58.9273790Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 422 2026-10-21T03:19:58.9273972Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-21T03:19:58.9274147Z ##[endgroup] 2026-10-21T03:19:59.1530972Z Cache hit for: vite-plus-home-v1-Linux-X64-1.0.0 2026-10-21T03:19:59.4137006Z Received 101637395 of 101637395 (100.0%), 403.9 MBs/sec 2026-10-21T03:19:59.4137295Z Cache Size: ~97 MB (101637395 B) 2026-10-21T03:19:59.4151701Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/4e7f8f58-67f7-4193-bf30-e5ed3ac20923/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-21T03:19:59.8825508Z Cache restored successfully 2026-10-21T03:19:59.8956929Z Cache restored from key: vite-plus-home-v1-Linux-X64-1.0.0 2026-10-21T03:19:59.9025216Z ##[end-action id=__self.__actions_cache;outcome=success;conclusion=success;duration_ms=983] 2026-10-21T03:19:59.9027617Z ##[start-action display=Setup Vite+;id=__self.__voidzero-dev_setup-vp] 2026-10-21T03:19:59.9066232Z ##[group]Run voidzero-dev/setup-vp@v1 2026-10-21T03:19:59.9066408Z with: 2026-10-21T03:19:59.9066535Z node-version-file: package.json 2026-10-21T03:19:59.9066683Z cache: false 2026-10-21T03:19:59.9066804Z run-install: false 2026-10-21T03:19:59.9066924Z sfw: false 2026-10-21T03:19:59.9067044Z env: 2026-10-21T03:19:59.9067172Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 149 2026-10-21T03:19:59.9067336Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 422 2026-10-21T03:19:59.9067492Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-21T03:19:59.9067643Z ##[endgroup] 2026-10-21T03:19:59.9771195Z Resolved Node.js version '^24.13.1' from package.json 2026-10-21T03:19:59.9898673Z Resolved Vite+ version '1.0.0' from package.json 2026-10-21T03:19:59.9899168Z Installing Vite+@1.0.0... 2026-10-21T03:19:59.9924175Z [command]/usr/bin/bash -c set -o pipefail; curl -fsSL --connect-timeout 5 --max-time 15 https://viteplus.dev/install.sh | bash 2026-10-21T03:20:00.4440296Z info: installing vite-plus@1.0.0... 2026-10-21T03:20:00.4441426Z info: Preparing Node.js and pnpm... 2026-10-21T03:20:00.4771635Z info: Installing dependencies... 2026-10-21T03:20:01.6914525Z ✓ Dependencies installed. 2026-10-21T03:20:01.6923313Z Setup: 2026-10-21T03:20:01.6923520Z Preparing vite-plus environment. 2026-10-21T03:20:01.6923669Z 2026-10-21T03:20:01.6933921Z Created Shims: 2026-10-21T03:20:01.6934158Z /home/runner/.vite-plus/bin/node 2026-10-21T03:20:01.6934989Z /home/runner/.vite-plus/bin/npm 2026-10-21T03:20:01.6935272Z /home/runner/.vite-plus/bin/npx 2026-10-21T03:20:01.6935505Z /home/runner/.vite-plus/bin/pnpm 2026-10-21T03:20:01.6935748Z /home/runner/.vite-plus/bin/pnpx 2026-10-21T03:20:01.6935990Z /home/runner/.vite-plus/bin/pn 2026-10-21T03:20:01.6936683Z /home/runner/.vite-plus/bin/pnx 2026-10-21T03:20:01.6936910Z /home/runner/.vite-plus/bin/yarn 2026-10-21T03:20:01.6937144Z /home/runner/.vite-plus/bin/yarnpkg 2026-10-21T03:20:01.6937407Z /home/runner/.vite-plus/bin/bun 2026-10-21T03:20:01.6937669Z /home/runner/.vite-plus/bin/bunx 2026-10-21T03:20:01.6937933Z /home/runner/.vite-plus/bin/vpx 2026-10-21T03:20:01.6938168Z /home/runner/.vite-plus/bin/vpr 2026-10-21T03:20:01.6938317Z 2026-10-21T03:20:01.6938398Z Next Steps: 2026-10-21T03:20:01.6938576Z For Bash, run: 2026-10-21T03:20:01.6938775Z . "/home/runner/.vite-plus/env" 2026-10-21T03:20:01.6938916Z 2026-10-21T03:20:01.6939178Z If your ~/.bashrc does not already load Vite+, add this command for interactive non-login Bash sessions. 2026-10-21T03:20:01.6939664Z Login Bash shells must also load the command through their login profile. 2026-10-21T03:20:01.6939906Z 2026-10-21T03:20:01.6940110Z Restart an already-running IDE to load its environment. Run `vp env doctor` to verify. 2026-10-21T03:20:01.6940615Z ✓ Vite+ setup complete. 2026-10-21T03:20:01.6986086Z Setting up Node.js ^24.13.1 via vp env use... 2026-10-21T03:20:01.6991440Z [command]/home/runner/.vite-plus/bin/vp env use ^24.13.1 2026-10-21T03:20:01.7023480Z Using Node.js v24.22.0 (resolved from ^24.13.1) 2026-10-21T03:20:01.7065275Z vp v1.0.0 2026-10-21T03:20:01.7065389Z 2026-10-21T03:20:01.7065477Z Local vite-plus: 2026-10-21T03:20:01.7065674Z vite-plus Not found 2026-10-21T03:20:01.7065803Z 2026-10-21T03:20:01.7065878Z Tools: 2026-10-21T03:20:01.7066056Z vite Not found 2026-10-21T03:20:01.7066273Z rolldown Not found 2026-10-21T03:20:01.7066487Z vitest Not found 2026-10-21T03:20:01.7066702Z oxfmt Not found 2026-10-21T03:20:01.7066906Z oxlint Not found 2026-10-21T03:20:01.7067119Z oxlint-tsgolint Not found 2026-10-21T03:20:01.7067341Z tsdown Not found 2026-10-21T03:20:01.7067473Z 2026-10-21T03:20:01.7067579Z Environment: 2026-10-21T03:20:01.7067772Z Package manager pnpm v11.10.0 2026-10-21T03:20:01.7068029Z Node.js v24.22.0 (.session-node-version) 2026-10-21T03:20:01.7112961Z ##[end-action id=__self.__voidzero-dev_setup-vp;outcome=success;conclusion=success;duration_ms=1808] 2026-10-21T03:20:01.7115342Z ##[start-action display=Resolve pnpm store path;id=__self.pnpm_store] 2026-10-21T03:20:01.7127910Z ##[group]Run store_path="$(vp pm cache dir)" 2026-10-21T03:20:01.7128183Z store_path="$(vp pm cache dir)" 2026-10-21T03:20:01.7128419Z echo "path=$store_path" >> "$GITHUB_OUTPUT" 2026-10-21T03:20:01.7140929Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-21T03:20:01.7141172Z env: 2026-10-21T03:20:01.7141365Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 149 2026-10-21T03:20:01.7141585Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 422 2026-10-21T03:20:01.7141795Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-21T03:20:01.7155927Z ##[endgroup] 2026-10-21T03:20:02.0553154Z ##[end-action id=__self.pnpm_store;outcome=success;conclusion=success;duration_ms=343] 2026-10-21T03:20:02.0555659Z ##[start-action display=Cache full pnpm store;id=__self.__actions_cache_2] 2026-10-21T03:20:02.1231744Z ##[group]Run actions/cache@v6 2026-10-21T03:20:02.1231979Z with: 2026-10-21T03:20:02.1232183Z path: /home/runner/.local/share/pnpm/store/v11 2026-10-21T03:20:02.1232599Z key: pnpm-full-v1-Linux-X64-68ecfee7dce3960a4e095879378684d06946a297346201d9bd411a74fc6057ea 2026-10-21T03:20:02.1233010Z restore-keys: pnpm-full-v1-Linux-X64- 2026-10-21T03:20:02.1233252Z enableCrossOsArchive: false 2026-10-21T03:20:02.1233472Z fail-on-cache-miss: false 2026-10-21T03:20:02.1233610Z lookup-only: false 2026-10-21T03:20:02.1233727Z save-always: false 2026-10-21T03:20:02.1233839Z env: 2026-10-21T03:20:02.1233957Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 149 2026-10-21T03:20:02.1234107Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 422 2026-10-21T03:20:02.1234259Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-21T03:20:02.1234407Z ##[endgroup] 2026-10-21T03:20:02.3384459Z Cache hit for: pnpm-full-v1-Linux-X64-68ecfee7dce3960a4e095879378684d06946a297346201d9bd411a74fc6057ea 2026-10-21T03:20:03.4432578Z Received 671088640 of 931998583 (72.0%), 591.0 MBs/sec 2026-10-21T03:20:03.9628699Z Received 931998583 of 931998583 (100.0%), 554.8 MBs/sec 2026-10-21T03:20:03.9630437Z Cache Size: ~889 MB (931998583 B) 2026-10-21T03:20:03.9675959Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/9096024e-94f1-41ef-afd7-b4f0aeaa769d/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-21T03:20:09.9972601Z Cache restored successfully 2026-10-21T03:20:10.0519926Z Cache restored from key: pnpm-full-v1-Linux-X64-68ecfee7dce3960a4e095879378684d06946a297346201d9bd411a74fc6057ea 2026-10-21T03:20:10.0630783Z ##[end-action id=__self.__actions_cache_2;outcome=success;conclusion=success;duration_ms=8007] 2026-10-21T03:20:10.0634487Z ##[start-action display=Install dependencies;id=__self.__run] 2026-10-21T03:20:10.0650604Z ##[group]Run vp install 2026-10-21T03:20:10.0650790Z vp install 2026-10-21T03:20:10.0662901Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-21T03:20:10.0663145Z env: 2026-10-21T03:20:10.0663315Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 149 2026-10-21T03:20:10.0663495Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 422 2026-10-21T03:20:10.0663684Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-21T03:20:10.0663976Z ##[endgroup] 2026-10-21T03:20:10.3849084Z Scope: all 33 workspace projects 2026-10-21T03:20:10.4918856Z ? Verifying lockfile against supply-chain policies (2174 entries)... 2026-10-21T03:20:10.5605944Z Lockfile is up to date, resolution step is skipped 2026-10-21T03:20:10.6998994Z Progress: resolved 1, reused 0, downloaded 0, added 0 2026-10-21T03:20:10.7769524Z Packages: +1772 2026-10-21T03:20:10.7770163Z ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2026-10-21T03:20:11.7035723Z Progress: resolved 1772, reused 1332, downloaded 0, added 0 2026-10-21T03:20:12.7038484Z Progress: resolved 1772, reused 1759, downloaded 0, added 731 2026-10-21T03:20:13.7125873Z Progress: resolved 1772, reused 1759, downloaded 0, added 1602 2026-10-21T03:20:14.7148590Z Progress: resolved 1772, reused 1759, downloaded 0, added 1771 2026-10-21T03:20:15.5475023Z Progress: resolved 1772, reused 1759, downloaded 0, added 1772, done 2026-10-21T03:20:15.6414114Z ✓ Lockfile passes supply-chain policies (2174 entries in 5.1s) 2026-10-21T03:20:18.2571059Z 2026-10-21T03:20:18.2571734Z devDependencies: 2026-10-21T03:20:18.2572037Z + @coderabbitai/config 1.1.0 2026-10-21T03:20:18.2572283Z + @effect/tsgo 0.51.1 2026-10-21T03:20:18.2572485Z + @shadcn/lint 0.1.5 2026-10-21T03:20:18.2572754Z + @types/node 24.12.4 2026-10-21T03:20:18.2572942Z + knip 6.34.0 2026-10-21T03:20:18.2573116Z + tsc-rs 0.7.0 2026-10-21T03:20:18.2573299Z + typescript 7.0.2 2026-10-21T03:20:18.2573479Z + vite-plus 1.0.0 2026-10-21T03:20:18.2573591Z 2026-10-21T03:20:18.2613724Z . prepare$ effect-tsgo patch && vp config --no-agent 2026-10-21T03:20:18.5615288Z . prepare: Patched typescript at /home/runner/_work/t3code/t3code/node_modules/.pnpm/@typescript+typescript-linux-x64@7.0.2/node_modules/@typescript/typescript-linux-x64/lib/tsc 2026-10-21T03:20:18.6733963Z . prepare: Done 2026-10-21T03:20:18.8501242Z Done in 8.7s using pnpm v11.10.0 2026-10-21T03:20:18.9238670Z ##[end-action id=__self.__run;outcome=success;conclusion=success;duration_ms=8860] 2026-10-21T03:20:18.9267206Z ##[group]Run vp run --filter @t3tools/desktop ensure:electron 2026-10-21T03:20:18.9267482Z vp run --filter @t3tools/desktop ensure:electron 2026-10-21T03:20:18.9278788Z shell: /usr/bin/bash -e {0} 2026-10-21T03:20:18.9278927Z env: 2026-10-21T03:20:18.9279053Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 149 2026-10-21T03:20:18.9279223Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 422 2026-10-21T03:20:18.9279385Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-21T03:20:18.9279539Z ##[endgroup] 2026-10-21T03:20:19.1124594Z ~/apps/desktop$ node scripts/ensure-electron-runtime.mjs ⊘ cache disabled 2026-10-21T03:20:20.2012642Z /home/runner/_work/t3code/t3code/node_modules/.pnpm/electron@44.4.5/node_modules/electron/dist/electron 2026-10-21T03:20:20.2033320Z 2026-10-21T03:20:20.2154433Z ##[group]Run vp run knip:check 2026-10-21T03:20:20.2154712Z vp run knip:check 2026-10-21T03:20:20.2164320Z shell: /usr/bin/bash -e {0} 2026-10-21T03:20:20.2164474Z env: 2026-10-21T03:20:20.2164594Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 149 2026-10-21T03:20:20.2164745Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 422 2026-10-21T03:20:20.2164893Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-21T03:20:20.2165036Z ##[endgroup] 2026-10-21T03:20:20.3726135Z $ knip --include files,dependencies --no-config-hints ⊘ cache disabled 2026-10-21T03:20:24.8233920Z 2026-10-21T03:20:24.8238984Z $ 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-21T03:20:53.3900647Z 2026-10-21T03:20:53.3901748Z --- 2026-10-21T03:20:53.3902040Z vp run: 0/2 cache hit (0%). (Run `vp run --last-details` for full details) 2026-10-21T03:20:53.3999367Z ##[group]Run vp run --filter @t3tools/source-control-github generate --check 2026-10-21T03:20:53.3999750Z vp run --filter @t3tools/source-control-github generate --check 2026-10-21T03:20:53.4008971Z shell: /usr/bin/bash -e {0} 2026-10-21T03:20:53.4009127Z env: 2026-10-21T03:20:53.4009262Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 149 2026-10-21T03:20:53.4009415Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 422 2026-10-21T03:20:53.4009562Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-21T03:20:53.4009702Z ##[endgroup] 2026-10-21T03:20:53.5520037Z ~/packages/source-control-github$ graphqlgen --check ⊘ cache disabled 2026-10-21T03:20:53.7587735Z 2026-10-21T03:20:53.7681770Z ##[group]Run vp run --filter t3 generate --check 2026-10-21T03:20:53.7681990Z vp run --filter t3 generate --check 2026-10-21T03:20:53.7691796Z shell: /usr/bin/bash -e {0} 2026-10-21T03:20:53.7691951Z env: 2026-10-21T03:20:53.7692064Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 149 2026-10-21T03:20:53.7692214Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 422 2026-10-21T03:20:53.7692358Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-21T03:20:53.7692495Z ##[endgroup] 2026-10-21T03:20:53.9349072Z ~/apps/server$ graphqlgen --check ⊘ cache disabled 2026-10-21T03:20:54.1081375Z 2026-10-21T03:20:54.1155358Z ##[group]Run vp check 2026-10-21T03:20:54.1155515Z vp check 2026-10-21T03:20:54.1164810Z shell: /usr/bin/bash -e {0} 2026-10-21T03:20:54.1164941Z env: 2026-10-21T03:20:54.1165059Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 149 2026-10-21T03:20:54.1165207Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 422 2026-10-21T03:20:54.1165368Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-21T03:20:54.1165514Z ##[endgroup] 2026-10-21T03:20:55.2255420Z pass: All 5506 files are correctly formatted (952ms, 8 threads) 2026-10-21T03:21:02.1988565Z warn: Lint warnings found 2026-10-21T03:21:02.1990526Z ⚠ 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-21T03:21:02.1991670Z ╭─[apps/server/src/background/HostPowerMonitor.test.ts:133:11] 2026-10-21T03:21:02.1992188Z 132 │ const monitor = yield* HostPowerMonitor.HostPowerMonitor; 2026-10-21T03:21:02.1992715Z 133 │ ╭─▶ for ( 2026-10-21T03:21:02.1993122Z 134 │ │ let attempt = 0; 2026-10-21T03:21:02.1993589Z 135 │ │ attempt < 100 && (yield* monitor.snapshot).onBattery !== "true"; 2026-10-21T03:21:02.1994041Z 136 │ │ attempt += 1 2026-10-21T03:21:02.1994398Z 137 │ │ ) { 2026-10-21T03:21:02.1994765Z 138 │ │ yield* Effect.yieldNow; 2026-10-21T03:21:02.1995164Z 139 │ ╰─▶ } 2026-10-21T03:21:02.1995439Z 140 │ expect((yield* monitor.snapshot).onBattery).toBe("true"); 2026-10-21T03:21:02.1995642Z ╰──── 2026-10-21T03:21:02.1995704Z 2026-10-21T03:21:02.1996007Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-21T03:21:02.1996448Z ╭─[apps/web/src/components/settings/SettingInheritance.tsx:163:24] 2026-10-21T03:21:02.1996676Z 162 │ keys, 2026-10-21T03:21:02.1996824Z 163 │ overridingProjects = [], 2026-10-21T03:21:02.1997031Z ·  ── 2026-10-21T03:21:02.1997209Z 164 │ onClearOverrides, 2026-10-21T03:21:02.1997353Z ╰──── 2026-10-21T03:21:02.1997738Z  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-21T03:21:02.1998433Z 2026-10-21T03:21:02.1998699Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.1999105Z ╭─[apps/mobile/src/features/threads/use-worktree-setup.ts:30:40] 2026-10-21T03:21:02.1999432Z 28 │ const snapshot = resolveWorktreeSetupSnapshot(input.threadId, query.data, live); 2026-10-21T03:21:02.1999673Z 29 │ useEffect(() => { 2026-10-21T03:21:02.1999834Z ·  ────┬──── 2026-10-21T03:21:02.2000069Z · ╰── This is the containing effect 2026-10-21T03:21:02.2000348Z 30 │ if (snapshot && snapshot !== live) setHeld({ key, snapshot }); 2026-10-21T03:21:02.2000596Z ·  ───┬─── 2026-10-21T03:21:02.2000978Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2001238Z 31 │ }, [key, live, snapshot]); 2026-10-21T03:21:02.2001382Z ╰──── 2026-10-21T03:21:02.2002051Z  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-21T03:21:02.2003184Z  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-21T03:21:02.2003584Z 2026-10-21T03:21:02.2003805Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-21T03:21:02.2004165Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:681:7] 2026-10-21T03:21:02.2004426Z 680 │ if (settingsSheetPresentation.isActive) { 2026-10-21T03:21:02.2004681Z 681 │ settingsRoutePresentation.present(settingsRouteSession); 2026-10-21T03:21:02.2004927Z ·  ────────────┬──────────── 2026-10-21T03:21:02.2005207Z · ╰── Missing dependency `settingsRoutePresentation` 2026-10-21T03:21:02.2005437Z 682 │ } 2026-10-21T03:21:02.2005717Z 683 │ }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]); 2026-10-21T03:21:02.2006038Z ·  ────────────────┬──────────────── 2026-10-21T03:21:02.2006431Z · ╰── Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead 2026-10-21T03:21:02.2006751Z 684 │ 2026-10-21T03:21:02.2006866Z ╰──── 2026-10-21T03:21:02.2007343Z  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-21T03:21:02.2008078Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2008380Z 2026-10-21T03:21:02.2008549Z ⚠ react(immutability): This value cannot be modified 2026-10-21T03:21:02.2008861Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:298:5] 2026-10-21T03:21:02.2009181Z 294 │ typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0; 2026-10-21T03:21:02.2009489Z 295 │ const animatedBorderRadius = useSharedValue(targetBorderRadius); 2026-10-21T03:21:02.2009734Z ·  ──────────┬───────── 2026-10-21T03:21:02.2009994Z · ╰── `animatedBorderRadius` originates here 2026-10-21T03:21:02.2010312Z 296 │ const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android"; 2026-10-21T03:21:02.2010553Z 297 │ useLayoutEffect(() => { 2026-10-21T03:21:02.2010808Z 298 │ animatedBorderRadius.value = shouldAnimate 2026-10-21T03:21:02.2011062Z ·  ──────────┬───────── 2026-10-21T03:21:02.2011329Z · ╰── `animatedBorderRadius` cannot be modified 2026-10-21T03:21:02.2011582Z 299 │ ? withTiming(targetBorderRadius, { 2026-10-21T03:21:02.2011743Z ╰──── 2026-10-21T03:21:02.2012072Z  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-21T03:21:02.2012815Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-21T03:21:02.2013304Z 2026-10-21T03:21:02.2013896Z ⚠ 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-21T03:21:02.2014823Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:50:18] 2026-10-21T03:21:02.2015399Z 49 │ for (const tool of ["sendMessage", "followupTask", "interruptAgent", "listAgents"]) { 2026-10-21T03:21:02.2016001Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-21T03:21:02.2016456Z ·  ───────── 2026-10-21T03:21:02.2016922Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-21T03:21:02.2017327Z ╰──── 2026-10-21T03:21:02.2017421Z 2026-10-21T03:21:02.2017973Z ⚠ 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-21T03:21:02.2018726Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:51:18] 2026-10-21T03:21:02.2019267Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-21T03:21:02.2019872Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-21T03:21:02.2020305Z ·  ───────── 2026-10-21T03:21:02.2020558Z 52 │ } 2026-10-21T03:21:02.2020777Z ╰──── 2026-10-21T03:21:02.2020868Z 2026-10-21T03:21:02.2021237Z ⚠ 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-21T03:21:02.2021690Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:55:5] 2026-10-21T03:21:02.2021920Z 54 │ assert.equal( 2026-10-21T03:21:02.2022177Z 55 │ Schema.is(CodexSchema.ServerNotification__CollabAgentToolCallStatus)("interrupted"), 2026-10-21T03:21:02.2022437Z ·  ───────── 2026-10-21T03:21:02.2022592Z 56 │ true, 2026-10-21T03:21:02.2022721Z ╰──── 2026-10-21T03:21:02.2022776Z 2026-10-21T03:21:02.2023111Z ⚠ 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-21T03:21:02.2023561Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:59:5] 2026-10-21T03:21:02.2023778Z 58 │ assert.equal( 2026-10-21T03:21:02.2024040Z 59 │ Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentToolCallStatus)("interrupted"), 2026-10-21T03:21:02.2024304Z ·  ───────── 2026-10-21T03:21:02.2024449Z 60 │ true, 2026-10-21T03:21:02.2024572Z ╰──── 2026-10-21T03:21:02.2024628Z 2026-10-21T03:21:02.2024962Z ⚠ 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-21T03:21:02.2025425Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:103:16] 2026-10-21T03:21:02.2025636Z 102 │ 2026-10-21T03:21:02.2025871Z 103 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse)(resumeResponse), true); 2026-10-21T03:21:02.2026135Z ·  ───────── 2026-10-21T03:21:02.2026292Z 104 │ }); 2026-10-21T03:21:02.2026409Z ╰──── 2026-10-21T03:21:02.2026468Z 2026-10-21T03:21:02.2026668Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-21T03:21:02.2027007Z ╭─[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9] 2026-10-21T03:21:02.2027252Z 35 │ { 2026-10-21T03:21:02.2034785Z 174 │ rotation.value = withTiming(props.expanded ? expandedAngle : 0, { 2026-10-21T03:21:02.2035030Z ·  ────┬─── 2026-10-21T03:21:02.2035255Z · ╰── `rotation` cannot be modified 2026-10-21T03:21:02.2035502Z 175 │ duration: THREAD_DISCLOSURE_TRANSITION_MS, 2026-10-21T03:21:02.2035677Z ╰──── 2026-10-21T03:21:02.2036007Z  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-21T03:21:02.2036582Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-21T03:21:02.2036881Z 2026-10-21T03:21:02.2037085Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-21T03:21:02.2037436Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:1246:23] 2026-10-21T03:21:02.2037664Z 1245 │ 2026-10-21T03:21:02.2044336Z 1269 │ Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe( 2026-10-21T03:21:02.2044623Z ·  ────────────────────────── 2026-10-21T03:21:02.2044886Z 1270 │ Effect.mapError(() => AcpError.AcpRequestError.invalidParams()), 2026-10-21T03:21:02.2045098Z ╰──── 2026-10-21T03:21:02.2045158Z 2026-10-21T03:21:02.2045624Z ⚠ 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-21T03:21:02.2046236Z ╭─[packages/effect-acp/src/errors.test.ts:129:28] 2026-10-21T03:21:02.2046504Z 128 │ const secret = "acp-summary-secret"; 2026-10-21T03:21:02.2046731Z 129 │ const cause = yield* Schema.decodeUnknownEffect( 2026-10-21T03:21:02.2046986Z ·  ────────────────────────── 2026-10-21T03:21:02.2047180Z 130 │ Schema.Struct({ 2026-10-21T03:21:02.2047325Z ╰──── 2026-10-21T03:21:02.2047380Z 2026-10-21T03:21:02.2047594Z ⚠ eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used. 2026-10-21T03:21:02.2047908Z ╭─[infra/relay/src/http/Api.ts:69:13] 2026-10-21T03:21:02.2048168Z 68 │ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts"; 2026-10-21T03:21:02.2048439Z 69 │ import * as HookForwarder from "../hooks/HookForwarder.ts"; 2026-10-21T03:21:02.2048665Z ·  ──────┬────── 2026-10-21T03:21:02.2048917Z · ╰── 'HookForwarder' is imported here 2026-10-21T03:21:02.2049170Z 70 │ import * as HeldHooks from "../hooks/HeldHooks.ts"; 2026-10-21T03:21:02.2049340Z ╰──── 2026-10-21T03:21:02.2049504Z  help: Consider removing this import. 2026-10-21T03:21:02.2049624Z 2026-10-21T03:21:02.2050070Z ⚠ 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-21T03:21:02.2050602Z ╭─[apps/server/src/serverSettings.test.ts:1718:32] 2026-10-21T03:21:02.2051004Z 1717 │ const model = createModelSelection(ProviderInstanceId.make("codex"), "gpt-5.5"); 2026-10-21T03:21:02.2051377Z 1718 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-21T03:21:02.2051685Z ·  ─────────────────── 2026-10-21T03:21:02.2051922Z 1719 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-21T03:21:02.2052100Z ╰──── 2026-10-21T03:21:02.2052162Z 2026-10-21T03:21:02.2052606Z ⚠ 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-21T03:21:02.2053130Z ╭─[apps/server/src/serverSettings.test.ts:1719:34] 2026-10-21T03:21:02.2053455Z 1718 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-21T03:21:02.2053759Z 1719 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-21T03:21:02.2054005Z ·  ─────────────────── 2026-10-21T03:21:02.2054249Z 1720 │ Schema.fromJsonString(Schema.Array(ProjectScript)), 2026-10-21T03:21:02.2054453Z ╰──── 2026-10-21T03:21:02.2054512Z 2026-10-21T03:21:02.2054782Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-21T03:21:02.2055157Z ╭─[apps/server/src/usage/UsageService.ts:169:7] 2026-10-21T03:21:02.2055342Z 168 │ 2026-10-21T03:21:02.2055488Z 169 │ const layerTest = Layer.succeed( 2026-10-21T03:21:02.2055670Z ·  ────┬──── 2026-10-21T03:21:02.2055899Z · ╰── 'layerTest' is declared here 2026-10-21T03:21:02.2056105Z 170 │ UsageService, 2026-10-21T03:21:02.2056341Z ╰──── 2026-10-21T03:21:02.2056546Z  help: Consider removing this declaration. 2026-10-21T03:21:02.2056670Z 2026-10-21T03:21:02.2056900Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-21T03:21:02.2057314Z ╭─[packages/provider-opencode/src/server/OpenCodeRuntime.environment.test.ts:53:14] 2026-10-21T03:21:02.2057564Z 52 │ 2026-10-21T03:21:02.2057695Z 53 │ for (const {} of [ 2026-10-21T03:21:02.2057858Z ·  ── 2026-10-21T03:21:02.2058018Z 54 │ { healthy: true }, 2026-10-21T03:21:02.2058159Z ╰──── 2026-10-21T03:21:02.2058456Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-21T03:21:02.2058687Z 2026-10-21T03:21:02.2059169Z ⚠ 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-21T03:21:02.2059728Z ╭─[apps/server/src/usage/UsageService.test.ts:2374:7] 2026-10-21T03:21:02.2059975Z 2373 │ let orphanedAt: number | undefined; 2026-10-21T03:21:02.2060325Z 2374 │ ╭─▶ for (let interruptAt = 1; interruptAt <= 31; interruptAt += 1) { 2026-10-21T03:21:02.2060668Z 2375 │ │ const tasks: Array<() => void> = []; 2026-10-21T03:21:02.2061039Z 2376 │ │ const dispatcher: Scheduler.SchedulerDispatcher = { 2026-10-21T03:21:02.2061331Z 2377 │ │ scheduleTask: (task) => tasks.push(task), 2026-10-21T03:21:02.2061586Z 2378 │ │ flush: () => { 2026-10-21T03:21:02.2061833Z 2379 │ │ let task: (() => void) | undefined; 2026-10-21T03:21:02.2062125Z 2380 │ │ while ((task = tasks.shift()) !== undefined) task(); 2026-10-21T03:21:02.2062363Z 2381 │ │ }, 2026-10-21T03:21:02.2062553Z 2382 │ │ }; 2026-10-21T03:21:02.2062726Z 2383 │ │ 2026-10-21T03:21:02.2062980Z 2384 │ │ let requestFiber: Fiber.Fiber | undefined; 2026-10-21T03:21:02.2063252Z 2385 │ │ let requestChecks = 0; 2026-10-21T03:21:02.2063512Z 2386 │ │ const scheduler: Scheduler.Scheduler = { 2026-10-21T03:21:02.2063765Z 2387 │ │ executionMode: "async", 2026-10-21T03:21:02.2064022Z 2388 │ │ makeDispatcher: () => dispatcher, 2026-10-21T03:21:02.2064279Z 2389 │ │ shouldYield: (fiber) => { 2026-10-21T03:21:02.2064543Z 2390 │ │ if (fiber !== requestFiber) return false; 2026-10-21T03:21:02.2064796Z 2391 │ │ requestChecks += 1; 2026-10-21T03:21:02.2065068Z 2392 │ │ if (requestChecks !== interruptAt) return false; 2026-10-21T03:21:02.2065337Z 2393 │ │ fiber.interruptUnsafe(); 2026-10-21T03:21:02.2065569Z 2394 │ │ return true; 2026-10-21T03:21:02.2065767Z 2395 │ │ }, 2026-10-21T03:21:02.2065954Z 2396 │ │ }; 2026-10-21T03:21:02.2066130Z 2397 │ │ 2026-10-21T03:21:02.2066419Z 2398 │ │ const input: UsageSummaryInput = { 2026-10-21T03:21:02.2066701Z 2399 │ │ ...WINDOW, 2026-10-21T03:21:02.2066944Z 2400 │ │ sinceDay: UsageDay.make("2026-09-01"), 2026-10-21T03:21:02.2067296Z 2401 │ │ untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`), 2026-10-21T03:21:02.2067567Z 2402 │ │ }; 2026-10-21T03:21:02.2067783Z 2403 │ │ const first = yield* service 2026-10-21T03:21:02.2068019Z 2404 │ │ .readSummary(input) 2026-10-21T03:21:02.2068233Z 2405 │ │ .pipe( 2026-10-21T03:21:02.2068439Z 2406 │ │ Effect.exit, 2026-10-21T03:21:02.2068721Z 2407 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-21T03:21:02.2068993Z 2408 │ │ Effect.forkChild, 2026-10-21T03:21:02.2069196Z 2409 │ │ ); 2026-10-21T03:21:02.2069404Z 2410 │ │ requestFiber = first; 2026-10-21T03:21:02.2069632Z 2411 │ │ yield* Effect.yieldNow; 2026-10-21T03:21:02.2069862Z 2412 │ │ dispatcher.flush(); 2026-10-21T03:21:02.2070052Z 2413 │ │ 2026-10-21T03:21:02.2070294Z 2414 │ │ const second = yield* service.readSummary(input).pipe( 2026-10-21T03:21:02.2070550Z 2415 │ │ Effect.match({ 2026-10-21T03:21:02.2070853Z 2416 │ │ onFailure: (error) => error.reason, 2026-10-21T03:21:02.2071122Z 2417 │ │ onSuccess: () => "success" as const, 2026-10-21T03:21:02.2071349Z 2418 │ │ }), 2026-10-21T03:21:02.2071609Z 2419 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-21T03:21:02.2071881Z 2420 │ │ Effect.forkChild, 2026-10-21T03:21:02.2072081Z 2421 │ │ ); 2026-10-21T03:21:02.2072291Z 2422 │ │ yield* Effect.yieldNow; 2026-10-21T03:21:02.2072517Z 2423 │ │ dispatcher.flush(); 2026-10-21T03:21:02.2072761Z 2424 │ │ const secondExit = second.pollUnsafe(); 2026-10-21T03:21:02.2073024Z 2425 │ │ if (secondExit === undefined) { 2026-10-21T03:21:02.2073270Z 2426 │ │ second.interruptUnsafe(); 2026-10-21T03:21:02.2073522Z 2427 │ │ orphanedAt = interruptAt; 2026-10-21T03:21:02.2073741Z 2428 │ │ break; 2026-10-21T03:21:02.2073934Z 2429 │ │ } 2026-10-21T03:21:02.2074155Z 2430 │ │ if (Exit.isFailure(secondExit)) { 2026-10-21T03:21:02.2074452Z 2431 │ │ assert.fail("the matching request fiber was interrupted"); 2026-10-21T03:21:02.2074696Z 2432 │ │ } 2026-10-21T03:21:02.2074952Z 2433 │ │ assert.strictEqual(secondExit.value, "invalidWindow"); 2026-10-21T03:21:02.2075246Z 2434 │ ╰─▶ } 2026-10-21T03:21:02.2075446Z 2435 │ 2026-10-21T03:21:02.2075568Z ╰──── 2026-10-21T03:21:02.2075628Z 2026-10-21T03:21:02.2075963Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-21T03:21:02.2076393Z ╭─[packages/provider-opencode/src/server/adapter.ts:3747:7] 2026-10-21T03:21:02.2076599Z 3746 │ 2026-10-21T03:21:02.2076875Z 3747 │ const layer: Layer.Layer = 2026-10-21T03:21:02.2077160Z ·  ──┬── 2026-10-21T03:21:02.2077382Z · ╰── 'layer' is declared here 2026-10-21T03:21:02.2077583Z 3748 │ Layer.effect( 2026-10-21T03:21:02.2077721Z ╰──── 2026-10-21T03:21:02.2077957Z  help: Consider removing this declaration. 2026-10-21T03:21:02.2078081Z 2026-10-21T03:21:02.2078377Z ⚠ eslint(no-unused-vars): Variable 'legacyCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-21T03:21:02.2078809Z ╭─[packages/provider-cursor/src/server/credentialStore.test.ts:15:7] 2026-10-21T03:21:02.2079033Z 14 │ 2026-10-21T03:21:02.2079169Z 15 │ const legacyCredentials = { 2026-10-21T03:21:02.2079353Z ·  ────────┬──────── 2026-10-21T03:21:02.2079599Z · ╰── 'legacyCredentials' is declared here 2026-10-21T03:21:02.2079819Z 16 │ version: 1 as const, 2026-10-21T03:21:02.2079961Z ╰──── 2026-10-21T03:21:02.2080121Z  help: Consider removing this declaration. 2026-10-21T03:21:02.2080246Z 2026-10-21T03:21:02.2080684Z ⚠ 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-21T03:21:02.2081318Z ╭─[apps/server/src/provider/acp/AntigravityProtocol.ts:263:20] 2026-10-21T03:21:02.2081564Z 262 │ ...(update._meta !== undefined 2026-10-21T03:21:02.2081838Z 263 │ ? { _meta: Schema.is(Schema.Record(Schema.String, Schema.Json))(meta) ? meta : null } 2026-10-21T03:21:02.2082105Z ·  ───────── 2026-10-21T03:21:02.2082274Z 264 │ : {}), 2026-10-21T03:21:02.2082407Z ╰──── 2026-10-21T03:21:02.2082467Z 2026-10-21T03:21:02.2082727Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-21T03:21:02.2083104Z ╭─[apps/server/src/serverRuntimeStartup.ts:728:7] 2026-10-21T03:21:02.2083294Z 727 │ 2026-10-21T03:21:02.2083442Z 728 │ const layer = layerWithOptions(); 2026-10-21T03:21:02.2083625Z ·  ──┬── 2026-10-21T03:21:02.2083841Z · ╰── 'layer' is declared here 2026-10-21T03:21:02.2084027Z ╰──── 2026-10-21T03:21:02.2084195Z  help: Consider removing this declaration. 2026-10-21T03:21:02.2084314Z 2026-10-21T03:21:02.2084501Z ⚠ eslint(no-unused-vars): Type 'Scope' is imported but never used. 2026-10-21T03:21:02.2084825Z ╭─[apps/server/src/provider/ProviderAuthService.ts:15:18] 2026-10-21T03:21:02.2085062Z 14 │ import * as Layer from "effect/Layer"; 2026-10-21T03:21:02.2085265Z 15 │ import type * as Scope from "effect/Scope"; 2026-10-21T03:21:02.2085464Z ·  ──┬── 2026-10-21T03:21:02.2085698Z · ╰── 'Scope' is imported here 2026-10-21T03:21:02.2085929Z 16 │ import * as Stream from "effect/Stream"; 2026-10-21T03:21:02.2086184Z ╰──── 2026-10-21T03:21:02.2086398Z  help: Consider removing this import. 2026-10-21T03:21:02.2086514Z 2026-10-21T03:21:02.2086993Z ⚠ 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-21T03:21:02.2087582Z ╭─[apps/server/src/project/ProjectEnrichmentService.test.ts:28:3] 2026-10-21T03:21:02.2087807Z 27 │ ) { 2026-10-21T03:21:02.2088082Z 28 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-21T03:21:02.2088422Z 29 │ │ const available = yield* service.peek(workspaceRoot); 2026-10-21T03:21:02.2088713Z 30 │ │ if (predicate(available)) return available; 2026-10-21T03:21:02.2088962Z 31 │ │ yield* Effect.yieldNow; 2026-10-21T03:21:02.2089207Z 32 │ ╰─▶ } 2026-10-21T03:21:02.2089524Z 33 │ return yield* Effect.die(`Project metadata for ${workspaceRoot} was not resolved in time.`); 2026-10-21T03:21:02.2089768Z ╰──── 2026-10-21T03:21:02.2089826Z 2026-10-21T03:21:02.2090294Z ⚠ 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-21T03:21:02.2090930Z ╭─[apps/server/src/project/ProjectService.test.ts:94:3] 2026-10-21T03:21:02.2091136Z 93 │ ) { 2026-10-21T03:21:02.2091412Z 94 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-21T03:21:02.2091782Z 95 │ │ const project = Option.getOrThrow(yield* service.getById(projectId)); 2026-10-21T03:21:02.2092087Z 96 │ │ if (predicate(project)) return project; 2026-10-21T03:21:02.2092322Z 97 │ │ yield* Effect.yieldNow; 2026-10-21T03:21:02.2092563Z 98 │ ╰─▶ } 2026-10-21T03:21:02.2092845Z 99 │ return yield* Effect.die(`Project ${projectId} was not enriched in time.`); 2026-10-21T03:21:02.2093074Z ╰──── 2026-10-21T03:21:02.2093133Z 2026-10-21T03:21:02.2093610Z ⚠ 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-21T03:21:02.2094174Z ╭─[packages/contracts/src/composerContext.test.ts:181:18] 2026-10-21T03:21:02.2094461Z 180 │ it("sends a message without the records the wire cannot carry", () => { 2026-10-21T03:21:02.2094800Z 181 │ const wire = Schema.encodeUnknownSync(Schema.toCodecJson(OrchestrationMessageContext))({ 2026-10-21T03:21:02.2095100Z ·  ──────────────────────── 2026-10-21T03:21:02.2095283Z 182 │ version: 1, 2026-10-21T03:21:02.2095424Z ╰──── 2026-10-21T03:21:02.2095487Z 2026-10-21T03:21:02.2095777Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-21T03:21:02.2096183Z ╭─[packages/provider-cursor/src/server/auth.ts:249:20] 2026-10-21T03:21:02.2096382Z 248 │ }, 2026-10-21T03:21:02.2096615Z 249 │ (effect, flow, stopSessions) => 2026-10-21T03:21:02.2096866Z ·  ──────┬───── 2026-10-21T03:21:02.2097128Z · ╰── 'stopSessions' is declared here 2026-10-21T03:21:02.2097348Z 250 │ effect.pipe( 2026-10-21T03:21:02.2097490Z ╰──── 2026-10-21T03:21:02.2097654Z  help: Consider removing this parameter. 2026-10-21T03:21:02.2097778Z 2026-10-21T03:21:02.2097991Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-21T03:21:02.2098310Z ╭─[packages/contracts/src/rpc.ts:295:8] 2026-10-21T03:21:02.2098503Z 294 │ } from "./device.ts"; 2026-10-21T03:21:02.2098685Z 295 │ import {} from "./previewAutomation.ts"; 2026-10-21T03:21:02.2098871Z ·  ── 2026-10-21T03:21:02.2099035Z 296 │ import { 2026-10-21T03:21:02.2099163Z ╰──── 2026-10-21T03:21:02.2099310Z  help: Remove empty braces 2026-10-21T03:21:02.2099416Z 2026-10-21T03:21:02.2099643Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-21T03:21:02.2119485Z ╭─[scripts/lib/cli-external-packages.test.ts:114:11] 2026-10-21T03:21:02.2119733Z 113 │ const declared = { 2026-10-21T03:21:02.2119936Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-21T03:21:02.2120172Z ·  ──────────────────────────────── 2026-10-21T03:21:02.2120398Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-21T03:21:02.2120580Z ╰──── 2026-10-21T03:21:02.2121019Z  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-21T03:21:02.2121287Z 2026-10-21T03:21:02.2121530Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-21T03:21:02.2121881Z ╭─[scripts/lib/cli-external-packages.test.ts:115:11] 2026-10-21T03:21:02.2122116Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-21T03:21:02.2122332Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-21T03:21:02.2122573Z ·  ──────────────────────────────────────── 2026-10-21T03:21:02.2122797Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-21T03:21:02.2122969Z ╰──── 2026-10-21T03:21:02.2123294Z  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-21T03:21:02.2123553Z 2026-10-21T03:21:02.2123924Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-21T03:21:02.2124335Z ╭─[scripts/lib/cli-external-packages.test.ts:116:11] 2026-10-21T03:21:02.2124579Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-21T03:21:02.2124797Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-21T03:21:02.2125030Z ·  ──────────────────────────────────── 2026-10-21T03:21:02.2125267Z 117 │ }; 2026-10-21T03:21:02.2125396Z ╰──── 2026-10-21T03:21:02.2125724Z  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-21T03:21:02.2125983Z 2026-10-21T03:21:02.2126453Z ⚠ 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-21T03:21:02.2127013Z ╭─[packages/contracts/src/baseSchemas.test.ts:39:9] 2026-10-21T03:21:02.2127226Z 38 │ JSON.stringify( 2026-10-21T03:21:02.2127439Z 39 │ Schema.encodeUnknownSync(Schema.toCodecJson(Named))([ 2026-10-21T03:21:02.2127669Z ·  ──────────────────────── 2026-10-21T03:21:02.2127848Z 40 │ { name: "a" }, 2026-10-21T03:21:02.2127988Z ╰──── 2026-10-21T03:21:02.2128048Z 2026-10-21T03:21:02.2128298Z ⚠ unicorn(prefer-string-starts-ends-with): Prefer String#startsWith over a regex with a caret. 2026-10-21T03:21:02.2128654Z ╭─[apps/server/src/vcs/GitVcsDriverCore.ts:485:11] 2026-10-21T03:21:02.2128896Z 484 │ GIT_DIAGNOSTIC_LINE_PATTERN.test(line) || 2026-10-21T03:21:02.2129164Z 485 │ (!/^remote:/.test(line) && SSH_TRANSPORT_REFUSAL_PATTERN.test(line)), 2026-10-21T03:21:02.2129407Z ·  ─────────────── 2026-10-21T03:21:02.2129568Z 486 │ ) 2026-10-21T03:21:02.2129694Z ╰──── 2026-10-21T03:21:02.2129910Z  help: Replace `/^remote:/.test(line)` with `line.startsWith('remote:')`. 2026-10-21T03:21:02.2130079Z 2026-10-21T03:21:02.2130372Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-21T03:21:02.2130847Z ╭─[apps/server/src/provider/AntigravityAuth.ts:285:20] 2026-10-21T03:21:02.2131051Z 284 │ }, 2026-10-21T03:21:02.2131203Z 285 │ (effect, flow, stopSessions) => 2026-10-21T03:21:02.2131404Z ·  ──────┬───── 2026-10-21T03:21:02.2131673Z · ╰── 'stopSessions' is declared here 2026-10-21T03:21:02.2131893Z 286 │ effect.pipe( 2026-10-21T03:21:02.2132037Z ╰──── 2026-10-21T03:21:02.2132198Z  help: Consider removing this parameter. 2026-10-21T03:21:02.2132320Z 2026-10-21T03:21:02.2132686Z ⚠ 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-21T03:21:02.2133156Z ╭─[apps/server/src/vcs/GitVcsDriverCore.test.ts:1624:34] 2026-10-21T03:21:02.2133447Z 1623 │ const stat = branch.files!.find((file) => file.path === path)!; 2026-10-21T03:21:02.2133748Z 1624 │ const request = yield* Schema.decodeEffect(ReviewDiffPreviewInput)({ 2026-10-21T03:21:02.2134034Z ·  ─────────────────── 2026-10-21T03:21:02.2134293Z 1625 │ cwd, 2026-10-21T03:21:02.2134466Z ╰──── 2026-10-21T03:21:02.2134525Z 2026-10-21T03:21:02.2134791Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-21T03:21:02.2135220Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10418:7] 2026-10-21T03:21:02.2135453Z 10417 │ 2026-10-21T03:21:02.2135596Z 10418 │ const layer: Layer.Layer< 2026-10-21T03:21:02.2135762Z ·  ──┬── 2026-10-21T03:21:02.2135979Z · ╰── 'layer' is declared here 2026-10-21T03:21:02.2136215Z 10419 │ ProviderAdapter.ProviderAdapterV2, 2026-10-21T03:21:02.2136385Z ╰──── 2026-10-21T03:21:02.2136558Z  help: Consider removing this declaration. 2026-10-21T03:21:02.2136683Z 2026-10-21T03:21:02.2136917Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-21T03:21:02.2137316Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:1996:15] 2026-10-21T03:21:02.2137559Z 1995 │ assert.equal( 2026-10-21T03:21:02.2137814Z 1996 │ items.filter((item) => item.type === "assistant_message").at(-1)?.text, 2026-10-21T03:21:02.2138057Z ·  ────── 2026-10-21T03:21:02.2138240Z 1997 │ "authoritative answer", 2026-10-21T03:21:02.2138398Z ╰──── 2026-10-21T03:21:02.2138634Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-21T03:21:02.2138813Z 2026-10-21T03:21:02.2139299Z ⚠ 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-21T03:21:02.2139904Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:3762:7] 2026-10-21T03:21:02.2140263Z 3761 │ const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped); 2026-10-21T03:21:02.2140664Z 3762 │ ╭─▶ while (!responseLifecycle.includes("failed")) { 2026-10-21T03:21:02.2141060Z 3763 │ │ yield* Effect.yieldNow; 2026-10-21T03:21:02.2141327Z 3764 │ ╰─▶ } 2026-10-21T03:21:02.2141594Z 3765 │ const responseExit = yield* Fiber.join(responseFiber); 2026-10-21T03:21:02.2141787Z ╰──── 2026-10-21T03:21:02.2141844Z 2026-10-21T03:21:02.2142323Z ⚠ 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-21T03:21:02.2142921Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:5873:9] 2026-10-21T03:21:02.2143186Z 5872 │ .pipe(Effect.forkScoped); 2026-10-21T03:21:02.2143483Z 5873 │ ╭─▶ while (promptGates.length < 1) { 2026-10-21T03:21:02.2143775Z 5874 │ │ yield* Effect.yieldNow; 2026-10-21T03:21:02.2144040Z 5875 │ ╰─▶ } 2026-10-21T03:21:02.2144419Z 5876 │ assert.isDefined(sessionUpdateHandler, "session update handler must be wired"); 2026-10-21T03:21:02.2144689Z ╰──── 2026-10-21T03:21:02.2144745Z 2026-10-21T03:21:02.2145214Z ⚠ 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-21T03:21:02.2145813Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6008:9] 2026-10-21T03:21:02.2146076Z 6007 │ .pipe(Effect.forkScoped); 2026-10-21T03:21:02.2146373Z 6008 │ ╭─▶ while (promptGates.length < 2) { 2026-10-21T03:21:02.2146661Z 6009 │ │ yield* Effect.yieldNow; 2026-10-21T03:21:02.2146926Z 6010 │ ╰─▶ } 2026-10-21T03:21:02.2147240Z 6011 │ if (sessionUpdateHandler === undefined || capturedMutation.current === null) { 2026-10-21T03:21:02.2147470Z ╰──── 2026-10-21T03:21:02.2147524Z 2026-10-21T03:21:02.2147991Z ⚠ 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-21T03:21:02.2148552Z ╭─[packages/client-runtime/src/state/vcs.test.ts:443:9] 2026-10-21T03:21:02.2148753Z 442 │ 2026-10-21T03:21:02.2149080Z 443 │ ╭─▶ for (let attempt = 0; attempt < 100 && (yield* Ref.get(calls)) < 1; attempt += 1) { 2026-10-21T03:21:02.2149426Z 444 │ │ yield* Effect.yieldNow; 2026-10-21T03:21:02.2149693Z 445 │ ╰─▶ } 2026-10-21T03:21:02.2149991Z 446 │ yield* SubscriptionRef.set(connectionState, AVAILABLE_CONNECTION_STATE); 2026-10-21T03:21:02.2150212Z ╰──── 2026-10-21T03:21:02.2150272Z 2026-10-21T03:21:02.2150759Z ⚠ 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-21T03:21:02.2151325Z ╭─[packages/client-runtime/src/state/vcs.test.ts:447:9] 2026-10-21T03:21:02.2151624Z 446 │ yield* SubscriptionRef.set(connectionState, AVAILABLE_CONNECTION_STATE); 2026-10-21T03:21:02.2152068Z 447 │ ╭─▶ for (let attempt = 0; attempt < 100 && (yield* Ref.get(interruptions)) < 1; attempt += 1) { 2026-10-21T03:21:02.2152422Z 448 │ │ yield* Effect.yieldNow; 2026-10-21T03:21:02.2152683Z 449 │ ╰─▶ } 2026-10-21T03:21:02.2152935Z 450 │ expect(yield* Ref.get(interruptions)).toBe(1); 2026-10-21T03:21:02.2153114Z ╰──── 2026-10-21T03:21:02.2153176Z 2026-10-21T03:21:02.2153385Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-21T03:21:02.2153723Z ╭─[packages/client-runtime/src/state/usageAccess.ts:3:8] 2026-10-21T03:21:02.2153949Z 2 │ AuthDiagnosticsReadScope, 2026-10-21T03:21:02.2154119Z 3 │ type AuthSessionState, 2026-10-21T03:21:02.2154298Z ·  ────────┬─────── 2026-10-21T03:21:02.2154609Z · ╰── 'AuthSessionState' is imported here 2026-10-21T03:21:02.2154866Z 4 │ sessionGrantsScope, 2026-10-21T03:21:02.2155010Z ╰──── 2026-10-21T03:21:02.2155171Z  help: Consider removing this import. 2026-10-21T03:21:02.2155289Z 2026-10-21T03:21:02.2155487Z ⚠ eslint(no-unused-vars): Identifier 'Arr' is imported but never used. 2026-10-21T03:21:02.2155810Z ╭─[packages/client-runtime/src/state/threadSort.ts:4:13] 2026-10-21T03:21:02.2156073Z 3 │ import type { EnvironmentThreadShell } from "./models.ts"; 2026-10-21T03:21:02.2156293Z 4 │ import * as Arr from "effect/Array"; 2026-10-21T03:21:02.2156472Z ·  ─┬─ 2026-10-21T03:21:02.2156689Z · ╰── 'Arr' is imported here 2026-10-21T03:21:02.2156911Z 5 │ import * as Order from "effect/Order"; 2026-10-21T03:21:02.2157068Z ╰──── 2026-10-21T03:21:02.2157233Z  help: Consider removing this import. 2026-10-21T03:21:02.2157354Z 2026-10-21T03:21:02.2157548Z ⚠ eslint(no-unused-vars): Identifier 'Order' is imported but never used. 2026-10-21T03:21:02.2157936Z ╭─[packages/client-runtime/src/state/threadSort.ts:5:13] 2026-10-21T03:21:02.2158158Z 4 │ import * as Arr from "effect/Array"; 2026-10-21T03:21:02.2158354Z 5 │ import * as Order from "effect/Order"; 2026-10-21T03:21:02.2158532Z ·  ──┬── 2026-10-21T03:21:02.2158760Z · ╰── 'Order' is imported here 2026-10-21T03:21:02.2158951Z 6 │ 2026-10-21T03:21:02.2159070Z ╰──── 2026-10-21T03:21:02.2159224Z  help: Consider removing this import. 2026-10-21T03:21:02.2159343Z 2026-10-21T03:21:02.2159520Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-21T03:21:02.2159849Z ╭─[apps/server/src/provider/Drivers/CodexDriver.test.ts:418:14] 2026-10-21T03:21:02.2160063Z 417 │ 2026-10-21T03:21:02.2160240Z 418 │ for (const {} of ["direct", "wrapper"] as const) { 2026-10-21T03:21:02.2160439Z ·  ── 2026-10-21T03:21:02.2160591Z 419 │ } 2026-10-21T03:21:02.2160732Z ╰──── 2026-10-21T03:21:02.2161074Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-21T03:21:02.2161314Z 2026-10-21T03:21:02.2161575Z ⚠ eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used. 2026-10-21T03:21:02.2162007Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:960:10] 2026-10-21T03:21:02.2162245Z 959 │ 2026-10-21T03:21:02.2162515Z 960 │ function layerClaudeAgentSdkReplayQueryRunner( 2026-10-21T03:21:02.2162801Z ·  ──────────────────┬───────────────── 2026-10-21T03:21:02.2163125Z · ╰── 'layerClaudeAgentSdkReplayQueryRunner' is declared here 2026-10-21T03:21:02.2163426Z 961 │ transcript: ClaudeAgentSdkReplayTranscript, 2026-10-21T03:21:02.2163607Z ╰──── 2026-10-21T03:21:02.2163773Z  help: Consider removing this declaration. 2026-10-21T03:21:02.2163894Z 2026-10-21T03:21:02.2164269Z ⚠ 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-21T03:21:02.2164725Z ╭─[packages/contracts/src/auth.test.ts:17:12] 2026-10-21T03:21:02.2165021Z 16 │ it("decodes legacy review credentials without offering them in new grants", () => { 2026-10-21T03:21:02.2165364Z 17 │ expect(Schema.decodeUnknownSync(AuthEnvironmentScopes)(["review:write"])).toEqual([ 2026-10-21T03:21:02.2165644Z ·  ──────────────────────── 2026-10-21T03:21:02.2165826Z 18 │ "review:write", 2026-10-21T03:21:02.2165966Z ╰──── 2026-10-21T03:21:02.2166030Z 2026-10-21T03:21:02.2166399Z ⚠ 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-21T03:21:02.2166851Z ╭─[packages/contracts/src/auth.test.ts:20:18] 2026-10-21T03:21:02.2167041Z 19 │ ]); 2026-10-21T03:21:02.2167276Z 20 │ expect(() => Schema.decodeUnknownSync(AuthGrantScopes)(["review:write"])).toThrow(); 2026-10-21T03:21:02.2167562Z ·  ──────────────────────── 2026-10-21T03:21:02.2167812Z 21 │ expect(AuthStandardClientScopes).not.toContain("review:write"); 2026-10-21T03:21:02.2168013Z ╰──── 2026-10-21T03:21:02.2168068Z 2026-10-21T03:21:02.2168437Z ⚠ 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-21T03:21:02.2168884Z ╭─[packages/contracts/src/auth.test.ts:58:21] 2026-10-21T03:21:02.2169180Z 57 │ it("ignores unknown response permissions without falling back to broader scopes", () => { 2026-10-21T03:21:02.2169487Z 58 │ const session = Schema.decodeUnknownSync(AuthSessionState)({ 2026-10-21T03:21:02.2169736Z ·  ──────────────────────── 2026-10-21T03:21:02.2169926Z 59 │ authenticated: true, 2026-10-21T03:21:02.2170074Z ╰──── 2026-10-21T03:21:02.2170136Z 2026-10-21T03:21:02.2170478Z ⚠ eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'. 2026-10-21T03:21:02.2171061Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1415:7] 2026-10-21T03:21:02.2171288Z 1414 │ 2026-10-21T03:21:02.2171472Z 1415 │ const layerCodexAppServerClientFactoryCommand = ( 2026-10-21T03:21:02.2171723Z ·  ───────────────────┬─────────────────── 2026-10-21T03:21:02.2172050Z · ╰── 'layerCodexAppServerClientFactoryCommand' is declared here 2026-10-21T03:21:02.2172372Z 1416 │ options: CodexClient.CodexAppServerClientOptions & { 2026-10-21T03:21:02.2172566Z ╰──── 2026-10-21T03:21:02.2172793Z  help: Consider removing this declaration. 2026-10-21T03:21:02.2172950Z 2026-10-21T03:21:02.2173215Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-21T03:21:02.2173628Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1651:7] 2026-10-21T03:21:02.2173856Z 1650 │ 2026-10-21T03:21:02.2173991Z 1651 │ const layer: Layer.Layer< 2026-10-21T03:21:02.2174159Z ·  ──┬── 2026-10-21T03:21:02.2174375Z · ╰── 'layer' is declared here 2026-10-21T03:21:02.2174606Z 1652 │ ProviderAdapter.ProviderAdapterV2, 2026-10-21T03:21:02.2174774Z ╰──── 2026-10-21T03:21:02.2174939Z  help: Consider removing this declaration. 2026-10-21T03:21:02.2175064Z 2026-10-21T03:21:02.2175374Z ⚠ eslint(no-unused-vars): Variable 'layerFromProviderAdapter' is declared but never used. Unused variables should start with a '_'. 2026-10-21T03:21:02.2175828Z ╭─[apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts:346:7] 2026-10-21T03:21:02.2176053Z 345 │ 2026-10-21T03:21:02.2176222Z 346 │ const layerFromProviderAdapter: Layer.Layer< 2026-10-21T03:21:02.2176440Z ·  ────────────┬─────────── 2026-10-21T03:21:02.2176713Z · ╰── 'layerFromProviderAdapter' is declared here 2026-10-21T03:21:02.2176958Z 347 │ ProviderAdapterRegistryV2, 2026-10-21T03:21:02.2177111Z ╰──── 2026-10-21T03:21:02.2177276Z  help: Consider removing this declaration. 2026-10-21T03:21:02.2177399Z 2026-10-21T03:21:02.2177876Z ⚠ 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-21T03:21:02.2178467Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1228:7] 2026-10-21T03:21:02.2178725Z 1227 │ yield* harness.replaceSession; 2026-10-21T03:21:02.2179053Z 1228 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-21T03:21:02.2179404Z 1229 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) { 2026-10-21T03:21:02.2179657Z 1230 │ │ break; 2026-10-21T03:21:02.2179847Z 1231 │ │ } 2026-10-21T03:21:02.2180059Z 1232 │ │ yield* Effect.yieldNow; 2026-10-21T03:21:02.2180328Z 1233 │ ╰─▶ } 2026-10-21T03:21:02.2180552Z 1234 │ yield* Queue.offer( 2026-10-21T03:21:02.2180704Z ╰──── 2026-10-21T03:21:02.2180837Z 2026-10-21T03:21:02.2181305Z ⚠ 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-21T03:21:02.2181886Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1337:7] 2026-10-21T03:21:02.2182144Z 1336 │ yield* harness.replaceSession; 2026-10-21T03:21:02.2182459Z 1337 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-21T03:21:02.2182819Z 1338 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break; 2026-10-21T03:21:02.2183150Z 1339 │ │ yield* Effect.yieldNow; 2026-10-21T03:21:02.2183446Z 1340 │ ╰─▶ } 2026-10-21T03:21:02.2183720Z 1341 │ expect(yield* Ref.get(harness.subscriptionCount)).toBe(2); 2026-10-21T03:21:02.2183919Z ╰──── 2026-10-21T03:21:02.2183977Z 2026-10-21T03:21:02.2184244Z ⚠ eslint(no-unused-vars): Function 'promptResponseHasMissingXAiStopReason' is declared but never used. 2026-10-21T03:21:02.2184646Z ╭─[packages/provider-grok/src/server/xaiAcpExtension.ts:1600:10] 2026-10-21T03:21:02.2184861Z 1599 │ 2026-10-21T03:21:02.2185138Z 1600 │ function promptResponseHasMissingXAiStopReason(response: EffectAcpSchema.PromptResponse): boolean { 2026-10-21T03:21:02.2185479Z ·  ──────────────────┬────────────────── 2026-10-21T03:21:02.2185808Z · ╰── 'promptResponseHasMissingXAiStopReason' is declared here 2026-10-21T03:21:02.2186091Z 1601 │ const meta = response._meta; 2026-10-21T03:21:02.2186248Z ╰──── 2026-10-21T03:21:02.2186416Z  help: Consider removing this declaration. 2026-10-21T03:21:02.2186540Z 2026-10-21T03:21:02.2186801Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-21T03:21:02.2187183Z ╭─[packages/provider-grok/src/server/adapter.ts:408:7] 2026-10-21T03:21:02.2187386Z 407 │ 2026-10-21T03:21:02.2187525Z 408 │ const layer: Layer.Layer< 2026-10-21T03:21:02.2187689Z ·  ──┬── 2026-10-21T03:21:02.2187907Z · ╰── 'layer' is declared here 2026-10-21T03:21:02.2188141Z 409 │ ProviderAdapter.ProviderAdapterV2, 2026-10-21T03:21:02.2188312Z ╰──── 2026-10-21T03:21:02.2188477Z  help: Consider removing this declaration. 2026-10-21T03:21:02.2188599Z 2026-10-21T03:21:02.2188805Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-21T03:21:02.2189143Z ╭─[packages/client-runtime/src/state/filesystem.ts:3:8] 2026-10-21T03:21:02.2189358Z 2 │ AuthFilesystemReadScope, 2026-10-21T03:21:02.2189530Z 3 │ type AuthSessionState, 2026-10-21T03:21:02.2189706Z ·  ────────┬─────── 2026-10-21T03:21:02.2189956Z · ╰── 'AuthSessionState' is imported here 2026-10-21T03:21:02.2190178Z 4 │ type FilesystemBrowseEntry, 2026-10-21T03:21:02.2190332Z ╰──── 2026-10-21T03:21:02.2190495Z  help: Consider removing this import. 2026-10-21T03:21:02.2190617Z 2026-10-21T03:21:02.2190952Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-21T03:21:02.2191364Z ╭─[apps/server/src/orchestration-v2/ThreadPullRequestService.ts:408:7] 2026-10-21T03:21:02.2191597Z 407 │ 2026-10-21T03:21:02.2191793Z 408 │ const layer = Layer.effect(ThreadPullRequestServiceV2, make); 2026-10-21T03:21:02.2192012Z ·  ──┬── 2026-10-21T03:21:02.2192225Z · ╰── 'layer' is declared here 2026-10-21T03:21:02.2192412Z ╰──── 2026-10-21T03:21:02.2192578Z  help: Consider removing this declaration. 2026-10-21T03:21:02.2192701Z 2026-10-21T03:21:02.2193041Z ⚠ eslint(no-unused-vars): Variable 'layerDaemon' is declared but never used. Unused variables should start with a '_'. 2026-10-21T03:21:02.2193483Z ╭─[apps/server/src/orchestration-v2/EffectWorker.ts:911:7] 2026-10-21T03:21:02.2193687Z 910 │ 2026-10-21T03:21:02.2193946Z 911 │ const layerDaemon: Layer.Layer = Layer.effectDiscard( 2026-10-21T03:21:02.2194222Z ·  ─────┬───── 2026-10-21T03:21:02.2194461Z · ╰── 'layerDaemon' is declared here 2026-10-21T03:21:02.2194690Z 912 │ runDaemon.pipe(Effect.forkScoped), 2026-10-21T03:21:02.2194855Z ╰──── 2026-10-21T03:21:02.2195018Z  help: Consider removing this declaration. 2026-10-21T03:21:02.2195139Z 2026-10-21T03:21:02.2195353Z ⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used. 2026-10-21T03:21:02.2195710Z ╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10] 2026-10-21T03:21:02.2195920Z 21 │ 2026-10-21T03:21:02.2196143Z 22 │ function summarizePayload(payload: unknown): Readonly> { 2026-10-21T03:21:02.2196404Z ·  ────────┬─────── 2026-10-21T03:21:02.2196655Z · ╰── 'summarizePayload' is declared here 2026-10-21T03:21:02.2196914Z 23 │ if (payload === null) return { valueType: "null" }; 2026-10-21T03:21:02.2197092Z ╰──── 2026-10-21T03:21:02.2197253Z  help: Consider removing this declaration. 2026-10-21T03:21:02.2197376Z 2026-10-21T03:21:02.2197584Z ⚠ eslint(no-unused-vars): Identifier 'HostProcess' is imported but never used. 2026-10-21T03:21:02.2198014Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:25:13] 2026-10-21T03:21:02.2198284Z 24 │ import * as Schema from "effect/Schema"; 2026-10-21T03:21:02.2198516Z 25 │ import * as HostProcess from "@t3tools/shared/HostProcess"; 2026-10-21T03:21:02.2198739Z ·  ─────┬───── 2026-10-21T03:21:02.2198979Z · ╰── 'HostProcess' is imported here 2026-10-21T03:21:02.2199179Z 26 │ 2026-10-21T03:21:02.2199293Z ╰──── 2026-10-21T03:21:02.2199450Z  help: Consider removing this import. 2026-10-21T03:21:02.2199566Z 2026-10-21T03:21:02.2199845Z ⚠ eslint(no-unused-vars): Variable 'serverConfig' is declared but never used. Unused variables should start with a '_'. 2026-10-21T03:21:02.2200278Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:124:11] 2026-10-21T03:21:02.2200537Z 123 │ const path = yield* Path.Path; 2026-10-21T03:21:02.2200888Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-21T03:21:02.2201152Z ·  ──────┬───── 2026-10-21T03:21:02.2201392Z · ╰── 'serverConfig' is declared here 2026-10-21T03:21:02.2201682Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-21T03:21:02.2201892Z ╰──── 2026-10-21T03:21:02.2202064Z  help: Consider removing this declaration. 2026-10-21T03:21:02.2202187Z 2026-10-21T03:21:02.2202466Z ⚠ eslint(no-unused-vars): Variable 'serverSettings' is declared but never used. Unused variables should start with a '_'. 2026-10-21T03:21:02.2202898Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:125:11] 2026-10-21T03:21:02.2203189Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-21T03:21:02.2203473Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-21T03:21:02.2203719Z ·  ───────┬────── 2026-10-21T03:21:02.2203966Z · ╰── 'serverSettings' is declared here 2026-10-21T03:21:02.2204252Z 126 │ const gitWorkflow = yield* GitWorkflowService.GitWorkflowService; 2026-10-21T03:21:02.2204463Z ╰──── 2026-10-21T03:21:02.2204625Z  help: Consider removing this declaration. 2026-10-21T03:21:02.2204748Z 2026-10-21T03:21:02.2205223Z ⚠ 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-21T03:21:02.2205791Z ╭─[packages/client-runtime/src/rpc/client.test.ts:131:9] 2026-10-21T03:21:02.2206010Z 130 │ ) { 2026-10-21T03:21:02.2206302Z 131 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-21T03:21:02.2206638Z 132 │ │ if (subscriptions.length >= count) { 2026-10-21T03:21:02.2206873Z 133 │ │ return; 2026-10-21T03:21:02.2207069Z 134 │ │ } 2026-10-21T03:21:02.2207279Z 135 │ │ yield* Effect.yieldNow; 2026-10-21T03:21:02.2207542Z 136 │ ╰─▶ } 2026-10-21T03:21:02.2207853Z 137 │ return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`)); 2026-10-21T03:21:02.2208083Z ╰──── 2026-10-21T03:21:02.2208146Z 2026-10-21T03:21:02.2208628Z ⚠ 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-21T03:21:02.2209200Z ╭─[packages/client-runtime/src/rpc/client.test.ts:252:7] 2026-10-21T03:21:02.2209511Z 251 │ yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient))); 2026-10-21T03:21:02.2209940Z 252 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) { 2026-10-21T03:21:02.2210285Z 253 │ │ yield* Effect.yieldNow; 2026-10-21T03:21:02.2210547Z 254 │ ╰─▶ } 2026-10-21T03:21:02.2210975Z 255 │ yield* SubscriptionRef.set(activeSession, Option.none()); 2026-10-21T03:21:02.2211204Z ╰──── 2026-10-21T03:21:02.2211267Z 2026-10-21T03:21:02.2211740Z ⚠ 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-21T03:21:02.2212307Z ╭─[packages/client-runtime/src/rpc/client.test.ts:258:7] 2026-10-21T03:21:02.2212511Z 257 │ 2026-10-21T03:21:02.2212829Z 258 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-21T03:21:02.2213173Z 259 │ │ yield* Effect.yieldNow; 2026-10-21T03:21:02.2213431Z 260 │ ╰─▶ } 2026-10-21T03:21:02.2213686Z 261 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-21T03:21:02.2213867Z ╰──── 2026-10-21T03:21:02.2213927Z 2026-10-21T03:21:02.2214399Z ⚠ 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-21T03:21:02.2214958Z ╭─[packages/client-runtime/src/rpc/client.test.ts:322:7] 2026-10-21T03:21:02.2215172Z 321 │ ); 2026-10-21T03:21:02.2215509Z 322 │ ╭─▶ for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) { 2026-10-21T03:21:02.2215857Z 323 │ │ yield* Effect.yieldNow; 2026-10-21T03:21:02.2216118Z 324 │ ╰─▶ } 2026-10-21T03:21:02.2216320Z 325 │ 2026-10-21T03:21:02.2216439Z ╰──── 2026-10-21T03:21:02.2216499Z 2026-10-21T03:21:02.2216966Z ⚠ 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-21T03:21:02.2217525Z ╭─[packages/client-runtime/src/rpc/client.test.ts:330:7] 2026-10-21T03:21:02.2217839Z 329 │ yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient))); 2026-10-21T03:21:02.2218265Z 330 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-21T03:21:02.2218607Z 331 │ │ yield* Effect.yieldNow; 2026-10-21T03:21:02.2218867Z 332 │ ╰─▶ } 2026-10-21T03:21:02.2219118Z 333 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-21T03:21:02.2219297Z ╰──── 2026-10-21T03:21:02.2219359Z 2026-10-21T03:21:02.2219554Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-21T03:21:02.2219925Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:555:70] 2026-10-21T03:21:02.2220193Z 554 │ assert.deepStrictEqual( 2026-10-21T03:21:02.2220468Z 555 │ (yield* Ref.get(fixture.syncCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-21T03:21:02.2220874Z ·  ┬ 2026-10-21T03:21:02.2221242Z · ╰── '_' is declared here 2026-10-21T03:21:02.2221503Z 556 │ [ 2026-10-21T03:21:02.2221636Z ╰──── 2026-10-21T03:21:02.2221802Z  help: Consider removing this parameter. 2026-10-21T03:21:02.2221922Z 2026-10-21T03:21:02.2222118Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-21T03:21:02.2222487Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:1118:70] 2026-10-21T03:21:02.2222753Z 1117 │ assert.deepStrictEqual( 2026-10-21T03:21:02.2223028Z 1118 │ (yield* Ref.get(fixture.linkCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-21T03:21:02.2223331Z ·  ┬ 2026-10-21T03:21:02.2223639Z · ╰── '_' is declared here 2026-10-21T03:21:02.2223870Z 1119 │ [ 2026-10-21T03:21:02.2224003Z ╰──── 2026-10-21T03:21:02.2224173Z  help: Consider removing this parameter. 2026-10-21T03:21:02.2224296Z 2026-10-21T03:21:02.2224488Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-21T03:21:02.2224812Z ╭─[packages/client-runtime/src/state/shell.ts:189:5] 2026-10-21T03:21:02.2225064Z 186 │ let waiting = yield* Ref.get(awaitingCompletion); 2026-10-21T03:21:02.2225269Z 187 │ let next = initial; 2026-10-21T03:21:02.2225435Z ·  ──┬─ 2026-10-21T03:21:02.2225655Z · ╰── From this accumulator 2026-10-21T03:21:02.2225872Z 188 │ let receivedSnapshot = false; 2026-10-21T03:21:02.2226062Z 189 │ for (const item of items) { 2026-10-21T03:21:02.2226241Z ·  ─┬─ 2026-10-21T03:21:02.2226437Z · ╰── For this loop 2026-10-21T03:21:02.2226655Z 190 │ if (item.kind === "synchronized") { 2026-10-21T03:21:02.2226837Z 191 │ waiting = false; 2026-10-21T03:21:02.2227025Z 192 │ if (Option.isSome(next.snapshot)) { 2026-10-21T03:21:02.2227262Z 193 │ next = { ...next, status: "live", error: Option.none() }; 2026-10-21T03:21:02.2227492Z ·  ───┬─── 2026-10-21T03:21:02.2227728Z · ╰── From this spread 2026-10-21T03:21:02.2227927Z 194 │ } 2026-10-21T03:21:02.2228054Z ╰──── 2026-10-21T03:21:02.2228277Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-21T03:21:02.2228621Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-21T03:21:02.2228798Z 2026-10-21T03:21:02.2228999Z ⚠ eslint(require-yield): This generator function does not have `yield` 2026-10-21T03:21:02.2229347Z ╭─[packages/provider-acp/src/server/mcpOverAcpBridge.ts:81:78] 2026-10-21T03:21:02.2229568Z  80 │ 2026-10-21T03:21:02.2229911Z  81 │ ╭─▶ export const makeAcpMcpOverAcpBridge = Effect.fn("AcpMcpOverAcpBridge.make")(function* ( 2026-10-21T03:21:02.2230293Z  82 │ │ options: AcpMcpOverAcpBridgeOptions, 2026-10-21T03:21:02.2230560Z  83 │ │ ): Effect.fn.Return { 2026-10-21T03:21:02.2230913Z  84 │ │ const fetchImplementation = options.fetchImplementation ?? fetch; 2026-10-21T03:21:02.2231302Z  85 │ │ const connections = new Map(); 2026-10-21T03:21:02.2231566Z  86 │ │ 2026-10-21T03:21:02.2231884Z  87 │ │ const connectionFor = (connectionId: string): Effect.Effect => 2026-10-21T03:21:02.2232206Z  88 │ │ Effect.suspend(() => { 2026-10-21T03:21:02.2232468Z  89 │ │ const connection = connections.get(connectionId); 2026-10-21T03:21:02.2232731Z  90 │ │ return connection === undefined 2026-10-21T03:21:02.2233083Z  91 │ │ ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`)) 2026-10-21T03:21:02.2233415Z  92 │ │ : Effect.succeed(connection); 2026-10-21T03:21:02.2233627Z  93 │ │ }); 2026-10-21T03:21:02.2233803Z  94 │ │ 2026-10-21T03:21:02.2233993Z  95 │ │ const send = ( 2026-10-21T03:21:02.2234204Z  96 │ │ connection: Connection, 2026-10-21T03:21:02.2234419Z  97 │ │ message: unknown, 2026-10-21T03:21:02.2234695Z  98 │ │ ): Effect.Effect, AcpMcpOverAcpError> => 2026-10-21T03:21:02.2234986Z  99 │ │ connection.mutex.withPermits(1)( 2026-10-21T03:21:02.2235227Z 100 │ │ Effect.gen(function* () { 2026-10-21T03:21:02.2235480Z 101 │ │ const body = JSON.stringify(message); 2026-10-21T03:21:02.2235774Z 102 │ │ if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) { 2026-10-21T03:21:02.2236155Z 103 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB.")); 2026-10-21T03:21:02.2236463Z 104 │ │ } 2026-10-21T03:21:02.2236703Z 105 │ │ const response = yield* Effect.tryPromise({ 2026-10-21T03:21:02.2236962Z 106 │ │ try: (signal) => 2026-10-21T03:21:02.2237215Z 107 │ │ fetchImplementation(options.endpoint, { 2026-10-21T03:21:02.2237475Z 108 │ │ method: "POST", 2026-10-21T03:21:02.2237693Z 109 │ │ signal, 2026-10-21T03:21:02.2238100Z 110 │ │ headers: { 2026-10-21T03:21:02.2238348Z 111 │ │ "content-type": "application/json", 2026-10-21T03:21:02.2238647Z 112 │ │ accept: "application/json, text/event-stream", 2026-10-21T03:21:02.2238941Z 113 │ │ authorization: options.authorization, 2026-10-21T03:21:02.2239222Z 114 │ │ ...(connection.sessionId === null 2026-10-21T03:21:02.2239461Z 115 │ │ ? {} 2026-10-21T03:21:02.2239729Z 116 │ │ : { "mcp-session-id": connection.sessionId }), 2026-10-21T03:21:02.2240018Z 117 │ │ ...(connection.protocolVersion === null 2026-10-21T03:21:02.2240261Z 118 │ │ ? {} 2026-10-21T03:21:02.2240547Z 119 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-21T03:21:02.2240862Z 120 │ │ }, 2026-10-21T03:21:02.2241145Z 121 │ │ body, 2026-10-21T03:21:02.2241386Z 122 │ │ }), 2026-10-21T03:21:02.2241600Z 123 │ │ catch: bridgeError, 2026-10-21T03:21:02.2241806Z 124 │ │ }); 2026-10-21T03:21:02.2242131Z 125 │ │ connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId; 2026-10-21T03:21:02.2242450Z 126 │ │ if (!response.ok) { 2026-10-21T03:21:02.2242685Z 127 │ │ yield* Effect.promise( 2026-10-21T03:21:02.2242999Z 128 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-21T03:21:02.2243272Z 129 │ │ ); 2026-10-21T03:21:02.2243492Z 130 │ │ return yield* Effect.fail( 2026-10-21T03:21:02.2243845Z 131 │ │ new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`), 2026-10-21T03:21:02.2244140Z 132 │ │ ); 2026-10-21T03:21:02.2244327Z 133 │ │ } 2026-10-21T03:21:02.2244643Z 134 │ │ const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))]; 2026-10-21T03:21:02.2244980Z 135 │ │ for (const payload of payloads) { 2026-10-21T03:21:02.2245337Z 136 │ │ connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion; 2026-10-21T03:21:02.2245641Z 137 │ │ } 2026-10-21T03:21:02.2245841Z 138 │ │ return payloads; 2026-10-21T03:21:02.2246091Z 139 │ │ }).pipe(Effect.mapError(bridgeError)), 2026-10-21T03:21:02.2246314Z 140 │ │ ); 2026-10-21T03:21:02.2246487Z 141 │ │ 2026-10-21T03:21:02.2246761Z 142 │ │ const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* ( 2026-10-21T03:21:02.2247079Z 143 │ │ request: AcpSchema.DisconnectMcpRequest, 2026-10-21T03:21:02.2247416Z 144 │ │ ): Effect.fn.Return { 2026-10-21T03:21:02.2247778Z 145 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-21T03:21:02.2248081Z 146 │ │ connections.delete(request.connectionId); 2026-10-21T03:21:02.2248354Z 147 │ │ const sessionId = connection.sessionId; 2026-10-21T03:21:02.2248606Z 148 │ │ if (sessionId !== null) { 2026-10-21T03:21:02.2248867Z 149 │ │ const response = yield* Effect.tryPromise({ 2026-10-21T03:21:02.2249115Z 150 │ │ try: (signal) => 2026-10-21T03:21:02.2249365Z 151 │ │ fetchImplementation(options.endpoint, { 2026-10-21T03:21:02.2249616Z 152 │ │ method: "DELETE", 2026-10-21T03:21:02.2249829Z 153 │ │ signal, 2026-10-21T03:21:02.2250039Z 154 │ │ headers: { 2026-10-21T03:21:02.2250287Z 155 │ │ authorization: options.authorization, 2026-10-21T03:21:02.2250556Z 156 │ │ "mcp-session-id": sessionId, 2026-10-21T03:21:02.2250915Z 157 │ │ ...(connection.protocolVersion === null 2026-10-21T03:21:02.2251223Z 158 │ │ ? {} 2026-10-21T03:21:02.2251540Z 159 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-21T03:21:02.2251796Z 160 │ │ }, 2026-10-21T03:21:02.2251987Z 161 │ │ }), 2026-10-21T03:21:02.2252192Z 162 │ │ catch: bridgeError, 2026-10-21T03:21:02.2252395Z 163 │ │ }); 2026-10-21T03:21:02.2252634Z 164 │ │ if (!response.ok && response.status !== 404) { 2026-10-21T03:21:02.2252898Z 165 │ │ return yield* Effect.fail( 2026-10-21T03:21:02.2253139Z 166 │ │ new AcpMcpOverAcpError( 2026-10-21T03:21:02.2253465Z 167 │ │ `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`, 2026-10-21T03:21:02.2253739Z 168 │ │ ), 2026-10-21T03:21:02.2253924Z 169 │ │ ); 2026-10-21T03:21:02.2254104Z 170 │ │ } 2026-10-21T03:21:02.2254310Z 171 │ │ yield* Effect.promise( 2026-10-21T03:21:02.2254619Z 172 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-21T03:21:02.2254883Z 173 │ │ ); 2026-10-21T03:21:02.2255065Z 174 │ │ } 2026-10-21T03:21:02.2255249Z 175 │ │ return {}; 2026-10-21T03:21:02.2255433Z 176 │ │ }); 2026-10-21T03:21:02.2255601Z 177 │ │ 2026-10-21T03:21:02.2255776Z 178 │ │ return { 2026-10-21T03:21:02.2256063Z 179 │ │ connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) { 2026-10-21T03:21:02.2256376Z 180 │ │ if (request.serverId !== "t3-code") { 2026-10-21T03:21:02.2256628Z 181 │ │ return yield* Effect.fail( 2026-10-21T03:21:02.2256948Z 182 │ │ new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`), 2026-10-21T03:21:02.2257219Z 183 │ │ ); 2026-10-21T03:21:02.2257398Z 184 │ │ } 2026-10-21T03:21:02.2257625Z 185 │ │ if (connections.size >= MAX_CONNECTIONS) { 2026-10-21T03:21:02.2257988Z 186 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections.")); 2026-10-21T03:21:02.2258285Z 187 │ │ } 2026-10-21T03:21:02.2258550Z 188 │ │ const connectionId = yield* options.allocateConnectionId; 2026-10-21T03:21:02.2258841Z 189 │ │ connections.set(connectionId, { 2026-10-21T03:21:02.2259097Z 190 │ │ mutex: yield* Semaphore.make(1), 2026-10-21T03:21:02.2259332Z 191 │ │ sessionId: null, 2026-10-21T03:21:02.2259556Z 192 │ │ protocolVersion: null, 2026-10-21T03:21:02.2259784Z 193 │ │ nextRequestId: 0, 2026-10-21T03:21:02.2259983Z 194 │ │ }); 2026-10-21T03:21:02.2260194Z 195 │ │ return { connectionId }; 2026-10-21T03:21:02.2260398Z 196 │ │ }), 2026-10-21T03:21:02.2260676Z 197 │ │ message: Effect.fn("mcpOverAcpBridge.message")(function* (request) { 2026-10-21T03:21:02.2261170Z 198 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-21T03:21:02.2261504Z 199 │ │ const id = ++connection.nextRequestId; 2026-10-21T03:21:02.2261777Z 200 │ │ const payloads = yield* send(connection, { 2026-10-21T03:21:02.2262028Z 201 │ │ jsonrpc: "2.0", 2026-10-21T03:21:02.2262230Z 202 │ │ id, 2026-10-21T03:21:02.2262441Z 203 │ │ method: request.method, 2026-10-21T03:21:02.2262734Z 204 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-21T03:21:02.2262983Z 205 │ │ }); 2026-10-21T03:21:02.2263280Z 206 │ │ const response = payloads.find((payload) => asEnvelope(payload)?.id === id); 2026-10-21T03:21:02.2263604Z 207 │ │ const envelope = asEnvelope(response); 2026-10-21T03:21:02.2263855Z 208 │ │ if (envelope === null) { 2026-10-21T03:21:02.2264089Z 209 │ │ return yield* Effect.fail( 2026-10-21T03:21:02.2264413Z 210 │ │ new AcpMcpOverAcpError("MCP server did not return a matching response."), 2026-10-21T03:21:02.2264686Z 211 │ │ ); 2026-10-21T03:21:02.2264868Z 212 │ │ } 2026-10-21T03:21:02.2265088Z 213 │ │ if (envelope.error !== undefined) { 2026-10-21T03:21:02.2265428Z 214 │ │ return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error))); 2026-10-21T03:21:02.2265706Z 215 │ │ } 2026-10-21T03:21:02.2265987Z 216 │ │ return (envelope.result ?? null) as AcpSchema.MessageMcpResponse; 2026-10-21T03:21:02.2266244Z 217 │ │ }), 2026-10-21T03:21:02.2266543Z 218 │ │ notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) { 2026-10-21T03:21:02.2266909Z 219 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-21T03:21:02.2267191Z 220 │ │ yield* send(connection, { 2026-10-21T03:21:02.2267414Z 221 │ │ jsonrpc: "2.0", 2026-10-21T03:21:02.2267634Z 222 │ │ method: request.method, 2026-10-21T03:21:02.2267921Z 223 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-21T03:21:02.2268169Z 224 │ │ }); 2026-10-21T03:21:02.2268410Z 225 │ │ }), 2026-10-21T03:21:02.2268719Z 226 │ │ disconnect, 2026-10-21T03:21:02.2268941Z 227 │ │ dispose: Effect.suspend(() => 2026-10-21T03:21:02.2269170Z 228 │ │ Effect.forEach( 2026-10-21T03:21:02.2269399Z 229 │ │ [...connections.keys()], 2026-10-21T03:21:02.2269702Z 230 │ │ (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore), 2026-10-21T03:21:02.2269990Z 231 │ │ { discard: true }, 2026-10-21T03:21:02.2270191Z 232 │ │ ), 2026-10-21T03:21:02.2270373Z 233 │ │ ), 2026-10-21T03:21:02.2270549Z 234 │ │ }; 2026-10-21T03:21:02.2270851Z 235 │ ╰─▶ }); 2026-10-21T03:21:02.2271072Z ╰──── 2026-10-21T03:21:02.2271398Z  help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed. 2026-10-21T03:21:02.2271651Z 2026-10-21T03:21:02.2272141Z ⚠ 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-21T03:21:02.2272720Z ╭─[packages/client-runtime/src/rpc/session.test.ts:226:3] 2026-10-21T03:21:02.2272936Z 225 │ ) { 2026-10-21T03:21:02.2273215Z 226 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-21T03:21:02.2273530Z 227 │ │ const socket = sockets[index]; 2026-10-21T03:21:02.2273758Z 228 │ │ if (socket) { 2026-10-21T03:21:02.2273976Z 229 │ │ return socket; 2026-10-21T03:21:02.2274168Z 230 │ │ } 2026-10-21T03:21:02.2274377Z 231 │ │ yield* Effect.yieldNow; 2026-10-21T03:21:02.2274629Z 232 │ ╰─▶ } 2026-10-21T03:21:02.2274950Z 233 │ return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket.")); 2026-10-21T03:21:02.2275192Z ╰──── 2026-10-21T03:21:02.2275255Z 2026-10-21T03:21:02.2275733Z ⚠ 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-21T03:21:02.2276305Z ╭─[packages/client-runtime/src/rpc/session.test.ts:240:3] 2026-10-21T03:21:02.2276524Z 239 │ ) { 2026-10-21T03:21:02.2276800Z 240 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-21T03:21:02.2277219Z 241 │ │ const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index]; 2026-10-21T03:21:02.2277529Z 242 │ │ if (request) { 2026-10-21T03:21:02.2277747Z 243 │ │ return request; 2026-10-21T03:21:02.2278016Z 244 │ │ } 2026-10-21T03:21:02.2278224Z 245 │ │ yield* Effect.yieldNow; 2026-10-21T03:21:02.2278475Z 246 │ ╰─▶ } 2026-10-21T03:21:02.2278867Z 247 │ return yield* Effect.die(new Error("Expected the RPC protocol to send a request.")); 2026-10-21T03:21:02.2279144Z ╰──── 2026-10-21T03:21:02.2279206Z 2026-10-21T03:21:02.2279678Z ⚠ 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-21T03:21:02.2280253Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:169:7] 2026-10-21T03:21:02.2280483Z 168 │ }); 2026-10-21T03:21:02.2280823Z 169 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-21T03:21:02.2281212Z 170 │ │ if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break; 2026-10-21T03:21:02.2281515Z 171 │ │ yield* Effect.yieldNow; 2026-10-21T03:21:02.2281777Z 172 │ ╰─▶ } 2026-10-21T03:21:02.2281981Z 173 │ 2026-10-21T03:21:02.2282102Z ╰──── 2026-10-21T03:21:02.2282162Z 2026-10-21T03:21:02.2282629Z ⚠ 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-21T03:21:02.2283199Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:178:7] 2026-10-21T03:21:02.2283472Z 177 │ yield* Deferred.succeed(releaseSave, undefined); 2026-10-21T03:21:02.2283794Z 178 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-21T03:21:02.2284121Z 179 │ │ if ((yield* Ref.get(saved)).length > 0) break; 2026-10-21T03:21:02.2284375Z 180 │ │ yield* Effect.yieldNow; 2026-10-21T03:21:02.2284633Z 181 │ ╰─▶ } 2026-10-21T03:21:02.2284830Z 182 │ 2026-10-21T03:21:02.2294492Z ╰──── 2026-10-21T03:21:02.2294578Z 2026-10-21T03:21:02.2295089Z ⚠ 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-21T03:21:02.2295680Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7] 2026-10-21T03:21:02.2295976Z 306 │ yield* Deferred.succeed(releaseUnenrichedSave, undefined); 2026-10-21T03:21:02.2296332Z 307 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-21T03:21:02.2296647Z 308 │ │ const values = yield* Ref.get(saved); 2026-10-21T03:21:02.2296989Z 309 │ │ if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) { 2026-10-21T03:21:02.2297276Z 310 │ │ break; 2026-10-21T03:21:02.2297468Z 311 │ │ } 2026-10-21T03:21:02.2297680Z 312 │ │ yield* Effect.yieldNow; 2026-10-21T03:21:02.2297942Z 313 │ ╰─▶ } 2026-10-21T03:21:02.2298142Z 314 │ 2026-10-21T03:21:02.2298266Z ╰──── 2026-10-21T03:21:02.2298323Z 2026-10-21T03:21:02.2298533Z ⚠ eslint(no-unsafe-optional-chaining): Unsafe usage of optional chaining 2026-10-21T03:21:02.2299016Z ╭─[apps/server/src/orchestration-v2/ThreadLaunchService.test.ts:1783:8] 2026-10-21T03:21:02.2299300Z 1782 │ assert.equal( 2026-10-21T03:21:02.2299532Z 1783 │ (stored.context?.records[0] as { attachmentId: string }).attachmentId, 2026-10-21T03:21:02.2299801Z ·  ────────────────────────── 2026-10-21T03:21:02.2299995Z 1784 │ stored.attachments[0]?.id, 2026-10-21T03:21:02.2300155Z ╰──── 2026-10-21T03:21:02.2300390Z  help: If this short-circuits with 'undefined' the evaluation will throw TypeError 2026-10-21T03:21:02.2300570Z 2026-10-21T03:21:02.2301123Z ⚠ 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-21T03:21:02.2301715Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7] 2026-10-21T03:21:02.2301997Z 565 │ let afterSequence = created[0]!.sequence; 2026-10-21T03:21:02.2302309Z 566 │ ╭─▶ for (let index = 1; index <= 32; index += 1) { 2026-10-21T03:21:02.2302599Z 567 │ │ const nextEvent = { 2026-10-21T03:21:02.2302874Z 568 │ │ id: EventId.make(`event:foundation-stream-race:${index}`), 2026-10-21T03:21:02.2303175Z 569 │ │ type: "thread.metadata-updated" as const, 2026-10-21T03:21:02.2303410Z 570 │ │ threadId, 2026-10-21T03:21:02.2303629Z 571 │ │ providerInstanceId, 2026-10-21T03:21:02.2303852Z 572 │ │ occurredAt: now, 2026-10-21T03:21:02.2304123Z 573 │ │ payload: { ...thread, title: `Race update ${index}` }, 2026-10-21T03:21:02.2304405Z 574 │ │ } satisfies OrchestrationV2DomainEvent; 2026-10-21T03:21:02.2304664Z 575 │ │ const reader = yield* eventSink 2026-10-21T03:21:02.2304916Z 576 │ │ .stream({ threadId, afterSequence }) 2026-10-21T03:21:02.2305187Z 577 │ │ .pipe(Stream.runHead, Effect.forkChild); 2026-10-21T03:21:02.2305436Z 578 │ │ yield* Effect.yieldNow; 2026-10-21T03:21:02.2305721Z 579 │ │ const written = yield* eventSink.write({ events: [nextEvent] }); 2026-10-21T03:21:02.2306017Z 580 │ │ const received = yield* Fiber.join(reader); 2026-10-21T03:21:02.2306282Z 581 │ │ if (Option.isNone(received)) { 2026-10-21T03:21:02.2306613Z 582 │ │ return yield* Effect.die("The event stream ended before delivering the live event."); 2026-10-21T03:21:02.2306898Z 583 │ │ } 2026-10-21T03:21:02.2307166Z 584 │ │ assert.equal(received.value.sequence, written[0]?.sequence); 2026-10-21T03:21:02.2307482Z 585 │ │ assert.equal(received.value.event.id, nextEvent.id); 2026-10-21T03:21:02.2307768Z 586 │ │ afterSequence = received.value.sequence; 2026-10-21T03:21:02.2308041Z 587 │ ╰─▶ } 2026-10-21T03:21:02.2308245Z 588 │ }), 2026-10-21T03:21:02.2308373Z ╰──── 2026-10-21T03:21:02.2308434Z 2026-10-21T03:21:02.2308969Z ⚠ 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-21T03:21:02.2309597Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:2327:9] 2026-10-21T03:21:02.2309852Z 2326 │ let settled = false; 2026-10-21T03:21:02.2310110Z 2327 │ ╭─▶ while (!settled) { 2026-10-21T03:21:02.2310431Z 2328 │ │ settled = (yield* outbox.listByCommandId(commandId)).every( 2026-10-21T03:21:02.2310755Z 2329 │ │ (effect) => effect.status === "succeeded", 2026-10-21T03:21:02.2310997Z 2330 │ │ ); 2026-10-21T03:21:02.2311234Z 2331 │ │ if (!settled) yield* Effect.yieldNow; 2026-10-21T03:21:02.2311513Z 2332 │ ╰─▶ } 2026-10-21T03:21:02.2311777Z 2333 │ }).pipe(Effect.provide(layerWorker), Effect.scoped); 2026-10-21T03:21:02.2311964Z ╰──── 2026-10-21T03:21:02.2312020Z 2026-10-21T03:21:02.2312285Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-21T03:21:02.2312662Z ╭─[packages/provider-pi/src/server/adapter.ts:3388:7] 2026-10-21T03:21:02.2312858Z 3387 │ 2026-10-21T03:21:02.2313114Z 3388 │ const layer: Layer.Layer = 2026-10-21T03:21:02.2313379Z ·  ──┬── 2026-10-21T03:21:02.2313598Z · ╰── 'layer' is declared here 2026-10-21T03:21:02.2313804Z 3389 │ Layer.effect( 2026-10-21T03:21:02.2313942Z ╰──── 2026-10-21T03:21:02.2314115Z  help: Consider removing this declaration. 2026-10-21T03:21:02.2314240Z 2026-10-21T03:21:02.2314702Z ⚠ 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-21T03:21:02.2315276Z ╭─[packages/client-runtime/src/connection/supervisor.test.ts:135:3] 2026-10-21T03:21:02.2315551Z 134 │ let lastState = yield* SubscriptionRef.get(state); 2026-10-21T03:21:02.2315896Z 135 │ ╭─▶ for (let iteration = 0; iteration < 100; iteration += 1) { 2026-10-21T03:21:02.2316231Z 136 │ │ lastState = yield* SubscriptionRef.get(state); 2026-10-21T03:21:02.2316487Z 137 │ │ if (predicate(lastState)) { 2026-10-21T03:21:02.2316708Z 138 │ │ return lastState; 2026-10-21T03:21:02.2316790Z 139 │ │ } 2026-10-21T03:21:02.2316895Z 140 │ │ yield* Effect.yieldNow; 2026-10-21T03:21:02.2317023Z 141 │ ╰─▶ } 2026-10-21T03:21:02.2317099Z 142 │ return yield* Effect.die( 2026-10-21T03:21:02.2317155Z ╰──── 2026-10-21T03:21:02.2317158Z 2026-10-21T03:21:02.2317446Z ⚠ eslint(no-unused-vars): Variable 'layerUnavailable' is declared but never used. Unused variables should start with a '_'. 2026-10-21T03:21:02.2317593Z ╭─[apps/server/src/orchestration-v2/Orchestrator.ts:12088:7] 2026-10-21T03:21:02.2317652Z 12087 │ 2026-10-21T03:21:02.2317990Z 12088 │ const layerUnavailable: Layer.Layer = Layer.succeed( 2026-10-21T03:21:02.2318125Z ·  ────────┬─────── 2026-10-21T03:21:02.2318280Z · ╰── 'layerUnavailable' is declared here 2026-10-21T03:21:02.2318350Z 12089 │ OrchestratorV2, 2026-10-21T03:21:02.2318410Z ╰──── 2026-10-21T03:21:02.2318521Z  help: Consider removing this declaration. 2026-10-21T03:21:02.2318523Z 2026-10-21T03:21:02.2318754Z ⚠ eslint(no-unused-vars): Function 'assertUserMessagesExclude' is declared but never used. 2026-10-21T03:21:02.2318915Z ╭─[apps/server/src/orchestration-v2/testkit/fixtures/shared.ts:1398:10] 2026-10-21T03:21:02.2318980Z 1397 │ 2026-10-21T03:21:02.2319072Z 1398 │ function assertUserMessagesExclude( 2026-10-21T03:21:02.2319184Z ·  ────────────┬──────────── 2026-10-21T03:21:02.2319356Z · ╰── 'assertUserMessagesExclude' is declared here 2026-10-21T03:21:02.2319468Z 1399 │ projection: OrchestrationV2ThreadProjection, 2026-10-21T03:21:02.2319527Z ╰──── 2026-10-21T03:21:02.2319633Z  help: Consider removing this declaration. 2026-10-21T03:21:02.2319636Z 2026-10-21T03:21:02.2319862Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-21T03:21:02.2320010Z ╭─[packages/client-runtime/src/operations/projects.ts:228:51] 2026-10-21T03:21:02.2320077Z 227 │ ): string { 2026-10-21T03:21:02.2320236Z 228 │ const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? ""; 2026-10-21T03:21:02.2320361Z ·  ────── 2026-10-21T03:21:02.2320496Z 229 │ return target.owner ? `${target.owner}/${folderName}` : folderName; 2026-10-21T03:21:02.2320553Z ╰──── 2026-10-21T03:21:02.2320749Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-21T03:21:02.2320754Z 2026-10-21T03:21:02.2321034Z ⚠ eslint(no-unused-vars): Function 'normalizeTerminalContextSelection' is declared but never used. 2026-10-21T03:21:02.2321148Z ╭─[apps/web/src/lib/terminalContext.ts:56:10] 2026-10-21T03:21:02.2321206Z 55 │ 2026-10-21T03:21:02.2321311Z 56 │ function normalizeTerminalContextSelection( 2026-10-21T03:21:02.2321422Z ·  ────────────────┬──────────────── 2026-10-21T03:21:02.2321664Z · ╰── 'normalizeTerminalContextSelection' is declared here 2026-10-21T03:21:02.2321787Z 57 │ selection: TerminalContextSelection, 2026-10-21T03:21:02.2321843Z ╰──── 2026-10-21T03:21:02.2321950Z  help: Consider removing this declaration. 2026-10-21T03:21:02.2321952Z 2026-10-21T03:21:02.2322117Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-21T03:21:02.2322263Z ╭─[apps/server/src/process/externalLauncher.test.ts:186:12] 2026-10-21T03:21:02.2322321Z 185 │ 2026-10-21T03:21:02.2322426Z 186 │ for (const {} of ["darwin", "linux"] as const) { 2026-10-21T03:21:02.2322499Z ·  ── 2026-10-21T03:21:02.2322557Z 187 │ } 2026-10-21T03:21:02.2322613Z ╰──── 2026-10-21T03:21:02.2322846Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-21T03:21:02.2322848Z 2026-10-21T03:21:02.2323018Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-21T03:21:02.2323162Z ╭─[apps/server/src/process/externalLauncher.test.ts:189:12] 2026-10-21T03:21:02.2323220Z 188 │ 2026-10-21T03:21:02.2323290Z 189 │ for (const {} of [ 2026-10-21T03:21:02.2323360Z ·  ── 2026-10-21T03:21:02.2323456Z 190 │ { kind: "browser", folderVerb: "none" }, 2026-10-21T03:21:02.2323511Z ╰──── 2026-10-21T03:21:02.2323742Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-21T03:21:02.2323744Z 2026-10-21T03:21:02.2323910Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-21T03:21:02.2324051Z ╭─[apps/server/src/process/externalLauncher.test.ts:311:12] 2026-10-21T03:21:02.2324114Z 310 │ 2026-10-21T03:21:02.2324249Z 311 │ for (const {} of ["rejected", "spawn-error", "stalled"] as const) { 2026-10-21T03:21:02.2324319Z ·  ── 2026-10-21T03:21:02.2324377Z 312 │ } 2026-10-21T03:21:02.2324434Z ╰──── 2026-10-21T03:21:02.2324661Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-21T03:21:02.2324663Z 2026-10-21T03:21:02.2324827Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-21T03:21:02.2324966Z ╭─[apps/server/src/process/externalLauncher.test.ts:314:12] 2026-10-21T03:21:02.2325024Z 313 │ 2026-10-21T03:21:02.2325093Z 314 │ for (const {} of [ 2026-10-21T03:21:02.2325162Z ·  ── 2026-10-21T03:21:02.2325220Z 315 │ { 2026-10-21T03:21:02.2325285Z ╰──── 2026-10-21T03:21:02.2325515Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-21T03:21:02.2325518Z 2026-10-21T03:21:02.2325682Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-21T03:21:02.2325805Z ╭─[apps/server/src/processRunner.test.ts:266:14] 2026-10-21T03:21:02.2325862Z 265 │ 2026-10-21T03:21:02.2325971Z 266 │ for (const {} of ["timeout", "success"] as const) { 2026-10-21T03:21:02.2326045Z ·  ── 2026-10-21T03:21:02.2326104Z 267 │ } 2026-10-21T03:21:02.2326159Z ╰──── 2026-10-21T03:21:02.2326387Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-21T03:21:02.2326390Z 2026-10-21T03:21:02.2326642Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-21T03:21:02.2326844Z ╭─[apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx:814:17] 2026-10-21T03:21:02.2326911Z 813 │
{ 2026-10-21T03:21:02.2334724Z 236 │ const input = Schema.decodeUnknownSync(SettingsUpdate)(payload); 2026-10-21T03:21:02.2334831Z ·  ──────────────────────── 2026-10-21T03:21:02.2334971Z 237 │ const scopes = requiredScopesForServerSettingsPatch(input.patch); 2026-10-21T03:21:02.2335032Z ╰──── 2026-10-21T03:21:02.2335035Z 2026-10-21T03:21:02.2335397Z ⚠ 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-21T03:21:02.2335529Z ╭─[apps/server/src/auth/RpcAuthorization.ts:255:26] 2026-10-21T03:21:02.2335635Z 254 │ if (method === WS_METHODS.assetsCreateUrl) { 2026-10-21T03:21:02.2335794Z 255 │ const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload); 2026-10-21T03:21:02.2335907Z ·  ──────────────────────── 2026-10-21T03:21:02.2335972Z 256 │ return [ 2026-10-21T03:21:02.2336029Z ╰──── 2026-10-21T03:21:02.2336031Z 2026-10-21T03:21:02.2336234Z ⚠ eslint(no-unused-vars): Identifier 'identity' is imported but never used. 2026-10-21T03:21:02.2336337Z ╭─[apps/server/src/auth/http.ts:28:10] 2026-10-21T03:21:02.2336431Z 27 │ import * as Schema from "effect/Schema"; 2026-10-21T03:21:02.2336530Z 28 │ import { identity } from "effect/Function"; 2026-10-21T03:21:02.2336609Z ·  ────┬─── 2026-10-21T03:21:02.2336819Z · ╰── 'identity' is imported here 2026-10-21T03:21:02.2336943Z 29 │ import * as Layer from "effect/Layer"; 2026-10-21T03:21:02.2336999Z ╰──── 2026-10-21T03:21:02.2337100Z  help: Consider removing this import. 2026-10-21T03:21:02.2337103Z 2026-10-21T03:21:02.2337314Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-21T03:21:02.2337455Z ╭─[packages/shared/src/composerContextLegacySend.ts:19:45] 2026-10-21T03:21:02.2337584Z 18 │ const occurrences = collectComposerContextReferences(text); 2026-10-21T03:21:02.2337695Z 19 │ for (const occurrence of [...occurrences].reverse()) { 2026-10-21T03:21:02.2337806Z ·  ─────── 2026-10-21T03:21:02.2337927Z 20 │ const record = recordsById.get(occurrence.contextId); 2026-10-21T03:21:02.2337984Z ╰──── 2026-10-21T03:21:02.2338250Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-21T03:21:02.2338252Z 2026-10-21T03:21:02.2338458Z ⚠ typescript(no-extraneous-class): Unexpected class with only a constructor. 2026-10-21T03:21:02.2338581Z ╭─[apps/desktop/src/preview/Manager.test.ts:158:18] 2026-10-21T03:21:02.2338685Z 157 │ BrowserWindow: browserWindowConstructor, 2026-10-21T03:21:02.2338848Z 158 │ ╭─▶ ClipboardItem: class { 2026-10-21T03:21:02.2338981Z 159 │ │ constructor(data: Record) { 2026-10-21T03:21:02.2339097Z 160 │ │ clipboardItemConstructor(data); 2026-10-21T03:21:02.2339183Z 161 │ │ } 2026-10-21T03:21:02.2339314Z 162 │ ╰─▶ }, 2026-10-21T03:21:02.2339433Z 163 │ clipboard: { 2026-10-21T03:21:02.2339487Z ╰──── 2026-10-21T03:21:02.2339660Z  help: Try replacing this class with a standalone function or deleting it entirely 2026-10-21T03:21:02.2339663Z 2026-10-21T03:21:02.2339893Z ⚠ eslint(no-unneeded-ternary): Unnecessary use of boolean literals in conditional expression 2026-10-21T03:21:02.2340021Z ╭─[packages/shared/src/serverSettings.test.ts:35:7] 2026-10-21T03:21:02.2340202Z 34 │ const fallback = fallbackTextGenerationModelSelection(providerInstances, (instanceId) => 2026-10-21T03:21:02.2340300Z 35 │ instanceId === configured ? true : false, 2026-10-21T03:21:02.2340423Z ·  ──────────────────────────────────────── 2026-10-21T03:21:02.2340485Z 36 │ ); 2026-10-21T03:21:02.2340538Z ╰──── 2026-10-21T03:21:02.2340639Z  help: Remove this ternary operator 2026-10-21T03:21:02.2340641Z 2026-10-21T03:21:02.2340900Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-21T03:21:02.2341040Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:121:27] 2026-10-21T03:21:02.2341203Z 120 │ const scope = makeScope(options.capabilities ?? new Set(["preview", "worktree"])); 2026-10-21T03:21:02.2341298Z 121 │ const dispatch = vi.fn((_: unknown) => 2026-10-21T03:21:02.2341385Z ·  ┬ 2026-10-21T03:21:02.2341521Z · ╰── '_' is declared here 2026-10-21T03:21:02.2341623Z 122 │ (options.dispatchGate ?? Effect.void).pipe( 2026-10-21T03:21:02.2341740Z ╰──── 2026-10-21T03:21:02.2341876Z  help: Consider removing this parameter. 2026-10-21T03:21:02.2341878Z 2026-10-21T03:21:02.2342063Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-21T03:21:02.2342198Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:134:39] 2026-10-21T03:21:02.2342258Z 133 │ ); 2026-10-21T03:21:02.2342366Z 134 │ const listLocalBranchNames = vi.fn((_: string) => 2026-10-21T03:21:02.2342466Z ·  ┬ 2026-10-21T03:21:02.2342606Z · ╰── '_' is declared here 2026-10-21T03:21:02.2342678Z 135 │ Effect.succeed( 2026-10-21T03:21:02.2342733Z ╰──── 2026-10-21T03:21:02.2342838Z  help: Consider removing this parameter. 2026-10-21T03:21:02.2342848Z 2026-10-21T03:21:02.2343030Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-21T03:21:02.2343167Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:178:31] 2026-10-21T03:21:02.2343226Z 177 │ }); 2026-10-21T03:21:02.2343326Z 178 │ const sendToThread = vi.fn((_: unknown) => { 2026-10-21T03:21:02.2343413Z ·  ┬ 2026-10-21T03:21:02.2343550Z · ╰── '_' is declared here 2026-10-21T03:21:02.2343653Z 179 │ switch (options.continuation ?? "queued") { 2026-10-21T03:21:02.2343709Z ╰──── 2026-10-21T03:21:02.2343810Z  help: Consider removing this parameter. 2026-10-21T03:21:02.2343814Z 2026-10-21T03:21:02.2344001Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-21T03:21:02.2344140Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:203:33] 2026-10-21T03:21:02.2344198Z 202 │ ); 2026-10-21T03:21:02.2344301Z 203 │ const removeWorktree = vi.fn((_: unknown) => 2026-10-21T03:21:02.2344391Z ·  ┬ 2026-10-21T03:21:02.2344530Z · ╰── '_' is declared here 2026-10-21T03:21:02.2344617Z 204 │ options.removeWorktreeFails 2026-10-21T03:21:02.2344672Z ╰──── 2026-10-21T03:21:02.2344771Z  help: Consider removing this parameter. 2026-10-21T03:21:02.2344773Z 2026-10-21T03:21:02.2344956Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-21T03:21:02.2345092Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:208:36] 2026-10-21T03:21:02.2345155Z 207 │ ); 2026-10-21T03:21:02.2345260Z 208 │ const deleteLocalBranch = vi.fn((_: unknown) => 2026-10-21T03:21:02.2345356Z ·  ┬ 2026-10-21T03:21:02.2345496Z · ╰── '_' is declared here 2026-10-21T03:21:02.2345584Z 209 │ options.deleteLocalBranchFails 2026-10-21T03:21:02.2345636Z ╰──── 2026-10-21T03:21:02.2345740Z  help: Consider removing this parameter. 2026-10-21T03:21:02.2345742Z 2026-10-21T03:21:02.2345923Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-21T03:21:02.2346057Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:213:42] 2026-10-21T03:21:02.2346112Z 212 │ ); 2026-10-21T03:21:02.2346285Z 213 │ const fetchWorktreeBaseCommit = vi.fn((_: unknown) => 2026-10-21T03:21:02.2346418Z ·  ┬ 2026-10-21T03:21:02.2346560Z · ╰── '_' is declared here 2026-10-21T03:21:02.2346646Z 214 │ options.fetchWorktreeBaseFails 2026-10-21T03:21:02.2346701Z ╰──── 2026-10-21T03:21:02.2346804Z  help: Consider removing this parameter. 2026-10-21T03:21:02.2346807Z 2026-10-21T03:21:02.2346989Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-21T03:21:02.2347121Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:254:30] 2026-10-21T03:21:02.2347181Z 253 │ ); 2026-10-21T03:21:02.2347276Z 254 │ const localStatus = vi.fn((_: unknown) => 2026-10-21T03:21:02.2347366Z ·  ┬ 2026-10-21T03:21:02.2347503Z · ╰── '_' is declared here 2026-10-21T03:21:02.2347578Z 255 │ Effect.succeed({ 2026-10-21T03:21:02.2347640Z ╰──── 2026-10-21T03:21:02.2347743Z  help: Consider removing this parameter. 2026-10-21T03:21:02.2347746Z 2026-10-21T03:21:02.2347923Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-21T03:21:02.2348059Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:264:32] 2026-10-21T03:21:02.2348116Z 263 │ ); 2026-10-21T03:21:02.2348269Z 264 │ const refreshStatus = vi.fn((_: string) => Effect.die("refreshStatus stub")); 2026-10-21T03:21:02.2348358Z ·  ┬ 2026-10-21T03:21:02.2348495Z · ╰── '_' is declared here 2026-10-21T03:21:02.2348651Z 265 │ const runForThread = vi.fn((input: { readonly worktreePath: string }) => { 2026-10-21T03:21:02.2348709Z ╰──── 2026-10-21T03:21:02.2348809Z  help: Consider removing this parameter. 2026-10-21T03:21:02.2348812Z 2026-10-21T03:21:02.2349105Z ⚠ eslint(no-unused-vars): Variable 'revokeActiveMcpThread' is declared but never used. Unused variables should start with a '_'. 2026-10-21T03:21:02.2349232Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:218:7] 2026-10-21T03:21:02.2349292Z 217 │ 2026-10-21T03:21:02.2349439Z 218 │ const revokeActiveMcpThread = (threadId: ThreadId): Effect.Effect => 2026-10-21T03:21:02.2349533Z ·  ──────────┬────────── 2026-10-21T03:21:02.2349691Z · ╰── 'revokeActiveMcpThread' is declared here 2026-10-21T03:21:02.2349930Z 219 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeThread(threadId) : Effect.void; 2026-10-21T03:21:02.2350021Z ╰──── 2026-10-21T03:21:02.2350128Z  help: Consider removing this declaration. 2026-10-21T03:21:02.2350130Z 2026-10-21T03:21:02.2350443Z ⚠ eslint(no-unused-vars): Variable 'revokeAllActiveMcpCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-21T03:21:02.2350570Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:221:7] 2026-10-21T03:21:02.2350627Z 220 │ 2026-10-21T03:21:02.2350780Z 221 │ const revokeAllActiveMcpCredentials = (): Effect.Effect => 2026-10-21T03:21:02.2350907Z ·  ──────────────┬────────────── 2026-10-21T03:21:02.2351085Z · ╰── 'revokeAllActiveMcpCredentials' is declared here 2026-10-21T03:21:02.2351256Z 222 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void; 2026-10-21T03:21:02.2351313Z ╰──── 2026-10-21T03:21:02.2351421Z  help: Consider removing this declaration. 2026-10-21T03:21:02.2351423Z 2026-10-21T03:21:02.2351580Z ⚠ react(immutability): This value cannot be modified 2026-10-21T03:21:02.2351749Z ╭─[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5] 2026-10-21T03:21:02.2351852Z 65 │ const [expanded, setExpanded] = useState(false); 2026-10-21T03:21:02.2351943Z 66 │ const progress = useSharedValue(0); 2026-10-21T03:21:02.2352021Z ·  ────┬─── 2026-10-21T03:21:02.2352157Z · ╰── `progress` originates here 2026-10-21T03:21:02.2352225Z 67 │ useEffect(() => { 2026-10-21T03:21:02.2352357Z 68 │ progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING); 2026-10-21T03:21:02.2352435Z ·  ────┬─── 2026-10-21T03:21:02.2352571Z · ╰── `progress` cannot be modified 2026-10-21T03:21:02.2352643Z 69 │ }, [expanded, progress]); 2026-10-21T03:21:02.2352699Z ╰──── 2026-10-21T03:21:02.2352968Z  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-21T03:21:02.2353297Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-21T03:21:02.2353299Z 2026-10-21T03:21:02.2353536Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-21T03:21:02.2353710Z ╭─[apps/web/src/components/pullRequest/pullRequestList.logic.ts:187:9] 2026-10-21T03:21:02.2353778Z 186 │ ): boolean { 2026-10-21T03:21:02.2353931Z 187 │ const labels = entry.labels.map((label) => label.name.trim().toLowerCase()); 2026-10-21T03:21:02.2354087Z ·  ───────────────────────────────────────────────────────────────────── 2026-10-21T03:21:02.2354234Z 188 │ const holds = (label: string) => labels.includes(label.trim().toLowerCase()); 2026-10-21T03:21:02.2354291Z ╰──── 2026-10-21T03:21:02.2354373Z  help: Switch to `Set` 2026-10-21T03:21:02.2354375Z 2026-10-21T03:21:02.2354522Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2354681Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:122:38] 2026-10-21T03:21:02.2354841Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-21T03:21:02.2355031Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-21T03:21:02.2355188Z ·  ───────────┬────────── 2026-10-21T03:21:02.2355359Z · ╰── Cannot access ref value during render 2026-10-21T03:21:02.2355486Z 123 │ const sessionRef = useRef(null); 2026-10-21T03:21:02.2355541Z ╰──── 2026-10-21T03:21:02.2356020Z  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-21T03:21:02.2356322Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2356327Z 2026-10-21T03:21:02.2356470Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2356631Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8] 2026-10-21T03:21:02.2356688Z 125 │ 2026-10-21T03:21:02.2356800Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-21T03:21:02.2356889Z ·  ─────────┬──────── 2026-10-21T03:21:02.2357041Z · ╰── Cannot access ref value during render 2026-10-21T03:21:02.2357144Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-21T03:21:02.2357200Z ╰──── 2026-10-21T03:21:02.2357666Z  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-21T03:21:02.2358033Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2358036Z 2026-10-21T03:21:02.2358181Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2358338Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7] 2026-10-21T03:21:02.2358396Z 125 │ 2026-10-21T03:21:02.2358504Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-21T03:21:02.2358593Z ·  ─────────┬───────── 2026-10-21T03:21:02.2358743Z · ╰── Cannot access ref value during render 2026-10-21T03:21:02.2358849Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-21T03:21:02.2358904Z ╰──── 2026-10-21T03:21:02.2359367Z  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-21T03:21:02.2359660Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2359662Z 2026-10-21T03:21:02.2359806Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2359960Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7] 2026-10-21T03:21:02.2360016Z 125 │ 2026-10-21T03:21:02.2360126Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-21T03:21:02.2360296Z ·  ─────────┬───────── 2026-10-21T03:21:02.2360493Z · ╰── Cannot access ref value during render 2026-10-21T03:21:02.2360597Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-21T03:21:02.2360655Z ╰──── 2026-10-21T03:21:02.2361200Z  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-21T03:21:02.2361492Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2361494Z 2026-10-21T03:21:02.2361636Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2361799Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7] 2026-10-21T03:21:02.2361857Z 125 │ 2026-10-21T03:21:02.2361967Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-21T03:21:02.2362053Z ·  ─────────┬───────── 2026-10-21T03:21:02.2362200Z · ╰── Cannot access ref value during render 2026-10-21T03:21:02.2362302Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-21T03:21:02.2362357Z ╰──── 2026-10-21T03:21:02.2362819Z  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-21T03:21:02.2363115Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2363120Z 2026-10-21T03:21:02.2363266Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2363425Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31] 2026-10-21T03:21:02.2363481Z 125 │ 2026-10-21T03:21:02.2363587Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-21T03:21:02.2363704Z ·  ─────────┬───────── 2026-10-21T03:21:02.2363871Z · ╰── Cannot access ref value during render 2026-10-21T03:21:02.2363975Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-21T03:21:02.2364027Z ╰──── 2026-10-21T03:21:02.2364494Z  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-21T03:21:02.2364786Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2364788Z 2026-10-21T03:21:02.2364934Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2365094Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30] 2026-10-21T03:21:02.2365148Z 125 │ 2026-10-21T03:21:02.2365259Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-21T03:21:02.2365373Z ·  ──────────┬───────── 2026-10-21T03:21:02.2365612Z · ╰── Cannot access ref value during render 2026-10-21T03:21:02.2365753Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-21T03:21:02.2365808Z ╰──── 2026-10-21T03:21:02.2366270Z  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-21T03:21:02.2366559Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2366561Z 2026-10-21T03:21:02.2366703Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2366863Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46] 2026-10-21T03:21:02.2366984Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-21T03:21:02.2367177Z 127 │ ╭─▶ const recorder = createLazyVoiceRecorder({ 2026-10-21T03:21:02.2367352Z 128 │ │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-21T03:21:02.2367478Z 129 │ │ onStatus: (status: RecordingStatus) => { 2026-10-21T03:21:02.2367635Z 130 │ │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-21T03:21:02.2367758Z 131 │ │ isFinished: status.isFinished, 2026-10-21T03:21:02.2367941Z 132 │ │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-21T03:21:02.2368052Z 133 │ │ error: status.error, 2026-10-21T03:21:02.2368162Z 134 │ │ url: status.url, 2026-10-21T03:21:02.2368245Z 135 │ │ }); 2026-10-21T03:21:02.2368331Z 136 │ │ }, 2026-10-21T03:21:02.2368528Z 137 │ │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-21T03:21:02.2368640Z 138 │ │ selectInput: (inputs) => { 2026-10-21T03:21:02.2368798Z 139 │ │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-21T03:21:02.2368946Z 140 │ │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-21T03:21:02.2369109Z 141 │ │ const known = microphoneOrder(preferences.value.microphones); 2026-10-21T03:21:02.2369301Z 142 │ │ const order = rememberMicrophones(known, inputs); 2026-10-21T03:21:02.2369444Z 143 │ │ if (order !== known) { 2026-10-21T03:21:02.2369585Z 144 │ │ registry.set(updateMobilePreferencesAtom, { 2026-10-21T03:21:02.2369699Z 145 │ │ transform: (current) => ({ 2026-10-21T03:21:02.2369907Z 146 │ │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-21T03:21:02.2369996Z 147 │ │ }), 2026-10-21T03:21:02.2370080Z 148 │ │ }); 2026-10-21T03:21:02.2370159Z 149 │ │ } 2026-10-21T03:21:02.2370302Z 150 │ │ return preferredMicrophoneInput(inputs, order); 2026-10-21T03:21:02.2370382Z 151 │ │ }, 2026-10-21T03:21:02.2370521Z 152 │ ├─▶ }); 2026-10-21T03:21:02.2370802Z · ╰──── Passing a ref to a function may read its value during render 2026-10-21T03:21:02.2370920Z 153 │ recorderRef.current = recorder; 2026-10-21T03:21:02.2370978Z ╰──── 2026-10-21T03:21:02.2371445Z  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-21T03:21:02.2371737Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2371740Z 2026-10-21T03:21:02.2371888Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2372049Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16] 2026-10-21T03:21:02.2372113Z 152 │ }); 2026-10-21T03:21:02.2372199Z 153 │ recorderRef.current = recorder; 2026-10-21T03:21:02.2372312Z ·  ─────┬─────────┬─── 2026-10-21T03:21:02.2372497Z · │ ╰── Cannot update ref value during render 2026-10-21T03:21:02.2372618Z · ╰── This value is a ref 2026-10-21T03:21:02.2372724Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-21T03:21:02.2372777Z ╰──── 2026-10-21T03:21:02.2373245Z  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-21T03:21:02.2373538Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2373540Z 2026-10-21T03:21:02.2373686Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2373843Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48] 2026-10-21T03:21:02.2373929Z 153 │ recorderRef.current = recorder; 2026-10-21T03:21:02.2374124Z 154 │ ╭─▶ sessionRef.current = new VoiceInputSession({ 2026-10-21T03:21:02.2374212Z 155 │ │ recorder, 2026-10-21T03:21:02.2374404Z 156 │ │ getTranscriber: getLocalVoiceTranscriber, 2026-10-21T03:21:02.2374552Z 157 │ │ requestPermission: async () => { 2026-10-21T03:21:02.2374721Z 158 │ │ const permission = await requestRecordingPermissionsAsync(); 2026-10-21T03:21:02.2374916Z 159 │ │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-21T03:21:02.2374998Z 160 │ │ }, 2026-10-21T03:21:02.2375143Z 161 │ │ configureRecording: configureVoiceRecordingAudio, 2026-10-21T03:21:02.2375279Z 162 │ │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-21T03:21:02.2375416Z 163 │ │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-21T03:21:02.2375534Z 164 │ │ onStateChange: (nextState) => 2026-10-21T03:21:02.2375636Z 165 │ │ setState({ 2026-10-21T03:21:02.2375739Z 166 │ │ state: nextState, 2026-10-21T03:21:02.2375880Z 167 │ │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-21T03:21:02.2376011Z 168 │ │ label: sessionRef.current?.label ?? null, 2026-10-21T03:21:02.2376102Z 169 │ │ }), 2026-10-21T03:21:02.2376232Z 170 │ ├─▶ }); 2026-10-21T03:21:02.2376431Z · ╰──── Cannot access ref value during render 2026-10-21T03:21:02.2376492Z 171 │ } 2026-10-21T03:21:02.2376549Z ╰──── 2026-10-21T03:21:02.2377015Z  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-21T03:21:02.2377308Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2377310Z 2026-10-21T03:21:02.2377458Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2377617Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15] 2026-10-21T03:21:02.2377702Z 153 │ recorderRef.current = recorder; 2026-10-21T03:21:02.2377806Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-21T03:21:02.2377921Z ·  ─────┬────────┬─── 2026-10-21T03:21:02.2378109Z · │ ╰── Cannot update ref value during render 2026-10-21T03:21:02.2378230Z · ╰── This value is a ref 2026-10-21T03:21:02.2378297Z 155 │ recorder, 2026-10-21T03:21:02.2378351Z ╰──── 2026-10-21T03:21:02.2378813Z  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-21T03:21:02.2379104Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2379106Z 2026-10-21T03:21:02.2379251Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2379461Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7] 2026-10-21T03:21:02.2379580Z 184 │ return () => subscription.remove(); 2026-10-21T03:21:02.2379649Z 185 │ }, [controller]); 2026-10-21T03:21:02.2379727Z ·  ─────┬──── 2026-10-21T03:21:02.2379876Z · ╰── Cannot access ref value during render 2026-10-21T03:21:02.2379933Z 186 │ 2026-10-21T03:21:02.2379991Z ╰──── 2026-10-21T03:21:02.2380453Z  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-21T03:21:02.2380781Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2380789Z 2026-10-21T03:21:02.2380953Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2381110Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6] 2026-10-21T03:21:02.2381202Z 184 │ return () => subscription.remove(); 2026-10-21T03:21:02.2381268Z 185 │ }, [controller]); 2026-10-21T03:21:02.2381349Z ·  ──────┬───── 2026-10-21T03:21:02.2381493Z · ╰── Cannot access ref value during render 2026-10-21T03:21:02.2381550Z 186 │ 2026-10-21T03:21:02.2381602Z ╰──── 2026-10-21T03:21:02.2382071Z  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-21T03:21:02.2382365Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2382369Z 2026-10-21T03:21:02.2382515Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2382672Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6] 2026-10-21T03:21:02.2382730Z 191 │ }, 2026-10-21T03:21:02.2382804Z 192 │ [controller, recorder], 2026-10-21T03:21:02.2382882Z ·  ─────┬──── 2026-10-21T03:21:02.2383025Z · ╰── Cannot access ref value during render 2026-10-21T03:21:02.2383081Z 193 │ ); 2026-10-21T03:21:02.2383137Z ╰──── 2026-10-21T03:21:02.2383604Z  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-21T03:21:02.2383898Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2383900Z 2026-10-21T03:21:02.2384041Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2384201Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20] 2026-10-21T03:21:02.2384296Z 174 │ const controller = session.controller; 2026-10-21T03:21:02.2384387Z 175 │ const recorder = recorderRef.current; 2026-10-21T03:21:02.2384491Z ·  ─────────┬───────── 2026-10-21T03:21:02.2384702Z · ╰── Cannot access ref value during render 2026-10-21T03:21:02.2384789Z 176 │ 2026-10-21T03:21:02.2384844Z ╰──── 2026-10-21T03:21:02.2385301Z  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-21T03:21:02.2385597Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2385599Z 2026-10-21T03:21:02.2385750Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2385910Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5] 2026-10-21T03:21:02.2385974Z 191 │ }, 2026-10-21T03:21:02.2386050Z 192 │ [controller, recorder], 2026-10-21T03:21:02.2386142Z ·  ───────────┬────────── 2026-10-21T03:21:02.2386289Z · ╰── Cannot access ref value during render 2026-10-21T03:21:02.2386348Z 193 │ ); 2026-10-21T03:21:02.2386400Z ╰──── 2026-10-21T03:21:02.2386864Z  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-21T03:21:02.2387153Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2387156Z 2026-10-21T03:21:02.2387305Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2387464Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20] 2026-10-21T03:21:02.2387557Z 245 │ return () => clearInterval(intervalId); 2026-10-21T03:21:02.2387672Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-21T03:21:02.2387761Z ·  ─────┬──── 2026-10-21T03:21:02.2387916Z · ╰── Cannot access ref value during render 2026-10-21T03:21:02.2387972Z 247 │ 2026-10-21T03:21:02.2388028Z ╰──── 2026-10-21T03:21:02.2388492Z  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-21T03:21:02.2388794Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2388799Z 2026-10-21T03:21:02.2388943Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2389102Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20] 2026-10-21T03:21:02.2389197Z 174 │ const controller = session.controller; 2026-10-21T03:21:02.2389289Z 175 │ const recorder = recorderRef.current; 2026-10-21T03:21:02.2389395Z ·  ─────────┬───────── 2026-10-21T03:21:02.2389551Z · ╰── Cannot access ref value during render 2026-10-21T03:21:02.2389608Z 176 │ 2026-10-21T03:21:02.2389663Z ╰──── 2026-10-21T03:21:02.2390185Z  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-21T03:21:02.2390506Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2390508Z 2026-10-21T03:21:02.2390655Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2390838Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6] 2026-10-21T03:21:02.2390935Z 245 │ return () => clearInterval(intervalId); 2026-10-21T03:21:02.2391046Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-21T03:21:02.2391182Z ·  ────────────────────────┬─────────────────────── 2026-10-21T03:21:02.2391346Z · ╰── Cannot access ref value during render 2026-10-21T03:21:02.2391404Z 247 │ 2026-10-21T03:21:02.2391458Z ╰──── 2026-10-21T03:21:02.2391927Z  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-21T03:21:02.2392218Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2392220Z 2026-10-21T03:21:02.2392365Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2392529Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5] 2026-10-21T03:21:02.2392601Z 260 │ setOwnerFocused, 2026-10-21T03:21:02.2392668Z 261 │ session, 2026-10-21T03:21:02.2392744Z ·  ───┬─── 2026-10-21T03:21:02.2392885Z · ╰── Cannot access ref value during render 2026-10-21T03:21:02.2392948Z 262 │ stop, 2026-10-21T03:21:02.2393004Z ╰──── 2026-10-21T03:21:02.2393469Z  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-21T03:21:02.2393764Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2393771Z 2026-10-21T03:21:02.2393919Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2394076Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10] 2026-10-21T03:21:02.2394135Z 250 │ 2026-10-21T03:21:02.2394278Z 251 │ ╭─▶ return { 2026-10-21T03:21:02.2394495Z 252 │ │ isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null, 2026-10-21T03:21:02.2394576Z 253 │ │ state, 2026-10-21T03:21:02.2394670Z 254 │ │ audioLevels, 2026-10-21T03:21:02.2394768Z 255 │ │ elapsedSeconds, 2026-10-21T03:21:02.2394901Z 256 │ │ isBusy: voiceInputBlocksSubmission(state), 2026-10-21T03:21:02.2395042Z 257 │ │ ownerKey, 2026-10-21T03:21:02.2395159Z 258 │ │ label, 2026-10-21T03:21:02.2395253Z 259 │ │ focusedOwners, 2026-10-21T03:21:02.2395350Z 260 │ │ setOwnerFocused, 2026-10-21T03:21:02.2395433Z 261 │ │ session, 2026-10-21T03:21:02.2395518Z 262 │ │ stop, 2026-10-21T03:21:02.2395603Z 263 │ │ cancel, 2026-10-21T03:21:02.2395738Z 264 │ ├─▶ }; 2026-10-21T03:21:02.2395935Z · ╰──── Cannot access ref value during render 2026-10-21T03:21:02.2395996Z 265 │ } 2026-10-21T03:21:02.2396051Z ╰──── 2026-10-21T03:21:02.2396526Z  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-21T03:21:02.2396822Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2396824Z 2026-10-21T03:21:02.2396987Z ⚠ react(immutability): This value cannot be modified 2026-10-21T03:21:02.2397147Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-21T03:21:02.2397313Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-21T03:21:02.2397443Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-21T03:21:02.2397526Z ·  ─────┬───── 2026-10-21T03:21:02.2397672Z · ╰── `audioLevels` originates here 2026-10-21T03:21:02.2397870Z 123 │ const sessionRef = useRef(null); 2026-10-21T03:21:02.2398021Z 124 │ const recorderRef = useRef | null>(null); 2026-10-21T03:21:02.2398075Z 125 │ 2026-10-21T03:21:02.2398186Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-21T03:21:02.2398290Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-21T03:21:02.2398435Z 128 │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-21T03:21:02.2398532Z 129 │ onStatus: (status: RecordingStatus) => { 2026-10-21T03:21:02.2398659Z 130 │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-21T03:21:02.2398750Z 131 │ isFinished: status.isFinished, 2026-10-21T03:21:02.2398968Z 132 │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-21T03:21:02.2399090Z 133 │ error: status.error, 2026-10-21T03:21:02.2399164Z 134 │ url: status.url, 2026-10-21T03:21:02.2399229Z 135 │ }); 2026-10-21T03:21:02.2399289Z 136 │ }, 2026-10-21T03:21:02.2399459Z 137 │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-21T03:21:02.2399544Z 138 │ selectInput: (inputs) => { 2026-10-21T03:21:02.2399674Z 139 │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-21T03:21:02.2399790Z 140 │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-21T03:21:02.2399925Z 141 │ const known = microphoneOrder(preferences.value.microphones); 2026-10-21T03:21:02.2400039Z 142 │ const order = rememberMicrophones(known, inputs); 2026-10-21T03:21:02.2400123Z 143 │ if (order !== known) { 2026-10-21T03:21:02.2400234Z 144 │ registry.set(updateMobilePreferencesAtom, { 2026-10-21T03:21:02.2400322Z 145 │ transform: (current) => ({ 2026-10-21T03:21:02.2400503Z 146 │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-21T03:21:02.2400569Z 147 │ }), 2026-10-21T03:21:02.2400634Z 148 │ }); 2026-10-21T03:21:02.2400697Z 149 │ } 2026-10-21T03:21:02.2400870Z 150 │ return preferredMicrophoneInput(inputs, order); 2026-10-21T03:21:02.2400933Z 151 │ }, 2026-10-21T03:21:02.2400991Z 152 │ }); 2026-10-21T03:21:02.2401080Z 153 │ recorderRef.current = recorder; 2026-10-21T03:21:02.2401187Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-21T03:21:02.2401255Z 155 │ recorder, 2026-10-21T03:21:02.2401361Z 156 │ getTranscriber: getLocalVoiceTranscriber, 2026-10-21T03:21:02.2401456Z 157 │ requestPermission: async () => { 2026-10-21T03:21:02.2401591Z 158 │ const permission = await requestRecordingPermissionsAsync(); 2026-10-21T03:21:02.2401753Z 159 │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-21T03:21:02.2401811Z 160 │ }, 2026-10-21T03:21:02.2401927Z 161 │ configureRecording: configureVoiceRecordingAudio, 2026-10-21T03:21:02.2402037Z 162 │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-21T03:21:02.2402146Z 163 │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-21T03:21:02.2402227Z 164 │ onStateChange: (nextState) => 2026-10-21T03:21:02.2402298Z 165 │ setState({ 2026-10-21T03:21:02.2402374Z 166 │ state: nextState, 2026-10-21T03:21:02.2402486Z 167 │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-21T03:21:02.2402592Z 168 │ label: sessionRef.current?.label ?? null, 2026-10-21T03:21:02.2402658Z 169 │ }), 2026-10-21T03:21:02.2402718Z 170 │ }); 2026-10-21T03:21:02.2402776Z 171 │ } 2026-10-21T03:21:02.2402833Z 172 │ 2026-10-21T03:21:02.2402925Z 173 │ const session = sessionRef.current; 2026-10-21T03:21:02.2403017Z 174 │ const controller = session.controller; 2026-10-21T03:21:02.2403106Z 175 │ const recorder = recorderRef.current; 2026-10-21T03:21:02.2403163Z 176 │ 2026-10-21T03:21:02.2403239Z 177 │ useEffect(() => { 2026-10-21T03:21:02.2403396Z 178 │ const subscription = AppState.addEventListener("change", (nextState) => { 2026-10-21T03:21:02.2403541Z 179 │ // iOS reports `inactive` while its permission dialog is open. Only the 2026-10-21T03:21:02.2403686Z 180 │ // real background state cancels preparation; recorder status handles 2026-10-21T03:21:02.2403849Z 181 │ // calls and route interruptions during capture. 2026-10-21T03:21:02.2404023Z 182 │ if (nextState === "background") controller.appMovedToBackground(); 2026-10-21T03:21:02.2404081Z 183 │ }); 2026-10-21T03:21:02.2404172Z 184 │ return () => subscription.remove(); 2026-10-21T03:21:02.2404242Z 185 │ }, [controller]); 2026-10-21T03:21:02.2404298Z 186 │ 2026-10-21T03:21:02.2404360Z 187 │ useEffect( 2026-10-21T03:21:02.2404428Z 188 │ () => () => { 2026-10-21T03:21:02.2404506Z 189 │ controller.dispose(); 2026-10-21T03:21:02.2404579Z 190 │ recorder.release(); 2026-10-21T03:21:02.2404637Z 191 │ }, 2026-10-21T03:21:02.2404714Z 192 │ [controller, recorder], 2026-10-21T03:21:02.2404773Z 193 │ ); 2026-10-21T03:21:02.2404827Z 194 │ 2026-10-21T03:21:02.2404894Z 195 │ useEffect(() => { 2026-10-21T03:21:02.2405000Z 196 │ if (state.phase !== "recording") return; 2026-10-21T03:21:02.2405061Z 197 │ 2026-10-21T03:21:02.2405212Z 198 │ const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`; 2026-10-21T03:21:02.2405323Z 199 │ const activation = activateKeepAwakeAsync(tag); 2026-10-21T03:21:02.2405411Z 200 │ void activation.catch(() => {}); 2026-10-21T03:21:02.2405478Z 201 │ return () => { 2026-10-21T03:21:02.2405633Z 202 │ // Release after activation settles, even if the recording ends immediately. 2026-10-21T03:21:02.2405778Z 203 │ void activation.then(() => deactivateKeepAwake(tag)).catch(() => {}); 2026-10-21T03:21:02.2405838Z 204 │ }; 2026-10-21T03:21:02.2405922Z 205 │ }, [keepAwakeId, state.phase]); 2026-10-21T03:21:02.2405975Z 206 │ 2026-10-21T03:21:02.2406044Z 207 │ useEffect(() => { 2026-10-21T03:21:02.2406189Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-21T03:21:02.2406249Z 209 │ 2026-10-21T03:21:02.2406376Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-21T03:21:02.2406538Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-21T03:21:02.2406647Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-21T03:21:02.2406736Z ·  ─────┬───── 2026-10-21T03:21:02.2406880Z · ╰── `audioLevels` cannot be modified 2026-10-21T03:21:02.2406941Z 213 │ } 2026-10-21T03:21:02.2406999Z ╰──── 2026-10-21T03:21:02.2407273Z  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-21T03:21:02.2407594Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-21T03:21:02.2407600Z 2026-10-21T03:21:02.2407811Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-21T03:21:02.2407975Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-21T03:21:02.2408031Z 206 │ 2026-10-21T03:21:02.2408097Z 207 │ useEffect(() => { 2026-10-21T03:21:02.2408182Z ·  ───┬─── 2026-10-21T03:21:02.2408408Z · ╰── This function may (indirectly) reassign or modify `audioLevels` after render 2026-10-21T03:21:02.2408550Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-21T03:21:02.2408604Z 209 │ 2026-10-21T03:21:02.2408798Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-21T03:21:02.2408988Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-21T03:21:02.2409095Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-21T03:21:02.2409176Z ·  ─────┬───── 2026-10-21T03:21:02.2409314Z · ╰── This modifies `audioLevels` 2026-10-21T03:21:02.2409377Z 213 │ } 2026-10-21T03:21:02.2409433Z ╰──── 2026-10-21T03:21:02.2409782Z  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-21T03:21:02.2410100Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-21T03:21:02.2410103Z 2026-10-21T03:21:02.2410270Z ⚠ react(immutability): This value cannot be modified 2026-10-21T03:21:02.2410449Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:105:5] 2026-10-21T03:21:02.2410509Z 102 │ }) { 2026-10-21T03:21:02.2410628Z 103 │ const rotation = useSharedValue(props.hidden ? 1 : 0); 2026-10-21T03:21:02.2410743Z ·  ────┬─── 2026-10-21T03:21:02.2410928Z · ╰── `rotation` originates here 2026-10-21T03:21:02.2411006Z 104 │ useLayoutEffect(() => { 2026-10-21T03:21:02.2411154Z 105 │ rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING); 2026-10-21T03:21:02.2411231Z ·  ────┬─── 2026-10-21T03:21:02.2411367Z · ╰── `rotation` cannot be modified 2026-10-21T03:21:02.2411456Z 106 │ }, [props.hidden, rotation]); 2026-10-21T03:21:02.2411512Z ╰──── 2026-10-21T03:21:02.2411782Z  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-21T03:21:02.2412095Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-21T03:21:02.2412097Z 2026-10-21T03:21:02.2412260Z ⚠ react(immutability): This value cannot be modified 2026-10-21T03:21:02.2412430Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:281:5] 2026-10-21T03:21:02.2412529Z 278 │ const variant = props.variant ?? "plain"; 2026-10-21T03:21:02.2412669Z 279 │ const loadingVisibility = useSharedValue(props.loading ? 1 : 0); 2026-10-21T03:21:02.2412763Z ·  ────────┬──────── 2026-10-21T03:21:02.2412920Z · ╰── `loadingVisibility` originates here 2026-10-21T03:21:02.2412992Z 280 │ useLayoutEffect(() => { 2026-10-21T03:21:02.2413156Z 281 │ loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING); 2026-10-21T03:21:02.2413244Z ·  ────────┬──────── 2026-10-21T03:21:02.2413397Z · ╰── `loadingVisibility` cannot be modified 2026-10-21T03:21:02.2413491Z 282 │ }, [loadingVisibility, props.loading]); 2026-10-21T03:21:02.2413547Z ╰──── 2026-10-21T03:21:02.2413814Z  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-21T03:21:02.2414187Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-21T03:21:02.2414218Z 2026-10-21T03:21:02.2414374Z ⚠ react(immutability): This value cannot be modified 2026-10-21T03:21:02.2414547Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:336:5] 2026-10-21T03:21:02.2414606Z 333 │ }) { 2026-10-21T03:21:02.2414769Z 334 │ const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0); 2026-10-21T03:21:02.2414860Z ·  ─────────┬───────── 2026-10-21T03:21:02.2415016Z · ╰── `recordingVisibility` originates here 2026-10-21T03:21:02.2415091Z 335 │ useLayoutEffect(() => { 2026-10-21T03:21:02.2415284Z 336 │ recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING); 2026-10-21T03:21:02.2415376Z ·  ─────────┬───────── 2026-10-21T03:21:02.2415536Z · ╰── `recordingVisibility` cannot be modified 2026-10-21T03:21:02.2415631Z 337 │ }, [props.phase, recordingVisibility]); 2026-10-21T03:21:02.2415687Z ╰──── 2026-10-21T03:21:02.2415955Z  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-21T03:21:02.2416268Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-21T03:21:02.2416271Z 2026-10-21T03:21:02.2416434Z ⚠ eslint(no-new): Do not use 'new' for side effects. 2026-10-21T03:21:02.2416568Z ╭─[apps/server/src/mcp/McpToolAccess.test.ts:168:3] 2026-10-21T03:21:02.2416693Z 167 │ // @ts-expect-error a declaration constructed directly 2026-10-21T03:21:02.2416794Z 168 │ new McpToolAccess.Declaration(unchecked); 2026-10-21T03:21:02.2416894Z ·  ───────────────────────────── 2026-10-21T03:21:02.2417025Z 169 │ // @ts-expect-error a handlers layer built outside McpToolAccess 2026-10-21T03:21:02.2417082Z ╰──── 2026-10-21T03:21:02.2417242Z  help: Assign the result of 'new' to a variable or compare it to a reference. 2026-10-21T03:21:02.2417245Z 2026-10-21T03:21:02.2417397Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2417570Z ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14] 2026-10-21T03:21:02.2417659Z 26 │ const latestInput = useRef(input); 2026-10-21T03:21:02.2417739Z 27 │ latestInput.current = input; 2026-10-21T03:21:02.2417865Z ·  ─────┬─────────┬─── 2026-10-21T03:21:02.2418057Z · │ ╰── Cannot update ref value during render 2026-10-21T03:21:02.2418177Z · ╰── This value is a ref 2026-10-21T03:21:02.2418254Z 28 │ const mounted = useRef(true); 2026-10-21T03:21:02.2418316Z ╰──── 2026-10-21T03:21:02.2418798Z  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-21T03:21:02.2419100Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2419102Z 2026-10-21T03:21:02.2419351Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-21T03:21:02.2419490Z ╭─[packages/shared/src/qrCode.ts:458:44] 2026-10-21T03:21:02.2419561Z 457 │ ): Array { 2026-10-21T03:21:02.2419672Z 458 │ let result: Array = divisor.map((_) => 0); 2026-10-21T03:21:02.2419777Z ·  ┬ 2026-10-21T03:21:02.2419922Z · ╰── '_' is declared here 2026-10-21T03:21:02.2420000Z 459 │ for (const b of data) { 2026-10-21T03:21:02.2420056Z ╰──── 2026-10-21T03:21:02.2420164Z  help: Consider removing this parameter. 2026-10-21T03:21:02.2420166Z 2026-10-21T03:21:02.2420545Z ⚠ 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-21T03:21:02.2420673Z ╭─[packages/shared/src/otelEnvironment.ts:143:14] 2026-10-21T03:21:02.2420764Z 142 │ name, 2026-10-21T03:21:02.2420953Z 143 │ (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()), 2026-10-21T03:21:02.2421059Z ·  ────────────────────────── 2026-10-21T03:21:02.2421185Z 144 │ `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`, 2026-10-21T03:21:02.2421243Z ╰──── 2026-10-21T03:21:02.2421246Z 2026-10-21T03:21:02.2421407Z ⚠ react(immutability): This value cannot be modified 2026-10-21T03:21:02.2421568Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:42:5] 2026-10-21T03:21:02.2421625Z 35 │ 2026-10-21T03:21:02.2421773Z 36 │ const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0); 2026-10-21T03:21:02.2421866Z ·  ────────┬──────── 2026-10-21T03:21:02.2422013Z · ╰── `inspectorProgress` originates here 2026-10-21T03:21:02.2422110Z 37 │ const { renderedInspectorWidth } = props; 2026-10-21T03:21:02.2422245Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-21T03:21:02.2422302Z 39 │ 2026-10-21T03:21:02.2422385Z 40 │ const onClosed = props.onClosed; 2026-10-21T03:21:02.2422454Z 41 │ useEffect(() => { 2026-10-21T03:21:02.2422548Z 42 │ inspectorProgress.value = withTiming( 2026-10-21T03:21:02.2422637Z ·  ────────┬──────── 2026-10-21T03:21:02.2422785Z · ╰── `inspectorProgress` cannot be modified 2026-10-21T03:21:02.2422869Z 43 │ inspectorVisible ? 1 : 0, 2026-10-21T03:21:02.2422977Z ╰──── 2026-10-21T03:21:02.2423277Z  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-21T03:21:02.2423585Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-21T03:21:02.2423590Z 2026-10-21T03:21:02.2423745Z ⚠ react(immutability): This value cannot be modified 2026-10-21T03:21:02.2423908Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:67:7] 2026-10-21T03:21:02.2424006Z 37 │ const { renderedInspectorWidth } = props; 2026-10-21T03:21:02.2424142Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-21T03:21:02.2424231Z ·  ──────────┬───────── 2026-10-21T03:21:02.2424392Z · ╰── `renderedContentWidth` originates here 2026-10-21T03:21:02.2424453Z 39 │ 2026-10-21T03:21:02.2424536Z 40 │ const onClosed = props.onClosed; 2026-10-21T03:21:02.2424601Z 41 │ useEffect(() => { 2026-10-21T03:21:02.2424698Z 42 │ inspectorProgress.value = withTiming( 2026-10-21T03:21:02.2424779Z 43 │ inspectorVisible ? 1 : 0, 2026-10-21T03:21:02.2424851Z 44 │ WORKSPACE_PANE_TIMING, 2026-10-21T03:21:02.2424921Z 45 │ (finished) => { 2026-10-21T03:21:02.2425064Z 46 │ if (finished === true && !inspectorVisible && onClosed !== undefined) { 2026-10-21T03:21:02.2425141Z 47 │ runOnJS(onClosed)(); 2026-10-21T03:21:02.2425201Z 48 │ } 2026-10-21T03:21:02.2425259Z 49 │ }, 2026-10-21T03:21:02.2425319Z 50 │ ); 2026-10-21T03:21:02.2425460Z 51 │ const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0; 2026-10-21T03:21:02.2425544Z 52 │ renderedInspectorWidth.set( 2026-10-21T03:21:02.2425692Z 53 │ resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING), 2026-10-21T03:21:02.2425749Z 54 │ ); 2026-10-21T03:21:02.2425806Z 55 │ }, [ 2026-10-21T03:21:02.2425876Z 56 │ inspectorProgress, 2026-10-21T03:21:02.2425947Z 57 │ inspectorVisible, 2026-10-21T03:21:02.2426014Z 58 │ inspectorWidth, 2026-10-21T03:21:02.2426077Z 59 │ onClosed, 2026-10-21T03:21:02.2426151Z 60 │ renderedInspectorWidth, 2026-10-21T03:21:02.2426214Z 61 │ resizing, 2026-10-21T03:21:02.2426271Z 62 │ ]); 2026-10-21T03:21:02.2426324Z 63 │ 2026-10-21T03:21:02.2426390Z 64 │ useEffect(() => { 2026-10-21T03:21:02.2426486Z 65 │ const targetWidth = inspectorWidth ?? 0; 2026-10-21T03:21:02.2426580Z 66 │ if (!inspectorVisible || resizing) { 2026-10-21T03:21:02.2426683Z 67 │ renderedContentWidth.value = targetWidth; 2026-10-21T03:21:02.2426773Z ·  ──────────┬───────── 2026-10-21T03:21:02.2426935Z · ╰── `renderedContentWidth` cannot be modified 2026-10-21T03:21:02.2426998Z 68 │ return; 2026-10-21T03:21:02.2427051Z ╰──── 2026-10-21T03:21:02.2427318Z  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-21T03:21:02.2427624Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-21T03:21:02.2427627Z 2026-10-21T03:21:02.2427893Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-21T03:21:02.2428092Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:203:7] 2026-10-21T03:21:02.2428148Z 202 │ } 2026-10-21T03:21:02.2428220Z 203 │ }, [wrappedRender]); 2026-10-21T03:21:02.2428303Z ·  ──────┬────── 2026-10-21T03:21:02.2428454Z · ╰── Unnecessary dependency `wrappedRender` 2026-10-21T03:21:02.2428509Z 204 │ 2026-10-21T03:21:02.2428566Z ╰──── 2026-10-21T03:21:02.2428862Z  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-21T03:21:02.2429176Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2429179Z 2026-10-21T03:21:02.2429425Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-21T03:21:02.2429592Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:753:35] 2026-10-21T03:21:02.2429658Z 752 │ > 2026-10-21T03:21:02.2429778Z 753 │ 2026-10-21T03:21:02.2429893Z ·  ──────────────────── 2026-10-21T03:21:02.2429992Z 754 │ 2026-10-21T03:21:02.2431073Z 768 │ 2026-10-21T03:21:02.2431195Z ·  ──────────────────── 2026-10-21T03:21:02.2431300Z 769 │ 2026-10-21T03:21:02.2431356Z ╰──── 2026-10-21T03:21:02.2431580Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-21T03:21:02.2431718Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-21T03:21:02.2431725Z 2026-10-21T03:21:02.2431949Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-21T03:21:02.2432071Z ╭─[packages/shared/src/serverSettings.ts:343:9] 2026-10-21T03:21:02.2432177Z 342 │ const entry: ProjectSettingsOverrides = { 2026-10-21T03:21:02.2432306Z 343 │ ...(entries.get(projectId) ?? currentEntries[projectId] ?? {}), 2026-10-21T03:21:02.2432450Z ·  ────────────────────────────────────────────────────────────── 2026-10-21T03:21:02.2432511Z 344 │ }; 2026-10-21T03:21:02.2432568Z ╰──── 2026-10-21T03:21:02.2432833Z  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-21T03:21:02.2432836Z 2026-10-21T03:21:02.2433113Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in Array.prototype.reduce() 2026-10-21T03:21:02.2433264Z ╭─[packages/shared/src/serverSettings.ts:429:24] 2026-10-21T03:21:02.2433335Z 428 │ const favorites = 2026-10-21T03:21:02.2433443Z 429 │ setModelFavorites?.reduce((current, change) => { 2026-10-21T03:21:02.2433531Z ·  ───┬── 2026-10-21T03:21:02.2433660Z · ╰── For this reduce 2026-10-21T03:21:02.2433747Z 430 │ const exists = current.some( 2026-10-21T03:21:02.2433920Z 431 │ (favorite) => favorite.provider === change.provider && favorite.model === change.model, 2026-10-21T03:21:02.2433982Z 432 │ ); 2026-10-21T03:21:02.2434062Z 433 │ return change.favorite 2026-10-21T03:21:02.2434128Z 434 │ ? exists 2026-10-21T03:21:02.2434199Z 435 │ ? current 2026-10-21T03:21:02.2434341Z 436 │ : [...current, { provider: change.provider, model: change.model }] 2026-10-21T03:21:02.2434427Z ·  ─────┬──── 2026-10-21T03:21:02.2434548Z · ╰── From this spread 2026-10-21T03:21:02.2434618Z 437 │ : current.filter( 2026-10-21T03:21:02.2434674Z ╰──── 2026-10-21T03:21:02.2434886Z  help: Consider using `Object.assign()` or `Array.prototype.push()` to mutate the accumulator instead. 2026-10-21T03:21:02.2435046Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-21T03:21:02.2435048Z 2026-10-21T03:21:02.2435236Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-21T03:21:02.2435358Z ╭─[packages/shared/src/serverSettings.ts:447:3] 2026-10-21T03:21:02.2435423Z 445 │ null; 2026-10-21T03:21:02.2435544Z 446 │ let nextModelPreferences = initialModelPreferences; 2026-10-21T03:21:02.2435633Z ·  ──────────┬───────── 2026-10-21T03:21:02.2435764Z · ╰── From this accumulator 2026-10-21T03:21:02.2435868Z 447 │ for (const change of setModelsHidden ?? []) { 2026-10-21T03:21:02.2435940Z ·  ─┬─ 2026-10-21T03:21:02.2436045Z · ╰── For this loop 2026-10-21T03:21:02.2436182Z 448 │ const preferences = nextModelPreferences?.[change.provider] ?? { 2026-10-21T03:21:02.2436256Z 449 │ hiddenModels: [], 2026-10-21T03:21:02.2436326Z 450 │ modelOrder: [], 2026-10-21T03:21:02.2436384Z 451 │ }; 2026-10-21T03:21:02.2436577Z 452 │ const hiddenModels = preferences.hiddenModels.filter((model) => model !== change.model); 2026-10-21T03:21:02.2436694Z 453 │ if (change.hidden) hiddenModels.push(change.model); 2026-10-21T03:21:02.2436774Z 454 │ nextModelPreferences = { 2026-10-21T03:21:02.2436851Z 455 │ ...nextModelPreferences, 2026-10-21T03:21:02.2436949Z ·  ───────────┬─────────── 2026-10-21T03:21:02.2437074Z · ╰── From this spread 2026-10-21T03:21:02.2437187Z 456 │ [change.provider]: { ...preferences, hiddenModels }, 2026-10-21T03:21:02.2437241Z ╰──── 2026-10-21T03:21:02.2437400Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-21T03:21:02.2437557Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-21T03:21:02.2437559Z 2026-10-21T03:21:02.2437856Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-21T03:21:02.2438090Z ╭─[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:116:34] 2026-10-21T03:21:02.2438160Z 115 │ return [...commands]; 2026-10-21T03:21:02.2438298Z 116 │ }, [activeThreadRef, pathname, registrationVersion, navigation]); 2026-10-21T03:21:02.2438414Z ·  ─────────┬───────── 2026-10-21T03:21:02.2438598Z · ╰── Unnecessary dependency `registrationVersion` 2026-10-21T03:21:02.2438653Z 117 │ 2026-10-21T03:21:02.2438709Z ╰──── 2026-10-21T03:21:02.2439029Z  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-21T03:21:02.2439354Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2439360Z 2026-10-21T03:21:02.2439621Z ⚠ unicorn(prefer-add-event-listener): Prefer `addEventListener()` over their `on`-function counterparts. 2026-10-21T03:21:02.2439769Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:12:14] 2026-10-21T03:21:02.2439929Z 11 │ addEventListener(_type: string, listener: (event: { data: string }) => void) { 2026-10-21T03:21:02.2440011Z 12 │ this.onmessage = listener; 2026-10-21T03:21:02.2440092Z ·  ───────── 2026-10-21T03:21:02.2440152Z 13 │ } 2026-10-21T03:21:02.2440209Z ╰──── 2026-10-21T03:21:02.2440535Z  help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on` replaces any previously registered handler. 2026-10-21T03:21:02.2440540Z 2026-10-21T03:21:02.2440764Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-21T03:21:02.2440977Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:16:9] 2026-10-21T03:21:02.2441048Z 15 │ constructor() { 2026-10-21T03:21:02.2441117Z 16 │ source = this; 2026-10-21T03:21:02.2441192Z ·  ────── 2026-10-21T03:21:02.2441251Z 17 │ } 2026-10-21T03:21:02.2441307Z ╰──── 2026-10-21T03:21:02.2441582Z  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-21T03:21:02.2441584Z 2026-10-21T03:21:02.2442064Z ⚠ 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-21T03:21:02.2442191Z ╭─[packages/shared/src/atomicWrite.test.ts:139:5] 2026-10-21T03:21:02.2442271Z 138 │ Effect.gen(function* () { 2026-10-21T03:21:02.2442467Z 139 │ ╭─▶ while (fiber.pollUnsafe() === undefined) { 2026-10-21T03:21:02.2442594Z 140 │ │ yield* TestClock.adjust("100 millis"); 2026-10-21T03:21:02.2442919Z 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-21T03:21:02.2443110Z 142 │ │ yield* Effect.promise(() => new Promise((resolve) => setImmediate(resolve))); 2026-10-21T03:21:02.2443314Z 143 │ ╰─▶ } 2026-10-21T03:21:02.2443474Z 144 │ return yield* Fiber.join(fiber); 2026-10-21T03:21:02.2443530Z ╰──── 2026-10-21T03:21:02.2443532Z 2026-10-21T03:21:02.2443790Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.2443967Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:321:7] 2026-10-21T03:21:02.2444028Z 316 │ }; 2026-10-21T03:21:02.2444099Z 317 │ useEffect(() => { 2026-10-21T03:21:02.2444171Z ·  ────┬──── 2026-10-21T03:21:02.2444304Z · ╰── This is the containing effect 2026-10-21T03:21:02.2444407Z 318 │ if (!guidesEnabled && section === "guide") { 2026-10-21T03:21:02.2444509Z 319 │ requestedSection.current = "overview"; 2026-10-21T03:21:02.2444679Z 320 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-21T03:21:02.2444757Z 321 │ setSection("overview"); 2026-10-21T03:21:02.2444836Z ·  ─────┬──── 2026-10-21T03:21:02.2445009Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2445065Z 322 │ } 2026-10-21T03:21:02.2445123Z ╰──── 2026-10-21T03:21:02.2445737Z  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-21T03:21:02.2446069Z  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-21T03:21:02.2446075Z 2026-10-21T03:21:02.2446285Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-21T03:21:02.2446456Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:323:6] 2026-10-21T03:21:02.2446559Z 318 │ if (!guidesEnabled && section === "guide") { 2026-10-21T03:21:02.2446660Z 319 │ requestedSection.current = "overview"; 2026-10-21T03:21:02.2446746Z ·  ────────┬─────── 2026-10-21T03:21:02.2447241Z · ╰── 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-21T03:21:02.2447443Z 320 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-21T03:21:02.2447590Z ·  ─────────┬───────── ──────┬────── 2026-10-21T03:21:02.2448083Z · │ ╰── 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-21T03:21:02.2448529Z · ╰── 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-21T03:21:02.2448604Z 321 │ setSection("overview"); 2026-10-21T03:21:02.2448669Z 322 │ } 2026-10-21T03:21:02.2448768Z 323 │ }, [guidesEnabled, section, insets.top]); 2026-10-21T03:21:02.2448881Z ·  ──────────────────┬───────────────── 2026-10-21T03:21:02.2449075Z · ╰── This dependency list is missing values used by the callback 2026-10-21T03:21:02.2449167Z 324 │ const tabContent = activityContent; 2026-10-21T03:21:02.2449223Z ╰──── 2026-10-21T03:21:02.2449395Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-21T03:21:02.2449708Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2449715Z 2026-10-21T03:21:02.2449925Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-21T03:21:02.2450099Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:859:6] 2026-10-21T03:21:02.2450161Z 842 │ if ( 2026-10-21T03:21:02.2450281Z 843 │ lastSelection.current.path === route.params.path && 2026-10-21T03:21:02.2450361Z ·  ──────┬────── 2026-10-21T03:21:02.2450857Z · ╰── 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-21T03:21:02.2451004Z 844 │ lastSelection.current.id === route.params.fileSelectionId 2026-10-21T03:21:02.2451064Z 845 │ ) 2026-10-21T03:21:02.2451127Z 846 │ return; 2026-10-21T03:21:02.2451311Z 847 │ lastSelection.current = { path: route.params.path, id: route.params.fileSelectionId }; 2026-10-21T03:21:02.2451454Z 848 │ if (route.params.focus) navigation.setParams({ focus: undefined }); 2026-10-21T03:21:02.2451543Z 849 │ setJumpPath(route.params.path); 2026-10-21T03:21:02.2451618Z 850 │ setSelectedRowId(null); 2026-10-21T03:21:02.2451701Z 851 │ jumpStarted.current = false; 2026-10-21T03:21:02.2451850Z 852 │ const file = data.files.find((entry) => entry.path === route.params.path); 2026-10-21T03:21:02.2451947Z 853 │ if (!file || !nativeView.current) return; 2026-10-21T03:21:02.2452036Z ·  ─────┬──── 2026-10-21T03:21:02.2452471Z · ╰── 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-21T03:21:02.2452657Z 854 │ setCollapsedIds((ids) => ids.filter((id) => id !== file.id)); 2026-10-21T03:21:02.2452770Z 855 │ jumpStarted.current = true; 2026-10-21T03:21:02.2452907Z 856 │ void nativeView.current.scrollToFile(file.id, false).catch(() => { 2026-10-21T03:21:02.2452991Z 857 │ jumpStarted.current = false; 2026-10-21T03:21:02.2453050Z 858 │ }); 2026-10-21T03:21:02.2453249Z 859 │ }, [route.params.path, route.params.fileSelectionId, route.params.focus, data.files, navigation]); 2026-10-21T03:21:02.2453432Z ·  ──────────────────────────────────────────────┬────────────────────────────────────────────── 2026-10-21T03:21:02.2453653Z · ╰── This dependency list is missing values used by the callback 2026-10-21T03:21:02.2453765Z 860 │ const appliedFilter = useRef(filter.hideTestFiles); 2026-10-21T03:21:02.2453821Z ╰──── 2026-10-21T03:21:02.2453995Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-21T03:21:02.2454314Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2454316Z 2026-10-21T03:21:02.2454520Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-21T03:21:02.2454688Z ╭─[apps/web/src/components/settings/ProviderSettingsPanel.logic.ts:4:8] 2026-10-21T03:21:02.2454769Z 3 │ AuthProvidersManageScope, 2026-10-21T03:21:02.2454843Z 4 │ type AuthSessionState, 2026-10-21T03:21:02.2454931Z ·  ────────┬─────── 2026-10-21T03:21:02.2455079Z · ╰── 'AuthSessionState' is imported here 2026-10-21T03:21:02.2455155Z 5 │ type EnvironmentId, 2026-10-21T03:21:02.2455210Z ╰──── 2026-10-21T03:21:02.2455312Z  help: Consider removing this import. 2026-10-21T03:21:02.2455314Z 2026-10-21T03:21:02.2455517Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-21T03:21:02.2455644Z ╭─[apps/web/src/contextMenuFallback.test.ts:38:9] 2026-10-21T03:21:02.2455712Z 37 │ get isConnected() { 2026-10-21T03:21:02.2455807Z 38 │ let current: FakeElement | null = this; 2026-10-21T03:21:02.2455885Z ·  ─────── 2026-10-21T03:21:02.2455961Z 39 │ while (current?.parent) { 2026-10-21T03:21:02.2456013Z ╰──── 2026-10-21T03:21:02.2456287Z  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-21T03:21:02.2456295Z 2026-10-21T03:21:02.2456581Z ⚠ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'. 2026-10-21T03:21:02.2456731Z ╭─[apps/web/src/components/preview/PreviewPanelShell.tsx:61:9] 2026-10-21T03:21:02.2456786Z 60 │ ) { 2026-10-21T03:21:02.2456959Z 61 │ const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded"; 2026-10-21T03:21:02.2501396Z ·  ──────┬────── 2026-10-21T03:21:02.2501761Z · ╰── 'useDragRegion' is declared here 2026-10-21T03:21:02.2501865Z 62 │ const isInline = props.mode === "inline"; 2026-10-21T03:21:02.2501925Z ╰──── 2026-10-21T03:21:02.2502040Z  help: Consider removing this declaration. 2026-10-21T03:21:02.2502044Z 2026-10-21T03:21:02.2502476Z ⚠ eslint(no-unused-vars): Identifier 'resolvePathLinkTarget' is imported but never used. 2026-10-21T03:21:02.2502667Z ╭─[apps/web/src/components/ChatMarkdown.tsx:6:3] 2026-10-21T03:21:02.2502739Z 5 │ fileLinkLabel, 2026-10-21T03:21:02.2502812Z 6 │ resolvePathLinkTarget, 2026-10-21T03:21:02.2502901Z ·  ──────────┬────────── 2026-10-21T03:21:02.2503055Z · ╰── 'resolvePathLinkTarget' is imported here 2026-10-21T03:21:02.2503129Z 7 │ splitFilePathPosition, 2026-10-21T03:21:02.2503184Z ╰──── 2026-10-21T03:21:02.2503283Z  help: Consider removing this import. 2026-10-21T03:21:02.2503289Z 2026-10-21T03:21:02.2503744Z ⚠ 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-21T03:21:02.2503883Z ╭─[apps/server/src/assets/AssetAccess.test.ts:963:32] 2026-10-21T03:21:02.2504023Z 962 │ expect(error._tag).toBe("AssetGitHubMediaUrlValidationError"); 2026-10-21T03:21:02.2504211Z 963 │ const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(AssetAccessError))(error); 2026-10-21T03:21:02.2504323Z ·  ─────────────────── 2026-10-21T03:21:02.2504418Z 964 │ expect(encoded).not.toContain(url); 2026-10-21T03:21:02.2504472Z ╰──── 2026-10-21T03:21:02.2504475Z 2026-10-21T03:21:02.2504684Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-21T03:21:02.2504855Z ╭─[apps/server/src/sourceControl/SourceControlProviderRegistry.ts:15:13] 2026-10-21T03:21:02.2504940Z 14 │ } from "@t3tools/contracts"; 2026-10-21T03:21:02.2505037Z 15 │ import type {} from "@t3tools/contracts"; 2026-10-21T03:21:02.2505111Z ·  ── 2026-10-21T03:21:02.2505289Z 16 │ import { detectSourceControlProviderFromRemoteUrl } from "@t3tools/shared/sourceControl"; 2026-10-21T03:21:02.2505344Z ╰──── 2026-10-21T03:21:02.2505428Z  help: Remove empty braces 2026-10-21T03:21:02.2505431Z 2026-10-21T03:21:02.2505691Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.2505849Z ╭─[apps/mobile/src/features/terminal/terminalLaunchContext.ts:117:5] 2026-10-21T03:21:02.2506018Z 112 │ const [entry, setEntry] = useState(() => ({ key: input.targetKey, location: candidate })); 2026-10-21T03:21:02.2506087Z 113 │ useEffect(() => { 2026-10-21T03:21:02.2506166Z ·  ────┬──── 2026-10-21T03:21:02.2506301Z · ╰── This is the containing effect 2026-10-21T03:21:02.2506464Z 114 │ if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) { 2026-10-21T03:21:02.2506529Z 115 │ return; 2026-10-21T03:21:02.2506587Z 116 │ } 2026-10-21T03:21:02.2506705Z 117 │ setEntry({ key: input.targetKey, location: candidate }); 2026-10-21T03:21:02.2506776Z ·  ────┬─── 2026-10-21T03:21:02.2506946Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2507069Z 118 │ }, [candidate, entry.key, entry.location, input.targetKey]); 2026-10-21T03:21:02.2507124Z ╰──── 2026-10-21T03:21:02.2507780Z  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-21T03:21:02.2508147Z  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-21T03:21:02.2508150Z 2026-10-21T03:21:02.2508347Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-21T03:21:02.2508507Z ╭─[apps/mobile/src/features/terminal/TerminalContextSheet.tsx:72:15] 2026-10-21T03:21:02.2508576Z 71 │ 2026-10-21T03:21:02.2509471Z 493 │ {props.children(close)} 2026-10-21T03:21:02.2509570Z ·  ──┬── 2026-10-21T03:21:02.2509729Z · ╰── Cannot access ref value during render 2026-10-21T03:21:02.2509810Z 494 │ 2026-10-21T03:21:02.2509862Z ╰──── 2026-10-21T03:21:02.2510337Z  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-21T03:21:02.2510633Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2510635Z 2026-10-21T03:21:02.2510897Z ⚠ eslint(no-unused-vars): Identifier 'Fiber' is imported but never used. 2026-10-21T03:21:02.2510989Z ╭─[apps/server/src/ws.ts:9:13] 2026-10-21T03:21:02.2511079Z  8 │ import * as Effect from "effect/Effect"; 2026-10-21T03:21:02.2511166Z  9 │ import * as Fiber from "effect/Fiber"; 2026-10-21T03:21:02.2511243Z ·  ──┬── 2026-10-21T03:21:02.2511423Z · ╰── 'Fiber' is imported here 2026-10-21T03:21:02.2511553Z 10 │ import * as FileSystem from "effect/FileSystem"; 2026-10-21T03:21:02.2511607Z ╰──── 2026-10-21T03:21:02.2511706Z  help: Consider removing this import. 2026-10-21T03:21:02.2511708Z 2026-10-21T03:21:02.2511903Z ⚠ eslint(no-unused-vars): Identifier 'Schedule' is imported but never used. 2026-10-21T03:21:02.2511996Z ╭─[apps/server/src/ws.ts:16:13] 2026-10-21T03:21:02.2512079Z 15 │ import * as Ref from "effect/Ref"; 2026-10-21T03:21:02.2512170Z 16 │ import * as Schedule from "effect/Schedule"; 2026-10-21T03:21:02.2512246Z ·  ────┬─── 2026-10-21T03:21:02.2512380Z · ╰── 'Schedule' is imported here 2026-10-21T03:21:02.2512474Z 17 │ import * as Schema from "effect/Schema"; 2026-10-21T03:21:02.2512529Z ╰──── 2026-10-21T03:21:02.2512624Z  help: Consider removing this import. 2026-10-21T03:21:02.2512627Z 2026-10-21T03:21:02.2512923Z ⚠ eslint(no-unused-vars): Variable 'projectSetupScriptRunner' is declared but never used. Unused variables should start with a '_'. 2026-10-21T03:21:02.2513025Z ╭─[apps/server/src/ws.ts:1250:13] 2026-10-21T03:21:02.2513182Z 1249 │ const usageLimitSources = yield* UsageLimitSources.UsageLimitSources; 2026-10-21T03:21:02.2513380Z 1250 │ const projectSetupScriptRunner = yield* ProjectSetupScriptRunner.ProjectSetupScriptRunner; 2026-10-21T03:21:02.2513484Z ·  ────────────┬─────────── 2026-10-21T03:21:02.2513653Z · ╰── 'projectSetupScriptRunner' is declared here 2026-10-21T03:21:02.2513830Z 1251 │ const worktreeSetupTracker = yield* WorktreeSetupTracker.WorktreeSetupTracker; 2026-10-21T03:21:02.2513887Z ╰──── 2026-10-21T03:21:02.2513990Z  help: Consider removing this declaration. 2026-10-21T03:21:02.2513992Z 2026-10-21T03:21:02.2514219Z ⚠ eslint(no-unused-vars): Function 'resolveThreadWorkspaceCwd' is declared but never used. 2026-10-21T03:21:02.2514336Z ╭─[apps/server/src/checkpointing/Utils.ts:12:10] 2026-10-21T03:21:02.2514392Z 11 │ 2026-10-21T03:21:02.2514486Z 12 │ function resolveThreadWorkspaceCwd(input: { 2026-10-21T03:21:02.2514588Z ·  ────────────┬──────────── 2026-10-21T03:21:02.2514754Z · ╰── 'resolveThreadWorkspaceCwd' is declared here 2026-10-21T03:21:02.2514824Z 13 │ readonly thread: { 2026-10-21T03:21:02.2514882Z ╰──── 2026-10-21T03:21:02.2514988Z  help: Consider removing this declaration. 2026-10-21T03:21:02.2514991Z 2026-10-21T03:21:02.2515246Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.2515416Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:118:7] 2026-10-21T03:21:02.2515476Z 113 │ 2026-10-21T03:21:02.2515544Z 114 │ useEffect(() => { 2026-10-21T03:21:02.2515618Z ·  ────┬──── 2026-10-21T03:21:02.2515749Z · ╰── This is the containing effect 2026-10-21T03:21:02.2515832Z 115 │ if (orientationSettled) return; 2026-10-21T03:21:02.2515947Z 116 │ const orientation = getNativeShowcaseOrientation(); 2026-10-21T03:21:02.2516024Z 117 │ if (orientation === null) { 2026-10-21T03:21:02.2516163Z 118 │ setOrientationSettled(true); 2026-10-21T03:21:02.2516286Z ·  ──────────┬────────── 2026-10-21T03:21:02.2516459Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2516524Z 119 │ return; 2026-10-21T03:21:02.2516578Z ╰──── 2026-10-21T03:21:02.2517173Z  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-21T03:21:02.2517496Z  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-21T03:21:02.2517504Z 2026-10-21T03:21:02.2517770Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.2518016Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:317:7] 2026-10-21T03:21:02.2518072Z 305 │ 2026-10-21T03:21:02.2518136Z 306 │ useEffect(() => { 2026-10-21T03:21:02.2518209Z ·  ────┬──── 2026-10-21T03:21:02.2518339Z · ╰── This is the containing effect 2026-10-21T03:21:02.2518399Z 307 │ if ( 2026-10-21T03:21:02.2518465Z 308 │ scene === null || 2026-10-21T03:21:02.2518546Z 309 │ requestedScene === null || 2026-10-21T03:21:02.2518626Z 310 │ scene !== requestedScene || 2026-10-21T03:21:02.2518695Z 311 │ !hasFixture || 2026-10-21T03:21:02.2518773Z 312 │ !orientationSettled || 2026-10-21T03:21:02.2518846Z 313 │ !themeApplied || 2026-10-21T03:21:02.2518968Z 314 │ (scene === "agent-activity" && !agentActivityStaged) || 2026-10-21T03:21:02.2519106Z 315 │ !isShowcaseNativeContentReady({ scene, themeId, renderSignal }) 2026-10-21T03:21:02.2519162Z 316 │ ) { 2026-10-21T03:21:02.2519235Z 317 │ setReadyScene(null); 2026-10-21T03:21:02.2519316Z ·  ──────┬────── 2026-10-21T03:21:02.2519482Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2519547Z 318 │ return; 2026-10-21T03:21:02.2519600Z ╰──── 2026-10-21T03:21:02.2520196Z  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-21T03:21:02.2520516Z  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-21T03:21:02.2520519Z 2026-10-21T03:21:02.2520857Z ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'. 2026-10-21T03:21:02.2521029Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:123:9] 2026-10-21T03:21:02.2521101Z 122 │ let cancelled = false; 2026-10-21T03:21:02.2521193Z 123 │ let lastOutcome: string | null = null; 2026-10-21T03:21:02.2521271Z ·  ─────┬───── 2026-10-21T03:21:02.2521480Z · ╰── 'lastOutcome' is declared here 2026-10-21T03:21:02.2521701Z 124 │ void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), { 2026-10-21T03:21:02.2521754Z ╰──── 2026-10-21T03:21:02.2521857Z  help: Consider removing this declaration. 2026-10-21T03:21:02.2521862Z 2026-10-21T03:21:02.2522054Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-21T03:21:02.2522226Z ╭─[apps/web/src/components/pullRequest/PullRequestChecksPopover.tsx:88:15] 2026-10-21T03:21:02.2522290Z 87 │
  • { 2026-10-21T03:21:02.2525441Z ╰──── 2026-10-21T03:21:02.2525727Z  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-21T03:21:02.2526023Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-21T03:21:02.2526025Z 2026-10-21T03:21:02.2526250Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-21T03:21:02.2526442Z ╭─[apps/server/src/terminal/Manager.test.ts:731:31] 2026-10-21T03:21:02.2526525Z 730 │ ); 2026-10-21T03:21:02.2526697Z 731 │ const snapshot = events.filter((event) => event.type === "snapshot").at(-1)?.snapshot; 2026-10-21T03:21:02.2526796Z ·  ────── 2026-10-21T03:21:02.2526913Z 732 │ expect(snapshot?.history).toBe("aa😀\rEND"); 2026-10-21T03:21:02.2526964Z ╰──── 2026-10-21T03:21:02.2527135Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-21T03:21:02.2527138Z 2026-10-21T03:21:02.2527285Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2527403Z ╭─[apps/mobile/src/native/StackHeader.tsx:186:9] 2026-10-21T03:21:02.2527468Z 185 │ "options", 2026-10-21T03:21:02.2527564Z 186 │ latestOptionFunctionsRef.current, 2026-10-21T03:21:02.2527679Z ·  ────────────────┬─────────────── 2026-10-21T03:21:02.2527874Z · ╰── Passing a ref to a function may read its value during render 2026-10-21T03:21:02.2527968Z 187 │ optionFunctionWrappersRef.current, 2026-10-21T03:21:02.2528023Z ╰──── 2026-10-21T03:21:02.2528493Z  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-21T03:21:02.2528785Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2528788Z 2026-10-21T03:21:02.2528937Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2529054Z ╭─[apps/mobile/src/native/StackHeader.tsx:187:9] 2026-10-21T03:21:02.2529148Z 186 │ latestOptionFunctionsRef.current, 2026-10-21T03:21:02.2529242Z 187 │ optionFunctionWrappersRef.current, 2026-10-21T03:21:02.2529351Z ·  ────────────────┬──────────────── 2026-10-21T03:21:02.2529537Z · ╰── Passing a ref to a function may read its value during render 2026-10-21T03:21:02.2529630Z 188 │ ) as NativeStackNavigationOptions) 2026-10-21T03:21:02.2529683Z ╰──── 2026-10-21T03:21:02.2530144Z  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-21T03:21:02.2530436Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2530441Z 2026-10-21T03:21:02.2530606Z ⚠ eslint(no-empty-pattern): Empty array binding pattern 2026-10-21T03:21:02.2530832Z ╭─[apps/server/src/pullRequest/PullRequestService.test.ts:1429:12] 2026-10-21T03:21:02.2530906Z 1428 │ 2026-10-21T03:21:02.2530973Z 1429 │ for (const [] of [ 2026-10-21T03:21:02.2531050Z ·  ── 2026-10-21T03:21:02.2531124Z 1430 │ ["github", "github.com"], 2026-10-21T03:21:02.2531177Z ╰──── 2026-10-21T03:21:02.2531451Z  help: Passing non-iterable values (null, undefined, numbers, booleans, etc.) will result in a runtime error because these values are not iterable. 2026-10-21T03:21:02.2531457Z 2026-10-21T03:21:02.2531769Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.2531966Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:643:5] 2026-10-21T03:21:02.2532022Z 638 │ 2026-10-21T03:21:02.2532089Z 639 │ useEffect(() => { 2026-10-21T03:21:02.2532160Z ·  ────┬──── 2026-10-21T03:21:02.2532290Z · ╰── This is the containing effect 2026-10-21T03:21:02.2532402Z 640 │ if (pendingLaunchEntry.key === launchTargetKey) { 2026-10-21T03:21:02.2532464Z 641 │ return; 2026-10-21T03:21:02.2532522Z 642 │ } 2026-10-21T03:21:02.2532601Z 643 │ setPendingLaunchEntry({ 2026-10-21T03:21:02.2532691Z ·  ──────────┬────────── 2026-10-21T03:21:02.2532866Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2532945Z 644 │ key: launchTargetKey, 2026-10-21T03:21:02.2533000Z ╰──── 2026-10-21T03:21:02.2533588Z  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-21T03:21:02.2533912Z  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-21T03:21:02.2533915Z 2026-10-21T03:21:02.2534171Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.2534341Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5] 2026-10-21T03:21:02.2534397Z 648 │ 2026-10-21T03:21:02.2534464Z 649 │ useEffect(() => { 2026-10-21T03:21:02.2534534Z ·  ────┬──── 2026-10-21T03:21:02.2534664Z · ╰── This is the containing effect 2026-10-21T03:21:02.2534781Z 650 │ if (initialAttachGridEntry.key === launchTargetKey) { 2026-10-21T03:21:02.2534843Z 651 │ return; 2026-10-21T03:21:02.2534898Z 652 │ } 2026-10-21T03:21:02.2534982Z 653 │ setInitialAttachGridEntry({ 2026-10-21T03:21:02.2535080Z ·  ────────────┬──────────── 2026-10-21T03:21:02.2535252Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2535379Z 654 │ key: launchTargetKey, 2026-10-21T03:21:02.2535462Z ╰──── 2026-10-21T03:21:02.2536053Z  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-21T03:21:02.2536373Z  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-21T03:21:02.2536375Z 2026-10-21T03:21:02.2536628Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.2536792Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7] 2026-10-21T03:21:02.2536850Z 743 │ 2026-10-21T03:21:02.2536919Z 744 │ useEffect(() => { 2026-10-21T03:21:02.2536992Z ·  ────┬──── 2026-10-21T03:21:02.2537117Z · ╰── This is the containing effect 2026-10-21T03:21:02.2537221Z 745 │ if (!routeEnvironmentId || !routeThreadId) { 2026-10-21T03:21:02.2537293Z 746 │ setLastGridSize({ 2026-10-21T03:21:02.2537376Z ·  ───────┬─────── 2026-10-21T03:21:02.2537542Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2537626Z 747 │ cols: DEFAULT_TERMINAL_COLS, 2026-10-21T03:21:02.2537679Z ╰──── 2026-10-21T03:21:02.2538277Z  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-21T03:21:02.2538600Z  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-21T03:21:02.2538603Z 2026-10-21T03:21:02.2538744Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2538915Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24] 2026-10-21T03:21:02.2538972Z 792 │ } 2026-10-21T03:21:02.2539080Z 793 │ const pasteSession = pasteSessionRef.current; 2026-10-21T03:21:02.2539190Z ·  ───────────┬─────────── 2026-10-21T03:21:02.2539360Z · ╰── Cannot access ref value during render 2026-10-21T03:21:02.2539418Z 794 │ 2026-10-21T03:21:02.2539472Z ╰──── 2026-10-21T03:21:02.2539932Z  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-21T03:21:02.2540222Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2540224Z 2026-10-21T03:21:02.2540368Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2540538Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24] 2026-10-21T03:21:02.2540594Z 792 │ } 2026-10-21T03:21:02.2540789Z 793 │ const pasteSession = pasteSessionRef.current; 2026-10-21T03:21:02.2540940Z ·  ───────────┬─────────── 2026-10-21T03:21:02.2541101Z · ╰── Cannot access ref value during render 2026-10-21T03:21:02.2541156Z 794 │ 2026-10-21T03:21:02.2541207Z ╰──── 2026-10-21T03:21:02.2541666Z  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-21T03:21:02.2541955Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2541957Z 2026-10-21T03:21:02.2542162Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-21T03:21:02.2542329Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24] 2026-10-21T03:21:02.2542387Z 537 │ }); 2026-10-21T03:21:02.2542515Z 538 │ }, [terminal.buffer, terminal.buffer.length, terminalKey]); 2026-10-21T03:21:02.2542622Z ·  ───────────┬────────── 2026-10-21T03:21:02.2542859Z · ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead 2026-10-21T03:21:02.2543021Z 539 │ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null; 2026-10-21T03:21:02.2543074Z ╰──── 2026-10-21T03:21:02.2543374Z  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-21T03:21:02.2543690Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2543693Z 2026-10-21T03:21:02.2543891Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-21T03:21:02.2544059Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7] 2026-10-21T03:21:02.2544166Z 708 │ sentInitialInputKeyRef.current = null; 2026-10-21T03:21:02.2544237Z 709 │ }, [terminalKey]); 2026-10-21T03:21:02.2544313Z ·  ─────┬───── 2026-10-21T03:21:02.2544456Z · ╰── Unnecessary dependency `terminalKey` 2026-10-21T03:21:02.2544511Z 710 │ 2026-10-21T03:21:02.2544564Z ╰──── 2026-10-21T03:21:02.2544859Z  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-21T03:21:02.2545171Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2545174Z 2026-10-21T03:21:02.2545372Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-21T03:21:02.2545540Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52] 2026-10-21T03:21:02.2545598Z 799 │ }; 2026-10-21T03:21:02.2545773Z 800 │ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]); 2026-10-21T03:21:02.2545997Z ·  ────────────┬──────────── ─────┬───── 2026-10-21T03:21:02.2546256Z · │ ╰── Unnecessary dependency `terminalKey` 2026-10-21T03:21:02.2546468Z · ╰── Unnecessary dependency `terminal.lifecycleVersion` 2026-10-21T03:21:02.2546520Z 801 │ 2026-10-21T03:21:02.2546573Z ╰──── 2026-10-21T03:21:02.2546865Z  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-21T03:21:02.2547174Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2547183Z 2026-10-21T03:21:02.2547382Z ⚠ react(memo-dependencies): Found missing/extra memoization dependencies 2026-10-21T03:21:02.2547533Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:140:9] 2026-10-21T03:21:02.2547619Z 139 │ if (action.id !== undefined) { 2026-10-21T03:21:02.2547699Z 140 │ props.onPressAction?.({ 2026-10-21T03:21:02.2547774Z ·  ──┬── 2026-10-21T03:21:02.2547903Z · ╰── Missing dependency `props` 2026-10-21T03:21:02.2548002Z 141 │ nativeEvent: { event: action.id }, 2026-10-21T03:21:02.2548152Z 142 │ } as Parameters>[0]); 2026-10-21T03:21:02.2548210Z 143 │ } 2026-10-21T03:21:02.2548265Z 144 │ }, 2026-10-21T03:21:02.2548356Z 145 │ [close, props.onPressAction], 2026-10-21T03:21:02.2548453Z ·  ─────────┬───────── 2026-10-21T03:21:02.2548671Z · ╰── Overly precise dependency `props.onPressAction`, use `props` instead 2026-10-21T03:21:02.2548727Z 146 │ ); 2026-10-21T03:21:02.2548781Z ╰──── 2026-10-21T03:21:02.2549274Z  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-21T03:21:02.2549596Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2549598Z 2026-10-21T03:21:02.2549749Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2549908Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:152:27] 2026-10-21T03:21:02.2550091Z 151 │ 2026-10-21T03:21:02.2550174Z 152 │ {props.children(open)} 2026-10-21T03:21:02.2550267Z ·  ──┬─ 2026-10-21T03:21:02.2550426Z · ╰── Cannot access ref value during render 2026-10-21T03:21:02.2550494Z 153 │ 2026-10-21T03:21:02.2550548Z ╰──── 2026-10-21T03:21:02.2551136Z  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-21T03:21:02.2551459Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2551462Z 2026-10-21T03:21:02.2551652Z ⚠ react(static-components): Cannot create components during render 2026-10-21T03:21:02.2551816Z ╭─[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10] 2026-10-21T03:21:02.2551908Z 196 │ const { onInput, onResize } = props; 2026-10-21T03:21:02.2552059Z 197 │ const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView(); 2026-10-21T03:21:02.2552192Z ·  ────────────────┬─────────────── 2026-10-21T03:21:02.2552383Z · ╰── The component is created during render here 2026-10-21T03:21:02.2552520Z 198 │ const hasNativeSurface = Boolean(NativeTerminalSurfaceView); 2026-10-21T03:21:02.2552581Z 199 │ 2026-10-21T03:21:02.2552648Z 200 │ useEffect(() => { 2026-10-21T03:21:02.2552740Z 201 │ terminalDebugLog("native:surface", { 2026-10-21T03:21:02.2552830Z 202 │ terminalKey: props.terminalKey, 2026-10-21T03:21:02.2552908Z 203 │ native: hasNativeSurface, 2026-10-21T03:21:02.2553047Z 204 │ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(), 2026-10-21T03:21:02.2553135Z 205 │ bufferLen: props.buffer.length, 2026-10-21T03:21:02.2553219Z 206 │ isRunning: props.isRunning, 2026-10-21T03:21:02.2553277Z 207 │ }); 2026-10-21T03:21:02.2553439Z 208 │ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]); 2026-10-21T03:21:02.2553532Z 209 │ const handleNativeInput = useCallback( 2026-10-21T03:21:02.2553657Z 210 │ (event: NativeSyntheticEvent) => { 2026-10-21T03:21:02.2553757Z 211 │ if (!props.isRunning || props.readOnly) { 2026-10-21T03:21:02.2553824Z 212 │ return; 2026-10-21T03:21:02.2553883Z 213 │ } 2026-10-21T03:21:02.2553976Z 214 │ terminalDebugLog("native:onInput", { 2026-10-21T03:21:02.2554129Z 215 │ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)), 2026-10-21T03:21:02.2554191Z 216 │ }); 2026-10-21T03:21:02.2554281Z 217 │ onInput(event.nativeEvent.data); 2026-10-21T03:21:02.2554339Z 218 │ }, 2026-10-21T03:21:02.2554438Z 219 │ [onInput, props.isRunning, props.readOnly], 2026-10-21T03:21:02.2554497Z 220 │ ); 2026-10-21T03:21:02.2554589Z 221 │ const handleNativeResize = useCallback( 2026-10-21T03:21:02.2554709Z 222 │ (event: NativeSyntheticEvent) => { 2026-10-21T03:21:02.2554780Z 223 │ onResize({ 2026-10-21T03:21:02.2554869Z 224 │ cols: event.nativeEvent.cols, 2026-10-21T03:21:02.2554956Z 225 │ rows: event.nativeEvent.rows, 2026-10-21T03:21:02.2555018Z 226 │ }); 2026-10-21T03:21:02.2555073Z 227 │ }, 2026-10-21T03:21:02.2555138Z 228 │ [onResize], 2026-10-21T03:21:02.2555194Z 229 │ ); 2026-10-21T03:21:02.2555248Z 230 │ 2026-10-21T03:21:02.2555335Z 231 │ if (NativeTerminalSurfaceView) { 2026-10-21T03:21:02.2555399Z 232 │ return ( 2026-10-21T03:21:02.2555480Z 233 │ 2026-10-21T03:21:02.2555563Z 234 │ { 2026-10-21T03:21:02.2558357Z 165 │ const record = 2026-10-21T03:21:02.2558439Z 166 │ token.type === "context" 2026-10-21T03:21:02.2558613Z 167 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-21T03:21:02.2558687Z 168 │ : undefined; 2026-10-21T03:21:02.2558797Z 169 │ const presentation = contextChipPresentation( 2026-10-21T03:21:02.2558919Z 170 │ token.type === "context" ? token.kind : token.type, 2026-10-21T03:21:02.2558986Z 171 │ record, 2026-10-21T03:21:02.2559049Z 172 │ ); 2026-10-21T03:21:02.2559134Z 173 │ const icon = contextChipIcon( 2026-10-21T03:21:02.2559205Z 174 │ presentation, 2026-10-21T03:21:02.2559352Z 175 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-21T03:21:02.2559414Z 176 │ ); 2026-10-21T03:21:02.2559476Z 177 │ return { 2026-10-21T03:21:02.2559551Z 178 │ type: token.type, 2026-10-21T03:21:02.2559631Z 179 │ source: token.source, 2026-10-21T03:21:02.2559708Z 180 │ start: token.start, 2026-10-21T03:21:02.2559844Z 181 │ end: token.end, 2026-10-21T03:21:02.2559967Z 182 │ accent: presentation.accent, 2026-10-21T03:21:02.2560033Z 183 │ label: 2026-10-21T03:21:02.2560111Z 184 │ token.type === "skill" 2026-10-21T03:21:02.2560224Z 185 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-21T03:21:02.2560310Z 186 │ : token.type === "context" 2026-10-21T03:21:02.2560553Z 187 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-21T03:21:02.2560642Z 188 │ : basename(token.value), 2026-10-21T03:21:02.2560866Z 189 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-21T03:21:02.2560968Z 190 │ iconUri: contextChipIconUri(icon), 2026-10-21T03:21:02.2561066Z 191 │ tintsIcon: icon.kind === "chip", 2026-10-21T03:21:02.2561128Z 192 │ }; 2026-10-21T03:21:02.2561191Z 193 │ }), 2026-10-21T03:21:02.2561249Z 194 │ ); 2026-10-21T03:21:02.2561354Z 195 │ }, [props.value, props.context, skillLabels]); 2026-10-21T03:21:02.2561472Z ·  ────────────────────┬──────────────────── 2026-10-21T03:21:02.2561675Z · ╰── This dependency list is missing values used by the callback 2026-10-21T03:21:02.2561819Z 196 │ // Every render resolves against the snapshot history, so a render whose 2026-10-21T03:21:02.2561876Z ╰──── 2026-10-21T03:21:02.2562086Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-21T03:21:02.2562415Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2562422Z 2026-10-21T03:21:02.2562613Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-21T03:21:02.2562761Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:257:5] 2026-10-21T03:21:02.2562896Z 249 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-21T03:21:02.2563003Z 250 │ nativeEventSnapshotsRef.current.push({ 2026-10-21T03:21:02.2563103Z ·  ───────────┬─────────── 2026-10-21T03:21:02.2563574Z · ╰── 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-21T03:21:02.2563678Z 251 │ eventCount: acknowledgedEventCount, 2026-10-21T03:21:02.2563745Z 252 │ value, 2026-10-21T03:21:02.2563828Z 253 │ selection: nextSelection, 2026-10-21T03:21:02.2563891Z 254 │ }); 2026-10-21T03:21:02.2563980Z 255 │ return acknowledgedEventCount; 2026-10-21T03:21:02.2564037Z 256 │ }, 2026-10-21T03:21:02.2564097Z 257 │ [], 2026-10-21T03:21:02.2564170Z ·  ─┬ 2026-10-21T03:21:02.2564632Z · ╰── This dependency list is missing values used by the callback 2026-10-21T03:21:02.2564688Z 258 │ ); 2026-10-21T03:21:02.2564746Z ╰──── 2026-10-21T03:21:02.2564957Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-21T03:21:02.2565336Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2565369Z 2026-10-21T03:21:02.2565571Z ⚠ eslint(no-unused-vars): Identifier 'Image' is imported but never used. 2026-10-21T03:21:02.2565717Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:17:10] 2026-10-21T03:21:02.2565861Z 16 │ import type { NativeSyntheticEvent, ViewProps } from "react-native"; 2026-10-21T03:21:02.2565982Z 17 │ import { Image, Platform, StyleSheet } from "react-native"; 2026-10-21T03:21:02.2566059Z ·  ──┬── 2026-10-21T03:21:02.2566186Z · ╰── 'Image' is imported here 2026-10-21T03:21:02.2566244Z 18 │ 2026-10-21T03:21:02.2566302Z ╰──── 2026-10-21T03:21:02.2566403Z  help: Consider removing this import. 2026-10-21T03:21:02.2566408Z 2026-10-21T03:21:02.2566562Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2566716Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:160:29] 2026-10-21T03:21:02.2566843Z 159 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-21T03:21:02.2566962Z 160 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-21T03:21:02.2567081Z ·  ─────────────┬──────────── 2026-10-21T03:21:02.2567254Z · ╰── Cannot access ref value during render 2026-10-21T03:21:02.2567314Z 161 │ }); 2026-10-21T03:21:02.2567370Z ╰──── 2026-10-21T03:21:02.2567865Z  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-21T03:21:02.2568172Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2568174Z 2026-10-21T03:21:02.2568324Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2568473Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:160:29] 2026-10-21T03:21:02.2568600Z 159 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-21T03:21:02.2568714Z 160 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-21T03:21:02.2568836Z ·  ─────────────┬──────────── 2026-10-21T03:21:02.2569052Z · ╰── Passing a ref to a function may read its value during render 2026-10-21T03:21:02.2569115Z 161 │ }); 2026-10-21T03:21:02.2569168Z ╰──── 2026-10-21T03:21:02.2569648Z  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-21T03:21:02.2569947Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2569949Z 2026-10-21T03:21:02.2570099Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2570246Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:23] 2026-10-21T03:21:02.2570303Z 161 │ }); 2026-10-21T03:21:02.2570445Z 162 │ confirmedTokensRef.current = tokens; 2026-10-21T03:21:02.2570606Z ·  ─────────┬────────────┬─── 2026-10-21T03:21:02.2570863Z · │ ╰── Cannot update ref value during render 2026-10-21T03:21:02.2570983Z · ╰── This value is a ref 2026-10-21T03:21:02.2571059Z 163 │ return JSON.stringify( 2026-10-21T03:21:02.2571116Z ╰──── 2026-10-21T03:21:02.2571589Z  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-21T03:21:02.2571890Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2571895Z 2026-10-21T03:21:02.2572044Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2572191Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:204:5] 2026-10-21T03:21:02.2572267Z 203 │ mostRecentEventCount, 2026-10-21T03:21:02.2572356Z 204 │ nativeEventSnapshotsRef.current, 2026-10-21T03:21:02.2572465Z ·  ───────────────┬─────────────── 2026-10-21T03:21:02.2572658Z · ╰── Passing a ref to a function may read its value during render 2026-10-21T03:21:02.2572718Z 205 │ ); 2026-10-21T03:21:02.2572771Z ╰──── 2026-10-21T03:21:02.2573250Z  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-21T03:21:02.2573549Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2573551Z 2026-10-21T03:21:02.2573699Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2573845Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:210:5] 2026-10-21T03:21:02.2573916Z 209 │ mostRecentEventCount, 2026-10-21T03:21:02.2574008Z 210 │ nativeEventSnapshotsRef.current, 2026-10-21T03:21:02.2574117Z ·  ───────────────┬─────────────── 2026-10-21T03:21:02.2574307Z · ╰── Passing a ref to a function may read its value during render 2026-10-21T03:21:02.2574367Z 211 │ ); 2026-10-21T03:21:02.2574425Z ╰──── 2026-10-21T03:21:02.2574896Z  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-21T03:21:02.2575194Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2575196Z 2026-10-21T03:21:02.2575410Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-21T03:21:02.2575553Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:227:6] 2026-10-21T03:21:02.2575722Z 223 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-21T03:21:02.2575882Z 224 │ nativeEventSnapshotsRef.current, 2026-10-21T03:21:02.2576008Z ·  ───────────┬─────────── 2026-10-21T03:21:02.2576472Z · ╰── 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-21T03:21:02.2576552Z 225 │ mostRecentEventCount, 2026-10-21T03:21:02.2576614Z 226 │ ); 2026-10-21T03:21:02.2576744Z 227 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-21T03:21:02.2576877Z ·  ──────────────────────────┬────────────────────────── 2026-10-21T03:21:02.2577081Z · ╰── This dependency list is missing values used by the callback 2026-10-21T03:21:02.2577175Z 228 │ const assumedValue = props.value; 2026-10-21T03:21:02.2577234Z ╰──── 2026-10-21T03:21:02.2577405Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-21T03:21:02.2577728Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2577731Z 2026-10-21T03:21:02.2577951Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-21T03:21:02.2578097Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:235:7] 2026-10-21T03:21:02.2578246Z 234 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-21T03:21:02.2578336Z 235 │ nativeEventSnapshotsRef.current, 2026-10-21T03:21:02.2578431Z ·  ───────────┬─────────── 2026-10-21T03:21:02.2578898Z · ╰── 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-21T03:21:02.2578978Z 236 │ controlledEventCount, 2026-10-21T03:21:02.2579045Z 237 │ assumedValue, 2026-10-21T03:21:02.2579105Z 238 │ ); 2026-10-21T03:21:02.2579267Z 239 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-21T03:21:02.2579408Z ·  ───────────┬────────── 2026-10-21T03:21:02.2579618Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-21T03:21:02.2579760Z 240 │ const acceptNativeEvent = useCallback( 2026-10-21T03:21:02.2579848Z ╰──── 2026-10-21T03:21:02.2580283Z  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-21T03:21:02.2580605Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2580608Z 2026-10-21T03:21:02.2580871Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-21T03:21:02.2581006Z ╭─[apps/mobile/src/components/ComposerEditor.tsx:82:6] 2026-10-21T03:21:02.2581064Z 81 │ }, 2026-10-21T03:21:02.2581131Z 82 │ [draftKey], 2026-10-21T03:21:02.2581209Z ·  ────┬─── 2026-10-21T03:21:02.2581354Z · ╰── Unnecessary dependency `draftKey` 2026-10-21T03:21:02.2581412Z 83 │ ); 2026-10-21T03:21:02.2581466Z ╰──── 2026-10-21T03:21:02.2581764Z  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-21T03:21:02.2582080Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2582083Z 2026-10-21T03:21:02.2582349Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.2582485Z ╭─[apps/mobile/src/components/ProjectFavicon.tsx:158:5] 2026-10-21T03:21:02.2582684Z 153 │ const [activeFaviconRequest, setActiveFaviconRequest] = useState(null); 2026-10-21T03:21:02.2582758Z 154 │ useLayoutEffect(() => { 2026-10-21T03:21:02.2582841Z ·  ───────┬─────── 2026-10-21T03:21:02.2582978Z · ╰── This is the containing effect 2026-10-21T03:21:02.2583068Z 155 │ if (faviconRequest === null) return; 2026-10-21T03:21:02.2583123Z 156 │ 2026-10-21T03:21:02.2583260Z 157 │ const endRequest = beginProjectFaviconRequest(faviconRequest); 2026-10-21T03:21:02.2583360Z 158 │ setActiveFaviconRequest(faviconRequest); 2026-10-21T03:21:02.2583453Z ·  ───────────┬─────────── 2026-10-21T03:21:02.2583631Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2583705Z 159 │ return endRequest; 2026-10-21T03:21:02.2583768Z ╰──── 2026-10-21T03:21:02.2584383Z  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-21T03:21:02.2584711Z  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-21T03:21:02.2584713Z 2026-10-21T03:21:02.2584975Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.2585112Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:60:5] 2026-10-21T03:21:02.2585168Z 57 │ 2026-10-21T03:21:02.2585288Z 58 │ useEffect(() => { 2026-10-21T03:21:02.2585392Z ·  ────┬──── 2026-10-21T03:21:02.2585523Z · ╰── This is the containing effect 2026-10-21T03:21:02.2585620Z 59 │ const controller = new AbortController(); 2026-10-21T03:21:02.2585698Z 60 │ setLoadState("pending"); 2026-10-21T03:21:02.2585778Z ·  ──────┬───── 2026-10-21T03:21:02.2585949Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2586113Z 61 │ // A renewed signature is used on Retry, not as a reason to reset the native player. 2026-10-21T03:21:02.2586166Z ╰──── 2026-10-21T03:21:02.2586781Z  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-21T03:21:02.2587114Z  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-21T03:21:02.2587116Z 2026-10-21T03:21:02.2587323Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-21T03:21:02.2587462Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:71:7] 2026-10-21T03:21:02.2587547Z 70 │ return () => controller.abort(); 2026-10-21T03:21:02.2587647Z 71 │ }, [player, props.playRequested, attempt]); 2026-10-21T03:21:02.2587822Z ·  ───┬── ─────────┬───────── ───┬─── 2026-10-21T03:21:02.2588055Z · │ │ ╰── Unnecessary dependency `attempt` 2026-10-21T03:21:02.2588259Z · │ ╰── Unnecessary dependency `props.playRequested` 2026-10-21T03:21:02.2588396Z · ╰── Unnecessary dependency `player_0` 2026-10-21T03:21:02.2588456Z 72 │ 2026-10-21T03:21:02.2588512Z ╰──── 2026-10-21T03:21:02.2588814Z  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-21T03:21:02.2589128Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2589130Z 2026-10-21T03:21:02.2589399Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.2589553Z ╭─[apps/mobile/src/components/VideoPreviewModal.ios.tsx:63:55] 2026-10-21T03:21:02.2589616Z 61 │ }, []); 2026-10-21T03:21:02.2589682Z 62 │ useEffect(() => { 2026-10-21T03:21:02.2589759Z ·  ────┬──── 2026-10-21T03:21:02.2589887Z · ╰── This is the containing effect 2026-10-21T03:21:02.2590038Z 63 │ if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl); 2026-10-21T03:21:02.2590162Z ·  ───────┬────── 2026-10-21T03:21:02.2590421Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2590539Z 64 │ }, [playbackUrl, resolvedUrl]); 2026-10-21T03:21:02.2590594Z ╰──── 2026-10-21T03:21:02.2591279Z  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-21T03:21:02.2591604Z  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-21T03:21:02.2591610Z 2026-10-21T03:21:02.2591756Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2591879Z ╭─[apps/mobile/src/components/ui/Menu.tsx:54:36] 2026-10-21T03:21:02.2592065Z 53 │ const child = children as ReactElement>; 2026-10-21T03:21:02.2592245Z 54 │ ╭─▶ children = cloneElement(child, { 2026-10-21T03:21:02.2592350Z 55 │ │ onTouchStart: (event) => { 2026-10-21T03:21:02.2592512Z 56 │ │ // Reset for a new touch, not onPressIn, which also fires when a 2026-10-21T03:21:02.2592672Z 57 │ │ // finger moves out of the row and back during the same gesture. 2026-10-21T03:21:02.2592803Z 58 │ │ menuPress.current.isPreparing = false; 2026-10-21T03:21:02.2592972Z 59 │ │ menuPress.current.suppressPress = menuPress.current.isOpen; 2026-10-21T03:21:02.2593090Z 60 │ │ pendingPress.current = null; 2026-10-21T03:21:02.2593218Z 61 │ │ child.props.onTouchStart?.(event); 2026-10-21T03:21:02.2593302Z 62 │ │ }, 2026-10-21T03:21:02.2593404Z 63 │ │ onPress: (event) => { 2026-10-21T03:21:02.2593579Z 64 │ │ // Accessibility clicks have no touch identifier and must not inherit 2026-10-21T03:21:02.2593718Z 65 │ │ // cancellation from a previous physical gesture. 2026-10-21T03:21:02.2593887Z 66 │ │ const isTouch = typeof event.nativeEvent.identifier === "number"; 2026-10-21T03:21:02.2594076Z 67 │ │ if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) { 2026-10-21T03:21:02.2594167Z 68 │ │ return; 2026-10-21T03:21:02.2594248Z 69 │ │ } 2026-10-21T03:21:02.2594396Z 70 │ │ if (isTouch && menuPress.current.isPreparing) { 2026-10-21T03:21:02.2594568Z 71 │ │ // A release can arrive between native menu preparation and display. 2026-10-21T03:21:02.2594739Z 72 │ │ // Let UIKit's display/cancel callback decide this press's outcome. 2026-10-21T03:21:02.2594843Z 73 │ │ event.persist(); 2026-10-21T03:21:02.2595007Z 74 │ │ pendingPress.current = () => child.props.onPress?.(event); 2026-10-21T03:21:02.2595096Z 75 │ │ return; 2026-10-21T03:21:02.2595174Z 76 │ │ } 2026-10-21T03:21:02.2595293Z 77 │ │ child.props.onPress?.(event); 2026-10-21T03:21:02.2595372Z 78 │ │ }, 2026-10-21T03:21:02.2595561Z 79 │ ├─▶ }); 2026-10-21T03:21:02.2595828Z · ╰──── Passing a ref to a function may read its value during render 2026-10-21T03:21:02.2595936Z 80 │ menuProps.onMenuInteractionStart = () => { 2026-10-21T03:21:02.2595990Z ╰──── 2026-10-21T03:21:02.2596468Z  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-21T03:21:02.2596763Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2596768Z 2026-10-21T03:21:02.2596960Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-21T03:21:02.2597103Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:197:6] 2026-10-21T03:21:02.2597229Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-21T03:21:02.2597345Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-21T03:21:02.2597455Z ·  ─────────┬──────── 2026-10-21T03:21:02.2597977Z · ╰── 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-21T03:21:02.2598039Z 163 │ }); 2026-10-21T03:21:02.2598135Z 164 │ confirmedTokensRef.current = tokens; 2026-10-21T03:21:02.2598213Z 165 │ return JSON.stringify( 2026-10-21T03:21:02.2598387Z 166 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-21T03:21:02.2598460Z 167 │ const record = 2026-10-21T03:21:02.2598545Z 168 │ token.type === "context" 2026-10-21T03:21:02.2598712Z 169 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-21T03:21:02.2598783Z 170 │ : undefined; 2026-10-21T03:21:02.2598893Z 171 │ const presentation = contextChipPresentation( 2026-10-21T03:21:02.2599007Z 172 │ token.type === "context" ? token.kind : token.type, 2026-10-21T03:21:02.2599071Z 173 │ record, 2026-10-21T03:21:02.2599135Z 174 │ ); 2026-10-21T03:21:02.2599224Z 175 │ const icon = contextChipIcon( 2026-10-21T03:21:02.2599296Z 176 │ presentation, 2026-10-21T03:21:02.2599446Z 177 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-21T03:21:02.2599512Z 178 │ ); 2026-10-21T03:21:02.2599581Z 179 │ return { 2026-10-21T03:21:02.2599656Z 180 │ type: token.type, 2026-10-21T03:21:02.2599733Z 181 │ source: token.source, 2026-10-21T03:21:02.2599812Z 182 │ start: token.start, 2026-10-21T03:21:02.2599883Z 183 │ end: token.end, 2026-10-21T03:21:02.2599968Z 184 │ accent: presentation.accent, 2026-10-21T03:21:02.2600034Z 185 │ label: 2026-10-21T03:21:02.2600115Z 186 │ token.type === "skill" 2026-10-21T03:21:02.2600228Z 187 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-21T03:21:02.2600313Z 188 │ : token.type === "context" 2026-10-21T03:21:02.2600621Z 189 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-21T03:21:02.2600762Z 190 │ : basename(token.value), 2026-10-21T03:21:02.2600933Z 191 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-21T03:21:02.2601027Z 192 │ iconUri: contextChipIconUri(icon), 2026-10-21T03:21:02.2601119Z 193 │ tintsIcon: icon.kind === "chip", 2026-10-21T03:21:02.2601181Z 194 │ }; 2026-10-21T03:21:02.2601243Z 195 │ }), 2026-10-21T03:21:02.2601299Z 196 │ ); 2026-10-21T03:21:02.2601406Z 197 │ }, [props.value, props.context, skillLabels]); 2026-10-21T03:21:02.2601526Z ·  ────────────────────┬──────────────────── 2026-10-21T03:21:02.2601727Z · ╰── This dependency list is missing values used by the callback 2026-10-21T03:21:02.2601877Z 198 │ // Every render resolves against the snapshot history, so a render whose 2026-10-21T03:21:02.2601936Z ╰──── 2026-10-21T03:21:02.2602148Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-21T03:21:02.2602470Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2602472Z 2026-10-21T03:21:02.2602663Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-21T03:21:02.2602803Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:259:5] 2026-10-21T03:21:02.2602938Z 251 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-21T03:21:02.2603043Z 252 │ nativeEventSnapshotsRef.current.push({ 2026-10-21T03:21:02.2603143Z ·  ───────────┬─────────── 2026-10-21T03:21:02.2603610Z · ╰── 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-21T03:21:02.2603707Z 253 │ eventCount: acknowledgedEventCount, 2026-10-21T03:21:02.2603772Z 254 │ value, 2026-10-21T03:21:02.2603855Z 255 │ selection: nextSelection, 2026-10-21T03:21:02.2603913Z 256 │ }); 2026-10-21T03:21:02.2604002Z 257 │ return acknowledgedEventCount; 2026-10-21T03:21:02.2604060Z 258 │ }, 2026-10-21T03:21:02.2604120Z 259 │ [], 2026-10-21T03:21:02.2604189Z ·  ─┬ 2026-10-21T03:21:02.2604375Z · ╰── This dependency list is missing values used by the callback 2026-10-21T03:21:02.2604438Z 260 │ ); 2026-10-21T03:21:02.2604495Z ╰──── 2026-10-21T03:21:02.2604704Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-21T03:21:02.2605026Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2605028Z 2026-10-21T03:21:02.2605177Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2605322Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:162:29] 2026-10-21T03:21:02.2605445Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-21T03:21:02.2605562Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-21T03:21:02.2605737Z ·  ─────────────┬──────────── 2026-10-21T03:21:02.2605946Z · ╰── Cannot access ref value during render 2026-10-21T03:21:02.2606003Z 163 │ }); 2026-10-21T03:21:02.2606060Z ╰──── 2026-10-21T03:21:02.2606537Z  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-21T03:21:02.2606833Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2606836Z 2026-10-21T03:21:02.2606984Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2607126Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:162:29] 2026-10-21T03:21:02.2607252Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-21T03:21:02.2607366Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-21T03:21:02.2607487Z ·  ─────────────┬──────────── 2026-10-21T03:21:02.2607695Z · ╰── Passing a ref to a function may read its value during render 2026-10-21T03:21:02.2607756Z 163 │ }); 2026-10-21T03:21:02.2607810Z ╰──── 2026-10-21T03:21:02.2608286Z  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-21T03:21:02.2608588Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2608594Z 2026-10-21T03:21:02.2608741Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2608882Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:23] 2026-10-21T03:21:02.2608942Z 163 │ }); 2026-10-21T03:21:02.2609037Z 164 │ confirmedTokensRef.current = tokens; 2026-10-21T03:21:02.2609159Z ·  ─────────┬────────────┬─── 2026-10-21T03:21:02.2609355Z · │ ╰── Cannot update ref value during render 2026-10-21T03:21:02.2609477Z · ╰── This value is a ref 2026-10-21T03:21:02.2609617Z 165 │ return JSON.stringify( 2026-10-21T03:21:02.2609704Z ╰──── 2026-10-21T03:21:02.2610175Z  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-21T03:21:02.2610472Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2610474Z 2026-10-21T03:21:02.2610623Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2610809Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:206:5] 2026-10-21T03:21:02.2610911Z 205 │ mostRecentEventCount, 2026-10-21T03:21:02.2611005Z 206 │ nativeEventSnapshotsRef.current, 2026-10-21T03:21:02.2611119Z ·  ───────────────┬─────────────── 2026-10-21T03:21:02.2611312Z · ╰── Passing a ref to a function may read its value during render 2026-10-21T03:21:02.2611371Z 207 │ ); 2026-10-21T03:21:02.2611426Z ╰──── 2026-10-21T03:21:02.2611896Z  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-21T03:21:02.2612191Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2612194Z 2026-10-21T03:21:02.2612337Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2612480Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:212:5] 2026-10-21T03:21:02.2612558Z 211 │ mostRecentEventCount, 2026-10-21T03:21:02.2612647Z 212 │ nativeEventSnapshotsRef.current, 2026-10-21T03:21:02.2612749Z ·  ───────────────┬─────────────── 2026-10-21T03:21:02.2612937Z · ╰── Passing a ref to a function may read its value during render 2026-10-21T03:21:02.2612996Z 213 │ ); 2026-10-21T03:21:02.2613050Z ╰──── 2026-10-21T03:21:02.2613520Z  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-21T03:21:02.2613816Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2613822Z 2026-10-21T03:21:02.2614030Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-21T03:21:02.2614167Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:229:6] 2026-10-21T03:21:02.2614335Z 225 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-21T03:21:02.2614427Z 226 │ nativeEventSnapshotsRef.current, 2026-10-21T03:21:02.2614523Z ·  ───────────┬─────────── 2026-10-21T03:21:02.2614985Z · ╰── 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-21T03:21:02.2615118Z 227 │ mostRecentEventCount, 2026-10-21T03:21:02.2615213Z 228 │ ); 2026-10-21T03:21:02.2615337Z 229 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-21T03:21:02.2615472Z ·  ──────────────────────────┬────────────────────────── 2026-10-21T03:21:02.2615674Z · ╰── This dependency list is missing values used by the callback 2026-10-21T03:21:02.2615763Z 230 │ const assumedValue = props.value; 2026-10-21T03:21:02.2615815Z ╰──── 2026-10-21T03:21:02.2615988Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-21T03:21:02.2616307Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2616310Z 2026-10-21T03:21:02.2616534Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-21T03:21:02.2616672Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:237:7] 2026-10-21T03:21:02.2616820Z 236 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-21T03:21:02.2616913Z 237 │ nativeEventSnapshotsRef.current, 2026-10-21T03:21:02.2617007Z ·  ───────────┬─────────── 2026-10-21T03:21:02.2617470Z · ╰── 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-21T03:21:02.2617549Z 238 │ controlledEventCount, 2026-10-21T03:21:02.2617620Z 239 │ assumedValue, 2026-10-21T03:21:02.2617684Z 240 │ ); 2026-10-21T03:21:02.2617848Z 241 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-21T03:21:02.2617984Z ·  ───────────┬────────── 2026-10-21T03:21:02.2618199Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-21T03:21:02.2618291Z 242 │ const acceptNativeEvent = useCallback( 2026-10-21T03:21:02.2618347Z ╰──── 2026-10-21T03:21:02.2618778Z  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-21T03:21:02.2619101Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2619106Z 2026-10-21T03:21:02.2619277Z ⚠ eslint(no-control-regex): Unexpected control character 2026-10-21T03:21:02.2619475Z ╭─[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46] 2026-10-21T03:21:02.2619622Z 219 │ 2026-10-21T03:21:02.2619769Z 220 │ {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")} 2026-10-21T03:21:02.2619884Z ·  ──┬─ 2026-10-21T03:21:02.2620052Z · ╰── 'U+001B' is a control character. 2026-10-21T03:21:02.2620124Z 221 │ 2026-10-21T03:21:02.2620177Z ╰──── 2026-10-21T03:21:02.2620472Z  help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression. 2026-10-21T03:21:02.2620512Z 2026-10-21T03:21:02.2620750Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-21T03:21:02.2620938Z ╭─[apps/mobile/src/components/ComposerContextSheet.tsx:267:25] 2026-10-21T03:21:02.2621046Z 266 │ {record.elements?.map((element, index) => ( 2026-10-21T03:21:02.2621220Z 267 │ 2026-10-21T03:21:02.2621372Z ·  ─────────────────────────────────────────────────────── 2026-10-21T03:21:02.2621453Z 268 │ startEditor(defaultEditor), [defaultEditor, startEditor]); 2026-10-21T03:21:02.2622466Z ·  ─────┬───── 2026-10-21T03:21:02.2622672Z · ╰── Unnecessary dependency `startEditor` 2026-10-21T03:21:02.2622760Z 101 │ const readEditor = useCallback( 2026-10-21T03:21:02.2622820Z ╰──── 2026-10-21T03:21:02.2623146Z  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-21T03:21:02.2623466Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2623469Z 2026-10-21T03:21:02.2623658Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-21T03:21:02.2623828Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:121:7] 2026-10-21T03:21:02.2623892Z 120 │ setEditor, 2026-10-21T03:21:02.2623962Z 121 │ startEditor, 2026-10-21T03:21:02.2624045Z ·  ─────┬───── 2026-10-21T03:21:02.2624248Z · ╰── Unnecessary dependency `startEditor` 2026-10-21T03:21:02.2624353Z 122 │ hasChanges, 2026-10-21T03:21:02.2624409Z ╰──── 2026-10-21T03:21:02.2624729Z  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-21T03:21:02.2625046Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2625049Z 2026-10-21T03:21:02.2625310Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.2625450Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:68:5] 2026-10-21T03:21:02.2625564Z 66 │ const { id: attachmentId, fileUri } = attachment; 2026-10-21T03:21:02.2625634Z 67 │ useEffect(() => { 2026-10-21T03:21:02.2625707Z ·  ────┬──── 2026-10-21T03:21:02.2625841Z · ╰── This is the containing effect 2026-10-21T03:21:02.2625909Z 68 │ setUri(null); 2026-10-21T03:21:02.2625983Z ·  ───┬── 2026-10-21T03:21:02.2626149Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2626217Z 69 │ setError(null); 2026-10-21T03:21:02.2626272Z ╰──── 2026-10-21T03:21:02.2626891Z  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-21T03:21:02.2627222Z  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-21T03:21:02.2627225Z 2026-10-21T03:21:02.2627428Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-21T03:21:02.2627567Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:91:7] 2026-10-21T03:21:02.2627626Z 90 │ }; 2026-10-21T03:21:02.2627704Z 91 │ }, [attachmentId, fileUri]); 2026-10-21T03:21:02.2627822Z ·  ──────┬───── ───┬─── 2026-10-21T03:21:02.2628007Z · │ ╰── Unnecessary dependency `fileUri` 2026-10-21T03:21:02.2628162Z · ╰── Unnecessary dependency `attachmentId` 2026-10-21T03:21:02.2628306Z 92 │ const mimeType = videoMimeType(attachment) ?? attachment.mimeType; 2026-10-21T03:21:02.2628359Z ╰──── 2026-10-21T03:21:02.2628659Z  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-21T03:21:02.2628977Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2628980Z 2026-10-21T03:21:02.2629196Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-21T03:21:02.2629339Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:213:34] 2026-10-21T03:21:02.2629407Z 212 │ useEffect(() => { 2026-10-21T03:21:02.2629588Z 213 │ if (!isFocused && hasSource) props.onRequestClose(); 2026-10-21T03:21:02.2629722Z ·  ──┬── 2026-10-21T03:21:02.2629873Z · ╰── Missing dependency `props` 2026-10-21T03:21:02.2629981Z 214 │ }, [isFocused, hasSource, props.onRequestClose]); 2026-10-21T03:21:02.2630096Z ·  ──────────┬───────── 2026-10-21T03:21:02.2630327Z · ╰── Overly precise dependency `props.onRequestClose`, use `props` instead 2026-10-21T03:21:02.2630403Z 215 │ const { source } = props; 2026-10-21T03:21:02.2630455Z ╰──── 2026-10-21T03:21:02.2630941Z  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-21T03:21:02.2631259Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2631261Z 2026-10-21T03:21:02.2631524Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.2631699Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:215:7] 2026-10-21T03:21:02.2631756Z 211 │ }; 2026-10-21T03:21:02.2631829Z 212 │ useEffect(() => { 2026-10-21T03:21:02.2631905Z ·  ────┬──── 2026-10-21T03:21:02.2632039Z · ╰── This is the containing effect 2026-10-21T03:21:02.2632221Z 213 │ const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null; 2026-10-21T03:21:02.2632293Z 214 │ if (inserted) { 2026-10-21T03:21:02.2632375Z 215 │ setSelection((current) => 2026-10-21T03:21:02.2632457Z ·  ──────┬───── 2026-10-21T03:21:02.2632626Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2632803Z 216 │ current.start === inserted.start && current.end === inserted.end ? current : inserted, 2026-10-21T03:21:02.2632858Z ╰──── 2026-10-21T03:21:02.2633470Z  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-21T03:21:02.2633801Z  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-21T03:21:02.2633811Z 2026-10-21T03:21:02.2634069Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.2634240Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:296:7] 2026-10-21T03:21:02.2634322Z 284 │ }, [hasWorkspaceSnapshot]); 2026-10-21T03:21:02.2634390Z 285 │ useEffect(() => { 2026-10-21T03:21:02.2634461Z ·  ────┬──── 2026-10-21T03:21:02.2634594Z · ╰── This is the containing effect 2026-10-21T03:21:02.2634748Z 286 │ if (!environmentId || !projectCwd || !selectedProviderInstanceId) return; 2026-10-21T03:21:02.2634957Z 287 │ const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`; 2026-10-21T03:21:02.2635065Z 288 │ const now = Date.now(); 2026-10-21T03:21:02.2635185Z 289 │ const lastRequest = workspaceRefreshKeyRef.current; 2026-10-21T03:21:02.2635246Z 290 │ if ( 2026-10-21T03:21:02.2635327Z 291 │ lastRequest?.key === key && 2026-10-21T03:21:02.2635467Z 292 │ now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS 2026-10-21T03:21:02.2635525Z 293 │ ) 2026-10-21T03:21:02.2635591Z 294 │ return; 2026-10-21T03:21:02.2635774Z 295 │ if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) { 2026-10-21T03:21:02.2635864Z 296 │ setWorkspaceRefreshRetry(null); 2026-10-21T03:21:02.2635965Z ·  ────────────┬─────────── 2026-10-21T03:21:02.2636149Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2636218Z 297 │ return; 2026-10-21T03:21:02.2636270Z ╰──── 2026-10-21T03:21:02.2636873Z  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-21T03:21:02.2637204Z  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-21T03:21:02.2637206Z 2026-10-21T03:21:02.2637411Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-21T03:21:02.2637580Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:326:5] 2026-10-21T03:21:02.2637639Z 325 │ }, [ 2026-10-21T03:21:02.2637707Z 326 │ draftMessage, 2026-10-21T03:21:02.2637846Z ·  ──────┬───── 2026-10-21T03:21:02.2637993Z · ╰── Unnecessary dependency `draftMessage` 2026-10-21T03:21:02.2638065Z 327 │ environmentId, 2026-10-21T03:21:02.2638120Z ╰──── 2026-10-21T03:21:02.2638421Z  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-21T03:21:02.2638737Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2638739Z 2026-10-21T03:21:02.2639002Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.2639198Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:119:10] 2026-10-21T03:21:02.2639262Z 117 │ 2026-10-21T03:21:02.2639333Z 118 │ useEffect(() => { 2026-10-21T03:21:02.2639437Z ·  ────┬──── 2026-10-21T03:21:02.2639604Z · ╰── This is the containing effect 2026-10-21T03:21:02.2639728Z 119 │ void refreshNotifications(); 2026-10-21T03:21:02.2639836Z ·  ──────────┬───────── 2026-10-21T03:21:02.2640153Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2640344Z 120 │ const subscription = AppState.addEventListener("change", (state) => { 2026-10-21T03:21:02.2640436Z ╰──── 2026-10-21T03:21:02.2641231Z  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-21T03:21:02.2641638Z  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-21T03:21:02.2641669Z 2026-10-21T03:21:02.2641950Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.2642173Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7] 2026-10-21T03:21:02.2642262Z 125 │ 2026-10-21T03:21:02.2642371Z 126 │ useEffect(() => { 2026-10-21T03:21:02.2642472Z ·  ────┬──── 2026-10-21T03:21:02.2642633Z · ╰── This is the containing effect 2026-10-21T03:21:02.2642734Z 127 │ if (!isLoaded) { 2026-10-21T03:21:02.2642848Z 128 │ setLiveActivityStatus("checking"); 2026-10-21T03:21:02.2642966Z ·  ──────────┬────────── 2026-10-21T03:21:02.2643179Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2643273Z 129 │ return; 2026-10-21T03:21:02.2643358Z ╰──── 2026-10-21T03:21:02.2643973Z  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-21T03:21:02.2644352Z  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-21T03:21:02.2644355Z 2026-10-21T03:21:02.2644601Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-21T03:21:02.2644742Z ╭─[apps/mobile/src/Stack.tsx:1058:21] 2026-10-21T03:21:02.2644832Z 1057 │ } 2026-10-21T03:21:02.2645173Z ·  ───────────────────────────────────────────── 2026-10-21T03:21:02.2645297Z 1059 │ screenOptions={({ route }) => { 2026-10-21T03:21:02.2645383Z ╰──── 2026-10-21T03:21:02.2645759Z  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-21T03:21:02.2645815Z 2026-10-21T03:21:02.2646045Z ⚠ eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used. 2026-10-21T03:21:02.2646173Z ╭─[apps/web/src/types.ts:22:3] 2026-10-21T03:21:02.2646280Z 21 │ EnvironmentThreadShell, 2026-10-21T03:21:02.2646362Z 22 │ ThreadRunSummary, 2026-10-21T03:21:02.2646481Z ·  ────────┬─────── 2026-10-21T03:21:02.2646664Z · ╰── 'ThreadRunSummary' is imported here 2026-10-21T03:21:02.2646771Z 23 │ ThreadRuntimeSummary, 2026-10-21T03:21:02.2646837Z ╰──── 2026-10-21T03:21:02.2647033Z  help: Consider removing this import. 2026-10-21T03:21:02.2647075Z 2026-10-21T03:21:02.2647309Z ⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`. 2026-10-21T03:21:02.2647464Z ╭─[apps/web/src/terminal/ghostty/core.ts:194:19] 2026-10-21T03:21:02.2647628Z 193 │ const count = Math.min(CHUNK_SIZE, graphemeLength - start); 2026-10-21T03:21:02.2647734Z 194 │ const codes = new Array(count); 2026-10-21T03:21:02.2647876Z ·  ──────────────────────── 2026-10-21T03:21:02.2648021Z 195 │ for (let index = 0; index < count; index += 1) { 2026-10-21T03:21:02.2648112Z ╰──── 2026-10-21T03:21:02.2648558Z  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-21T03:21:02.2648564Z 2026-10-21T03:21:02.2648773Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-21T03:21:02.2648982Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:682:6] 2026-10-21T03:21:02.2649200Z 681 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-21T03:21:02.2649349Z 682 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-21T03:21:02.2649459Z ·  ────────────┬─────────── 2026-10-21T03:21:02.2649672Z · ╰── Unnecessary dependency `props.snoozePresetMinute` 2026-10-21T03:21:02.2649776Z 683 │ ); 2026-10-21T03:21:02.2649862Z ╰──── 2026-10-21T03:21:02.2650201Z  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-21T03:21:02.2650545Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2650548Z 2026-10-21T03:21:02.2650825Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-21T03:21:02.2651025Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:728:7] 2026-10-21T03:21:02.2651130Z 727 │ thread.pinnedAt, 2026-10-21T03:21:02.2651209Z 728 │ variant, 2026-10-21T03:21:02.2651316Z ·  ───┬─── 2026-10-21T03:21:02.2651497Z · ╰── Unnecessary dependency `variant` 2026-10-21T03:21:02.2651587Z 729 │ ], 2026-10-21T03:21:02.2651654Z ╰──── 2026-10-21T03:21:02.2652052Z  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-21T03:21:02.2652463Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2652466Z 2026-10-21T03:21:02.2652666Z ⚠ react(purity): Cannot call impure function during render 2026-10-21T03:21:02.2652840Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:660:76] 2026-10-21T03:21:02.2653061Z 659 │ const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() })); 2026-10-21T03:21:02.2653268Z 660 │ if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() }); 2026-10-21T03:21:02.2653445Z ·  ─────┬──── 2026-10-21T03:21:02.2653658Z · ╰── Cannot call impure function 2026-10-21T03:21:02.2653810Z 661 │ const snoozeGateNow = new Date(snoozeGateClock.now).toISOString(); 2026-10-21T03:21:02.2653889Z ╰──── 2026-10-21T03:21:02.2654228Z  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-21T03:21:02.2654556Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-21T03:21:02.2654559Z 2026-10-21T03:21:02.2654793Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-21T03:21:02.2654971Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1178:21] 2026-10-21T03:21:02.2655136Z 1177 │ {providerDrivers.slice(0, -1).map((driver, index) => ( 2026-10-21T03:21:02.2655310Z 1178 │ 2026-10-21T03:21:02.2655458Z ·  ────────────────────────── 2026-10-21T03:21:02.2655586Z 1179 │ 2026-10-21T03:21:02.2655664Z ╰──── 2026-10-21T03:21:02.2655863Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-21T03:21:02.2655866Z 2026-10-21T03:21:02.2656047Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2656228Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39] 2026-10-21T03:21:02.2656317Z 276 │ 2026-10-21T03:21:02.2656543Z 277 │ ╭─▶ return createElement(RawNativeView, { 2026-10-21T03:21:02.2656676Z 278 │ │ ...nativeProps, 2026-10-21T03:21:02.2656836Z 279 │ │ refreshEnabled: props.onPullToRefresh !== undefined, 2026-10-21T03:21:02.2656963Z 280 │ │ ref: nativeRef, 2026-10-21T03:21:02.2657131Z 281 │ ├─▶ }); 2026-10-21T03:21:02.2657413Z · ╰──── Passing a ref to a function may read its value during render 2026-10-21T03:21:02.2657503Z 282 │ } 2026-10-21T03:21:02.2657569Z ╰──── 2026-10-21T03:21:02.2658136Z  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-21T03:21:02.2658495Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2658498Z 2026-10-21T03:21:02.2658731Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-21T03:21:02.2658916Z ╭─[apps/mobile/src/features/threads/ThreadQueueControl.tsx:595:27] 2026-10-21T03:21:02.2659098Z 594 │ const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success)); 2026-10-21T03:21:02.2659200Z 595 │ const gesture = Gesture.Pan() 2026-10-21T03:21:02.2659341Z ·  ─┬─ 2026-10-21T03:21:02.2659518Z · ╰── `Pan` may be a component 2026-10-21T03:21:02.2659609Z 596 │ .enabled(!props.disabled) 2026-10-21T03:21:02.2659694Z ╰──── 2026-10-21T03:21:02.2660006Z  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-21T03:21:02.2660486Z  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-21T03:21:02.2660489Z 2026-10-21T03:21:02.2660673Z ⚠ react(immutability): This value cannot be modified 2026-10-21T03:21:02.2660915Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-21T03:21:02.2660997Z  86 │ 2026-10-21T03:21:02.2661143Z  87 │ const cardCoverage = props.cardCoverage; 2026-10-21T03:21:02.2661256Z ·  ──────┬───── 2026-10-21T03:21:02.2661405Z · ╰── `cardCoverage` originates here 2026-10-21T03:21:02.2661518Z  88 │ const barHeightRef = useRef(0); 2026-10-21T03:21:02.2661637Z  89 │ const cardHeightRef = useRef(0); 2026-10-21T03:21:02.2661762Z  90 │ const cardHeight = useSharedValue(0); 2026-10-21T03:21:02.2661869Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-21T03:21:02.2661973Z  92 │ if (!cardCoverage) { 2026-10-21T03:21:02.2662059Z  93 │ return; 2026-10-21T03:21:02.2662166Z  94 │ } 2026-10-21T03:21:02.2662332Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-21T03:21:02.2662455Z  96 │ if (coverage === cardCoverage.value) { 2026-10-21T03:21:02.2662554Z  97 │ return; 2026-10-21T03:21:02.2662645Z  98 │ } 2026-10-21T03:21:02.2662746Z  99 │ if (cardCoverage.value === 0) { 2026-10-21T03:21:02.2662859Z 100 │ cardCoverage.value = coverage; 2026-10-21T03:21:02.2662972Z ·  ──────┬───── 2026-10-21T03:21:02.2663126Z · ╰── `cardCoverage` cannot be modified 2026-10-21T03:21:02.2663221Z 101 │ return; 2026-10-21T03:21:02.2663310Z ╰──── 2026-10-21T03:21:02.2663637Z  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-21T03:21:02.2664041Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-21T03:21:02.2664078Z 2026-10-21T03:21:02.2664241Z ⚠ react(immutability): This value cannot be modified 2026-10-21T03:21:02.2664443Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7] 2026-10-21T03:21:02.2664561Z  89 │ const cardHeightRef = useRef(0); 2026-10-21T03:21:02.2664677Z  90 │ const cardHeight = useSharedValue(0); 2026-10-21T03:21:02.2664768Z ·  ─────┬──── 2026-10-21T03:21:02.2664932Z · ╰── `cardHeight` originates here 2026-10-21T03:21:02.2665062Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-21T03:21:02.2665161Z  92 │ if (!cardCoverage) { 2026-10-21T03:21:02.2665235Z  93 │ return; 2026-10-21T03:21:02.2665312Z  94 │ } 2026-10-21T03:21:02.2665520Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-21T03:21:02.2665641Z  96 │ if (coverage === cardCoverage.value) { 2026-10-21T03:21:02.2665712Z  97 │ return; 2026-10-21T03:21:02.2665795Z  98 │ } 2026-10-21T03:21:02.2665907Z  99 │ if (cardCoverage.value === 0) { 2026-10-21T03:21:02.2666029Z 100 │ cardCoverage.value = coverage; 2026-10-21T03:21:02.2666102Z 101 │ return; 2026-10-21T03:21:02.2666186Z 102 │ } 2026-10-21T03:21:02.2666311Z 103 │ cardCoverage.value = withTiming(coverage, { 2026-10-21T03:21:02.2666462Z 104 │ duration: USER_INPUT_TOGGLE_DURATION_MS, 2026-10-21T03:21:02.2666562Z 105 │ easing: Easing.out(Easing.cubic), 2026-10-21T03:21:02.2666656Z 106 │ }); 2026-10-21T03:21:02.2666754Z 107 │ }, [cardCoverage]); 2026-10-21T03:21:02.2666876Z 108 │ const handleBarLayout = useCallback( 2026-10-21T03:21:02.2666983Z 109 │ (event: LayoutChangeEvent) => { 2026-10-21T03:21:02.2667138Z 110 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-21T03:21:02.2667236Z 111 │ notifyCoverage(); 2026-10-21T03:21:02.2667315Z 112 │ }, 2026-10-21T03:21:02.2667410Z 113 │ [notifyCoverage], 2026-10-21T03:21:02.2667500Z 114 │ ); 2026-10-21T03:21:02.2667615Z 115 │ const handleCardLayout = useCallback( 2026-10-21T03:21:02.2667724Z 116 │ (event: LayoutChangeEvent) => { 2026-10-21T03:21:02.2667860Z 117 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-21T03:21:02.2668037Z 118 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-21T03:21:02.2668141Z ·  ─────┬──── 2026-10-21T03:21:02.2668311Z · ╰── `cardHeight` cannot be modified 2026-10-21T03:21:02.2668403Z 119 │ notifyCoverage(); 2026-10-21T03:21:02.2668494Z ╰──── 2026-10-21T03:21:02.2668794Z  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-21T03:21:02.2669123Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-21T03:21:02.2669126Z 2026-10-21T03:21:02.2669360Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-21T03:21:02.2669520Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-21T03:21:02.2669654Z  90 │ const cardHeight = useSharedValue(0); 2026-10-21T03:21:02.2669776Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-21T03:21:02.2669977Z ·  ───┬─── 2026-10-21T03:21:02.2670261Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-21T03:21:02.2670359Z  92 │ if (!cardCoverage) { 2026-10-21T03:21:02.2670459Z  93 │ return; 2026-10-21T03:21:02.2670549Z  94 │ } 2026-10-21T03:21:02.2670756Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-21T03:21:02.2670915Z  96 │ if (coverage === cardCoverage.value) { 2026-10-21T03:21:02.2671020Z  97 │ return; 2026-10-21T03:21:02.2671109Z  98 │ } 2026-10-21T03:21:02.2671200Z  99 │ if (cardCoverage.value === 0) { 2026-10-21T03:21:02.2671308Z 100 │ cardCoverage.value = coverage; 2026-10-21T03:21:02.2671424Z ·  ──────┬───── 2026-10-21T03:21:02.2671604Z · ╰── This modifies `cardCoverage` 2026-10-21T03:21:02.2671680Z 101 │ return; 2026-10-21T03:21:02.2671761Z ╰──── 2026-10-21T03:21:02.2672357Z  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-21T03:21:02.2672749Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-21T03:21:02.2672753Z 2026-10-21T03:21:02.2672973Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-21T03:21:02.2673160Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-21T03:21:02.2673276Z  99 │ if (cardCoverage.value === 0) { 2026-10-21T03:21:02.2673399Z 100 │ cardCoverage.value = coverage; 2026-10-21T03:21:02.2673524Z ·  ──────┬───── 2026-10-21T03:21:02.2673671Z · ╰── This modifies `cardCoverage` 2026-10-21T03:21:02.2673766Z 101 │ return; 2026-10-21T03:21:02.2673846Z 102 │ } 2026-10-21T03:21:02.2673998Z 103 │ cardCoverage.value = withTiming(coverage, { 2026-10-21T03:21:02.2674106Z 104 │ duration: USER_INPUT_TOGGLE_DURATION_MS, 2026-10-21T03:21:02.2674217Z 105 │ easing: Easing.out(Easing.cubic), 2026-10-21T03:21:02.2674301Z 106 │ }); 2026-10-21T03:21:02.2674403Z 107 │ }, [cardCoverage]); 2026-10-21T03:21:02.2674512Z 108 │ const handleBarLayout = useCallback( 2026-10-21T03:21:02.2674621Z 109 │ (event: LayoutChangeEvent) => { 2026-10-21T03:21:02.2674755Z ·  ───────────────┬─────────────── 2026-10-21T03:21:02.2675005Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-21T03:21:02.2675159Z 110 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-21T03:21:02.2675249Z ╰──── 2026-10-21T03:21:02.2675614Z  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-21T03:21:02.2675948Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-21T03:21:02.2675950Z 2026-10-21T03:21:02.2676158Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-21T03:21:02.2676443Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7] 2026-10-21T03:21:02.2676603Z 115 │ const handleCardLayout = useCallback( 2026-10-21T03:21:02.2676718Z 116 │ (event: LayoutChangeEvent) => { 2026-10-21T03:21:02.2676868Z ·  ───────────────┬─────────────── 2026-10-21T03:21:02.2677259Z · ╰── This function may (indirectly) reassign or modify `cardHeight` after render 2026-10-21T03:21:02.2677489Z 117 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-21T03:21:02.2677641Z 118 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-21T03:21:02.2677748Z ·  ─────┬──── 2026-10-21T03:21:02.2677953Z · ╰── This modifies `cardHeight` 2026-10-21T03:21:02.2678077Z 119 │ notifyCoverage(); 2026-10-21T03:21:02.2678165Z ╰──── 2026-10-21T03:21:02.2678534Z  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-21T03:21:02.2678859Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-21T03:21:02.2678871Z 2026-10-21T03:21:02.2679083Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-21T03:21:02.2679234Z ╭─[apps/mobile/src/lib/useHoverGesture.ts:8:15] 2026-10-21T03:21:02.2679329Z 7 │ () => 2026-10-21T03:21:02.2679430Z 8 │ Gesture.Hover() 2026-10-21T03:21:02.2679513Z ·  ──┬── 2026-10-21T03:21:02.2679690Z · ╰── `Hover` may be a component 2026-10-21T03:21:02.2679802Z 9 │ .manualActivation(true) 2026-10-21T03:21:02.2679882Z ╰──── 2026-10-21T03:21:02.2680169Z  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-21T03:21:02.2686268Z  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-21T03:21:02.2686273Z 2026-10-21T03:21:02.2686538Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-21T03:21:02.2686681Z ╭─[apps/mobile/src/state/use-composer-drafts.ts:1022:15] 2026-10-21T03:21:02.2686753Z 1021 │ instanceId, 2026-10-21T03:21:02.2686910Z 1022 │ { ...(persisted.modelOptionMemory[instanceId] ?? {}), ...models }, 2026-10-21T03:21:02.2687047Z ·  ────────────────────────────────────────────────── 2026-10-21T03:21:02.2687112Z 1023 │ ]), 2026-10-21T03:21:02.2687168Z ╰──── 2026-10-21T03:21:02.2687431Z  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-21T03:21:02.2687434Z 2026-10-21T03:21:02.2687903Z ⚠ 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-21T03:21:02.2688082Z ╭─[apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts:223:5] 2026-10-21T03:21:02.2688300Z 222 │ let idlePasses = 0; 2026-10-21T03:21:02.2688534Z 223 │ ╭─▶ for (;;) { 2026-10-21T03:21:02.2688759Z 224 │ │ yield* Effect.promise(() => Promise.resolve()); 2026-10-21T03:21:02.2688999Z 225 │ │ const pending = backgroundRuntime.pending.shift(); 2026-10-21T03:21:02.2689159Z 226 │ │ if (!pending) { 2026-10-21T03:21:02.2689316Z 227 │ │ idlePasses++; 2026-10-21T03:21:02.2689492Z 228 │ │ if (idlePasses >= 3) { 2026-10-21T03:21:02.2689633Z 229 │ │ return; 2026-10-21T03:21:02.2689762Z 230 │ │ } 2026-10-21T03:21:02.2689910Z 231 │ │ continue; 2026-10-21T03:21:02.2690046Z 232 │ │ } 2026-10-21T03:21:02.2690202Z 233 │ │ idlePasses = 0; 2026-10-21T03:21:02.2690390Z 234 │ │ const exit = yield* Effect.exit( 2026-10-21T03:21:02.2690798Z 235 │ │ pending.operation as Effect.Effect, 2026-10-21T03:21:02.2690957Z 236 │ │ ); 2026-10-21T03:21:02.2691127Z 237 │ │ yield* Effect.sync(() => { 2026-10-21T03:21:02.2691302Z 238 │ │ pending.resolve(exit); 2026-10-21T03:21:02.2691429Z 239 │ │ }); 2026-10-21T03:21:02.2691637Z 240 │ ╰─▶ } 2026-10-21T03:21:02.2691732Z 241 │ }, 2026-10-21T03:21:02.2691822Z ╰──── 2026-10-21T03:21:02.2691827Z 2026-10-21T03:21:02.2692293Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.2692520Z ╭─[apps/mobile/src/state/use-vcs-action-state.ts:86:5] 2026-10-21T03:21:02.2692700Z 83 │ const [nowMs, setNowMs] = useState(() => Date.now()); 2026-10-21T03:21:02.2692810Z 84 │ useEffect(() => { 2026-10-21T03:21:02.2692935Z ·  ────┬──── 2026-10-21T03:21:02.2693156Z · ╰── This is the containing effect 2026-10-21T03:21:02.2693298Z 85 │ if (!actionState.isRunning) return; 2026-10-21T03:21:02.2693415Z 86 │ setNowMs(Date.now()); 2026-10-21T03:21:02.2693535Z ·  ────┬─── 2026-10-21T03:21:02.2693826Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2694158Z 87 │ const interval = setInterval(() => setNowMs(Date.now()), 1000); 2026-10-21T03:21:02.2694289Z ╰──── 2026-10-21T03:21:02.2695361Z  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-21T03:21:02.2695936Z  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-21T03:21:02.2695940Z 2026-10-21T03:21:02.2696288Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-21T03:21:02.2696517Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:462:7] 2026-10-21T03:21:02.2696670Z 461 │ showAuxiliaryPane("inspector"); 2026-10-21T03:21:02.2696859Z 462 │ }, [environmentId, showAuxiliaryPane, threadId]); 2026-10-21T03:21:02.2697093Z ·  ──────┬────── ────┬─── 2026-10-21T03:21:02.2697402Z · │ ╰── Unnecessary dependency `threadId` 2026-10-21T03:21:02.2697636Z · ╰── Unnecessary dependency `environmentId` 2026-10-21T03:21:02.2697731Z 463 │ const { 2026-10-21T03:21:02.2697819Z ╰──── 2026-10-21T03:21:02.2698308Z  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-21T03:21:02.2698834Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2698842Z 2026-10-21T03:21:02.2699156Z ⚠ react(static-components): Cannot create components during render 2026-10-21T03:21:02.2699377Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:733:20] 2026-10-21T03:21:02.2699450Z 500 │ // same check. 2026-10-21T03:21:02.2699650Z 501 │ const NativeReviewDiffView = resolveNativeReviewDiffView(); 2026-10-21T03:21:02.2699845Z ·  ─────────────┬───────────── 2026-10-21T03:21:02.2700139Z · ╰── The component is created during render here 2026-10-21T03:21:02.2700392Z 502 │ const nativeReviewDiffViewRef = useRef(null); 2026-10-21T03:21:02.2700594Z 503 │ const showcasedReviewDrawRef = useRef(null); 2026-10-21T03:21:02.2700876Z 504 │ const [isPullRefreshing, setIsPullRefreshing] = useState(false); 2026-10-21T03:21:02.2701032Z 505 │ const handlePullToRefresh = async () => { 2026-10-21T03:21:02.2701158Z 506 │ setIsPullRefreshing(true); 2026-10-21T03:21:02.2701287Z 507 │ await refreshSelectedSection(); 2026-10-21T03:21:02.2701412Z 508 │ setIsPullRefreshing(false); 2026-10-21T03:21:02.2701505Z 509 │ }; 2026-10-21T03:21:02.2701742Z 510 │ const reviewFileNavigatorRef = useRef(null); 2026-10-21T03:21:02.2701944Z 511 │ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : []; 2026-10-21T03:21:02.2702054Z 512 │ const fileVisibility = useReviewFileVisibility({ 2026-10-21T03:21:02.2702143Z 513 │ threadKey: reviewCache.threadKey, 2026-10-21T03:21:02.2702364Z 514 │ sectionId: selectedSection?.id ?? null, 2026-10-21T03:21:02.2702481Z 515 │ files: reviewFiles, 2026-10-21T03:21:02.2702583Z 516 │ cachedExpandedFileIds: selectedSection?.id 2026-10-21T03:21:02.2702717Z 517 │ ? reviewCache.expandedFileIdsBySection[selectedSection.id] 2026-10-21T03:21:02.2702784Z 518 │ : undefined, 2026-10-21T03:21:02.2702879Z 519 │ cachedViewedFileIds: selectedSection?.id 2026-10-21T03:21:02.2703007Z 520 │ ? reviewCache.viewedFileIdsBySection[selectedSection.id] 2026-10-21T03:21:02.2703073Z 521 │ : undefined, 2026-10-21T03:21:02.2703131Z 522 │ }); 2026-10-21T03:21:02.2703321Z 523 │ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility; 2026-10-21T03:21:02.2703454Z 524 │ const commentSelection = useReviewCommentSelectionController({ 2026-10-21T03:21:02.2703520Z 525 │ environmentId, 2026-10-21T03:21:02.2703583Z 526 │ threadId, 2026-10-21T03:21:02.2703654Z 527 │ selectedSection, 2026-10-21T03:21:02.2703730Z 528 │ nativeReviewDiffData, 2026-10-21T03:21:02.2703786Z 529 │ }); 2026-10-21T03:21:02.2703892Z 530 │ const nativeBridge = useNativeReviewDiffBridge({ 2026-10-21T03:21:02.2703979Z 531 │ threadKey: reviewCache.threadKey, 2026-10-21T03:21:02.2704070Z 532 │ sectionId: selectedSection?.id ?? null, 2026-10-21T03:21:02.2704149Z 533 │ diff: selectedSection?.diff, 2026-10-21T03:21:02.2704228Z 534 │ data: nativeReviewDiffData, 2026-10-21T03:21:02.2704294Z 535 │ collapsedFileIds, 2026-10-21T03:21:02.2704359Z 536 │ viewedFileIds, 2026-10-21T03:21:02.2704475Z 537 │ selectedRowIds: commentSelection.selectedRowIds, 2026-10-21T03:21:02.2704572Z 538 │ canHighlight: parsedDiff.kind === "files", 2026-10-21T03:21:02.2704627Z 539 │ }); 2026-10-21T03:21:02.2704710Z 540 │ const showcaseReviewKey = 2026-10-21T03:21:02.2704846Z 541 │ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection 2026-10-21T03:21:02.2705049Z 542 │ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}` 2026-10-21T03:21:02.2705112Z 543 │ : null; 2026-10-21T03:21:02.2705279Z 544 │ const handleNativeDebug = (event: NativeSyntheticEvent>) => { 2026-10-21T03:21:02.2705358Z 545 │ nativeBridge.onDebug(event); 2026-10-21T03:21:02.2705414Z 546 │ if ( 2026-10-21T03:21:02.2705497Z 547 │ showcaseReviewKey === null || 2026-10-21T03:21:02.2705620Z 548 │ showcasedReviewDrawRef.current === showcaseReviewKey || 2026-10-21T03:21:02.2705732Z 549 │ !isNativeReviewDiffDrawEvent(event.nativeEvent) 2026-10-21T03:21:02.2705787Z 550 │ ) { 2026-10-21T03:21:02.2705852Z 551 │ return; 2026-10-21T03:21:02.2705913Z 552 │ } 2026-10-21T03:21:02.2706028Z 553 │ showcasedReviewDrawRef.current = showcaseReviewKey; 2026-10-21T03:21:02.2706188Z 554 │ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId }); 2026-10-21T03:21:02.2706245Z 555 │ }; 2026-10-21T03:21:02.2706301Z 556 │ 2026-10-21T03:21:02.2706420Z 557 │ const handleSelectFile = async (fileId: string | null) => { 2026-10-21T03:21:02.2706499Z 558 │ loadVisibleFile(fileId, true); 2026-10-21T03:21:02.2706589Z 559 │ commentSelection.clearSelection(); 2026-10-21T03:21:02.2706709Z 560 │ if (fileId !== null && collapsedFileIds.includes(fileId)) { 2026-10-21T03:21:02.2706790Z 561 │ toggleExpandedFile(fileId); 2026-10-21T03:21:02.2706844Z 562 │ } 2026-10-21T03:21:02.2706956Z 563 │ const nativeView = nativeReviewDiffViewRef.current; 2026-10-21T03:21:02.2707027Z 564 │ if (!nativeView) return; 2026-10-21T03:21:02.2707182Z 565 │ const result = await settlePromise(() => 2026-10-21T03:21:02.2707388Z 566 │ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true), 2026-10-21T03:21:02.2707445Z 567 │ ); 2026-10-21T03:21:02.2707535Z 568 │ if (AsyncResult.isFailure(result)) { 2026-10-21T03:21:02.2707715Z 569 │ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result)); 2026-10-21T03:21:02.2707769Z 570 │ } 2026-10-21T03:21:02.2707824Z 571 │ }; 2026-10-21T03:21:02.2707908Z 572 │ const handleVisibleFileChange = ( 2026-10-21T03:21:02.2708039Z 573 │ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>, 2026-10-21T03:21:02.2708097Z 574 │ ) => { 2026-10-21T03:21:02.2708206Z 575 │ loadVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-21T03:21:02.2708381Z 576 │ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-21T03:21:02.2708436Z 577 │ }; 2026-10-21T03:21:02.2708517Z 578 │ const renderInspector = () => ( 2026-10-21T03:21:02.2708587Z 579 │ void handleSelectFile(fileId)} 2026-10-21T03:21:02.2709098Z 585 │ /> 2026-10-21T03:21:02.2709152Z 586 │ ); 2026-10-21T03:21:02.2709206Z 587 │ 2026-10-21T03:21:02.2709390Z 588 │ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => { 2026-10-21T03:21:02.2709481Z 589 │ const { fileId } = event.nativeEvent; 2026-10-21T03:21:02.2709549Z 590 │ if (fileId) { 2026-10-21T03:21:02.2709632Z 591 │ loadVisibleFile(fileId, true); 2026-10-21T03:21:02.2709712Z 592 │ toggleExpandedFile(fileId); 2026-10-21T03:21:02.2709764Z 593 │ } 2026-10-21T03:21:02.2709821Z 594 │ }; 2026-10-21T03:21:02.2709875Z 595 │ 2026-10-21T03:21:02.2709964Z 596 │ const handleNativeToggleViewedFile = ( 2026-10-21T03:21:02.2710084Z 597 │ event: NativeSyntheticEvent<{ readonly fileId?: string }>, 2026-10-21T03:21:02.2710144Z 598 │ ) => { 2026-10-21T03:21:02.2710231Z 599 │ const { fileId } = event.nativeEvent; 2026-10-21T03:21:02.2710293Z 600 │ if (fileId) { 2026-10-21T03:21:02.2710371Z 601 │ toggleViewedFile(fileId); 2026-10-21T03:21:02.2710427Z 602 │ } 2026-10-21T03:21:02.2710481Z 603 │ }; 2026-10-21T03:21:02.2710532Z 604 │ 2026-10-21T03:21:02.2710617Z 605 │ const parsedDiffNotice = 2026-10-21T03:21:02.2710839Z 606 │ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null; 2026-10-21T03:21:02.2710963Z 607 │ const hasCachedSelectedDiff = selectedSection?.diff != null; 2026-10-21T03:21:02.2711117Z 608 │ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null); 2026-10-21T03:21:02.2711239Z 609 │ const sectionMenu = buildReviewSectionMenu(reviewSections); 2026-10-21T03:21:02.2711400Z 610 │ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({ 2026-10-21T03:21:02.2711510Z 611 │ hasEnvironmentPresentation: environment.isReady, 2026-10-21T03:21:02.2711610Z 612 │ isEnvironmentConnected: isEnvironmentReady, 2026-10-21T03:21:02.2711684Z 613 │ hasCachedSelectedDiff, 2026-10-21T03:21:02.2711754Z 614 │ hasAnyCachedDiff, 2026-10-21T03:21:02.2711917Z 615 │ }); 2026-10-21T03:21:02.2712057Z 616 │ const handleRetryEnvironment = () => { 2026-10-21T03:21:02.2712146Z 617 │ void retryEnvironment(environmentId); 2026-10-21T03:21:02.2712202Z 618 │ }; 2026-10-21T03:21:02.2712289Z 619 │ const handleReturnToThread = () => { 2026-10-21T03:21:02.2712368Z 620 │ if (navigation.canGoBack()) { 2026-10-21T03:21:02.2712441Z 621 │ navigation.goBack(); 2026-10-21T03:21:02.2712504Z 622 │ return; 2026-10-21T03:21:02.2712556Z 623 │ } 2026-10-21T03:21:02.2712641Z 624 │ navigation.navigate("Thread", { 2026-10-21T03:21:02.2712733Z 625 │ environmentId: String(environmentId), 2026-10-21T03:21:02.2712812Z 626 │ threadId: String(threadId), 2026-10-21T03:21:02.2712866Z 627 │ }); 2026-10-21T03:21:02.2712921Z 628 │ }; 2026-10-21T03:21:02.2713002Z 629 │ const androidHeaderSubtitle = [ 2026-10-21T03:21:02.2713081Z 630 │ selectedSection?.title, 2026-10-21T03:21:02.2713161Z 631 │ headerDiffSummary.additions, 2026-10-21T03:21:02.2713240Z 632 │ headerDiffSummary.deletions, 2026-10-21T03:21:02.2713296Z 633 │ ] 2026-10-21T03:21:02.2713403Z 634 │ .filter((part): part is string => Boolean(part)) 2026-10-21T03:21:02.2713468Z 635 │ .join(" · "); 2026-10-21T03:21:02.2713522Z 636 │ 2026-10-21T03:21:02.2713601Z 637 │ const showChangedFilesPane = 2026-10-21T03:21:02.2713674Z 638 │ !showConnectionNotice && 2026-10-21T03:21:02.2713748Z 639 │ selectedSection !== null && 2026-10-21T03:21:02.2713828Z 640 │ parsedDiff.kind === "files" && 2026-10-21T03:21:02.2713908Z 641 │ NativeReviewDiffView !== null; 2026-10-21T03:21:02.2714075Z 642 │ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined); 2026-10-21T03:21:02.2714253Z 643 │ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane; 2026-10-21T03:21:02.2714308Z 644 │ 2026-10-21T03:21:02.2714382Z 645 │ const listHeader = (() => { 2026-10-21T03:21:02.2714465Z 646 │ const children: ReactElement[] = []; 2026-10-21T03:21:02.2714519Z 647 │ 2026-10-21T03:21:02.2714582Z 648 │ if (error) { 2026-10-21T03:21:02.2714651Z 649 │ children.push( 2026-10-21T03:21:02.2714711Z 650 │ 2026-10-21T03:21:02.2715378Z 657 │ Review unavailable 2026-10-21T03:21:02.2715536Z 658 │ {error} 2026-10-21T03:21:02.2715599Z 659 │ , 2026-10-21T03:21:02.2715656Z 660 │ ); 2026-10-21T03:21:02.2715712Z 661 │ } 2026-10-21T03:21:02.2715763Z 662 │ 2026-10-21T03:21:02.2715836Z 663 │ if (parsedDiffNotice) { 2026-10-21T03:21:02.2715994Z 664 │ children.push(); 2026-10-21T03:21:02.2716057Z 665 │ } 2026-10-21T03:21:02.2716140Z 666 │ 2026-10-21T03:21:02.2716262Z 667 │ if (children.length === 0) { 2026-10-21T03:21:02.2716364Z 668 │ return null; 2026-10-21T03:21:02.2716450Z 669 │ } 2026-10-21T03:21:02.2716523Z 670 │ 2026-10-21T03:21:02.2716596Z 671 │ return <>{children}; 2026-10-21T03:21:02.2716731Z 672 │ })(); 2026-10-21T03:21:02.2716834Z 673 │ const headerSubtitle = [ 2026-10-21T03:21:02.2716915Z 674 │ headerDiffSummary.additions, 2026-10-21T03:21:02.2716994Z 675 │ headerDiffSummary.deletions, 2026-10-21T03:21:02.2717074Z 676 │ pendingReviewCommentCount > 0 2026-10-21T03:21:02.2717246Z 677 │ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}` 2026-10-21T03:21:02.2717309Z 678 │ : null, 2026-10-21T03:21:02.2717364Z 679 │ ] 2026-10-21T03:21:02.2717430Z 680 │ .filter(Boolean) 2026-10-21T03:21:02.2717492Z 681 │ .join(" · "); 2026-10-21T03:21:02.2717629Z 682 │ const headerTitleText = selectedSection?.title ?? "Review changes"; 2026-10-21T03:21:02.2717682Z 683 │ 2026-10-21T03:21:02.2717741Z 684 │ return ( 2026-10-21T03:21:02.2717885Z 685 │ <> 2026-10-21T03:21:02.2717958Z 686 │ 2026-10-21T03:21:02.2719287Z 702 │ 2026-10-21T03:21:02.2719353Z 703 │ 2026-10-21T03:21:02.2719473Z 704 │ 2026-10-21T03:21:02.2719559Z 705 │ {showConnectionNotice ? ( 2026-10-21T03:21:02.2719699Z 706 │ 2026-10-21T03:21:02.2719792Z 707 │ 2026-10-21T03:21:02.2720897Z 719 │ 2026-10-21T03:21:02.2721054Z 720 │ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? ( 2026-10-21T03:21:02.2721117Z 721 │ 2026-10-21T03:21:02.2721704Z 727 │ 2026-10-21T03:21:02.2722066Z 731 │ {listHeader} 2026-10-21T03:21:02.2722188Z 732 │ 2026-10-21T03:21:02.2722272Z 733 │ ( 2026-10-21T03:21:02.2723836Z 223 │ 2026-10-21T03:21:02.2723946Z ·  ─────────────── 2026-10-21T03:21:02.2724039Z 224 │ {lineIndex > 0 ? "\n" : ""} 2026-10-21T03:21:02.2724092Z ╰──── 2026-10-21T03:21:02.2724238Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-21T03:21:02.2724244Z 2026-10-21T03:21:02.2724434Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-21T03:21:02.2724585Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25] 2026-10-21T03:21:02.2724663Z 226 │ { 2026-10-21T03:21:02.2725766Z ·  ────┬──── 2026-10-21T03:21:02.2725979Z · ╰── This is the containing effect 2026-10-21T03:21:02.2726147Z 102 │ if (!target || selectedLines.length === 0) { 2026-10-21T03:21:02.2726364Z 103 │ setHighlightedLinesById({}); 2026-10-21T03:21:02.2726550Z ·  ───────────┬─────────── 2026-10-21T03:21:02.2726848Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2726957Z 104 │ return; 2026-10-21T03:21:02.2727048Z ╰──── 2026-10-21T03:21:02.2728096Z  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-21T03:21:02.2728675Z  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-21T03:21:02.2728679Z 2026-10-21T03:21:02.2729150Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.2729398Z ╭─[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5] 2026-10-21T03:21:02.2729488Z 150 │ 2026-10-21T03:21:02.2729595Z 151 │ useEffect(() => { 2026-10-21T03:21:02.2729717Z ·  ────┬──── 2026-10-21T03:21:02.2729936Z · ╰── This is the containing effect 2026-10-21T03:21:02.2730079Z 152 │ if (!controlledSelectedPath) { 2026-10-21T03:21:02.2730179Z 153 │ return; 2026-10-21T03:21:02.2730275Z 154 │ } 2026-10-21T03:21:02.2730417Z 155 │ setExpandedPaths((current) => { 2026-10-21T03:21:02.2730547Z ·  ────────┬─────── 2026-10-21T03:21:02.2730896Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2731116Z 156 │ const ancestors = ancestorPaths(controlledSelectedPath); 2026-10-21T03:21:02.2731209Z ╰──── 2026-10-21T03:21:02.2732289Z  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-21T03:21:02.2732865Z  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-21T03:21:02.2732868Z 2026-10-21T03:21:02.2733278Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.2733714Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:107:5] 2026-10-21T03:21:02.2733863Z 104 │ 2026-10-21T03:21:02.2733971Z 105 │ useEffect(() => { 2026-10-21T03:21:02.2734087Z ·  ────┬──── 2026-10-21T03:21:02.2734299Z · ╰── This is the containing effect 2026-10-21T03:21:02.2734426Z 106 │ clearReviewCommentTarget(); 2026-10-21T03:21:02.2734576Z 107 │ setPendingNativeCommentSelection(null); 2026-10-21T03:21:02.2734742Z ·  ────────────────┬─────────────── 2026-10-21T03:21:02.2735028Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2735147Z 108 │ }, [selectedSection?.id]); 2026-10-21T03:21:02.2735229Z ╰──── 2026-10-21T03:21:02.2735834Z  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-21T03:21:02.2736164Z  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-21T03:21:02.2736168Z 2026-10-21T03:21:02.2736424Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.2736611Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7] 2026-10-21T03:21:02.2736666Z 109 │ 2026-10-21T03:21:02.2736730Z 110 │ useEffect(() => { 2026-10-21T03:21:02.2736807Z ·  ────┬──── 2026-10-21T03:21:02.2736940Z · ╰── This is the containing effect 2026-10-21T03:21:02.2737027Z 111 │ if (activeCommentTarget === null) { 2026-10-21T03:21:02.2737129Z 112 │ setPendingNativeCommentSelection(null); 2026-10-21T03:21:02.2737238Z ·  ────────────────┬─────────────── 2026-10-21T03:21:02.2737415Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2737471Z 113 │ } 2026-10-21T03:21:02.2737525Z ╰──── 2026-10-21T03:21:02.2738174Z  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-21T03:21:02.2738505Z  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-21T03:21:02.2738509Z 2026-10-21T03:21:02.2738837Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-21T03:21:02.2739137Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7] 2026-10-21T03:21:02.2739299Z 107 │ setPendingNativeCommentSelection(null); 2026-10-21T03:21:02.2739420Z 108 │ }, [selectedSection?.id]); 2026-10-21T03:21:02.2739562Z ·  ─────────┬───────── 2026-10-21T03:21:02.2739823Z · ╰── Unnecessary dependency `selectedSection?.id` 2026-10-21T03:21:02.2740069Z 109 │ 2026-10-21T03:21:02.2740214Z ╰──── 2026-10-21T03:21:02.2740767Z  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-21T03:21:02.2741306Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2741311Z 2026-10-21T03:21:02.2741645Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-21T03:21:02.2741886Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7] 2026-10-21T03:21:02.2742044Z 256 │ return () => cancelAnimationFrame(frame); 2026-10-21T03:21:02.2742177Z 257 │ }, [props.path, targetIndex]); 2026-10-21T03:21:02.2742307Z ·  ─────┬──── 2026-10-21T03:21:02.2742557Z · ╰── Unnecessary dependency `props.path` 2026-10-21T03:21:02.2742646Z 258 │ 2026-10-21T03:21:02.2742731Z ╰──── 2026-10-21T03:21:02.2743224Z  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-21T03:21:02.2743629Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2743633Z 2026-10-21T03:21:02.2743834Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-21T03:21:02.2743985Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23] 2026-10-21T03:21:02.2744065Z 292 │ 2026-10-21T03:21:02.2745165Z ·  ─────────── 2026-10-21T03:21:02.2745241Z 310 │ {body} 2026-10-21T03:21:02.2745296Z ╰──── 2026-10-21T03:21:02.2745444Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-21T03:21:02.2745446Z 2026-10-21T03:21:02.2745703Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.2745879Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:60:5] 2026-10-21T03:21:02.2745935Z 55 │ 2026-10-21T03:21:02.2745999Z 56 │ useEffect(() => { 2026-10-21T03:21:02.2746074Z ·  ────┬──── 2026-10-21T03:21:02.2746207Z · ╰── This is the containing effect 2026-10-21T03:21:02.2746278Z 57 │ scheduler.reset(); 2026-10-21T03:21:02.2746376Z 58 │ highlightedRowIdsRef.current = new Set(); 2026-10-21T03:21:02.2746581Z 59 │ visibleChunkIndexRef.current = 0; 2026-10-21T03:21:02.2746736Z 60 │ setVisibleRange({ firstRowIndex: 0, lastRowIndex: 80 }); 2026-10-21T03:21:02.2746819Z ·  ───────┬─────── 2026-10-21T03:21:02.2746988Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2747104Z 61 │ setTokensPatchJson(createEmptyTokenPatch(resetKey)); 2026-10-21T03:21:02.2747157Z ╰──── 2026-10-21T03:21:02.2747760Z  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-21T03:21:02.2748090Z  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-21T03:21:02.2748097Z 2026-10-21T03:21:02.2748297Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-21T03:21:02.2748472Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:63:7] 2026-10-21T03:21:02.2748556Z 62 │ return () => scheduler.cancel(); 2026-10-21T03:21:02.2748659Z 63 │ }, [enabled, resetKey, rows.length, scheduler]); 2026-10-21T03:21:02.2748783Z ·  ───┬─── ─────┬───── 2026-10-21T03:21:02.2748976Z · │ ╰── Unnecessary dependency `rows.length` 2026-10-21T03:21:02.2749115Z · ╰── Unnecessary dependency `enabled` 2026-10-21T03:21:02.2749177Z 64 │ 2026-10-21T03:21:02.2749231Z ╰──── 2026-10-21T03:21:02.2749530Z  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-21T03:21:02.2749848Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2749851Z 2026-10-21T03:21:02.2750070Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-21T03:21:02.2750195Z ╭─[apps/mobile/src/lib/markdownDocument.ts:138:28] 2026-10-21T03:21:02.2750279Z 137 │ visit(parser.parse(markdown)); 2026-10-21T03:21:02.2750369Z 138 │ for (const edit of edits.reverse()) 2026-10-21T03:21:02.2750470Z ·  ─────── 2026-10-21T03:21:02.2750637Z 139 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-21T03:21:02.2750691Z ╰──── 2026-10-21T03:21:02.2751010Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-21T03:21:02.2751012Z 2026-10-21T03:21:02.2751224Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-21T03:21:02.2751349Z ╭─[apps/mobile/src/lib/markdownDocument.ts:169:28] 2026-10-21T03:21:02.2751428Z 168 │ visit(parser.parse(markdown)); 2026-10-21T03:21:02.2751516Z 169 │ for (const edit of edits.reverse()) 2026-10-21T03:21:02.2751611Z ·  ─────── 2026-10-21T03:21:02.2751860Z 170 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-21T03:21:02.2751977Z ╰──── 2026-10-21T03:21:02.2752238Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-21T03:21:02.2752241Z 2026-10-21T03:21:02.2752450Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-21T03:21:02.2752573Z ╭─[apps/mobile/src/lib/markdownDocument.ts:223:38] 2026-10-21T03:21:02.2752652Z 222 │ visit(parser.parse(markdown)); 2026-10-21T03:21:02.2752759Z 223 │ for (const lineStart of lineStarts.reverse()) { 2026-10-21T03:21:02.2752865Z ·  ─────── 2026-10-21T03:21:02.2753034Z 224 │ // The header row may be a lazy line without its container markers (`>` or list indent), 2026-10-21T03:21:02.2753090Z ╰──── 2026-10-21T03:21:02.2753354Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-21T03:21:02.2753356Z 2026-10-21T03:21:02.2753615Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.2753788Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:79:5] 2026-10-21T03:21:02.2753844Z 76 │ 2026-10-21T03:21:02.2753910Z 77 │ useEffect(() => { 2026-10-21T03:21:02.2753984Z ·  ────┬──── 2026-10-21T03:21:02.2754116Z · ╰── This is the containing effect 2026-10-21T03:21:02.2754244Z 78 │ const { host, code } = parsePairingUrl(connectionPairingUrl); 2026-10-21T03:21:02.2754318Z 79 │ setHostInput(host); 2026-10-21T03:21:02.2754401Z ·  ──────┬───── 2026-10-21T03:21:02.2754570Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2754638Z 80 │ setCodeInput(code); 2026-10-21T03:21:02.2754694Z ╰──── 2026-10-21T03:21:02.2755297Z  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-21T03:21:02.2755624Z  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-21T03:21:02.2755627Z 2026-10-21T03:21:02.2755946Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.2756157Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:89:5] 2026-10-21T03:21:02.2756210Z 82 │ 2026-10-21T03:21:02.2756276Z 83 │ useEffect(() => { 2026-10-21T03:21:02.2756348Z ·  ────┬──── 2026-10-21T03:21:02.2756475Z · ╰── This is the containing effect 2026-10-21T03:21:02.2756567Z 84 │ if (routePairingUrl.length === 0) { 2026-10-21T03:21:02.2756633Z 85 │ return; 2026-10-21T03:21:02.2756691Z 86 │ } 2026-10-21T03:21:02.2756742Z 87 │ 2026-10-21T03:21:02.2756861Z 88 │ const { host, code } = parsePairingUrl(routePairingUrl); 2026-10-21T03:21:02.2756930Z 89 │ setHostInput(host); 2026-10-21T03:21:02.2757013Z ·  ──────┬───── 2026-10-21T03:21:02.2757179Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2757248Z 90 │ setCodeInput(code); 2026-10-21T03:21:02.2757303Z ╰──── 2026-10-21T03:21:02.2758107Z  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-21T03:21:02.2758431Z  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-21T03:21:02.2758433Z 2026-10-21T03:21:02.2758692Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.2758865Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:95:7] 2026-10-21T03:21:02.2758920Z 92 │ 2026-10-21T03:21:02.2758986Z 93 │ useEffect(() => { 2026-10-21T03:21:02.2759057Z ·  ────┬──── 2026-10-21T03:21:02.2759187Z · ╰── This is the containing effect 2026-10-21T03:21:02.2759275Z 94 │ if (pairingConnectionError) { 2026-10-21T03:21:02.2759350Z 95 │ setIsSubmitting(false); 2026-10-21T03:21:02.2759431Z ·  ───────┬─────── 2026-10-21T03:21:02.2759603Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2759663Z 96 │ } 2026-10-21T03:21:02.2759716Z ╰──── 2026-10-21T03:21:02.2760322Z  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-21T03:21:02.2760650Z  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-21T03:21:02.2760653Z 2026-10-21T03:21:02.2760891Z ⚠ react(immutability): This value cannot be modified 2026-10-21T03:21:02.2761060Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:111:5] 2026-10-21T03:21:02.2761118Z 107 │ ); 2026-10-21T03:21:02.2761274Z 108 │ const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0); 2026-10-21T03:21:02.2761464Z ·  ─────────┬──────── 2026-10-21T03:21:02.2761664Z · ╰── `separationProgress` originates here 2026-10-21T03:21:02.2761721Z 109 │ 2026-10-21T03:21:02.2761788Z 110 │ useEffect(() => { 2026-10-21T03:21:02.2761969Z 111 │ separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING); 2026-10-21T03:21:02.2762055Z ·  ─────────┬──────── 2026-10-21T03:21:02.2762211Z · ╰── `separationProgress` cannot be modified 2026-10-21T03:21:02.2762322Z 112 │ }, [props.showScrollToEnd, separationProgress]); 2026-10-21T03:21:02.2762379Z ╰──── 2026-10-21T03:21:02.2762646Z  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-21T03:21:02.2762963Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-21T03:21:02.2762968Z 2026-10-21T03:21:02.2763123Z ⚠ react(immutability): This value cannot be modified 2026-10-21T03:21:02.2763289Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-21T03:21:02.2763406Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-21T03:21:02.2763526Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-21T03:21:02.2763606Z ·  ──────┬───── 2026-10-21T03:21:02.2763747Z · ╰── `capsuleWidth` originates here 2026-10-21T03:21:02.2763862Z 130 │ const measuredWidthRef = useRef(null); 2026-10-21T03:21:02.2763985Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-21T03:21:02.2764094Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-21T03:21:02.2764193Z 133 │ if (width === measuredWidthRef.current) { 2026-10-21T03:21:02.2764258Z 134 │ return; 2026-10-21T03:21:02.2764317Z 135 │ } 2026-10-21T03:21:02.2764423Z 136 │ const first = measuredWidthRef.current === null; 2026-10-21T03:21:02.2764515Z 137 │ measuredWidthRef.current = width; 2026-10-21T03:21:02.2764662Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-21T03:21:02.2764739Z ·  ──────┬───── 2026-10-21T03:21:02.2764878Z · ╰── `capsuleWidth` cannot be modified 2026-10-21T03:21:02.2764935Z 139 │ }; 2026-10-21T03:21:02.2764989Z ╰──── 2026-10-21T03:21:02.2765260Z  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-21T03:21:02.2765568Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-21T03:21:02.2765573Z 2026-10-21T03:21:02.2765728Z ⚠ react(immutability): This value cannot be modified 2026-10-21T03:21:02.2765893Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-21T03:21:02.2766011Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-21T03:21:02.2766129Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-21T03:21:02.2766210Z ·  ──────┬───── 2026-10-21T03:21:02.2766412Z · ╰── `capsuleWidth` originates here 2026-10-21T03:21:02.2766559Z 130 │ const measuredWidthRef = useRef(null); 2026-10-21T03:21:02.2766676Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-21T03:21:02.2766780Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-21T03:21:02.2766878Z 133 │ if (width === measuredWidthRef.current) { 2026-10-21T03:21:02.2766942Z 134 │ return; 2026-10-21T03:21:02.2767000Z 135 │ } 2026-10-21T03:21:02.2767105Z 136 │ const first = measuredWidthRef.current === null; 2026-10-21T03:21:02.2767193Z 137 │ measuredWidthRef.current = width; 2026-10-21T03:21:02.2767337Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-21T03:21:02.2767390Z 139 │ }; 2026-10-21T03:21:02.2767482Z 140 │ const hasStatus = props.status !== null; 2026-10-21T03:21:02.2767622Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-21T03:21:02.2767693Z 142 │ useEffect(() => { 2026-10-21T03:21:02.2767760Z 143 │ if (!hasStatus) { 2026-10-21T03:21:02.2767852Z 144 │ measuredWidthRef.current = null; 2026-10-21T03:21:02.2767936Z 145 │ capsuleWidth.value = null; 2026-10-21T03:21:02.2768015Z ·  ──────┬───── 2026-10-21T03:21:02.2768154Z · ╰── `capsuleWidth` cannot be modified 2026-10-21T03:21:02.2768213Z 146 │ } 2026-10-21T03:21:02.2768268Z ╰──── 2026-10-21T03:21:02.2768534Z  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-21T03:21:02.2768845Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-21T03:21:02.2768853Z 2026-10-21T03:21:02.2769054Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-21T03:21:02.2769222Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-21T03:21:02.2769358Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-21T03:21:02.2769428Z 142 │ useEffect(() => { 2026-10-21T03:21:02.2769506Z ·  ───┬─── 2026-10-21T03:21:02.2769730Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-21T03:21:02.2769799Z 143 │ if (!hasStatus) { 2026-10-21T03:21:02.2769889Z 144 │ measuredWidthRef.current = null; 2026-10-21T03:21:02.2769967Z 145 │ capsuleWidth.value = null; 2026-10-21T03:21:02.2770053Z ·  ──────┬───── 2026-10-21T03:21:02.2770203Z · ╰── This modifies `capsuleWidth` 2026-10-21T03:21:02.2770261Z 146 │ } 2026-10-21T03:21:02.2770313Z ╰──── 2026-10-21T03:21:02.2770659Z  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-21T03:21:02.2771017Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-21T03:21:02.2771020Z 2026-10-21T03:21:02.2771221Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-21T03:21:02.2771382Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-21T03:21:02.2771558Z 130 │ const measuredWidthRef = useRef(null); 2026-10-21T03:21:02.2771708Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-21T03:21:02.2771833Z ·  ───────────────┬─────────────── 2026-10-21T03:21:02.2772076Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-21T03:21:02.2772182Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-21T03:21:02.2772283Z 133 │ if (width === measuredWidthRef.current) { 2026-10-21T03:21:02.2772348Z 134 │ return; 2026-10-21T03:21:02.2772406Z 135 │ } 2026-10-21T03:21:02.2772511Z 136 │ const first = measuredWidthRef.current === null; 2026-10-21T03:21:02.2772600Z 137 │ measuredWidthRef.current = width; 2026-10-21T03:21:02.2772752Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-21T03:21:02.2772832Z ·  ──────┬───── 2026-10-21T03:21:02.2772969Z · ╰── This modifies `capsuleWidth` 2026-10-21T03:21:02.2773027Z 139 │ }; 2026-10-21T03:21:02.2773082Z ╰──── 2026-10-21T03:21:02.2773422Z  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-21T03:21:02.2773802Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-21T03:21:02.2773806Z 2026-10-21T03:21:02.2774108Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-21T03:21:02.2774278Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5] 2026-10-21T03:21:02.2774352Z 103 │ .runOnJS(true) 2026-10-21T03:21:02.2774453Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-21T03:21:02.2774544Z ·  ───┬── 2026-10-21T03:21:02.2774986Z · ╰── 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-21T03:21:02.2775123Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-21T03:21:02.2775248Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-21T03:21:02.2775375Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-21T03:21:02.2775451Z 108 │ [props.disabled], 2026-10-21T03:21:02.2775537Z ·  ────────┬─────── 2026-10-21T03:21:02.2775723Z · ╰── This dependency list is missing values used by the callback 2026-10-21T03:21:02.2775780Z 109 │ ); 2026-10-21T03:21:02.2775833Z ╰──── 2026-10-21T03:21:02.2776043Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-21T03:21:02.2776359Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2776362Z 2026-10-21T03:21:02.2776620Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.2776863Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:262:5] 2026-10-21T03:21:02.2776962Z 260 │ .join("|"); 2026-10-21T03:21:02.2777030Z 261 │ useEffect(() => { 2026-10-21T03:21:02.2777102Z ·  ────┬──── 2026-10-21T03:21:02.2777235Z · ╰── This is the containing effect 2026-10-21T03:21:02.2777299Z 262 │ stop(); 2026-10-21T03:21:02.2777371Z ·  ──┬─ 2026-10-21T03:21:02.2777533Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2777602Z 263 │ }, [orderVersion]); 2026-10-21T03:21:02.2777656Z ╰──── 2026-10-21T03:21:02.2778264Z  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-21T03:21:02.2778591Z  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-21T03:21:02.2778596Z 2026-10-21T03:21:02.2778743Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2778904Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9] 2026-10-21T03:21:02.2778984Z 95 │ const latest = useRef(props); 2026-10-21T03:21:02.2779056Z 96 │ latest.current = props; 2026-10-21T03:21:02.2779161Z ·  ───┬──────┬─── 2026-10-21T03:21:02.2779340Z · │ ╰── Cannot update ref value during render 2026-10-21T03:21:02.2779461Z · ╰── This value is a ref 2026-10-21T03:21:02.2779537Z 97 │ const gesture = useMemo( 2026-10-21T03:21:02.2779589Z ╰──── 2026-10-21T03:21:02.2780059Z  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-21T03:21:02.2780352Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2780354Z 2026-10-21T03:21:02.2780499Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2780661Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18] 2026-10-21T03:21:02.2780779Z 103 │ .runOnJS(true) 2026-10-21T03:21:02.2780903Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-21T03:21:02.2781020Z ·  ───────────────┬────────────── 2026-10-21T03:21:02.2781219Z · ╰── Passing a ref to a function may read its value during render 2026-10-21T03:21:02.2781350Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-21T03:21:02.2781404Z ╰──── 2026-10-21T03:21:02.2781873Z  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-21T03:21:02.2782233Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2782264Z 2026-10-21T03:21:02.2782408Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2782568Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19] 2026-10-21T03:21:02.2782667Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-21T03:21:02.2782799Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-21T03:21:02.2782938Z ·  ──────────────────────────┬───────────────────────── 2026-10-21T03:21:02.2783144Z · ╰── Passing a ref to a function may read its value during render 2026-10-21T03:21:02.2783271Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-21T03:21:02.2783332Z ╰──── 2026-10-21T03:21:02.2783797Z  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-21T03:21:02.2784084Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2784090Z 2026-10-21T03:21:02.2784231Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2784391Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16] 2026-10-21T03:21:02.2784523Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-21T03:21:02.2784650Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-21T03:21:02.2784788Z ·  ──────────────────────────┬───────────────────────── 2026-10-21T03:21:02.2784992Z · ╰── Passing a ref to a function may read its value during render 2026-10-21T03:21:02.2785120Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-21T03:21:02.2785174Z ╰──── 2026-10-21T03:21:02.2785635Z  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-21T03:21:02.2785982Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2786011Z 2026-10-21T03:21:02.2786159Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2786320Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21] 2026-10-21T03:21:02.2786445Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-21T03:21:02.2786567Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-21T03:21:02.2786702Z ·  ───────────────────────┬────────────────────── 2026-10-21T03:21:02.2786908Z · ╰── Passing a ref to a function may read its value during render 2026-10-21T03:21:02.2786981Z 108 │ [props.disabled], 2026-10-21T03:21:02.2787032Z ╰──── 2026-10-21T03:21:02.2787500Z  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-21T03:21:02.2787796Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2787799Z 2026-10-21T03:21:02.2787942Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2788104Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:250:9] 2026-10-21T03:21:02.2788216Z 249 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-21T03:21:02.2788325Z 250 │ latest.current = { rows, planners, moveThread }; 2026-10-21T03:21:02.2788431Z ·  ───┬──────┬─── 2026-10-21T03:21:02.2788614Z · │ ╰── Cannot update ref value during render 2026-10-21T03:21:02.2788731Z · ╰── This value is a ref 2026-10-21T03:21:02.2788788Z 251 │ 2026-10-21T03:21:02.2788842Z ╰──── 2026-10-21T03:21:02.2789306Z  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-21T03:21:02.2789595Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2789600Z 2026-10-21T03:21:02.2789742Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2789912Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:248:22] 2026-10-21T03:21:02.2790036Z 247 │ const [preview, setPreview] = useState(null); 2026-10-21T03:21:02.2790153Z 248 │ const translateY = useRef(new Animated.Value(0)).current; 2026-10-21T03:21:02.2790275Z ·  ──────────────────┬────────────────── 2026-10-21T03:21:02.2790442Z · ╰── Cannot access ref value during render 2026-10-21T03:21:02.2790553Z 249 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-21T03:21:02.2790606Z ╰──── 2026-10-21T03:21:02.2791203Z  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-21T03:21:02.2791527Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2791529Z 2026-10-21T03:21:02.2791673Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2791877Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:248:22] 2026-10-21T03:21:02.2792046Z 247 │ const [preview, setPreview] = useState(null); 2026-10-21T03:21:02.2792161Z 248 │ const translateY = useRef(new Animated.Value(0)).current; 2026-10-21T03:21:02.2792286Z ·  ──────────────────┬────────────────── 2026-10-21T03:21:02.2792452Z · ╰── Cannot access ref value during render 2026-10-21T03:21:02.2792568Z 249 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-21T03:21:02.2792622Z ╰──── 2026-10-21T03:21:02.2793085Z  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-21T03:21:02.2793372Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2793375Z 2026-10-21T03:21:02.2793518Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2793678Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:248:22] 2026-10-21T03:21:02.2793796Z 247 │ const [preview, setPreview] = useState(null); 2026-10-21T03:21:02.2793912Z 248 │ const translateY = useRef(new Animated.Value(0)).current; 2026-10-21T03:21:02.2794033Z ·  ──────────────────┬────────────────── 2026-10-21T03:21:02.2794196Z · ╰── Cannot access ref value during render 2026-10-21T03:21:02.2794306Z 249 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-21T03:21:02.2794359Z ╰──── 2026-10-21T03:21:02.2794818Z  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-21T03:21:02.2795111Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2795116Z 2026-10-21T03:21:02.2795258Z ⚠ react(refs): Cannot access refs during render 2026-10-21T03:21:02.2795418Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:248:22] 2026-10-21T03:21:02.2795538Z 247 │ const [preview, setPreview] = useState(null); 2026-10-21T03:21:02.2795653Z 248 │ const translateY = useRef(new Animated.Value(0)).current; 2026-10-21T03:21:02.2795775Z ·  ──────────────────┬────────────────── 2026-10-21T03:21:02.2795937Z · ╰── Cannot access ref value during render 2026-10-21T03:21:02.2796048Z 249 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-21T03:21:02.2796125Z ╰──── 2026-10-21T03:21:02.2796694Z  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-21T03:21:02.2797015Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-21T03:21:02.2797020Z 2026-10-21T03:21:02.2797235Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-21T03:21:02.2797395Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:262:5] 2026-10-21T03:21:02.2797461Z 261 │ useEffect(() => { 2026-10-21T03:21:02.2797524Z 262 │ stop(); 2026-10-21T03:21:02.2797594Z ·  ──┬─ 2026-10-21T03:21:02.2797726Z · ╰── Missing dependency `stop` 2026-10-21T03:21:02.2797850Z 263 │ }, [orderVersion]); 2026-10-21T03:21:02.2797929Z ·  ──────┬───── 2026-10-21T03:21:02.2798079Z · ╰── Unnecessary dependency `orderVersion` 2026-10-21T03:21:02.2798142Z 264 │ useEffect( 2026-10-21T03:21:02.2798196Z ╰──── 2026-10-21T03:21:02.2798618Z  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-21T03:21:02.2798931Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2798934Z 2026-10-21T03:21:02.2799110Z ⚠ react(purity): Cannot call impure function during render 2026-10-21T03:21:02.2799273Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:325:16] 2026-10-21T03:21:02.2799342Z 324 │ update(0); 2026-10-21T03:21:02.2799422Z 325 │ let last = performance.now(); 2026-10-21T03:21:02.2799521Z ·  ────────┬──────── 2026-10-21T03:21:02.2799664Z · ╰── Cannot call impure function 2026-10-21T03:21:02.2799735Z 326 │ const tick = () => { 2026-10-21T03:21:02.2799787Z ╰──── 2026-10-21T03:21:02.2800089Z  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-21T03:21:02.2800618Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-21T03:21:02.2800676Z 2026-10-21T03:21:02.2801036Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-21T03:21:02.2801313Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15] 2026-10-21T03:21:02.2801410Z  98 │ () => 2026-10-21T03:21:02.2801524Z  99 │ Gesture.Pan() 2026-10-21T03:21:02.2801652Z ·  ─┬─ 2026-10-21T03:21:02.2801875Z · ╰── `Pan` may be a component 2026-10-21T03:21:02.2802008Z 100 │ .enabled(!props.disabled) 2026-10-21T03:21:02.2802101Z ╰──── 2026-10-21T03:21:02.2802600Z  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-21T03:21:02.2803385Z  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-21T03:21:02.2803395Z 2026-10-21T03:21:02.2803681Z ⚠ react(immutability): This value cannot be modified 2026-10-21T03:21:02.2803964Z ╭─[apps/mobile/src/features/connection/ConnectionStatusDot.tsx:58:7] 2026-10-21T03:21:02.2804130Z 53 │ function usePulseAnimation(pulse: boolean) { 2026-10-21T03:21:02.2804290Z 54 │ const pulseProgress = useSharedValue(0); 2026-10-21T03:21:02.2804423Z ·  ──────┬────── 2026-10-21T03:21:02.2804653Z · ╰── `pulseProgress` originates here 2026-10-21T03:21:02.2804746Z 55 │ 2026-10-21T03:21:02.2804869Z 56 │ useEffect(() => { 2026-10-21T03:21:02.2804978Z 57 │ if (pulse) { 2026-10-21T03:21:02.2805129Z 58 │ pulseProgress.value = withRepeat( 2026-10-21T03:21:02.2805266Z ·  ──────┬────── 2026-10-21T03:21:02.2805507Z · ╰── `pulseProgress` cannot be modified 2026-10-21T03:21:02.2805624Z 59 │ withTiming(1, { 2026-10-21T03:21:02.2805714Z ╰──── 2026-10-21T03:21:02.2806193Z  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-21T03:21:02.2806754Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-21T03:21:02.2806758Z 2026-10-21T03:21:02.2807220Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.2807496Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:57:5] 2026-10-21T03:21:02.2807589Z 55 │ 2026-10-21T03:21:02.2807700Z 56 │ useEffect(() => { 2026-10-21T03:21:02.2807816Z ·  ────┬──── 2026-10-21T03:21:02.2808039Z · ╰── This is the containing effect 2026-10-21T03:21:02.2808163Z 57 │ setDecodedSize(null); 2026-10-21T03:21:02.2808295Z ·  ───────┬────── 2026-10-21T03:21:02.2808587Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2808708Z 58 │ }, [props.sourceKey]); 2026-10-21T03:21:02.2808799Z ╰──── 2026-10-21T03:21:02.2810019Z  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-21T03:21:02.2810653Z  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-21T03:21:02.2810657Z 2026-10-21T03:21:02.2811138Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.2811403Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5] 2026-10-21T03:21:02.2811493Z 59 │ 2026-10-21T03:21:02.2811605Z 60 │ useEffect(() => { 2026-10-21T03:21:02.2811719Z ·  ────┬──── 2026-10-21T03:21:02.2811944Z · ╰── This is the containing effect 2026-10-21T03:21:02.2812068Z 61 │ setFailedUri(null); 2026-10-21T03:21:02.2812194Z ·  ──────┬───── 2026-10-21T03:21:02.2812481Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2812596Z 62 │ }, [props.uri]); 2026-10-21T03:21:02.2812689Z ╰──── 2026-10-21T03:21:02.2813794Z  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-21T03:21:02.2814328Z  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-21T03:21:02.2814336Z 2026-10-21T03:21:02.2814694Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-21T03:21:02.2814950Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10] 2026-10-21T03:21:02.2815157Z 6 │ import { parse, SvgAst, type JsxAST } from "react-native-svg"; 2026-10-21T03:21:02.2815453Z 7 │ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native"; 2026-10-21T03:21:02.2815594Z ·  ────────┬──────── 2026-10-21T03:21:02.2815841Z · ╰── 'ActivityIndicator' is imported here 2026-10-21T03:21:02.2815928Z 8 │ 2026-10-21T03:21:02.2816018Z ╰──── 2026-10-21T03:21:02.2816155Z  help: Consider removing this import. 2026-10-21T03:21:02.2816163Z 2026-10-21T03:21:02.2816450Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-21T03:21:02.2816703Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7] 2026-10-21T03:21:02.2816819Z 57 │ setDecodedSize(null); 2026-10-21T03:21:02.2816927Z 58 │ }, [props.sourceKey]); 2026-10-21T03:21:02.2817061Z ·  ───────┬─────── 2026-10-21T03:21:02.2817317Z · ╰── Unnecessary dependency `props.sourceKey` 2026-10-21T03:21:02.2817408Z 59 │ 2026-10-21T03:21:02.2817494Z ╰──── 2026-10-21T03:21:02.2818001Z  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-21T03:21:02.2818654Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2818815Z 2026-10-21T03:21:02.2819027Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-21T03:21:02.2819186Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7] 2026-10-21T03:21:02.2819257Z 61 │ setFailedUri(null); 2026-10-21T03:21:02.2819327Z 62 │ }, [props.uri]); 2026-10-21T03:21:02.2819407Z ·  ────┬──── 2026-10-21T03:21:02.2819552Z · ╰── Unnecessary dependency `props.uri` 2026-10-21T03:21:02.2819607Z 63 │ 2026-10-21T03:21:02.2819662Z ╰──── 2026-10-21T03:21:02.2819969Z  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-21T03:21:02.2820295Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2820298Z 2026-10-21T03:21:02.2820561Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.2820775Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:84:5] 2026-10-21T03:21:02.2820837Z 79 │ 2026-10-21T03:21:02.2820907Z 80 │ useEffect(() => { 2026-10-21T03:21:02.2820979Z ·  ────┬──── 2026-10-21T03:21:02.2821112Z · ╰── This is the containing effect 2026-10-21T03:21:02.2821283Z 81 │ if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return; 2026-10-21T03:21:02.2821398Z 82 │ const branchName = initialProjectRef.branch; 2026-10-21T03:21:02.2821465Z 83 │ let active = true; 2026-10-21T03:21:02.2821567Z 84 │ setPendingCheckouts((count) => count + 1); 2026-10-21T03:21:02.2821654Z ·  ─────────┬───────── 2026-10-21T03:21:02.2821830Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2821987Z 85 │ // Serialize replacements: ignoring a stale result cannot undo its Git mutation. 2026-10-21T03:21:02.2822041Z ╰──── 2026-10-21T03:21:02.2822661Z  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-21T03:21:02.2822995Z  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-21T03:21:02.2822998Z 2026-10-21T03:21:02.2823246Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-21T03:21:02.2823405Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:289:50] 2026-10-21T03:21:02.2823473Z 288 │ return ( 2026-10-21T03:21:02.2823615Z 289 │ 2026-10-21T03:21:02.2823740Z ·  ───────────── 2026-10-21T03:21:02.2823811Z 290 │ {props.children} 2026-10-21T03:21:02.2823867Z ╰──── 2026-10-21T03:21:02.2824162Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-21T03:21:02.2824338Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-21T03:21:02.2824341Z 2026-10-21T03:21:02.2824584Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-21T03:21:02.2824741Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:653:44] 2026-10-21T03:21:02.2824805Z 652 │ return ( 2026-10-21T03:21:02.2824931Z 653 │ 2026-10-21T03:21:02.2825055Z ·  ───────────── 2026-10-21T03:21:02.2825124Z 654 │ {props.children} 2026-10-21T03:21:02.2825179Z ╰──── 2026-10-21T03:21:02.2825408Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-21T03:21:02.2825551Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-21T03:21:02.2825554Z 2026-10-21T03:21:02.2825791Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-21T03:21:02.2825955Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1456:55] 2026-10-21T03:21:02.2826021Z 1455 │ return ( 2026-10-21T03:21:02.2826191Z 1456 │ 2026-10-21T03:21:02.2826324Z ·  ──────────────────── 2026-10-21T03:21:02.2826428Z 1457 │ { 2026-10-21T03:21:02.2829679Z ·  ────┬──── 2026-10-21T03:21:02.2829813Z · ╰── This is the containing effect 2026-10-21T03:21:02.2829899Z 487 │ setKeyboardStateSuspect(false); 2026-10-21T03:21:02.2829994Z ·  ───────────┬─────────── 2026-10-21T03:21:02.2830171Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2830281Z 488 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-21T03:21:02.2830333Z ╰──── 2026-10-21T03:21:02.2831042Z  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-21T03:21:02.2831376Z  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-21T03:21:02.2831378Z 2026-10-21T03:21:02.2831641Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.2831819Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:838:7] 2026-10-21T03:21:02.2832074Z 835 │ const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0); 2026-10-21T03:21:02.2832186Z 836 │ useEffect(() => { 2026-10-21T03:21:02.2832271Z ·  ────┬──── 2026-10-21T03:21:02.2832405Z · ╰── This is the containing effect 2026-10-21T03:21:02.2832564Z 837 │ if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) { 2026-10-21T03:21:02.2832683Z 838 │ setLastKnownKeyboardHeight(liveKeyboardHeight); 2026-10-21T03:21:02.2832785Z ·  ─────────────┬──────────── 2026-10-21T03:21:02.2832964Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2833021Z 839 │ } 2026-10-21T03:21:02.2833077Z ╰──── 2026-10-21T03:21:02.2833759Z  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-21T03:21:02.2834143Z  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-21T03:21:02.2834145Z 2026-10-21T03:21:02.2834406Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.2834563Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1081:5] 2026-10-21T03:21:02.2834622Z 1077 │ 2026-10-21T03:21:02.2834698Z 1078 │ useLayoutEffect(() => { 2026-10-21T03:21:02.2834785Z ·  ───────┬─────── 2026-10-21T03:21:02.2834923Z · ╰── This is the containing effect 2026-10-21T03:21:02.2835046Z 1079 │ selectedThreadKeyRef.current = selectedThreadKey; 2026-10-21T03:21:02.2835185Z 1080 │ // A replaced or unmounted native editor may not emit a blur event. 2026-10-21T03:21:02.2835268Z 1081 │ setComposerFocused(false); 2026-10-21T03:21:02.2835354Z ·  ─────────┬──────── 2026-10-21T03:21:02.2835531Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2835624Z 1082 │ }, [selectedThreadKey, showContent]); 2026-10-21T03:21:02.2835682Z ╰──── 2026-10-21T03:21:02.2836297Z  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-21T03:21:02.2836630Z  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-21T03:21:02.2836632Z 2026-10-21T03:21:02.2836892Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.2837051Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1085:5] 2026-10-21T03:21:02.2837108Z 1083 │ 2026-10-21T03:21:02.2837175Z 1084 │ useEffect(() => { 2026-10-21T03:21:02.2837252Z ·  ────┬──── 2026-10-21T03:21:02.2837386Z · ╰── This is the containing effect 2026-10-21T03:21:02.2837466Z 1085 │ setAnchorMessageId(null); 2026-10-21T03:21:02.2837555Z ·  ─────────┬──────── 2026-10-21T03:21:02.2837730Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2837964Z 1086 │ setSubmittedMessageId(null); 2026-10-21T03:21:02.2838021Z ╰──── 2026-10-21T03:21:02.2838621Z  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-21T03:21:02.2838948Z  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-21T03:21:02.2838950Z 2026-10-21T03:21:02.2839252Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-21T03:21:02.2839457Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:488:7] 2026-10-21T03:21:02.2839545Z 487 │ setKeyboardStateSuspect(false); 2026-10-21T03:21:02.2839646Z 488 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-21T03:21:02.2839787Z ·  ────────┬──────── ─────────┬──────── 2026-10-21T03:21:02.2839999Z · │ ╰── Unnecessary dependency `liveKeyboardHeight` 2026-10-21T03:21:02.2840161Z · ╰── Unnecessary dependency `isKeyboardVisible` 2026-10-21T03:21:02.2840290Z 489 │ const handleOwnedInputFocusChange = (focused: boolean) => { 2026-10-21T03:21:02.2840345Z ╰──── 2026-10-21T03:21:02.2840650Z  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-21T03:21:02.2841037Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2841040Z 2026-10-21T03:21:02.2841244Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-21T03:21:02.2841397Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1031:7] 2026-10-21T03:21:02.2841488Z 1030 │ userInputInsetProgress.set(1); 2026-10-21T03:21:02.2841657Z 1031 │ }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]); 2026-10-21T03:21:02.2841755Z ·  ────────────┬─────────── 2026-10-21T03:21:02.2841938Z · ╰── Unnecessary dependency `activeUserInputRequestId` 2026-10-21T03:21:02.2842051Z 1032 │ const showContent = props.showContent ?? true; 2026-10-21T03:21:02.2842106Z ╰──── 2026-10-21T03:21:02.2842405Z  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-21T03:21:02.2842717Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2842722Z 2026-10-21T03:21:02.2842925Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-21T03:21:02.2843085Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1082:26] 2026-10-21T03:21:02.2843171Z 1081 │ setComposerFocused(false); 2026-10-21T03:21:02.2843265Z 1082 │ }, [selectedThreadKey, showContent]); 2026-10-21T03:21:02.2843366Z ·  ─────┬───── 2026-10-21T03:21:02.2843529Z · ╰── Unnecessary dependency `showContent` 2026-10-21T03:21:02.2843592Z 1083 │ 2026-10-21T03:21:02.2843651Z ╰──── 2026-10-21T03:21:02.2843944Z  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-21T03:21:02.2844257Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2844260Z 2026-10-21T03:21:02.2844525Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-21T03:21:02.2844716Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1091:15] 2026-10-21T03:21:02.2844788Z 1090 │ freeze.set(false); 2026-10-21T03:21:02.2844872Z 1091 │ }, [freeze, selectedThreadKey]); 2026-10-21T03:21:02.2844970Z ·  ────────┬──────── 2026-10-21T03:21:02.2845137Z · ╰── Unnecessary dependency `selectedThreadKey` 2026-10-21T03:21:02.2845193Z 1092 │ 2026-10-21T03:21:02.2845248Z ╰──── 2026-10-21T03:21:02.2845541Z  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-21T03:21:02.2845861Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2845867Z 2026-10-21T03:21:02.2846027Z ⚠ react(immutability): This value cannot be modified 2026-10-21T03:21:02.2846181Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:919:5] 2026-10-21T03:21:02.2846295Z 914 │ const composerPopoverHeight = useSharedValue(0); 2026-10-21T03:21:02.2846403Z 915 │ const floatingControlCoverage = useSharedValue( 2026-10-21T03:21:02.2846500Z ·  ───────────┬─────────── 2026-10-21T03:21:02.2846663Z · ╰── `floatingControlCoverage` originates here 2026-10-21T03:21:02.2846792Z 916 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-21T03:21:02.2846850Z 917 │ ); 2026-10-21T03:21:02.2846919Z 918 │ useEffect(() => { 2026-10-21T03:21:02.2847029Z 919 │ floatingControlCoverage.value = withTiming( 2026-10-21T03:21:02.2847127Z ·  ───────────┬─────────── 2026-10-21T03:21:02.2847292Z · ╰── `floatingControlCoverage` cannot be modified 2026-10-21T03:21:02.2847422Z 920 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-21T03:21:02.2847473Z ╰──── 2026-10-21T03:21:02.2847745Z  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-21T03:21:02.2848056Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-21T03:21:02.2848058Z 2026-10-21T03:21:02.2848219Z ⚠ react(immutability): This value cannot be modified 2026-10-21T03:21:02.2848378Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:937:7] 2026-10-21T03:21:02.2848612Z 927 │ const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null; 2026-10-21T03:21:02.2848812Z 928 │ const combinedContentInsetEndAdjustment = useSharedValue( 2026-10-21T03:21:02.2848988Z ·  ────────────────┬──────────────── 2026-10-21T03:21:02.2849317Z · ╰── `combinedContentInsetEndAdjustment` originates here 2026-10-21T03:21:02.2849532Z 929 │ Math.max(0, estimatedOverlayHeight - nativeInsetOvercount), 2026-10-21T03:21:02.2849630Z 930 │ ); 2026-10-21T03:21:02.2849748Z 931 │ useAnimatedReaction( 2026-10-21T03:21:02.2849849Z 932 │ () => 2026-10-21T03:21:02.2849997Z 933 │ contentInsetEndAdjustment.value + 2026-10-21T03:21:02.2850251Z 934 │ floatingControlCoverage.value + 2026-10-21T03:21:02.2850641Z 935 │ (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0), 2026-10-21T03:21:02.2850795Z 936 │ (value) => { 2026-10-21T03:21:02.2850944Z 937 │ combinedContentInsetEndAdjustment.value = value; 2026-10-21T03:21:02.2851055Z ·  ────────────────┬──────────────── 2026-10-21T03:21:02.2851251Z · ╰── `combinedContentInsetEndAdjustment` cannot be modified 2026-10-21T03:21:02.2851311Z 938 │ }, 2026-10-21T03:21:02.2851364Z ╰──── 2026-10-21T03:21:02.2851633Z  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-21T03:21:02.2851950Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-21T03:21:02.2851956Z 2026-10-21T03:21:02.2852219Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.2852386Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:282:5] 2026-10-21T03:21:02.2852509Z 280 │ const [snoozeWakeTick, bumpSnoozeWakeTick] = useState(0); 2026-10-21T03:21:02.2852579Z 281 │ useEffect(() => { 2026-10-21T03:21:02.2852657Z ·  ────┬──── 2026-10-21T03:21:02.2852787Z · ╰── This is the containing effect 2026-10-21T03:21:02.2852879Z 282 │ setNow(new Date().toISOString()); 2026-10-21T03:21:02.2852952Z ·  ───┬── 2026-10-21T03:21:02.2853124Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2853266Z 283 │ const id = setInterval(() => setNow(new Date().toISOString()), 60_000); 2026-10-21T03:21:02.2853322Z ╰──── 2026-10-21T03:21:02.2853925Z  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-21T03:21:02.2854254Z  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-21T03:21:02.2854256Z 2026-10-21T03:21:02.2854460Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-21T03:21:02.2854631Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:362:25] 2026-10-21T03:21:02.2854769Z 361 │ // range) the boundary string is identical and the chain would die. 2026-10-21T03:21:02.2854864Z 362 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-21T03:21:02.2854968Z ·  ───────┬────── 2026-10-21T03:21:02.2855131Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-21T03:21:02.2855247Z 363 │ const listItems = ((): readonly SidebarListItem[] => { 2026-10-21T03:21:02.2855301Z ╰──── 2026-10-21T03:21:02.2855596Z  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-21T03:21:02.2855977Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2856011Z 2026-10-21T03:21:02.2856182Z ⚠ react(purity): Cannot call impure function during render 2026-10-21T03:21:02.2856349Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:353:53] 2026-10-21T03:21:02.2856437Z 352 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-21T03:21:02.2856598Z 353 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-21T03:21:02.2856718Z ·  ─────┬──── 2026-10-21T03:21:02.2856889Z · ╰── Cannot call impure function 2026-10-21T03:21:02.2856972Z 354 │ const id = setTimeout(() => { 2026-10-21T03:21:02.2857025Z ╰──── 2026-10-21T03:21:02.2857316Z  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-21T03:21:02.2857619Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-21T03:21:02.2857622Z 2026-10-21T03:21:02.2857846Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-21T03:21:02.2857985Z ╭─[apps/mobile/src/state/use-model-option-memory.ts:21:7] 2026-10-21T03:21:02.2858053Z 20 │ [instanceId]: { 2026-10-21T03:21:02.2858134Z 21 │ ...(state[instanceId] ?? {}), 2026-10-21T03:21:02.2858238Z ·  ──────────────────────────── 2026-10-21T03:21:02.2858310Z 22 │ [model]: options, 2026-10-21T03:21:02.2858370Z ╰──── 2026-10-21T03:21:02.2858640Z  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-21T03:21:02.2858642Z 2026-10-21T03:21:02.2858903Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.2859083Z ╭─[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:57:5] 2026-10-21T03:21:02.2859140Z 55 │ 2026-10-21T03:21:02.2859204Z 56 │ useEffect(() => { 2026-10-21T03:21:02.2859277Z ·  ────┬──── 2026-10-21T03:21:02.2859410Z · ╰── This is the containing effect 2026-10-21T03:21:02.2859492Z 57 │ setMountedModes((current) => { 2026-10-21T03:21:02.2859570Z ·  ───────┬─────── 2026-10-21T03:21:02.2859813Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2859928Z 58 │ if (current.has(props.mode)) { 2026-10-21T03:21:02.2859982Z ╰──── 2026-10-21T03:21:02.2860578Z  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-21T03:21:02.2860946Z  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-21T03:21:02.2860949Z 2026-10-21T03:21:02.2861156Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-21T03:21:02.2861300Z ╭─[apps/mobile/src/state/use-thread-outbox-drain.ts:1315:5] 2026-10-21T03:21:02.2861383Z 1314 │ queuedMessagesByThreadKey, 2026-10-21T03:21:02.2861447Z 1315 │ retryTick, 2026-10-21T03:21:02.2861525Z ·  ────┬──── 2026-10-21T03:21:02.2861665Z · ╰── Unnecessary dependency `retryTick` 2026-10-21T03:21:02.2861740Z 1316 │ restoreQueuedMessage, 2026-10-21T03:21:02.2861792Z ╰──── 2026-10-21T03:21:02.2862087Z  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-21T03:21:02.2862398Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2862406Z 2026-10-21T03:21:02.2862609Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-21T03:21:02.2862726Z ╭─[apps/mobile/src/state/thread-order.ts:29:7] 2026-10-21T03:21:02.2862800Z 28 │ getPendingThreadOrder(); 2026-10-21T03:21:02.2862883Z 29 │ }, [nowMinute, snoozeWakeTick]); 2026-10-21T03:21:02.2863008Z ·  ────┬──── ───────┬────── 2026-10-21T03:21:02.2863197Z · │ ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-21T03:21:02.2863332Z · ╰── Unnecessary dependency `nowMinute` 2026-10-21T03:21:02.2863401Z 30 │ return pending; 2026-10-21T03:21:02.2863455Z ╰──── 2026-10-21T03:21:02.2863755Z  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-21T03:21:02.2864066Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2864069Z 2026-10-21T03:21:02.2864254Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-21T03:21:02.2864392Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:590:9] 2026-10-21T03:21:02.2864455Z 589 │ }; 2026-10-21T03:21:02.2864569Z 590 │ }, [props.environmentId, attachment.id, httpBaseUrl]), 2026-10-21T03:21:02.2864753Z ·  ─────────┬───────── ──────┬────── ─────┬───── 2026-10-21T03:21:02.2865056Z · │ │ ╰── Unnecessary dependency `httpBaseUrl` 2026-10-21T03:21:02.2865282Z · │ ╰── Unnecessary dependency `attachment.id` 2026-10-21T03:21:02.2865449Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-21T03:21:02.2865507Z 591 │ ); 2026-10-21T03:21:02.2865562Z ╰──── 2026-10-21T03:21:02.2865876Z  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-21T03:21:02.2866191Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2866199Z 2026-10-21T03:21:02.2866457Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.2866597Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:1845:5] 2026-10-21T03:21:02.2866654Z 1843 │ ); 2026-10-21T03:21:02.2866725Z 1844 │ useEffect(() => { 2026-10-21T03:21:02.2866796Z ·  ────┬──── 2026-10-21T03:21:02.2866928Z · ╰── This is the containing effect 2026-10-21T03:21:02.2867004Z 1845 │ setExpandedVideo(null); 2026-10-21T03:21:02.2867088Z ·  ────────┬─────── 2026-10-21T03:21:02.2867256Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2867331Z 1846 │ setExpandedFile(null); 2026-10-21T03:21:02.2867393Z ╰──── 2026-10-21T03:21:02.2867993Z  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-21T03:21:02.2868312Z  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-21T03:21:02.2868314Z 2026-10-21T03:21:02.2868544Z ⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used. 2026-10-21T03:21:02.2868680Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:64:10] 2026-10-21T03:21:02.2868825Z 63 │ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets"; 2026-10-21T03:21:02.2868971Z 64 │ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks"; 2026-10-21T03:21:02.2869067Z ·  ───────────┬─────────── 2026-10-21T03:21:02.2869232Z · ╰── 'isMarkdownFileLinkLabel' is imported here 2026-10-21T03:21:02.2869392Z 65 │ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments"; 2026-10-21T03:21:02.2869448Z ╰──── 2026-10-21T03:21:02.2869548Z  help: Consider removing this import. 2026-10-21T03:21:02.2869553Z 2026-10-21T03:21:02.2869761Z ⚠ eslint(no-unused-vars): Identifier 'createContext' is imported but never used. 2026-10-21T03:21:02.2869894Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:90:3] 2026-10-21T03:21:02.2869956Z 89 │ import { 2026-10-21T03:21:02.2870085Z 90 │ createContext, 2026-10-21T03:21:02.2870203Z ·  ──────┬────── 2026-10-21T03:21:02.2870342Z · ╰── 'createContext' is imported here 2026-10-21T03:21:02.2870401Z 91 │ memo, 2026-10-21T03:21:02.2870452Z ╰──── 2026-10-21T03:21:02.2870553Z  help: Consider removing this import. 2026-10-21T03:21:02.2870555Z 2026-10-21T03:21:02.2870824Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-21T03:21:02.2870960Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:104:3] 2026-10-21T03:21:02.2871021Z 103 │ import { 2026-10-21T03:21:02.2871090Z 104 │ ActivityIndicator, 2026-10-21T03:21:02.2871174Z ·  ────────┬──────── 2026-10-21T03:21:02.2871327Z · ╰── 'ActivityIndicator' is imported here 2026-10-21T03:21:02.2871387Z 105 │ Image, 2026-10-21T03:21:02.2871444Z ╰──── 2026-10-21T03:21:02.2871542Z  help: Consider removing this import. 2026-10-21T03:21:02.2871545Z 2026-10-21T03:21:02.2871746Z ⚠ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used. 2026-10-21T03:21:02.2871924Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:111:3] 2026-10-21T03:21:02.2874954Z 110 │ Pressable, 2026-10-21T03:21:02.2875020Z 111 │ ScrollView, 2026-10-21T03:21:02.2875097Z ·  ─────┬──── 2026-10-21T03:21:02.2875232Z · ╰── 'ScrollView' is imported here 2026-10-21T03:21:02.2875300Z 112 │ StyleSheet, 2026-10-21T03:21:02.2875353Z ╰──── 2026-10-21T03:21:02.2875455Z  help: Consider removing this import. 2026-10-21T03:21:02.2875465Z 2026-10-21T03:21:02.2875665Z ⚠ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used. 2026-10-21T03:21:02.2875803Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:113:11] 2026-10-21T03:21:02.2875867Z 112 │ StyleSheet, 2026-10-21T03:21:02.2875937Z 113 │ Text as NativeText, 2026-10-21T03:21:02.2876016Z ·  ─────┬──── 2026-10-21T03:21:02.2876156Z · ╰── 'NativeText' is imported here 2026-10-21T03:21:02.2876223Z 114 │ type ColorValue, 2026-10-21T03:21:02.2876275Z ╰──── 2026-10-21T03:21:02.2876370Z  help: Consider removing this import. 2026-10-21T03:21:02.2876373Z 2026-10-21T03:21:02.2876588Z ⚠ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used. 2026-10-21T03:21:02.2876729Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:135:10] 2026-10-21T03:21:02.2876869Z 134 │ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic"; 2026-10-21T03:21:02.2877000Z 135 │ import { tryOpenExternalUrl } from "../../lib/openExternalUrl"; 2026-10-21T03:21:02.2877087Z ·  ─────────┬──────── 2026-10-21T03:21:02.2877242Z · ╰── 'tryOpenExternalUrl' is imported here 2026-10-21T03:21:02.2877392Z 136 │ import { downloadAndShareAttachment } from "../../lib/attachmentDownload"; 2026-10-21T03:21:02.2877445Z ╰──── 2026-10-21T03:21:02.2877541Z  help: Consider removing this import. 2026-10-21T03:21:02.2877544Z 2026-10-21T03:21:02.2878125Z ⚠ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used. 2026-10-21T03:21:02.2878382Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:138:10] 2026-10-21T03:21:02.2878572Z 137 │ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks"; 2026-10-21T03:21:02.2878697Z 138 │ import { faviconUrlForOrigin } from "@t3tools/shared/favicon"; 2026-10-21T03:21:02.2878789Z ·  ─────────┬───────── 2026-10-21T03:21:02.2878943Z · ╰── 'faviconUrlForOrigin' is imported here 2026-10-21T03:21:02.2879004Z 139 │ import { 2026-10-21T03:21:02.2879055Z ╰──── 2026-10-21T03:21:02.2879154Z  help: Consider removing this import. 2026-10-21T03:21:02.2879158Z 2026-10-21T03:21:02.2879377Z ⚠ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used. 2026-10-21T03:21:02.2879516Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:152:10] 2026-10-21T03:21:02.2879666Z 151 │ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile"; 2026-10-21T03:21:02.2879804Z 152 │ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer"; 2026-10-21T03:21:02.2879893Z ·  ────────┬─────── 2026-10-21T03:21:02.2880043Z · ╰── 'MediaVideoPlayer' is imported here 2026-10-21T03:21:02.2880181Z 153 │ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia"; 2026-10-21T03:21:02.2880234Z ╰──── 2026-10-21T03:21:02.2880330Z  help: Consider removing this import. 2026-10-21T03:21:02.2880333Z 2026-10-21T03:21:02.2880554Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used. 2026-10-21T03:21:02.2880684Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:156:3] 2026-10-21T03:21:02.2880846Z 155 │ attachmentVideoPreviewSource, 2026-10-21T03:21:02.2880923Z 156 │ mediaVideoPreviewUri, 2026-10-21T03:21:02.2881007Z ·  ──────────┬───────── 2026-10-21T03:21:02.2881156Z · ╰── 'mediaVideoPreviewUri' is imported here 2026-10-21T03:21:02.2881233Z 157 │ mediaVideoThumbnailKey, 2026-10-21T03:21:02.2881288Z ╰──── 2026-10-21T03:21:02.2881383Z  help: Consider removing this import. 2026-10-21T03:21:02.2881386Z 2026-10-21T03:21:02.2881609Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used. 2026-10-21T03:21:02.2881741Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:157:3] 2026-10-21T03:21:02.2881812Z 156 │ mediaVideoPreviewUri, 2026-10-21T03:21:02.2881884Z 157 │ mediaVideoThumbnailKey, 2026-10-21T03:21:02.2882040Z ·  ───────────┬────────── 2026-10-21T03:21:02.2882235Z · ╰── 'mediaVideoThumbnailKey' is imported here 2026-10-21T03:21:02.2882318Z 158 │ type MediaVideoPreviewSource, 2026-10-21T03:21:02.2882371Z ╰──── 2026-10-21T03:21:02.2882464Z  help: Consider removing this import. 2026-10-21T03:21:02.2882469Z 2026-10-21T03:21:02.2882680Z ⚠ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used. 2026-10-21T03:21:02.2882813Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:158:8] 2026-10-21T03:21:02.2882885Z 157 │ mediaVideoThumbnailKey, 2026-10-21T03:21:02.2882964Z 158 │ type MediaVideoPreviewSource, 2026-10-21T03:21:02.2883056Z ·  ───────────┬─────────── 2026-10-21T03:21:02.2883222Z · ╰── 'MediaVideoPreviewSource' is imported here 2026-10-21T03:21:02.2883312Z 159 │ } from "../../lib/videoPreviewSource"; 2026-10-21T03:21:02.2883364Z ╰──── 2026-10-21T03:21:02.2883457Z  help: Consider removing this import. 2026-10-21T03:21:02.2883459Z 2026-10-21T03:21:02.2883659Z ⚠ eslint(no-unused-vars): Type 'ReviewDiffTheme' is imported but never used. 2026-10-21T03:21:02.2883792Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:166:15] 2026-10-21T03:21:02.2883972Z 165 │ import { parseReviewCommentMessageSegments } from "../review/reviewCommentSelection"; 2026-10-21T03:21:02.2884110Z 166 │ import type { ReviewDiffTheme } from "../review/shikiReviewHighlighter"; 2026-10-21T03:21:02.2884200Z ·  ───────┬─────── 2026-10-21T03:21:02.2884355Z · ╰── 'ReviewDiffTheme' is imported here 2026-10-21T03:21:02.2884418Z 167 │ import { 2026-10-21T03:21:02.2884467Z ╰──── 2026-10-21T03:21:02.2884562Z  help: Consider removing this import. 2026-10-21T03:21:02.2884564Z 2026-10-21T03:21:02.2884793Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used. 2026-10-21T03:21:02.2884924Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:181:3] 2026-10-21T03:21:02.2884982Z 180 │ import { 2026-10-21T03:21:02.2885058Z 181 │ resolveMarkdownFontSizes, 2026-10-21T03:21:02.2885149Z ·  ────────────┬─────────── 2026-10-21T03:21:02.2885307Z · ╰── 'resolveMarkdownFontSizes' is imported here 2026-10-21T03:21:02.2885392Z 182 │ resolveNativeMarkdownTypography, 2026-10-21T03:21:02.2885451Z ╰──── 2026-10-21T03:21:02.2885550Z  help: Consider removing this import. 2026-10-21T03:21:02.2885552Z 2026-10-21T03:21:02.2885775Z ⚠ eslint(no-unused-vars): Identifier 'markdownLinkIconSource' is imported but never used. 2026-10-21T03:21:02.2885905Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:186:10] 2026-10-21T03:21:02.2886040Z 185 │ import { PierreEntryIcon } from "../../components/PierreEntryIcon"; 2026-10-21T03:21:02.2886177Z 186 │ import { markdownLinkIconSource } from "../../lib/markdownLinkIcons"; 2026-10-21T03:21:02.2886271Z ·  ───────────┬────────── 2026-10-21T03:21:02.2886430Z · ╰── 'markdownLinkIconSource' is imported here 2026-10-21T03:21:02.2886489Z 187 │ import { 2026-10-21T03:21:02.2886542Z ╰──── 2026-10-21T03:21:02.2886698Z  help: Consider removing this import. 2026-10-21T03:21:02.2886733Z 2026-10-21T03:21:02.2886993Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used. 2026-10-21T03:21:02.2887124Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:189:3] 2026-10-21T03:21:02.2887204Z 188 │ normalizeNativeMarkdownUrl, 2026-10-21T03:21:02.2887300Z 189 │ resolveMarkdownInlineCodePresentation, 2026-10-21T03:21:02.2887408Z ·  ──────────────────┬────────────────── 2026-10-21T03:21:02.2887602Z · ╰── 'resolveMarkdownInlineCodePresentation' is imported here 2026-10-21T03:21:02.2887678Z 190 │ resolveMarkdownLinkIcon, 2026-10-21T03:21:02.2887730Z ╰──── 2026-10-21T03:21:02.2887823Z  help: Consider removing this import. 2026-10-21T03:21:02.2887827Z 2026-10-21T03:21:02.2888055Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownLinkIcon' is imported but never used. 2026-10-21T03:21:02.2888191Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:190:3] 2026-10-21T03:21:02.2888285Z 189 │ resolveMarkdownInlineCodePresentation, 2026-10-21T03:21:02.2888359Z 190 │ resolveMarkdownLinkIcon, 2026-10-21T03:21:02.2888446Z ·  ───────────┬─────────── 2026-10-21T03:21:02.2888602Z · ╰── 'resolveMarkdownLinkIcon' is imported here 2026-10-21T03:21:02.2888688Z 191 │ resolveMarkdownLinkPresentation, 2026-10-21T03:21:02.2888740Z ╰──── 2026-10-21T03:21:02.2888833Z  help: Consider removing this import. 2026-10-21T03:21:02.2888836Z 2026-10-21T03:21:02.2889071Z ⚠ eslint(no-unused-vars): Identifier 'useMarkdownCodeHighlight' is imported but never used. 2026-10-21T03:21:02.2889205Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:225:10] 2026-10-21T03:21:02.2889308Z 224 │ import { ThreadMcpApp } from "./McpAppWebView"; 2026-10-21T03:21:02.2889451Z 225 │ import { useMarkdownCodeHighlight } from "./markdownCodeHighlightState"; 2026-10-21T03:21:02.2889551Z ·  ────────────┬─────────── 2026-10-21T03:21:02.2889716Z · ╰── 'useMarkdownCodeHighlight' is imported here 2026-10-21T03:21:02.2889775Z 226 │ import { 2026-10-21T03:21:02.2889825Z ╰──── 2026-10-21T03:21:02.2889920Z  help: Consider removing this import. 2026-10-21T03:21:02.2889923Z 2026-10-21T03:21:02.2890133Z ⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used. 2026-10-21T03:21:02.2890268Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:229:3] 2026-10-21T03:21:02.2890340Z 228 │ useAssetUrl, 2026-10-21T03:21:02.2890410Z 229 │ useAssetUrlState, 2026-10-21T03:21:02.2890491Z ·  ────────┬─────── 2026-10-21T03:21:02.2890633Z · ╰── 'useAssetUrlState' is imported here 2026-10-21T03:21:02.2890700Z 230 │ useRefreshAssetUrl, 2026-10-21T03:21:02.2890785Z ╰──── 2026-10-21T03:21:02.2890910Z  help: Consider removing this import. 2026-10-21T03:21:02.2890912Z 2026-10-21T03:21:02.2891111Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-21T03:21:02.2891244Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:1847:7] 2026-10-21T03:21:02.2891319Z 1846 │ setExpandedFile(null); 2026-10-21T03:21:02.2891539Z 1847 │ }, [props.environmentId, props.threadId, props.contentPresentation.kind]); 2026-10-21T03:21:02.2891789Z ·  ─────────┬───────── ───────┬────── ───────────────┬────────────── 2026-10-21T03:21:02.2892072Z · │ │ ╰── Unnecessary dependency `props.contentPresentation.kind` 2026-10-21T03:21:02.2892265Z · │ ╰── Unnecessary dependency `props.threadId` 2026-10-21T03:21:02.2892427Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-21T03:21:02.2892568Z 1848 │ const horizontalPadding = props.layoutVariant === "split" ? 20 : 16; 2026-10-21T03:21:02.2892622Z ╰──── 2026-10-21T03:21:02.2892924Z  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-21T03:21:02.2893243Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2893246Z 2026-10-21T03:21:02.2893446Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-21T03:21:02.2893584Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2302:30] 2026-10-21T03:21:02.2893681Z 2301 │ transitionEndFollow({ type: "reset" }); 2026-10-21T03:21:02.2893811Z 2302 │ }, [clearUserScrollSettle, feedThreadKey, transitionEndFollow]); 2026-10-21T03:21:02.2893916Z ·  ──────┬────── 2026-10-21T03:21:02.2894084Z · ╰── Unnecessary dependency `feedThreadKey` 2026-10-21T03:21:02.2894153Z 2303 │ useEffect(() => { 2026-10-21T03:21:02.2894205Z ╰──── 2026-10-21T03:21:02.2894494Z  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-21T03:21:02.2894804Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2894806Z 2026-10-21T03:21:02.2895004Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-21T03:21:02.2895137Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2320:7] 2026-10-21T03:21:02.2895238Z 2319 │ reportHeaderMaterialVisibility(false); 2026-10-21T03:21:02.2895353Z 2320 │ }, [feedThreadKey, reportHeaderMaterialVisibility]); 2026-10-21T03:21:02.2895436Z ·  ──────┬────── 2026-10-21T03:21:02.2895581Z · ╰── Unnecessary dependency `feedThreadKey` 2026-10-21T03:21:02.2895636Z 2321 │ 2026-10-21T03:21:02.2895689Z ╰──── 2026-10-21T03:21:02.2895977Z  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-21T03:21:02.2896285Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2896290Z 2026-10-21T03:21:02.2896546Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-21T03:21:02.2896718Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2352:7] 2026-10-21T03:21:02.2896775Z 2351 │ } 2026-10-21T03:21:02.2896906Z 2352 │ }, [listMountKey, props.contentInsetEndAdjustment, listRef]); 2026-10-21T03:21:02.2896983Z ·  ──────┬───── 2026-10-21T03:21:02.2897128Z · ╰── Unnecessary dependency `listMountKey` 2026-10-21T03:21:02.2897183Z 2353 │ 2026-10-21T03:21:02.2897234Z ╰──── 2026-10-21T03:21:02.2897520Z  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-21T03:21:02.2897833Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2897838Z 2026-10-21T03:21:02.2898034Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-21T03:21:02.2898167Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2447:7] 2026-10-21T03:21:02.2898221Z 2446 │ } 2026-10-21T03:21:02.2898404Z 2447 │ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]); 2026-10-21T03:21:02.2898591Z ·  ───────┬─────── ─────────┬──────── ────────┬─────── 2026-10-21T03:21:02.2898837Z · │ │ ╰── Unnecessary dependency `expandedWorkRows` 2026-10-21T03:21:02.2899045Z · │ ╰── Unnecessary dependency `expandedWorkGroups` 2026-10-21T03:21:02.2899196Z · ╰── Unnecessary dependency `expandedTurnIds` 2026-10-21T03:21:02.2899251Z 2448 │ 2026-10-21T03:21:02.2899303Z ╰──── 2026-10-21T03:21:02.2899592Z  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-21T03:21:02.2899899Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2899901Z 2026-10-21T03:21:02.2900158Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.2900376Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:431:5] 2026-10-21T03:21:02.2900475Z 426 │ : null; 2026-10-21T03:21:02.2900541Z 427 │ useEffect(() => { 2026-10-21T03:21:02.2900612Z ·  ────┬──── 2026-10-21T03:21:02.2900803Z · ╰── This is the containing effect 2026-10-21T03:21:02.2901019Z 428 │ if (activeDraftKey !== null || editingPendingTask !== null || selectedProject === null) { 2026-10-21T03:21:02.2901078Z 429 │ return; 2026-10-21T03:21:02.2901134Z 430 │ } 2026-10-21T03:21:02.2901204Z 431 │ setActiveDraftKey( 2026-10-21T03:21:02.2901290Z ·  ────────┬──────── 2026-10-21T03:21:02.2901457Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2901527Z 432 │ createNewTaskDraft({ 2026-10-21T03:21:02.2901581Z ╰──── 2026-10-21T03:21:02.2902176Z  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-21T03:21:02.2902500Z  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-21T03:21:02.2902503Z 2026-10-21T03:21:02.2902741Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-21T03:21:02.2902906Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1212:39] 2026-10-21T03:21:02.2902962Z 1211 │ 2026-10-21T03:21:02.2903168Z 1212 │ return {props.children}; 2026-10-21T03:21:02.2903281Z ·  ───────────── 2026-10-21T03:21:02.2903338Z 1213 │ } 2026-10-21T03:21:02.2903390Z ╰──── 2026-10-21T03:21:02.2903612Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-21T03:21:02.2903749Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-21T03:21:02.2903754Z 2026-10-21T03:21:02.2904005Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.2904155Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:388:5] 2026-10-21T03:21:02.2904209Z 386 │ 2026-10-21T03:21:02.2904280Z 387 │ useEffect(() => { 2026-10-21T03:21:02.2904351Z ·  ────┬──── 2026-10-21T03:21:02.2904479Z · ╰── This is the containing effect 2026-10-21T03:21:02.2904573Z 388 │ setInspectorSelection((current) => { 2026-10-21T03:21:02.2904660Z ·  ──────────┬────────── 2026-10-21T03:21:02.2904827Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2904929Z 389 │ if (props.renderInspector === undefined) { 2026-10-21T03:21:02.2904981Z ╰──── 2026-10-21T03:21:02.2905636Z  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-21T03:21:02.2905987Z  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-21T03:21:02.2905992Z 2026-10-21T03:21:02.2906203Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-21T03:21:02.2906355Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:516:24] 2026-10-21T03:21:02.2906512Z 515 │ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top; 2026-10-21T03:21:02.2906679Z 516 │ ╭─▶ const GitInspector = () => ( 2026-10-21T03:21:02.2906775Z 517 │ │ 2026-10-21T03:21:02.2907337Z 522 │ ╰─▶ ); 2026-10-21T03:21:02.2907417Z 523 │ const FilesInspector = () => 2026-10-21T03:21:02.2907469Z ╰──── 2026-10-21T03:21:02.2907684Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-21T03:21:02.2907687Z 2026-10-21T03:21:02.2907897Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-21T03:21:02.2908048Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:523:26] 2026-10-21T03:21:02.2908111Z 522 │ ); 2026-10-21T03:21:02.2908273Z 523 │ ╭─▶ const FilesInspector = () => 2026-10-21T03:21:02.2908422Z 524 │ │ selectedThread !== null && selectedThreadCwd !== null ? ( 2026-10-21T03:21:02.2908530Z 525 │ │ 2026-10-21T03:21:02.2909487Z 533 │ ╰─▶ ) : null; 2026-10-21T03:21:02.2909639Z 534 │ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset); 2026-10-21T03:21:02.2909691Z ╰──── 2026-10-21T03:21:02.2909904Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-21T03:21:02.2909906Z 2026-10-21T03:21:02.2910161Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.2910312Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:552:7] 2026-10-21T03:21:02.2910508Z 546 │ }, [cancelledIncomingShareId, navigation, props.incomingShareId]); 2026-10-21T03:21:02.2910603Z 547 │ useEffect(() => { 2026-10-21T03:21:02.2910675Z ·  ────┬──── 2026-10-21T03:21:02.2910852Z · ╰── This is the containing effect 2026-10-21T03:21:02.2910942Z 548 │ if (!isReturningToProjectPicker) { 2026-10-21T03:21:02.2911001Z 549 │ return; 2026-10-21T03:21:02.2911056Z 550 │ } 2026-10-21T03:21:02.2911153Z 551 │ if (requestedInitialProjectAvailable) { 2026-10-21T03:21:02.2911246Z 552 │ setIsReturningToProjectPicker(false); 2026-10-21T03:21:02.2911348Z ·  ──────────────┬────────────── 2026-10-21T03:21:02.2911526Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2911586Z 553 │ return; 2026-10-21T03:21:02.2911638Z ╰──── 2026-10-21T03:21:02.2912236Z  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-21T03:21:02.2912561Z  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-21T03:21:02.2912563Z 2026-10-21T03:21:02.2912816Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.2912967Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:700:9] 2026-10-21T03:21:02.2913021Z 643 │ 2026-10-21T03:21:02.2913089Z 644 │ useEffect(() => { 2026-10-21T03:21:02.2913163Z ·  ────┬──── 2026-10-21T03:21:02.2913290Z · ╰── This is the containing effect 2026-10-21T03:21:02.2913392Z 645 │ if (props.pendingTaskId || props.draftId) { 2026-10-21T03:21:02.2913450Z 646 │ return; 2026-10-21T03:21:02.2913505Z 647 │ } 2026-10-21T03:21:02.2913645Z 648 │ if (lastInitialProjectRefRef.current !== props.initialProjectRef) { 2026-10-21T03:21:02.2913775Z 649 │ lastInitialProjectRefRef.current = props.initialProjectRef; 2026-10-21T03:21:02.2913881Z 650 │ appliedInitialProjectKeyRef.current = null; 2026-10-21T03:21:02.2913936Z 651 │ } 2026-10-21T03:21:02.2914078Z 652 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-21T03:21:02.2914205Z 653 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-21T03:21:02.2914314Z 654 │ if (initialEnvironmentId && initialProjectId) { 2026-10-21T03:21:02.2914390Z 655 │ const directProject = 2026-10-21T03:21:02.2914461Z 656 │ projects.find( 2026-10-21T03:21:02.2914527Z 657 │ (project) => 2026-10-21T03:21:02.2914702Z 658 │ project.environmentId === initialEnvironmentId && project.id === initialProjectId, 2026-10-21T03:21:02.2914767Z 659 │ ) ?? null; 2026-10-21T03:21:02.2914824Z 660 │ 2026-10-21T03:21:02.2914893Z 661 │ if (directProject) { 2026-10-21T03:21:02.2915034Z 662 │ // Apply the route's project once. Re-applying on every change would 2026-10-21T03:21:02.2915174Z 663 │ // instantly revert environment/project switches made in the picker. 2026-10-21T03:21:02.2915336Z 664 │ const directProjectKey = `${directProject.environmentId}:${directProject.id}`; 2026-10-21T03:21:02.2915542Z 665 │ if (appliedInitialProjectKeyRef.current === directProjectKey) { 2026-10-21T03:21:02.2915639Z 666 │ return; 2026-10-21T03:21:02.2915699Z 667 │ } 2026-10-21T03:21:02.2915799Z 668 │ if (props.initialProjectRef?.branch) { 2026-10-21T03:21:02.2915859Z 669 │ if ( 2026-10-21T03:21:02.2916005Z 670 │ selectedProject?.environmentId !== directProject.environmentId || 2026-10-21T03:21:02.2916107Z 671 │ selectedProject.id !== directProject.id 2026-10-21T03:21:02.2916168Z 672 │ ) { 2026-10-21T03:21:02.2916252Z 673 │ setProject(directProject); 2026-10-21T03:21:02.2916319Z 674 │ return; 2026-10-21T03:21:02.2916380Z 675 │ } 2026-10-21T03:21:02.2916465Z 676 │ if (!flow.draftKey) return; 2026-10-21T03:21:02.2916603Z 677 │ // The route completes checkout before mounting this composer. Local 2026-10-21T03:21:02.2916754Z 678 │ // mode reuses an existing worktree; worktree mode would create another. 2026-10-21T03:21:02.2916868Z 679 │ updateComposerDraftSettings(flow.draftKey, { 2026-10-21T03:21:02.2916949Z 680 │ workspaceSelection: { 2026-10-21T03:21:02.2917019Z 681 │ mode: "local", 2026-10-21T03:21:02.2917127Z 682 │ branch: props.initialProjectRef.branch, 2026-10-21T03:21:02.2917263Z 683 │ worktreePath: props.initialProjectRef.worktreePath ?? null, 2026-10-21T03:21:02.2917347Z 684 │ startFromOrigin: false, 2026-10-21T03:21:02.2917407Z 685 │ }, 2026-10-21T03:21:02.2917469Z 686 │ }); 2026-10-21T03:21:02.2917529Z 687 │ } 2026-10-21T03:21:02.2917655Z 688 │ appliedInitialProjectKeyRef.current = directProjectKey; 2026-10-21T03:21:02.2917714Z 689 │ if ( 2026-10-21T03:21:02.2917918Z 690 │ selectedProject?.environmentId === directProject.environmentId && 2026-10-21T03:21:02.2918020Z 691 │ selectedProject.id === directProject.id 2026-10-21T03:21:02.2918080Z 692 │ ) { 2026-10-21T03:21:02.2918143Z 693 │ return; 2026-10-21T03:21:02.2918203Z 694 │ } 2026-10-21T03:21:02.2918284Z 695 │ setProject(directProject); 2026-10-21T03:21:02.2918346Z 696 │ return; 2026-10-21T03:21:02.2918404Z 697 │ } 2026-10-21T03:21:02.2918458Z 698 │ 2026-10-21T03:21:02.2918539Z 699 │ if (projects.length > 0) { 2026-10-21T03:21:02.2918635Z 700 │ setIsReturningToProjectPicker(true); 2026-10-21T03:21:02.2918744Z ·  ──────────────┬────────────── 2026-10-21T03:21:02.2918926Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2918995Z 701 │ } 2026-10-21T03:21:02.2919048Z ╰──── 2026-10-21T03:21:02.2919652Z  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-21T03:21:02.2919980Z  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-21T03:21:02.2919982Z 2026-10-21T03:21:02.2920245Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-21T03:21:02.2920476Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:800:5] 2026-10-21T03:21:02.2920570Z 741 │ 2026-10-21T03:21:02.2920639Z 742 │ useEffect(() => { 2026-10-21T03:21:02.2920754Z ·  ────┬──── 2026-10-21T03:21:02.2920910Z · ╰── This is the containing effect 2026-10-21T03:21:02.2921006Z 743 │ const shareId = props.incomingShareId; 2026-10-21T03:21:02.2921093Z 744 │ const draftKey = flow.draftKey; 2026-10-21T03:21:02.2921196Z 745 │ const destinationProject = selectedProject; 2026-10-21T03:21:02.2921340Z 746 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-21T03:21:02.2921468Z 747 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-21T03:21:02.2921561Z 748 │ const selectedProjectMatchesRoute = 2026-10-21T03:21:02.2921640Z 749 │ !initialEnvironmentId || 2026-10-21T03:21:02.2921721Z 750 │ !initialProjectId || 2026-10-21T03:21:02.2921855Z 751 │ (destinationProject?.environmentId === initialEnvironmentId && 2026-10-21T03:21:02.2921962Z 752 │ destinationProject.id === initialProjectId); 2026-10-21T03:21:02.2922022Z 753 │ if ( 2026-10-21T03:21:02.2922088Z 754 │ !shareId || 2026-10-21T03:21:02.2922152Z 755 │ !draftKey || 2026-10-21T03:21:02.2922228Z 756 │ !destinationProject || 2026-10-21T03:21:02.2922318Z 757 │ !selectedProjectMatchesRoute || 2026-10-21T03:21:02.2922411Z 758 │ cancelledIncomingShareId === shareId 2026-10-21T03:21:02.2922468Z 759 │ ) { 2026-10-21T03:21:02.2922530Z 760 │ return; 2026-10-21T03:21:02.2922587Z 761 │ } 2026-10-21T03:21:02.2922682Z 762 │ const importKey = `${shareId}:${draftKey}`; 2026-10-21T03:21:02.2922741Z 763 │ if ( 2026-10-21T03:21:02.2922859Z 764 │ startedShareImportKeyRef.current === importKey || 2026-10-21T03:21:02.2922975Z 765 │ cancellingShareImportKeyRef.current === importKey 2026-10-21T03:21:02.2923030Z 766 │ ) { 2026-10-21T03:21:02.2923091Z 767 │ return; 2026-10-21T03:21:02.2923148Z 768 │ } 2026-10-21T03:21:02.2923202Z 769 │ 2026-10-21T03:21:02.2923271Z 770 │ if (!incomingShare) { 2026-10-21T03:21:02.2923471Z 771 │ if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) { 2026-10-21T03:21:02.2923603Z 772 │ alertedUnavailableIncomingShareIdRef.current = shareId; 2026-10-21T03:21:02.2923673Z 773 │ Dialog.alert( 2026-10-21T03:21:02.2923758Z 774 │ "Shared content unavailable", 2026-10-21T03:21:02.2923936Z 775 │ "The shared content is no longer in the inbox. You can continue editing this task draft.", 2026-10-21T03:21:02.2923997Z 776 │ ); 2026-10-21T03:21:02.2924124Z 777 │ } 2026-10-21T03:21:02.2924217Z 778 │ return; 2026-10-21T03:21:02.2924274Z 779 │ } 2026-10-21T03:21:02.2924328Z 780 │ 2026-10-21T03:21:02.2924384Z 781 │ if ( 2026-10-21T03:21:02.2924548Z 782 │ incomingShare.attachments.some((attachment) => attachment.type === "file") && 2026-10-21T03:21:02.2924652Z 783 │ selectedEnvironmentServerConfig === null 2026-10-21T03:21:02.2924710Z 784 │ ) { 2026-10-21T03:21:02.2924769Z 785 │ return; 2026-10-21T03:21:02.2924826Z 786 │ } 2026-10-21T03:21:02.2924881Z 787 │ 2026-10-21T03:21:02.2925021Z 788 │ if (alertedUnavailableIncomingShareIdRef.current === shareId) { 2026-10-21T03:21:02.2925142Z 789 │ alertedUnavailableIncomingShareIdRef.current = null; 2026-10-21T03:21:02.2925200Z 790 │ } 2026-10-21T03:21:02.2925311Z 791 │ startedShareImportKeyRef.current = importKey; 2026-10-21T03:21:02.2925387Z 792 │ const draftBackup = 2026-10-21T03:21:02.2925575Z 793 │ shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey); 2026-10-21T03:21:02.2925716Z 794 │ shareImportDraftBackupRef.current.set(importKey, draftBackup); 2026-10-21T03:21:02.2925809Z 795 │ const importToken = Symbol(importKey); 2026-10-21T03:21:02.2925889Z 796 │ let didReserveShare = false; 2026-10-21T03:21:02.2925965Z 797 │ let didConsumeShare = false; 2026-10-21T03:21:02.2926047Z 798 │ let needsDraftRestore = false; 2026-10-21T03:21:02.2926160Z 799 │ activeShareImportTokenRef.current = importToken; 2026-10-21T03:21:02.2926245Z 800 │ setImportingShareKey(importKey); 2026-10-21T03:21:02.2926333Z ·  ──────────┬───────── 2026-10-21T03:21:02.2926516Z · ╰── Avoid calling setState() directly within an effect 2026-10-21T03:21:02.2926590Z 801 │ void (async () => { 2026-10-21T03:21:02.2926647Z ╰──── 2026-10-21T03:21:02.2927245Z  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-21T03:21:02.2927572Z  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-21T03:21:02.2927574Z 2026-10-21T03:21:02.2927780Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-21T03:21:02.2927939Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:720:5] 2026-10-21T03:21:02.2928019Z 719 │ props.initialProjectRef, 2026-10-21T03:21:02.2928091Z 720 │ props.incomingShareId, 2026-10-21T03:21:02.2928183Z ·  ──────────┬────────── 2026-10-21T03:21:02.2928352Z · ╰── Unnecessary dependency `props.incomingShareId` 2026-10-21T03:21:02.2928427Z 721 │ props.pendingTaskId, 2026-10-21T03:21:02.2928479Z ╰──── 2026-10-21T03:21:02.2928779Z  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-21T03:21:02.2929095Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2929097Z 2026-10-21T03:21:02.2929380Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-21T03:21:02.2929567Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:739:5] 2026-10-21T03:21:02.2929688Z 738 │ loadedBranchesProjectKeyRef.current = projectKey; 2026-10-21T03:21:02.2929760Z 739 │ flow.loadBranches(); 2026-10-21T03:21:02.2929834Z ·  ──┬─ 2026-10-21T03:21:02.2929957Z · ╰── Missing dependency `flow` 2026-10-21T03:21:02.2930052Z 740 │ }, [flow.loadBranches, selectedProject]); 2026-10-21T03:21:02.2930139Z ·  ────────┬──────── 2026-10-21T03:21:02.2930339Z · ╰── Overly precise dependency `flow.loadBranches`, use `flow` instead 2026-10-21T03:21:02.2930393Z 741 │ 2026-10-21T03:21:02.2930447Z ╰──── 2026-10-21T03:21:02.2930973Z  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-21T03:21:02.2931293Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2931296Z 2026-10-21T03:21:02.2931499Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-21T03:21:02.2931650Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:962:5] 2026-10-21T03:21:02.2931719Z 961 │ flow.draftKey, 2026-10-21T03:21:02.2931799Z 962 │ hasImportedIncomingShare, 2026-10-21T03:21:02.2931893Z ·  ────────────┬─────────── 2026-10-21T03:21:02.2932072Z · ╰── Unnecessary dependency `hasImportedIncomingShare` 2026-10-21T03:21:02.2932145Z 963 │ incomingShare, 2026-10-21T03:21:02.2932230Z 964 │ isIncomingShareInboxLoading, 2026-10-21T03:21:02.2932329Z ·  ─────────────┬───────────── 2026-10-21T03:21:02.2932512Z · ╰── Unnecessary dependency `isIncomingShareInboxLoading` 2026-10-21T03:21:02.2932596Z 965 │ isIncomingShareUnavailable, 2026-10-21T03:21:02.2932671Z 966 │ props.incomingShareId, 2026-10-21T03:21:02.2932767Z 967 │ props.initialProjectRef?.environmentId, 2026-10-21T03:21:02.2932856Z 968 │ props.initialProjectRef?.projectId, 2026-10-21T03:21:02.2932935Z 969 │ releaseShareReservation, 2026-10-21T03:21:02.2933001Z 970 │ reserveShare, 2026-10-21T03:21:02.2933093Z 971 │ selectedEnvironmentServerConfig, 2026-10-21T03:21:02.2933162Z 972 │ selectedProject, 2026-10-21T03:21:02.2933235Z 973 │ shareImportAttempt, 2026-10-21T03:21:02.2933323Z ·  ─────────┬──────── 2026-10-21T03:21:02.2933492Z · ╰── Unnecessary dependency `shareImportAttempt` 2026-10-21T03:21:02.2933548Z 974 │ ]); 2026-10-21T03:21:02.2933604Z ╰──── 2026-10-21T03:21:02.2933902Z  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-21T03:21:02.2934217Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-21T03:21:02.2934220Z 2026-10-21T03:21:02.2934304Z Found 0 errors and 361 warnings in 5241 files (6.9s, 8 threads) 2026-10-21T03:21:02.2988185Z Post job cleanup. 2026-10-21T03:21:02.3011183Z ##[start-action display=Cache full pnpm store;id=__dc76fdd1-1c51-4e2a-ac43-f2397a4cd527.__actions_cache_2] 2026-10-21T03:21:02.3401817Z Post job cleanup. 2026-10-21T03:21:02.4058463Z Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-68ecfee7dce3960a4e095879378684d06946a297346201d9bd411a74fc6057ea, not saving cache. 2026-10-21T03:21:02.4091094Z ##[end-action id=__dc76fdd1-1c51-4e2a-ac43-f2397a4cd527.__actions_cache_2;outcome=success;conclusion=success;duration_ms=107] 2026-10-21T03:21:02.4092648Z ##[start-action display=Setup Vite+;id=__dc76fdd1-1c51-4e2a-ac43-f2397a4cd527.__voidzero-dev_setup-vp] 2026-10-21T03:21:02.4112207Z Post job cleanup. 2026-10-21T03:21:02.4773040Z ##[end-action id=__dc76fdd1-1c51-4e2a-ac43-f2397a4cd527.__voidzero-dev_setup-vp;outcome=success;conclusion=success;duration_ms=68] 2026-10-21T03:21:02.4774540Z ##[start-action display=Cache Vite+;id=__dc76fdd1-1c51-4e2a-ac43-f2397a4cd527.__actions_cache] 2026-10-21T03:21:02.4809306Z Post job cleanup. 2026-10-21T03:21:02.5409814Z Cache hit occurred on the primary key vite-plus-home-v1-Linux-X64-1.0.0, not saving cache. 2026-10-21T03:21:02.5440656Z ##[end-action id=__dc76fdd1-1c51-4e2a-ac43-f2397a4cd527.__actions_cache;outcome=success;conclusion=success;duration_ms=66] 2026-10-21T03:21:02.5478403Z Post job cleanup. 2026-10-21T03:21:02.5894078Z [command]/usr/local/bin/git version 2026-10-21T03:21:02.5927138Z git version 2.55.0 2026-10-21T03:21:02.5946222Z Temporarily overriding HOME='/home/runner/_work/_temp/f14e02d3-3a85-4f03-9b07-a6140fd406b1' before making global git config changes 2026-10-21T03:21:02.5946450Z Adding repository directory to the temporary git global config as a safe directory 2026-10-21T03:21:02.5949353Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-21T03:21:02.5972414Z Removing SSH command configuration 2026-10-21T03:21:02.5975499Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-21T03:21:02.5997539Z [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-21T03:21:02.6129470Z fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules 2026-10-21T03:21:02.6152091Z ##[warning]The process '/usr/local/bin/git' failed with exit code 128 2026-10-21T03:21:02.6189470Z A job completed hook has been configured by the self-hosted runner administrator 2026-10-21T03:21:02.6204059Z ##[group]Run '/job_completed.sh' 2026-10-21T03:21:02.6209617Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-21T03:21:02.6209666Z env: 2026-10-21T03:21:02.6209729Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 149 2026-10-21T03:21:02.6209786Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 422 2026-10-21T03:21:02.6209838Z BLACKSMITH_CHECK_RUN_ID: 119018884336 2026-10-21T03:21:02.6209891Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-21T03:21:02.6209944Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-21T03:21:02.6210011Z ##[endgroup] 2026-10-21T03:21:02.6285282Z Docker container cache not activated, skipping hash computation. 2026-10-21T03:21:02.6510575Z No active SSH sessions detected. Proceeding with shutdown immediately. 2026-10-21T03:21:02.6555675Z Cleaning up orphan processes