2026-10-25T13:29:18.9843226Z Current runner version: '2.338.1' 2026-10-25T13:29:18.9847091Z Runner name: 'blacksmith-8vcpu-ubuntu-2404-53kevwwxk7rsdpjc' 2026-10-25T13:29:18.9848022Z Runner group name: 'blacksmith scale sets - blacksmith-8vcpu-ubuntu-2404' 2026-10-25T13:29:18.9848832Z Machine name: 'ip-172-31-73-130' 2026-10-25T13:29:18.9850447Z ##[group]GITHUB_TOKEN Permissions 2026-10-25T13:29:18.9851842Z Contents: read 2026-10-25T13:29:18.9852223Z Metadata: read 2026-10-25T13:29:18.9852660Z ##[endgroup] 2026-10-25T13:29:18.9854133Z Secret source: None 2026-10-25T13:29:18.9854875Z Cache mode: write 2026-10-25T13:29:18.9855402Z Prepare workflow directory 2026-10-25T13:29:19.0042477Z Prepare all required actions 2026-10-25T13:29:19.0069834Z Getting action download info 2026-10-25T13:29:19.1404490Z Download action repository 'actions/checkout@v6' (SHA:d23441a48e516b6c34aea4fa41551a30e30af803) 2026-10-25T13:29:19.1807426Z Download action repository 'actions/cache@v6' (SHA:55cc8345863c7cc4c66a329aec7e433d2d1c52a9) 2026-10-25T13:29:19.2924390Z Setting BLACKSMITH_ACTIONS_RESULTS_URL to https://results-receiver.actions.githubusercontent.com/ 2026-10-25T13:29:19.2963308Z Complete job name: Lint 2026-10-25T13:29:19.3337196Z A job started hook has been configured by the self-hosted runner administrator 2026-10-25T13:29:19.3424097Z ##[group]Run '/setup.sh' 2026-10-25T13:29:19.3439919Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-25T13:29:19.3440344Z env: 2026-10-25T13:29:19.3440575Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 146 2026-10-25T13:29:19.3440867Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 552 2026-10-25T13:29:19.3441160Z BLACKSMITH_CHECK_RUN_ID: 121182404788 2026-10-25T13:29:19.3441443Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-25T13:29:19.3441721Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-25T13:29:19.3441985Z ##[endgroup] 2026-10-25T13:29:19.3687421Z Logging daemon started (blacksmithd for logs) 2026-10-25T13:29:19.3775420Z Results daemon started (blacksmithd for results) 2026-10-25T13:29:19.3933176Z Background adoption and SSH setup started (PID: 3068) 2026-10-25T13:29:19.3936319Z 2026-10-25T13:29:19.3937484Z ---------------------------------------- 2026-10-25T13:29:19.3938156Z View this job: https://app.blacksmith.sh/pingdotgg/runs/40197822342/jobs/121182404788 2026-10-25T13:29:19.3938572Z SSH Access (using your GitHub SSH key): 2026-10-25T13:29:19.3939043Z ssh -p 64000 runner@blacksmith-8vcpu-ubuntu-2404-53kevwwxk7rsdpjc.vm.blacksmith.sh 2026-10-25T13:29:19.3939367Z 2026-10-25T13:29:19.3939482Z No GitHub SSH key? Add one at: 2026-10-25T13:29:19.3939982Z https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account 2026-10-25T13:29:19.3940391Z 2026-10-25T13:29:19.3940505Z ---------------------------------------- 2026-10-25T13:29:19.3940684Z 2026-10-25T13:29:19.3940828Z VM ID: blacksmith-8vcpu-ubuntu-2404-53kevwwxk7rsdpjc 2026-10-25T13:29:19.3941161Z Host: production-152.236.41.207-x8664 2026-10-25T13:29:19.3941438Z Host Agent PID: 993382 2026-10-25T13:29:19.3941684Z Host Agent Git SHA: 1637818df 2026-10-25T13:29:19.3941968Z Host CPU Manufacturer: AuthenticAMD 2026-10-25T13:29:19.3942255Z Blacksmith Host Generation: gen 2 2026-10-25T13:29:19.3942542Z Petname: production-welcomed-civet-0f9face9 2026-10-25T13:29:19.3942836Z Region: us-east 2026-10-25T13:29:19.3943075Z Rootfs Version: ubuntu24-full-x64-081926 2026-10-25T13:29:19.3954385Z OS Version: Ubuntu 24.04.4 LTS 2026-10-25T13:29:19.3954615Z 2026-10-25T13:29:19.3954736Z Enabling Blacksmith transparent cache 2026-10-25T13:29:19.4227742Z ##[group]Run actions/checkout@v6 2026-10-25T13:29:19.4228043Z with: 2026-10-25T13:29:19.4228369Z sparse-checkout: /* !/.repos/ !/apps/mobile/modules/t3-terminal/Vendor/**/*.a 2026-10-25T13:29:19.4228770Z sparse-checkout-cone-mode: false 2026-10-25T13:29:19.4229047Z repository: pingdotgg/t3code 2026-10-25T13:29:19.4230890Z token: *** 2026-10-25T13:29:19.4231108Z ssh-strict: true 2026-10-25T13:29:19.4231331Z ssh-user: git 2026-10-25T13:29:19.4231556Z persist-credentials: true 2026-10-25T13:29:19.4232090Z clean: true 2026-10-25T13:29:19.4232306Z fetch-depth: 1 2026-10-25T13:29:19.4232530Z fetch-tags: false 2026-10-25T13:29:19.4232756Z show-progress: true 2026-10-25T13:29:19.4232985Z lfs: false 2026-10-25T13:29:19.4233196Z submodules: false 2026-10-25T13:29:19.4233425Z set-safe-directory: true 2026-10-25T13:29:19.4233683Z allow-unsafe-pr-checkout: false 2026-10-25T13:29:19.4233941Z env: 2026-10-25T13:29:19.4234179Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 146 2026-10-25T13:29:19.4234517Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 552 2026-10-25T13:29:19.4234796Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T13:29:19.4235061Z ##[endgroup] 2026-10-25T13:29:19.5483696Z Syncing repository: pingdotgg/t3code 2026-10-25T13:29:19.5484817Z ##[group]Getting Git version info 2026-10-25T13:29:19.5485157Z Working directory is '/home/runner/_work/t3code/t3code' 2026-10-25T13:29:19.5489019Z [command]/usr/local/bin/git version 2026-10-25T13:29:19.5590312Z git version 2.55.0 2026-10-25T13:29:19.5602402Z ##[endgroup] 2026-10-25T13:29:19.5607437Z Temporarily overriding HOME='/home/runner/_work/_temp/d1e1d593-5b27-45b1-acf2-6ae73e501192' before making global git config changes 2026-10-25T13:29:19.5608098Z Adding repository directory to the temporary git global config as a safe directory 2026-10-25T13:29:19.5610777Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-25T13:29:19.5643958Z Deleting the contents of '/home/runner/_work/t3code/t3code' 2026-10-25T13:29:19.5645698Z ##[group]Determining repository object format 2026-10-25T13:29:19.5647583Z ##[endgroup] 2026-10-25T13:29:19.5648041Z ##[group]Initializing the repository 2026-10-25T13:29:19.5649014Z [command]/usr/local/bin/git init /home/runner/_work/t3code/t3code 2026-10-25T13:29:19.5686969Z hint: Using 'master' as the name for the initial branch. This default branch name 2026-10-25T13:29:19.5687501Z hint: will change to "main" in Git 3.0. To configure the initial branch name 2026-10-25T13:29:19.5687974Z hint: to use in all of your new repositories, which will suppress this warning, 2026-10-25T13:29:19.5688339Z hint: call: 2026-10-25T13:29:19.5688548Z hint: 2026-10-25T13:29:19.5688825Z hint: git config --global init.defaultBranch 2026-10-25T13:29:19.5689143Z hint: 2026-10-25T13:29:19.5689438Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and 2026-10-25T13:29:19.5689894Z hint: 'development'. The just-created branch can be renamed via this command: 2026-10-25T13:29:19.5690262Z hint: 2026-10-25T13:29:19.5690484Z hint: git branch -m 2026-10-25T13:29:19.5690726Z hint: 2026-10-25T13:29:19.5691038Z hint: Disable this message with "git config set advice.defaultBranchName false" 2026-10-25T13:29:19.5691504Z Initialized empty Git repository in /home/runner/_work/t3code/t3code/.git/ 2026-10-25T13:29:19.5692348Z [command]/usr/local/bin/git remote add origin https://github.com/pingdotgg/t3code 2026-10-25T13:29:19.5714424Z ##[endgroup] 2026-10-25T13:29:19.5714810Z ##[group]Disabling automatic garbage collection 2026-10-25T13:29:19.5716661Z [command]/usr/local/bin/git config --local gc.auto 0 2026-10-25T13:29:19.5743901Z ##[endgroup] 2026-10-25T13:29:19.5744317Z ##[group]Setting up auth 2026-10-25T13:29:19.5744691Z Removing SSH command configuration 2026-10-25T13:29:19.5747758Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-25T13:29:19.5771674Z [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-25T13:29:19.5913533Z Removing HTTP extra header 2026-10-25T13:29:19.5916478Z [command]/usr/local/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader 2026-10-25T13:29:19.5938308Z [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-25T13:29:19.6041660Z Removing includeIf entries pointing to credentials config files 2026-10-25T13:29:19.6044837Z [command]/usr/local/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: 2026-10-25T13:29:19.6068043Z [command]/usr/local/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url 2026-10-25T13:29:19.6175035Z [command]/usr/local/bin/git config --file /home/runner/_work/_temp/git-credentials-e46bf8ee-6cf7-47dd-9049-94fe73816b2f.config http.https://github.com/.extraheader AUTHORIZATION: basic *** 2026-10-25T13:29:19.6202056Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git.path /home/runner/_work/_temp/git-credentials-e46bf8ee-6cf7-47dd-9049-94fe73816b2f.config 2026-10-25T13:29:19.6221453Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git/worktrees/*.path /home/runner/_work/_temp/git-credentials-e46bf8ee-6cf7-47dd-9049-94fe73816b2f.config 2026-10-25T13:29:19.6245241Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-e46bf8ee-6cf7-47dd-9049-94fe73816b2f.config 2026-10-25T13:29:19.6265103Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-e46bf8ee-6cf7-47dd-9049-94fe73816b2f.config 2026-10-25T13:29:19.6283221Z ##[endgroup] 2026-10-25T13:29:19.6283610Z ##[group]Fetching the repository 2026-10-25T13:29:19.6287426Z [command]/usr/local/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --filter=blob:none --depth=1 origin +5ac1b5ea64f77feaee4ae9fbd5a087c1b4c320e0:refs/remotes/pull/22807/merge 2026-10-25T13:29:19.9381385Z From https://github.com/pingdotgg/t3code 2026-10-25T13:29:19.9382068Z * [new ref] 5ac1b5ea64f77feaee4ae9fbd5a087c1b4c320e0 -> pull/22807/merge 2026-10-25T13:29:19.9406033Z ##[endgroup] 2026-10-25T13:29:19.9406827Z ##[group]Determining the checkout info 2026-10-25T13:29:19.9407307Z ##[endgroup] 2026-10-25T13:29:19.9407700Z ##[group]Setting up sparse checkout 2026-10-25T13:29:19.9410033Z [command]/usr/local/bin/git config core.sparseCheckout true 2026-10-25T13:29:19.9436811Z [command]/usr/local/bin/git rev-parse --git-path info/sparse-checkout 2026-10-25T13:29:19.9454616Z .git/info/sparse-checkout 2026-10-25T13:29:19.9459380Z ##[endgroup] 2026-10-25T13:29:19.9459858Z ##[group]Checking out the ref 2026-10-25T13:29:19.9462778Z [command]/usr/local/bin/git checkout --progress --force refs/remotes/pull/22807/merge 2026-10-25T13:29:27.6037145Z Updating files: 0% (1/6575) 2026-10-25T13:29:27.6066209Z Updating files: 1% (66/6575) 2026-10-25T13:29:27.6084141Z Updating files: 2% (132/6575) 2026-10-25T13:29:27.6108217Z Updating files: 3% (198/6575) 2026-10-25T13:29:27.6131601Z Updating files: 4% (263/6575) 2026-10-25T13:29:27.6164775Z Updating files: 5% (329/6575) 2026-10-25T13:29:27.6188669Z Updating files: 6% (395/6575) 2026-10-25T13:29:27.6244025Z Updating files: 7% (461/6575) 2026-10-25T13:29:27.6283297Z Updating files: 8% (526/6575) 2026-10-25T13:29:27.6358092Z Updating files: 9% (592/6575) 2026-10-25T13:29:27.6671444Z Updating files: 10% (658/6575) 2026-10-25T13:29:27.6691052Z Updating files: 11% (724/6575) 2026-10-25T13:29:27.6704211Z Updating files: 12% (789/6575) 2026-10-25T13:29:27.6717497Z Updating files: 13% (855/6575) 2026-10-25T13:29:27.6736710Z Updating files: 14% (921/6575) 2026-10-25T13:29:27.6755133Z Updating files: 15% (987/6575) 2026-10-25T13:29:27.6775359Z Updating files: 16% (1052/6575) 2026-10-25T13:29:27.6793904Z Updating files: 17% (1118/6575) 2026-10-25T13:29:27.6815153Z Updating files: 18% (1184/6575) 2026-10-25T13:29:27.6832011Z Updating files: 19% (1250/6575) 2026-10-25T13:29:27.6850494Z Updating files: 20% (1315/6575) 2026-10-25T13:29:27.6878002Z Updating files: 21% (1381/6575) 2026-10-25T13:29:27.6898027Z Updating files: 22% (1447/6575) 2026-10-25T13:29:27.6914342Z Updating files: 23% (1513/6575) 2026-10-25T13:29:27.6930188Z Updating files: 24% (1578/6575) 2026-10-25T13:29:27.6944499Z Updating files: 25% (1644/6575) 2026-10-25T13:29:27.6962185Z Updating files: 26% (1710/6575) 2026-10-25T13:29:27.6977504Z Updating files: 27% (1776/6575) 2026-10-25T13:29:27.7000166Z Updating files: 28% (1841/6575) 2026-10-25T13:29:27.7034181Z Updating files: 29% (1907/6575) 2026-10-25T13:29:27.7056925Z Updating files: 30% (1973/6575) 2026-10-25T13:29:27.7082530Z Updating files: 31% (2039/6575) 2026-10-25T13:29:27.7114954Z Updating files: 32% (2104/6575) 2026-10-25T13:29:27.7146952Z Updating files: 33% (2170/6575) 2026-10-25T13:29:27.7217144Z Updating files: 34% (2236/6575) 2026-10-25T13:29:27.7275802Z Updating files: 35% (2302/6575) 2026-10-25T13:29:27.7314747Z Updating files: 36% (2367/6575) 2026-10-25T13:29:27.7352742Z Updating files: 37% (2433/6575) 2026-10-25T13:29:27.7396803Z Updating files: 38% (2499/6575) 2026-10-25T13:29:27.7425704Z Updating files: 39% (2565/6575) 2026-10-25T13:29:27.7460295Z Updating files: 40% (2630/6575) 2026-10-25T13:29:27.7492339Z Updating files: 41% (2696/6575) 2026-10-25T13:29:27.7509086Z Updating files: 42% (2762/6575) 2026-10-25T13:29:27.7519949Z Updating files: 43% (2828/6575) 2026-10-25T13:29:27.7548300Z Updating files: 44% (2893/6575) 2026-10-25T13:29:27.7576196Z Updating files: 45% (2959/6575) 2026-10-25T13:29:27.7606077Z Updating files: 46% (3025/6575) 2026-10-25T13:29:27.7633939Z Updating files: 47% (3091/6575) 2026-10-25T13:29:27.7666649Z Updating files: 48% (3156/6575) 2026-10-25T13:29:27.7705966Z Updating files: 49% (3222/6575) 2026-10-25T13:29:27.7734138Z Updating files: 50% (3288/6575) 2026-10-25T13:29:27.7760459Z Updating files: 51% (3354/6575) 2026-10-25T13:29:27.7793075Z Updating files: 52% (3419/6575) 2026-10-25T13:29:27.7820575Z Updating files: 53% (3485/6575) 2026-10-25T13:29:27.7845549Z Updating files: 54% (3551/6575) 2026-10-25T13:29:27.7867349Z Updating files: 55% (3617/6575) 2026-10-25T13:29:27.7881785Z Updating files: 56% (3682/6575) 2026-10-25T13:29:27.7904071Z Updating files: 57% (3748/6575) 2026-10-25T13:29:27.8336897Z Updating files: 58% (3814/6575) 2026-10-25T13:29:27.8364562Z Updating files: 59% (3880/6575) 2026-10-25T13:29:27.8392988Z Updating files: 60% (3945/6575) 2026-10-25T13:29:27.8427127Z Updating files: 61% (4011/6575) 2026-10-25T13:29:27.8462236Z Updating files: 62% (4077/6575) 2026-10-25T13:29:27.8500955Z Updating files: 63% (4143/6575) 2026-10-25T13:29:27.8534473Z Updating files: 64% (4208/6575) 2026-10-25T13:29:27.8560138Z Updating files: 65% (4274/6575) 2026-10-25T13:29:27.8596348Z Updating files: 66% (4340/6575) 2026-10-25T13:29:27.8618636Z Updating files: 67% (4406/6575) 2026-10-25T13:29:27.8646185Z Updating files: 68% (4471/6575) 2026-10-25T13:29:27.8666020Z Updating files: 69% (4537/6575) 2026-10-25T13:29:27.8690184Z Updating files: 70% (4603/6575) 2026-10-25T13:29:27.8714696Z Updating files: 71% (4669/6575) 2026-10-25T13:29:27.8729913Z Updating files: 72% (4734/6575) 2026-10-25T13:29:27.9013461Z Updating files: 73% (4800/6575) 2026-10-25T13:29:27.9214829Z Updating files: 74% (4866/6575) 2026-10-25T13:29:27.9238941Z Updating files: 75% (4932/6575) 2026-10-25T13:29:27.9262095Z Updating files: 76% (4997/6575) 2026-10-25T13:29:27.9285666Z Updating files: 77% (5063/6575) 2026-10-25T13:29:27.9307404Z Updating files: 78% (5129/6575) 2026-10-25T13:29:27.9326899Z Updating files: 79% (5195/6575) 2026-10-25T13:29:27.9350658Z Updating files: 80% (5260/6575) 2026-10-25T13:29:27.9368186Z Updating files: 81% (5326/6575) 2026-10-25T13:29:27.9389610Z Updating files: 82% (5392/6575) 2026-10-25T13:29:27.9412166Z Updating files: 83% (5458/6575) 2026-10-25T13:29:27.9438332Z Updating files: 84% (5523/6575) 2026-10-25T13:29:27.9458288Z Updating files: 85% (5589/6575) 2026-10-25T13:29:27.9484417Z Updating files: 86% (5655/6575) 2026-10-25T13:29:27.9557427Z Updating files: 87% (5721/6575) 2026-10-25T13:29:27.9593690Z Updating files: 88% (5786/6575) 2026-10-25T13:29:27.9616029Z Updating files: 89% (5852/6575) 2026-10-25T13:29:27.9640334Z Updating files: 90% (5918/6575) 2026-10-25T13:29:27.9676882Z Updating files: 91% (5984/6575) 2026-10-25T13:29:27.9692534Z Updating files: 92% (6049/6575) 2026-10-25T13:29:27.9706213Z Updating files: 93% (6115/6575) 2026-10-25T13:29:27.9716291Z Updating files: 93% (6158/6575) 2026-10-25T13:29:27.9737537Z Updating files: 94% (6181/6575) 2026-10-25T13:29:27.9763659Z Updating files: 95% (6247/6575) 2026-10-25T13:29:27.9822167Z Updating files: 96% (6312/6575) 2026-10-25T13:29:27.9849525Z Updating files: 97% (6378/6575) 2026-10-25T13:29:27.9899682Z Updating files: 98% (6444/6575) 2026-10-25T13:29:27.9921675Z Updating files: 99% (6510/6575) 2026-10-25T13:29:27.9921911Z Updating files: 100% (6575/6575) 2026-10-25T13:29:27.9922262Z Updating files: 100% (6575/6575), done. 2026-10-25T13:29:28.0083902Z Note: switching to 'refs/remotes/pull/22807/merge'. 2026-10-25T13:29:28.0084163Z 2026-10-25T13:29:28.0084278Z You are in 'detached HEAD' state. You can look around, make experimental 2026-10-25T13:29:28.0084522Z changes and commit them, and you can discard any commits you make in this 2026-10-25T13:29:28.0084760Z state without impacting any branches by switching back to a branch. 2026-10-25T13:29:28.0084903Z 2026-10-25T13:29:28.0084997Z If you want to create a new branch to retain commits you create, you may 2026-10-25T13:29:28.0085225Z do so (now or later) by using -c with the switch command. Example: 2026-10-25T13:29:28.0085358Z 2026-10-25T13:29:28.0085420Z git switch -c 2026-10-25T13:29:28.0085513Z 2026-10-25T13:29:28.0085575Z Or undo this operation with: 2026-10-25T13:29:28.0085663Z 2026-10-25T13:29:28.0085741Z git switch - 2026-10-25T13:29:28.0085819Z 2026-10-25T13:29:28.0085929Z Turn off this advice by setting config variable advice.detachedHead to false 2026-10-25T13:29:28.0086141Z 2026-10-25T13:29:28.0086311Z HEAD is now at 5ac1b5e Merge 8cf88b8ed18a74763350225c93699fb6af7bf049 into 3d004999362848ae33b6f40e4bbd33b9d5c0ea59 2026-10-25T13:29:28.0099230Z ##[endgroup] 2026-10-25T13:29:28.0136972Z [command]/usr/local/bin/git log -1 --format=%H 2026-10-25T13:29:28.0162832Z 5ac1b5ea64f77feaee4ae9fbd5a087c1b4c320e0 2026-10-25T13:29:28.0250396Z ##[group]Run files="$(git ls-files .github/pr-assets)" 2026-10-25T13:29:28.0250664Z files="$(git ls-files .github/pr-assets)" 2026-10-25T13:29:28.0250877Z if test -n "$files"; then 2026-10-25T13:29:28.0251109Z  printf 'PR evidence must be uploaded to GitHub, not committed:\n%s\n' "$files" >&2 2026-10-25T13:29:28.0251329Z  exit 1 2026-10-25T13:29:28.0251440Z fi 2026-10-25T13:29:28.0269531Z shell: /usr/bin/bash -e {0} 2026-10-25T13:29:28.0269676Z env: 2026-10-25T13:29:28.0269793Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 146 2026-10-25T13:29:28.0269948Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 552 2026-10-25T13:29:28.0270092Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T13:29:28.0270228Z ##[endgroup] 2026-10-25T13:29:28.0431328Z Prepare all required actions 2026-10-25T13:29:28.0431658Z Getting action download info 2026-10-25T13:29:28.1487098Z Download action repository 'voidzero-dev/setup-vp@v1' (SHA:250f29ce396baf5e8f24498e17c0dfdebabc26eb) 2026-10-25T13:29:28.2643904Z ##[group]Run ./.github/actions/setup-ci-deps 2026-10-25T13:29:28.2644066Z with: 2026-10-25T13:29:28.2644170Z env: 2026-10-25T13:29:28.2644284Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 146 2026-10-25T13:29:28.2644430Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 552 2026-10-25T13:29:28.2644574Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T13:29:28.2644712Z ##[endgroup] 2026-10-25T13:29:28.2734387Z ##[start-action display=Resolve Vite+ version;id=__self.vp] 2026-10-25T13:29:28.2751226Z ##[group]Run echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-25T13:29:28.2751589Z echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-25T13:29:28.2751895Z echo "node=$(jq -r '.engines.node' package.json)" >> "$GITHUB_OUTPUT" 2026-10-25T13:29:28.2752146Z echo "pnpm=$(jq -r '.packageManager' package.json)" >> "$GITHUB_OUTPUT" 2026-10-25T13:29:28.2768366Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-25T13:29:28.2768535Z env: 2026-10-25T13:29:28.2768652Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 146 2026-10-25T13:29:28.2768801Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 552 2026-10-25T13:29:28.2768947Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T13:29:28.2769082Z ##[endgroup] 2026-10-25T13:29:28.2843801Z ##[end-action id=__self.vp;outcome=success;conclusion=success;duration_ms=10] 2026-10-25T13:29:28.2845671Z ##[start-action display=Cache Vite+;id=__self.vp_cache] 2026-10-25T13:29:28.2891225Z ##[group]Run actions/cache@v6 2026-10-25T13:29:28.2891383Z with: 2026-10-25T13:29:28.2891498Z path: ~/.vite-plus 2026-10-25T13:29:28.2891669Z key: vite-plus-home-v2-Linux-X64-1.4.0-node26.12.1-pnpm@12.14.0 2026-10-25T13:29:28.2891888Z enableCrossOsArchive: false 2026-10-25T13:29:28.2892024Z fail-on-cache-miss: false 2026-10-25T13:29:28.2892155Z lookup-only: false 2026-10-25T13:29:28.2892270Z save-always: false 2026-10-25T13:29:28.2892388Z env: 2026-10-25T13:29:28.2892503Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 146 2026-10-25T13:29:28.2892655Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 552 2026-10-25T13:29:28.2892803Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T13:29:28.2892940Z ##[endgroup] 2026-10-25T13:29:28.7966178Z Cache hit for: vite-plus-home-v2-Linux-X64-1.4.0-node26.12.1-pnpm@12.14.0 2026-10-25T13:29:29.2409478Z Received 170236223 of 170236223 (100.0%), 386.5 MBs/sec 2026-10-25T13:29:29.2409777Z Cache Size: ~162 MB (170236223 B) 2026-10-25T13:29:29.2435493Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/56199ce2-165b-4dea-b942-7dac78a3dad8/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-25T13:29:30.0358003Z Cache restored successfully 2026-10-25T13:29:30.0514146Z Cache restored from key: vite-plus-home-v2-Linux-X64-1.4.0-node26.12.1-pnpm@12.14.0 2026-10-25T13:29:30.0601087Z ##[end-action id=__self.vp_cache;outcome=success;conclusion=success;duration_ms=1775] 2026-10-25T13:29:30.0603768Z ##[start-action display=Use cached Vite+;id=__self.__run] 2026-10-25T13:29:30.0627641Z ##[group]Run echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-25T13:29:30.0627864Z echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-25T13:29:30.0628044Z "$HOME/.vite-plus/bin/vp" env use "26.12.1" 2026-10-25T13:29:30.0646913Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-25T13:29:30.0647087Z env: 2026-10-25T13:29:30.0647208Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 146 2026-10-25T13:29:30.0647378Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 552 2026-10-25T13:29:30.0647526Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T13:29:30.0647668Z ##[endgroup] 2026-10-25T13:29:30.0698846Z Using Node.js v26.12.1 (resolved from 26.12.1) 2026-10-25T13:29:30.0709643Z ##[end-action id=__self.__run;outcome=success;conclusion=success;duration_ms=10] 2026-10-25T13:29:30.0712085Z ##[start-action display=Setup Vite+;id=__self.__voidzero-dev_setup-vp] 2026-10-25T13:29:30.0718004Z ##[end-action id=__self.__voidzero-dev_setup-vp;outcome=skipped;conclusion=skipped;duration_ms=0] 2026-10-25T13:29:30.0734051Z ##[start-action display=Resolve pnpm store path;id=__self.pnpm_store] 2026-10-25T13:29:30.0747683Z ##[group]Run store_path="$(vp pm cache dir)" 2026-10-25T13:29:30.0747877Z store_path="$(vp pm cache dir)" 2026-10-25T13:29:30.0748044Z echo "path=$store_path" >> "$GITHUB_OUTPUT" 2026-10-25T13:29:30.0769588Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-25T13:29:30.0769768Z env: 2026-10-25T13:29:30.0770046Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 146 2026-10-25T13:29:30.0770199Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 552 2026-10-25T13:29:30.0770344Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T13:29:30.0770485Z ##[endgroup] 2026-10-25T13:29:30.0920365Z ##[end-action id=__self.pnpm_store;outcome=success;conclusion=success;duration_ms=18] 2026-10-25T13:29:30.0921905Z ##[start-action display=Cache full pnpm store;id=__self.__actions_cache] 2026-10-25T13:29:30.1307769Z ##[group]Run actions/cache@v6 2026-10-25T13:29:30.1307908Z with: 2026-10-25T13:29:30.1308035Z path: /home/runner/.local/share/pnpm/store/v11 2026-10-25T13:29:30.1308296Z key: pnpm-full-v1-Linux-X64-1af206af93d733fa7c4e35fa5de35961f61c0d15b9f10a3bf0b6b76380c4d2df 2026-10-25T13:29:30.1308553Z restore-keys: pnpm-full-v1-Linux-X64- 2026-10-25T13:29:30.1308700Z enableCrossOsArchive: false 2026-10-25T13:29:30.1308833Z fail-on-cache-miss: false 2026-10-25T13:29:30.1308955Z lookup-only: false 2026-10-25T13:29:30.1309064Z save-always: false 2026-10-25T13:29:30.1309188Z env: 2026-10-25T13:29:30.1309297Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 146 2026-10-25T13:29:30.1309451Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 552 2026-10-25T13:29:30.1309589Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T13:29:30.1309734Z ##[endgroup] 2026-10-25T13:29:30.3163204Z Cache hit for: pnpm-full-v1-Linux-X64-1af206af93d733fa7c4e35fa5de35961f61c0d15b9f10a3bf0b6b76380c4d2df 2026-10-25T13:29:31.3339518Z Received 637534208 of 1025983765 (62.1%), 608.0 MBs/sec 2026-10-25T13:29:31.9326317Z Received 1025983765 of 1025983765 (100.0%), 611.9 MBs/sec 2026-10-25T13:29:31.9330456Z Cache Size: ~978 MB (1025983765 B) 2026-10-25T13:29:31.9373298Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/8944931f-1320-47a8-b542-99af503f3be2/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-25T13:29:37.8018358Z Cache restored successfully 2026-10-25T13:29:37.8517136Z Cache restored from key: pnpm-full-v1-Linux-X64-1af206af93d733fa7c4e35fa5de35961f61c0d15b9f10a3bf0b6b76380c4d2df 2026-10-25T13:29:37.8575660Z ##[end-action id=__self.__actions_cache;outcome=success;conclusion=success;duration_ms=7765] 2026-10-25T13:29:37.8577815Z ##[start-action display=Install dependencies;id=__self.__run_2] 2026-10-25T13:29:37.8588856Z ##[group]Run vp install 2026-10-25T13:29:37.8589004Z vp install 2026-10-25T13:29:37.8606312Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-25T13:29:37.8606482Z env: 2026-10-25T13:29:37.8606603Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 146 2026-10-25T13:29:37.8606755Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 552 2026-10-25T13:29:37.8606901Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T13:29:37.8607045Z ##[endgroup] 2026-10-25T13:29:37.8949624Z Scope: all 35 workspace projects 2026-10-25T13:29:38.0076747Z ? Verifying lockfile against supply-chain policies (2087 entries)... 2026-10-25T13:29:38.2992664Z Packages are hard linked from the content-addressable store to the virtual store. 2026-10-25T13:29:38.2993003Z Content-addressable store is at: /home/runner/.local/share/pnpm/store/v11 2026-10-25T13:29:38.2993225Z Virtual store is at: node_modules/.pnpm 2026-10-25T13:29:40.6987379Z ✓ Lockfile passes supply-chain policies (2087 entries in 2.7s) 2026-10-25T13:29:40.6987648Z Lockfile is up to date, resolution step is skipped 2026-10-25T13:29:40.7163272Z Packages: +1722 2026-10-25T13:29:40.7163458Z ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2026-10-25T13:29:40.7519228Z Progress: resolved 1722, reused 1718, downloaded 0, added 1722, done 2026-10-25T13:29:42.1164494Z . prepare$ vp config --no-agent 2026-10-25T13:29:42.2290737Z . prepare: Done 2026-10-25T13:29:42.2309005Z 2026-10-25T13:29:42.2309423Z devDependencies: 2026-10-25T13:29:42.2309595Z + @coderabbitai/config 1.1.0 2026-10-25T13:29:42.2309737Z + @shadcn/lint 0.1.5 2026-10-25T13:29:42.2309894Z + @types/node 24.12.4 2026-10-25T13:29:42.2310021Z + knip 6.34.0 2026-10-25T13:29:42.2310161Z + typescript <- @tsc-rs/typescript 0.8.0 2026-10-25T13:29:42.2310306Z + vite-plus 1.4.0 2026-10-25T13:29:42.2310373Z 2026-10-25T13:29:42.2337262Z Done in 4.4s using pnpm v12.14.0 2026-10-25T13:29:42.2514708Z ##[end-action id=__self.__run_2;outcome=success;conclusion=success;duration_ms=4393] 2026-10-25T13:29:42.2518235Z ##[start-action display=Enable shared task cache;id=__self.__run_3] 2026-10-25T13:29:42.2529768Z ##[end-action id=__self.__run_3;outcome=skipped;conclusion=skipped;duration_ms=0] 2026-10-25T13:29:42.3045187Z ##[group]Run actions/cache@v6 2026-10-25T13:29:42.3045339Z with: 2026-10-25T13:29:42.3045451Z path: ~/.cache/electron 2026-10-25T13:29:42.3045673Z key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-25T13:29:42.3045911Z enableCrossOsArchive: false 2026-10-25T13:29:42.3046045Z fail-on-cache-miss: false 2026-10-25T13:29:42.3046166Z lookup-only: false 2026-10-25T13:29:42.3046279Z save-always: false 2026-10-25T13:29:42.3046400Z env: 2026-10-25T13:29:42.3046507Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 146 2026-10-25T13:29:42.3046654Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 552 2026-10-25T13:29:42.3046792Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T13:29:42.3046927Z ##[endgroup] 2026-10-25T13:29:42.5061113Z Cache hit for: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-25T13:29:42.6812389Z Received 122906203 of 122906203 (100.0%), 751.4 MBs/sec 2026-10-25T13:29:42.6813468Z Cache Size: ~117 MB (122906203 B) 2026-10-25T13:29:42.6833943Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/3bbfca79-2882-4ff4-9553-f6f0fbe30f45/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-25T13:29:42.8055029Z Cache restored successfully 2026-10-25T13:29:42.8188721Z Cache restored from key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-25T13:29:42.8319160Z ##[group]Run vp run --filter @t3tools/desktop ensure:electron 2026-10-25T13:29:42.8319416Z vp run --filter @t3tools/desktop ensure:electron 2026-10-25T13:29:42.8338657Z shell: /usr/bin/bash -e {0} 2026-10-25T13:29:42.8338799Z env: 2026-10-25T13:29:42.8338915Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 146 2026-10-25T13:29:42.8339074Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 552 2026-10-25T13:29:42.8339222Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T13:29:42.8339362Z ##[endgroup] 2026-10-25T13:29:43.0367946Z ~/apps/desktop$ node scripts/ensure-electron-runtime.mjs ⊘ cache disabled 2026-10-25T13:29:43.6527107Z /home/runner/_work/t3code/t3code/node_modules/.pnpm/electron@44.9.3_supports-color@8.1.1/node_modules/electron/dist/electron 2026-10-25T13:29:43.6545765Z 2026-10-25T13:29:43.6644565Z ##[group]Run vp run knip:check 2026-10-25T13:29:43.6644756Z vp run knip:check 2026-10-25T13:29:43.6663690Z shell: /usr/bin/bash -e {0} 2026-10-25T13:29:43.6663828Z env: 2026-10-25T13:29:43.6663944Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 146 2026-10-25T13:29:43.6664101Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 552 2026-10-25T13:29:43.6664247Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T13:29:43.6664390Z ##[endgroup] 2026-10-25T13:29:43.8305697Z $ knip --include files,dependencies --no-config-hints ⊘ cache disabled 2026-10-25T13:29:47.8389349Z 2026-10-25T13:29:47.8392811Z $ knip --workspace apps/server --workspace apps/desktop --workspace apps/web --workspace packages/client-runtime --workspace packages/contracts --workspace packages/effect-acp --workspace packages/effect-codex-app-server --workspace packages/shared --workspace packages/ssh --workspace packages/tailscale --workspace packages/provider-core --workspace packages/provider-acp --workspace packages/provider-acp-registry --workspace packages/provider-testing --workspace packages/provider-pi --workspace packages/provider-muse --workspace packages/provider-opencode --workspace packages/provider-cursor --workspace packages/provider-grok --workspace packages/source-control-core --workspace packages/source-control-definitions --workspace packages/source-control-azure-devops --workspace packages/source-control-bitbucket --workspace packages/source-control-forgejo --workspace packages/source-control-gitcafe --workspace packages/source-control-github --workspace packages/source-control-gitlab --workspace packages/source-control-testing --exports --preprocessor ./scripts/knip-schemas.ts --no-config-hints ⊘ cache disabled 2026-10-25T13:29:56.7126312Z 2026-10-25T13:29:56.7127043Z --- 2026-10-25T13:29:56.7127331Z vp run: 2/2 successful. (Run `vp run --last-details` for full details) 2026-10-25T13:29:56.7216665Z ##[group]Run vp run --filter @t3tools/source-control-github generate --check 2026-10-25T13:29:56.7216974Z vp run --filter @t3tools/source-control-github generate --check 2026-10-25T13:29:56.7235731Z shell: /usr/bin/bash -e {0} 2026-10-25T13:29:56.7235869Z env: 2026-10-25T13:29:56.7235985Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 146 2026-10-25T13:29:56.7236142Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 552 2026-10-25T13:29:56.7236290Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T13:29:56.7236434Z ##[endgroup] 2026-10-25T13:29:56.9235482Z ~/packages/source-control-github$ graphqlgen --check ⊘ cache disabled 2026-10-25T13:29:57.1295272Z 2026-10-25T13:29:57.1384943Z ##[group]Run vp run --filter t3 generate --check 2026-10-25T13:29:57.1385165Z vp run --filter t3 generate --check 2026-10-25T13:29:57.1403504Z shell: /usr/bin/bash -e {0} 2026-10-25T13:29:57.1403661Z env: 2026-10-25T13:29:57.1403830Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 146 2026-10-25T13:29:57.1403986Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 552 2026-10-25T13:29:57.1404133Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T13:29:57.1404276Z ##[endgroup] 2026-10-25T13:29:57.3012572Z ~/apps/server$ graphqlgen --check ⊘ cache disabled 2026-10-25T13:29:57.4598570Z 2026-10-25T13:29:57.4679961Z ##[group]Run vp check 2026-10-25T13:29:57.4680125Z vp check 2026-10-25T13:29:57.4698687Z shell: /usr/bin/bash -e {0} 2026-10-25T13:29:57.4698827Z env: 2026-10-25T13:29:57.4698946Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 146 2026-10-25T13:29:57.4699101Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 552 2026-10-25T13:29:57.4699247Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T13:29:57.4699387Z ##[endgroup] 2026-10-25T13:29:58.0129558Z pass: All 5869 files are correctly formatted (388ms, 8 threads) 2026-10-25T13:30:03.8701211Z warn: Lint warnings found 2026-10-25T13:30:03.8702459Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T13:30:03.8702969Z ╭─[apps/web/src/components/CustomSnoozeDialog.tsx:140:58] 2026-10-25T13:30:03.8703668Z 139 │ {...(weekStartsOn === undefined ? {} : { weekStartsOn })} 2026-10-25T13:30:03.8704122Z 140 │ disabled={{ before: new Date(new Date().setHours(0, 0, 0, 0)) }} 2026-10-25T13:30:03.8704939Z ·  ─────┬──── 2026-10-25T13:30:03.8705453Z · ╰── Cannot call impure function 2026-10-25T13:30:03.8705857Z 141 │ onSelect={(selected) => { 2026-10-25T13:30:03.8706118Z ╰──── 2026-10-25T13:30:03.8706669Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T13:30:03.8707607Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T13:30:03.8708075Z 2026-10-25T13:30:03.8708396Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T13:30:03.8708966Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:266:35] 2026-10-25T13:30:03.8709223Z 265 │ }; 2026-10-25T13:30:03.8709547Z 266 │ }, [method, nativeRef, payload, resetKey, onFailure, onDelivered]); 2026-10-25T13:30:03.8709930Z ·  ────┬─── 2026-10-25T13:30:03.8710371Z · ╰── Unnecessary dependency `resetKey` 2026-10-25T13:30:03.8710707Z 267 │ } 2026-10-25T13:30:03.8711020Z ╰──── 2026-10-25T13:30:03.8711579Z  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-25T13:30:03.8712536Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.8713013Z 2026-10-25T13:30:03.8713279Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.8713766Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:390:39] 2026-10-25T13:30:03.8714110Z 389 │ 2026-10-25T13:30:03.8714504Z 390 │ ╭─▶ return createElement(RawNativeView, { 2026-10-25T13:30:03.8714926Z 391 │ │ ...nativeProps, 2026-10-25T13:30:03.8715322Z 392 │ │ refreshEnabled: props.onPullToRefresh !== undefined, 2026-10-25T13:30:03.8715706Z 393 │ │ onDebug: (event) => { 2026-10-25T13:30:03.8716135Z 394 │ │ if (event.nativeEvent.message === "rows-decode-failed") { 2026-10-25T13:30:03.8716704Z 395 │ │ console.error("[native-review-diff] rows decode failed", event.nativeEvent.error); 2026-10-25T13:30:03.8717166Z 396 │ │ onRowsFailure(); 2026-10-25T13:30:03.8717456Z 397 │ │ } 2026-10-25T13:30:03.8717752Z 398 │ │ onDebug?.(event); 2026-10-25T13:30:03.8718037Z 399 │ │ }, 2026-10-25T13:30:03.8718594Z 400 │ │ ref: nativeRef, 2026-10-25T13:30:03.8719097Z 401 │ ├─▶ }); 2026-10-25T13:30:03.8719665Z · ╰──── Passing a ref to a function may read its value during render 2026-10-25T13:30:03.8720088Z 402 │ } 2026-10-25T13:30:03.8720262Z ╰──── 2026-10-25T13:30:03.8721101Z  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-25T13:30:03.8722255Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.8722696Z 2026-10-25T13:30:03.8722969Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T13:30:03.8723469Z ╭─[apps/web/src/hooks/useThreadActions.ts:839:56] 2026-10-25T13:30:03.8723826Z 838 │ const resolved = resolveThreadTarget(target); 2026-10-25T13:30:03.8724250Z 839 │ if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) { 2026-10-25T13:30:03.8724691Z ·  ─────┬──── 2026-10-25T13:30:03.8725144Z · ╰── Cannot call impure function 2026-10-25T13:30:03.8725516Z 840 │ return AsyncResult.failure( 2026-10-25T13:30:03.8725749Z ╰──── 2026-10-25T13:30:03.8726275Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T13:30:03.8726847Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T13:30:03.8727129Z 2026-10-25T13:30:03.8727300Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T13:30:03.8727588Z ╭─[apps/web/src/hooks/useThreadActions.ts:727:46] 2026-10-25T13:30:03.8727794Z 726 │ const wokeAt = resolved 2026-10-25T13:30:03.8728021Z 727 │ ? threadWokeAt(resolved.thread, { now: new Date().toISOString() }) 2026-10-25T13:30:03.8728287Z ·  ─────┬──── 2026-10-25T13:30:03.8728570Z · ╰── Cannot call impure function 2026-10-25T13:30:03.8728800Z 728 │ : null; 2026-10-25T13:30:03.8728930Z ╰──── 2026-10-25T13:30:03.8729265Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T13:30:03.8730060Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T13:30:03.8730505Z 2026-10-25T13:30:03.8730803Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T13:30:03.8731160Z ╭─[apps/mobile/src/features/terminal/TerminalContextSheet.tsx:72:15] 2026-10-25T13:30:03.8731402Z 71 │ { 2026-10-25T13:30:03.8735152Z 201 │ terminalDebugLog("native:surface", { 2026-10-25T13:30:03.8735347Z 202 │ terminalKey: props.terminalKey, 2026-10-25T13:30:03.8735533Z 203 │ native: hasNativeSurface, 2026-10-25T13:30:03.8735767Z 204 │ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(), 2026-10-25T13:30:03.8736005Z 205 │ bufferLen: props.buffer.length, 2026-10-25T13:30:03.8736186Z 206 │ isRunning: props.isRunning, 2026-10-25T13:30:03.8736341Z 207 │ }); 2026-10-25T13:30:03.8736572Z 208 │ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]); 2026-10-25T13:30:03.8736830Z 209 │ const handleNativeInput = useCallback( 2026-10-25T13:30:03.8737071Z 210 │ (event: NativeSyntheticEvent) => { 2026-10-25T13:30:03.8737307Z 211 │ if (!props.isRunning || props.readOnly) { 2026-10-25T13:30:03.8737488Z 212 │ return; 2026-10-25T13:30:03.8737620Z 213 │ } 2026-10-25T13:30:03.8737782Z 214 │ terminalDebugLog("native:onInput", { 2026-10-25T13:30:03.8738046Z 215 │ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)), 2026-10-25T13:30:03.8738268Z 216 │ }); 2026-10-25T13:30:03.8738423Z 217 │ onInput(event.nativeEvent.data); 2026-10-25T13:30:03.8738586Z 218 │ }, 2026-10-25T13:30:03.8738754Z 219 │ [onInput, props.isRunning, props.readOnly], 2026-10-25T13:30:03.8738926Z 220 │ ); 2026-10-25T13:30:03.8739081Z 221 │ const handleNativeResize = useCallback( 2026-10-25T13:30:03.8739305Z 222 │ (event: NativeSyntheticEvent) => { 2026-10-25T13:30:03.8739512Z 223 │ onResize({ 2026-10-25T13:30:03.8739682Z 224 │ cols: event.nativeEvent.cols, 2026-10-25T13:30:03.8739875Z 225 │ rows: event.nativeEvent.rows, 2026-10-25T13:30:03.8740035Z 226 │ }); 2026-10-25T13:30:03.8740159Z 227 │ }, 2026-10-25T13:30:03.8740293Z 228 │ [onResize], 2026-10-25T13:30:03.8740425Z 229 │ ); 2026-10-25T13:30:03.8740546Z 230 │ 2026-10-25T13:30:03.8740693Z 231 │ if (NativeTerminalSurfaceView) { 2026-10-25T13:30:03.8740863Z 232 │ return ( 2026-10-25T13:30:03.8741027Z 233 │ 2026-10-25T13:30:03.8741214Z 234 │ { 2026-10-25T13:30:03.8747791Z ·  ───┬── 2026-10-25T13:30:03.8766259Z · ╰── For this reduce 2026-10-25T13:30:03.8766555Z 436 │ const exists = current.some( 2026-10-25T13:30:03.8766854Z 437 │ (favorite) => favorite.provider === change.provider && favorite.model === change.model, 2026-10-25T13:30:03.8767096Z 438 │ ); 2026-10-25T13:30:03.8767250Z 439 │ return change.favorite 2026-10-25T13:30:03.8767415Z 440 │ ? exists 2026-10-25T13:30:03.8767572Z 441 │ ? current 2026-10-25T13:30:03.8767799Z 442 │ : [...current, { provider: change.provider, model: change.model }] 2026-10-25T13:30:03.8768042Z ·  ─────┬──── 2026-10-25T13:30:03.8768279Z · ╰── From this spread 2026-10-25T13:30:03.8768494Z 443 │ : current.filter( 2026-10-25T13:30:03.8768649Z ╰──── 2026-10-25T13:30:03.8768927Z  help: Consider using `Object.assign()` or `Array.prototype.push()` to mutate the accumulator instead. 2026-10-25T13:30:03.8769309Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-25T13:30:03.8769482Z 2026-10-25T13:30:03.8769679Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-25T13:30:03.8769996Z ╭─[packages/shared/src/serverSettings.ts:453:3] 2026-10-25T13:30:03.8770189Z 451 │ null; 2026-10-25T13:30:03.8770390Z 452 │ let nextModelPreferences = initialModelPreferences; 2026-10-25T13:30:03.8770613Z ·  ──────────┬───────── 2026-10-25T13:30:03.8770849Z · ╰── From this accumulator 2026-10-25T13:30:03.8771085Z 453 │ for (const change of setModelsHidden ?? []) { 2026-10-25T13:30:03.8771475Z ·  ─┬─ 2026-10-25T13:30:03.8771724Z · ╰── For this loop 2026-10-25T13:30:03.8771979Z 454 │ const preferences = nextModelPreferences?.[change.provider] ?? { 2026-10-25T13:30:03.8772205Z 455 │ hiddenModels: [], 2026-10-25T13:30:03.8772361Z 456 │ modelOrder: [], 2026-10-25T13:30:03.8772509Z 457 │ }; 2026-10-25T13:30:03.8772762Z 458 │ const hiddenModels = preferences.hiddenModels.filter((model) => model !== change.model); 2026-10-25T13:30:03.8773062Z 459 │ if (change.hidden) hiddenModels.push(change.model); 2026-10-25T13:30:03.8773297Z 460 │ nextModelPreferences = { 2026-10-25T13:30:03.8773483Z 461 │ ...nextModelPreferences, 2026-10-25T13:30:03.8773683Z ·  ───────────┬─────────── 2026-10-25T13:30:03.8773924Z · ╰── From this spread 2026-10-25T13:30:03.8774179Z 462 │ [change.provider]: { ...preferences, hiddenModels }, 2026-10-25T13:30:03.8774371Z ╰──── 2026-10-25T13:30:03.8774591Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-25T13:30:03.8774912Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-25T13:30:03.8775080Z 2026-10-25T13:30:03.8775348Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T13:30:03.8775761Z ╭─[apps/mobile/src/features/terminal/terminalLaunchContext.ts:117:5] 2026-10-25T13:30:03.8776105Z 112 │ const [entry, setEntry] = useState(() => ({ key: input.targetKey, location: candidate })); 2026-10-25T13:30:03.8776349Z 113 │ useEffect(() => { 2026-10-25T13:30:03.8776513Z ·  ────┬──── 2026-10-25T13:30:03.8776741Z · ╰── This is the containing effect 2026-10-25T13:30:03.8777047Z 114 │ if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) { 2026-10-25T13:30:03.8777280Z 115 │ return; 2026-10-25T13:30:03.8777419Z 116 │ } 2026-10-25T13:30:03.8777607Z 117 │ setEntry({ key: input.targetKey, location: candidate }); 2026-10-25T13:30:03.8777819Z ·  ────┬─── 2026-10-25T13:30:03.8778079Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.8778370Z 118 │ }, [candidate, entry.key, entry.location, input.targetKey]); 2026-10-25T13:30:03.8778563Z ╰──── 2026-10-25T13:30:03.8779241Z  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-25T13:30:03.8780146Z  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-25T13:30:03.8780461Z 2026-10-25T13:30:03.8780685Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-25T13:30:03.8781046Z ╭─[packages/shared/src/composerContextLegacySend.ts:15:45] 2026-10-25T13:30:03.8781333Z 14 │ const occurrences = collectComposerContextReferences(text); 2026-10-25T13:30:03.8781584Z 15 │ for (const occurrence of [...occurrences].reverse()) { 2026-10-25T13:30:03.8781830Z ·  ─────── 2026-10-25T13:30:03.8782146Z 16 │ const record = recordsById.get(occurrence.contextId); 2026-10-25T13:30:03.8782373Z ╰──── 2026-10-25T13:30:03.8782710Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-25T13:30:03.8782964Z 2026-10-25T13:30:03.8783262Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T13:30:03.8783687Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:641:5] 2026-10-25T13:30:03.8783924Z 636 │ 2026-10-25T13:30:03.8784056Z 637 │ useEffect(() => { 2026-10-25T13:30:03.8784216Z ·  ────┬──── 2026-10-25T13:30:03.8784441Z · ╰── This is the containing effect 2026-10-25T13:30:03.8784929Z 638 │ if (pendingLaunchEntry.key === launchTargetKey) { 2026-10-25T13:30:03.8785228Z 639 │ return; 2026-10-25T13:30:03.8785372Z 640 │ } 2026-10-25T13:30:03.8785522Z 641 │ setPendingLaunchEntry({ 2026-10-25T13:30:03.8785709Z ·  ──────────┬────────── 2026-10-25T13:30:03.8785991Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.8786236Z 642 │ key: launchTargetKey, 2026-10-25T13:30:03.8786379Z ╰──── 2026-10-25T13:30:03.8787049Z  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-25T13:30:03.8787933Z  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-25T13:30:03.8788246Z 2026-10-25T13:30:03.8788509Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T13:30:03.8788934Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:651:5] 2026-10-25T13:30:03.8789169Z 646 │ 2026-10-25T13:30:03.8789303Z 647 │ useEffect(() => { 2026-10-25T13:30:03.8789463Z ·  ────┬──── 2026-10-25T13:30:03.8789682Z · ╰── This is the containing effect 2026-10-25T13:30:03.8789936Z 648 │ if (initialAttachGridEntry.key === launchTargetKey) { 2026-10-25T13:30:03.8790131Z 649 │ return; 2026-10-25T13:30:03.8790269Z 650 │ } 2026-10-25T13:30:03.8790523Z 651 │ setInitialAttachGridEntry({ 2026-10-25T13:30:03.8790786Z ·  ────────────┬──────────── 2026-10-25T13:30:03.8791065Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.8791312Z 652 │ key: launchTargetKey, 2026-10-25T13:30:03.8791460Z ╰──── 2026-10-25T13:30:03.8792130Z  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-25T13:30:03.8793003Z  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-25T13:30:03.8793364Z 2026-10-25T13:30:03.8793632Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T13:30:03.8794052Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:744:7] 2026-10-25T13:30:03.8794286Z 741 │ 2026-10-25T13:30:03.8794412Z 742 │ useEffect(() => { 2026-10-25T13:30:03.8794566Z ·  ────┬──── 2026-10-25T13:30:03.8794777Z · ╰── This is the containing effect 2026-10-25T13:30:03.8795013Z 743 │ if (!routeEnvironmentId || !routeThreadId) { 2026-10-25T13:30:03.8795193Z 744 │ setLastGridSize({ 2026-10-25T13:30:03.8795357Z ·  ───────┬─────── 2026-10-25T13:30:03.8795625Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.8795871Z 745 │ cols: DEFAULT_TERMINAL_COLS, 2026-10-25T13:30:03.8796020Z ╰──── 2026-10-25T13:30:03.8796671Z  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-25T13:30:03.8797535Z  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-25T13:30:03.8797837Z 2026-10-25T13:30:03.8798039Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T13:30:03.8798408Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:536:24] 2026-10-25T13:30:03.8798639Z 535 │ }); 2026-10-25T13:30:03.8798832Z 536 │ }, [terminal.buffer, terminal.buffer.length, terminalKey]); 2026-10-25T13:30:03.8799071Z ·  ───────────┬────────── 2026-10-25T13:30:03.8799430Z · ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead 2026-10-25T13:30:03.8799819Z 537 │ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null; 2026-10-25T13:30:03.8800038Z ╰──── 2026-10-25T13:30:03.8800385Z  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-25T13:30:03.8801062Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.8801421Z 2026-10-25T13:30:03.8801623Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T13:30:03.8801988Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:707:7] 2026-10-25T13:30:03.8802258Z 706 │ sentInitialInputKeyRef.current = null; 2026-10-25T13:30:03.8802438Z 707 │ }, [terminalKey]); 2026-10-25T13:30:03.8802600Z ·  ─────┬───── 2026-10-25T13:30:03.8802839Z · ╰── Unnecessary dependency `terminalKey` 2026-10-25T13:30:03.8803035Z 708 │ 2026-10-25T13:30:03.8803149Z ╰──── 2026-10-25T13:30:03.8803534Z  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-25T13:30:03.8804130Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.8804425Z 2026-10-25T13:30:03.8804624Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T13:30:03.8804990Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:798:52] 2026-10-25T13:30:03.8805220Z 797 │ }; 2026-10-25T13:30:03.8805468Z 798 │ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]); 2026-10-25T13:30:03.8805831Z ·  ────────────┬──────────── ─────┬───── 2026-10-25T13:30:03.8806233Z · │ ╰── Unnecessary dependency `terminalKey` 2026-10-25T13:30:03.8806649Z · ╰── Unnecessary dependency `terminal.lifecycleVersion` 2026-10-25T13:30:03.8806897Z 799 │ 2026-10-25T13:30:03.8807010Z ╰──── 2026-10-25T13:30:03.8807359Z  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-25T13:30:03.8807949Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.8808247Z 2026-10-25T13:30:03.8808396Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.8808723Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:791:24] 2026-10-25T13:30:03.8808956Z 790 │ } 2026-10-25T13:30:03.8809126Z 791 │ const pasteSession = pasteSessionRef.current; 2026-10-25T13:30:03.8809363Z ·  ───────────┬─────────── 2026-10-25T13:30:03.8809645Z · ╰── Cannot access ref value during render 2026-10-25T13:30:03.8809857Z 792 │ 2026-10-25T13:30:03.8809967Z ╰──── 2026-10-25T13:30:03.8810500Z  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-25T13:30:03.8811311Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.8811630Z 2026-10-25T13:30:03.8811777Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.8812097Z ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14] 2026-10-25T13:30:03.8812356Z 26 │ const latestInput = useRef(input); 2026-10-25T13:30:03.8812539Z 27 │ latestInput.current = input; 2026-10-25T13:30:03.8812751Z ·  ─────┬─────────┬─── 2026-10-25T13:30:03.8813047Z · │ ╰── Cannot update ref value during render 2026-10-25T13:30:03.8813371Z · ╰── This value is a ref 2026-10-25T13:30:03.8813571Z 28 │ const mounted = useRef(true); 2026-10-25T13:30:03.8813767Z ╰──── 2026-10-25T13:30:03.8814308Z  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-25T13:30:03.8815039Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.8815318Z 2026-10-25T13:30:03.8815699Z ⚠ 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-25T13:30:03.8816324Z ╭─[packages/shared/src/otelEnvironment.ts:146:14] 2026-10-25T13:30:03.8816606Z 145 │ name, 2026-10-25T13:30:03.8816935Z 146 │ (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()), 2026-10-25T13:30:03.8817333Z ·  ────────────────────────── 2026-10-25T13:30:03.8817598Z 147 │ `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`, 2026-10-25T13:30:03.8817789Z ╰──── 2026-10-25T13:30:03.8817848Z 2026-10-25T13:30:03.8818006Z ⚠ react(immutability): This value cannot be modified 2026-10-25T13:30:03.8818339Z ╭─[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5] 2026-10-25T13:30:03.8818614Z 65 │ const [expanded, setExpanded] = useState(false); 2026-10-25T13:30:03.8818819Z 66 │ const progress = useSharedValue(0); 2026-10-25T13:30:03.8819046Z ·  ────┬─── 2026-10-25T13:30:03.8819326Z · ╰── `progress` originates here 2026-10-25T13:30:03.8819533Z 67 │ useEffect(() => { 2026-10-25T13:30:03.8819753Z 68 │ progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING); 2026-10-25T13:30:03.8819966Z ·  ────┬─── 2026-10-25T13:30:03.8820197Z · ╰── `progress` cannot be modified 2026-10-25T13:30:03.8820413Z 69 │ }, [expanded, progress]); 2026-10-25T13:30:03.8820556Z ╰──── 2026-10-25T13:30:03.8820883Z  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-25T13:30:03.8821451Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T13:30:03.8821995Z 2026-10-25T13:30:03.8822182Z ⚠ react(immutability): This value cannot be modified 2026-10-25T13:30:03.8822726Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5] 2026-10-25T13:30:03.8823008Z 90 │ }) { 2026-10-25T13:30:03.8823219Z 91 │ const rotation = useSharedValue(props.hidden ? 1 : 0); 2026-10-25T13:30:03.8823432Z ·  ────┬─── 2026-10-25T13:30:03.8823660Z · ╰── `rotation` originates here 2026-10-25T13:30:03.8823872Z 92 │ useLayoutEffect(() => { 2026-10-25T13:30:03.8824108Z 93 │ rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING); 2026-10-25T13:30:03.8824338Z ·  ────┬─── 2026-10-25T13:30:03.8824674Z · ╰── `rotation` cannot be modified 2026-10-25T13:30:03.8824894Z 94 │ }, [props.hidden, rotation]); 2026-10-25T13:30:03.8825043Z ╰──── 2026-10-25T13:30:03.8825376Z  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-25T13:30:03.8825944Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T13:30:03.8826237Z 2026-10-25T13:30:03.8826401Z ⚠ react(immutability): This value cannot be modified 2026-10-25T13:30:03.8826734Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:266:5] 2026-10-25T13:30:03.8827008Z 263 │ const variant = props.variant ?? "plain"; 2026-10-25T13:30:03.8827256Z 264 │ const loadingVisibility = useSharedValue(props.loading ? 1 : 0); 2026-10-25T13:30:03.8827491Z ·  ────────┬──────── 2026-10-25T13:30:03.8827746Z · ╰── `loadingVisibility` originates here 2026-10-25T13:30:03.8827977Z 265 │ useLayoutEffect(() => { 2026-10-25T13:30:03.8828232Z 266 │ loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING); 2026-10-25T13:30:03.8828482Z ·  ────────┬──────── 2026-10-25T13:30:03.8828735Z · ╰── `loadingVisibility` cannot be modified 2026-10-25T13:30:03.8828977Z 267 │ }, [loadingVisibility, props.loading]); 2026-10-25T13:30:03.8829142Z ╰──── 2026-10-25T13:30:03.8829465Z  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-25T13:30:03.8830030Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T13:30:03.8830324Z 2026-10-25T13:30:03.8830581Z ⚠ react(immutability): This value cannot be modified 2026-10-25T13:30:03.8830966Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:325:5] 2026-10-25T13:30:03.8831197Z 322 │ }) { 2026-10-25T13:30:03.8831427Z 323 │ const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0); 2026-10-25T13:30:03.8831684Z ·  ─────────┬───────── 2026-10-25T13:30:03.8831944Z · ╰── `recordingVisibility` originates here 2026-10-25T13:30:03.8832167Z 324 │ useLayoutEffect(() => { 2026-10-25T13:30:03.8832449Z 325 │ recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING); 2026-10-25T13:30:03.8832727Z ·  ─────────┬───────── 2026-10-25T13:30:03.8832984Z · ╰── `recordingVisibility` cannot be modified 2026-10-25T13:30:03.8833270Z 326 │ }, [props.phase, recordingVisibility]); 2026-10-25T13:30:03.8833441Z ╰──── 2026-10-25T13:30:03.8833763Z  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-25T13:30:03.8834328Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T13:30:03.8834618Z 2026-10-25T13:30:03.8834771Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.8835089Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:120:38] 2026-10-25T13:30:03.8835426Z 119 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-25T13:30:03.8835730Z 120 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-25T13:30:03.8835998Z ·  ───────────┬────────── 2026-10-25T13:30:03.8836307Z · ╰── Cannot access ref value during render 2026-10-25T13:30:03.8836601Z 121 │ const sessionRef = useRef(null); 2026-10-25T13:30:03.8836787Z ╰──── 2026-10-25T13:30:03.8837321Z  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-25T13:30:03.8838052Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.8838334Z 2026-10-25T13:30:03.8838489Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.8838814Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:124:8] 2026-10-25T13:30:03.8839037Z 123 │ 2026-10-25T13:30:03.8839209Z 124 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-25T13:30:03.8839422Z ·  ─────────┬──────── 2026-10-25T13:30:03.8839674Z · ╰── Cannot access ref value during render 2026-10-25T13:30:03.8839932Z 125 │ const recorder = createLazyVoiceRecorder({ 2026-10-25T13:30:03.8840104Z ╰──── 2026-10-25T13:30:03.8840715Z  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-25T13:30:03.8841488Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.8841770Z 2026-10-25T13:30:03.8841918Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.8842232Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:124:7] 2026-10-25T13:30:03.8842458Z 123 │ 2026-10-25T13:30:03.8842625Z 124 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-25T13:30:03.8842837Z ·  ─────────┬───────── 2026-10-25T13:30:03.8843087Z · ╰── Cannot access ref value during render 2026-10-25T13:30:03.8843377Z 125 │ const recorder = createLazyVoiceRecorder({ 2026-10-25T13:30:03.8843545Z ╰──── 2026-10-25T13:30:03.8844082Z  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-25T13:30:03.8844809Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.8845089Z 2026-10-25T13:30:03.8845237Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.8845552Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:124:31] 2026-10-25T13:30:03.8845820Z 123 │ 2026-10-25T13:30:03.8845992Z 124 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-25T13:30:03.8846235Z ·  ─────────┬───────── 2026-10-25T13:30:03.8846533Z · ╰── Cannot access ref value during render 2026-10-25T13:30:03.8846801Z 125 │ const recorder = createLazyVoiceRecorder({ 2026-10-25T13:30:03.8846968Z ╰──── 2026-10-25T13:30:03.8847495Z  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-25T13:30:03.8848212Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.8848493Z 2026-10-25T13:30:03.8848640Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.8848957Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:124:30] 2026-10-25T13:30:03.8849183Z 123 │ 2026-10-25T13:30:03.8849349Z 124 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-25T13:30:03.8849589Z ·  ──────────┬───────── 2026-10-25T13:30:03.8849878Z · ╰── Cannot access ref value during render 2026-10-25T13:30:03.8850146Z 125 │ const recorder = createLazyVoiceRecorder({ 2026-10-25T13:30:03.8850313Z ╰──── 2026-10-25T13:30:03.8850839Z  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-25T13:30:03.8851636Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.8852084Z 2026-10-25T13:30:03.8852232Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.8852541Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:125:46] 2026-10-25T13:30:03.8852818Z 124 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-25T13:30:03.8853139Z 125 │ ╭─▶ const recorder = createLazyVoiceRecorder({ 2026-10-25T13:30:03.8853536Z 126 │ │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-25T13:30:03.8853839Z 127 │ │ onStatus: (status: RecordingStatus) => { 2026-10-25T13:30:03.8854144Z 128 │ │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-25T13:30:03.8854427Z 129 │ │ isFinished: status.isFinished, 2026-10-25T13:30:03.8854735Z 130 │ │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-25T13:30:03.8855015Z 131 │ │ error: status.error, 2026-10-25T13:30:03.8855233Z 132 │ │ url: status.url, 2026-10-25T13:30:03.8855426Z 133 │ │ }); 2026-10-25T13:30:03.8855602Z 134 │ │ }, 2026-10-25T13:30:03.8855893Z 135 │ │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-25T13:30:03.8856193Z 136 │ │ selectInput: (inputs) => { 2026-10-25T13:30:03.8856477Z 137 │ │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-25T13:30:03.8856784Z 138 │ │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-25T13:30:03.8857103Z 139 │ │ const known = microphoneOrder(preferences.value.microphones); 2026-10-25T13:30:03.8857409Z 140 │ │ const order = rememberMicrophones(known, inputs); 2026-10-25T13:30:03.8857663Z 141 │ │ if (order !== known) { 2026-10-25T13:30:03.8857917Z 142 │ │ registry.set(updateMobilePreferencesAtom, { 2026-10-25T13:30:03.8858180Z 143 │ │ transform: (current) => ({ 2026-10-25T13:30:03.8858510Z 144 │ │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-25T13:30:03.8858803Z 145 │ │ }), 2026-10-25T13:30:03.8858988Z 146 │ │ }); 2026-10-25T13:30:03.8859164Z 147 │ │ } 2026-10-25T13:30:03.8859401Z 148 │ │ return preferredMicrophoneInput(inputs, order); 2026-10-25T13:30:03.8859623Z 149 │ │ }, 2026-10-25T13:30:03.8859853Z 150 │ ├─▶ }); 2026-10-25T13:30:03.8860232Z · ╰──── Passing a ref to a function may read its value during render 2026-10-25T13:30:03.8860541Z 151 │ recorderRef.current = recorder; 2026-10-25T13:30:03.8860700Z ╰──── 2026-10-25T13:30:03.8861308Z  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-25T13:30:03.8862067Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.8862341Z 2026-10-25T13:30:03.8862490Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.8862806Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:151:16] 2026-10-25T13:30:03.8863030Z 150 │ }); 2026-10-25T13:30:03.8863220Z 151 │ recorderRef.current = recorder; 2026-10-25T13:30:03.8863438Z ·  ─────┬─────────┬─── 2026-10-25T13:30:03.8863747Z · │ ╰── Cannot update ref value during render 2026-10-25T13:30:03.8864051Z · ╰── This value is a ref 2026-10-25T13:30:03.8864286Z 152 │ sessionRef.current = new VoiceInputSession({ 2026-10-25T13:30:03.8864456Z ╰──── 2026-10-25T13:30:03.8865308Z  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-25T13:30:03.8866028Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.8866305Z 2026-10-25T13:30:03.8866453Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.8866768Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:152:48] 2026-10-25T13:30:03.8867025Z 151 │ recorderRef.current = recorder; 2026-10-25T13:30:03.8867324Z 152 │ ╭─▶ sessionRef.current = new VoiceInputSession({ 2026-10-25T13:30:03.8867598Z 153 │ │ recorder, 2026-10-25T13:30:03.8867828Z 154 │ │ getTranscriber: getLocalVoiceTranscriber, 2026-10-25T13:30:03.8868086Z 155 │ │ requestPermission: async () => { 2026-10-25T13:30:03.8868383Z 156 │ │ const permission = await requestRecordingPermissionsAsync(); 2026-10-25T13:30:03.8868739Z 157 │ │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-25T13:30:03.8869007Z 158 │ │ }, 2026-10-25T13:30:03.8869251Z 159 │ │ configureRecording: configureVoiceRecordingAudio, 2026-10-25T13:30:03.8869542Z 160 │ │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-25T13:30:03.8869820Z 161 │ │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-25T13:30:03.8870075Z 162 │ │ onStateChange: (nextState) => 2026-10-25T13:30:03.8870289Z 163 │ │ setState({ 2026-10-25T13:30:03.8870498Z 164 │ │ state: nextState, 2026-10-25T13:30:03.8870749Z 165 │ │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-25T13:30:03.8871026Z 166 │ │ label: sessionRef.current?.label ?? null, 2026-10-25T13:30:03.8871244Z 167 │ │ }), 2026-10-25T13:30:03.8871578Z 168 │ ├─▶ }); 2026-10-25T13:30:03.8871964Z · ╰──── Cannot access ref value during render 2026-10-25T13:30:03.8872210Z 169 │ } 2026-10-25T13:30:03.8872329Z ╰──── 2026-10-25T13:30:03.8872855Z  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-25T13:30:03.8873602Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.8873882Z 2026-10-25T13:30:03.8874030Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.8874346Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:152:15] 2026-10-25T13:30:03.8874600Z 151 │ recorderRef.current = recorder; 2026-10-25T13:30:03.8874805Z 152 │ sessionRef.current = new VoiceInputSession({ 2026-10-25T13:30:03.8875038Z ·  ─────┬────────┬─── 2026-10-25T13:30:03.8875342Z · │ ╰── Cannot update ref value during render 2026-10-25T13:30:03.8875634Z · ╰── This value is a ref 2026-10-25T13:30:03.8875822Z 153 │ recorder, 2026-10-25T13:30:03.8875950Z ╰──── 2026-10-25T13:30:03.8876476Z  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-25T13:30:03.8877198Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.8877482Z 2026-10-25T13:30:03.8877630Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.8877939Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:181:7] 2026-10-25T13:30:03.8878186Z 180 │ return () => subscription.remove(); 2026-10-25T13:30:03.8878351Z 181 │ }, [controller]); 2026-10-25T13:30:03.8878507Z ·  ─────┬──── 2026-10-25T13:30:03.8878745Z · ╰── Cannot access ref value during render 2026-10-25T13:30:03.8878947Z 182 │ 2026-10-25T13:30:03.8879056Z ╰──── 2026-10-25T13:30:03.8879582Z  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-25T13:30:03.8880300Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.8880579Z 2026-10-25T13:30:03.8880726Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.8881033Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:181:6] 2026-10-25T13:30:03.8881281Z 180 │ return () => subscription.remove(); 2026-10-25T13:30:03.8881449Z 181 │ }, [controller]); 2026-10-25T13:30:03.8881609Z ·  ──────┬───── 2026-10-25T13:30:03.8881940Z · ╰── Cannot access ref value during render 2026-10-25T13:30:03.8882178Z 182 │ 2026-10-25T13:30:03.8882285Z ╰──── 2026-10-25T13:30:03.8882810Z  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-25T13:30:03.8883557Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.8883834Z 2026-10-25T13:30:03.8883981Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.8884286Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:188:6] 2026-10-25T13:30:03.8884505Z 187 │ }, 2026-10-25T13:30:03.8884644Z 188 │ [controller, recorder], 2026-10-25T13:30:03.8884818Z ·  ─────┬──── 2026-10-25T13:30:03.8885051Z · ╰── Cannot access ref value during render 2026-10-25T13:30:03.8885250Z 189 │ ); 2026-10-25T13:30:03.8885368Z ╰──── 2026-10-25T13:30:03.8885888Z  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-25T13:30:03.8886605Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.8886881Z 2026-10-25T13:30:03.8887028Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.8887339Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:173:20] 2026-10-25T13:30:03.8887598Z 172 │ const controller = session.controller; 2026-10-25T13:30:03.8887794Z 173 │ const recorder = recorderRef.current; 2026-10-25T13:30:03.8888003Z ·  ─────────┬───────── 2026-10-25T13:30:03.8888280Z · ╰── Cannot access ref value during render 2026-10-25T13:30:03.8888487Z 174 │ 2026-10-25T13:30:03.8888599Z ╰──── 2026-10-25T13:30:03.8889121Z  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-25T13:30:03.8889918Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.8890242Z 2026-10-25T13:30:03.8890386Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.8890694Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:188:5] 2026-10-25T13:30:03.8890913Z 187 │ }, 2026-10-25T13:30:03.8891050Z 188 │ [controller, recorder], 2026-10-25T13:30:03.8891230Z ·  ───────────┬────────── 2026-10-25T13:30:03.8891483Z · ╰── Cannot access ref value during render 2026-10-25T13:30:03.8891684Z 189 │ ); 2026-10-25T13:30:03.8891801Z ╰──── 2026-10-25T13:30:03.8892330Z  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-25T13:30:03.8893051Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.8893353Z 2026-10-25T13:30:03.8893495Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.8893803Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:242:20] 2026-10-25T13:30:03.8894060Z 241 │ return () => clearInterval(intervalId); 2026-10-25T13:30:03.8894283Z 242 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-25T13:30:03.8894496Z ·  ─────┬──── 2026-10-25T13:30:03.8894765Z · ╰── Cannot access ref value during render 2026-10-25T13:30:03.8894973Z 243 │ 2026-10-25T13:30:03.8895084Z ╰──── 2026-10-25T13:30:03.8895602Z  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-25T13:30:03.8896323Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.8896600Z 2026-10-25T13:30:03.8896745Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.8897054Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:242:6] 2026-10-25T13:30:03.8897304Z 241 │ return () => clearInterval(intervalId); 2026-10-25T13:30:03.8897526Z 242 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-25T13:30:03.8897790Z ·  ────────────────────────┬─────────────────────── 2026-10-25T13:30:03.8898085Z · ╰── Cannot access ref value during render 2026-10-25T13:30:03.8898295Z 243 │ 2026-10-25T13:30:03.8898404Z ╰──── 2026-10-25T13:30:03.8898925Z  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-25T13:30:03.8899636Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.8899910Z 2026-10-25T13:30:03.8900133Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.8900485Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:257:5] 2026-10-25T13:30:03.8900712Z 256 │ setOwnerFocused, 2026-10-25T13:30:03.8900859Z 257 │ session, 2026-10-25T13:30:03.8901002Z ·  ───┬─── 2026-10-25T13:30:03.8901229Z · ╰── Cannot access ref value during render 2026-10-25T13:30:03.8901431Z 258 │ stop, 2026-10-25T13:30:03.8901552Z ╰──── 2026-10-25T13:30:03.8902074Z  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-25T13:30:03.8902799Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.8903081Z 2026-10-25T13:30:03.8903256Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.8903566Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:247:10] 2026-10-25T13:30:03.8903786Z 246 │ 2026-10-25T13:30:03.8903991Z 247 │ ╭─▶ return { 2026-10-25T13:30:03.8904349Z 248 │ │ isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null, 2026-10-25T13:30:03.8906041Z 249 │ │ state, 2026-10-25T13:30:03.8906237Z 250 │ │ audioLevels, 2026-10-25T13:30:03.8906439Z 251 │ │ elapsedSeconds, 2026-10-25T13:30:03.8906692Z 252 │ │ isBusy: voiceInputBlocksSubmission(state), 2026-10-25T13:30:03.8906924Z 253 │ │ ownerKey, 2026-10-25T13:30:03.8907104Z 254 │ │ label, 2026-10-25T13:30:03.8907290Z 255 │ │ focusedOwners, 2026-10-25T13:30:03.8907493Z 256 │ │ setOwnerFocused, 2026-10-25T13:30:03.8907687Z 257 │ │ session, 2026-10-25T13:30:03.8907863Z 258 │ │ stop, 2026-10-25T13:30:03.8908044Z 259 │ │ cancel, 2026-10-25T13:30:03.8908272Z 260 │ ├─▶ }; 2026-10-25T13:30:03.8908611Z · ╰──── Cannot access ref value during render 2026-10-25T13:30:03.8908856Z 261 │ } 2026-10-25T13:30:03.8908985Z ╰──── 2026-10-25T13:30:03.8909515Z  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-25T13:30:03.8910237Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.8910516Z 2026-10-25T13:30:03.8910675Z ⚠ react(immutability): This value cannot be modified 2026-10-25T13:30:03.8910996Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:208:7] 2026-10-25T13:30:03.8911321Z 119 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-25T13:30:03.8911720Z 120 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-25T13:30:03.8911990Z ·  ─────┬───── 2026-10-25T13:30:03.8912228Z · ╰── `audioLevels` originates here 2026-10-25T13:30:03.8912490Z 121 │ const sessionRef = useRef(null); 2026-10-25T13:30:03.8912776Z 122 │ const recorderRef = useRef | null>(null); 2026-10-25T13:30:03.8912989Z 123 │ 2026-10-25T13:30:03.8913188Z 124 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-25T13:30:03.8913412Z 125 │ const recorder = createLazyVoiceRecorder({ 2026-10-25T13:30:03.8913671Z 126 │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-25T13:30:03.8913921Z 127 │ onStatus: (status: RecordingStatus) => { 2026-10-25T13:30:03.8914156Z 128 │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-25T13:30:03.8914394Z 129 │ isFinished: status.isFinished, 2026-10-25T13:30:03.8914649Z 130 │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-25T13:30:03.8914882Z 131 │ error: status.error, 2026-10-25T13:30:03.8915047Z 132 │ url: status.url, 2026-10-25T13:30:03.8915202Z 133 │ }); 2026-10-25T13:30:03.8915333Z 134 │ }, 2026-10-25T13:30:03.8915570Z 135 │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-25T13:30:03.8915819Z 136 │ selectInput: (inputs) => { 2026-10-25T13:30:03.8916043Z 137 │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-25T13:30:03.8916292Z 138 │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-25T13:30:03.8916553Z 139 │ const known = microphoneOrder(preferences.value.microphones); 2026-10-25T13:30:03.8916819Z 140 │ const order = rememberMicrophones(known, inputs); 2026-10-25T13:30:03.8917021Z 141 │ if (order !== known) { 2026-10-25T13:30:03.8917226Z 142 │ registry.set(updateMobilePreferencesAtom, { 2026-10-25T13:30:03.8917434Z 143 │ transform: (current) => ({ 2026-10-25T13:30:03.8917713Z 144 │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-25T13:30:03.8917954Z 145 │ }), 2026-10-25T13:30:03.8918099Z 146 │ }); 2026-10-25T13:30:03.8918234Z 147 │ } 2026-10-25T13:30:03.8918418Z 148 │ return preferredMicrophoneInput(inputs, order); 2026-10-25T13:30:03.8918601Z 149 │ }, 2026-10-25T13:30:03.8918728Z 150 │ }); 2026-10-25T13:30:03.8918881Z 151 │ recorderRef.current = recorder; 2026-10-25T13:30:03.8919088Z 152 │ sessionRef.current = new VoiceInputSession({ 2026-10-25T13:30:03.8919282Z 153 │ recorder, 2026-10-25T13:30:03.8919462Z 154 │ getTranscriber: getLocalVoiceTranscriber, 2026-10-25T13:30:03.8919669Z 155 │ requestPermission: async () => { 2026-10-25T13:30:03.8919905Z 156 │ const permission = await requestRecordingPermissionsAsync(); 2026-10-25T13:30:03.8920213Z 157 │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-25T13:30:03.8920440Z 158 │ }, 2026-10-25T13:30:03.8920621Z 159 │ configureRecording: configureVoiceRecordingAudio, 2026-10-25T13:30:03.8920857Z 160 │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-25T13:30:03.8921083Z 161 │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-25T13:30:03.8921288Z 162 │ onStateChange: (nextState) => 2026-10-25T13:30:03.8921456Z 163 │ setState({ 2026-10-25T13:30:03.8921708Z 164 │ state: nextState, 2026-10-25T13:30:03.8921954Z 165 │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-25T13:30:03.8922180Z 166 │ label: sessionRef.current?.label ?? null, 2026-10-25T13:30:03.8922356Z 167 │ }), 2026-10-25T13:30:03.8922490Z 168 │ }); 2026-10-25T13:30:03.8922613Z 169 │ } 2026-10-25T13:30:03.8922731Z 170 │ 2026-10-25T13:30:03.8922882Z 171 │ const session = sessionRef.current; 2026-10-25T13:30:03.8923076Z 172 │ const controller = session.controller; 2026-10-25T13:30:03.8923303Z 173 │ const recorder = recorderRef.current; 2026-10-25T13:30:03.8923461Z 174 │ 2026-10-25T13:30:03.8923593Z 175 │ useEffect(() => { 2026-10-25T13:30:03.8923829Z 176 │ const subscription = AppState.addEventListener("change", (nextState) => { 2026-10-25T13:30:03.8924248Z 177 │ // iOS permission dialogs report inactive; cancel preparation only on background. Recorder status handles capture interruptions. 2026-10-25T13:30:03.8924635Z 178 │ if (nextState === "background") controller.appMovedToBackground(); 2026-10-25T13:30:03.8924847Z 179 │ }); 2026-10-25T13:30:03.8925001Z 180 │ return () => subscription.remove(); 2026-10-25T13:30:03.8925170Z 181 │ }, [controller]); 2026-10-25T13:30:03.8925310Z 182 │ 2026-10-25T13:30:03.8925433Z 183 │ useEffect( 2026-10-25T13:30:03.8925576Z 184 │ () => () => { 2026-10-25T13:30:03.8925731Z 185 │ controller.dispose(); 2026-10-25T13:30:03.8925896Z 186 │ recorder.release(); 2026-10-25T13:30:03.8926041Z 187 │ }, 2026-10-25T13:30:03.8926180Z 188 │ [controller, recorder], 2026-10-25T13:30:03.8926328Z 189 │ ); 2026-10-25T13:30:03.8926446Z 190 │ 2026-10-25T13:30:03.8926573Z 191 │ useEffect(() => { 2026-10-25T13:30:03.8926756Z 192 │ if (state.phase !== "recording") return; 2026-10-25T13:30:03.8926930Z 193 │ 2026-10-25T13:30:03.8927141Z 194 │ const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`; 2026-10-25T13:30:03.8927410Z 195 │ const activation = activateKeepAwakeAsync(tag); 2026-10-25T13:30:03.8927612Z 196 │ void activation.catch(() => {}); 2026-10-25T13:30:03.8927780Z 197 │ return () => { 2026-10-25T13:30:03.8928020Z 198 │ // Release after activation settles, even if the recording ends immediately. 2026-10-25T13:30:03.8928321Z 199 │ void activation.then(() => deactivateKeepAwake(tag)).catch(() => {}); 2026-10-25T13:30:03.8928533Z 200 │ }; 2026-10-25T13:30:03.8928681Z 201 │ }, [keepAwakeId, state.phase]); 2026-10-25T13:30:03.8928840Z 202 │ 2026-10-25T13:30:03.8928966Z 203 │ useEffect(() => { 2026-10-25T13:30:03.8929194Z 204 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-25T13:30:03.8929399Z 205 │ 2026-10-25T13:30:03.8929585Z 206 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-25T13:30:03.8929878Z 207 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-25T13:30:03.8930147Z 208 │ audioLevels.value = audioLevelsRef.current; 2026-10-25T13:30:03.8930349Z ·  ─────┬───── 2026-10-25T13:30:03.8930590Z · ╰── `audioLevels` cannot be modified 2026-10-25T13:30:03.8930793Z 209 │ } 2026-10-25T13:30:03.8930915Z ╰──── 2026-10-25T13:30:03.8931248Z  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-25T13:30:03.8931904Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T13:30:03.8932242Z 2026-10-25T13:30:03.8932452Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-25T13:30:03.8932813Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:208:7] 2026-10-25T13:30:03.8933042Z 202 │ 2026-10-25T13:30:03.8933206Z 203 │ useEffect(() => { 2026-10-25T13:30:03.8933374Z ·  ───┬─── 2026-10-25T13:30:03.8933692Z · ╰── This function may (indirectly) reassign or modify `audioLevels` after render 2026-10-25T13:30:03.8934045Z 204 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-25T13:30:03.8934246Z 205 │ 2026-10-25T13:30:03.8934432Z 206 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-25T13:30:03.8934732Z 207 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-25T13:30:03.8935004Z 208 │ audioLevels.value = audioLevelsRef.current; 2026-10-25T13:30:03.8935205Z ·  ─────┬───── 2026-10-25T13:30:03.8935434Z · ╰── This modifies `audioLevels` 2026-10-25T13:30:03.8935632Z 209 │ } 2026-10-25T13:30:03.8935751Z ╰──── 2026-10-25T13:30:03.8936156Z  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-25T13:30:03.8936784Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T13:30:03.8937081Z 2026-10-25T13:30:03.8937319Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-25T13:30:03.8937671Z ╭─[apps/server/src/terminal/Manager.test.ts:731:31] 2026-10-25T13:30:03.8937872Z 730 │ ); 2026-10-25T13:30:03.8938118Z 731 │ const snapshot = events.filter((event) => event.type === "snapshot").at(-1)?.snapshot; 2026-10-25T13:30:03.8938398Z ·  ────── 2026-10-25T13:30:03.8938629Z 732 │ expect(snapshot?.history).toBe("aa😀\rEND"); 2026-10-25T13:30:03.8938804Z ╰──── 2026-10-25T13:30:03.8939036Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-25T13:30:03.8939215Z 2026-10-25T13:30:03.8939478Z ⚠ eslint(no-unused-vars): Variable 'I' is declared but never used. Unused variables should start with a '_'. 2026-10-25T13:30:03.8939834Z ╭─[apps/server/src/guest/http.ts:88:33] 2026-10-25T13:30:03.8940114Z 87 │ /** Server-sent events with a heartbeat, never cached or buffered on the way. */ 2026-10-25T13:30:03.8940361Z 88 │ const eventStreamResponse = ( 2026-10-25T13:30:03.8940566Z ·  ┬ 2026-10-25T13:30:03.8947894Z · ╰── 'I' is declared here 2026-10-25T13:30:03.8948148Z 89 │ events: Stream.Stream, 2026-10-25T13:30:03.8948296Z ╰──── 2026-10-25T13:30:03.8948457Z  help: Consider removing this declaration. 2026-10-25T13:30:03.8948577Z 2026-10-25T13:30:03.8948782Z ⚠ eslint(no-unused-vars): Identifier 'Option' is imported but never used. 2026-10-25T13:30:03.8949114Z ╭─[apps/server/src/guest/GuestShareService.test.ts:24:13] 2026-10-25T13:30:03.8949478Z 23 │ import * as Ref from "effect/Ref"; 2026-10-25T13:30:03.8949716Z 24 │ import * as Option from "effect/Option"; 2026-10-25T13:30:03.8949897Z ·  ───┬── 2026-10-25T13:30:03.8950124Z · ╰── 'Option' is imported here 2026-10-25T13:30:03.8950344Z 25 │ import * as Stream from "effect/Stream"; 2026-10-25T13:30:03.8950497Z ╰──── 2026-10-25T13:30:03.8950645Z  help: Consider removing this import. 2026-10-25T13:30:03.8950756Z 2026-10-25T13:30:03.8950986Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-25T13:30:03.8951343Z ╭─[apps/server/src/guest/GuestShareService.test.ts:733:50] 2026-10-25T13:30:03.8951657Z 732 │ yield* guestShares.submit(session, { shareId, text: `note ${index}` }, []); 2026-10-25T13:30:03.8951994Z 733 │ const [waiting] = (yield* waitingMessages).filter((next) => next.status === "pending"); 2026-10-25T13:30:03.8952694Z ·  ────── 2026-10-25T13:30:03.8952903Z 734 │ yield* orchestrator.dispatch({ 2026-10-25T13:30:03.8953060Z ╰──── 2026-10-25T13:30:03.8953324Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-25T13:30:03.8953502Z 2026-10-25T13:30:03.8953873Z ⚠ 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-25T13:30:03.8954342Z ╭─[apps/server/src/vcs/GitVcsDriverCore.test.ts:1786:34] 2026-10-25T13:30:03.8954630Z 1785 │ const stat = branch.files!.find((file) => file.path === path)!; 2026-10-25T13:30:03.8954930Z 1786 │ const request = yield* Schema.decodeEffect(ReviewDiffPreviewInput)({ 2026-10-25T13:30:03.8955210Z ·  ─────────────────── 2026-10-25T13:30:03.8955395Z 1787 │ cwd, 2026-10-25T13:30:03.8955528Z ╰──── 2026-10-25T13:30:03.8955584Z 2026-10-25T13:30:03.8955866Z ⚠ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'. 2026-10-25T13:30:03.8956279Z ╭─[apps/web/src/components/preview/PreviewPanelShell.tsx:57:9] 2026-10-25T13:30:03.8956488Z 56 │ ) { 2026-10-25T13:30:03.8956720Z 57 │ const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded"; 2026-10-25T13:30:03.8956974Z ·  ──────┬────── 2026-10-25T13:30:03.8957301Z · ╰── 'useDragRegion' is declared here 2026-10-25T13:30:03.8957589Z 58 │ const isInline = props.mode === "inline"; 2026-10-25T13:30:03.8957751Z ╰──── 2026-10-25T13:30:03.8957910Z  help: Consider removing this declaration. 2026-10-25T13:30:03.8958030Z 2026-10-25T13:30:03.8958272Z ⚠ unicorn(prefer-string-starts-ends-with): Prefer String#startsWith over a regex with a caret. 2026-10-25T13:30:03.8958631Z ╭─[apps/server/src/vcs/GitVcsDriverCore.ts:498:11] 2026-10-25T13:30:03.8958866Z 497 │ GIT_DIAGNOSTIC_LINE_PATTERN.test(line) || 2026-10-25T13:30:03.8959116Z 498 │ (!/^remote:/.test(line) && SSH_TRANSPORT_REFUSAL_PATTERN.test(line)), 2026-10-25T13:30:03.8959349Z ·  ─────────────── 2026-10-25T13:30:03.8959504Z 499 │ ) 2026-10-25T13:30:03.8959620Z ╰──── 2026-10-25T13:30:03.8959838Z  help: Replace `/^remote:/.test(line)` with `line.startsWith('remote:')`. 2026-10-25T13:30:03.8960004Z 2026-10-25T13:30:03.8960199Z ⚠ eslint(no-unused-vars): Identifier 'Image' is imported but never used. 2026-10-25T13:30:03.8960537Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:17:10] 2026-10-25T13:30:03.8960822Z 16 │ import type { NativeSyntheticEvent, ViewProps } from "react-native"; 2026-10-25T13:30:03.8961083Z 17 │ import { Image, Platform, StyleSheet } from "react-native"; 2026-10-25T13:30:03.8961285Z ·  ──┬── 2026-10-25T13:30:03.8961504Z · ╰── 'Image' is imported here 2026-10-25T13:30:03.8961690Z 18 │ 2026-10-25T13:30:03.8961799Z ╰──── 2026-10-25T13:30:03.8961950Z  help: Consider removing this import. 2026-10-25T13:30:03.8962065Z 2026-10-25T13:30:03.8962277Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-25T13:30:03.8962626Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:227:6] 2026-10-25T13:30:03.8962938Z 223 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-25T13:30:03.8963232Z 224 │ nativeEventSnapshotsRef.current, 2026-10-25T13:30:03.8963431Z ·  ───────────┬─────────── 2026-10-25T13:30:03.8964013Z · ╰── 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-25T13:30:03.8964506Z 225 │ mostRecentEventCount, 2026-10-25T13:30:03.8964657Z 226 │ ); 2026-10-25T13:30:03.8964849Z 227 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-25T13:30:03.8965131Z ·  ──────────────────────────┬────────────────────────── 2026-10-25T13:30:03.8965472Z · ╰── This dependency list is missing values used by the callback 2026-10-25T13:30:03.8965748Z 228 │ const assumedValue = props.value; 2026-10-25T13:30:03.8965901Z ╰──── 2026-10-25T13:30:03.8966124Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-25T13:30:03.8966622Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.8966926Z 2026-10-25T13:30:03.8967143Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T13:30:03.8967581Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:233:7] 2026-10-25T13:30:03.8967917Z 232 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-25T13:30:03.8968160Z 233 │ nativeEventSnapshotsRef.current, 2026-10-25T13:30:03.8968359Z ·  ───────────┬─────────── 2026-10-25T13:30:03.8968927Z · ╰── 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-25T13:30:03.8969418Z 234 │ controlledEventCount, 2026-10-25T13:30:03.8969576Z 235 │ assumedValue, 2026-10-25T13:30:03.8969714Z 236 │ ); 2026-10-25T13:30:03.8969936Z 237 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-25T13:30:03.8970245Z ·  ───────────┬────────── 2026-10-25T13:30:03.8970599Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-25T13:30:03.8970882Z 238 │ const acceptNativeEvent = useCallback( 2026-10-25T13:30:03.8971041Z ╰──── 2026-10-25T13:30:03.8971520Z  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-25T13:30:03.8972223Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.8972525Z 2026-10-25T13:30:03.8972680Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.8972980Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:160:29] 2026-10-25T13:30:03.8973300Z 159 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-25T13:30:03.8973549Z 160 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-25T13:30:03.8973797Z ·  ─────────────┬──────────── 2026-10-25T13:30:03.8974091Z · ╰── Cannot access ref value during render 2026-10-25T13:30:03.8974307Z 161 │ }); 2026-10-25T13:30:03.8974425Z ╰──── 2026-10-25T13:30:03.8974958Z  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-25T13:30:03.8975682Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.8975963Z 2026-10-25T13:30:03.8976111Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.8976405Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:160:29] 2026-10-25T13:30:03.8976677Z 159 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-25T13:30:03.8976924Z 160 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-25T13:30:03.8977166Z ·  ─────────────┬──────────── 2026-10-25T13:30:03.8977584Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T13:30:03.8977875Z 161 │ }); 2026-10-25T13:30:03.8977992Z ╰──── 2026-10-25T13:30:03.8978514Z  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-25T13:30:03.8979233Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.8979510Z 2026-10-25T13:30:03.8979656Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.8979949Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:23] 2026-10-25T13:30:03.8980155Z 161 │ }); 2026-10-25T13:30:03.8980315Z 162 │ confirmedTokensRef.current = tokens; 2026-10-25T13:30:03.8980552Z ·  ─────────┬────────────┬─── 2026-10-25T13:30:03.8980870Z · │ ╰── Cannot update ref value during render 2026-10-25T13:30:03.8981166Z · ╰── This value is a ref 2026-10-25T13:30:03.8981364Z 163 │ return JSON.stringify( 2026-10-25T13:30:03.8981503Z ╰──── 2026-10-25T13:30:03.8982025Z  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-25T13:30:03.8982747Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.8983026Z 2026-10-25T13:30:03.8983218Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.8983513Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:204:5] 2026-10-25T13:30:03.8983734Z 203 │ mostRecentEventCount, 2026-10-25T13:30:03.8983910Z 204 │ nativeEventSnapshotsRef.current, 2026-10-25T13:30:03.8984122Z ·  ───────────────┬─────────────── 2026-10-25T13:30:03.8984423Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T13:30:03.8984822Z 205 │ ); 2026-10-25T13:30:03.8984993Z ╰──── 2026-10-25T13:30:03.8985722Z  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-25T13:30:03.8986441Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.8986719Z 2026-10-25T13:30:03.8986866Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.8987157Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:210:5] 2026-10-25T13:30:03.8987379Z 209 │ mostRecentEventCount, 2026-10-25T13:30:03.8987555Z 210 │ nativeEventSnapshotsRef.current, 2026-10-25T13:30:03.8987765Z ·  ───────────────┬─────────────── 2026-10-25T13:30:03.8988063Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T13:30:03.8988402Z 211 │ ); 2026-10-25T13:30:03.8988566Z ╰──── 2026-10-25T13:30:03.8989089Z  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-25T13:30:03.8989808Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.8990085Z 2026-10-25T13:30:03.8990276Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-25T13:30:03.8990603Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:195:6] 2026-10-25T13:30:03.8990876Z 159 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-25T13:30:03.8991129Z 160 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-25T13:30:03.8991372Z ·  ─────────┬──────── 2026-10-25T13:30:03.8991961Z · ╰── 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-25T13:30:03.8992423Z 161 │ }); 2026-10-25T13:30:03.8992577Z 162 │ confirmedTokensRef.current = tokens; 2026-10-25T13:30:03.8992753Z 163 │ return JSON.stringify( 2026-10-25T13:30:03.8993007Z 164 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-25T13:30:03.8993284Z 165 │ const record = 2026-10-25T13:30:03.8993447Z 166 │ token.type === "context" 2026-10-25T13:30:03.8993715Z 167 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-25T13:30:03.8993950Z 168 │ : undefined; 2026-10-25T13:30:03.8994139Z 169 │ const presentation = contextChipPresentation( 2026-10-25T13:30:03.8994372Z 170 │ token.type === "context" ? token.kind : token.type, 2026-10-25T13:30:03.8994557Z 171 │ record, 2026-10-25T13:30:03.8994691Z 172 │ ); 2026-10-25T13:30:03.8994843Z 173 │ const icon = contextChipIcon( 2026-10-25T13:30:03.8995009Z 174 │ presentation, 2026-10-25T13:30:03.8995237Z 175 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-25T13:30:03.8995445Z 176 │ ); 2026-10-25T13:30:03.8995571Z 177 │ return { 2026-10-25T13:30:03.8995715Z 178 │ type: token.type, 2026-10-25T13:30:03.8995962Z 179 │ source: token.source, 2026-10-25T13:30:03.8996181Z 180 │ start: token.start, 2026-10-25T13:30:03.8996337Z 181 │ end: token.end, 2026-10-25T13:30:03.8996569Z 182 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-25T13:30:03.8996785Z 183 │ label: 2026-10-25T13:30:03.8996936Z 184 │ token.type === "skill" 2026-10-25T13:30:03.8997136Z 185 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-25T13:30:03.8997338Z 186 │ : token.type === "context" 2026-10-25T13:30:03.8997673Z 187 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-25T13:30:03.8997981Z 188 │ : basename(token.value), 2026-10-25T13:30:03.8998224Z 189 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-25T13:30:03.8998475Z 190 │ iconUri: contextChipIconUri(icon), 2026-10-25T13:30:03.8998674Z 191 │ tintsIcon: icon.kind === "chip", 2026-10-25T13:30:03.8998835Z 192 │ }; 2026-10-25T13:30:03.8998955Z 193 │ }), 2026-10-25T13:30:03.8999076Z 194 │ ); 2026-10-25T13:30:03.8999272Z 195 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-25T13:30:03.8999573Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-25T13:30:03.8999925Z · ╰── This dependency list is missing values used by the callback 2026-10-25T13:30:03.9000257Z 196 │ // Every render resolves against the snapshot history, so a render whose 2026-10-25T13:30:03.9000456Z ╰──── 2026-10-25T13:30:03.9000797Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-25T13:30:03.9001319Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9001617Z 2026-10-25T13:30:03.9001807Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-25T13:30:03.9002132Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:255:5] 2026-10-25T13:30:03.9002412Z 247 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-25T13:30:03.9002651Z 248 │ nativeEventSnapshotsRef.current.push({ 2026-10-25T13:30:03.9002859Z ·  ───────────┬─────────── 2026-10-25T13:30:03.9003470Z · ╰── 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-25T13:30:03.9003977Z 249 │ eventCount: acknowledgedEventCount, 2026-10-25T13:30:03.9004146Z 250 │ value, 2026-10-25T13:30:03.9004298Z 251 │ selection: nextSelection, 2026-10-25T13:30:03.9004451Z 252 │ }); 2026-10-25T13:30:03.9004598Z 253 │ return acknowledgedEventCount; 2026-10-25T13:30:03.9004753Z 254 │ }, 2026-10-25T13:30:03.9004869Z 255 │ [], 2026-10-25T13:30:03.9004999Z ·  ─┬ 2026-10-25T13:30:03.9005263Z · ╰── This dependency list is missing values used by the callback 2026-10-25T13:30:03.9005495Z 256 │ ); 2026-10-25T13:30:03.9005604Z ╰──── 2026-10-25T13:30:03.9005937Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-25T13:30:03.9006498Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9006795Z 2026-10-25T13:30:03.9007057Z ⚠ unicorn(prefer-add-event-listener): Prefer `addEventListener()` over their `on`-function counterparts. 2026-10-25T13:30:03.9007444Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:12:14] 2026-10-25T13:30:03.9007753Z 11 │ addEventListener(_type: string, listener: (event: { data: string }) => void) { 2026-10-25T13:30:03.9007991Z 12 │ this.onmessage = listener; 2026-10-25T13:30:03.9008166Z ·  ───────── 2026-10-25T13:30:03.9008314Z 13 │ } 2026-10-25T13:30:03.9008426Z ╰──── 2026-10-25T13:30:03.9008807Z  help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on` replaces any previously registered handler. 2026-10-25T13:30:03.9009105Z 2026-10-25T13:30:03.9009308Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-25T13:30:03.9009648Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:16:9] 2026-10-25T13:30:03.9009861Z 15 │ constructor() { 2026-10-25T13:30:03.9010008Z 16 │ source = this; 2026-10-25T13:30:03.9010160Z ·  ────── 2026-10-25T13:30:03.9010299Z 17 │ } 2026-10-25T13:30:03.9010411Z ╰──── 2026-10-25T13:30:03.9010738Z  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-25T13:30:03.9010996Z 2026-10-25T13:30:03.9011151Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.9011425Z ╭─[apps/mobile/src/native/StackHeader.tsx:202:9] 2026-10-25T13:30:03.9011616Z 201 │ "options", 2026-10-25T13:30:03.9011789Z 202 │ latestOptionFunctionsRef.current, 2026-10-25T13:30:03.9012006Z ·  ────────────────┬─────────────── 2026-10-25T13:30:03.9012314Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T13:30:03.9012593Z 203 │ optionFunctionWrappersRef.current, 2026-10-25T13:30:03.9012753Z ╰──── 2026-10-25T13:30:03.9013314Z  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-25T13:30:03.9014034Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.9014311Z 2026-10-25T13:30:03.9014459Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.9014725Z ╭─[apps/mobile/src/native/StackHeader.tsx:203:9] 2026-10-25T13:30:03.9014942Z 202 │ latestOptionFunctionsRef.current, 2026-10-25T13:30:03.9015142Z 203 │ optionFunctionWrappersRef.current, 2026-10-25T13:30:03.9015359Z ·  ────────────────┬──────────────── 2026-10-25T13:30:03.9015663Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T13:30:03.9015939Z 204 │ ) as NativeStackNavigationOptions) 2026-10-25T13:30:03.9016168Z ╰──── 2026-10-25T13:30:03.9016736Z  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-25T13:30:03.9017451Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.9017728Z 2026-10-25T13:30:03.9017898Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T13:30:03.9018220Z ╭─[apps/web/src/components/CommandPaletteThreadItems.tsx:167:58] 2026-10-25T13:30:03.9018562Z 166 │ if (threadSearchQuery.trim().length > 0 && !threadSearchQuery.startsWith(">") && !isOpen) { 2026-10-25T13:30:03.9018877Z 167 │ claimThreadOpen(thread.environmentId, thread.id, Date.now()); 2026-10-25T13:30:03.9019147Z ·  ─────┬──── 2026-10-25T13:30:03.9019442Z · ╰── Cannot call impure function 2026-10-25T13:30:03.9019659Z 168 │ } 2026-10-25T13:30:03.9019774Z ╰──── 2026-10-25T13:30:03.9020114Z  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-25T13:30:03.9020679Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T13:30:03.9020959Z 2026-10-25T13:30:03.9021225Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T13:30:03.9021644Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:390:7] 2026-10-25T13:30:03.9021871Z 385 │ }; 2026-10-25T13:30:03.9021995Z 386 │ useEffect(() => { 2026-10-25T13:30:03.9022149Z ·  ────┬──── 2026-10-25T13:30:03.9022364Z · ╰── This is the containing effect 2026-10-25T13:30:03.9022599Z 387 │ if (!guidesEnabled && section === "guide") { 2026-10-25T13:30:03.9022809Z 388 │ requestedSection.current = "overview"; 2026-10-25T13:30:03.9023088Z 389 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-25T13:30:03.9023358Z 390 │ setSection("overview"); 2026-10-25T13:30:03.9023524Z ·  ─────┬──── 2026-10-25T13:30:03.9023793Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.9024013Z 391 │ } 2026-10-25T13:30:03.9024127Z ╰──── 2026-10-25T13:30:03.9024935Z  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-25T13:30:03.9025802Z  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-25T13:30:03.9026108Z 2026-10-25T13:30:03.9026315Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-25T13:30:03.9026782Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:392:6] 2026-10-25T13:30:03.9027099Z 387 │ if (!guidesEnabled && section === "guide") { 2026-10-25T13:30:03.9027304Z 388 │ requestedSection.current = "overview"; 2026-10-25T13:30:03.9027494Z ·  ────────┬─────── 2026-10-25T13:30:03.9028035Z · ╰── 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-25T13:30:03.9028593Z 389 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-25T13:30:03.9028914Z ·  ─────────┬───────── ──────┬────── 2026-10-25T13:30:03.9029564Z · │ ╰── 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-25T13:30:03.9030451Z · ╰── 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-25T13:30:03.9030925Z 390 │ setSection("overview"); 2026-10-25T13:30:03.9031069Z 391 │ } 2026-10-25T13:30:03.9031223Z 392 │ }, [guidesEnabled, section, insets.top]); 2026-10-25T13:30:03.9031446Z ·  ──────────────────┬───────────────── 2026-10-25T13:30:03.9031761Z · ╰── This dependency list is missing values used by the callback 2026-10-25T13:30:03.9032033Z 393 │ const tabContent = activityContent; 2026-10-25T13:30:03.9032184Z ╰──── 2026-10-25T13:30:03.9032405Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-25T13:30:03.9032891Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9033220Z 2026-10-25T13:30:03.9033429Z ⚠ eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used. 2026-10-25T13:30:03.9033734Z ╭─[infra/relay/src/http/Api.ts:69:13] 2026-10-25T13:30:03.9033987Z 68 │ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts"; 2026-10-25T13:30:03.9034252Z 69 │ import * as HookForwarder from "../hooks/HookForwarder.ts"; 2026-10-25T13:30:03.9034471Z ·  ──────┬────── 2026-10-25T13:30:03.9034714Z · ╰── 'HookForwarder' is imported here 2026-10-25T13:30:03.9034960Z 70 │ import * as HeldHooks from "../hooks/HeldHooks.ts"; 2026-10-25T13:30:03.9035123Z ╰──── 2026-10-25T13:30:03.9035273Z  help: Consider removing this import. 2026-10-25T13:30:03.9035386Z 2026-10-25T13:30:03.9035619Z ⚠ unicorn(no-useless-spread): Using a spread operator here creates a new array unnecessarily. 2026-10-25T13:30:03.9035980Z ╭─[apps/mobile/src/native/native-layout-metrics.tsx:43:27] 2026-10-25T13:30:03.9036194Z 42 │ latestMetrics = next; 2026-10-25T13:30:03.9036391Z 43 │ for (const settle of [...metricsWaiters]) settle(next); 2026-10-25T13:30:03.9036598Z ·  ─── 2026-10-25T13:30:03.9036852Z 44 │ setMetrics(next); 2026-10-25T13:30:03.9037026Z ╰──── 2026-10-25T13:30:03.9037272Z  help: `for…of` can iterate over iterable, it's unnecessary to convert to an array. 2026-10-25T13:30:03.9037447Z 2026-10-25T13:30:03.9037739Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-25T13:30:03.9038168Z ╭─[apps/web/src/components/settings/SettingInheritance.tsx:160:24] 2026-10-25T13:30:03.9038386Z 159 │ keys, 2026-10-25T13:30:03.9038523Z 160 │ overridingProjects = [], 2026-10-25T13:30:03.9038695Z ·  ── 2026-10-25T13:30:03.9038856Z 161 │ onClearOverrides, 2026-10-25T13:30:03.9038992Z ╰──── 2026-10-25T13:30:03.9039373Z  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-25T13:30:03.9039681Z 2026-10-25T13:30:03.9039885Z ⚠ eslint(no-unused-vars): Identifier 'FormSheet' is imported but never used. 2026-10-25T13:30:03.9040038Z ╭─[apps/mobile/src/native/createV5StackNavigator.ios.tsx:26:10] 2026-10-25T13:30:03.9040139Z 25 │ import { StyleSheet, View } from "react-native"; 2026-10-25T13:30:03.9040254Z 26 │ import { FormSheet, Stack } from "react-native-screens"; 2026-10-25T13:30:03.9040331Z ·  ────┬──── 2026-10-25T13:30:03.9040470Z · ╰── 'FormSheet' is imported here 2026-10-25T13:30:03.9040619Z 27 │ import { NativeScrollEdgeEffectsContext } from "./NativeScrollViewMarker"; 2026-10-25T13:30:03.9040671Z ╰──── 2026-10-25T13:30:03.9040776Z  help: Consider removing this import. 2026-10-25T13:30:03.9040783Z 2026-10-25T13:30:03.9041016Z ⚠ eslint(no-unused-vars): Identifier 'nativeWorkspacePopAction' is imported but never used. 2026-10-25T13:30:03.9041162Z ╭─[apps/mobile/src/native/createV5StackNavigator.ios.tsx:33:3] 2026-10-25T13:30:03.9041234Z 32 │ nativeStackPopAction, 2026-10-25T13:30:03.9041309Z 33 │ nativeWorkspacePopAction, 2026-10-25T13:30:03.9041399Z ·  ────────────┬─────────── 2026-10-25T13:30:03.9041562Z · ╰── 'nativeWorkspacePopAction' is imported here 2026-10-25T13:30:03.9041635Z 34 │ nativeWorkspacePopCount, 2026-10-25T13:30:03.9041687Z ╰──── 2026-10-25T13:30:03.9041784Z  help: Consider removing this import. 2026-10-25T13:30:03.9041787Z 2026-10-25T13:30:03.9042087Z ⚠ eslint(no-unused-vars): Identifier 'nativeWorkspacePopCount' is imported but never used. 2026-10-25T13:30:03.9042276Z ╭─[apps/mobile/src/native/createV5StackNavigator.ios.tsx:34:3] 2026-10-25T13:30:03.9042349Z 33 │ nativeWorkspacePopAction, 2026-10-25T13:30:03.9042420Z 34 │ nativeWorkspacePopCount, 2026-10-25T13:30:03.9042508Z ·  ───────────┬─────────── 2026-10-25T13:30:03.9042667Z · ╰── 'nativeWorkspacePopCount' is imported here 2026-10-25T13:30:03.9042744Z 35 │ partitionStackPresentations, 2026-10-25T13:30:03.9042794Z ╰──── 2026-10-25T13:30:03.9042888Z  help: Consider removing this import. 2026-10-25T13:30:03.9042891Z 2026-10-25T13:30:03.9043096Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-25T13:30:03.9043282Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:229:6] 2026-10-25T13:30:03.9043450Z 225 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-25T13:30:03.9043538Z 226 │ nativeEventSnapshotsRef.current, 2026-10-25T13:30:03.9043630Z ·  ───────────┬─────────── 2026-10-25T13:30:03.9044098Z · ╰── 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-25T13:30:03.9044172Z 227 │ mostRecentEventCount, 2026-10-25T13:30:03.9044229Z 228 │ ); 2026-10-25T13:30:03.9044353Z 229 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-25T13:30:03.9044492Z ·  ──────────────────────────┬────────────────────────── 2026-10-25T13:30:03.9044701Z · ╰── This dependency list is missing values used by the callback 2026-10-25T13:30:03.9044789Z 230 │ const assumedValue = props.value; 2026-10-25T13:30:03.9044840Z ╰──── 2026-10-25T13:30:03.9045008Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-25T13:30:03.9045330Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9045333Z 2026-10-25T13:30:03.9045550Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T13:30:03.9045686Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:235:7] 2026-10-25T13:30:03.9045836Z 234 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-25T13:30:03.9045929Z 235 │ nativeEventSnapshotsRef.current, 2026-10-25T13:30:03.9046020Z ·  ───────────┬─────────── 2026-10-25T13:30:03.9046483Z · ╰── 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-25T13:30:03.9046554Z 236 │ controlledEventCount, 2026-10-25T13:30:03.9046618Z 237 │ assumedValue, 2026-10-25T13:30:03.9046674Z 238 │ ); 2026-10-25T13:30:03.9046833Z 239 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-25T13:30:03.9046971Z ·  ───────────┬────────── 2026-10-25T13:30:03.9047274Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-25T13:30:03.9047406Z 240 │ const acceptNativeEvent = useCallback( 2026-10-25T13:30:03.9047457Z ╰──── 2026-10-25T13:30:03.9047884Z  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-25T13:30:03.9048205Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9048208Z 2026-10-25T13:30:03.9048354Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.9048494Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:162:29] 2026-10-25T13:30:03.9048624Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-25T13:30:03.9048739Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-25T13:30:03.9048860Z ·  ─────────────┬──────────── 2026-10-25T13:30:03.9049029Z · ╰── Cannot access ref value during render 2026-10-25T13:30:03.9049088Z 163 │ }); 2026-10-25T13:30:03.9049138Z ╰──── 2026-10-25T13:30:03.9049608Z  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-25T13:30:03.9049910Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.9049916Z 2026-10-25T13:30:03.9050062Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.9050198Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:162:29] 2026-10-25T13:30:03.9050321Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-25T13:30:03.9050433Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-25T13:30:03.9050550Z ·  ─────────────┬──────────── 2026-10-25T13:30:03.9050762Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T13:30:03.9050818Z 163 │ }); 2026-10-25T13:30:03.9050870Z ╰──── 2026-10-25T13:30:03.9051348Z  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-25T13:30:03.9051647Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.9051650Z 2026-10-25T13:30:03.9051793Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.9051930Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:23] 2026-10-25T13:30:03.9051986Z 163 │ }); 2026-10-25T13:30:03.9052076Z 164 │ confirmedTokensRef.current = tokens; 2026-10-25T13:30:03.9052201Z ·  ─────────┬────────────┬─── 2026-10-25T13:30:03.9052473Z · │ ╰── Cannot update ref value during render 2026-10-25T13:30:03.9052630Z · ╰── This value is a ref 2026-10-25T13:30:03.9052701Z 165 │ return JSON.stringify( 2026-10-25T13:30:03.9052751Z ╰──── 2026-10-25T13:30:03.9053254Z  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-25T13:30:03.9053547Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.9053550Z 2026-10-25T13:30:03.9053695Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.9053836Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:206:5] 2026-10-25T13:30:03.9053908Z 205 │ mostRecentEventCount, 2026-10-25T13:30:03.9053998Z 206 │ nativeEventSnapshotsRef.current, 2026-10-25T13:30:03.9054103Z ·  ───────────────┬─────────────── 2026-10-25T13:30:03.9054293Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T13:30:03.9054347Z 207 │ ); 2026-10-25T13:30:03.9054398Z ╰──── 2026-10-25T13:30:03.9054866Z  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-25T13:30:03.9055165Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.9055170Z 2026-10-25T13:30:03.9055314Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.9055448Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:212:5] 2026-10-25T13:30:03.9055518Z 211 │ mostRecentEventCount, 2026-10-25T13:30:03.9055606Z 212 │ nativeEventSnapshotsRef.current, 2026-10-25T13:30:03.9055709Z ·  ───────────────┬─────────────── 2026-10-25T13:30:03.9055897Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T13:30:03.9055952Z 213 │ ); 2026-10-25T13:30:03.9056004Z ╰──── 2026-10-25T13:30:03.9056478Z  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-25T13:30:03.9056772Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.9056777Z 2026-10-25T13:30:03.9056963Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-25T13:30:03.9057098Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:197:6] 2026-10-25T13:30:03.9057221Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-25T13:30:03.9057331Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-25T13:30:03.9057441Z ·  ─────────┬──────── 2026-10-25T13:30:03.9057992Z · ╰── 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-25T13:30:03.9058092Z 163 │ }); 2026-10-25T13:30:03.9058183Z 164 │ confirmedTokensRef.current = tokens; 2026-10-25T13:30:03.9058252Z 165 │ return JSON.stringify( 2026-10-25T13:30:03.9058417Z 166 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-25T13:30:03.9058483Z 167 │ const record = 2026-10-25T13:30:03.9058563Z 168 │ token.type === "context" 2026-10-25T13:30:03.9058727Z 169 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-25T13:30:03.9058794Z 170 │ : undefined; 2026-10-25T13:30:03.9058908Z 171 │ const presentation = contextChipPresentation( 2026-10-25T13:30:03.9059021Z 172 │ token.type === "context" ? token.kind : token.type, 2026-10-25T13:30:03.9059082Z 173 │ record, 2026-10-25T13:30:03.9059142Z 174 │ ); 2026-10-25T13:30:03.9059226Z 175 │ const icon = contextChipIcon( 2026-10-25T13:30:03.9059293Z 176 │ presentation, 2026-10-25T13:30:03.9059435Z 177 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-25T13:30:03.9059494Z 178 │ ); 2026-10-25T13:30:03.9059555Z 179 │ return { 2026-10-25T13:30:03.9059626Z 180 │ type: token.type, 2026-10-25T13:30:03.9059700Z 181 │ source: token.source, 2026-10-25T13:30:03.9059772Z 182 │ start: token.start, 2026-10-25T13:30:03.9059838Z 183 │ end: token.end, 2026-10-25T13:30:03.9059992Z 184 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-25T13:30:03.9060054Z 185 │ label: 2026-10-25T13:30:03.9060131Z 186 │ token.type === "skill" 2026-10-25T13:30:03.9060237Z 187 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-25T13:30:03.9060319Z 188 │ : token.type === "context" 2026-10-25T13:30:03.9060554Z 189 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-25T13:30:03.9060638Z 190 │ : basename(token.value), 2026-10-25T13:30:03.9060781Z 191 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-25T13:30:03.9060874Z 192 │ iconUri: contextChipIconUri(icon), 2026-10-25T13:30:03.9060961Z 193 │ tintsIcon: icon.kind === "chip", 2026-10-25T13:30:03.9061020Z 194 │ }; 2026-10-25T13:30:03.9061158Z 195 │ }), 2026-10-25T13:30:03.9061252Z 196 │ ); 2026-10-25T13:30:03.9061385Z 197 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-25T13:30:03.9061541Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-25T13:30:03.9061750Z · ╰── This dependency list is missing values used by the callback 2026-10-25T13:30:03.9061890Z 198 │ // Every render resolves against the snapshot history, so a render whose 2026-10-25T13:30:03.9061940Z ╰──── 2026-10-25T13:30:03.9062148Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-25T13:30:03.9062471Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9062480Z 2026-10-25T13:30:03.9062670Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-25T13:30:03.9062807Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:257:5] 2026-10-25T13:30:03.9062938Z 249 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-25T13:30:03.9063039Z 250 │ nativeEventSnapshotsRef.current.push({ 2026-10-25T13:30:03.9063131Z ·  ───────────┬─────────── 2026-10-25T13:30:03.9063628Z · ╰── 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-25T13:30:03.9063720Z 251 │ eventCount: acknowledgedEventCount, 2026-10-25T13:30:03.9063787Z 252 │ value, 2026-10-25T13:30:03.9063868Z 253 │ selection: nextSelection, 2026-10-25T13:30:03.9063924Z 254 │ }); 2026-10-25T13:30:03.9064008Z 255 │ return acknowledgedEventCount; 2026-10-25T13:30:03.9064063Z 256 │ }, 2026-10-25T13:30:03.9064119Z 257 │ [], 2026-10-25T13:30:03.9064185Z ·  ─┬ 2026-10-25T13:30:03.9064369Z · ╰── This dependency list is missing values used by the callback 2026-10-25T13:30:03.9064423Z 258 │ ); 2026-10-25T13:30:03.9064475Z ╰──── 2026-10-25T13:30:03.9064761Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-25T13:30:03.9065078Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9065088Z 2026-10-25T13:30:03.9065544Z ⚠ 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-25T13:30:03.9065672Z ╭─[apps/server/src/serverSettings.test.ts:1740:32] 2026-10-25T13:30:03.9065845Z 1739 │ const model = createModelSelection(ProviderInstanceId.make("codex"), "gpt-5.5"); 2026-10-25T13:30:03.9066031Z 1740 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-25T13:30:03.9066149Z ·  ─────────────────── 2026-10-25T13:30:03.9066258Z 1741 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-25T13:30:03.9066311Z ╰──── 2026-10-25T13:30:03.9066313Z 2026-10-25T13:30:03.9066851Z ⚠ 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-25T13:30:03.9067022Z ╭─[apps/server/src/serverSettings.test.ts:1741:34] 2026-10-25T13:30:03.9067207Z 1740 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-25T13:30:03.9067314Z 1741 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-25T13:30:03.9067429Z ·  ─────────────────── 2026-10-25T13:30:03.9067545Z 1742 │ Schema.fromJsonString(Schema.Array(ProjectScript)), 2026-10-25T13:30:03.9067598Z ╰──── 2026-10-25T13:30:03.9067600Z 2026-10-25T13:30:03.9067822Z ⚠ eslint(no-unused-vars): Identifier 'serverEnvironment' is imported but never used. 2026-10-25T13:30:03.9067952Z ╭─[apps/web/src/components/chat/ChatHeader.tsx:27:10] 2026-10-25T13:30:03.9068062Z 26 │ import { threadEnvironment } from "../../state/threads"; 2026-10-25T13:30:03.9068170Z 27 │ import { serverEnvironment } from "../../state/server"; 2026-10-25T13:30:03.9068262Z ·  ────────┬──────── 2026-10-25T13:30:03.9068416Z · ╰── 'serverEnvironment' is imported here 2026-10-25T13:30:03.9068547Z 28 │ import { canShareWithGuestAtom } from "./guestShareAvailability"; 2026-10-25T13:30:03.9068601Z ╰──── 2026-10-25T13:30:03.9068700Z  help: Consider removing this import. 2026-10-25T13:30:03.9068702Z 2026-10-25T13:30:03.9068970Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T13:30:03.9069121Z ╭─[apps/mobile/src/components/VideoPreviewModal.ios.tsx:63:55] 2026-10-25T13:30:03.9069178Z 61 │ }, []); 2026-10-25T13:30:03.9069244Z 62 │ useEffect(() => { 2026-10-25T13:30:03.9069315Z ·  ────┬──── 2026-10-25T13:30:03.9069443Z · ╰── This is the containing effect 2026-10-25T13:30:03.9069593Z 63 │ if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl); 2026-10-25T13:30:03.9069720Z ·  ───────┬────── 2026-10-25T13:30:03.9069925Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.9070003Z 64 │ }, [playbackUrl, resolvedUrl]); 2026-10-25T13:30:03.9070056Z ╰──── 2026-10-25T13:30:03.9070671Z  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-25T13:30:03.9071001Z  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-25T13:30:03.9071004Z 2026-10-25T13:30:03.9071199Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T13:30:03.9071346Z ╭─[apps/mobile/src/components/ComposerContextSheet.tsx:272:25] 2026-10-25T13:30:03.9071455Z 271 │ {record.elements?.map((element, index) => ( 2026-10-25T13:30:03.9071703Z 272 │ 2026-10-25T13:30:03.9071908Z ·  ─────────────────────────────────────────────────────── 2026-10-25T13:30:03.9071983Z 273 │ (null); 2026-10-25T13:30:03.9072839Z 167 │ useLayoutEffect(() => { 2026-10-25T13:30:03.9072920Z ·  ───────┬─────── 2026-10-25T13:30:03.9073053Z · ╰── This is the containing effect 2026-10-25T13:30:03.9073139Z 168 │ if (faviconRequest === null) return; 2026-10-25T13:30:03.9073230Z 169 │ 2026-10-25T13:30:03.9073362Z 170 │ const endRequest = beginProjectFaviconRequest(faviconRequest); 2026-10-25T13:30:03.9073459Z 171 │ setActiveFaviconRequest(faviconRequest); 2026-10-25T13:30:03.9073548Z ·  ───────────┬─────────── 2026-10-25T13:30:03.9073721Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.9073788Z 172 │ return endRequest; 2026-10-25T13:30:03.9073841Z ╰──── 2026-10-25T13:30:03.9074452Z  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-25T13:30:03.9074781Z  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-25T13:30:03.9074784Z 2026-10-25T13:30:03.9075015Z ⚠ eslint(no-unused-vars): Function 'resolveThreadWorkspaceCwd' is declared but never used. 2026-10-25T13:30:03.9075133Z ╭─[apps/server/src/checkpointing/Utils.ts:12:10] 2026-10-25T13:30:03.9075186Z 11 │ 2026-10-25T13:30:03.9075281Z 12 │ function resolveThreadWorkspaceCwd(input: { 2026-10-25T13:30:03.9075383Z ·  ────────────┬──────────── 2026-10-25T13:30:03.9075560Z · ╰── 'resolveThreadWorkspaceCwd' is declared here 2026-10-25T13:30:03.9075630Z 13 │ readonly thread: { 2026-10-25T13:30:03.9075680Z ╰──── 2026-10-25T13:30:03.9075785Z  help: Consider removing this declaration. 2026-10-25T13:30:03.9075787Z 2026-10-25T13:30:03.9075995Z ⚠ eslint(no-unused-vars): Function 'describeSchedule' is declared but never used. 2026-10-25T13:30:03.9076119Z ╭─[apps/server/src/scheduledTasks/Schedule.ts:75:10] 2026-10-25T13:30:03.9076173Z 74 │ 2026-10-25T13:30:03.9076310Z 75 │ function describeSchedule(schedule: ScheduledTaskSchedule): string { 2026-10-25T13:30:03.9076397Z ·  ────────┬─────── 2026-10-25T13:30:03.9076546Z · ╰── 'describeSchedule' is declared here 2026-10-25T13:30:03.9076732Z 76 │ if (schedule.type === "webhook") return "On webhook"; 2026-10-25T13:30:03.9076825Z ╰──── 2026-10-25T13:30:03.9076928Z  help: Consider removing this declaration. 2026-10-25T13:30:03.9076931Z 2026-10-25T13:30:03.9077190Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T13:30:03.9077379Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:119:10] 2026-10-25T13:30:03.9077434Z 117 │ 2026-10-25T13:30:03.9077502Z 118 │ useEffect(() => { 2026-10-25T13:30:03.9077577Z ·  ────┬──── 2026-10-25T13:30:03.9077708Z · ╰── This is the containing effect 2026-10-25T13:30:03.9077790Z 119 │ void refreshNotifications(); 2026-10-25T13:30:03.9077890Z ·  ──────────┬───────── 2026-10-25T13:30:03.9078071Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.9078214Z 120 │ const subscription = AppState.addEventListener("change", (state) => { 2026-10-25T13:30:03.9078268Z ╰──── 2026-10-25T13:30:03.9078869Z  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-25T13:30:03.9079195Z  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-25T13:30:03.9079198Z 2026-10-25T13:30:03.9079463Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T13:30:03.9079651Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7] 2026-10-25T13:30:03.9079707Z 125 │ 2026-10-25T13:30:03.9079773Z 126 │ useEffect(() => { 2026-10-25T13:30:03.9079846Z ·  ────┬──── 2026-10-25T13:30:03.9079974Z · ╰── This is the containing effect 2026-10-25T13:30:03.9080040Z 127 │ if (!isLoaded) { 2026-10-25T13:30:03.9080130Z 128 │ setLiveActivityStatus("checking"); 2026-10-25T13:30:03.9080221Z ·  ──────────┬────────── 2026-10-25T13:30:03.9080394Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.9080459Z 129 │ return; 2026-10-25T13:30:03.9080591Z ╰──── 2026-10-25T13:30:03.9081231Z  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-25T13:30:03.9081552Z  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-25T13:30:03.9081557Z 2026-10-25T13:30:03.9082028Z ⚠ 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-25T13:30:03.9082221Z ╭─[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:520:13] 2026-10-25T13:30:03.9082296Z 519 │ })).delivery; 2026-10-25T13:30:03.9082502Z 520 │ ╭─▶ while (delivery.outcome === "accepted") { 2026-10-25T13:30:03.9082618Z 521 │ │ yield* Effect.yieldNow; 2026-10-25T13:30:03.9082769Z 522 │ │ delivery = (yield* service.getWebhookDelivery({ 2026-10-25T13:30:03.9082872Z 523 │ │ id: task.id, 2026-10-25T13:30:03.9082990Z 524 │ │ deliveryId: deliveryId!, 2026-10-25T13:30:03.9083088Z 525 │ │ })).delivery; 2026-10-25T13:30:03.9083281Z 526 │ ╰─▶ } 2026-10-25T13:30:03.9083407Z 527 │ assert.equal(delivery.outcome, "dispatch_failed"); 2026-10-25T13:30:03.9083466Z ╰──── 2026-10-25T13:30:03.9083469Z 2026-10-25T13:30:03.9083681Z ⚠ eslint(no-unused-vars): Type 'ScheduledTaskDraft' is imported but never used. 2026-10-25T13:30:03.9083840Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:10:8] 2026-10-25T13:30:03.9083924Z  9 │ hasScheduledTaskDraftChanges, 2026-10-25T13:30:03.9083998Z 10 │ type ScheduledTaskDraft, 2026-10-25T13:30:03.9084087Z ·  ─────────┬──────── 2026-10-25T13:30:03.9084241Z · ╰── 'ScheduledTaskDraft' is imported here 2026-10-25T13:30:03.9084317Z 11 │ } from "./scheduledTaskDraft"; 2026-10-25T13:30:03.9084370Z ╰──── 2026-10-25T13:30:03.9084472Z  help: Consider removing this import. 2026-10-25T13:30:03.9084480Z 2026-10-25T13:30:03.9084665Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-25T13:30:03.9084826Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:81:85] 2026-10-25T13:30:03.9084929Z 80 │ const startEditor = startScheduledTaskEditor; 2026-10-25T13:30:03.9085112Z 81 │ const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]); 2026-10-25T13:30:03.9085259Z ·  ─────┬───── 2026-10-25T13:30:03.9085469Z · ╰── Unnecessary dependency `startEditor` 2026-10-25T13:30:03.9085550Z 82 │ const readEditor = useCallback( 2026-10-25T13:30:03.9085602Z ╰──── 2026-10-25T13:30:03.9085995Z  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-25T13:30:03.9086349Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9086352Z 2026-10-25T13:30:03.9086536Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-25T13:30:03.9086698Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:102:7] 2026-10-25T13:30:03.9086762Z 101 │ setEditor, 2026-10-25T13:30:03.9086825Z 102 │ startEditor, 2026-10-25T13:30:03.9086904Z ·  ─────┬───── 2026-10-25T13:30:03.9087058Z · ╰── Unnecessary dependency `startEditor` 2026-10-25T13:30:03.9087125Z 103 │ hasChanges, 2026-10-25T13:30:03.9087175Z ╰──── 2026-10-25T13:30:03.9087489Z  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-25T13:30:03.9087802Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9087805Z 2026-10-25T13:30:03.9087972Z ⚠ eslint(no-control-regex): Unexpected control character 2026-10-25T13:30:03.9088165Z ╭─[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46] 2026-10-25T13:30:03.9088305Z 219 │ 2026-10-25T13:30:03.9088448Z 220 │ {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")} 2026-10-25T13:30:03.9088559Z ·  ──┬─ 2026-10-25T13:30:03.9088728Z · ╰── 'U+001B' is a control character. 2026-10-25T13:30:03.9088792Z 221 │ 2026-10-25T13:30:03.9088845Z ╰──── 2026-10-25T13:30:03.9089080Z  help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression. 2026-10-25T13:30:03.9089082Z 2026-10-25T13:30:03.9089295Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-25T13:30:03.9089419Z ╭─[apps/web/src/lib/announce.browser.test.ts:41:46] 2026-10-25T13:30:03.9089472Z 40 │ 2026-10-25T13:30:03.9089589Z 41 │ expect(regionTexts()).toEqual([...first].reverse()); 2026-10-25T13:30:03.9089700Z ·  ─────── 2026-10-25T13:30:03.9089795Z 42 │ expect(regionTexts()).toContain("Claude"); 2026-10-25T13:30:03.9089850Z ╰──── 2026-10-25T13:30:03.9090112Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-25T13:30:03.9090115Z 2026-10-25T13:30:03.9090261Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.9090411Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:148:27] 2026-10-25T13:30:03.9090594Z 147 │ 2026-10-25T13:30:03.9090675Z 148 │ {props.children(open)} 2026-10-25T13:30:03.9090851Z ·  ──┬─ 2026-10-25T13:30:03.9091064Z · ╰── Cannot access ref value during render 2026-10-25T13:30:03.9091129Z 149 │ 2026-10-25T13:30:03.9091182Z ╰──── 2026-10-25T13:30:03.9091654Z  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-25T13:30:03.9091947Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.9091950Z 2026-10-25T13:30:03.9092152Z ⚠ react(memo-dependencies): Found missing/extra memoization dependencies 2026-10-25T13:30:03.9092307Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:136:9] 2026-10-25T13:30:03.9092391Z 135 │ if (action.id !== undefined) { 2026-10-25T13:30:03.9092472Z 136 │ props.onPressAction?.({ 2026-10-25T13:30:03.9092543Z ·  ──┬── 2026-10-25T13:30:03.9092675Z · ╰── Missing dependency `props` 2026-10-25T13:30:03.9092768Z 137 │ nativeEvent: { event: action.id }, 2026-10-25T13:30:03.9092917Z 138 │ } as Parameters>[0]); 2026-10-25T13:30:03.9092973Z 139 │ } 2026-10-25T13:30:03.9093030Z 140 │ }, 2026-10-25T13:30:03.9093114Z 141 │ [close, props.onPressAction], 2026-10-25T13:30:03.9093252Z ·  ─────────┬───────── 2026-10-25T13:30:03.9093474Z · ╰── Overly precise dependency `props.onPressAction`, use `props` instead 2026-10-25T13:30:03.9093533Z 142 │ ); 2026-10-25T13:30:03.9093587Z ╰──── 2026-10-25T13:30:03.9094068Z  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-25T13:30:03.9094380Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9094386Z 2026-10-25T13:30:03.9094632Z ⚠ eslint(no-unused-vars): Function 'normalizeTerminalContextSelection' is declared but never used. 2026-10-25T13:30:03.9094752Z ╭─[apps/web/src/lib/terminalContext.ts:56:10] 2026-10-25T13:30:03.9094808Z 55 │ 2026-10-25T13:30:03.9094907Z 56 │ function normalizeTerminalContextSelection( 2026-10-25T13:30:03.9095017Z ·  ────────────────┬──────────────── 2026-10-25T13:30:03.9095210Z · ╰── 'normalizeTerminalContextSelection' is declared here 2026-10-25T13:30:03.9095300Z 57 │ selection: TerminalContextSelection, 2026-10-25T13:30:03.9095354Z ╰──── 2026-10-25T13:30:03.9095458Z  help: Consider removing this declaration. 2026-10-25T13:30:03.9095461Z 2026-10-25T13:30:03.9095672Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-25T13:30:03.9095808Z ╭─[apps/web/src/lib/composerContextReferences.ts:90:40] 2026-10-25T13:30:03.9095884Z 89 │ let cursor = prompt.length; 2026-10-25T13:30:03.9096064Z 90 │ for (const occurrence of occurrences.reverse()) { 2026-10-25T13:30:03.9096211Z ·  ─────── 2026-10-25T13:30:03.9096293Z 91 │ let { start, end } = occurrence; 2026-10-25T13:30:03.9096347Z ╰──── 2026-10-25T13:30:03.9096606Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-25T13:30:03.9096609Z 2026-10-25T13:30:03.9096777Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-25T13:30:03.9096919Z ╭─[apps/server/src/process/externalLauncher.test.ts:183:12] 2026-10-25T13:30:03.9096974Z 182 │ 2026-10-25T13:30:03.9097076Z 183 │ for (const {} of ["darwin", "linux"] as const) { 2026-10-25T13:30:03.9097149Z ·  ── 2026-10-25T13:30:03.9097213Z 184 │ } 2026-10-25T13:30:03.9097269Z ╰──── 2026-10-25T13:30:03.9097499Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-25T13:30:03.9097502Z 2026-10-25T13:30:03.9097668Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-25T13:30:03.9097808Z ╭─[apps/server/src/process/externalLauncher.test.ts:186:12] 2026-10-25T13:30:03.9097863Z 185 │ 2026-10-25T13:30:03.9097927Z 186 │ for (const {} of [ 2026-10-25T13:30:03.9097998Z ·  ── 2026-10-25T13:30:03.9098090Z 187 │ { kind: "browser", folderVerb: "none" }, 2026-10-25T13:30:03.9098142Z ╰──── 2026-10-25T13:30:03.9098366Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-25T13:30:03.9098374Z 2026-10-25T13:30:03.9098542Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-25T13:30:03.9098679Z ╭─[apps/server/src/process/externalLauncher.test.ts:308:12] 2026-10-25T13:30:03.9098733Z 307 │ 2026-10-25T13:30:03.9098860Z 308 │ for (const {} of ["rejected", "spawn-error", "stalled"] as const) { 2026-10-25T13:30:03.9098930Z ·  ── 2026-10-25T13:30:03.9098986Z 309 │ } 2026-10-25T13:30:03.9099038Z ╰──── 2026-10-25T13:30:03.9099261Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-25T13:30:03.9099263Z 2026-10-25T13:30:03.9099428Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-25T13:30:03.9099569Z ╭─[apps/server/src/process/externalLauncher.test.ts:311:12] 2026-10-25T13:30:03.9099627Z 310 │ 2026-10-25T13:30:03.9099689Z 311 │ for (const {} of [ 2026-10-25T13:30:03.9099759Z ·  ── 2026-10-25T13:30:03.9099815Z 312 │ { 2026-10-25T13:30:03.9099868Z ╰──── 2026-10-25T13:30:03.9100091Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-25T13:30:03.9100094Z 2026-10-25T13:30:03.9100241Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.9100361Z ╭─[apps/mobile/src/components/ui/Menu.tsx:54:36] 2026-10-25T13:30:03.9100543Z 53 │ const child = children as ReactElement>; 2026-10-25T13:30:03.9100718Z 54 │ ╭─▶ children = cloneElement(child, { 2026-10-25T13:30:03.9100903Z 55 │ │ onTouchStart: (event) => { 2026-10-25T13:30:03.9101144Z 56 │ │ // onPressIn can repeat within one gesture when a finger leaves and re-enters the row. 2026-10-25T13:30:03.9101273Z 57 │ │ menuPress.current.isPreparing = false; 2026-10-25T13:30:03.9101441Z 58 │ │ menuPress.current.suppressPress = menuPress.current.isOpen; 2026-10-25T13:30:03.9101551Z 59 │ │ pendingPress.current = null; 2026-10-25T13:30:03.9101671Z 60 │ │ child.props.onTouchStart?.(event); 2026-10-25T13:30:03.9101748Z 61 │ │ }, 2026-10-25T13:30:03.9101851Z 62 │ │ onPress: (event) => { 2026-10-25T13:30:03.9102070Z 63 │ │ // Accessibility clicks lack touch identifiers and must ignore previous touch cancellation. 2026-10-25T13:30:03.9102242Z 64 │ │ const isTouch = typeof event.nativeEvent.identifier === "number"; 2026-10-25T13:30:03.9102434Z 65 │ │ if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) { 2026-10-25T13:30:03.9102523Z 66 │ │ return; 2026-10-25T13:30:03.9102601Z 67 │ │ } 2026-10-25T13:30:03.9102743Z 68 │ │ if (isTouch && menuPress.current.isPreparing) { 2026-10-25T13:30:03.9102963Z 69 │ │ // A release can precede native display; let UIKit's display/cancel callback decide its outcome. 2026-10-25T13:30:03.9103063Z 70 │ │ event.persist(); 2026-10-25T13:30:03.9103258Z 71 │ │ pendingPress.current = () => child.props.onPress?.(event); 2026-10-25T13:30:03.9103348Z 72 │ │ return; 2026-10-25T13:30:03.9103425Z 73 │ │ } 2026-10-25T13:30:03.9103537Z 74 │ │ child.props.onPress?.(event); 2026-10-25T13:30:03.9103612Z 75 │ │ }, 2026-10-25T13:30:03.9103743Z 76 │ ├─▶ }); 2026-10-25T13:30:03.9103980Z · ╰──── Passing a ref to a function may read its value during render 2026-10-25T13:30:03.9104084Z 77 │ menuProps.onMenuInteractionStart = () => { 2026-10-25T13:30:03.9104136Z ╰──── 2026-10-25T13:30:03.9104692Z  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-25T13:30:03.9104992Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.9104994Z 2026-10-25T13:30:03.9105199Z ⚠ eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used. 2026-10-25T13:30:03.9105292Z ╭─[apps/web/src/types.ts:22:3] 2026-10-25T13:30:03.9105364Z 21 │ EnvironmentThreadShell, 2026-10-25T13:30:03.9105430Z 22 │ ThreadRunSummary, 2026-10-25T13:30:03.9105509Z ·  ────────┬─────── 2026-10-25T13:30:03.9105654Z · ╰── 'ThreadRunSummary' is imported here 2026-10-25T13:30:03.9105723Z 23 │ ThreadRuntimeSummary, 2026-10-25T13:30:03.9105868Z ╰──── 2026-10-25T13:30:03.9106023Z  help: Consider removing this import. 2026-10-25T13:30:03.9106026Z 2026-10-25T13:30:03.9106257Z ⚠ eslint(no-unneeded-ternary): Unnecessary use of boolean literals in conditional expression 2026-10-25T13:30:03.9106384Z ╭─[packages/shared/src/serverSettings.test.ts:35:7] 2026-10-25T13:30:03.9106567Z 34 │ const fallback = fallbackTextGenerationModelSelection(providerInstances, (instanceId) => 2026-10-25T13:30:03.9106663Z 35 │ instanceId === configured ? true : false, 2026-10-25T13:30:03.9106780Z ·  ──────────────────────────────────────── 2026-10-25T13:30:03.9106836Z 36 │ ); 2026-10-25T13:30:03.9106888Z ╰──── 2026-10-25T13:30:03.9106984Z  help: Remove this ternary operator 2026-10-25T13:30:03.9106986Z 2026-10-25T13:30:03.9107253Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T13:30:03.9107389Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:59:5] 2026-10-25T13:30:03.9107444Z 56 │ 2026-10-25T13:30:03.9107509Z 57 │ useEffect(() => { 2026-10-25T13:30:03.9107580Z ·  ────┬──── 2026-10-25T13:30:03.9107709Z · ╰── This is the containing effect 2026-10-25T13:30:03.9107804Z 58 │ const controller = new AbortController(); 2026-10-25T13:30:03.9107878Z 59 │ setLoadState("pending"); 2026-10-25T13:30:03.9107954Z ·  ──────┬───── 2026-10-25T13:30:03.9108120Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.9108286Z 60 │ // A renewed signature is used on Retry, not as a reason to reset the native player. 2026-10-25T13:30:03.9108342Z ╰──── 2026-10-25T13:30:03.9108946Z  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-25T13:30:03.9109271Z  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-25T13:30:03.9109274Z 2026-10-25T13:30:03.9109474Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T13:30:03.9109608Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:70:7] 2026-10-25T13:30:03.9109770Z 69 │ return () => controller.abort(); 2026-10-25T13:30:03.9109910Z 70 │ }, [player, props.playRequested, attempt]); 2026-10-25T13:30:03.9110083Z ·  ───┬── ─────────┬───────── ───┬─── 2026-10-25T13:30:03.9110315Z · │ │ ╰── Unnecessary dependency `attempt` 2026-10-25T13:30:03.9110515Z · │ ╰── Unnecessary dependency `props.playRequested` 2026-10-25T13:30:03.9110654Z · ╰── Unnecessary dependency `player_0` 2026-10-25T13:30:03.9110709Z 71 │ 2026-10-25T13:30:03.9110759Z ╰──── 2026-10-25T13:30:03.9111064Z  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-25T13:30:03.9111381Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9111384Z 2026-10-25T13:30:03.9111573Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T13:30:03.9111679Z ╭─[packages/shared/src/qrCode.ts:458:44] 2026-10-25T13:30:03.9111743Z 457 │ ): Array { 2026-10-25T13:30:03.9111852Z 458 │ let result: Array = divisor.map((_) => 0); 2026-10-25T13:30:03.9111955Z ·  ┬ 2026-10-25T13:30:03.9112099Z · ╰── '_' is declared here 2026-10-25T13:30:03.9112170Z 459 │ for (const b of data) { 2026-10-25T13:30:03.9112233Z ╰──── 2026-10-25T13:30:03.9112340Z  help: Consider removing this parameter. 2026-10-25T13:30:03.9112342Z 2026-10-25T13:30:03.9112544Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-25T13:30:03.9112668Z ╭─[apps/web/src/contextMenuFallback.test.ts:38:9] 2026-10-25T13:30:03.9112736Z 37 │ get isConnected() { 2026-10-25T13:30:03.9112828Z 38 │ let current: FakeElement | null = this; 2026-10-25T13:30:03.9112899Z ·  ─────── 2026-10-25T13:30:03.9112972Z 39 │ while (current?.parent) { 2026-10-25T13:30:03.9113024Z ╰──── 2026-10-25T13:30:03.9113339Z  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-25T13:30:03.9113342Z 2026-10-25T13:30:03.9113549Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-25T13:30:03.9113718Z ╭─[apps/web/src/components/settings/ProviderSettingsPanel.logic.ts:4:8] 2026-10-25T13:30:03.9113793Z 3 │ AuthProvidersManageScope, 2026-10-25T13:30:03.9113862Z 4 │ type AuthSessionState, 2026-10-25T13:30:03.9113947Z ·  ────────┬─────── 2026-10-25T13:30:03.9114093Z · ╰── 'AuthSessionState' is imported here 2026-10-25T13:30:03.9114163Z 5 │ type EnvironmentId, 2026-10-25T13:30:03.9114215Z ╰──── 2026-10-25T13:30:03.9114312Z  help: Consider removing this import. 2026-10-25T13:30:03.9114316Z 2026-10-25T13:30:03.9114572Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T13:30:03.9114815Z ╭─[apps/server/src/orchestration-v2/ThreadPullRequestService.ts:405:7] 2026-10-25T13:30:03.9114910Z 404 │ 2026-10-25T13:30:03.9115039Z 405 │ const layer = Layer.effect(ThreadPullRequestServiceV2, make); 2026-10-25T13:30:03.9115108Z ·  ──┬── 2026-10-25T13:30:03.9115235Z · ╰── 'layer' is declared here 2026-10-25T13:30:03.9115287Z ╰──── 2026-10-25T13:30:03.9115392Z  help: Consider removing this declaration. 2026-10-25T13:30:03.9115395Z 2026-10-25T13:30:03.9115678Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-25T13:30:03.9115849Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:469:19] 2026-10-25T13:30:03.9115912Z 468 │ onFilters, 2026-10-25T13:30:03.9115988Z 469 │ authorOptions = [], 2026-10-25T13:30:03.9116068Z ·  ── 2026-10-25T13:30:03.9116135Z 470 │ labelOptions = [], 2026-10-25T13:30:03.9116186Z ╰──── 2026-10-25T13:30:03.9116506Z  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-25T13:30:03.9116509Z 2026-10-25T13:30:03.9116789Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-25T13:30:03.9116956Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:470:18] 2026-10-25T13:30:03.9117022Z 469 │ authorOptions = [], 2026-10-25T13:30:03.9117086Z 470 │ labelOptions = [], 2026-10-25T13:30:03.9117162Z ·  ── 2026-10-25T13:30:03.9117233Z 471 │ optionScope, 2026-10-25T13:30:03.9117294Z ╰──── 2026-10-25T13:30:03.9117616Z  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-25T13:30:03.9117619Z 2026-10-25T13:30:03.9117838Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-25T13:30:03.9156940Z ╭─[apps/mobile/src/Stack.tsx:1072:21] 2026-10-25T13:30:03.9157100Z 1071 │ } 2026-10-25T13:30:03.9157397Z ·  ───────────────────────────────────────────── 2026-10-25T13:30:03.9157482Z 1073 │ screenOptions={({ route }) => 2026-10-25T13:30:03.9157537Z ╰──── 2026-10-25T13:30:03.9157928Z  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-25T13:30:03.9157938Z 2026-10-25T13:30:03.9158214Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T13:30:03.9158364Z ╭─[apps/mobile/src/features/files/FileTreeBrowser.tsx:156:5] 2026-10-25T13:30:03.9158420Z 151 │ 2026-10-25T13:30:03.9158487Z 152 │ useEffect(() => { 2026-10-25T13:30:03.9158559Z ·  ────┬──── 2026-10-25T13:30:03.9158695Z · ╰── This is the containing effect 2026-10-25T13:30:03.9158779Z 153 │ if (!controlledSelectedPath) { 2026-10-25T13:30:03.9158840Z 154 │ return; 2026-10-25T13:30:03.9159062Z 155 │ } 2026-10-25T13:30:03.9159200Z 156 │ setExpandedPaths((current) => { 2026-10-25T13:30:03.9159280Z ·  ────────┬─────── 2026-10-25T13:30:03.9159457Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.9159582Z 157 │ const ancestors = ancestorPaths(controlledSelectedPath); 2026-10-25T13:30:03.9159634Z ╰──── 2026-10-25T13:30:03.9160247Z  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-25T13:30:03.9160591Z  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-25T13:30:03.9160600Z 2026-10-25T13:30:03.9160877Z ⚠ eslint(no-unused-vars): Variable 'claudeCaps' is declared but never used. Unused variables should start with a '_'. 2026-10-25T13:30:03.9160987Z ╭─[packages/shared/src/model.test.ts:36:7] 2026-10-25T13:30:03.9161039Z 35 │ 2026-10-25T13:30:03.9161170Z 36 │ const claudeCaps: ModelCapabilities = createModelCapabilities({ 2026-10-25T13:30:03.9161245Z ·  ─────┬──── 2026-10-25T13:30:03.9161381Z · ╰── 'claudeCaps' is declared here 2026-10-25T13:30:03.9161451Z 37 │ optionDescriptors: [ 2026-10-25T13:30:03.9161501Z ╰──── 2026-10-25T13:30:03.9161606Z  help: Consider removing this declaration. 2026-10-25T13:30:03.9161609Z 2026-10-25T13:30:03.9161819Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T13:30:03.9161972Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7] 2026-10-25T13:30:03.9162069Z 256 │ return () => cancelAnimationFrame(frame); 2026-10-25T13:30:03.9162150Z 257 │ }, [props.path, targetIndex]); 2026-10-25T13:30:03.9162224Z ·  ─────┬──── 2026-10-25T13:30:03.9162369Z · ╰── Unnecessary dependency `props.path` 2026-10-25T13:30:03.9162421Z 258 │ 2026-10-25T13:30:03.9162471Z ╰──── 2026-10-25T13:30:03.9162765Z  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-25T13:30:03.9163086Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9163091Z 2026-10-25T13:30:03.9163318Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T13:30:03.9163467Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:289:23] 2026-10-25T13:30:03.9163540Z 288 │ 2026-10-25T13:30:03.9164726Z ·  ─────────── 2026-10-25T13:30:03.9164793Z 306 │ {body} 2026-10-25T13:30:03.9164843Z ╰──── 2026-10-25T13:30:03.9164985Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-25T13:30:03.9164987Z 2026-10-25T13:30:03.9165466Z ⚠ 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-25T13:30:03.9165593Z ╭─[packages/shared/src/atomicWrite.test.ts:137:5] 2026-10-25T13:30:03.9165667Z 136 │ Effect.gen(function* () { 2026-10-25T13:30:03.9165863Z 137 │ ╭─▶ while (fiber.pollUnsafe() === undefined) { 2026-10-25T13:30:03.9165985Z 138 │ │ yield* TestClock.adjust("100 millis"); 2026-10-25T13:30:03.9166308Z 139 │ │ // 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-25T13:30:03.9166495Z 140 │ │ yield* Effect.promise(() => new Promise((resolve) => setImmediate(resolve))); 2026-10-25T13:30:03.9166624Z 141 │ ╰─▶ } 2026-10-25T13:30:03.9166716Z 142 │ return yield* Fiber.join(fiber); 2026-10-25T13:30:03.9166770Z ╰──── 2026-10-25T13:30:03.9166773Z 2026-10-25T13:30:03.9167015Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-25T13:30:03.9167177Z ╭─[apps/web/src/components/pullRequest/pullRequestList.logic.ts:262:9] 2026-10-25T13:30:03.9167238Z 261 │ ): boolean { 2026-10-25T13:30:03.9167384Z 262 │ const labels = entry.labels.map((label) => label.name.trim().toLowerCase()); 2026-10-25T13:30:03.9167551Z ·  ───────────────────────────────────────────────────────────────────── 2026-10-25T13:30:03.9167695Z 263 │ const holds = (label: string) => labels.includes(label.trim().toLowerCase()); 2026-10-25T13:30:03.9167744Z ╰──── 2026-10-25T13:30:03.9167820Z  help: Switch to `Set` 2026-10-25T13:30:03.9167822Z 2026-10-25T13:30:03.9168168Z ⚠ eslint(no-unused-vars): Variable 'navigation' is declared but never used. Unused variables should start with a '_'. 2026-10-25T13:30:03.9168366Z ╭─[apps/mobile/src/features/workspace/WorkspaceSectionToolbar.tsx:23:9] 2026-10-25T13:30:03.9168459Z 22 │ const selectTab = useSelectWorkspaceTab(); 2026-10-25T13:30:03.9168541Z 23 │ const navigation = useNavigation(); 2026-10-25T13:30:03.9168617Z ·  ─────┬──── 2026-10-25T13:30:03.9168752Z · ╰── 'navigation' is declared here 2026-10-25T13:30:03.9168840Z 24 │ const selected = selectedNavigationTab( 2026-10-25T13:30:03.9168891Z ╰──── 2026-10-25T13:30:03.9168994Z  help: Consider removing this declaration. 2026-10-25T13:30:03.9168997Z 2026-10-25T13:30:03.9169195Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T13:30:03.9169361Z ╭─[apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx:803:17] 2026-10-25T13:30:03.9169424Z 802 │
cancelAnimationFrame(frame); 2026-10-25T13:30:03.9170597Z 122 │ }, [restoreSearch, tabActive, bottomSearch]); 2026-10-25T13:30:03.9170702Z ·  ──────┬───── 2026-10-25T13:30:03.9170870Z · ╰── Unnecessary dependency `bottomSearch` 2026-10-25T13:30:03.9170972Z 123 │ const composeButton = nativeToolbarCompose ? ( 2026-10-25T13:30:03.9171022Z ╰──── 2026-10-25T13:30:03.9171315Z  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-25T13:30:03.9171634Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9171640Z 2026-10-25T13:30:03.9171838Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T13:30:03.9171978Z ╭─[apps/mobile/src/state/use-thread-outbox-drain.ts:1362:5] 2026-10-25T13:30:03.9172058Z 1361 │ queuedMessagesByThreadKey, 2026-10-25T13:30:03.9172120Z 1362 │ retryTick, 2026-10-25T13:30:03.9172194Z ·  ────┬──── 2026-10-25T13:30:03.9172331Z · ╰── Unnecessary dependency `retryTick` 2026-10-25T13:30:03.9172403Z 1363 │ restoreQueuedMessage, 2026-10-25T13:30:03.9172455Z ╰──── 2026-10-25T13:30:03.9172746Z  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-25T13:30:03.9173135Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9173204Z 2026-10-25T13:30:03.9173472Z ⚠ eslint(no-unused-vars): Variable 'navigation' is declared but never used. Unused variables should start with a '_'. 2026-10-25T13:30:03.9173638Z ╭─[apps/mobile/src/features/workspace/WorkspaceSidebarTabs.ios.tsx:32:9] 2026-10-25T13:30:03.9173783Z 31 │ const tabs = [...visibleNavigationTabs(order, hidden), "settings" as const]; 2026-10-25T13:30:03.9173863Z 32 │ const navigation = useNavigation(); 2026-10-25T13:30:03.9173941Z ·  ─────┬──── 2026-10-25T13:30:03.9174075Z · ╰── 'navigation' is declared here 2026-10-25T13:30:03.9174173Z 33 │ const selectTab = useSelectWorkspaceTab(); 2026-10-25T13:30:03.9174225Z ╰──── 2026-10-25T13:30:03.9174327Z  help: Consider removing this declaration. 2026-10-25T13:30:03.9174330Z 2026-10-25T13:30:03.9174555Z ⚠ eslint(no-unused-vars): Function 'assertUserMessagesExclude' is declared but never used. 2026-10-25T13:30:03.9174718Z ╭─[apps/server/src/orchestration-v2/testkit/fixtures/shared.ts:1387:10] 2026-10-25T13:30:03.9174771Z 1386 │ 2026-10-25T13:30:03.9174857Z 1387 │ function assertUserMessagesExclude( 2026-10-25T13:30:03.9174960Z ·  ────────────┬──────────── 2026-10-25T13:30:03.9175129Z · ╰── 'assertUserMessagesExclude' is declared here 2026-10-25T13:30:03.9175235Z 1388 │ projection: OrchestrationV2ThreadProjection, 2026-10-25T13:30:03.9175286Z ╰──── 2026-10-25T13:30:03.9175393Z  help: Consider removing this declaration. 2026-10-25T13:30:03.9175399Z 2026-10-25T13:30:03.9175657Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T13:30:03.9175809Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:358:7] 2026-10-25T13:30:03.9175946Z 352 │ }, [cancelledIncomingShareId, navigation, props.incomingShareId]); 2026-10-25T13:30:03.9176012Z 353 │ useEffect(() => { 2026-10-25T13:30:03.9176085Z ·  ────┬──── 2026-10-25T13:30:03.9176214Z · ╰── This is the containing effect 2026-10-25T13:30:03.9176301Z 354 │ if (!isReturningToProjectPicker) { 2026-10-25T13:30:03.9176362Z 355 │ return; 2026-10-25T13:30:03.9176417Z 356 │ } 2026-10-25T13:30:03.9176519Z 357 │ if (requestedInitialProjectAvailable) { 2026-10-25T13:30:03.9176612Z 358 │ setIsReturningToProjectPicker(false); 2026-10-25T13:30:03.9176716Z ·  ──────────────┬────────────── 2026-10-25T13:30:03.9176891Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.9176951Z 359 │ return; 2026-10-25T13:30:03.9177000Z ╰──── 2026-10-25T13:30:03.9177603Z  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-25T13:30:03.9178001Z  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-25T13:30:03.9178035Z 2026-10-25T13:30:03.9178290Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T13:30:03.9178441Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:496:9] 2026-10-25T13:30:03.9178492Z 441 │ 2026-10-25T13:30:03.9178557Z 442 │ useEffect(() => { 2026-10-25T13:30:03.9178628Z ·  ────┬──── 2026-10-25T13:30:03.9178756Z · ╰── This is the containing effect 2026-10-25T13:30:03.9178856Z 443 │ if (props.pendingTaskId || props.draftId) { 2026-10-25T13:30:03.9178916Z 444 │ return; 2026-10-25T13:30:03.9178969Z 445 │ } 2026-10-25T13:30:03.9179109Z 446 │ if (lastInitialProjectRefRef.current !== props.initialProjectRef) { 2026-10-25T13:30:03.9179244Z 447 │ lastInitialProjectRefRef.current = props.initialProjectRef; 2026-10-25T13:30:03.9179351Z 448 │ appliedInitialProjectKeyRef.current = null; 2026-10-25T13:30:03.9179403Z 449 │ } 2026-10-25T13:30:03.9179541Z 450 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-25T13:30:03.9179668Z 451 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-25T13:30:03.9179770Z 452 │ if (initialEnvironmentId && initialProjectId) { 2026-10-25T13:30:03.9179840Z 453 │ const directProject = 2026-10-25T13:30:03.9179906Z 454 │ projects.find( 2026-10-25T13:30:03.9179971Z 455 │ (project) => 2026-10-25T13:30:03.9180143Z 456 │ project.environmentId === initialEnvironmentId && project.id === initialProjectId, 2026-10-25T13:30:03.9180205Z 457 │ ) ?? null; 2026-10-25T13:30:03.9180255Z 458 │ 2026-10-25T13:30:03.9180330Z 459 │ if (directProject) { 2026-10-25T13:30:03.9180481Z 460 │ // Apply the route project once or picker changes would immediately revert. 2026-10-25T13:30:03.9180640Z 461 │ const directProjectKey = `${directProject.environmentId}:${directProject.id}`; 2026-10-25T13:30:03.9180773Z 462 │ if (appliedInitialProjectKeyRef.current === directProjectKey) { 2026-10-25T13:30:03.9180834Z 463 │ return; 2026-10-25T13:30:03.9180891Z 464 │ } 2026-10-25T13:30:03.9180987Z 465 │ if (props.initialProjectRef?.branch) { 2026-10-25T13:30:03.9181046Z 466 │ if ( 2026-10-25T13:30:03.9181188Z 467 │ selectedProject?.environmentId !== directProject.environmentId || 2026-10-25T13:30:03.9181288Z 468 │ selectedProject.id !== directProject.id 2026-10-25T13:30:03.9181346Z 469 │ ) { 2026-10-25T13:30:03.9181436Z 470 │ setProject(directProject); 2026-10-25T13:30:03.9181501Z 471 │ return; 2026-10-25T13:30:03.9181560Z 472 │ } 2026-10-25T13:30:03.9181642Z 473 │ if (!flow.draftKey) return; 2026-10-25T13:30:03.9181835Z 474 │ // Checkout completed before mount; local mode reuses it while worktree mode would create another. 2026-10-25T13:30:03.9181944Z 475 │ updateComposerDraftSettings(flow.draftKey, { 2026-10-25T13:30:03.9182022Z 476 │ workspaceSelection: { 2026-10-25T13:30:03.9182092Z 477 │ mode: "local", 2026-10-25T13:30:03.9182194Z 478 │ branch: props.initialProjectRef.branch, 2026-10-25T13:30:03.9182329Z 479 │ worktreePath: props.initialProjectRef.worktreePath ?? null, 2026-10-25T13:30:03.9182409Z 480 │ startFromOrigin: false, 2026-10-25T13:30:03.9182468Z 481 │ }, 2026-10-25T13:30:03.9182598Z 482 │ }); 2026-10-25T13:30:03.9182686Z 483 │ } 2026-10-25T13:30:03.9182812Z 484 │ appliedInitialProjectKeyRef.current = directProjectKey; 2026-10-25T13:30:03.9182869Z 485 │ if ( 2026-10-25T13:30:03.9183008Z 486 │ selectedProject?.environmentId === directProject.environmentId && 2026-10-25T13:30:03.9183106Z 487 │ selectedProject.id === directProject.id 2026-10-25T13:30:03.9183193Z 488 │ ) { 2026-10-25T13:30:03.9183254Z 489 │ return; 2026-10-25T13:30:03.9183310Z 490 │ } 2026-10-25T13:30:03.9183388Z 491 │ setProject(directProject); 2026-10-25T13:30:03.9183448Z 492 │ return; 2026-10-25T13:30:03.9183502Z 493 │ } 2026-10-25T13:30:03.9183554Z 494 │ 2026-10-25T13:30:03.9183634Z 495 │ if (projects.length > 0) { 2026-10-25T13:30:03.9183736Z 496 │ setIsReturningToProjectPicker(true); 2026-10-25T13:30:03.9183844Z ·  ──────────────┬────────────── 2026-10-25T13:30:03.9184024Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.9184080Z 497 │ } 2026-10-25T13:30:03.9184130Z ╰──── 2026-10-25T13:30:03.9184821Z  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-25T13:30:03.9185146Z  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-25T13:30:03.9185150Z 2026-10-25T13:30:03.9185413Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T13:30:03.9185567Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:596:5] 2026-10-25T13:30:03.9185618Z 537 │ 2026-10-25T13:30:03.9185681Z 538 │ useEffect(() => { 2026-10-25T13:30:03.9185754Z ·  ────┬──── 2026-10-25T13:30:03.9185881Z · ╰── This is the containing effect 2026-10-25T13:30:03.9185974Z 539 │ const shareId = props.incomingShareId; 2026-10-25T13:30:03.9186053Z 540 │ const draftKey = flow.draftKey; 2026-10-25T13:30:03.9186152Z 541 │ const destinationProject = selectedProject; 2026-10-25T13:30:03.9186290Z 542 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-25T13:30:03.9186420Z 543 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-25T13:30:03.9186511Z 544 │ const selectedProjectMatchesRoute = 2026-10-25T13:30:03.9186587Z 545 │ !initialEnvironmentId || 2026-10-25T13:30:03.9186656Z 546 │ !initialProjectId || 2026-10-25T13:30:03.9186784Z 547 │ (destinationProject?.environmentId === initialEnvironmentId && 2026-10-25T13:30:03.9186887Z 548 │ destinationProject.id === initialProjectId); 2026-10-25T13:30:03.9186943Z 549 │ if ( 2026-10-25T13:30:03.9187004Z 550 │ !shareId || 2026-10-25T13:30:03.9187065Z 551 │ !draftKey || 2026-10-25T13:30:03.9187136Z 552 │ !destinationProject || 2026-10-25T13:30:03.9187222Z 553 │ !selectedProjectMatchesRoute || 2026-10-25T13:30:03.9187311Z 554 │ cancelledIncomingShareId === shareId 2026-10-25T13:30:03.9187364Z 555 │ ) { 2026-10-25T13:30:03.9187423Z 556 │ return; 2026-10-25T13:30:03.9187566Z 557 │ } 2026-10-25T13:30:03.9187708Z 558 │ const importKey = `${shareId}:${draftKey}`; 2026-10-25T13:30:03.9187764Z 559 │ if ( 2026-10-25T13:30:03.9187874Z 560 │ startedShareImportKeyRef.current === importKey || 2026-10-25T13:30:03.9187983Z 561 │ cancellingShareImportKeyRef.current === importKey 2026-10-25T13:30:03.9188037Z 562 │ ) { 2026-10-25T13:30:03.9188093Z 563 │ return; 2026-10-25T13:30:03.9188146Z 564 │ } 2026-10-25T13:30:03.9188198Z 565 │ 2026-10-25T13:30:03.9188265Z 566 │ if (!incomingShare) { 2026-10-25T13:30:03.9188459Z 567 │ if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) { 2026-10-25T13:30:03.9188586Z 568 │ alertedUnavailableIncomingShareIdRef.current = shareId; 2026-10-25T13:30:03.9188650Z 569 │ Dialog.alert( 2026-10-25T13:30:03.9188740Z 570 │ "Shared content unavailable", 2026-10-25T13:30:03.9188917Z 571 │ "The shared content is no longer in the inbox. You can continue editing this task draft.", 2026-10-25T13:30:03.9188975Z 572 │ ); 2026-10-25T13:30:03.9189028Z 573 │ } 2026-10-25T13:30:03.9189085Z 574 │ return; 2026-10-25T13:30:03.9189140Z 575 │ } 2026-10-25T13:30:03.9189191Z 576 │ 2026-10-25T13:30:03.9189246Z 577 │ if ( 2026-10-25T13:30:03.9189403Z 578 │ incomingShare.attachments.some((attachment) => attachment.type === "file") && 2026-10-25T13:30:03.9189502Z 579 │ selectedEnvironmentServerConfig === null 2026-10-25T13:30:03.9189556Z 580 │ ) { 2026-10-25T13:30:03.9189613Z 581 │ return; 2026-10-25T13:30:03.9189664Z 582 │ } 2026-10-25T13:30:03.9189716Z 583 │ 2026-10-25T13:30:03.9189858Z 584 │ if (alertedUnavailableIncomingShareIdRef.current === shareId) { 2026-10-25T13:30:03.9189979Z 585 │ alertedUnavailableIncomingShareIdRef.current = null; 2026-10-25T13:30:03.9190031Z 586 │ } 2026-10-25T13:30:03.9190135Z 587 │ startedShareImportKeyRef.current = importKey; 2026-10-25T13:30:03.9190202Z 588 │ const draftBackup = 2026-10-25T13:30:03.9190385Z 589 │ shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey); 2026-10-25T13:30:03.9190519Z 590 │ shareImportDraftBackupRef.current.set(importKey, draftBackup); 2026-10-25T13:30:03.9190609Z 591 │ const importToken = Symbol(importKey); 2026-10-25T13:30:03.9190686Z 592 │ let didReserveShare = false; 2026-10-25T13:30:03.9190762Z 593 │ let didConsumeShare = false; 2026-10-25T13:30:03.9190839Z 594 │ let needsDraftRestore = false; 2026-10-25T13:30:03.9190948Z 595 │ activeShareImportTokenRef.current = importToken; 2026-10-25T13:30:03.9191108Z 596 │ setImportingShareKey(importKey); 2026-10-25T13:30:03.9191232Z ·  ──────────┬───────── 2026-10-25T13:30:03.9191406Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.9191473Z 597 │ void (async () => { 2026-10-25T13:30:03.9191525Z ╰──── 2026-10-25T13:30:03.9192123Z  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-25T13:30:03.9192445Z  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-25T13:30:03.9192453Z 2026-10-25T13:30:03.9192658Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T13:30:03.9192811Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:516:5] 2026-10-25T13:30:03.9192885Z 515 │ props.initialProjectRef, 2026-10-25T13:30:03.9192956Z 516 │ props.incomingShareId, 2026-10-25T13:30:03.9193043Z ·  ──────────┬────────── 2026-10-25T13:30:03.9193239Z · ╰── Unnecessary dependency `props.incomingShareId` 2026-10-25T13:30:03.9193313Z 517 │ props.pendingTaskId, 2026-10-25T13:30:03.9193363Z ╰──── 2026-10-25T13:30:03.9193655Z  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-25T13:30:03.9193972Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9193978Z 2026-10-25T13:30:03.9194193Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T13:30:03.9194345Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:535:5] 2026-10-25T13:30:03.9194458Z 534 │ loadedBranchesProjectKeyRef.current = projectKey; 2026-10-25T13:30:03.9194525Z 535 │ flow.loadBranches(); 2026-10-25T13:30:03.9194594Z ·  ──┬─ 2026-10-25T13:30:03.9194718Z · ╰── Missing dependency `flow` 2026-10-25T13:30:03.9194808Z 536 │ }, [flow.loadBranches, selectedProject]); 2026-10-25T13:30:03.9194893Z ·  ────────┬──────── 2026-10-25T13:30:03.9195097Z · ╰── Overly precise dependency `flow.loadBranches`, use `flow` instead 2026-10-25T13:30:03.9195154Z 537 │ 2026-10-25T13:30:03.9195204Z ╰──── 2026-10-25T13:30:03.9195627Z  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-25T13:30:03.9195941Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9195944Z 2026-10-25T13:30:03.9196141Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T13:30:03.9196357Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:748:5] 2026-10-25T13:30:03.9196455Z 747 │ flow.draftKey, 2026-10-25T13:30:03.9196532Z 748 │ hasImportedIncomingShare, 2026-10-25T13:30:03.9196622Z ·  ────────────┬─────────── 2026-10-25T13:30:03.9196796Z · ╰── Unnecessary dependency `hasImportedIncomingShare` 2026-10-25T13:30:03.9196858Z 749 │ incomingShare, 2026-10-25T13:30:03.9196937Z 750 │ isIncomingShareInboxLoading, 2026-10-25T13:30:03.9197034Z ·  ─────────────┬───────────── 2026-10-25T13:30:03.9197216Z · ╰── Unnecessary dependency `isIncomingShareInboxLoading` 2026-10-25T13:30:03.9197293Z 751 │ isIncomingShareUnavailable, 2026-10-25T13:30:03.9197365Z 752 │ props.incomingShareId, 2026-10-25T13:30:03.9197457Z 753 │ props.initialProjectRef?.environmentId, 2026-10-25T13:30:03.9197551Z 754 │ props.initialProjectRef?.projectId, 2026-10-25T13:30:03.9197626Z 755 │ releaseShareReservation, 2026-10-25T13:30:03.9197689Z 756 │ reserveShare, 2026-10-25T13:30:03.9197775Z 757 │ selectedEnvironmentServerConfig, 2026-10-25T13:30:03.9197840Z 758 │ selectedProject, 2026-10-25T13:30:03.9197907Z 759 │ shareImportAttempt, 2026-10-25T13:30:03.9197991Z ·  ─────────┬──────── 2026-10-25T13:30:03.9198154Z · ╰── Unnecessary dependency `shareImportAttempt` 2026-10-25T13:30:03.9198207Z 760 │ ]); 2026-10-25T13:30:03.9198258Z ╰──── 2026-10-25T13:30:03.9198551Z  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-25T13:30:03.9198868Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9198873Z 2026-10-25T13:30:03.9199131Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T13:30:03.9199259Z ╭─[apps/mobile/src/state/use-vcs-action-state.ts:85:5] 2026-10-25T13:30:03.9199365Z 82 │ const [nowMs, setNowMs] = useState(() => Date.now()); 2026-10-25T13:30:03.9199428Z 83 │ useEffect(() => { 2026-10-25T13:30:03.9199499Z ·  ────┬──── 2026-10-25T13:30:03.9199627Z · ╰── This is the containing effect 2026-10-25T13:30:03.9199713Z 84 │ if (!actionState.isRunning) return; 2026-10-25T13:30:03.9199779Z 85 │ setNowMs(Date.now()); 2026-10-25T13:30:03.9199855Z ·  ────┬─── 2026-10-25T13:30:03.9200024Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.9200148Z 86 │ const interval = setInterval(() => setNowMs(Date.now()), 1000); 2026-10-25T13:30:03.9200197Z ╰──── 2026-10-25T13:30:03.9200798Z  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-25T13:30:03.9201122Z  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-25T13:30:03.9201125Z 2026-10-25T13:30:03.9201653Z ⚠ 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-25T13:30:03.9201842Z ╭─[packages/contracts/src/baseSchemas.test.ts:39:9] 2026-10-25T13:30:03.9201907Z 38 │ JSON.stringify( 2026-10-25T13:30:03.9202026Z 39 │ Schema.encodeUnknownSync(Schema.toCodecJson(Named))([ 2026-10-25T13:30:03.9202121Z ·  ──────────────────────── 2026-10-25T13:30:03.9202187Z 40 │ { name: "a" }, 2026-10-25T13:30:03.9202237Z ╰──── 2026-10-25T13:30:03.9202239Z 2026-10-25T13:30:03.9202494Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T13:30:03.9202663Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:280:5] 2026-10-25T13:30:03.9202788Z 278 │ const [snoozeWakeTick, bumpSnoozeWakeTick] = useState(0); 2026-10-25T13:30:03.9202852Z 279 │ useEffect(() => { 2026-10-25T13:30:03.9202922Z ·  ────┬──── 2026-10-25T13:30:03.9203051Z · ╰── This is the containing effect 2026-10-25T13:30:03.9203135Z 280 │ setNow(new Date().toISOString()); 2026-10-25T13:30:03.9203234Z ·  ───┬── 2026-10-25T13:30:03.9203398Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.9203531Z 281 │ const id = setInterval(() => setNow(new Date().toISOString()), 60_000); 2026-10-25T13:30:03.9203583Z ╰──── 2026-10-25T13:30:03.9204188Z  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-25T13:30:03.9204513Z  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-25T13:30:03.9204516Z 2026-10-25T13:30:03.9204742Z ⚠ eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used. 2026-10-25T13:30:03.9204902Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:12:8] 2026-10-25T13:30:03.9204970Z 11 │ threadSearchMatchKey, 2026-10-25T13:30:03.9205055Z 12 │ type EnvironmentThreadSearchMatch, 2026-10-25T13:30:03.9205160Z ·  ──────────────┬───────────── 2026-10-25T13:30:03.9205340Z · ╰── 'EnvironmentThreadSearchMatch' is imported here 2026-10-25T13:30:03.9205450Z 13 │ } from "@t3tools/client-runtime/state/thread-search"; 2026-10-25T13:30:03.9205501Z ╰──── 2026-10-25T13:30:03.9205599Z  help: Consider removing this import. 2026-10-25T13:30:03.9205602Z 2026-10-25T13:30:03.9205800Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T13:30:03.9205962Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:337:25] 2026-10-25T13:30:03.9206173Z 336 │ // snoozeWakeTick re-arms clamped timers even when the wake date exceeds 32-bit setTimeout and stays unchanged. 2026-10-25T13:30:03.9206262Z 337 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-25T13:30:03.9206363Z ·  ───────┬────── 2026-10-25T13:30:03.9206596Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-25T13:30:03.9206731Z 338 │ const listItems: readonly SidebarListItem[] = 2026-10-25T13:30:03.9206782Z ╰──── 2026-10-25T13:30:03.9207074Z  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-25T13:30:03.9207383Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9207386Z 2026-10-25T13:30:03.9207589Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-25T13:30:03.9207692Z ╭─[packages/contracts/src/rpc.ts:300:8] 2026-10-25T13:30:03.9207765Z 299 │ } from "./device.ts"; 2026-10-25T13:30:03.9207857Z 300 │ import {} from "./previewAutomation.ts"; 2026-10-25T13:30:03.9207925Z ·  ── 2026-10-25T13:30:03.9207983Z 301 │ import { 2026-10-25T13:30:03.9208034Z ╰──── 2026-10-25T13:30:03.9208113Z  help: Remove empty braces 2026-10-25T13:30:03.9208116Z 2026-10-25T13:30:03.9208304Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T13:30:03.9208475Z ╭─[apps/web/src/components/pullRequest/PullRequestChecksPopover.tsx:84:15] 2026-10-25T13:30:03.9208537Z 83 │
  • ({ key: _, ...rest }: Selection) => 2026-10-25T13:30:03.9211093Z ·  ┬ 2026-10-25T13:30:03.9211259Z · ╰── '_' is declared here 2026-10-25T13:30:03.9211315Z 53 │ rest; 2026-10-25T13:30:03.9211371Z ╰──── 2026-10-25T13:30:03.9211475Z  help: Consider removing this parameter. 2026-10-25T13:30:03.9211478Z 2026-10-25T13:30:03.9211680Z ⚠ eslint(no-unused-vars): Type 'PullRequestChecks' is imported but never used. 2026-10-25T13:30:03.9211844Z ╭─[apps/web/src/components/pullRequest/pullRequestDetail.logic.ts:16:8] 2026-10-25T13:30:03.9211913Z 15 │ type PullRequestCheck, 2026-10-25T13:30:03.9211980Z 16 │ type PullRequestChecks, 2026-10-25T13:30:03.9212065Z ·  ────────┬──────── 2026-10-25T13:30:03.9212214Z · ╰── 'PullRequestChecks' is imported here 2026-10-25T13:30:03.9212347Z 17 │ type PullRequestChecksState as ContractPullRequestChecksState, 2026-10-25T13:30:03.9212397Z ╰──── 2026-10-25T13:30:03.9212494Z  help: Consider removing this import. 2026-10-25T13:30:03.9212503Z 2026-10-25T13:30:03.9212702Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T13:30:03.9212862Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:151:7] 2026-10-25T13:30:03.9212916Z 150 │ } 2026-10-25T13:30:03.9212981Z 151 │ }, [wrappedRender]); 2026-10-25T13:30:03.9213059Z ·  ──────┬────── 2026-10-25T13:30:03.9213239Z · ╰── Unnecessary dependency `wrappedRender` 2026-10-25T13:30:03.9213292Z 152 │ 2026-10-25T13:30:03.9213341Z ╰──── 2026-10-25T13:30:03.9213635Z  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-25T13:30:03.9213952Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9213958Z 2026-10-25T13:30:03.9214200Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-25T13:30:03.9214360Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:788:42] 2026-10-25T13:30:03.9214414Z 787 │ > 2026-10-25T13:30:03.9214540Z 788 │ 2026-10-25T13:30:03.9214662Z ·  ──────────────────── 2026-10-25T13:30:03.9214760Z 789 │ 2026-10-25T13:30:03.9214810Z ╰──── 2026-10-25T13:30:03.9215106Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-25T13:30:03.9215280Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-25T13:30:03.9215283Z 2026-10-25T13:30:03.9215448Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-25T13:30:03.9215636Z ╭─[packages/provider-opencode/src/server/OpenCodeRuntime.environment.test.ts:53:14] 2026-10-25T13:30:03.9215687Z 52 │ 2026-10-25T13:30:03.9215753Z 53 │ for (const {} of [ 2026-10-25T13:30:03.9215824Z ·  ── 2026-10-25T13:30:03.9215891Z 54 │ { healthy: true }, 2026-10-25T13:30:03.9215941Z ╰──── 2026-10-25T13:30:03.9216168Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-25T13:30:03.9216171Z 2026-10-25T13:30:03.9216330Z ⚠ react(immutability): This value cannot be modified 2026-10-25T13:30:03.9216494Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:39:5] 2026-10-25T13:30:03.9216547Z 32 │ 2026-10-25T13:30:03.9216683Z 33 │ const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0); 2026-10-25T13:30:03.9216771Z ·  ────────┬──────── 2026-10-25T13:30:03.9216915Z · ╰── `inspectorProgress` originates here 2026-10-25T13:30:03.9217008Z 34 │ const { renderedInspectorWidth } = props; 2026-10-25T13:30:03.9217138Z 35 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-25T13:30:03.9217189Z 36 │ 2026-10-25T13:30:03.9217267Z 37 │ const onClosed = props.onClosed; 2026-10-25T13:30:03.9217331Z 38 │ useEffect(() => { 2026-10-25T13:30:03.9217427Z 39 │ inspectorProgress.value = withTiming( 2026-10-25T13:30:03.9217512Z ·  ────────┬──────── 2026-10-25T13:30:03.9217659Z · ╰── `inspectorProgress` cannot be modified 2026-10-25T13:30:03.9217735Z 40 │ inspectorVisible ? 1 : 0, 2026-10-25T13:30:03.9217786Z ╰──── 2026-10-25T13:30:03.9218050Z  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-25T13:30:03.9218357Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T13:30:03.9218359Z 2026-10-25T13:30:03.9218513Z ⚠ react(immutability): This value cannot be modified 2026-10-25T13:30:03.9218676Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:64:7] 2026-10-25T13:30:03.9218769Z 34 │ const { renderedInspectorWidth } = props; 2026-10-25T13:30:03.9218897Z 35 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-25T13:30:03.9218986Z ·  ──────────┬───────── 2026-10-25T13:30:03.9219138Z · ╰── `renderedContentWidth` originates here 2026-10-25T13:30:03.9219190Z 36 │ 2026-10-25T13:30:03.9219268Z 37 │ const onClosed = props.onClosed; 2026-10-25T13:30:03.9219332Z 38 │ useEffect(() => { 2026-10-25T13:30:03.9219420Z 39 │ inspectorProgress.value = withTiming( 2026-10-25T13:30:03.9219494Z 40 │ inspectorVisible ? 1 : 0, 2026-10-25T13:30:03.9219564Z 41 │ WORKSPACE_PANE_TIMING, 2026-10-25T13:30:03.9219628Z 42 │ (finished) => { 2026-10-25T13:30:03.9219841Z 43 │ if (finished === true && !inspectorVisible && onClosed !== undefined) { 2026-10-25T13:30:03.9219963Z 44 │ runOnJS(onClosed)(); 2026-10-25T13:30:03.9220018Z 45 │ } 2026-10-25T13:30:03.9220072Z 46 │ }, 2026-10-25T13:30:03.9220126Z 47 │ ); 2026-10-25T13:30:03.9220255Z 48 │ const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0; 2026-10-25T13:30:03.9220331Z 49 │ renderedInspectorWidth.set( 2026-10-25T13:30:03.9220474Z 50 │ resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING), 2026-10-25T13:30:03.9220528Z 51 │ ); 2026-10-25T13:30:03.9220579Z 52 │ }, [ 2026-10-25T13:30:03.9220645Z 53 │ inspectorProgress, 2026-10-25T13:30:03.9220710Z 54 │ inspectorVisible, 2026-10-25T13:30:03.9220772Z 55 │ inspectorWidth, 2026-10-25T13:30:03.9220830Z 56 │ onClosed, 2026-10-25T13:30:03.9220901Z 57 │ renderedInspectorWidth, 2026-10-25T13:30:03.9220966Z 58 │ resizing, 2026-10-25T13:30:03.9221023Z 59 │ ]); 2026-10-25T13:30:03.9221072Z 60 │ 2026-10-25T13:30:03.9221134Z 61 │ useEffect(() => { 2026-10-25T13:30:03.9221225Z 62 │ const targetWidth = inspectorWidth ?? 0; 2026-10-25T13:30:03.9221309Z 63 │ if (!inspectorVisible || resizing) { 2026-10-25T13:30:03.9221404Z 64 │ renderedContentWidth.value = targetWidth; 2026-10-25T13:30:03.9221491Z ·  ──────────┬───────── 2026-10-25T13:30:03.9221650Z · ╰── `renderedContentWidth` cannot be modified 2026-10-25T13:30:03.9221709Z 65 │ return; 2026-10-25T13:30:03.9221758Z ╰──── 2026-10-25T13:30:03.9222020Z  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-25T13:30:03.9222332Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T13:30:03.9222339Z 2026-10-25T13:30:03.9222596Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T13:30:03.9222736Z ╭─[packages/provider-opencode/src/server/adapter.ts:3719:7] 2026-10-25T13:30:03.9222789Z 3718 │ 2026-10-25T13:30:03.9222987Z 3719 │ const layer: Layer.Layer = 2026-10-25T13:30:03.9223057Z ·  ──┬── 2026-10-25T13:30:03.9223211Z · ╰── 'layer' is declared here 2026-10-25T13:30:03.9223276Z 3720 │ Layer.effect( 2026-10-25T13:30:03.9223327Z ╰──── 2026-10-25T13:30:03.9223436Z  help: Consider removing this declaration. 2026-10-25T13:30:03.9223441Z 2026-10-25T13:30:03.9223630Z ⚠ eslint(no-unused-vars): Identifier 'Fiber' is imported but never used. 2026-10-25T13:30:03.9223724Z ╭─[apps/server/src/ws.ts:10:13] 2026-10-25T13:30:03.9223812Z  9 │ import * as Effect from "effect/Effect"; 2026-10-25T13:30:03.9223895Z 10 │ import * as Fiber from "effect/Fiber"; 2026-10-25T13:30:03.9223968Z ·  ──┬── 2026-10-25T13:30:03.9224096Z · ╰── 'Fiber' is imported here 2026-10-25T13:30:03.9224197Z 11 │ import * as FileSystem from "effect/FileSystem"; 2026-10-25T13:30:03.9224247Z ╰──── 2026-10-25T13:30:03.9224341Z  help: Consider removing this import. 2026-10-25T13:30:03.9224344Z 2026-10-25T13:30:03.9224668Z ⚠ eslint(no-unused-vars): Identifier 'Schedule' is imported but never used. 2026-10-25T13:30:03.9224822Z ╭─[apps/server/src/ws.ts:17:13] 2026-10-25T13:30:03.9224901Z 16 │ import * as Ref from "effect/Ref"; 2026-10-25T13:30:03.9224991Z 17 │ import * as Schedule from "effect/Schedule"; 2026-10-25T13:30:03.9225067Z ·  ────┬─── 2026-10-25T13:30:03.9225201Z · ╰── 'Schedule' is imported here 2026-10-25T13:30:03.9225284Z 18 │ import * as Schema from "effect/Schema"; 2026-10-25T13:30:03.9225334Z ╰──── 2026-10-25T13:30:03.9225429Z  help: Consider removing this import. 2026-10-25T13:30:03.9225432Z 2026-10-25T13:30:03.9225728Z ⚠ eslint(no-unused-vars): Variable 'projectSetupScriptRunner' is declared but never used. Unused variables should start with a '_'. 2026-10-25T13:30:03.9225835Z ╭─[apps/server/src/ws.ts:1303:13] 2026-10-25T13:30:03.9225993Z 1302 │ const usageLimitSources = yield* UsageLimitSources.UsageLimitSources; 2026-10-25T13:30:03.9226189Z 1303 │ const projectSetupScriptRunner = yield* ProjectSetupScriptRunner.ProjectSetupScriptRunner; 2026-10-25T13:30:03.9226293Z ·  ────────────┬─────────── 2026-10-25T13:30:03.9226466Z · ╰── 'projectSetupScriptRunner' is declared here 2026-10-25T13:30:03.9226633Z 1304 │ const worktreeSetupTracker = yield* WorktreeSetupTracker.WorktreeSetupTracker; 2026-10-25T13:30:03.9226683Z ╰──── 2026-10-25T13:30:03.9226784Z  help: Consider removing this declaration. 2026-10-25T13:30:03.9226787Z 2026-10-25T13:30:03.9226992Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-25T13:30:03.9227164Z ╭─[apps/server/src/sourceControl/SourceControlProviderRegistry.ts:15:13] 2026-10-25T13:30:03.9227240Z 14 │ } from "@t3tools/contracts"; 2026-10-25T13:30:03.9227330Z 15 │ import type {} from "@t3tools/contracts"; 2026-10-25T13:30:03.9227399Z ·  ── 2026-10-25T13:30:03.9227450Z 16 │ 2026-10-25T13:30:03.9227498Z ╰──── 2026-10-25T13:30:03.9227579Z  help: Remove empty braces 2026-10-25T13:30:03.9227581Z 2026-10-25T13:30:03.9227775Z ⚠ eslint(no-unused-vars): Identifier 'identity' is imported but never used. 2026-10-25T13:30:03.9227876Z ╭─[apps/server/src/auth/http.ts:28:10] 2026-10-25T13:30:03.9227959Z 27 │ import * as Schema from "effect/Schema"; 2026-10-25T13:30:03.9228049Z 28 │ import { identity } from "effect/Function"; 2026-10-25T13:30:03.9228128Z ·  ────┬─── 2026-10-25T13:30:03.9228263Z · ╰── 'identity' is imported here 2026-10-25T13:30:03.9228345Z 29 │ import * as Layer from "effect/Layer"; 2026-10-25T13:30:03.9228395Z ╰──── 2026-10-25T13:30:03.9228489Z  help: Consider removing this import. 2026-10-25T13:30:03.9228492Z 2026-10-25T13:30:03.9228725Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-25T13:30:03.9228859Z ╭─[apps/web/src/components/chat/useComposerSend.ts:985:13] 2026-10-25T13:30:03.9228980Z 984 │ const changedBeforeDecline = draftChangedSinceSend(); 2026-10-25T13:30:03.9229223Z 985 │ ╭─▶ const pendingIdsBeforeDecline = pendingApprovalsRef.current.map( 2026-10-25T13:30:03.9229426Z 986 │ │ (approval) => approval.requestId, 2026-10-25T13:30:03.9229593Z 987 │ ╰─▶ ); 2026-10-25T13:30:03.9229730Z 988 │ const approvalResponding = approvalsToDecline.some((approval) => 2026-10-25T13:30:03.9229781Z ╰──── 2026-10-25T13:30:03.9229856Z  help: Switch to `Set` 2026-10-25T13:30:03.9229859Z 2026-10-25T13:30:03.9230288Z ⚠ 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-25T13:30:03.9230432Z ╭─[apps/server/src/provider/acp/AntigravityProtocol.ts:260:20] 2026-10-25T13:30:03.9230512Z 259 │ ...(update._meta !== undefined 2026-10-25T13:30:03.9230684Z 260 │ ? { _meta: Schema.is(Schema.Record(Schema.String, Schema.Json))(meta) ? meta : null } 2026-10-25T13:30:03.9230774Z ·  ───────── 2026-10-25T13:30:03.9230835Z 261 │ : {}), 2026-10-25T13:30:03.9230887Z ╰──── 2026-10-25T13:30:03.9230890Z 2026-10-25T13:30:03.9231090Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T13:30:03.9231205Z ╭─[apps/mobile/src/state/thread-order.ts:28:7] 2026-10-25T13:30:03.9231277Z 27 │ getPendingThreadOrder(); 2026-10-25T13:30:03.9231356Z 28 │ }, [nowMinute, snoozeWakeTick]); 2026-10-25T13:30:03.9231477Z ·  ────┬──── ───────┬────── 2026-10-25T13:30:03.9231669Z · │ ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-25T13:30:03.9231813Z · ╰── Unnecessary dependency `nowMinute` 2026-10-25T13:30:03.9231881Z 29 │ return pending; 2026-10-25T13:30:03.9231930Z ╰──── 2026-10-25T13:30:03.9232225Z  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-25T13:30:03.9232536Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9232540Z 2026-10-25T13:30:03.9232801Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-25T13:30:03.9232931Z ╭─[apps/server/src/telemetry/AnalyticsService.ts:327:7] 2026-10-25T13:30:03.9232982Z 326 │ 2026-10-25T13:30:03.9233192Z 327 │ const layerTest = AnalyticsService.layerTest; 2026-10-25T13:30:03.9233305Z ·  ────┬──── 2026-10-25T13:30:03.9233437Z · ╰── 'layerTest' is declared here 2026-10-25T13:30:03.9233487Z ╰──── 2026-10-25T13:30:03.9233587Z  help: Consider removing this declaration. 2026-10-25T13:30:03.9233591Z 2026-10-25T13:30:03.9233775Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-25T13:30:03.9233898Z ╭─[packages/client-runtime/src/state/shell.ts:216:5] 2026-10-25T13:30:03.9234006Z 213 │ let waiting = yield* Ref.get(awaitingCompletion); 2026-10-25T13:30:03.9234073Z 214 │ let next = initial; 2026-10-25T13:30:03.9234141Z ·  ──┬─ 2026-10-25T13:30:03.9234259Z · ╰── From this accumulator 2026-10-25T13:30:03.9234346Z 215 │ let receivedSnapshot = false; 2026-10-25T13:30:03.9234424Z 216 │ for (const item of items) { 2026-10-25T13:30:03.9234490Z ·  ─┬─ 2026-10-25T13:30:03.9234596Z · ╰── For this loop 2026-10-25T13:30:03.9234682Z 217 │ if (item.kind === "synchronized") { 2026-10-25T13:30:03.9234749Z 218 │ waiting = false; 2026-10-25T13:30:03.9234839Z 219 │ if (Option.isSome(next.snapshot)) { 2026-10-25T13:30:03.9234955Z 220 │ next = { ...next, status: "live", error: Option.none() }; 2026-10-25T13:30:03.9235040Z ·  ───┬─── 2026-10-25T13:30:03.9235167Z · ╰── From this spread 2026-10-25T13:30:03.9235225Z 221 │ } 2026-10-25T13:30:03.9235275Z ╰──── 2026-10-25T13:30:03.9235435Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-25T13:30:03.9235590Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-25T13:30:03.9235594Z 2026-10-25T13:30:03.9235760Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T13:30:03.9235906Z ╭─[apps/web/src/components/chat/useThreadLifecycle.tsx:178:58] 2026-10-25T13:30:03.9236015Z 177 │ if (snoozeClockState.shell !== activeThreadShell) { 2026-10-25T13:30:03.9236175Z 178 │ setSnoozeClockState({ shell: activeThreadShell, now: new Date().toISOString() }); 2026-10-25T13:30:03.9236297Z ·  ─────┬──── 2026-10-25T13:30:03.9236467Z · ╰── Cannot call impure function 2026-10-25T13:30:03.9236526Z 179 │ } 2026-10-25T13:30:03.9236580Z ╰──── 2026-10-25T13:30:03.9236855Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T13:30:03.9237151Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T13:30:03.9237154Z 2026-10-25T13:30:03.9237521Z ⚠ 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-25T13:30:03.9237646Z ╭─[apps/server/src/auth/RpcAuthorization.ts:239:17] 2026-10-25T13:30:03.9237781Z 238 │ const requiredScopesForSettingsUpdate = (payload: unknown) => { 2026-10-25T13:30:03.9237993Z 239 │ const input = Schema.decodeUnknownSync(SettingsUpdate)(payload); 2026-10-25T13:30:03.9238136Z ·  ──────────────────────── 2026-10-25T13:30:03.9238272Z 240 │ const scopes = requiredScopesForServerSettingsPatch(input.patch); 2026-10-25T13:30:03.9238322Z ╰──── 2026-10-25T13:30:03.9238324Z 2026-10-25T13:30:03.9238684Z ⚠ 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-25T13:30:03.9238806Z ╭─[apps/server/src/auth/RpcAuthorization.ts:257:26] 2026-10-25T13:30:03.9238904Z 256 │ if (method === WS_METHODS.assetsCreateUrl) { 2026-10-25T13:30:03.9239058Z 257 │ const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload); 2026-10-25T13:30:03.9239176Z ·  ──────────────────────── 2026-10-25T13:30:03.9239238Z 258 │ return [ 2026-10-25T13:30:03.9239289Z ╰──── 2026-10-25T13:30:03.9239292Z 2026-10-25T13:30:03.9239479Z ⚠ eslint(require-yield): This generator function does not have `yield` 2026-10-25T13:30:03.9239624Z ╭─[packages/provider-acp/src/server/mcpOverAcpBridge.ts:81:78] 2026-10-25T13:30:03.9239679Z  80 │ 2026-10-25T13:30:03.9239952Z  81 │ ╭─▶ export const makeAcpMcpOverAcpBridge = Effect.fn("AcpMcpOverAcpBridge.make")(function* ( 2026-10-25T13:30:03.9240071Z  82 │ │ options: AcpMcpOverAcpBridgeOptions, 2026-10-25T13:30:03.9240191Z  83 │ │ ): Effect.fn.Return { 2026-10-25T13:30:03.9240365Z  84 │ │ const fetchImplementation = options.fetchImplementation ?? fetch; 2026-10-25T13:30:03.9240502Z  85 │ │ const connections = new Map(); 2026-10-25T13:30:03.9240571Z  86 │ │ 2026-10-25T13:30:03.9240783Z  87 │ │ const connectionFor = (connectionId: string): Effect.Effect => 2026-10-25T13:30:03.9240881Z  88 │ │ Effect.suspend(() => { 2026-10-25T13:30:03.9241017Z  89 │ │ const connection = connections.get(connectionId); 2026-10-25T13:30:03.9241126Z  90 │ │ return connection === undefined 2026-10-25T13:30:03.9241337Z  91 │ │ ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`)) 2026-10-25T13:30:03.9241444Z  92 │ │ : Effect.succeed(connection); 2026-10-25T13:30:03.9241525Z  93 │ │ }); 2026-10-25T13:30:03.9241595Z  94 │ │ 2026-10-25T13:30:03.9241680Z  95 │ │ const send = ( 2026-10-25T13:30:03.9241776Z  96 │ │ connection: Connection, 2026-10-25T13:30:03.9241866Z  97 │ │ message: unknown, 2026-10-25T13:30:03.9242023Z  98 │ │ ): Effect.Effect, AcpMcpOverAcpError> => 2026-10-25T13:30:03.9242138Z  99 │ │ connection.mutex.withPermits(1)( 2026-10-25T13:30:03.9242242Z 100 │ │ Effect.gen(function* () { 2026-10-25T13:30:03.9242363Z 101 │ │ const body = JSON.stringify(message); 2026-10-25T13:30:03.9242503Z 102 │ │ if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) { 2026-10-25T13:30:03.9242784Z 103 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB.")); 2026-10-25T13:30:03.9242902Z 104 │ │ } 2026-10-25T13:30:03.9243034Z 105 │ │ const response = yield* Effect.tryPromise({ 2026-10-25T13:30:03.9243131Z 106 │ │ try: (signal) => 2026-10-25T13:30:03.9243292Z 107 │ │ fetchImplementation(options.endpoint, { 2026-10-25T13:30:03.9243391Z 108 │ │ method: "POST", 2026-10-25T13:30:03.9243482Z 109 │ │ signal, 2026-10-25T13:30:03.9243578Z 110 │ │ headers: { 2026-10-25T13:30:03.9243705Z 111 │ │ "content-type": "application/json", 2026-10-25T13:30:03.9243851Z 112 │ │ accept: "application/json, text/event-stream", 2026-10-25T13:30:03.9243985Z 113 │ │ authorization: options.authorization, 2026-10-25T13:30:03.9244108Z 114 │ │ ...(connection.sessionId === null 2026-10-25T13:30:03.9244201Z 115 │ │ ? {} 2026-10-25T13:30:03.9244342Z 116 │ │ : { "mcp-session-id": connection.sessionId }), 2026-10-25T13:30:03.9244476Z 117 │ │ ...(connection.protocolVersion === null 2026-10-25T13:30:03.9244566Z 118 │ │ ? {} 2026-10-25T13:30:03.9244729Z 119 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-25T13:30:03.9244813Z 120 │ │ }, 2026-10-25T13:30:03.9244908Z 121 │ │ body, 2026-10-25T13:30:03.9244994Z 122 │ │ }), 2026-10-25T13:30:03.9245094Z 123 │ │ catch: bridgeError, 2026-10-25T13:30:03.9245173Z 124 │ │ }); 2026-10-25T13:30:03.9245382Z 125 │ │ connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId; 2026-10-25T13:30:03.9245481Z 126 │ │ if (!response.ok) { 2026-10-25T13:30:03.9245587Z 127 │ │ yield* Effect.promise( 2026-10-25T13:30:03.9245769Z 128 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-25T13:30:03.9245850Z 129 │ │ ); 2026-10-25T13:30:03.9245960Z 130 │ │ return yield* Effect.fail( 2026-10-25T13:30:03.9246176Z 131 │ │ new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`), 2026-10-25T13:30:03.9246258Z 132 │ │ ); 2026-10-25T13:30:03.9246334Z 133 │ │ } 2026-10-25T13:30:03.9246543Z 134 │ │ const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))]; 2026-10-25T13:30:03.9246661Z 135 │ │ for (const payload of payloads) { 2026-10-25T13:30:03.9246874Z 136 │ │ connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion; 2026-10-25T13:30:03.9246949Z 137 │ │ } 2026-10-25T13:30:03.9247046Z 138 │ │ return payloads; 2026-10-25T13:30:03.9247238Z 139 │ │ }).pipe(Effect.mapError(bridgeError)), 2026-10-25T13:30:03.9247342Z 140 │ │ ); 2026-10-25T13:30:03.9247410Z 141 │ │ 2026-10-25T13:30:03.9247584Z 142 │ │ const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* ( 2026-10-25T13:30:03.9247709Z 143 │ │ request: AcpSchema.DisconnectMcpRequest, 2026-10-25T13:30:03.9247892Z 144 │ │ ): Effect.fn.Return { 2026-10-25T13:30:03.9248050Z 145 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-25T13:30:03.9248176Z 146 │ │ connections.delete(request.connectionId); 2026-10-25T13:30:03.9248295Z 147 │ │ const sessionId = connection.sessionId; 2026-10-25T13:30:03.9248401Z 148 │ │ if (sessionId !== null) { 2026-10-25T13:30:03.9248532Z 149 │ │ const response = yield* Effect.tryPromise({ 2026-10-25T13:30:03.9248628Z 150 │ │ try: (signal) => 2026-10-25T13:30:03.9248756Z 151 │ │ fetchImplementation(options.endpoint, { 2026-10-25T13:30:03.9248855Z 152 │ │ method: "DELETE", 2026-10-25T13:30:03.9248943Z 153 │ │ signal, 2026-10-25T13:30:03.9249036Z 154 │ │ headers: { 2026-10-25T13:30:03.9249166Z 155 │ │ authorization: options.authorization, 2026-10-25T13:30:03.9249283Z 156 │ │ "mcp-session-id": sessionId, 2026-10-25T13:30:03.9249414Z 157 │ │ ...(connection.protocolVersion === null 2026-10-25T13:30:03.9249507Z 158 │ │ ? {} 2026-10-25T13:30:03.9249677Z 159 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-25T13:30:03.9249760Z 160 │ │ }, 2026-10-25T13:30:03.9249840Z 161 │ │ }), 2026-10-25T13:30:03.9249939Z 162 │ │ catch: bridgeError, 2026-10-25T13:30:03.9250015Z 163 │ │ }); 2026-10-25T13:30:03.9250146Z 164 │ │ if (!response.ok && response.status !== 404) { 2026-10-25T13:30:03.9250257Z 165 │ │ return yield* Effect.fail( 2026-10-25T13:30:03.9250363Z 166 │ │ new AcpMcpOverAcpError( 2026-10-25T13:30:03.9250551Z 167 │ │ `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`, 2026-10-25T13:30:03.9250634Z 168 │ │ ), 2026-10-25T13:30:03.9250711Z 169 │ │ ); 2026-10-25T13:30:03.9250785Z 170 │ │ } 2026-10-25T13:30:03.9250886Z 171 │ │ yield* Effect.promise( 2026-10-25T13:30:03.9251066Z 172 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-25T13:30:03.9251141Z 173 │ │ ); 2026-10-25T13:30:03.9251213Z 174 │ │ } 2026-10-25T13:30:03.9251295Z 175 │ │ return {}; 2026-10-25T13:30:03.9251366Z 176 │ │ }); 2026-10-25T13:30:03.9251434Z 177 │ │ 2026-10-25T13:30:03.9251510Z 178 │ │ return { 2026-10-25T13:30:03.9251754Z 179 │ │ connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) { 2026-10-25T13:30:03.9251902Z 180 │ │ if (request.serverId !== "t3-code") { 2026-10-25T13:30:03.9252011Z 181 │ │ return yield* Effect.fail( 2026-10-25T13:30:03.9252195Z 182 │ │ new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`), 2026-10-25T13:30:03.9252271Z 183 │ │ ); 2026-10-25T13:30:03.9252346Z 184 │ │ } 2026-10-25T13:30:03.9252473Z 185 │ │ if (connections.size >= MAX_CONNECTIONS) { 2026-10-25T13:30:03.9252681Z 186 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections.")); 2026-10-25T13:30:03.9252757Z 187 │ │ } 2026-10-25T13:30:03.9252916Z 188 │ │ const connectionId = yield* options.allocateConnectionId; 2026-10-25T13:30:03.9253033Z 189 │ │ connections.set(connectionId, { 2026-10-25T13:30:03.9253180Z 190 │ │ mutex: yield* Semaphore.make(1), 2026-10-25T13:30:03.9253276Z 191 │ │ sessionId: null, 2026-10-25T13:30:03.9253380Z 192 │ │ protocolVersion: null, 2026-10-25T13:30:03.9253478Z 193 │ │ nextRequestId: 0, 2026-10-25T13:30:03.9253554Z 194 │ │ }); 2026-10-25T13:30:03.9253656Z 195 │ │ return { connectionId }; 2026-10-25T13:30:03.9253730Z 196 │ │ }), 2026-10-25T13:30:03.9253905Z 197 │ │ message: Effect.fn("mcpOverAcpBridge.message")(function* (request) { 2026-10-25T13:30:03.9254068Z 198 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-25T13:30:03.9254189Z 199 │ │ const id = ++connection.nextRequestId; 2026-10-25T13:30:03.9254314Z 200 │ │ const payloads = yield* send(connection, { 2026-10-25T13:30:03.9254410Z 201 │ │ jsonrpc: "2.0", 2026-10-25T13:30:03.9254489Z 202 │ │ id, 2026-10-25T13:30:03.9254592Z 203 │ │ method: request.method, 2026-10-25T13:30:03.9254750Z 204 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-25T13:30:03.9254827Z 205 │ │ }); 2026-10-25T13:30:03.9255018Z 206 │ │ const response = payloads.find((payload) => asEnvelope(payload)?.id === id); 2026-10-25T13:30:03.9255142Z 207 │ │ const envelope = asEnvelope(response); 2026-10-25T13:30:03.9255243Z 208 │ │ if (envelope === null) { 2026-10-25T13:30:03.9255351Z 209 │ │ return yield* Effect.fail( 2026-10-25T13:30:03.9255534Z 210 │ │ new AcpMcpOverAcpError("MCP server did not return a matching response."), 2026-10-25T13:30:03.9255612Z 211 │ │ ); 2026-10-25T13:30:03.9255686Z 212 │ │ } 2026-10-25T13:30:03.9255803Z 213 │ │ if (envelope.error !== undefined) { 2026-10-25T13:30:03.9255996Z 214 │ │ return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error))); 2026-10-25T13:30:03.9256069Z 215 │ │ } 2026-10-25T13:30:03.9256307Z 216 │ │ return (envelope.result ?? null) as AcpSchema.MessageMcpResponse; 2026-10-25T13:30:03.9256419Z 217 │ │ }), 2026-10-25T13:30:03.9256611Z 218 │ │ notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) { 2026-10-25T13:30:03.9256769Z 219 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-25T13:30:03.9256873Z 220 │ │ yield* send(connection, { 2026-10-25T13:30:03.9256968Z 221 │ │ jsonrpc: "2.0", 2026-10-25T13:30:03.9257070Z 222 │ │ method: request.method, 2026-10-25T13:30:03.9257226Z 223 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-25T13:30:03.9257303Z 224 │ │ }); 2026-10-25T13:30:03.9257381Z 225 │ │ }), 2026-10-25T13:30:03.9257469Z 226 │ │ disconnect, 2026-10-25T13:30:03.9257575Z 227 │ │ dispose: Effect.suspend(() => 2026-10-25T13:30:03.9257669Z 228 │ │ Effect.forEach( 2026-10-25T13:30:03.9257772Z 229 │ │ [...connections.keys()], 2026-10-25T13:30:03.9257943Z 230 │ │ (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore), 2026-10-25T13:30:03.9258040Z 231 │ │ { discard: true }, 2026-10-25T13:30:03.9258116Z 232 │ │ ), 2026-10-25T13:30:03.9258189Z 233 │ │ ), 2026-10-25T13:30:03.9258260Z 234 │ │ }; 2026-10-25T13:30:03.9258392Z 235 │ ╰─▶ }); 2026-10-25T13:30:03.9258447Z ╰──── 2026-10-25T13:30:03.9258699Z  help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed. 2026-10-25T13:30:03.9258702Z 2026-10-25T13:30:03.9258912Z ⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used. 2026-10-25T13:30:03.9259050Z ╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10] 2026-10-25T13:30:03.9259102Z 21 │ 2026-10-25T13:30:03.9259259Z 22 │ function summarizePayload(payload: unknown): Readonly> { 2026-10-25T13:30:03.9259347Z ·  ────────┬─────── 2026-10-25T13:30:03.9259495Z · ╰── 'summarizePayload' is declared here 2026-10-25T13:30:03.9259606Z 23 │ if (payload === null) return { valueType: "null" }; 2026-10-25T13:30:03.9259661Z ╰──── 2026-10-25T13:30:03.9259763Z  help: Consider removing this declaration. 2026-10-25T13:30:03.9259766Z 2026-10-25T13:30:03.9260238Z ⚠ 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-25T13:30:03.9260396Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1742:7] 2026-10-25T13:30:03.9260487Z 1741 │ yield* harness.replaceSession; 2026-10-25T13:30:03.9260698Z 1742 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T13:30:03.9260850Z 1743 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) { 2026-10-25T13:30:03.9261013Z 1744 │ │ break; 2026-10-25T13:30:03.9261133Z 1745 │ │ } 2026-10-25T13:30:03.9261239Z 1746 │ │ yield* Effect.yieldNow; 2026-10-25T13:30:03.9261370Z 1747 │ ╰─▶ } 2026-10-25T13:30:03.9261442Z 1748 │ yield* Queue.offer( 2026-10-25T13:30:03.9261494Z ╰──── 2026-10-25T13:30:03.9261496Z 2026-10-25T13:30:03.9261960Z ⚠ 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-25T13:30:03.9262115Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1851:7] 2026-10-25T13:30:03.9262206Z 1850 │ yield* harness.replaceSession; 2026-10-25T13:30:03.9262413Z 1851 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T13:30:03.9262572Z 1852 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break; 2026-10-25T13:30:03.9262677Z 1853 │ │ yield* Effect.yieldNow; 2026-10-25T13:30:03.9262808Z 1854 │ ╰─▶ } 2026-10-25T13:30:03.9262935Z 1855 │ expect(yield* Ref.get(harness.subscriptionCount)).toBe(2); 2026-10-25T13:30:03.9262987Z ╰──── 2026-10-25T13:30:03.9262989Z 2026-10-25T13:30:03.9263206Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T13:30:03.9263384Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:584:70] 2026-10-25T13:30:03.9263465Z 583 │ assert.deepStrictEqual( 2026-10-25T13:30:03.9263627Z 584 │ (yield* Ref.get(fixture.syncCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-25T13:30:03.9263749Z ·  ┬ 2026-10-25T13:30:03.9263915Z · ╰── '_' is declared here 2026-10-25T13:30:03.9263975Z 585 │ [ 2026-10-25T13:30:03.9264025Z ╰──── 2026-10-25T13:30:03.9264127Z  help: Consider removing this parameter. 2026-10-25T13:30:03.9264130Z 2026-10-25T13:30:03.9264312Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T13:30:03.9264560Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:1183:70] 2026-10-25T13:30:03.9264748Z 1182 │ assert.deepStrictEqual( 2026-10-25T13:30:03.9264910Z 1183 │ (yield* Ref.get(fixture.linkCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-25T13:30:03.9265032Z ·  ┬ 2026-10-25T13:30:03.9265196Z · ╰── '_' is declared here 2026-10-25T13:30:03.9265257Z 1184 │ [ 2026-10-25T13:30:03.9265308Z ╰──── 2026-10-25T13:30:03.9265408Z  help: Consider removing this parameter. 2026-10-25T13:30:03.9265411Z 2026-10-25T13:30:03.9265562Z ⚠ eslint(no-new): Do not use 'new' for side effects. 2026-10-25T13:30:03.9265687Z ╭─[apps/server/src/mcp/McpToolAccess.test.ts:168:3] 2026-10-25T13:30:03.9265803Z 167 │ // @ts-expect-error a declaration constructed directly 2026-10-25T13:30:03.9265900Z 168 │ new McpToolAccess.Declaration(unchecked); 2026-10-25T13:30:03.9265994Z ·  ───────────────────────────── 2026-10-25T13:30:03.9266119Z 169 │ // @ts-expect-error a handlers layer built outside McpToolAccess 2026-10-25T13:30:03.9266169Z ╰──── 2026-10-25T13:30:03.9266327Z  help: Assign the result of 'new' to a variable or compare it to a reference. 2026-10-25T13:30:03.9266330Z 2026-10-25T13:30:03.9266588Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T13:30:03.9266758Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:81:5] 2026-10-25T13:30:03.9266810Z 78 │ 2026-10-25T13:30:03.9266874Z 79 │ useEffect(() => { 2026-10-25T13:30:03.9266953Z ·  ────┬──── 2026-10-25T13:30:03.9267083Z · ╰── This is the containing effect 2026-10-25T13:30:03.9267207Z 80 │ const { host, code } = parsePairingUrl(connectionPairingUrl); 2026-10-25T13:30:03.9267274Z 81 │ setHostInput(host); 2026-10-25T13:30:03.9267348Z ·  ──────┬───── 2026-10-25T13:30:03.9267514Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.9267580Z 82 │ setCodeInput(code); 2026-10-25T13:30:03.9267632Z ╰──── 2026-10-25T13:30:03.9268242Z  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-25T13:30:03.9268570Z  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-25T13:30:03.9268575Z 2026-10-25T13:30:03.9268831Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T13:30:03.9269003Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:91:5] 2026-10-25T13:30:03.9269058Z 84 │ 2026-10-25T13:30:03.9269124Z 85 │ useEffect(() => { 2026-10-25T13:30:03.9269195Z ·  ────┬──── 2026-10-25T13:30:03.9269327Z · ╰── This is the containing effect 2026-10-25T13:30:03.9269419Z 86 │ if (routePairingUrl.length === 0) { 2026-10-25T13:30:03.9269569Z 87 │ return; 2026-10-25T13:30:03.9269680Z 88 │ } 2026-10-25T13:30:03.9269735Z 89 │ 2026-10-25T13:30:03.9269852Z 90 │ const { host, code } = parsePairingUrl(routePairingUrl); 2026-10-25T13:30:03.9269917Z 91 │ setHostInput(host); 2026-10-25T13:30:03.9269996Z ·  ──────┬───── 2026-10-25T13:30:03.9270170Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.9270238Z 92 │ setCodeInput(code); 2026-10-25T13:30:03.9270288Z ╰──── 2026-10-25T13:30:03.9270888Z  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-25T13:30:03.9271221Z  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-25T13:30:03.9271226Z 2026-10-25T13:30:03.9271486Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T13:30:03.9271656Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:97:7] 2026-10-25T13:30:03.9271706Z 94 │ 2026-10-25T13:30:03.9271771Z 95 │ useEffect(() => { 2026-10-25T13:30:03.9271842Z ·  ────┬──── 2026-10-25T13:30:03.9271972Z · ╰── This is the containing effect 2026-10-25T13:30:03.9272054Z 96 │ if (pairingConnectionError) { 2026-10-25T13:30:03.9272129Z 97 │ setIsSubmitting(false); 2026-10-25T13:30:03.9272217Z ·  ───────┬─────── 2026-10-25T13:30:03.9272391Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.9272445Z 98 │ } 2026-10-25T13:30:03.9272499Z ╰──── 2026-10-25T13:30:03.9273101Z  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-25T13:30:03.9273455Z  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-25T13:30:03.9273458Z 2026-10-25T13:30:03.9273673Z ⚠ eslint(no-unused-vars): Identifier 'openSettings' is imported but never used. 2026-10-25T13:30:03.9273846Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:35:10] 2026-10-25T13:30:03.9273981Z 34 │ import { splitEnvironmentSections } from "./environmentSections"; 2026-10-25T13:30:03.9274108Z 35 │ import { openSettings } from "../settings/settings-navigation"; 2026-10-25T13:30:03.9274191Z ·  ──────┬───── 2026-10-25T13:30:03.9274331Z · ╰── 'openSettings' is imported here 2026-10-25T13:30:03.9274469Z 36 │ import { leaveSettingsPage } from "../settings/settings-navigation"; 2026-10-25T13:30:03.9274523Z ╰──── 2026-10-25T13:30:03.9274627Z  help: Consider removing this import. 2026-10-25T13:30:03.9274629Z 2026-10-25T13:30:03.9274986Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-25T13:30:03.9275157Z ╭─[packages/provider-cursor/src/server/auth.ts:249:20] 2026-10-25T13:30:03.9275221Z 248 │ }, 2026-10-25T13:30:03.9275309Z 249 │ (effect, flow, stopSessions) => 2026-10-25T13:30:03.9275402Z ·  ──────┬───── 2026-10-25T13:30:03.9275559Z · ╰── 'stopSessions' is declared here 2026-10-25T13:30:03.9275671Z 250 │ effect.pipe( 2026-10-25T13:30:03.9275757Z ╰──── 2026-10-25T13:30:03.9275878Z  help: Consider removing this parameter. 2026-10-25T13:30:03.9275881Z 2026-10-25T13:30:03.9276108Z ⚠ eslint(no-unused-vars): Identifier 'Arr' is imported but never used. 2026-10-25T13:30:03.9276325Z ╭─[packages/client-runtime/src/state/threadSort.ts:4:13] 2026-10-25T13:30:03.9276487Z 3 │ import type { EnvironmentThreadShell } from "./models.ts"; 2026-10-25T13:30:03.9276585Z 4 │ import * as Arr from "effect/Array"; 2026-10-25T13:30:03.9276694Z ·  ─┬─ 2026-10-25T13:30:03.9276849Z · ╰── 'Arr' is imported here 2026-10-25T13:30:03.9276981Z 5 │ import * as Order from "effect/Order"; 2026-10-25T13:30:03.9277046Z ╰──── 2026-10-25T13:30:03.9277175Z  help: Consider removing this import. 2026-10-25T13:30:03.9277177Z 2026-10-25T13:30:03.9277405Z ⚠ eslint(no-unused-vars): Identifier 'Order' is imported but never used. 2026-10-25T13:30:03.9277570Z ╭─[packages/client-runtime/src/state/threadSort.ts:5:13] 2026-10-25T13:30:03.9277673Z 4 │ import * as Arr from "effect/Array"; 2026-10-25T13:30:03.9277789Z 5 │ import * as Order from "effect/Order"; 2026-10-25T13:30:03.9277901Z ·  ──┬── 2026-10-25T13:30:03.9278064Z · ╰── 'Order' is imported here 2026-10-25T13:30:03.9278146Z 6 │ 2026-10-25T13:30:03.9278239Z ╰──── 2026-10-25T13:30:03.9278364Z  help: Consider removing this import. 2026-10-25T13:30:03.9278367Z 2026-10-25T13:30:03.9278869Z ⚠ 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-25T13:30:03.9279085Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7] 2026-10-25T13:30:03.9279212Z 565 │ let afterSequence = created[0]!.sequence; 2026-10-25T13:30:03.9279454Z 566 │ ╭─▶ for (let index = 1; index <= 32; index += 1) { 2026-10-25T13:30:03.9279602Z 567 │ │ const nextEvent = { 2026-10-25T13:30:03.9279788Z 568 │ │ id: EventId.make(`event:foundation-stream-race:${index}`), 2026-10-25T13:30:03.9279950Z 569 │ │ type: "thread.metadata-updated" as const, 2026-10-25T13:30:03.9280081Z 570 │ │ threadId, 2026-10-25T13:30:03.9280222Z 571 │ │ providerInstanceId, 2026-10-25T13:30:03.9280354Z 572 │ │ occurredAt: now, 2026-10-25T13:30:03.9280508Z 573 │ │ payload: { ...thread, title: `Race update ${index}` }, 2026-10-25T13:30:03.9280695Z 574 │ │ } satisfies OrchestrationV2DomainEvent; 2026-10-25T13:30:03.9280931Z 575 │ │ const reader = yield* eventSink 2026-10-25T13:30:03.9281128Z 576 │ │ .stream({ threadId, afterSequence }) 2026-10-25T13:30:03.9281286Z 577 │ │ .pipe(Stream.runHead, Effect.forkChild); 2026-10-25T13:30:03.9281420Z 578 │ │ yield* Effect.yieldNow; 2026-10-25T13:30:03.9281627Z 579 │ │ const written = yield* eventSink.write({ events: [nextEvent] }); 2026-10-25T13:30:03.9281788Z 580 │ │ const received = yield* Fiber.join(reader); 2026-10-25T13:30:03.9281934Z 581 │ │ if (Option.isNone(received)) { 2026-10-25T13:30:03.9282142Z 582 │ │ return yield* Effect.die("The event stream ended before delivering the live event."); 2026-10-25T13:30:03.9282284Z 583 │ │ } 2026-10-25T13:30:03.9282475Z 584 │ │ assert.equal(received.value.sequence, written[0]?.sequence); 2026-10-25T13:30:03.9282653Z 585 │ │ assert.equal(received.value.event.id, nextEvent.id); 2026-10-25T13:30:03.9282796Z 586 │ │ afterSequence = received.value.sequence; 2026-10-25T13:30:03.9282966Z 587 │ ╰─▶ } 2026-10-25T13:30:03.9283076Z 588 │ }), 2026-10-25T13:30:03.9283187Z ╰──── 2026-10-25T13:30:03.9283190Z 2026-10-25T13:30:03.9283691Z ⚠ 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-25T13:30:03.9283880Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:2324:9] 2026-10-25T13:30:03.9284021Z 2323 │ let settled = false; 2026-10-25T13:30:03.9284210Z 2324 │ ╭─▶ while (!settled) { 2026-10-25T13:30:03.9284398Z 2325 │ │ settled = (yield* outbox.listByCommandId(commandId)).every( 2026-10-25T13:30:03.9284544Z 2326 │ │ (effect) => effect.status === "succeeded", 2026-10-25T13:30:03.9284671Z 2327 │ │ ); 2026-10-25T13:30:03.9284836Z 2328 │ │ if (!settled) yield* Effect.yieldNow; 2026-10-25T13:30:03.9285001Z 2329 │ ╰─▶ } 2026-10-25T13:30:03.9285132Z 2330 │ }).pipe(Effect.provide(layerWorker), Effect.scoped); 2026-10-25T13:30:03.9285224Z ╰──── 2026-10-25T13:30:03.9285230Z 2026-10-25T13:30:03.9285568Z ⚠ eslint(no-unused-vars): Variable 'legacyCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-25T13:30:03.9285756Z ╭─[packages/provider-cursor/src/server/credentialStore.test.ts:15:7] 2026-10-25T13:30:03.9285837Z 14 │ 2026-10-25T13:30:03.9285929Z 15 │ const legacyCredentials = { 2026-10-25T13:30:03.9286053Z ·  ────────┬──────── 2026-10-25T13:30:03.9286239Z · ╰── 'legacyCredentials' is declared here 2026-10-25T13:30:03.9286337Z 16 │ version: 1 as const, 2026-10-25T13:30:03.9286401Z ╰──── 2026-10-25T13:30:03.9286533Z  help: Consider removing this declaration. 2026-10-25T13:30:03.9286536Z 2026-10-25T13:30:03.9286912Z ⚠ eslint(no-unused-vars): Function 'promptResponseHasMissingXAiStopReason' is declared but never used. 2026-10-25T13:30:03.9287133Z ╭─[packages/provider-grok/src/server/xaiAcpExtension.ts:1558:10] 2026-10-25T13:30:03.9287200Z 1557 │ 2026-10-25T13:30:03.9287443Z 1558 │ function promptResponseHasMissingXAiStopReason(response: EffectAcpSchema.PromptResponse): boolean { 2026-10-25T13:30:03.9287601Z ·  ──────────────────┬────────────────── 2026-10-25T13:30:03.9287843Z · ╰── 'promptResponseHasMissingXAiStopReason' is declared here 2026-10-25T13:30:03.9287956Z 1559 │ const meta = response._meta; 2026-10-25T13:30:03.9288022Z ╰──── 2026-10-25T13:30:03.9288146Z  help: Consider removing this declaration. 2026-10-25T13:30:03.9288149Z 2026-10-25T13:30:03.9288472Z ⚠ eslint(no-unused-vars): Variable 'layerDaemon' is declared but never used. Unused variables should start with a '_'. 2026-10-25T13:30:03.9288647Z ╭─[apps/server/src/orchestration-v2/EffectWorker.ts:920:7] 2026-10-25T13:30:03.9288714Z 919 │ 2026-10-25T13:30:03.9288930Z 920 │ const layerDaemon: Layer.Layer = Layer.effectDiscard( 2026-10-25T13:30:03.9289042Z ·  ─────┬───── 2026-10-25T13:30:03.9289222Z · ╰── 'layerDaemon' is declared here 2026-10-25T13:30:03.9289321Z 921 │ runDaemon.pipe(Effect.forkScoped), 2026-10-25T13:30:03.9289406Z ╰──── 2026-10-25T13:30:03.9289531Z  help: Consider removing this declaration. 2026-10-25T13:30:03.9289533Z 2026-10-25T13:30:03.9289848Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T13:30:03.9289996Z ╭─[packages/provider-grok/src/server/adapter.ts:411:7] 2026-10-25T13:30:03.9290080Z 410 │ 2026-10-25T13:30:03.9290181Z 411 │ const layer: Layer.Layer< 2026-10-25T13:30:03.9290290Z ·  ──┬── 2026-10-25T13:30:03.9290440Z · ╰── 'layer' is declared here 2026-10-25T13:30:03.9290568Z 412 │ ProviderAdapter.ProviderAdapterV2, 2026-10-25T13:30:03.9290650Z ╰──── 2026-10-25T13:30:03.9290781Z  help: Consider removing this declaration. 2026-10-25T13:30:03.9290784Z 2026-10-25T13:30:03.9291215Z ⚠ 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-25T13:30:03.9291493Z ╭─[packages/client-runtime/src/state/boundedThreadSnapshotHttp.test.ts:123:20] 2026-10-25T13:30:03.9291629Z 122 │ const idTableBody = () => { 2026-10-25T13:30:03.9291816Z 123 │ const snapshot = Schema.decodeUnknownSync(BoundedJson)(boundedBody(true)); 2026-10-25T13:30:03.9291960Z ·  ──────────────────────── 2026-10-25T13:30:03.9292120Z 124 │ return Schema.encodeSync(BoundedJson)({ ...snapshot, idTable: true }); 2026-10-25T13:30:03.9292204Z ╰──── 2026-10-25T13:30:03.9292207Z 2026-10-25T13:30:03.9292590Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.encodeSync(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const. 2026-10-25T13:30:03.9292794Z ╭─[packages/client-runtime/src/state/boundedThreadSnapshotHttp.test.ts:124:10] 2026-10-25T13:30:03.9292995Z 123 │ const snapshot = Schema.decodeUnknownSync(BoundedJson)(boundedBody(true)); 2026-10-25T13:30:03.9293189Z 124 │ return Schema.encodeSync(BoundedJson)({ ...snapshot, idTable: true }); 2026-10-25T13:30:03.9293308Z ·  ───────────────── 2026-10-25T13:30:03.9293399Z 125 │ }; 2026-10-25T13:30:03.9293490Z ╰──── 2026-10-25T13:30:03.9293493Z 2026-10-25T13:30:03.9293697Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T13:30:03.9293866Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:121:27] 2026-10-25T13:30:03.9294062Z 120 │ const scope = makeScope(options.capabilities ?? new Set(["preview", "worktree"])); 2026-10-25T13:30:03.9294171Z 121 │ const dispatch = vi.fn((_: unknown) => 2026-10-25T13:30:03.9294289Z ·  ┬ 2026-10-25T13:30:03.9294456Z · ╰── '_' is declared here 2026-10-25T13:30:03.9294603Z 122 │ (options.dispatchGate ?? Effect.void).pipe( 2026-10-25T13:30:03.9294687Z ╰──── 2026-10-25T13:30:03.9294795Z  help: Consider removing this parameter. 2026-10-25T13:30:03.9294798Z 2026-10-25T13:30:03.9295034Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T13:30:03.9295203Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:134:39] 2026-10-25T13:30:03.9295287Z 133 │ ); 2026-10-25T13:30:03.9295403Z 134 │ const listLocalBranchNames = vi.fn((_: string) => 2026-10-25T13:30:03.9295539Z ·  ┬ 2026-10-25T13:30:03.9295714Z · ╰── '_' is declared here 2026-10-25T13:30:03.9295817Z 135 │ Effect.succeed( 2026-10-25T13:30:03.9295881Z ╰──── 2026-10-25T13:30:03.9296009Z  help: Consider removing this parameter. 2026-10-25T13:30:03.9296014Z 2026-10-25T13:30:03.9296245Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T13:30:03.9296410Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:178:31] 2026-10-25T13:30:03.9296494Z 177 │ }); 2026-10-25T13:30:03.9296605Z 178 │ const sendToThread = vi.fn((_: unknown) => { 2026-10-25T13:30:03.9296727Z ·  ┬ 2026-10-25T13:30:03.9296903Z · ╰── '_' is declared here 2026-10-25T13:30:03.9297036Z 179 │ switch (options.continuation ?? "queued") { 2026-10-25T13:30:03.9297100Z ╰──── 2026-10-25T13:30:03.9297221Z  help: Consider removing this parameter. 2026-10-25T13:30:03.9297224Z 2026-10-25T13:30:03.9297543Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T13:30:03.9297752Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:203:33] 2026-10-25T13:30:03.9297819Z 202 │ ); 2026-10-25T13:30:03.9297947Z 203 │ const removeWorktree = vi.fn((_: unknown) => 2026-10-25T13:30:03.9298078Z ·  ┬ 2026-10-25T13:30:03.9298249Z · ╰── '_' is declared here 2026-10-25T13:30:03.9298343Z 204 │ options.removeWorktreeFails 2026-10-25T13:30:03.9298423Z ╰──── 2026-10-25T13:30:03.9298553Z  help: Consider removing this parameter. 2026-10-25T13:30:03.9298556Z 2026-10-25T13:30:03.9298786Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T13:30:03.9298936Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:208:36] 2026-10-25T13:30:03.9299030Z 207 │ ); 2026-10-25T13:30:03.9299165Z 208 │ const deleteLocalBranch = vi.fn((_: unknown) => 2026-10-25T13:30:03.9299299Z ·  ┬ 2026-10-25T13:30:03.9299457Z · ╰── '_' is declared here 2026-10-25T13:30:03.9299575Z 209 │ options.deleteLocalBranchFails 2026-10-25T13:30:03.9299660Z ╰──── 2026-10-25T13:30:03.9299786Z  help: Consider removing this parameter. 2026-10-25T13:30:03.9299789Z 2026-10-25T13:30:03.9300020Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T13:30:03.9300169Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:213:42] 2026-10-25T13:30:03.9300258Z 212 │ ); 2026-10-25T13:30:03.9300415Z 213 │ const fetchWorktreeBaseCommit = vi.fn((_: unknown) => 2026-10-25T13:30:03.9300553Z ·  ┬ 2026-10-25T13:30:03.9300719Z · ╰── '_' is declared here 2026-10-25T13:30:03.9300838Z 214 │ options.fetchWorktreeBaseFails 2026-10-25T13:30:03.9300927Z ╰──── 2026-10-25T13:30:03.9301054Z  help: Consider removing this parameter. 2026-10-25T13:30:03.9301057Z 2026-10-25T13:30:03.9301261Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T13:30:03.9301432Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:254:30] 2026-10-25T13:30:03.9301522Z 253 │ ); 2026-10-25T13:30:03.9301646Z 254 │ const localStatus = vi.fn((_: unknown) => 2026-10-25T13:30:03.9301747Z ·  ┬ 2026-10-25T13:30:03.9301941Z · ╰── '_' is declared here 2026-10-25T13:30:03.9302047Z 255 │ Effect.succeed({ 2026-10-25T13:30:03.9302134Z ╰──── 2026-10-25T13:30:03.9302249Z  help: Consider removing this parameter. 2026-10-25T13:30:03.9302252Z 2026-10-25T13:30:03.9302469Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T13:30:03.9302638Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:264:32] 2026-10-25T13:30:03.9302727Z 263 │ ); 2026-10-25T13:30:03.9302889Z 264 │ const refreshStatus = vi.fn((_: string) => Effect.die("refreshStatus stub")); 2026-10-25T13:30:03.9303003Z ·  ┬ 2026-10-25T13:30:03.9303305Z · ╰── '_' is declared here 2026-10-25T13:30:03.9303524Z 265 │ const runForThread = vi.fn((input: { readonly worktreePath: string }) => { 2026-10-25T13:30:03.9303609Z ╰──── 2026-10-25T13:30:03.9303723Z  help: Consider removing this parameter. 2026-10-25T13:30:03.9303726Z 2026-10-25T13:30:03.9303967Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-25T13:30:03.9304140Z ╭─[packages/client-runtime/src/state/filesystem.ts:3:8] 2026-10-25T13:30:03.9304242Z 2 │ AuthFilesystemReadScope, 2026-10-25T13:30:03.9304327Z 3 │ type AuthSessionState, 2026-10-25T13:30:03.9304437Z ·  ────────┬─────── 2026-10-25T13:30:03.9304699Z · ╰── 'AuthSessionState' is imported here 2026-10-25T13:30:03.9304815Z 4 │ type FilesystemBrowseEntry, 2026-10-25T13:30:03.9304885Z ╰──── 2026-10-25T13:30:03.9305015Z  help: Consider removing this import. 2026-10-25T13:30:03.9305018Z 2026-10-25T13:30:03.9305253Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-25T13:30:03.9305471Z ╭─[apps/server/src/orchestration-v2/ThreadTitleRegenerationService.ts:95:5] 2026-10-25T13:30:03.9305567Z 92 │ let title: string | undefined; 2026-10-25T13:30:03.9305734Z 93 │ let history: Array = []; 2026-10-25T13:30:03.9305838Z ·  ───┬─── 2026-10-25T13:30:03.9306016Z · ╰── From this accumulator 2026-10-25T13:30:03.9306118Z 94 │ let forkedFrom = thread.forkedFrom; 2026-10-25T13:30:03.9306238Z 95 │ while (forkedFrom?.type === "run") { 2026-10-25T13:30:03.9306354Z ·  ──┬── 2026-10-25T13:30:03.9306504Z · ╰── For this loop 2026-10-25T13:30:03.9306690Z 96 │ const source = yield* messagesThroughRun(forkedFrom.threadId, forkedFrom.runId); 2026-10-25T13:30:03.9306822Z 97 │ history = [...source.messages, ...history]; 2026-10-25T13:30:03.9306971Z ·  ─────┬──── 2026-10-25T13:30:03.9307138Z · ╰── From this spread 2026-10-25T13:30:03.9307270Z 98 │ title ??= source.thread.title; 2026-10-25T13:30:03.9307336Z ╰──── 2026-10-25T13:30:03.9307539Z  help: Consider using `Array.prototype.push()` to mutate the accumulator instead. 2026-10-25T13:30:03.9307730Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-25T13:30:03.9307733Z 2026-10-25T13:30:03.9308067Z ⚠ eslint(no-unused-vars): Variable 'revokeActiveMcpThread' is declared but never used. Unused variables should start with a '_'. 2026-10-25T13:30:03.9308218Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:216:7] 2026-10-25T13:30:03.9308304Z 215 │ 2026-10-25T13:30:03.9308489Z 216 │ const revokeActiveMcpThread = (threadId: ThreadId): Effect.Effect => 2026-10-25T13:30:03.9308605Z ·  ──────────┬────────── 2026-10-25T13:30:03.9308788Z · ╰── 'revokeActiveMcpThread' is declared here 2026-10-25T13:30:03.9309017Z 217 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeThread(threadId) : Effect.void; 2026-10-25T13:30:03.9309104Z ╰──── 2026-10-25T13:30:03.9309238Z  help: Consider removing this declaration. 2026-10-25T13:30:03.9309242Z 2026-10-25T13:30:03.9309689Z ⚠ eslint(no-unused-vars): Variable 'revokeAllActiveMcpCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-25T13:30:03.9309884Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:219:7] 2026-10-25T13:30:03.9309971Z 218 │ 2026-10-25T13:30:03.9310136Z 219 │ const revokeAllActiveMcpCredentials = (): Effect.Effect => 2026-10-25T13:30:03.9310263Z ·  ──────────────┬────────────── 2026-10-25T13:30:03.9310488Z · ╰── 'revokeAllActiveMcpCredentials' is declared here 2026-10-25T13:30:03.9310693Z 220 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void; 2026-10-25T13:30:03.9310776Z ╰──── 2026-10-25T13:30:03.9310909Z  help: Consider removing this declaration. 2026-10-25T13:30:03.9310912Z 2026-10-25T13:30:03.9311202Z ⚠ eslint(no-unused-vars): Variable 'layerUnavailable' is declared but never used. Unused variables should start with a '_'. 2026-10-25T13:30:03.9311410Z ╭─[apps/server/src/orchestration-v2/Orchestrator.ts:12559:7] 2026-10-25T13:30:03.9311496Z 12558 │ 2026-10-25T13:30:03.9311665Z 12559 │ const layerUnavailable: Layer.Layer = Layer.succeed( 2026-10-25T13:30:03.9311768Z ·  ────────┬─────── 2026-10-25T13:30:03.9311957Z · ╰── 'layerUnavailable' is declared here 2026-10-25T13:30:03.9312064Z 12560 │ OrchestratorV2, 2026-10-25T13:30:03.9312151Z ╰──── 2026-10-25T13:30:03.9312268Z  help: Consider removing this declaration. 2026-10-25T13:30:03.9312289Z 2026-10-25T13:30:03.9312444Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.9312656Z ╭─[apps/mobile/src/features/home/thread-swipe-actions.tsx:509:27] 2026-10-25T13:30:03.9312749Z 508 │ > 2026-10-25T13:30:03.9312859Z 509 │ {props.children(close)} 2026-10-25T13:30:03.9312962Z ·  ──┬── 2026-10-25T13:30:03.9317223Z · ╰── Cannot access ref value during render 2026-10-25T13:30:03.9317317Z 510 │ 2026-10-25T13:30:03.9317369Z ╰──── 2026-10-25T13:30:03.9317848Z  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-25T13:30:03.9318154Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.9318162Z 2026-10-25T13:30:03.9318372Z ⚠ eslint(no-unused-vars): Identifier 'HostProcess' is imported but never used. 2026-10-25T13:30:03.9318538Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:25:13] 2026-10-25T13:30:03.9318627Z 24 │ import * as Schema from "effect/Schema"; 2026-10-25T13:30:03.9318744Z 25 │ import * as HostProcess from "@t3tools/shared/HostProcess"; 2026-10-25T13:30:03.9318828Z ·  ─────┬───── 2026-10-25T13:30:03.9318969Z · ╰── 'HostProcess' is imported here 2026-10-25T13:30:03.9319022Z 26 │ 2026-10-25T13:30:03.9319075Z ╰──── 2026-10-25T13:30:03.9319171Z  help: Consider removing this import. 2026-10-25T13:30:03.9319286Z 2026-10-25T13:30:03.9319598Z ⚠ eslint(no-unused-vars): Variable 'serverConfig' is declared but never used. Unused variables should start with a '_'. 2026-10-25T13:30:03.9319764Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:124:11] 2026-10-25T13:30:03.9319847Z 123 │ const path = yield* Path.Path; 2026-10-25T13:30:03.9319964Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-25T13:30:03.9320045Z ·  ──────┬───── 2026-10-25T13:30:03.9320187Z · ╰── 'serverConfig' is declared here 2026-10-25T13:30:03.9320330Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-25T13:30:03.9320383Z ╰──── 2026-10-25T13:30:03.9320484Z  help: Consider removing this declaration. 2026-10-25T13:30:03.9320494Z 2026-10-25T13:30:03.9320773Z ⚠ eslint(no-unused-vars): Variable 'serverSettings' is declared but never used. Unused variables should start with a '_'. 2026-10-25T13:30:03.9320937Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:125:11] 2026-10-25T13:30:03.9321051Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-25T13:30:03.9321186Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-25T13:30:03.9321272Z ·  ───────┬────── 2026-10-25T13:30:03.9321418Z · ╰── 'serverSettings' is declared here 2026-10-25T13:30:03.9321553Z 126 │ const gitWorkflow = yield* GitWorkflowService.GitWorkflowService; 2026-10-25T13:30:03.9321603Z ╰──── 2026-10-25T13:30:03.9321714Z  help: Consider removing this declaration. 2026-10-25T13:30:03.9321720Z 2026-10-25T13:30:03.9321947Z ⚠ eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used. 2026-10-25T13:30:03.9322074Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:14:8] 2026-10-25T13:30:03.9322145Z 13 │ threadSearchMatchKey, 2026-10-25T13:30:03.9322230Z 14 │ type EnvironmentThreadSearchMatch, 2026-10-25T13:30:03.9322335Z ·  ──────────────┬───────────── 2026-10-25T13:30:03.9322511Z · ╰── 'EnvironmentThreadSearchMatch' is imported here 2026-10-25T13:30:03.9322618Z 15 │ } from "@t3tools/client-runtime/state/thread-search"; 2026-10-25T13:30:03.9322668Z ╰──── 2026-10-25T13:30:03.9322766Z  help: Consider removing this import. 2026-10-25T13:30:03.9322769Z 2026-10-25T13:30:03.9323048Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T13:30:03.9323249Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:491:25] 2026-10-25T13:30:03.9323460Z 490 │ // snoozeWakeTick re-arms clamped timers even when the wake date exceeds 32-bit setTimeout and stays unchanged. 2026-10-25T13:30:03.9323553Z 491 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-25T13:30:03.9323654Z ·  ───────┬────── 2026-10-25T13:30:03.9323820Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-25T13:30:03.9323993Z 492 │ // Called as `props.onSelectThread(...)`, the compiler would cache this handler on the whole 2026-10-25T13:30:03.9324044Z ╰──── 2026-10-25T13:30:03.9324343Z  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-25T13:30:03.9324665Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9324668Z 2026-10-25T13:30:03.9324865Z ⚠ eslint(no-unused-vars): Type 'EnvironmentId' is imported but never used. 2026-10-25T13:30:03.9325001Z ╭─[packages/client-runtime/src/state/sharedSettings.ts:2:3] 2026-10-25T13:30:03.9325067Z 1 │ import type { 2026-10-25T13:30:03.9325132Z 2 │ EnvironmentId, 2026-10-25T13:30:03.9325206Z ·  ──────┬────── 2026-10-25T13:30:03.9325344Z · ╰── 'EnvironmentId' is imported here 2026-10-25T13:30:03.9325430Z 3 │ ExecutionEnvironmentCapabilities, 2026-10-25T13:30:03.9325481Z ╰──── 2026-10-25T13:30:03.9325582Z  help: Consider removing this import. 2026-10-25T13:30:03.9325591Z 2026-10-25T13:30:03.9325785Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but only used as a type. 2026-10-25T13:30:03.9325923Z ╭─[packages/contracts/src/orchestrationV2IdTable.ts:86:36] 2026-10-25T13:30:03.9326058Z 85 │ // tree. The input is parsed JSON and the inner codec validates it anyway. 2026-10-25T13:30:03.9326194Z 86 │ const ParsedJson = Schema.declare((_: unknown): _ is unknown => true, { 2026-10-25T13:30:03.9326287Z ·  ┬ 2026-10-25T13:30:03.9326426Z · ╰── '_' is declared here 2026-10-25T13:30:03.9326502Z 87 │ toCodecJson: () => undefined, 2026-10-25T13:30:03.9326553Z ╰──── 2026-10-25T13:30:03.9326659Z  help: Consider removing this parameter. 2026-10-25T13:30:03.9326664Z 2026-10-25T13:30:03.9327138Z ⚠ 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-25T13:30:03.9327286Z ╭─[apps/server/src/background/HostPowerMonitor.test.ts:133:11] 2026-10-25T13:30:03.9327416Z 132 │ const monitor = yield* HostPowerMonitor.HostPowerMonitor; 2026-10-25T13:30:03.9327560Z 133 │ ╭─▶ for ( 2026-10-25T13:30:03.9327663Z 134 │ │ let attempt = 0; 2026-10-25T13:30:03.9327833Z 135 │ │ attempt < 100 && (yield* monitor.snapshot).onBattery !== "true"; 2026-10-25T13:30:03.9328009Z 136 │ │ attempt += 1 2026-10-25T13:30:03.9328123Z 137 │ │ ) { 2026-10-25T13:30:03.9328237Z 138 │ │ yield* Effect.yieldNow; 2026-10-25T13:30:03.9328375Z 139 │ ╰─▶ } 2026-10-25T13:30:03.9328497Z 140 │ expect((yield* monitor.snapshot).onBattery).toBe("true"); 2026-10-25T13:30:03.9328546Z ╰──── 2026-10-25T13:30:03.9328550Z 2026-10-25T13:30:03.9328894Z ⚠ 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-25T13:30:03.9329039Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:50:18] 2026-10-25T13:30:03.9329204Z 49 │ for (const tool of ["sendMessage", "followupTask", "interruptAgent", "listAgents"]) { 2026-10-25T13:30:03.9329377Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-25T13:30:03.9329461Z ·  ───────── 2026-10-25T13:30:03.9329639Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-25T13:30:03.9329691Z ╰──── 2026-10-25T13:30:03.9329693Z 2026-10-25T13:30:03.9330025Z ⚠ 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-25T13:30:03.9330166Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:51:18] 2026-10-25T13:30:03.9330334Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-25T13:30:03.9330515Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-25T13:30:03.9330602Z ·  ───────── 2026-10-25T13:30:03.9330654Z 52 │ } 2026-10-25T13:30:03.9330704Z ╰──── 2026-10-25T13:30:03.9330707Z 2026-10-25T13:30:03.9331036Z ⚠ 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-25T13:30:03.9331176Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:55:5] 2026-10-25T13:30:03.9331240Z 54 │ assert.equal( 2026-10-25T13:30:03.9331410Z 55 │ Schema.is(CodexSchema.ServerNotification__CollabAgentToolCallStatus)("interrupted"), 2026-10-25T13:30:03.9331483Z ·  ───────── 2026-10-25T13:30:03.9331541Z 56 │ true, 2026-10-25T13:30:03.9331591Z ╰──── 2026-10-25T13:30:03.9331594Z 2026-10-25T13:30:03.9331926Z ⚠ 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-25T13:30:03.9332068Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:59:5] 2026-10-25T13:30:03.9332132Z 58 │ assert.equal( 2026-10-25T13:30:03.9332312Z 59 │ Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentToolCallStatus)("interrupted"), 2026-10-25T13:30:03.9332382Z ·  ───────── 2026-10-25T13:30:03.9332439Z 60 │ true, 2026-10-25T13:30:03.9332490Z ╰──── 2026-10-25T13:30:03.9332492Z 2026-10-25T13:30:03.9332826Z ⚠ 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-25T13:30:03.9333041Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:103:16] 2026-10-25T13:30:03.9333136Z 102 │ 2026-10-25T13:30:03.9333339Z 103 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse)(resumeResponse), true); 2026-10-25T13:30:03.9333425Z ·  ───────── 2026-10-25T13:30:03.9333478Z 104 │ }); 2026-10-25T13:30:03.9333530Z ╰──── 2026-10-25T13:30:03.9333533Z 2026-10-25T13:30:03.9333901Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownEffect(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const. 2026-10-25T13:30:03.9334018Z ╭─[packages/effect-acp/src/client.ts:1270:11] 2026-10-25T13:30:03.9334165Z 1269 │ extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) => 2026-10-25T13:30:03.9334340Z 1270 │ Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe( 2026-10-25T13:30:03.9334450Z ·  ────────────────────────── 2026-10-25T13:30:03.9334595Z 1271 │ Effect.mapError(() => AcpError.AcpRequestError.invalidParams()), 2026-10-25T13:30:03.9334646Z ╰──── 2026-10-25T13:30:03.9334649Z 2026-10-25T13:30:03.9334828Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-25T13:30:03.9335016Z ╭─[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:122:34] 2026-10-25T13:30:03.9335085Z 121 │ return [...commands]; 2026-10-25T13:30:03.9335216Z 122 │ }, [activeThreadRef, pathname, registrationVersion, navigation]); 2026-10-25T13:30:03.9335329Z ·  ─────────┬───────── 2026-10-25T13:30:03.9335522Z · ╰── Unnecessary dependency `registrationVersion` 2026-10-25T13:30:03.9335578Z 123 │ 2026-10-25T13:30:03.9335628Z ╰──── 2026-10-25T13:30:03.9335943Z  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-25T13:30:03.9336259Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9336262Z 2026-10-25T13:30:03.9336730Z ⚠ 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-25T13:30:03.9336887Z ╭─[apps/server/src/project/ProjectEnrichmentService.test.ts:28:3] 2026-10-25T13:30:03.9336949Z 27 │ ) { 2026-10-25T13:30:03.9337154Z 28 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T13:30:03.9337299Z 29 │ │ const available = yield* service.peek(workspaceRoot); 2026-10-25T13:30:03.9337424Z 30 │ │ if (predicate(available)) return available; 2026-10-25T13:30:03.9337524Z 31 │ │ yield* Effect.yieldNow; 2026-10-25T13:30:03.9337645Z 32 │ ╰─▶ } 2026-10-25T13:30:03.9337822Z 33 │ return yield* Effect.die(`Project metadata for ${workspaceRoot} was not resolved in time.`); 2026-10-25T13:30:03.9337872Z ╰──── 2026-10-25T13:30:03.9337875Z 2026-10-25T13:30:03.9338408Z ⚠ 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-25T13:30:03.9338578Z ╭─[apps/server/src/project/ProjectService.test.ts:94:3] 2026-10-25T13:30:03.9338632Z 93 │ ) { 2026-10-25T13:30:03.9338831Z 94 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T13:30:03.9339003Z 95 │ │ const project = Option.getOrThrow(yield* service.getById(projectId)); 2026-10-25T13:30:03.9339123Z 96 │ │ if (predicate(project)) return project; 2026-10-25T13:30:03.9339220Z 97 │ │ yield* Effect.yieldNow; 2026-10-25T13:30:03.9339342Z 98 │ ╰─▶ } 2026-10-25T13:30:03.9339494Z 99 │ return yield* Effect.die(`Project ${projectId} was not enriched in time.`); 2026-10-25T13:30:03.9339547Z ╰──── 2026-10-25T13:30:03.9339549Z 2026-10-25T13:30:03.9339880Z ⚠ 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-25T13:30:03.9339996Z ╭─[packages/effect-acp/src/schema.test.ts:18:12] 2026-10-25T13:30:03.9340154Z 17 │ const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } }; 2026-10-25T13:30:03.9340275Z 18 │ expect(Schema.is(V1.AvailableCommand)(command)).toBe(true); 2026-10-25T13:30:03.9340352Z ·  ───────── 2026-10-25T13:30:03.9340412Z 19 │ expect( 2026-10-25T13:30:03.9340463Z ╰──── 2026-10-25T13:30:03.9340465Z 2026-10-25T13:30:03.9340800Z ⚠ 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-25T13:30:03.9340918Z ╭─[packages/effect-acp/src/schema.test.ts:20:7] 2026-10-25T13:30:03.9340975Z 19 │ expect( 2026-10-25T13:30:03.9341141Z 20 │ Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }), 2026-10-25T13:30:03.9341213Z ·  ───────── 2026-10-25T13:30:03.9341276Z 21 │ ).toBe(true); 2026-10-25T13:30:03.9341326Z ╰──── 2026-10-25T13:30:03.9341328Z 2026-10-25T13:30:03.9341785Z ⚠ 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-25T13:30:03.9341914Z ╭─[packages/effect-acp/src/protocol.test.ts:500:31] 2026-10-25T13:30:03.9341969Z 499 │ 2026-10-25T13:30:03.9342081Z 500 │ const response = yield* Schema.decodeUnknownEffect( 2026-10-25T13:30:03.9342200Z ·  ────────────────────────── 2026-10-25T13:30:03.9342305Z 501 │ Schema.fromJsonString(JsonRpcErrorResponse), 2026-10-25T13:30:03.9342356Z ╰──── 2026-10-25T13:30:03.9342359Z 2026-10-25T13:30:03.9342616Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T13:30:03.9342801Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:107:5] 2026-10-25T13:30:03.9342853Z 104 │ 2026-10-25T13:30:03.9342918Z 105 │ useEffect(() => { 2026-10-25T13:30:03.9342988Z ·  ────┬──── 2026-10-25T13:30:03.9343223Z · ╰── This is the containing effect 2026-10-25T13:30:03.9343337Z 106 │ clearReviewCommentTarget(); 2026-10-25T13:30:03.9343434Z 107 │ setPendingNativeCommentSelection(null); 2026-10-25T13:30:03.9343539Z ·  ────────────────┬─────────────── 2026-10-25T13:30:03.9343715Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.9343787Z 108 │ }, [selectedSection?.id]); 2026-10-25T13:30:03.9343838Z ╰──── 2026-10-25T13:30:03.9344443Z  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-25T13:30:03.9345005Z  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-25T13:30:03.9345011Z 2026-10-25T13:30:03.9345269Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T13:30:03.9345456Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7] 2026-10-25T13:30:03.9345508Z 109 │ 2026-10-25T13:30:03.9345570Z 110 │ useEffect(() => { 2026-10-25T13:30:03.9345641Z ·  ────┬──── 2026-10-25T13:30:03.9345770Z · ╰── This is the containing effect 2026-10-25T13:30:03.9345856Z 111 │ if (activeCommentTarget === null) { 2026-10-25T13:30:03.9345955Z 112 │ setPendingNativeCommentSelection(null); 2026-10-25T13:30:03.9346066Z ·  ────────────────┬─────────────── 2026-10-25T13:30:03.9346247Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.9346303Z 113 │ } 2026-10-25T13:30:03.9346352Z ╰──── 2026-10-25T13:30:03.9346949Z  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-25T13:30:03.9347271Z  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-25T13:30:03.9347274Z 2026-10-25T13:30:03.9347562Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T13:30:03.9347792Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7] 2026-10-25T13:30:03.9347887Z 107 │ setPendingNativeCommentSelection(null); 2026-10-25T13:30:03.9347959Z 108 │ }, [selectedSection?.id]); 2026-10-25T13:30:03.9348046Z ·  ─────────┬───────── 2026-10-25T13:30:03.9348208Z · ╰── Unnecessary dependency `selectedSection?.id` 2026-10-25T13:30:03.9348259Z 109 │ 2026-10-25T13:30:03.9348310Z ╰──── 2026-10-25T13:30:03.9348604Z  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-25T13:30:03.9348922Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9348929Z 2026-10-25T13:30:03.9349392Z ⚠ 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-25T13:30:03.9349565Z ╭─[apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts:222:5] 2026-10-25T13:30:03.9349637Z 221 │ let idlePasses = 0; 2026-10-25T13:30:03.9349783Z 222 │ ╭─▶ for (;;) { 2026-10-25T13:30:03.9349921Z 223 │ │ yield* Effect.promise(() => Promise.resolve()); 2026-10-25T13:30:03.9350069Z 224 │ │ const pending = backgroundRuntime.pending.shift(); 2026-10-25T13:30:03.9350168Z 225 │ │ if (!pending) { 2026-10-25T13:30:03.9350261Z 226 │ │ idlePasses++; 2026-10-25T13:30:03.9350367Z 227 │ │ if (idlePasses >= 3) { 2026-10-25T13:30:03.9350451Z 228 │ │ return; 2026-10-25T13:30:03.9350528Z 229 │ │ } 2026-10-25T13:30:03.9350613Z 230 │ │ continue; 2026-10-25T13:30:03.9350689Z 231 │ │ } 2026-10-25T13:30:03.9350779Z 232 │ │ idlePasses = 0; 2026-10-25T13:30:03.9350895Z 233 │ │ const exit = yield* Effect.exit( 2026-10-25T13:30:03.9351106Z 234 │ │ pending.operation as Effect.Effect, 2026-10-25T13:30:03.9351190Z 235 │ │ ); 2026-10-25T13:30:03.9351299Z 236 │ │ yield* Effect.sync(() => { 2026-10-25T13:30:03.9351402Z 237 │ │ pending.resolve(exit); 2026-10-25T13:30:03.9351479Z 238 │ │ }); 2026-10-25T13:30:03.9351610Z 239 │ ╰─▶ } 2026-10-25T13:30:03.9351666Z 240 │ }, 2026-10-25T13:30:03.9351717Z ╰──── 2026-10-25T13:30:03.9351720Z 2026-10-25T13:30:03.9352181Z ⚠ 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-25T13:30:03.9352302Z ╭─[packages/effect-acp/src/errors.test.ts:129:28] 2026-10-25T13:30:03.9352472Z 128 │ const secret = "acp-summary-secret"; 2026-10-25T13:30:03.9352619Z 129 │ const cause = yield* Schema.decodeUnknownEffect( 2026-10-25T13:30:03.9352736Z ·  ────────────────────────── 2026-10-25T13:30:03.9352804Z 130 │ Schema.Struct({ 2026-10-25T13:30:03.9352853Z ╰──── 2026-10-25T13:30:03.9352855Z 2026-10-25T13:30:03.9353049Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T13:30:03.9353232Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:223:31] 2026-10-25T13:30:03.9353336Z 222 │ ? snippetTokens.map((line, lineIndex) => ( 2026-10-25T13:30:03.9353428Z 223 │ 2026-10-25T13:30:03.9353534Z ·  ─────────────── 2026-10-25T13:30:03.9353631Z 224 │ {lineIndex > 0 ? "\n" : ""} 2026-10-25T13:30:03.9353687Z ╰──── 2026-10-25T13:30:03.9353832Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-25T13:30:03.9353836Z 2026-10-25T13:30:03.9354028Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T13:30:03.9354177Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25] 2026-10-25T13:30:03.9354252Z 226 │ (null); 2026-10-25T13:30:03.9359414Z 494 │ const showcasedReviewDrawRef = useRef(null); 2026-10-25T13:30:03.9359549Z 495 │ const [isPullRefreshing, setIsPullRefreshing] = useState(false); 2026-10-25T13:30:03.9359643Z 496 │ const handlePullToRefresh = async () => { 2026-10-25T13:30:03.9359718Z 497 │ setIsPullRefreshing(true); 2026-10-25T13:30:03.9359799Z 498 │ await refreshSelectedSection(); 2026-10-25T13:30:03.9359874Z 499 │ setIsPullRefreshing(false); 2026-10-25T13:30:03.9359927Z 500 │ }; 2026-10-25T13:30:03.9360067Z 501 │ const reviewFileNavigatorRef = useRef(null); 2026-10-25T13:30:03.9360208Z 502 │ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : []; 2026-10-25T13:30:03.9360313Z 503 │ const fileVisibility = useReviewFileVisibility({ 2026-10-25T13:30:03.9360397Z 504 │ threadKey: reviewCache.threadKey, 2026-10-25T13:30:03.9360484Z 505 │ sectionId: selectedSection?.id ?? null, 2026-10-25T13:30:03.9360551Z 506 │ files: reviewFiles, 2026-10-25T13:30:03.9360653Z 507 │ cachedExpandedFileIds: selectedSection?.id 2026-10-25T13:30:03.9360784Z 508 │ ? reviewCache.expandedFileIdsBySection[selectedSection.id] 2026-10-25T13:30:03.9360845Z 509 │ : undefined, 2026-10-25T13:30:03.9360938Z 510 │ cachedViewedFileIds: selectedSection?.id 2026-10-25T13:30:03.9361058Z 511 │ ? reviewCache.viewedFileIdsBySection[selectedSection.id] 2026-10-25T13:30:03.9361119Z 512 │ : undefined, 2026-10-25T13:30:03.9361171Z 513 │ }); 2026-10-25T13:30:03.9361359Z 514 │ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility; 2026-10-25T13:30:03.9361486Z 515 │ const commentSelection = useReviewCommentSelectionController({ 2026-10-25T13:30:03.9361547Z 516 │ environmentId, 2026-10-25T13:30:03.9361607Z 517 │ threadId, 2026-10-25T13:30:03.9361673Z 518 │ selectedSection, 2026-10-25T13:30:03.9361743Z 519 │ nativeReviewDiffData, 2026-10-25T13:30:03.9361875Z 520 │ }); 2026-10-25T13:30:03.9362015Z 521 │ const nativeBridge = useNativeReviewDiffBridge({ 2026-10-25T13:30:03.9362099Z 522 │ threadKey: reviewCache.threadKey, 2026-10-25T13:30:03.9362186Z 523 │ sectionId: selectedSection?.id ?? null, 2026-10-25T13:30:03.9362260Z 524 │ diff: selectedSection?.diff, 2026-10-25T13:30:03.9362334Z 525 │ data: nativeReviewDiffData, 2026-10-25T13:30:03.9362400Z 526 │ collapsedFileIds, 2026-10-25T13:30:03.9362461Z 527 │ viewedFileIds, 2026-10-25T13:30:03.9362567Z 528 │ selectedRowIds: commentSelection.selectedRowIds, 2026-10-25T13:30:03.9362663Z 529 │ canHighlight: parsedDiff.kind === "files", 2026-10-25T13:30:03.9362716Z 530 │ }); 2026-10-25T13:30:03.9362788Z 531 │ const showcaseReviewKey = 2026-10-25T13:30:03.9362917Z 532 │ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection 2026-10-25T13:30:03.9363128Z 533 │ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}` 2026-10-25T13:30:03.9363229Z 534 │ : null; 2026-10-25T13:30:03.9363394Z 535 │ const handleNativeDebug = (event: NativeSyntheticEvent>) => { 2026-10-25T13:30:03.9363469Z 536 │ nativeBridge.onDebug(event); 2026-10-25T13:30:03.9363525Z 537 │ if ( 2026-10-25T13:30:03.9363603Z 538 │ showcaseReviewKey === null || 2026-10-25T13:30:03.9363723Z 539 │ showcasedReviewDrawRef.current === showcaseReviewKey || 2026-10-25T13:30:03.9363830Z 540 │ !isNativeReviewDiffDrawEvent(event.nativeEvent) 2026-10-25T13:30:03.9363886Z 541 │ ) { 2026-10-25T13:30:03.9363945Z 542 │ return; 2026-10-25T13:30:03.9363999Z 543 │ } 2026-10-25T13:30:03.9364107Z 544 │ showcasedReviewDrawRef.current = showcaseReviewKey; 2026-10-25T13:30:03.9364272Z 545 │ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId }); 2026-10-25T13:30:03.9364328Z 546 │ }; 2026-10-25T13:30:03.9364379Z 547 │ 2026-10-25T13:30:03.9364493Z 548 │ const handleSelectFile = async (fileId: string | null) => { 2026-10-25T13:30:03.9364572Z 549 │ loadVisibleFile(fileId, true); 2026-10-25T13:30:03.9364660Z 550 │ commentSelection.clearSelection(); 2026-10-25T13:30:03.9364778Z 551 │ if (fileId !== null && collapsedFileIds.includes(fileId)) { 2026-10-25T13:30:03.9364854Z 552 │ toggleExpandedFile(fileId); 2026-10-25T13:30:03.9364907Z 553 │ } 2026-10-25T13:30:03.9365017Z 554 │ const nativeView = nativeReviewDiffViewRef.current; 2026-10-25T13:30:03.9365086Z 555 │ if (!nativeView) return; 2026-10-25T13:30:03.9365178Z 556 │ const result = await settlePromise(() => 2026-10-25T13:30:03.9365356Z 557 │ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true), 2026-10-25T13:30:03.9365413Z 558 │ ); 2026-10-25T13:30:03.9365498Z 559 │ if (AsyncResult.isFailure(result)) { 2026-10-25T13:30:03.9365675Z 560 │ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result)); 2026-10-25T13:30:03.9365729Z 561 │ } 2026-10-25T13:30:03.9365780Z 562 │ }; 2026-10-25T13:30:03.9365861Z 563 │ const handleVisibleFileChange = ( 2026-10-25T13:30:03.9365992Z 564 │ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>, 2026-10-25T13:30:03.9366047Z 565 │ ) => { 2026-10-25T13:30:03.9366154Z 566 │ loadVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-25T13:30:03.9366319Z 567 │ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-25T13:30:03.9366375Z 568 │ }; 2026-10-25T13:30:03.9366529Z 569 │ const renderInspector = () => ( 2026-10-25T13:30:03.9366637Z 570 │ void handleSelectFile(fileId)} 2026-10-25T13:30:03.9367138Z 576 │ /> 2026-10-25T13:30:03.9367191Z 577 │ ); 2026-10-25T13:30:03.9367242Z 578 │ 2026-10-25T13:30:03.9367424Z 579 │ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => { 2026-10-25T13:30:03.9367511Z 580 │ const { fileId } = event.nativeEvent; 2026-10-25T13:30:03.9367573Z 581 │ if (fileId) { 2026-10-25T13:30:03.9367660Z 582 │ loadVisibleFile(fileId, true); 2026-10-25T13:30:03.9367740Z 583 │ toggleExpandedFile(fileId); 2026-10-25T13:30:03.9367792Z 584 │ } 2026-10-25T13:30:03.9367844Z 585 │ }; 2026-10-25T13:30:03.9367893Z 586 │ 2026-10-25T13:30:03.9367981Z 587 │ const handleNativeToggleViewedFile = ( 2026-10-25T13:30:03.9368097Z 588 │ event: NativeSyntheticEvent<{ readonly fileId?: string }>, 2026-10-25T13:30:03.9368152Z 589 │ ) => { 2026-10-25T13:30:03.9368235Z 590 │ const { fileId } = event.nativeEvent; 2026-10-25T13:30:03.9368296Z 591 │ if (fileId) { 2026-10-25T13:30:03.9368370Z 592 │ toggleViewedFile(fileId); 2026-10-25T13:30:03.9368423Z 593 │ } 2026-10-25T13:30:03.9368474Z 594 │ }; 2026-10-25T13:30:03.9368525Z 595 │ 2026-10-25T13:30:03.9368594Z 596 │ const parsedDiffNotice = 2026-10-25T13:30:03.9368761Z 597 │ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null; 2026-10-25T13:30:03.9368882Z 598 │ const hasCachedSelectedDiff = selectedSection?.diff != null; 2026-10-25T13:30:03.9369037Z 599 │ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null); 2026-10-25T13:30:03.9369155Z 600 │ const sectionMenu = buildReviewSectionMenu(reviewSections); 2026-10-25T13:30:03.9369312Z 601 │ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({ 2026-10-25T13:30:03.9369419Z 602 │ hasEnvironmentPresentation: environment.isReady, 2026-10-25T13:30:03.9369519Z 603 │ isEnvironmentConnected: isEnvironmentReady, 2026-10-25T13:30:03.9369590Z 604 │ hasCachedSelectedDiff, 2026-10-25T13:30:03.9369655Z 605 │ hasAnyCachedDiff, 2026-10-25T13:30:03.9369707Z 606 │ }); 2026-10-25T13:30:03.9369794Z 607 │ const handleRetryEnvironment = () => { 2026-10-25T13:30:03.9369885Z 608 │ void retryEnvironment(environmentId); 2026-10-25T13:30:03.9369940Z 609 │ }; 2026-10-25T13:30:03.9370023Z 610 │ const handleReturnToThread = () => { 2026-10-25T13:30:03.9370100Z 611 │ if (navigation.canGoBack()) { 2026-10-25T13:30:03.9370169Z 612 │ navigation.goBack(); 2026-10-25T13:30:03.9370228Z 613 │ return; 2026-10-25T13:30:03.9370281Z 614 │ } 2026-10-25T13:30:03.9370345Z 615 │ selectDetail({ 2026-10-25T13:30:03.9370408Z 616 │ name: "Thread", 2026-10-25T13:30:03.9370558Z 617 │ params: { environmentId: String(environmentId), threadId: String(threadId) }, 2026-10-25T13:30:03.9370613Z 618 │ }); 2026-10-25T13:30:03.9370666Z 619 │ }; 2026-10-25T13:30:03.9370742Z 620 │ const androidHeaderSubtitle = [ 2026-10-25T13:30:03.9370811Z 621 │ selectedSection?.title, 2026-10-25T13:30:03.9370889Z 622 │ headerDiffSummary.additions, 2026-10-25T13:30:03.9371048Z 623 │ headerDiffSummary.deletions, 2026-10-25T13:30:03.9371132Z 624 │ ] 2026-10-25T13:30:03.9371235Z 625 │ .filter((part): part is string => Boolean(part)) 2026-10-25T13:30:03.9371297Z 626 │ .join(" · "); 2026-10-25T13:30:03.9371348Z 627 │ 2026-10-25T13:30:03.9371423Z 628 │ const showChangedFilesPane = 2026-10-25T13:30:03.9371494Z 629 │ !showConnectionNotice && 2026-10-25T13:30:03.9371568Z 630 │ selectedSection !== null && 2026-10-25T13:30:03.9371645Z 631 │ parsedDiff.kind === "files" && 2026-10-25T13:30:03.9371722Z 632 │ NativeReviewDiffView !== null; 2026-10-25T13:30:03.9371892Z 633 │ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined); 2026-10-25T13:30:03.9372062Z 634 │ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane; 2026-10-25T13:30:03.9372112Z 635 │ 2026-10-25T13:30:03.9372189Z 636 │ const listHeader = (() => { 2026-10-25T13:30:03.9372276Z 637 │ const children: ReactElement[] = []; 2026-10-25T13:30:03.9372327Z 638 │ 2026-10-25T13:30:03.9372388Z 639 │ if (error) { 2026-10-25T13:30:03.9372452Z 640 │ children.push( 2026-10-25T13:30:03.9372510Z 641 │ 2026-10-25T13:30:03.9373182Z 648 │ Review unavailable 2026-10-25T13:30:03.9373343Z 649 │ {error} 2026-10-25T13:30:03.9373407Z 650 │ , 2026-10-25T13:30:03.9373462Z 651 │ ); 2026-10-25T13:30:03.9373513Z 652 │ } 2026-10-25T13:30:03.9373566Z 653 │ 2026-10-25T13:30:03.9373638Z 654 │ if (parsedDiffNotice) { 2026-10-25T13:30:03.9373793Z 655 │ children.push(); 2026-10-25T13:30:03.9373846Z 656 │ } 2026-10-25T13:30:03.9373896Z 657 │ 2026-10-25T13:30:03.9373972Z 658 │ if (children.length === 0) { 2026-10-25T13:30:03.9374032Z 659 │ return null; 2026-10-25T13:30:03.9374084Z 660 │ } 2026-10-25T13:30:03.9374134Z 661 │ 2026-10-25T13:30:03.9374202Z 662 │ return <>{children}; 2026-10-25T13:30:03.9374255Z 663 │ })(); 2026-10-25T13:30:03.9374323Z 664 │ const headerSubtitle = [ 2026-10-25T13:30:03.9374475Z 665 │ headerDiffSummary.additions, 2026-10-25T13:30:03.9374591Z 666 │ headerDiffSummary.deletions, 2026-10-25T13:30:03.9374669Z 667 │ pendingReviewCommentCount > 0 2026-10-25T13:30:03.9374842Z 668 │ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}` 2026-10-25T13:30:03.9374902Z 669 │ : null, 2026-10-25T13:30:03.9374954Z 670 │ ] 2026-10-25T13:30:03.9375015Z 671 │ .filter(Boolean) 2026-10-25T13:30:03.9375077Z 672 │ .join(" · "); 2026-10-25T13:30:03.9375209Z 673 │ const headerTitleText = selectedSection?.title ?? "Review changes"; 2026-10-25T13:30:03.9375258Z 674 │ 2026-10-25T13:30:03.9375317Z 675 │ return ( 2026-10-25T13:30:03.9375371Z 676 │ <> 2026-10-25T13:30:03.9375434Z 677 │ 2026-10-25T13:30:03.9376741Z 693 │ 2026-10-25T13:30:03.9376805Z 694 │ 2026-10-25T13:30:03.9376924Z 695 │ 2026-10-25T13:30:03.9377003Z 696 │ {showConnectionNotice ? ( 2026-10-25T13:30:03.9377140Z 697 │ 2026-10-25T13:30:03.9377228Z 698 │ 2026-10-25T13:30:03.9378222Z 710 │ 2026-10-25T13:30:03.9378377Z 711 │ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? ( 2026-10-25T13:30:03.9378437Z 712 │ 2026-10-25T13:30:03.9378976Z 718 │ 2026-10-25T13:30:03.9379327Z 722 │ {listHeader} 2026-10-25T13:30:03.9379448Z 723 │ 2026-10-25T13:30:03.9379529Z 724 │ { 2026-10-25T13:30:03.9382105Z ·  ────┬──── 2026-10-25T13:30:03.9382234Z · ╰── This is the containing effect 2026-10-25T13:30:03.9382322Z 121 │ if (orientationSettled) return; 2026-10-25T13:30:03.9382438Z 122 │ const orientation = getNativeShowcaseOrientation(); 2026-10-25T13:30:03.9382512Z 123 │ if (orientation === null) { 2026-10-25T13:30:03.9382590Z 124 │ setOrientationSettled(true); 2026-10-25T13:30:03.9382680Z ·  ──────────┬────────── 2026-10-25T13:30:03.9382852Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.9382913Z 125 │ return; 2026-10-25T13:30:03.9382963Z ╰──── 2026-10-25T13:30:03.9383666Z  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-25T13:30:03.9384035Z  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-25T13:30:03.9384037Z 2026-10-25T13:30:03.9384295Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T13:30:03.9384463Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:299:7] 2026-10-25T13:30:03.9384514Z 287 │ 2026-10-25T13:30:03.9384649Z 288 │ useEffect(() => { 2026-10-25T13:30:03.9384721Z ·  ────┬──── 2026-10-25T13:30:03.9384849Z · ╰── This is the containing effect 2026-10-25T13:30:03.9384905Z 289 │ if ( 2026-10-25T13:30:03.9384971Z 290 │ scene === null || 2026-10-25T13:30:03.9385051Z 291 │ requestedScene === null || 2026-10-25T13:30:03.9385131Z 292 │ scene !== requestedScene || 2026-10-25T13:30:03.9385193Z 293 │ !hasFixture || 2026-10-25T13:30:03.9385264Z 294 │ !orientationSettled || 2026-10-25T13:30:03.9385331Z 295 │ !themeApplied || 2026-10-25T13:30:03.9385446Z 296 │ (scene === "agent-activity" && !agentActivityStaged) || 2026-10-25T13:30:03.9385576Z 297 │ !isShowcaseNativeContentReady({ scene, themeId, renderSignal }) 2026-10-25T13:30:03.9385631Z 298 │ ) { 2026-10-25T13:30:03.9385700Z 299 │ setReadyScene(null); 2026-10-25T13:30:03.9385777Z ·  ──────┬────── 2026-10-25T13:30:03.9385946Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.9386006Z 300 │ return; 2026-10-25T13:30:03.9386056Z ╰──── 2026-10-25T13:30:03.9386662Z  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-25T13:30:03.9386984Z  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-25T13:30:03.9386988Z 2026-10-25T13:30:03.9387256Z ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'. 2026-10-25T13:30:03.9387426Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:129:9] 2026-10-25T13:30:03.9387495Z 128 │ let cancelled = false; 2026-10-25T13:30:03.9387588Z 129 │ let lastOutcome: string | null = null; 2026-10-25T13:30:03.9387666Z ·  ─────┬───── 2026-10-25T13:30:03.9387802Z · ╰── 'lastOutcome' is declared here 2026-10-25T13:30:03.9387979Z 130 │ void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), { 2026-10-25T13:30:03.9388030Z ╰──── 2026-10-25T13:30:03.9388134Z  help: Consider removing this declaration. 2026-10-25T13:30:03.9388137Z 2026-10-25T13:30:03.9388395Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T13:30:03.9388567Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:60:5] 2026-10-25T13:30:03.9388620Z 50 │ 2026-10-25T13:30:03.9388682Z 51 │ useEffect(() => { 2026-10-25T13:30:03.9388841Z ·  ────┬──── 2026-10-25T13:30:03.9389016Z · ╰── This is the containing effect 2026-10-25T13:30:03.9389108Z 52 │ traceDiffHighlight("viewport-reset", { 2026-10-25T13:30:03.9389199Z 53 │ reset: diffHighlightTraceId(resetKey), 2026-10-25T13:30:03.9389259Z 54 │ enabled, 2026-10-25T13:30:03.9389325Z 55 │ rows: rows.length, 2026-10-25T13:30:03.9389380Z 56 │ }); 2026-10-25T13:30:03.9389468Z 57 │ const previousRange = scheduler.reset(); 2026-10-25T13:30:03.9389564Z 58 │ highlightedRowIdsRef.current = new Set(); 2026-10-25T13:30:03.9389645Z 59 │ pendingPatchesRef.current = []; 2026-10-25T13:30:03.9389750Z 60 │ setViewport({ scope: viewportScope, range: null }); 2026-10-25T13:30:03.9389822Z ·  ─────┬───── 2026-10-25T13:30:03.9389996Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.9390111Z 61 │ setTokensPatchJson(createEmptyTokenPatch(resetKey)); 2026-10-25T13:30:03.9390163Z ╰──── 2026-10-25T13:30:03.9390761Z  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-25T13:30:03.9391082Z  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-25T13:30:03.9391084Z 2026-10-25T13:30:03.9391348Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T13:30:03.9391500Z ╭─[apps/mobile/src/features/threads/use-worktree-setup.ts:30:40] 2026-10-25T13:30:03.9391659Z 28 │ const snapshot = resolveWorktreeSetupSnapshot(input.threadId, query.data, live); 2026-10-25T13:30:03.9391722Z 29 │ useEffect(() => { 2026-10-25T13:30:03.9391792Z ·  ────┬──── 2026-10-25T13:30:03.9391920Z · ╰── This is the containing effect 2026-10-25T13:30:03.9392042Z 30 │ if (snapshot && snapshot !== live) setHeld({ key, snapshot }); 2026-10-25T13:30:03.9392144Z ·  ───┬─── 2026-10-25T13:30:03.9392336Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.9392407Z 31 │ }, [key, live, snapshot]); 2026-10-25T13:30:03.9392459Z ╰──── 2026-10-25T13:30:03.9393063Z  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-25T13:30:03.9393430Z  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-25T13:30:03.9393433Z 2026-10-25T13:30:03.9393689Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T13:30:03.9393821Z ╭─[packages/provider-pi/src/server/adapter.ts:3337:7] 2026-10-25T13:30:03.9393876Z 3336 │ 2026-10-25T13:30:03.9394136Z 3337 │ const layer: Layer.Layer = 2026-10-25T13:30:03.9394242Z ·  ──┬── 2026-10-25T13:30:03.9394367Z · ╰── 'layer' is declared here 2026-10-25T13:30:03.9394432Z 3338 │ Layer.effect( 2026-10-25T13:30:03.9394482Z ╰──── 2026-10-25T13:30:03.9394586Z  help: Consider removing this declaration. 2026-10-25T13:30:03.9394588Z 2026-10-25T13:30:03.9395057Z ⚠ 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-25T13:30:03.9395213Z ╭─[packages/client-runtime/src/connection/supervisor.test.ts:135:3] 2026-10-25T13:30:03.9395331Z 134 │ let lastState = yield* SubscriptionRef.get(state); 2026-10-25T13:30:03.9395548Z 135 │ ╭─▶ for (let iteration = 0; iteration < 100; iteration += 1) { 2026-10-25T13:30:03.9395684Z 136 │ │ lastState = yield* SubscriptionRef.get(state); 2026-10-25T13:30:03.9395789Z 137 │ │ if (predicate(lastState)) { 2026-10-25T13:30:03.9395887Z 138 │ │ return lastState; 2026-10-25T13:30:03.9395959Z 139 │ │ } 2026-10-25T13:30:03.9396060Z 140 │ │ yield* Effect.yieldNow; 2026-10-25T13:30:03.9396184Z 141 │ ╰─▶ } 2026-10-25T13:30:03.9396257Z 142 │ return yield* Effect.die( 2026-10-25T13:30:03.9396308Z ╰──── 2026-10-25T13:30:03.9396310Z 2026-10-25T13:30:03.9396582Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-25T13:30:03.9396702Z ╭─[apps/server/src/usage/UsageService.ts:162:7] 2026-10-25T13:30:03.9396754Z 161 │ 2026-10-25T13:30:03.9396830Z 162 │ const layerTest = Layer.succeed( 2026-10-25T13:30:03.9396904Z ·  ────┬──── 2026-10-25T13:30:03.9397037Z · ╰── 'layerTest' is declared here 2026-10-25T13:30:03.9397100Z 163 │ UsageService, 2026-10-25T13:30:03.9397150Z ╰──── 2026-10-25T13:30:03.9397252Z  help: Consider removing this declaration. 2026-10-25T13:30:03.9397254Z 2026-10-25T13:30:03.9397467Z ⚠ eslint(no-unused-vars): Identifier 'serverEnvironment' is imported but never used. 2026-10-25T13:30:03.9397598Z ╭─[apps/web/src/components/LegacySidebar.tsx:211:40] 2026-10-25T13:30:03.9397753Z 210 │ import { useClientSettings, updateClientSettings } from "~/hooks/useSettings"; 2026-10-25T13:30:03.9397916Z 211 │ import { primaryServerKeybindingsAtom, serverEnvironment } from "../state/server"; 2026-10-25T13:30:03.9398034Z ·  ────────┬──────── 2026-10-25T13:30:03.9398206Z · ╰── 'serverEnvironment' is imported here 2026-10-25T13:30:03.9398314Z 212 │ import { appAtomRegistry } from "../rpc/atomRegistry"; 2026-10-25T13:30:03.9398364Z ╰──── 2026-10-25T13:30:03.9398461Z  help: Consider removing this import. 2026-10-25T13:30:03.9398464Z 2026-10-25T13:30:03.9399010Z ⚠ 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-25T13:30:03.9399171Z ╭─[apps/server/src/usage/UsageService.test.ts:2613:7] 2026-10-25T13:30:03.9399267Z 2612 │ let orphanedAt: number | undefined; 2026-10-25T13:30:03.9399498Z 2613 │ ╭─▶ for (let interruptAt = 1; interruptAt <= 31; interruptAt += 1) { 2026-10-25T13:30:03.9399619Z 2614 │ │ const tasks: Array<() => void> = []; 2026-10-25T13:30:03.9399767Z 2615 │ │ const dispatcher: Scheduler.SchedulerDispatcher = { 2026-10-25T13:30:03.9399896Z 2616 │ │ scheduleTask: (task) => tasks.push(task), 2026-10-25T13:30:03.9399996Z 2617 │ │ flush: () => { 2026-10-25T13:30:03.9400126Z 2618 │ │ let task: (() => void) | undefined; 2026-10-25T13:30:03.9400275Z 2619 │ │ while ((task = tasks.shift()) !== undefined) task(); 2026-10-25T13:30:03.9400355Z 2620 │ │ }, 2026-10-25T13:30:03.9400436Z 2621 │ │ }; 2026-10-25T13:30:03.9400507Z 2622 │ │ 2026-10-25T13:30:03.9400666Z 2623 │ │ let requestFiber: Fiber.Fiber | undefined; 2026-10-25T13:30:03.9400770Z 2624 │ │ let requestChecks = 0; 2026-10-25T13:30:03.9400899Z 2625 │ │ const scheduler: Scheduler.Scheduler = { 2026-10-25T13:30:03.9401008Z 2626 │ │ executionMode: "async", 2026-10-25T13:30:03.9401134Z 2627 │ │ makeDispatcher: () => dispatcher, 2026-10-25T13:30:03.9401246Z 2628 │ │ shouldYield: (fiber) => { 2026-10-25T13:30:03.9401380Z 2629 │ │ if (fiber !== requestFiber) return false; 2026-10-25T13:30:03.9401487Z 2630 │ │ requestChecks += 1; 2026-10-25T13:30:03.9401629Z 2631 │ │ if (requestChecks !== interruptAt) return false; 2026-10-25T13:30:03.9401743Z 2632 │ │ fiber.interruptUnsafe(); 2026-10-25T13:30:03.9401839Z 2633 │ │ return true; 2026-10-25T13:30:03.9401920Z 2634 │ │ }, 2026-10-25T13:30:03.9402000Z 2635 │ │ }; 2026-10-25T13:30:03.9402069Z 2636 │ │ 2026-10-25T13:30:03.9402191Z 2637 │ │ const input: UsageSummaryInput = { 2026-10-25T13:30:03.9402355Z 2638 │ │ ...WINDOW, 2026-10-25T13:30:03.9402520Z 2639 │ │ sinceDay: UsageDay.make("2026-09-01"), 2026-10-25T13:30:03.9402714Z 2640 │ │ untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`), 2026-10-25T13:30:03.9402794Z 2641 │ │ }; 2026-10-25T13:30:03.9402905Z 2642 │ │ const first = yield* service 2026-10-25T13:30:03.9403011Z 2643 │ │ .readSummary(input) 2026-10-25T13:30:03.9403097Z 2644 │ │ .pipe( 2026-10-25T13:30:03.9403228Z 2645 │ │ Effect.exit, 2026-10-25T13:30:03.9403387Z 2646 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-25T13:30:03.9403496Z 2647 │ │ Effect.forkChild, 2026-10-25T13:30:03.9403578Z 2648 │ │ ); 2026-10-25T13:30:03.9403680Z 2649 │ │ requestFiber = first; 2026-10-25T13:30:03.9403786Z 2650 │ │ yield* Effect.yieldNow; 2026-10-25T13:30:03.9403889Z 2651 │ │ dispatcher.flush(); 2026-10-25T13:30:03.9403956Z 2652 │ │ 2026-10-25T13:30:03.9404106Z 2653 │ │ const second = yield* service.readSummary(input).pipe( 2026-10-25T13:30:03.9404202Z 2654 │ │ Effect.match({ 2026-10-25T13:30:03.9404326Z 2655 │ │ onFailure: (error) => error.reason, 2026-10-25T13:30:03.9404449Z 2656 │ │ onSuccess: () => "success" as const, 2026-10-25T13:30:03.9404539Z 2657 │ │ }), 2026-10-25T13:30:03.9404696Z 2658 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-25T13:30:03.9404797Z 2659 │ │ Effect.forkChild, 2026-10-25T13:30:03.9404875Z 2660 │ │ ); 2026-10-25T13:30:03.9404980Z 2661 │ │ yield* Effect.yieldNow; 2026-10-25T13:30:03.9405079Z 2662 │ │ dispatcher.flush(); 2026-10-25T13:30:03.9405204Z 2663 │ │ const secondExit = second.pollUnsafe(); 2026-10-25T13:30:03.9405318Z 2664 │ │ if (secondExit === undefined) { 2026-10-25T13:30:03.9405431Z 2665 │ │ second.interruptUnsafe(); 2026-10-25T13:30:03.9405541Z 2666 │ │ orphanedAt = interruptAt; 2026-10-25T13:30:03.9405634Z 2667 │ │ break; 2026-10-25T13:30:03.9405715Z 2668 │ │ } 2026-10-25T13:30:03.9405831Z 2669 │ │ if (Exit.isFailure(secondExit)) { 2026-10-25T13:30:03.9405987Z 2670 │ │ assert.fail("the matching request fiber was interrupted"); 2026-10-25T13:30:03.9406065Z 2671 │ │ } 2026-10-25T13:30:03.9406215Z 2672 │ │ assert.strictEqual(secondExit.value, "invalidWindow"); 2026-10-25T13:30:03.9406347Z 2673 │ ╰─▶ } 2026-10-25T13:30:03.9406401Z 2674 │ 2026-10-25T13:30:03.9406453Z ╰──── 2026-10-25T13:30:03.9406456Z 2026-10-25T13:30:03.9406734Z ⚠ typescript(no-extraneous-class): Unexpected class with only a constructor. 2026-10-25T13:30:03.9406892Z ╭─[apps/desktop/src/preview/Manager.test.ts:150:18] 2026-10-25T13:30:03.9406992Z 149 │ BrowserWindow: browserWindowConstructor, 2026-10-25T13:30:03.9407149Z 150 │ ╭─▶ ClipboardItem: class { 2026-10-25T13:30:03.9407275Z 151 │ │ constructor(data: Record) { 2026-10-25T13:30:03.9407389Z 152 │ │ clipboardItemConstructor(data); 2026-10-25T13:30:03.9407463Z 153 │ │ } 2026-10-25T13:30:03.9407586Z 154 │ ╰─▶ }, 2026-10-25T13:30:03.9407651Z 155 │ clipboard: { 2026-10-25T13:30:03.9407700Z ╰──── 2026-10-25T13:30:03.9407866Z  help: Try replacing this class with a standalone function or deleting it entirely 2026-10-25T13:30:03.9407875Z 2026-10-25T13:30:03.9408058Z ⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`. 2026-10-25T13:30:03.9408178Z ╭─[apps/web/src/terminal/ghostty/core.ts:186:19] 2026-10-25T13:30:03.9408297Z 185 │ const count = Math.min(CHUNK_SIZE, graphemeLength - start); 2026-10-25T13:30:03.9408387Z 186 │ const codes = new Array(count); 2026-10-25T13:30:03.9408494Z ·  ──────────────────────── 2026-10-25T13:30:03.9408599Z 187 │ for (let index = 0; index < count; index += 1) { 2026-10-25T13:30:03.9408649Z ╰──── 2026-10-25T13:30:03.9409073Z  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-25T13:30:03.9409076Z 2026-10-25T13:30:03.9409343Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T13:30:03.9409520Z ╭─[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:60:5] 2026-10-25T13:30:03.9409573Z 58 │ 2026-10-25T13:30:03.9409635Z 59 │ useEffect(() => { 2026-10-25T13:30:03.9409706Z ·  ────┬──── 2026-10-25T13:30:03.9409833Z · ╰── This is the containing effect 2026-10-25T13:30:03.9409912Z 60 │ setMountedModes((current) => { 2026-10-25T13:30:03.9409990Z ·  ───────┬─────── 2026-10-25T13:30:03.9410159Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.9410240Z 61 │ if (current.has(props.mode)) { 2026-10-25T13:30:03.9410297Z ╰──── 2026-10-25T13:30:03.9410900Z  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-25T13:30:03.9411226Z  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-25T13:30:03.9411228Z 2026-10-25T13:30:03.9411437Z ⚠ eslint(no-unused-vars): Function 'nonEmptyString' is declared but never used. 2026-10-25T13:30:03.9411585Z ╭─[packages/client-runtime/src/work-log/presentation.ts:237:10] 2026-10-25T13:30:03.9411637Z 236 │ 2026-10-25T13:30:03.9411822Z 237 │ function nonEmptyString(value: unknown): string | null { 2026-10-25T13:30:03.9411942Z ·  ───────┬────── 2026-10-25T13:30:03.9412087Z · ╰── 'nonEmptyString' is declared here 2026-10-25T13:30:03.9412227Z 238 │ return typeof value === "string" && value.trim().length > 0 ? value : null; 2026-10-25T13:30:03.9412277Z ╰──── 2026-10-25T13:30:03.9412379Z  help: Consider removing this declaration. 2026-10-25T13:30:03.9412381Z 2026-10-25T13:30:03.9412594Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T13:30:03.9412737Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:767:7] 2026-10-25T13:30:03.9412836Z 766 │ if (settingsSheetPresentation.isActive) { 2026-10-25T13:30:03.9412971Z 767 │ settingsRoutePresentation.present(settingsRouteSession); 2026-10-25T13:30:03.9413069Z ·  ────────────┬──────────── 2026-10-25T13:30:03.9413274Z · ╰── Missing dependency `settingsRoutePresentation` 2026-10-25T13:30:03.9413328Z 768 │ } 2026-10-25T13:30:03.9413530Z 769 │ }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]); 2026-10-25T13:30:03.9413635Z ·  ────────────────┬──────────────── 2026-10-25T13:30:03.9413917Z · ╰── Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead 2026-10-25T13:30:03.9413968Z 770 │ 2026-10-25T13:30:03.9414018Z ╰──── 2026-10-25T13:30:03.9414448Z  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-25T13:30:03.9414764Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9414767Z 2026-10-25T13:30:03.9414920Z ⚠ react(immutability): This value cannot be modified 2026-10-25T13:30:03.9415061Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:388:5] 2026-10-25T13:30:03.9415219Z 384 │ typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0; 2026-10-25T13:30:03.9415352Z 385 │ const animatedBorderRadius = useSharedValue(targetBorderRadius); 2026-10-25T13:30:03.9415443Z ·  ──────────┬───────── 2026-10-25T13:30:03.9415602Z · ╰── `animatedBorderRadius` originates here 2026-10-25T13:30:03.9415762Z 386 │ const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android"; 2026-10-25T13:30:03.9415832Z 387 │ useLayoutEffect(() => { 2026-10-25T13:30:03.9415931Z 388 │ animatedBorderRadius.value = shouldAnimate 2026-10-25T13:30:03.9416016Z ·  ──────────┬───────── 2026-10-25T13:30:03.9416172Z · ╰── `animatedBorderRadius` cannot be modified 2026-10-25T13:30:03.9416260Z 389 │ ? withTiming(targetBorderRadius, { 2026-10-25T13:30:03.9416311Z ╰──── 2026-10-25T13:30:03.9416572Z  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-25T13:30:03.9416948Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T13:30:03.9416986Z 2026-10-25T13:30:03.9417205Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-25T13:30:03.9417331Z ╭─[scripts/lib/cli-external-packages.test.ts:104:11] 2026-10-25T13:30:03.9417400Z 103 │ const declared = { 2026-10-25T13:30:03.9417489Z 104 │ ...(manifest.dependencies ?? {}), 2026-10-25T13:30:03.9417599Z ·  ──────────────────────────────── 2026-10-25T13:30:03.9417701Z 105 │ ...(manifest.optionalDependencies ?? {}), 2026-10-25T13:30:03.9417750Z ╰──── 2026-10-25T13:30:03.9418015Z  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-25T13:30:03.9418017Z 2026-10-25T13:30:03.9418240Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-25T13:30:03.9418368Z ╭─[scripts/lib/cli-external-packages.test.ts:105:11] 2026-10-25T13:30:03.9418456Z 104 │ ...(manifest.dependencies ?? {}), 2026-10-25T13:30:03.9418556Z 105 │ ...(manifest.optionalDependencies ?? {}), 2026-10-25T13:30:03.9418676Z ·  ──────────────────────────────────────── 2026-10-25T13:30:03.9418771Z 106 │ ...(manifest.peerDependencies ?? {}), 2026-10-25T13:30:03.9418822Z ╰──── 2026-10-25T13:30:03.9419083Z  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-25T13:30:03.9419086Z 2026-10-25T13:30:03.9419307Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-25T13:30:03.9419432Z ╭─[scripts/lib/cli-external-packages.test.ts:106:11] 2026-10-25T13:30:03.9419533Z 105 │ ...(manifest.optionalDependencies ?? {}), 2026-10-25T13:30:03.9419625Z 106 │ ...(manifest.peerDependencies ?? {}), 2026-10-25T13:30:03.9419739Z ·  ──────────────────────────────────── 2026-10-25T13:30:03.9419798Z 107 │ }; 2026-10-25T13:30:03.9419848Z ╰──── 2026-10-25T13:30:03.9420107Z  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-25T13:30:03.9420109Z 2026-10-25T13:30:03.9420264Z ⚠ react(immutability): This value cannot be modified 2026-10-25T13:30:03.9420419Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:90:5] 2026-10-25T13:30:03.9420478Z 79 │ 2026-10-25T13:30:03.9420572Z 80 │ const cardCoverage = props.cardCoverage; 2026-10-25T13:30:03.9420651Z ·  ──────┬───── 2026-10-25T13:30:03.9420788Z · ╰── `cardCoverage` originates here 2026-10-25T13:30:03.9420867Z 81 │ const barHeightRef = useRef(0); 2026-10-25T13:30:03.9420943Z 82 │ const cardHeightRef = useRef(0); 2026-10-25T13:30:03.9421027Z 83 │ const cardHeight = useSharedValue(0); 2026-10-25T13:30:03.9421115Z 84 │ const notifyCoverage = useCallback(() => { 2026-10-25T13:30:03.9421181Z 85 │ if (!cardCoverage) { 2026-10-25T13:30:03.9421239Z 86 │ return; 2026-10-25T13:30:03.9421293Z 87 │ } 2026-10-25T13:30:03.9421458Z 88 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-25T13:30:03.9421637Z 89 │ // feed inset and floating controls trailing it. 2026-10-25T13:30:03.9421836Z 90 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-25T13:30:03.9421913Z ·  ──────┬───── 2026-10-25T13:30:03.9422052Z · ╰── `cardCoverage` cannot be modified 2026-10-25T13:30:03.9422117Z 91 │ }, [cardCoverage]); 2026-10-25T13:30:03.9422167Z ╰──── 2026-10-25T13:30:03.9422461Z  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-25T13:30:03.9422766Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T13:30:03.9422768Z 2026-10-25T13:30:03.9422928Z ⚠ react(immutability): This value cannot be modified 2026-10-25T13:30:03.9423088Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:102:7] 2026-10-25T13:30:03.9423210Z  82 │ const cardHeightRef = useRef(0); 2026-10-25T13:30:03.9423294Z  83 │ const cardHeight = useSharedValue(0); 2026-10-25T13:30:03.9423371Z ·  ─────┬──── 2026-10-25T13:30:03.9423504Z · ╰── `cardHeight` originates here 2026-10-25T13:30:03.9423596Z  84 │ const notifyCoverage = useCallback(() => { 2026-10-25T13:30:03.9423662Z  85 │ if (!cardCoverage) { 2026-10-25T13:30:03.9423722Z  86 │ return; 2026-10-25T13:30:03.9423774Z  87 │ } 2026-10-25T13:30:03.9423935Z  88 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-25T13:30:03.9424033Z  89 │ // feed inset and floating controls trailing it. 2026-10-25T13:30:03.9424194Z  90 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-25T13:30:03.9424262Z  91 │ }, [cardCoverage]); 2026-10-25T13:30:03.9424343Z  92 │ const handleBarLayout = useCallback( 2026-10-25T13:30:03.9424423Z  93 │ (event: LayoutChangeEvent) => { 2026-10-25T13:30:03.9424543Z  94 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-25T13:30:03.9424682Z  95 │ notifyCoverage(); 2026-10-25T13:30:03.9424737Z  96 │ }, 2026-10-25T13:30:03.9424801Z  97 │ [notifyCoverage], 2026-10-25T13:30:03.9424854Z  98 │ ); 2026-10-25T13:30:03.9424936Z  99 │ const handleCardLayout = useCallback( 2026-10-25T13:30:03.9425017Z 100 │ (event: LayoutChangeEvent) => { 2026-10-25T13:30:03.9425141Z 101 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-25T13:30:03.9425333Z 102 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-25T13:30:03.9425448Z ·  ─────┬──── 2026-10-25T13:30:03.9425584Z · ╰── `cardHeight` cannot be modified 2026-10-25T13:30:03.9425650Z 103 │ notifyCoverage(); 2026-10-25T13:30:03.9425701Z ╰──── 2026-10-25T13:30:03.9425961Z  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-25T13:30:03.9426266Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T13:30:03.9426268Z 2026-10-25T13:30:03.9426470Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-25T13:30:03.9426629Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:90:5] 2026-10-25T13:30:03.9426717Z 83 │ const cardHeight = useSharedValue(0); 2026-10-25T13:30:03.9426806Z 84 │ const notifyCoverage = useCallback(() => { 2026-10-25T13:30:03.9426909Z ·  ───┬─── 2026-10-25T13:30:03.9427150Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-25T13:30:03.9427216Z 85 │ if (!cardCoverage) { 2026-10-25T13:30:03.9427273Z 86 │ return; 2026-10-25T13:30:03.9427326Z 87 │ } 2026-10-25T13:30:03.9427490Z 88 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-25T13:30:03.9427588Z 89 │ // feed inset and floating controls trailing it. 2026-10-25T13:30:03.9427749Z 90 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-25T13:30:03.9427829Z ·  ──────┬───── 2026-10-25T13:30:03.9427960Z · ╰── This modifies `cardCoverage` 2026-10-25T13:30:03.9428026Z 91 │ }, [cardCoverage]); 2026-10-25T13:30:03.9428075Z ╰──── 2026-10-25T13:30:03.9428414Z  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-25T13:30:03.9428718Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T13:30:03.9428721Z 2026-10-25T13:30:03.9428919Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-25T13:30:03.9429075Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:90:5] 2026-10-25T13:30:03.9429177Z 89 │ // feed inset and floating controls trailing it. 2026-10-25T13:30:03.9429332Z 90 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-25T13:30:03.9429407Z ·  ──────┬───── 2026-10-25T13:30:03.9429536Z · ╰── This modifies `cardCoverage` 2026-10-25T13:30:03.9429601Z 91 │ }, [cardCoverage]); 2026-10-25T13:30:03.9429684Z 92 │ const handleBarLayout = useCallback( 2026-10-25T13:30:03.9429764Z 93 │ (event: LayoutChangeEvent) => { 2026-10-25T13:30:03.9429867Z ·  ───────────────┬─────────────── 2026-10-25T13:30:03.9430088Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-25T13:30:03.9430280Z 94 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-25T13:30:03.9430365Z ╰──── 2026-10-25T13:30:03.9430701Z  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-25T13:30:03.9431007Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T13:30:03.9431009Z 2026-10-25T13:30:03.9431209Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-25T13:30:03.9431365Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:102:7] 2026-10-25T13:30:03.9431450Z  99 │ const handleCardLayout = useCallback( 2026-10-25T13:30:03.9431530Z 100 │ (event: LayoutChangeEvent) => { 2026-10-25T13:30:03.9431642Z ·  ───────────────┬─────────────── 2026-10-25T13:30:03.9431865Z · ╰── This function may (indirectly) reassign or modify `cardHeight` after render 2026-10-25T13:30:03.9431992Z 101 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-25T13:30:03.9432103Z 102 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-25T13:30:03.9432177Z ·  ─────┬──── 2026-10-25T13:30:03.9432305Z · ╰── This modifies `cardHeight` 2026-10-25T13:30:03.9432373Z 103 │ notifyCoverage(); 2026-10-25T13:30:03.9432422Z ╰──── 2026-10-25T13:30:03.9432755Z  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-25T13:30:03.9433067Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T13:30:03.9433074Z 2026-10-25T13:30:03.9433332Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-25T13:30:03.9433504Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:2143:15] 2026-10-25T13:30:03.9433569Z 2142 │ assert.equal( 2026-10-25T13:30:03.9433717Z 2143 │ items.filter((item) => item.type === "assistant_message").at(-1)?.text, 2026-10-25T13:30:03.9433797Z ·  ────── 2026-10-25T13:30:03.9433874Z 2144 │ "authoritative answer", 2026-10-25T13:30:03.9433924Z ╰──── 2026-10-25T13:30:03.9434100Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-25T13:30:03.9434108Z 2026-10-25T13:30:03.9434577Z ⚠ 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-25T13:30:03.9434746Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:4245:7] 2026-10-25T13:30:03.9434926Z 4244 │ const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped); 2026-10-25T13:30:03.9435131Z 4245 │ ╭─▶ while (!responseLifecycle.includes("failed")) { 2026-10-25T13:30:03.9435240Z 4246 │ │ yield* Effect.yieldNow; 2026-10-25T13:30:03.9435451Z 4247 │ ╰─▶ } 2026-10-25T13:30:03.9435606Z 4248 │ const responseExit = yield* Fiber.join(responseFiber); 2026-10-25T13:30:03.9435656Z ╰──── 2026-10-25T13:30:03.9435658Z 2026-10-25T13:30:03.9436121Z ⚠ 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-25T13:30:03.9436290Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6355:9] 2026-10-25T13:30:03.9436378Z 6354 │ .pipe(Effect.forkScoped); 2026-10-25T13:30:03.9436562Z 6355 │ ╭─▶ while (promptGates.length < 1) { 2026-10-25T13:30:03.9436672Z 6356 │ │ yield* Effect.yieldNow; 2026-10-25T13:30:03.9436813Z 6357 │ ╰─▶ } 2026-10-25T13:30:03.9436986Z 6358 │ assert.isDefined(sessionUpdateHandler, "session update handler must be wired"); 2026-10-25T13:30:03.9437036Z ╰──── 2026-10-25T13:30:03.9437038Z 2026-10-25T13:30:03.9437495Z ⚠ 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-25T13:30:03.9437660Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6490:9] 2026-10-25T13:30:03.9437747Z 6489 │ .pipe(Effect.forkScoped); 2026-10-25T13:30:03.9437929Z 6490 │ ╭─▶ while (promptGates.length < 2) { 2026-10-25T13:30:03.9438040Z 6491 │ │ yield* Effect.yieldNow; 2026-10-25T13:30:03.9438177Z 6492 │ ╰─▶ } 2026-10-25T13:30:03.9438340Z 6493 │ if (sessionUpdateHandler === undefined || capturedMutation.current === null) { 2026-10-25T13:30:03.9438391Z ╰──── 2026-10-25T13:30:03.9438393Z 2026-10-25T13:30:03.9438608Z ⚠ eslint(no-unused-vars): Identifier 'serverEnvironment' is imported but never used. 2026-10-25T13:30:03.9438720Z ╭─[apps/web/src/components/Sidebar.tsx:135:40] 2026-10-25T13:30:03.9438853Z 134 │ import { environmentPresentations } from "../state/presentation"; 2026-10-25T13:30:03.9439013Z 135 │ import { primaryServerKeybindingsAtom, serverEnvironment } from "../state/server"; 2026-10-25T13:30:03.9439136Z ·  ────────┬──────── 2026-10-25T13:30:03.9439309Z · ╰── 'serverEnvironment' is imported here 2026-10-25T13:30:03.9439421Z 136 │ import { environmentProjects } from "../state/projects"; 2026-10-25T13:30:03.9439474Z ╰──── 2026-10-25T13:30:03.9439572Z  help: Consider removing this import. 2026-10-25T13:30:03.9439575Z 2026-10-25T13:30:03.9439740Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T13:30:03.9439856Z ╭─[apps/web/src/components/Sidebar.tsx:1177:11] 2026-10-25T13:30:03.9439952Z 1176 │ foldSearchQuery(threadSearchQuery), 2026-10-25T13:30:03.9440019Z 1177 │ Date.now(), 2026-10-25T13:30:03.9440098Z ·  ─────┬──── 2026-10-25T13:30:03.9440312Z · ╰── Cannot call impure function 2026-10-25T13:30:03.9440485Z 1178 │ // A list filter, as on mobile: a pick would move rows unexplained. 2026-10-25T13:30:03.9440536Z ╰──── 2026-10-25T13:30:03.9440823Z  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-25T13:30:03.9441120Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T13:30:03.9441123Z 2026-10-25T13:30:03.9441309Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-25T13:30:03.9441461Z ╭─[apps/mobile/src/features/threads/ThreadQueueControl.tsx:617:27] 2026-10-25T13:30:03.9441632Z 616 │ const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success)); 2026-10-25T13:30:03.9441710Z 617 │ const gesture = Gesture.Pan() 2026-10-25T13:30:03.9441797Z ·  ─┬─ 2026-10-25T13:30:03.9441937Z · ╰── `Pan` may be a component 2026-10-25T13:30:03.9442012Z 618 │ .enabled(!props.disabled) 2026-10-25T13:30:03.9442062Z ╰──── 2026-10-25T13:30:03.9442339Z  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-25T13:30:03.9442783Z  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-25T13:30:03.9442786Z 2026-10-25T13:30:03.9443045Z ⚠ eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used. 2026-10-25T13:30:03.9443262Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:956:10] 2026-10-25T13:30:03.9443315Z 955 │ 2026-10-25T13:30:03.9443421Z 956 │ function layerClaudeAgentSdkReplayQueryRunner( 2026-10-25T13:30:03.9443537Z ·  ──────────────────┬───────────────── 2026-10-25T13:30:03.9443733Z · ╰── 'layerClaudeAgentSdkReplayQueryRunner' is declared here 2026-10-25T13:30:03.9443834Z 957 │ transcript: ClaudeAgentSdkReplayTranscript, 2026-10-25T13:30:03.9443885Z ╰──── 2026-10-25T13:30:03.9443987Z  help: Consider removing this declaration. 2026-10-25T13:30:03.9443989Z 2026-10-25T13:30:03.9444254Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T13:30:03.9444417Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:434:5] 2026-10-25T13:30:03.9444479Z 424 │ : null; 2026-10-25T13:30:03.9444544Z 425 │ useEffect(() => { 2026-10-25T13:30:03.9444615Z ·  ────┬──── 2026-10-25T13:30:03.9444744Z · ╰── This is the containing effect 2026-10-25T13:30:03.9444802Z 426 │ if ( 2026-10-25T13:30:03.9444879Z 427 │ props.active === false || 2026-10-25T13:30:03.9444955Z 428 │ activeDraftKey !== null || 2026-10-25T13:30:03.9445035Z 429 │ editingPendingTask !== null || 2026-10-25T13:30:03.9445110Z 430 │ selectedProject === null 2026-10-25T13:30:03.9445165Z 431 │ ) { 2026-10-25T13:30:03.9445223Z 432 │ return; 2026-10-25T13:30:03.9445347Z 433 │ } 2026-10-25T13:30:03.9445452Z 434 │ setActiveDraftKey( 2026-10-25T13:30:03.9445533Z ·  ────────┬──────── 2026-10-25T13:30:03.9445702Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.9445774Z 435 │ createNewTaskDraft({ 2026-10-25T13:30:03.9445825Z ╰──── 2026-10-25T13:30:03.9446426Z  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-25T13:30:03.9446755Z  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-25T13:30:03.9446760Z 2026-10-25T13:30:03.9447000Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-25T13:30:03.9447167Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1217:36] 2026-10-25T13:30:03.9447271Z 1216 │ 2026-10-25T13:30:03.9447463Z 1217 │ {props.children} 2026-10-25T13:30:03.9447574Z ·  ───────────── 2026-10-25T13:30:03.9447648Z 1218 │ 2026-10-25T13:30:03.9447700Z ╰──── 2026-10-25T13:30:03.9447921Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-25T13:30:03.9448065Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-25T13:30:03.9448072Z 2026-10-25T13:30:03.9448536Z ⚠ 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-25T13:30:03.9448684Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:319:7] 2026-10-25T13:30:03.9448744Z 318 │ }); 2026-10-25T13:30:03.9448942Z 319 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-25T13:30:03.9449134Z 320 │ │ if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break; 2026-10-25T13:30:03.9449309Z 321 │ │ yield* Effect.yieldNow; 2026-10-25T13:30:03.9449476Z 322 │ ╰─▶ } 2026-10-25T13:30:03.9449531Z 323 │ 2026-10-25T13:30:03.9449581Z ╰──── 2026-10-25T13:30:03.9449584Z 2026-10-25T13:30:03.9450041Z ⚠ 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-25T13:30:03.9450188Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:328:7] 2026-10-25T13:30:03.9450295Z 327 │ yield* Deferred.succeed(releaseSave, undefined); 2026-10-25T13:30:03.9450486Z 328 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-25T13:30:03.9450622Z 329 │ │ if ((yield* Ref.get(saved)).length > 0) break; 2026-10-25T13:30:03.9450729Z 330 │ │ yield* Effect.yieldNow; 2026-10-25T13:30:03.9450859Z 331 │ ╰─▶ } 2026-10-25T13:30:03.9450912Z 332 │ 2026-10-25T13:30:03.9450962Z ╰──── 2026-10-25T13:30:03.9450965Z 2026-10-25T13:30:03.9451421Z ⚠ 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-25T13:30:03.9451566Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:457:7] 2026-10-25T13:30:03.9451694Z 456 │ yield* Deferred.succeed(releaseUnenrichedSave, undefined); 2026-10-25T13:30:03.9451888Z 457 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-25T13:30:03.9452012Z 458 │ │ const values = yield* Ref.get(saved); 2026-10-25T13:30:03.9452206Z 459 │ │ if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) { 2026-10-25T13:30:03.9452294Z 460 │ │ break; 2026-10-25T13:30:03.9452372Z 461 │ │ } 2026-10-25T13:30:03.9452473Z 462 │ │ yield* Effect.yieldNow; 2026-10-25T13:30:03.9452604Z 463 │ ╰─▶ } 2026-10-25T13:30:03.9452657Z 464 │ 2026-10-25T13:30:03.9452708Z ╰──── 2026-10-25T13:30:03.9452710Z 2026-10-25T13:30:03.9453049Z ⚠ eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'. 2026-10-25T13:30:03.9453236Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1409:7] 2026-10-25T13:30:03.9453290Z 1408 │ 2026-10-25T13:30:03.9453405Z 1409 │ const layerCodexAppServerClientFactoryCommand = ( 2026-10-25T13:30:03.9453522Z ·  ───────────────────┬─────────────────── 2026-10-25T13:30:03.9453727Z · ╰── 'layerCodexAppServerClientFactoryCommand' is declared here 2026-10-25T13:30:03.9453846Z 1410 │ options: CodexClient.CodexAppServerClientOptions & { 2026-10-25T13:30:03.9453898Z ╰──── 2026-10-25T13:30:03.9453998Z  help: Consider removing this declaration. 2026-10-25T13:30:03.9454001Z 2026-10-25T13:30:03.9454336Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T13:30:03.9454536Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1645:7] 2026-10-25T13:30:03.9454590Z 1644 │ 2026-10-25T13:30:03.9454659Z 1645 │ const layer: Layer.Layer< 2026-10-25T13:30:03.9454730Z ·  ──┬── 2026-10-25T13:30:03.9454857Z · ╰── 'layer' is declared here 2026-10-25T13:30:03.9454948Z 1646 │ ProviderAdapter.ProviderAdapterV2, 2026-10-25T13:30:03.9454997Z ╰──── 2026-10-25T13:30:03.9455100Z  help: Consider removing this declaration. 2026-10-25T13:30:03.9455102Z 2026-10-25T13:30:03.9455356Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T13:30:03.9455532Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10633:7] 2026-10-25T13:30:03.9455588Z 10632 │ 2026-10-25T13:30:03.9455661Z 10633 │ const layer: Layer.Layer< 2026-10-25T13:30:03.9455733Z ·  ──┬── 2026-10-25T13:30:03.9455859Z · ╰── 'layer' is declared here 2026-10-25T13:30:03.9455952Z 10634 │ ProviderAdapter.ProviderAdapterV2, 2026-10-25T13:30:03.9456004Z ╰──── 2026-10-25T13:30:03.9456105Z  help: Consider removing this declaration. 2026-10-25T13:30:03.9456107Z 2026-10-25T13:30:03.9456404Z ⚠ eslint(no-unused-vars): Variable 'layerFromProviderAdapter' is declared but never used. Unused variables should start with a '_'. 2026-10-25T13:30:03.9456566Z ╭─[apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts:346:7] 2026-10-25T13:30:03.9456617Z 345 │ 2026-10-25T13:30:03.9456723Z 346 │ const layerFromProviderAdapter: Layer.Layer< 2026-10-25T13:30:03.9456820Z ·  ────────────┬─────────── 2026-10-25T13:30:03.9456983Z · ╰── 'layerFromProviderAdapter' is declared here 2026-10-25T13:30:03.9457061Z 347 │ ProviderAdapterRegistryV2, 2026-10-25T13:30:03.9457112Z ╰──── 2026-10-25T13:30:03.9457212Z  help: Consider removing this declaration. 2026-10-25T13:30:03.9457215Z 2026-10-25T13:30:03.9457416Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-25T13:30:03.9457545Z ╭─[packages/client-runtime/src/state/usageAccess.ts:3:8] 2026-10-25T13:30:03.9457618Z 2 │ AuthDiagnosticsReadScope, 2026-10-25T13:30:03.9457687Z 3 │ type AuthSessionState, 2026-10-25T13:30:03.9457776Z ·  ────────┬─────── 2026-10-25T13:30:03.9457923Z · ╰── 'AuthSessionState' is imported here 2026-10-25T13:30:03.9457989Z 4 │ sessionGrantsScope, 2026-10-25T13:30:03.9458040Z ╰──── 2026-10-25T13:30:03.9458136Z  help: Consider removing this import. 2026-10-25T13:30:03.9458140Z 2026-10-25T13:30:03.9458415Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-25T13:30:03.9458543Z ╭─[apps/server/src/provider/AntigravityAuth.ts:303:20] 2026-10-25T13:30:03.9458599Z 302 │ }, 2026-10-25T13:30:03.9458682Z 303 │ (effect, flow, stopSessions) => 2026-10-25T13:30:03.9458772Z ·  ──────┬───── 2026-10-25T13:30:03.9458998Z · ╰── 'stopSessions' is declared here 2026-10-25T13:30:03.9459103Z 304 │ effect.pipe( 2026-10-25T13:30:03.9459154Z ╰──── 2026-10-25T13:30:03.9459254Z  help: Consider removing this parameter. 2026-10-25T13:30:03.9459256Z 2026-10-25T13:30:03.9459513Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T13:30:03.9459672Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:287:5] 2026-10-25T13:30:03.9459737Z 285 │ .join("|"); 2026-10-25T13:30:03.9459800Z 286 │ useEffect(() => { 2026-10-25T13:30:03.9459873Z ·  ────┬──── 2026-10-25T13:30:03.9460000Z · ╰── This is the containing effect 2026-10-25T13:30:03.9460061Z 287 │ stop(); 2026-10-25T13:30:03.9460128Z ·  ──┬─ 2026-10-25T13:30:03.9460296Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.9460365Z 288 │ }, [orderVersion]); 2026-10-25T13:30:03.9460415Z ╰──── 2026-10-25T13:30:03.9461017Z  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-25T13:30:03.9461342Z  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-25T13:30:03.9461345Z 2026-10-25T13:30:03.9461564Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T13:30:03.9461726Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:287:5] 2026-10-25T13:30:03.9461790Z 286 │ useEffect(() => { 2026-10-25T13:30:03.9461849Z 287 │ stop(); 2026-10-25T13:30:03.9461917Z ·  ──┬─ 2026-10-25T13:30:03.9462042Z · ╰── Missing dependency `stop` 2026-10-25T13:30:03.9462108Z 288 │ }, [orderVersion]); 2026-10-25T13:30:03.9462186Z ·  ──────┬───── 2026-10-25T13:30:03.9462336Z · ╰── Unnecessary dependency `orderVersion` 2026-10-25T13:30:03.9462396Z 289 │ useEffect( 2026-10-25T13:30:03.9462446Z ╰──── 2026-10-25T13:30:03.9462875Z  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-25T13:30:03.9463300Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9463303Z 2026-10-25T13:30:03.9463447Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.9463604Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:9] 2026-10-25T13:30:03.9463681Z 104 │ const latest = useRef(props); 2026-10-25T13:30:03.9463752Z 105 │ latest.current = props; 2026-10-25T13:30:03.9463856Z ·  ───┬──────┬─── 2026-10-25T13:30:03.9464039Z · │ ╰── Cannot update ref value during render 2026-10-25T13:30:03.9464223Z · ╰── This value is a ref 2026-10-25T13:30:03.9464332Z 106 │ const gesture = useMemo( 2026-10-25T13:30:03.9464383Z ╰──── 2026-10-25T13:30:03.9464919Z  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-25T13:30:03.9465208Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.9465211Z 2026-10-25T13:30:03.9465354Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.9465513Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:113:18] 2026-10-25T13:30:03.9465586Z 112 │ .runOnJS(true) 2026-10-25T13:30:03.9465689Z 113 │ .onStart(() => latest.current.onStart()) 2026-10-25T13:30:03.9465804Z ·  ───────────────┬────────────── 2026-10-25T13:30:03.9466005Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T13:30:03.9466140Z 114 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-25T13:30:03.9466190Z ╰──── 2026-10-25T13:30:03.9466650Z  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-25T13:30:03.9466944Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.9466949Z 2026-10-25T13:30:03.9467092Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.9467251Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:114:19] 2026-10-25T13:30:03.9467348Z 113 │ .onStart(() => latest.current.onStart()) 2026-10-25T13:30:03.9467477Z 114 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-25T13:30:03.9467621Z ·  ──────────────────────────┬───────────────────────── 2026-10-25T13:30:03.9467832Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T13:30:03.9467954Z 115 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-25T13:30:03.9468003Z ╰──── 2026-10-25T13:30:03.9468553Z  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-25T13:30:03.9468884Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.9468887Z 2026-10-25T13:30:03.9469028Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.9470534Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:115:16] 2026-10-25T13:30:03.9470672Z 114 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-25T13:30:03.9470799Z 115 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-25T13:30:03.9470945Z ·  ──────────────────────────┬───────────────────────── 2026-10-25T13:30:03.9471165Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T13:30:03.9471288Z 116 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-25T13:30:03.9471339Z ╰──── 2026-10-25T13:30:03.9471805Z  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-25T13:30:03.9472094Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.9472098Z 2026-10-25T13:30:03.9472246Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.9472407Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:116:21] 2026-10-25T13:30:03.9472527Z 115 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-25T13:30:03.9472648Z 116 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-25T13:30:03.9472784Z ·  ───────────────────────┬────────────────────── 2026-10-25T13:30:03.9472989Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T13:30:03.9473057Z 117 │ [props.disabled], 2026-10-25T13:30:03.9473108Z ╰──── 2026-10-25T13:30:03.9473610Z  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-25T13:30:03.9473904Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.9473907Z 2026-10-25T13:30:03.9474046Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.9474203Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:275:9] 2026-10-25T13:30:03.9474315Z 274 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-25T13:30:03.9474420Z 275 │ latest.current = { rows, planners, moveThread }; 2026-10-25T13:30:03.9474521Z ·  ───┬──────┬─── 2026-10-25T13:30:03.9474784Z · │ ╰── Cannot update ref value during render 2026-10-25T13:30:03.9474933Z · ╰── This value is a ref 2026-10-25T13:30:03.9474986Z 276 │ 2026-10-25T13:30:03.9475034Z ╰──── 2026-10-25T13:30:03.9475496Z  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-25T13:30:03.9475783Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.9475786Z 2026-10-25T13:30:03.9475927Z ⚠ react(refs): Cannot access refs during render 2026-10-25T13:30:03.9476088Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:273:22] 2026-10-25T13:30:03.9476207Z 272 │ const [preview, setPreview] = useState(null); 2026-10-25T13:30:03.9476319Z 273 │ const translateY = useRef(new Animated.Value(0)).current; 2026-10-25T13:30:03.9476444Z ·  ──────────────────┬────────────────── 2026-10-25T13:30:03.9476610Z · ╰── Cannot access ref value during render 2026-10-25T13:30:03.9476716Z 274 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-25T13:30:03.9476768Z ╰──── 2026-10-25T13:30:03.9477231Z  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-25T13:30:03.9477527Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T13:30:03.9477533Z 2026-10-25T13:30:03.9477701Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T13:30:03.9477858Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:350:16] 2026-10-25T13:30:03.9477921Z 349 │ update(0); 2026-10-25T13:30:03.9478000Z 350 │ let last = performance.now(); 2026-10-25T13:30:03.9478096Z ·  ────────┬──────── 2026-10-25T13:30:03.9478234Z · ╰── Cannot call impure function 2026-10-25T13:30:03.9478301Z 351 │ const tick = () => { 2026-10-25T13:30:03.9478351Z ╰──── 2026-10-25T13:30:03.9478656Z  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-25T13:30:03.9478951Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T13:30:03.9478953Z 2026-10-25T13:30:03.9479141Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-25T13:30:03.9479298Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:15] 2026-10-25T13:30:03.9479355Z 107 │ () => 2026-10-25T13:30:03.9479420Z 108 │ Gesture.Pan() 2026-10-25T13:30:03.9479493Z ·  ─┬─ 2026-10-25T13:30:03.9479622Z · ╰── `Pan` may be a component 2026-10-25T13:30:03.9479775Z 109 │ .enabled(!props.disabled) 2026-10-25T13:30:03.9479859Z ╰──── 2026-10-25T13:30:03.9480132Z  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-25T13:30:03.9480576Z  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-25T13:30:03.9480579Z 2026-10-25T13:30:03.9480763Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-25T13:30:03.9480920Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:117:5] 2026-10-25T13:30:03.9480985Z 112 │ .runOnJS(true) 2026-10-25T13:30:03.9481090Z 113 │ .onStart(() => latest.current.onStart()) 2026-10-25T13:30:03.9481179Z ·  ───┬── 2026-10-25T13:30:03.9481611Z · ╰── 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-25T13:30:03.9481739Z 114 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-25T13:30:03.9481860Z 115 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-25T13:30:03.9481981Z 116 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-25T13:30:03.9482047Z 117 │ [props.disabled], 2026-10-25T13:30:03.9482126Z ·  ────────┬─────── 2026-10-25T13:30:03.9482318Z · ╰── This dependency list is missing values used by the callback 2026-10-25T13:30:03.9482375Z 118 │ ); 2026-10-25T13:30:03.9482425Z ╰──── 2026-10-25T13:30:03.9482627Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-25T13:30:03.9482938Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9482941Z 2026-10-25T13:30:03.9483184Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T13:30:03.9483353Z ╭─[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:250:7] 2026-10-25T13:30:03.9483431Z 249 │ mountedRef.current = false; 2026-10-25T13:30:03.9483506Z 250 │ flow.setBranchQuery(""); 2026-10-25T13:30:03.9483579Z ·  ──┬─ 2026-10-25T13:30:03.9483705Z · ╰── Missing dependency `flow` 2026-10-25T13:30:03.9483760Z 251 │ }; 2026-10-25T13:30:03.9483831Z 252 │ }, [flow.setBranchQuery]); 2026-10-25T13:30:03.9483917Z ·  ─────────┬───────── 2026-10-25T13:30:03.9484120Z · ╰── Overly precise dependency `flow.setBranchQuery`, use `flow` instead 2026-10-25T13:30:03.9484172Z 253 │ 2026-10-25T13:30:03.9484220Z ╰──── 2026-10-25T13:30:03.9484638Z  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-25T13:30:03.9485020Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9485055Z 2026-10-25T13:30:03.9485275Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-25T13:30:03.9485411Z ╭─[apps/mobile/src/state/use-model-option-memory.ts:21:7] 2026-10-25T13:30:03.9485474Z 20 │ [instanceId]: { 2026-10-25T13:30:03.9485551Z 21 │ ...(state[instanceId] ?? {}), 2026-10-25T13:30:03.9485653Z ·  ──────────────────────────── 2026-10-25T13:30:03.9485718Z 22 │ [model]: options, 2026-10-25T13:30:03.9485768Z ╰──── 2026-10-25T13:30:03.9486033Z  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-25T13:30:03.9486036Z 2026-10-25T13:30:03.9486222Z ⚠ eslint(no-unused-vars): Type 'Scope' is imported but never used. 2026-10-25T13:30:03.9486360Z ╭─[apps/server/src/provider/ProviderAuthService.ts:15:18] 2026-10-25T13:30:03.9486444Z 14 │ import * as Layer from "effect/Layer"; 2026-10-25T13:30:03.9486535Z 15 │ import type * as Scope from "effect/Scope"; 2026-10-25T13:30:03.9486613Z ·  ──┬── 2026-10-25T13:30:03.9486745Z · ╰── 'Scope' is imported here 2026-10-25T13:30:03.9486828Z 16 │ import * as Stream from "effect/Stream"; 2026-10-25T13:30:03.9486878Z ╰──── 2026-10-25T13:30:03.9486973Z  help: Consider removing this import. 2026-10-25T13:30:03.9486976Z 2026-10-25T13:30:03.9487233Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T13:30:03.9487389Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:565:5] 2026-10-25T13:30:03.9487449Z 563 │ }, []); 2026-10-25T13:30:03.9487513Z 564 │ useEffect(() => { 2026-10-25T13:30:03.9487583Z ·  ────┬──── 2026-10-25T13:30:03.9487710Z · ╰── This is the containing effect 2026-10-25T13:30:03.9487794Z 565 │ setKeyboardStateSuspect(false); 2026-10-25T13:30:03.9487883Z ·  ───────────┬─────────── 2026-10-25T13:30:03.9488052Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.9488147Z 566 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-25T13:30:03.9488197Z ╰──── 2026-10-25T13:30:03.9488806Z  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-25T13:30:03.9489130Z  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-25T13:30:03.9489133Z 2026-10-25T13:30:03.9489388Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T13:30:03.9489537Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:977:7] 2026-10-25T13:30:03.9489690Z 974 │ const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0); 2026-10-25T13:30:03.9489753Z 975 │ useEffect(() => { 2026-10-25T13:30:03.9489893Z ·  ────┬──── 2026-10-25T13:30:03.9490057Z · ╰── This is the containing effect 2026-10-25T13:30:03.9490212Z 976 │ if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) { 2026-10-25T13:30:03.9490322Z 977 │ setLastKnownKeyboardHeight(liveKeyboardHeight); 2026-10-25T13:30:03.9490416Z ·  ─────────────┬──────────── 2026-10-25T13:30:03.9490588Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.9490643Z 978 │ } 2026-10-25T13:30:03.9490692Z ╰──── 2026-10-25T13:30:03.9491300Z  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-25T13:30:03.9491622Z  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-25T13:30:03.9491625Z 2026-10-25T13:30:03.9491877Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T13:30:03.9492031Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1220:5] 2026-10-25T13:30:03.9492084Z 1218 │ 2026-10-25T13:30:03.9492149Z 1219 │ useEffect(() => { 2026-10-25T13:30:03.9492219Z ·  ────┬──── 2026-10-25T13:30:03.9492348Z · ╰── This is the containing effect 2026-10-25T13:30:03.9492424Z 1220 │ setAnchorMessageId(null); 2026-10-25T13:30:03.9492512Z ·  ─────────┬──────── 2026-10-25T13:30:03.9492683Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.9492763Z 1221 │ setSubmittedMessageId(null); 2026-10-25T13:30:03.9492813Z ╰──── 2026-10-25T13:30:03.9493443Z  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-25T13:30:03.9493762Z  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-25T13:30:03.9493765Z 2026-10-25T13:30:03.9494039Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T13:30:03.9494226Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:566:7] 2026-10-25T13:30:03.9494309Z 565 │ setKeyboardStateSuspect(false); 2026-10-25T13:30:03.9494405Z 566 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-25T13:30:03.9494542Z ·  ────────┬──────── ─────────┬──────── 2026-10-25T13:30:03.9494749Z · │ ╰── Unnecessary dependency `liveKeyboardHeight` 2026-10-25T13:30:03.9494905Z · ╰── Unnecessary dependency `isKeyboardVisible` 2026-10-25T13:30:03.9495031Z 567 │ const handleOwnedInputFocusChange = (focused: boolean) => { 2026-10-25T13:30:03.9495080Z ╰──── 2026-10-25T13:30:03.9495381Z  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-25T13:30:03.9495693Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9495696Z 2026-10-25T13:30:03.9495894Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T13:30:03.9496047Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1168:7] 2026-10-25T13:30:03.9496131Z 1167 │ userInputInsetProgress.set(1); 2026-10-25T13:30:03.9496291Z 1168 │ }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]); 2026-10-25T13:30:03.9496384Z ·  ────────────┬─────────── 2026-10-25T13:30:03.9496567Z · ╰── Unnecessary dependency `activeUserInputRequestId` 2026-10-25T13:30:03.9496671Z 1169 │ const showContent = props.showContent ?? true; 2026-10-25T13:30:03.9496722Z ╰──── 2026-10-25T13:30:03.9497012Z  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-25T13:30:03.9497320Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9497323Z 2026-10-25T13:30:03.9497520Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T13:30:03.9497674Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1226:15] 2026-10-25T13:30:03.9497745Z 1225 │ freeze.set(false); 2026-10-25T13:30:03.9497828Z 1226 │ }, [freeze, selectedThreadKey]); 2026-10-25T13:30:03.9497920Z ·  ────────┬──────── 2026-10-25T13:30:03.9498080Z · ╰── Unnecessary dependency `selectedThreadKey` 2026-10-25T13:30:03.9498133Z 1227 │ 2026-10-25T13:30:03.9498183Z ╰──── 2026-10-25T13:30:03.9498472Z  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-25T13:30:03.9498780Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9498783Z 2026-10-25T13:30:03.9499012Z ⚠ react(immutability): This value cannot be modified 2026-10-25T13:30:03.9499201Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1063:5] 2026-10-25T13:30:03.9499311Z 1058 │ const composerPopoverHeight = useSharedValue(0); 2026-10-25T13:30:03.9499415Z 1059 │ const floatingControlCoverage = useSharedValue( 2026-10-25T13:30:03.9499508Z ·  ───────────┬─────────── 2026-10-25T13:30:03.9499667Z · ╰── `floatingControlCoverage` originates here 2026-10-25T13:30:03.9499793Z 1060 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-25T13:30:03.9499846Z 1061 │ ); 2026-10-25T13:30:03.9499910Z 1062 │ useEffect(() => { 2026-10-25T13:30:03.9500013Z 1063 │ floatingControlCoverage.value = withTiming( 2026-10-25T13:30:03.9500103Z ·  ───────────┬─────────── 2026-10-25T13:30:03.9500270Z · ╰── `floatingControlCoverage` cannot be modified 2026-10-25T13:30:03.9500400Z 1064 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-25T13:30:03.9500450Z ╰──── 2026-10-25T13:30:03.9500712Z  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-25T13:30:03.9501013Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T13:30:03.9501017Z 2026-10-25T13:30:03.9501170Z ⚠ react(immutability): This value cannot be modified 2026-10-25T13:30:03.9501320Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1079:7] 2026-10-25T13:30:03.9501509Z 1069 │ const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null; 2026-10-25T13:30:03.9501633Z 1070 │ const combinedContentInsetEndAdjustment = useSharedValue( 2026-10-25T13:30:03.9501742Z ·  ────────────────┬──────────────── 2026-10-25T13:30:03.9501927Z · ╰── `combinedContentInsetEndAdjustment` originates here 2026-10-25T13:30:03.9502054Z 1071 │ Math.max(0, estimatedOverlayHeight - nativeInsetOvercount), 2026-10-25T13:30:03.9502109Z 1072 │ ); 2026-10-25T13:30:03.9502176Z 1073 │ useAnimatedReaction( 2026-10-25T13:30:03.9502233Z 1074 │ () => 2026-10-25T13:30:03.9502324Z 1075 │ contentInsetEndAdjustment.value + 2026-10-25T13:30:03.9502411Z 1076 │ floatingControlCoverage.value + 2026-10-25T13:30:03.9502605Z 1077 │ (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0), 2026-10-25T13:30:03.9502675Z 1078 │ (value) => { 2026-10-25T13:30:03.9502792Z 1079 │ combinedContentInsetEndAdjustment.value = value; 2026-10-25T13:30:03.9502900Z ·  ────────────────┬──────────────── 2026-10-25T13:30:03.9503087Z · ╰── `combinedContentInsetEndAdjustment` cannot be modified 2026-10-25T13:30:03.9503142Z 1080 │ }, 2026-10-25T13:30:03.9503230Z ╰──── 2026-10-25T13:30:03.9503490Z  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-25T13:30:03.9503792Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T13:30:03.9503794Z 2026-10-25T13:30:03.9504032Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-25T13:30:03.9504216Z ╭─[apps/server/src/provider/Drivers/CodexDriver.test.ts:460:14] 2026-10-25T13:30:03.9504269Z 459 │ 2026-10-25T13:30:03.9504373Z 460 │ for (const {} of ["direct", "wrapper"] as const) { 2026-10-25T13:30:03.9504445Z ·  ── 2026-10-25T13:30:03.9504497Z 461 │ } 2026-10-25T13:30:03.9504547Z ╰──── 2026-10-25T13:30:03.9505100Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-25T13:30:03.9505103Z 2026-10-25T13:30:03.9505343Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-25T13:30:03.9505498Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:287:50] 2026-10-25T13:30:03.9505562Z 286 │ return ( 2026-10-25T13:30:03.9505696Z 287 │ 2026-10-25T13:30:03.9505816Z ·  ───────────── 2026-10-25T13:30:03.9505883Z 288 │ {props.children} 2026-10-25T13:30:03.9505933Z ╰──── 2026-10-25T13:30:03.9506153Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-25T13:30:03.9506294Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-25T13:30:03.9506297Z 2026-10-25T13:30:03.9506534Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-25T13:30:03.9506687Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:651:44] 2026-10-25T13:30:03.9506750Z 650 │ return ( 2026-10-25T13:30:03.9506869Z 651 │ 2026-10-25T13:30:03.9506983Z ·  ───────────── 2026-10-25T13:30:03.9507048Z 652 │ {props.children} 2026-10-25T13:30:03.9507098Z ╰──── 2026-10-25T13:30:03.9507314Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-25T13:30:03.9507449Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-25T13:30:03.9507452Z 2026-10-25T13:30:03.9507687Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-25T13:30:03.9507846Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1460:55] 2026-10-25T13:30:03.9507909Z 1459 │ return ( 2026-10-25T13:30:03.9508070Z 1460 │ 2026-10-25T13:30:03.9508200Z ·  ──────────────────── 2026-10-25T13:30:03.9508298Z 1461 │ decodeJson(message)).filter(isRpcRequest)[index]; 2026-10-25T13:30:03.9513848Z 242 │ │ if (request) { 2026-10-25T13:30:03.9513938Z 243 │ │ return request; 2026-10-25T13:30:03.9514012Z 244 │ │ } 2026-10-25T13:30:03.9514110Z 245 │ │ yield* Effect.yieldNow; 2026-10-25T13:30:03.9514240Z 246 │ ╰─▶ } 2026-10-25T13:30:03.9514408Z 247 │ return yield* Effect.die(new Error("Expected the RPC protocol to send a request.")); 2026-10-25T13:30:03.9514459Z ╰──── 2026-10-25T13:30:03.9514462Z 2026-10-25T13:30:03.9514918Z ⚠ 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-25T13:30:03.9515050Z ╭─[packages/client-runtime/src/rpc/client.test.ts:131:9] 2026-10-25T13:30:03.9515112Z 130 │ ) { 2026-10-25T13:30:03.9515316Z 131 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T13:30:03.9515444Z 132 │ │ if (subscriptions.length >= count) { 2026-10-25T13:30:03.9515535Z 133 │ │ return; 2026-10-25T13:30:03.9515614Z 134 │ │ } 2026-10-25T13:30:03.9515718Z 135 │ │ yield* Effect.yieldNow; 2026-10-25T13:30:03.9515850Z 136 │ ╰─▶ } 2026-10-25T13:30:03.9516012Z 137 │ return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`)); 2026-10-25T13:30:03.9516064Z ╰──── 2026-10-25T13:30:03.9516066Z 2026-10-25T13:30:03.9516521Z ⚠ 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-25T13:30:03.9516656Z ╭─[packages/client-runtime/src/rpc/client.test.ts:252:7] 2026-10-25T13:30:03.9516819Z 251 │ yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient))); 2026-10-25T13:30:03.9517071Z 252 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) { 2026-10-25T13:30:03.9517176Z 253 │ │ yield* Effect.yieldNow; 2026-10-25T13:30:03.9517305Z 254 │ ╰─▶ } 2026-10-25T13:30:03.9517426Z 255 │ yield* SubscriptionRef.set(activeSession, Option.none()); 2026-10-25T13:30:03.9517476Z ╰──── 2026-10-25T13:30:03.9517478Z 2026-10-25T13:30:03.9518008Z ⚠ 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-25T13:30:03.9518169Z ╭─[packages/client-runtime/src/rpc/client.test.ts:258:7] 2026-10-25T13:30:03.9518223Z 257 │ 2026-10-25T13:30:03.9518470Z 258 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-25T13:30:03.9518573Z 259 │ │ yield* Effect.yieldNow; 2026-10-25T13:30:03.9518699Z 260 │ ╰─▶ } 2026-10-25T13:30:03.9518801Z 261 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-25T13:30:03.9518852Z ╰──── 2026-10-25T13:30:03.9518854Z 2026-10-25T13:30:03.9519313Z ⚠ 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-25T13:30:03.9519445Z ╭─[packages/client-runtime/src/rpc/client.test.ts:322:7] 2026-10-25T13:30:03.9519503Z 321 │ ); 2026-10-25T13:30:03.9519756Z 322 │ ╭─▶ for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) { 2026-10-25T13:30:03.9519858Z 323 │ │ yield* Effect.yieldNow; 2026-10-25T13:30:03.9519987Z 324 │ ╰─▶ } 2026-10-25T13:30:03.9520039Z 325 │ 2026-10-25T13:30:03.9520088Z ╰──── 2026-10-25T13:30:03.9520091Z 2026-10-25T13:30:03.9520550Z ⚠ 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-25T13:30:03.9520681Z ╭─[packages/client-runtime/src/rpc/client.test.ts:330:7] 2026-10-25T13:30:03.9520841Z 329 │ yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient))); 2026-10-25T13:30:03.9521086Z 330 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-25T13:30:03.9521188Z 331 │ │ yield* Effect.yieldNow; 2026-10-25T13:30:03.9521316Z 332 │ ╰─▶ } 2026-10-25T13:30:03.9521416Z 333 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-25T13:30:03.9521465Z ╰──── 2026-10-25T13:30:03.9521467Z 2026-10-25T13:30:03.9521682Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-25T13:30:03.9521808Z ╭─[apps/mobile/src/lib/markdownDocument.ts:259:28] 2026-10-25T13:30:03.9521905Z 258 │ visit(parser.parse(markdown), false, false); 2026-10-25T13:30:03.9521987Z 259 │ for (const edit of edits.reverse()) 2026-10-25T13:30:03.9522082Z ·  ─────── 2026-10-25T13:30:03.9522242Z 260 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-25T13:30:03.9522292Z ╰──── 2026-10-25T13:30:03.9522553Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-25T13:30:03.9522556Z 2026-10-25T13:30:03.9522837Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-25T13:30:03.9522986Z ╭─[apps/mobile/src/lib/markdownDocument.ts:290:28] 2026-10-25T13:30:03.9523064Z 289 │ visit(parser.parse(markdown)); 2026-10-25T13:30:03.9523172Z 290 │ for (const edit of edits.reverse()) 2026-10-25T13:30:03.9523264Z ·  ─────── 2026-10-25T13:30:03.9523422Z 291 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-25T13:30:03.9523471Z ╰──── 2026-10-25T13:30:03.9523727Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-25T13:30:03.9523731Z 2026-10-25T13:30:03.9523936Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-25T13:30:03.9524061Z ╭─[apps/mobile/src/lib/markdownDocument.ts:339:38] 2026-10-25T13:30:03.9524141Z 338 │ visit(parser.parse(markdown)); 2026-10-25T13:30:03.9524243Z 339 │ for (const lineStart of lineStarts.reverse()) { 2026-10-25T13:30:03.9524345Z ·  ─────── 2026-10-25T13:30:03.9524538Z 340 │ // Lazy headers can lack container markers; copy the delimiter's markers to the header and blank line. 2026-10-25T13:30:03.9524587Z ╰──── 2026-10-25T13:30:03.9524842Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-25T13:30:03.9524844Z 2026-10-25T13:30:03.9525009Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T13:30:03.9525138Z ╭─[apps/web/src/components/CommandPalette.tsx:2057:20] 2026-10-25T13:30:03.9525260Z 2056 │ title: inferProjectTitleFromPath(destinationPath), 2026-10-25T13:30:03.9525355Z 2057 │ createdAt: new Date().toISOString(), 2026-10-25T13:30:03.9525444Z ·  ─────┬──── 2026-10-25T13:30:03.9525587Z · ╰── Cannot call impure function 2026-10-25T13:30:03.9525691Z 2058 │ remoteUrl: addProjectCloneFlow.remoteUrl, 2026-10-25T13:30:03.9525741Z ╰──── 2026-10-25T13:30:03.9526020Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T13:30:03.9526315Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T13:30:03.9526318Z 2026-10-25T13:30:03.9526548Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-25T13:30:03.9526692Z ╭─[packages/client-runtime/src/operations/projects.ts:238:51] 2026-10-25T13:30:03.9526752Z 237 │ ): string { 2026-10-25T13:30:03.9526904Z 238 │ const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? ""; 2026-10-25T13:30:03.9527015Z ·  ────── 2026-10-25T13:30:03.9527143Z 239 │ return target.owner ? `${target.owner}/${folderName}` : folderName; 2026-10-25T13:30:03.9527193Z ╰──── 2026-10-25T13:30:03.9527359Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-25T13:30:03.9527362Z 2026-10-25T13:30:03.9527548Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-25T13:30:03.9527734Z ╭─[apps/mobile/src/lib/useHoverGesture.ts:8:15] 2026-10-25T13:30:03.9527823Z 7 │ () => 2026-10-25T13:30:03.9527887Z 8 │ Gesture.Hover() 2026-10-25T13:30:03.9527962Z ·  ──┬── 2026-10-25T13:30:03.9528095Z · ╰── `Hover` may be a component 2026-10-25T13:30:03.9528167Z 9 │ .manualActivation(true) 2026-10-25T13:30:03.9528216Z ╰──── 2026-10-25T13:30:03.9528498Z  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-25T13:30:03.9528946Z  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-25T13:30:03.9528954Z 2026-10-25T13:30:03.9529111Z ⚠ react(immutability): This value cannot be modified 2026-10-25T13:30:03.9529256Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:174:5] 2026-10-25T13:30:03.9529397Z 170 │ const expandedAngle = props.collapsedDirection === "right" ? 90 : 180; 2026-10-25T13:30:03.9529530Z 171 │ const rotation = useSharedValue(props.expanded ? expandedAngle : 0); 2026-10-25T13:30:03.9529603Z ·  ────┬─── 2026-10-25T13:30:03.9529731Z · ╰── `rotation` originates here 2026-10-25T13:30:03.9529782Z 172 │ 2026-10-25T13:30:03.9529852Z 173 │ useLayoutEffect(() => { 2026-10-25T13:30:03.9529982Z 174 │ rotation.value = withTiming(props.expanded ? expandedAngle : 0, { 2026-10-25T13:30:03.9530052Z ·  ────┬─── 2026-10-25T13:30:03.9530186Z · ╰── `rotation` cannot be modified 2026-10-25T13:30:03.9530287Z 175 │ duration: THREAD_DISCLOSURE_TRANSITION_MS, 2026-10-25T13:30:03.9530337Z ╰──── 2026-10-25T13:30:03.9530600Z  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-25T13:30:03.9530905Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T13:30:03.9530907Z 2026-10-25T13:30:03.9531100Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T13:30:03.9531248Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:1239:23] 2026-10-25T13:30:03.9531314Z 1238 │ { 2026-10-25T13:30:03.9532387Z ·  ────┬──── 2026-10-25T13:30:03.9532593Z · ╰── This is the containing effect 2026-10-25T13:30:03.9532693Z 52 │ setDecodedSize(null); 2026-10-25T13:30:03.9532769Z ·  ───────┬────── 2026-10-25T13:30:03.9532936Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.9533004Z 53 │ }, [props.sourceKey]); 2026-10-25T13:30:03.9533054Z ╰──── 2026-10-25T13:30:03.9533697Z  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-25T13:30:03.9534022Z  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-25T13:30:03.9534027Z 2026-10-25T13:30:03.9534282Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T13:30:03.9534431Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:56:5] 2026-10-25T13:30:03.9534483Z 54 │ 2026-10-25T13:30:03.9534545Z 55 │ useEffect(() => { 2026-10-25T13:30:03.9534613Z ·  ────┬──── 2026-10-25T13:30:03.9534739Z · ╰── This is the containing effect 2026-10-25T13:30:03.9534805Z 56 │ setFailedUri(null); 2026-10-25T13:30:03.9534878Z ·  ──────┬───── 2026-10-25T13:30:03.9535043Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.9535107Z 57 │ }, [props.uri]); 2026-10-25T13:30:03.9535161Z ╰──── 2026-10-25T13:30:03.9535763Z  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-25T13:30:03.9536085Z  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-25T13:30:03.9536088Z 2026-10-25T13:30:03.9536301Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-25T13:30:03.9536450Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10] 2026-10-25T13:30:03.9536575Z 6 │ import { parse, SvgAst, type JsxAST } from "react-native-svg"; 2026-10-25T13:30:03.9536751Z 7 │ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native"; 2026-10-25T13:30:03.9536838Z ·  ────────┬──────── 2026-10-25T13:30:03.9536986Z · ╰── 'ActivityIndicator' is imported here 2026-10-25T13:30:03.9537037Z 8 │ 2026-10-25T13:30:03.9537086Z ╰──── 2026-10-25T13:30:03.9537183Z  help: Consider removing this import. 2026-10-25T13:30:03.9537186Z 2026-10-25T13:30:03.9537384Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T13:30:03.9537532Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:53:7] 2026-10-25T13:30:03.9537598Z 52 │ setDecodedSize(null); 2026-10-25T13:30:03.9537665Z 53 │ }, [props.sourceKey]); 2026-10-25T13:30:03.9537818Z ·  ───────┬─────── 2026-10-25T13:30:03.9538004Z · ╰── Unnecessary dependency `props.sourceKey` 2026-10-25T13:30:03.9538054Z 54 │ 2026-10-25T13:30:03.9538103Z ╰──── 2026-10-25T13:30:03.9538396Z  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-25T13:30:03.9538706Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9538708Z 2026-10-25T13:30:03.9538905Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T13:30:03.9539051Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:57:7] 2026-10-25T13:30:03.9539122Z 56 │ setFailedUri(null); 2026-10-25T13:30:03.9539187Z 57 │ }, [props.uri]); 2026-10-25T13:30:03.9539260Z ·  ────┬──── 2026-10-25T13:30:03.9539398Z · ╰── Unnecessary dependency `props.uri` 2026-10-25T13:30:03.9539449Z 58 │ 2026-10-25T13:30:03.9539498Z ╰──── 2026-10-25T13:30:03.9539788Z  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-25T13:30:03.9540095Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9540098Z 2026-10-25T13:30:03.9540468Z ⚠ 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-25T13:30:03.9540582Z ╭─[packages/contracts/src/auth.test.ts:17:12] 2026-10-25T13:30:03.9540740Z 16 │ it("decodes legacy review credentials without offering them in new grants", () => { 2026-10-25T13:30:03.9540905Z 17 │ expect(Schema.decodeUnknownSync(AuthEnvironmentScopes)(["review:write"])).toEqual([ 2026-10-25T13:30:03.9541004Z ·  ──────────────────────── 2026-10-25T13:30:03.9541068Z 18 │ "review:write", 2026-10-25T13:30:03.9541116Z ╰──── 2026-10-25T13:30:03.9541119Z 2026-10-25T13:30:03.9541481Z ⚠ 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-25T13:30:03.9541662Z ╭─[packages/contracts/src/auth.test.ts:20:18] 2026-10-25T13:30:03.9541756Z 19 │ ]); 2026-10-25T13:30:03.9541917Z 20 │ expect(() => Schema.decodeUnknownSync(AuthGrantScopes)(["review:write"])).toThrow(); 2026-10-25T13:30:03.9542020Z ·  ──────────────────────── 2026-10-25T13:30:03.9542147Z 21 │ expect(AuthStandardClientScopes).not.toContain("review:write"); 2026-10-25T13:30:03.9542196Z ╰──── 2026-10-25T13:30:03.9542199Z 2026-10-25T13:30:03.9542556Z ⚠ 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-25T13:30:03.9542664Z ╭─[packages/contracts/src/auth.test.ts:57:21] 2026-10-25T13:30:03.9542832Z 56 │ it("ignores unknown response permissions without falling back to broader scopes", () => { 2026-10-25T13:30:03.9542960Z 57 │ const session = Schema.decodeUnknownSync(AuthSessionState)({ 2026-10-25T13:30:03.9543068Z ·  ──────────────────────── 2026-10-25T13:30:03.9543136Z 58 │ authenticated: true, 2026-10-25T13:30:03.9543208Z ╰──── 2026-10-25T13:30:03.9543211Z 2026-10-25T13:30:03.9543375Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T13:30:03.9543522Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:373:47] 2026-10-25T13:30:03.9543649Z 372 │ const { open, onOpenChange, onSnooze, timestampFormat } = props; 2026-10-25T13:30:03.9543802Z 373 │ const presets = open ? resolveSnoozePresets(new Date(), timestampFormat) : []; 2026-10-25T13:30:03.9543914Z ·  ─────┬──── 2026-10-25T13:30:03.9544085Z · ╰── Cannot call impure function 2026-10-25T13:30:03.9544147Z 374 │ return ( 2026-10-25T13:30:03.9544196Z ╰──── 2026-10-25T13:30:03.9544474Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T13:30:03.9544823Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T13:30:03.9544826Z 2026-10-25T13:30:03.9544991Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T13:30:03.9545136Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:860:39] 2026-10-25T13:30:03.9545226Z 859 │ if (snoozeGateClock.thread !== thread) { 2026-10-25T13:30:03.9545355Z 860 │ setSnoozeGateClock({ thread, now: new Date().toISOString() }); 2026-10-25T13:30:03.9545465Z ·  ─────┬──── 2026-10-25T13:30:03.9545622Z · ╰── Cannot call impure function 2026-10-25T13:30:03.9545674Z 861 │ } 2026-10-25T13:30:03.9545723Z ╰──── 2026-10-25T13:30:03.9546001Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T13:30:03.9546293Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T13:30:03.9546295Z 2026-10-25T13:30:03.9546551Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T13:30:03.9546756Z ╭─[apps/server/src/serverRuntimeStartup.ts:720:7] 2026-10-25T13:30:03.9546855Z 719 │ 2026-10-25T13:30:03.9546934Z 720 │ const layer = layerWithOptions(); 2026-10-25T13:30:03.9547003Z ·  ──┬── 2026-10-25T13:30:03.9547124Z · ╰── 'layer' is declared here 2026-10-25T13:30:03.9547173Z ╰──── 2026-10-25T13:30:03.9547276Z  help: Consider removing this declaration. 2026-10-25T13:30:03.9547279Z 2026-10-25T13:30:03.9547645Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownEffect(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const. 2026-10-25T13:30:03.9547769Z ╭─[apps/server/src/assets/AssetAccess.test.ts:975:35] 2026-10-25T13:30:03.9547923Z 974 │ // Every client and server release spells the resource this way on the wire. 2026-10-25T13:30:03.9548077Z 975 │ const { resource } = yield* Schema.decodeUnknownEffect(AssetCreateUrlInput)({ 2026-10-25T13:30:03.9548199Z ·  ────────────────────────── 2026-10-25T13:30:03.9548310Z 976 │ resource: { _tag: "github-media", cwd: "/repo", url }, 2026-10-25T13:30:03.9548360Z ╰──── 2026-10-25T13:30:03.9548362Z 2026-10-25T13:30:03.9548808Z ⚠ 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-25T13:30:03.9548936Z ╭─[apps/server/src/assets/AssetAccess.test.ts:1012:32] 2026-10-25T13:30:03.9549070Z 1011 │ expect(error._tag).toBe("AssetGitHubMediaUrlValidationError"); 2026-10-25T13:30:03.9549262Z 1012 │ const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(AssetAccessError))(error); 2026-10-25T13:30:03.9549378Z ·  ─────────────────── 2026-10-25T13:30:03.9549471Z 1013 │ expect(encoded).not.toContain(url); 2026-10-25T13:30:03.9549522Z ╰──── 2026-10-25T13:30:03.9549524Z 2026-10-25T13:30:03.9549721Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T13:30:03.9549848Z ╭─[apps/mobile/src/components/ComposerEditor.tsx:82:6] 2026-10-25T13:30:03.9549902Z 81 │ }, 2026-10-25T13:30:03.9549963Z 82 │ [draftKey], 2026-10-25T13:30:03.9550033Z ·  ────┬─── 2026-10-25T13:30:03.9550170Z · ╰── Unnecessary dependency `draftKey` 2026-10-25T13:30:03.9550222Z 83 │ ); 2026-10-25T13:30:03.9550272Z ╰──── 2026-10-25T13:30:03.9550572Z  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-25T13:30:03.9550887Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9550889Z 2026-10-25T13:30:03.9551341Z ⚠ 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-25T13:30:03.9551475Z ╭─[packages/contracts/src/composerContext.test.ts:181:18] 2026-10-25T13:30:03.9551609Z 180 │ it("sends a message without the records the wire cannot carry", () => { 2026-10-25T13:30:03.9551863Z 181 │ const wire = Schema.encodeUnknownSync(Schema.toCodecJson(OrchestrationMessageContext))({ 2026-10-25T13:30:03.9552007Z ·  ──────────────────────── 2026-10-25T13:30:03.9552071Z 182 │ version: 1, 2026-10-25T13:30:03.9552120Z ╰──── 2026-10-25T13:30:03.9552123Z 2026-10-25T13:30:03.9552377Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T13:30:03.9552525Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:413:5] 2026-10-25T13:30:03.9552576Z 411 │ 2026-10-25T13:30:03.9552640Z 412 │ useEffect(() => { 2026-10-25T13:30:03.9552708Z ·  ────┬──── 2026-10-25T13:30:03.9552836Z · ╰── This is the containing effect 2026-10-25T13:30:03.9552933Z 413 │ setInspectorSelection((current) => { 2026-10-25T13:30:03.9553021Z ·  ──────────┬────────── 2026-10-25T13:30:03.9553228Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.9553328Z 414 │ if (props.renderInspector === undefined) { 2026-10-25T13:30:03.9553377Z ╰──── 2026-10-25T13:30:03.9553984Z  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-25T13:30:03.9554304Z  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-25T13:30:03.9554307Z 2026-10-25T13:30:03.9554523Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-25T13:30:03.9554677Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:541:24] 2026-10-25T13:30:03.9554834Z 540 │ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top; 2026-10-25T13:30:03.9555001Z 541 │ ╭─▶ const GitInspector = () => ( 2026-10-25T13:30:03.9555095Z 542 │ │ 2026-10-25T13:30:03.9555705Z 547 │ ╰─▶ ); 2026-10-25T13:30:03.9555784Z 548 │ const FilesInspector = () => 2026-10-25T13:30:03.9555834Z ╰──── 2026-10-25T13:30:03.9556051Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-25T13:30:03.9556055Z 2026-10-25T13:30:03.9556264Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-25T13:30:03.9556415Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:548:26] 2026-10-25T13:30:03.9556472Z 547 │ ); 2026-10-25T13:30:03.9556635Z 548 │ ╭─▶ const FilesInspector = () => 2026-10-25T13:30:03.9556853Z 549 │ │ selectedThread !== null && selectedThreadCwd !== null ? ( 2026-10-25T13:30:03.9556989Z 550 │ │ 2026-10-25T13:30:03.9557938Z 558 │ ╰─▶ ) : null; 2026-10-25T13:30:03.9558089Z 559 │ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset); 2026-10-25T13:30:03.9558139Z ╰──── 2026-10-25T13:30:03.9558353Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-25T13:30:03.9558355Z 2026-10-25T13:30:03.9558612Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T13:30:03.9558745Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:67:5] 2026-10-25T13:30:03.9558847Z 65 │ const { id: attachmentId, fileUri } = attachment; 2026-10-25T13:30:03.9558909Z 66 │ useEffect(() => { 2026-10-25T13:30:03.9558980Z ·  ────┬──── 2026-10-25T13:30:03.9559112Z · ╰── This is the containing effect 2026-10-25T13:30:03.9559178Z 67 │ setUri(null); 2026-10-25T13:30:03.9559246Z ·  ───┬── 2026-10-25T13:30:03.9559410Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.9559473Z 68 │ setError(null); 2026-10-25T13:30:03.9559522Z ╰──── 2026-10-25T13:30:03.9560117Z  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-25T13:30:03.9560437Z  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-25T13:30:03.9560445Z 2026-10-25T13:30:03.9560646Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T13:30:03.9560778Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:90:7] 2026-10-25T13:30:03.9560832Z 89 │ }; 2026-10-25T13:30:03.9560903Z 90 │ }, [attachmentId, fileUri]); 2026-10-25T13:30:03.9561019Z ·  ──────┬───── ───┬─── 2026-10-25T13:30:03.9561198Z · │ ╰── Unnecessary dependency `fileUri` 2026-10-25T13:30:03.9561343Z · ╰── Unnecessary dependency `attachmentId` 2026-10-25T13:30:03.9561473Z 91 │ const mimeType = videoMimeType(attachment) ?? attachment.mimeType; 2026-10-25T13:30:03.9561522Z ╰──── 2026-10-25T13:30:03.9561885Z  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-25T13:30:03.9562231Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9562233Z 2026-10-25T13:30:03.9562445Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T13:30:03.9562580Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:212:34] 2026-10-25T13:30:03.9562645Z 211 │ useEffect(() => { 2026-10-25T13:30:03.9562755Z 212 │ if (!isFocused && hasSource) props.onRequestClose(); 2026-10-25T13:30:03.9562852Z ·  ──┬── 2026-10-25T13:30:03.9563005Z · ╰── Missing dependency `props` 2026-10-25T13:30:03.9563112Z 213 │ }, [isFocused, hasSource, props.onRequestClose]); 2026-10-25T13:30:03.9563249Z ·  ──────────┬───────── 2026-10-25T13:30:03.9563475Z · ╰── Overly precise dependency `props.onRequestClose`, use `props` instead 2026-10-25T13:30:03.9563545Z 214 │ const { source } = props; 2026-10-25T13:30:03.9563595Z ╰──── 2026-10-25T13:30:03.9564015Z  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-25T13:30:03.9564330Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9564334Z 2026-10-25T13:30:03.9564488Z ⚠ react(immutability): This value cannot be modified 2026-10-25T13:30:03.9564649Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:108:5] 2026-10-25T13:30:03.9564703Z 104 │ ); 2026-10-25T13:30:03.9564854Z 105 │ const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0); 2026-10-25T13:30:03.9564942Z ·  ─────────┬──────── 2026-10-25T13:30:03.9565090Z · ╰── `separationProgress` originates here 2026-10-25T13:30:03.9565142Z 106 │ 2026-10-25T13:30:03.9565206Z 107 │ useEffect(() => { 2026-10-25T13:30:03.9565378Z 108 │ separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING); 2026-10-25T13:30:03.9565541Z ·  ─────────┬──────── 2026-10-25T13:30:03.9565753Z · ╰── `separationProgress` cannot be modified 2026-10-25T13:30:03.9565912Z 109 │ }, [props.showScrollToEnd, separationProgress]); 2026-10-25T13:30:03.9565988Z ╰──── 2026-10-25T13:30:03.9566363Z  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-25T13:30:03.9566762Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T13:30:03.9566765Z 2026-10-25T13:30:03.9566920Z ⚠ react(immutability): This value cannot be modified 2026-10-25T13:30:03.9567081Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:132:5] 2026-10-25T13:30:03.9567317Z 122 │ // Animate an in-flow sizer for native glass layout. Measure labels at fixed width to avoid repeated animation retargeting. 2026-10-25T13:30:03.9567436Z 123 │ const capsuleWidth = useSharedValue(null); 2026-10-25T13:30:03.9567515Z ·  ──────┬───── 2026-10-25T13:30:03.9567649Z · ╰── `capsuleWidth` originates here 2026-10-25T13:30:03.9567759Z 124 │ const measuredWidthRef = useRef(null); 2026-10-25T13:30:03.9567871Z 125 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-25T13:30:03.9567974Z 126 │ const width = event.nativeEvent.layout.width; 2026-10-25T13:30:03.9568069Z 127 │ if (width === measuredWidthRef.current) { 2026-10-25T13:30:03.9568129Z 128 │ return; 2026-10-25T13:30:03.9568182Z 129 │ } 2026-10-25T13:30:03.9568293Z 130 │ const first = measuredWidthRef.current === null; 2026-10-25T13:30:03.9568381Z 131 │ measuredWidthRef.current = width; 2026-10-25T13:30:03.9568521Z 132 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-25T13:30:03.9568595Z ·  ──────┬───── 2026-10-25T13:30:03.9568733Z · ╰── `capsuleWidth` cannot be modified 2026-10-25T13:30:03.9568785Z 133 │ }; 2026-10-25T13:30:03.9568834Z ╰──── 2026-10-25T13:30:03.9569096Z  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-25T13:30:03.9569400Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T13:30:03.9569403Z 2026-10-25T13:30:03.9569562Z ⚠ react(immutability): This value cannot be modified 2026-10-25T13:30:03.9569727Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:139:7] 2026-10-25T13:30:03.9569950Z 122 │ // Animate an in-flow sizer for native glass layout. Measure labels at fixed width to avoid repeated animation retargeting. 2026-10-25T13:30:03.9570065Z 123 │ const capsuleWidth = useSharedValue(null); 2026-10-25T13:30:03.9570145Z ·  ──────┬───── 2026-10-25T13:30:03.9570278Z · ╰── `capsuleWidth` originates here 2026-10-25T13:30:03.9570384Z 124 │ const measuredWidthRef = useRef(null); 2026-10-25T13:30:03.9570497Z 125 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-25T13:30:03.9570598Z 126 │ const width = event.nativeEvent.layout.width; 2026-10-25T13:30:03.9570772Z 127 │ if (width === measuredWidthRef.current) { 2026-10-25T13:30:03.9570864Z 128 │ return; 2026-10-25T13:30:03.9570918Z 129 │ } 2026-10-25T13:30:03.9571021Z 130 │ const first = measuredWidthRef.current === null; 2026-10-25T13:30:03.9571105Z 131 │ measuredWidthRef.current = width; 2026-10-25T13:30:03.9571243Z 132 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-25T13:30:03.9571295Z 133 │ }; 2026-10-25T13:30:03.9571384Z 134 │ const hasStatus = props.status !== null; 2026-10-25T13:30:03.9571516Z 135 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-25T13:30:03.9571578Z 136 │ useEffect(() => { 2026-10-25T13:30:03.9571644Z 137 │ if (!hasStatus) { 2026-10-25T13:30:03.9571728Z 138 │ measuredWidthRef.current = null; 2026-10-25T13:30:03.9571805Z 139 │ capsuleWidth.value = null; 2026-10-25T13:30:03.9571887Z ·  ──────┬───── 2026-10-25T13:30:03.9572029Z · ╰── `capsuleWidth` cannot be modified 2026-10-25T13:30:03.9572082Z 140 │ } 2026-10-25T13:30:03.9572132Z ╰──── 2026-10-25T13:30:03.9572392Z  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-25T13:30:03.9572698Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T13:30:03.9572700Z 2026-10-25T13:30:03.9572899Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-25T13:30:03.9573060Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:139:7] 2026-10-25T13:30:03.9573227Z 135 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-25T13:30:03.9573296Z 136 │ useEffect(() => { 2026-10-25T13:30:03.9573372Z ·  ───┬─── 2026-10-25T13:30:03.9573593Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-25T13:30:03.9573656Z 137 │ if (!hasStatus) { 2026-10-25T13:30:03.9573741Z 138 │ measuredWidthRef.current = null; 2026-10-25T13:30:03.9573816Z 139 │ capsuleWidth.value = null; 2026-10-25T13:30:03.9573891Z ·  ──────┬───── 2026-10-25T13:30:03.9574023Z · ╰── This modifies `capsuleWidth` 2026-10-25T13:30:03.9574076Z 140 │ } 2026-10-25T13:30:03.9574127Z ╰──── 2026-10-25T13:30:03.9574471Z  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-25T13:30:03.9574777Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T13:30:03.9574781Z 2026-10-25T13:30:03.9574975Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-25T13:30:03.9575136Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:132:5] 2026-10-25T13:30:03.9575245Z 124 │ const measuredWidthRef = useRef(null); 2026-10-25T13:30:03.9575358Z 125 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-25T13:30:03.9575480Z ·  ───────────────┬─────────────── 2026-10-25T13:30:03.9575792Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-25T13:30:03.9575929Z 126 │ const width = event.nativeEvent.layout.width; 2026-10-25T13:30:03.9576022Z 127 │ if (width === measuredWidthRef.current) { 2026-10-25T13:30:03.9576081Z 128 │ return; 2026-10-25T13:30:03.9576134Z 129 │ } 2026-10-25T13:30:03.9576237Z 130 │ const first = measuredWidthRef.current === null; 2026-10-25T13:30:03.9576320Z 131 │ measuredWidthRef.current = width; 2026-10-25T13:30:03.9576458Z 132 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-25T13:30:03.9576533Z ·  ──────┬───── 2026-10-25T13:30:03.9576663Z · ╰── This modifies `capsuleWidth` 2026-10-25T13:30:03.9576716Z 133 │ }; 2026-10-25T13:30:03.9576770Z ╰──── 2026-10-25T13:30:03.9577108Z  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-25T13:30:03.9577413Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T13:30:03.9577415Z 2026-10-25T13:30:03.9577581Z ⚠ eslint(no-empty-pattern): Empty array binding pattern 2026-10-25T13:30:03.9577737Z ╭─[apps/server/src/pullRequest/PullRequestService.test.ts:1436:12] 2026-10-25T13:30:03.9577789Z 1435 │ 2026-10-25T13:30:03.9577853Z 1436 │ for (const [] of [ 2026-10-25T13:30:03.9577924Z ·  ── 2026-10-25T13:30:03.9577994Z 1437 │ ["github", "github.com"], 2026-10-25T13:30:03.9578051Z ╰──── 2026-10-25T13:30:03.9578328Z  help: Passing non-iterable values (null, undefined, numbers, booleans, etc.) will result in a runtime error because these values are not iterable. 2026-10-25T13:30:03.9578331Z 2026-10-25T13:30:03.9578589Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T13:30:03.9578724Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2223:5] 2026-10-25T13:30:03.9578777Z 2221 │ ); 2026-10-25T13:30:03.9578842Z 2222 │ useEffect(() => { 2026-10-25T13:30:03.9578913Z ·  ────┬──── 2026-10-25T13:30:03.9579042Z · ╰── This is the containing effect 2026-10-25T13:30:03.9579113Z 2223 │ setExpandedVideo(null); 2026-10-25T13:30:03.9579198Z ·  ────────┬─────── 2026-10-25T13:30:03.9579371Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.9579442Z 2224 │ setExpandedFile(null); 2026-10-25T13:30:03.9579491Z ╰──── 2026-10-25T13:30:03.9580090Z  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-25T13:30:03.9580412Z  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-25T13:30:03.9580414Z 2026-10-25T13:30:03.9580742Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T13:30:03.9580910Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2716:9] 2026-10-25T13:30:03.9581043Z 2707 │ const stopFollowingEnd = useEffectEvent(() => setEndFollow(false)); 2026-10-25T13:30:03.9581107Z 2708 │ useEffect(() => { 2026-10-25T13:30:03.9581178Z ·  ────┬──── 2026-10-25T13:30:03.9581308Z · ╰── This is the containing effect 2026-10-25T13:30:03.9581434Z 2709 │ if (!jumpToMessageId || loadedListKey !== listMountKey) return; 2026-10-25T13:30:03.9581528Z 2710 │ const index = presentedFeed.findIndex( 2026-10-25T13:30:03.9581661Z 2711 │ (entry) => entry.type === "message" && entry.id === jumpToMessageId, 2026-10-25T13:30:03.9581715Z 2712 │ ); 2026-10-25T13:30:03.9581783Z 2713 │ if (index === -1) { 2026-10-25T13:30:03.9581915Z 2714 │ const runId = messageFoldRunId(props.feed, jumpToMessageId); 2026-10-25T13:30:03.9582017Z 2715 │ if (runId && !expandedTurnIds.has(runId)) { 2026-10-25T13:30:03.9582109Z 2716 │ setInteractionState((current) => ({ 2026-10-25T13:30:03.9582196Z ·  ─────────┬───────── 2026-10-25T13:30:03.9582371Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.9582437Z 2717 │ ...current, 2026-10-25T13:30:03.9582487Z ╰──── 2026-10-25T13:30:03.9583081Z  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-25T13:30:03.9583441Z  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-25T13:30:03.9583448Z 2026-10-25T13:30:03.9583679Z ⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used. 2026-10-25T13:30:03.9583810Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:72:10] 2026-10-25T13:30:03.9583945Z 71 │ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets"; 2026-10-25T13:30:03.9584081Z 72 │ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks"; 2026-10-25T13:30:03.9584175Z ·  ───────────┬─────────── 2026-10-25T13:30:03.9584341Z · ╰── 'isMarkdownFileLinkLabel' is imported here 2026-10-25T13:30:03.9584503Z 73 │ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments"; 2026-10-25T13:30:03.9584632Z ╰──── 2026-10-25T13:30:03.9584763Z  help: Consider removing this import. 2026-10-25T13:30:03.9584766Z 2026-10-25T13:30:03.9584972Z ⚠ eslint(no-unused-vars): Identifier 'createContext' is imported but never used. 2026-10-25T13:30:03.9585101Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:98:3] 2026-10-25T13:30:03.9585156Z 97 │ import { 2026-10-25T13:30:03.9585221Z 98 │ createContext, 2026-10-25T13:30:03.9585294Z ·  ──────┬────── 2026-10-25T13:30:03.9585429Z · ╰── 'createContext' is imported here 2026-10-25T13:30:03.9585483Z 99 │ memo, 2026-10-25T13:30:03.9585534Z ╰──── 2026-10-25T13:30:03.9585628Z  help: Consider removing this import. 2026-10-25T13:30:03.9585723Z 2026-10-25T13:30:03.9585983Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-25T13:30:03.9586114Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:114:3] 2026-10-25T13:30:03.9586172Z 113 │ import { 2026-10-25T13:30:03.9586239Z 114 │ ActivityIndicator, 2026-10-25T13:30:03.9586319Z ·  ────────┬──────── 2026-10-25T13:30:03.9586460Z · ╰── 'ActivityIndicator' is imported here 2026-10-25T13:30:03.9586517Z 115 │ Image, 2026-10-25T13:30:03.9586567Z ╰──── 2026-10-25T13:30:03.9586661Z  help: Consider removing this import. 2026-10-25T13:30:03.9586663Z 2026-10-25T13:30:03.9586859Z ⚠ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used. 2026-10-25T13:30:03.9586995Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:121:3] 2026-10-25T13:30:03.9587060Z 120 │ Pressable, 2026-10-25T13:30:03.9587120Z 121 │ ScrollView, 2026-10-25T13:30:03.9587190Z ·  ─────┬──── 2026-10-25T13:30:03.9587318Z · ╰── 'ScrollView' is imported here 2026-10-25T13:30:03.9587378Z 122 │ StyleSheet, 2026-10-25T13:30:03.9587428Z ╰──── 2026-10-25T13:30:03.9587520Z  help: Consider removing this import. 2026-10-25T13:30:03.9587522Z 2026-10-25T13:30:03.9587717Z ⚠ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used. 2026-10-25T13:30:03.9587849Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:123:11] 2026-10-25T13:30:03.9587908Z 122 │ StyleSheet, 2026-10-25T13:30:03.9588042Z 123 │ Text as NativeText, 2026-10-25T13:30:03.9588127Z ·  ─────┬──── 2026-10-25T13:30:03.9588267Z · ╰── 'NativeText' is imported here 2026-10-25T13:30:03.9588331Z 124 │ type ColorValue, 2026-10-25T13:30:03.9588380Z ╰──── 2026-10-25T13:30:03.9588473Z  help: Consider removing this import. 2026-10-25T13:30:03.9588476Z 2026-10-25T13:30:03.9588686Z ⚠ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used. 2026-10-25T13:30:03.9588819Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:146:10] 2026-10-25T13:30:03.9588950Z 145 │ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic"; 2026-10-25T13:30:03.9589074Z 146 │ import { tryOpenExternalUrl } from "../../lib/openExternalUrl"; 2026-10-25T13:30:03.9589162Z ·  ─────────┬──────── 2026-10-25T13:30:03.9589390Z · ╰── 'tryOpenExternalUrl' is imported here 2026-10-25T13:30:03.9589573Z 147 │ import { downloadAndShareAttachment } from "../../lib/attachmentDownload"; 2026-10-25T13:30:03.9589623Z ╰──── 2026-10-25T13:30:03.9589716Z  help: Consider removing this import. 2026-10-25T13:30:03.9589719Z 2026-10-25T13:30:03.9589934Z ⚠ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used. 2026-10-25T13:30:03.9590063Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:149:10] 2026-10-25T13:30:03.9590195Z 148 │ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks"; 2026-10-25T13:30:03.9590317Z 149 │ import { faviconUrlForOrigin } from "@t3tools/shared/favicon"; 2026-10-25T13:30:03.9590405Z ·  ─────────┬───────── 2026-10-25T13:30:03.9590562Z · ╰── 'faviconUrlForOrigin' is imported here 2026-10-25T13:30:03.9590624Z 150 │ import { 2026-10-25T13:30:03.9590673Z ╰──── 2026-10-25T13:30:03.9590766Z  help: Consider removing this import. 2026-10-25T13:30:03.9590768Z 2026-10-25T13:30:03.9590975Z ⚠ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used. 2026-10-25T13:30:03.9591104Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:163:10] 2026-10-25T13:30:03.9591249Z 162 │ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile"; 2026-10-25T13:30:03.9591380Z 163 │ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer"; 2026-10-25T13:30:03.9591465Z ·  ────────┬─────── 2026-10-25T13:30:03.9591616Z · ╰── 'MediaVideoPlayer' is imported here 2026-10-25T13:30:03.9591755Z 164 │ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia"; 2026-10-25T13:30:03.9591804Z ╰──── 2026-10-25T13:30:03.9591897Z  help: Consider removing this import. 2026-10-25T13:30:03.9591899Z 2026-10-25T13:30:03.9592115Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used. 2026-10-25T13:30:03.9592244Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:167:3] 2026-10-25T13:30:03.9592324Z 166 │ attachmentVideoPreviewSource, 2026-10-25T13:30:03.9592393Z 167 │ mediaVideoPreviewUri, 2026-10-25T13:30:03.9592475Z ·  ──────────┬───────── 2026-10-25T13:30:03.9592624Z · ╰── 'mediaVideoPreviewUri' is imported here 2026-10-25T13:30:03.9592702Z 168 │ mediaVideoThumbnailKey, 2026-10-25T13:30:03.9592755Z ╰──── 2026-10-25T13:30:03.9592846Z  help: Consider removing this import. 2026-10-25T13:30:03.9592848Z 2026-10-25T13:30:03.9593068Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used. 2026-10-25T13:30:03.9593227Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:168:3] 2026-10-25T13:30:03.9593296Z 167 │ mediaVideoPreviewUri, 2026-10-25T13:30:03.9593364Z 168 │ mediaVideoThumbnailKey, 2026-10-25T13:30:03.9593450Z ·  ───────────┬────────── 2026-10-25T13:30:03.9593603Z · ╰── 'mediaVideoThumbnailKey' is imported here 2026-10-25T13:30:03.9593681Z 169 │ type MediaVideoPreviewSource, 2026-10-25T13:30:03.9593730Z ╰──── 2026-10-25T13:30:03.9593892Z  help: Consider removing this import. 2026-10-25T13:30:03.9593926Z 2026-10-25T13:30:03.9594136Z ⚠ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used. 2026-10-25T13:30:03.9594264Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:169:8] 2026-10-25T13:30:03.9594332Z 168 │ mediaVideoThumbnailKey, 2026-10-25T13:30:03.9594410Z 169 │ type MediaVideoPreviewSource, 2026-10-25T13:30:03.9594502Z ·  ───────────┬─────────── 2026-10-25T13:30:03.9594662Z · ╰── 'MediaVideoPreviewSource' is imported here 2026-10-25T13:30:03.9594745Z 170 │ } from "../../lib/videoPreviewSource"; 2026-10-25T13:30:03.9594796Z ╰──── 2026-10-25T13:30:03.9594888Z  help: Consider removing this import. 2026-10-25T13:30:03.9594890Z 2026-10-25T13:30:03.9595121Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used. 2026-10-25T13:30:03.9595253Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:191:3] 2026-10-25T13:30:03.9595310Z 190 │ import { 2026-10-25T13:30:03.9595385Z 191 │ resolveMarkdownFontSizes, 2026-10-25T13:30:03.9595473Z ·  ────────────┬─────────── 2026-10-25T13:30:03.9595629Z · ╰── 'resolveMarkdownFontSizes' is imported here 2026-10-25T13:30:03.9595717Z 192 │ resolveNativeMarkdownTypography, 2026-10-25T13:30:03.9595767Z ╰──── 2026-10-25T13:30:03.9595860Z  help: Consider removing this import. 2026-10-25T13:30:03.9595862Z 2026-10-25T13:30:03.9596117Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used. 2026-10-25T13:30:03.9596253Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:198:3] 2026-10-25T13:30:03.9596332Z 197 │ normalizeNativeMarkdownUrl, 2026-10-25T13:30:03.9596425Z 198 │ resolveMarkdownInlineCodePresentation, 2026-10-25T13:30:03.9596533Z ·  ──────────────────┬────────────────── 2026-10-25T13:30:03.9596725Z · ╰── 'resolveMarkdownInlineCodePresentation' is imported here 2026-10-25T13:30:03.9596809Z 199 │ resolveMarkdownLinkPresentation, 2026-10-25T13:30:03.9596859Z ╰──── 2026-10-25T13:30:03.9596951Z  help: Consider removing this import. 2026-10-25T13:30:03.9596955Z 2026-10-25T13:30:03.9597162Z ⚠ eslint(no-unused-vars): Type 'PendingThreadFeedEntry' is imported but never used. 2026-10-25T13:30:03.9597292Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:237:8] 2026-10-25T13:30:03.9597376Z 236 │ isCompactionCommandFeedEntry, 2026-10-25T13:30:03.9597455Z 237 │ type PendingThreadFeedEntry, 2026-10-25T13:30:03.9597546Z ·  ───────────┬────────── 2026-10-25T13:30:03.9597703Z · ╰── 'PendingThreadFeedEntry' is imported here 2026-10-25T13:30:03.9597770Z 238 │ type ThreadFeedRow, 2026-10-25T13:30:03.9597821Z ╰──── 2026-10-25T13:30:03.9597913Z  help: Consider removing this import. 2026-10-25T13:30:03.9597915Z 2026-10-25T13:30:03.9598125Z ⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used. 2026-10-25T13:30:03.9598256Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:248:3] 2026-10-25T13:30:03.9598318Z 247 │ useAssetUrl, 2026-10-25T13:30:03.9598383Z 248 │ useAssetUrlState, 2026-10-25T13:30:03.9598536Z ·  ────────┬─────── 2026-10-25T13:30:03.9598730Z · ╰── 'useAssetUrlState' is imported here 2026-10-25T13:30:03.9598831Z 249 │ useRefreshAssetUrl, 2026-10-25T13:30:03.9598904Z ╰──── 2026-10-25T13:30:03.9599037Z  help: Consider removing this import. 2026-10-25T13:30:03.9599040Z 2026-10-25T13:30:03.9599433Z ⚠ eslint(no-unused-vars): Variable 'navigation' is declared but never used. Unused variables should start with a '_'. 2026-10-25T13:30:03.9599635Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:438:9] 2026-10-25T13:30:03.9599897Z 437 │ const forkFromRun = useAtomCommand(threadEnvironment.forkFromRun, "fork from response"); 2026-10-25T13:30:03.9600024Z 438 │ const navigation = useNavigation(); 2026-10-25T13:30:03.9600146Z ·  ─────┬──── 2026-10-25T13:30:03.9600359Z · ╰── 'navigation' is declared here 2026-10-25T13:30:03.9600516Z 439 │ const selectDetail = useSelectWorkspaceDetail(); 2026-10-25T13:30:03.9600595Z ╰──── 2026-10-25T13:30:03.9600748Z  help: Consider removing this declaration. 2026-10-25T13:30:03.9600752Z 2026-10-25T13:30:03.9601074Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T13:30:03.9601293Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2225:7] 2026-10-25T13:30:03.9601411Z 2224 │ setExpandedFile(null); 2026-10-25T13:30:03.9601661Z 2225 │ }, [props.environmentId, props.threadId, props.contentPresentation.kind]); 2026-10-25T13:30:03.9602021Z ·  ─────────┬───────── ───────┬────── ───────────────┬────────────── 2026-10-25T13:30:03.9602460Z · │ │ ╰── Unnecessary dependency `props.contentPresentation.kind` 2026-10-25T13:30:03.9602714Z · │ ╰── Unnecessary dependency `props.threadId` 2026-10-25T13:30:03.9602879Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-25T13:30:03.9603019Z 2226 │ const horizontalPadding = props.layoutVariant === "split" ? 20 : 16; 2026-10-25T13:30:03.9603071Z ╰──── 2026-10-25T13:30:03.9603397Z  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-25T13:30:03.9603811Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9603849Z 2026-10-25T13:30:03.9604051Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T13:30:03.9604189Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2685:7] 2026-10-25T13:30:03.9604286Z 2684 │ reportHeaderMaterialVisibility(false); 2026-10-25T13:30:03.9604399Z 2685 │ }, [feedThreadKey, reportHeaderMaterialVisibility]); 2026-10-25T13:30:03.9604479Z ·  ──────┬────── 2026-10-25T13:30:03.9604629Z · ╰── Unnecessary dependency `feedThreadKey` 2026-10-25T13:30:03.9604683Z 2686 │ 2026-10-25T13:30:03.9604736Z ╰──── 2026-10-25T13:30:03.9605032Z  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-25T13:30:03.9605349Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9605352Z 2026-10-25T13:30:03.9605549Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T13:30:03.9605681Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2701:7] 2026-10-25T13:30:03.9605737Z 2700 │ } 2026-10-25T13:30:03.9605868Z 2701 │ }, [listMountKey, props.contentInsetEndAdjustment, listRef]); 2026-10-25T13:30:03.9605948Z ·  ──────┬───── 2026-10-25T13:30:03.9606094Z · ╰── Unnecessary dependency `listMountKey` 2026-10-25T13:30:03.9606242Z 2702 │ // Opening at a message: its run unfolds, the list stops following the end 2026-10-25T13:30:03.9606299Z ╰──── 2026-10-25T13:30:03.9606591Z  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-25T13:30:03.9606899Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9606902Z 2026-10-25T13:30:03.9607097Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T13:30:03.9607230Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2895:7] 2026-10-25T13:30:03.9607286Z 2894 │ } 2026-10-25T13:30:03.9607470Z 2895 │ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]); 2026-10-25T13:30:03.9607671Z ·  ───────┬─────── ─────────┬──────── ────────┬─────── 2026-10-25T13:30:03.9607923Z · │ │ ╰── Unnecessary dependency `expandedWorkRows` 2026-10-25T13:30:03.9608127Z · │ ╰── Unnecessary dependency `expandedWorkGroups` 2026-10-25T13:30:03.9608280Z · ╰── Unnecessary dependency `expandedTurnIds` 2026-10-25T13:30:03.9608332Z 2896 │ 2026-10-25T13:30:03.9608383Z ╰──── 2026-10-25T13:30:03.9608745Z  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-25T13:30:03.9609220Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9609222Z 2026-10-25T13:30:03.9609404Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-25T13:30:03.9609536Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:628:9] 2026-10-25T13:30:03.9609594Z 627 │ }; 2026-10-25T13:30:03.9609709Z 628 │ }, [props.environmentId, attachment.id, httpBaseUrl]), 2026-10-25T13:30:03.9609898Z ·  ─────────┬───────── ──────┬────── ─────┬───── 2026-10-25T13:30:03.9610143Z · │ │ ╰── Unnecessary dependency `httpBaseUrl` 2026-10-25T13:30:03.9610342Z · │ ╰── Unnecessary dependency `attachment.id` 2026-10-25T13:30:03.9610505Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-25T13:30:03.9610560Z 629 │ ); 2026-10-25T13:30:03.9610610Z ╰──── 2026-10-25T13:30:03.9610923Z  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-25T13:30:03.9611234Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9611236Z 2026-10-25T13:30:03.9611499Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T13:30:03.9611667Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:221:7] 2026-10-25T13:30:03.9611719Z 217 │ }; 2026-10-25T13:30:03.9611785Z 218 │ useEffect(() => { 2026-10-25T13:30:03.9611857Z ·  ────┬──── 2026-10-25T13:30:03.9611985Z · ╰── This is the containing effect 2026-10-25T13:30:03.9612157Z 219 │ const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null; 2026-10-25T13:30:03.9612221Z 220 │ if (inserted) { 2026-10-25T13:30:03.9612297Z 221 │ setSelection((current) => 2026-10-25T13:30:03.9612375Z ·  ──────┬───── 2026-10-25T13:30:03.9612542Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.9612718Z 222 │ current.start === inserted.start && current.end === inserted.end ? current : inserted, 2026-10-25T13:30:03.9612775Z ╰──── 2026-10-25T13:30:03.9613411Z  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-25T13:30:03.9613731Z  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-25T13:30:03.9613734Z 2026-10-25T13:30:03.9613989Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T13:30:03.9614219Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:301:7] 2026-10-25T13:30:03.9614334Z 289 │ }, [hasWorkspaceSnapshot]); 2026-10-25T13:30:03.9614399Z 290 │ useEffect(() => { 2026-10-25T13:30:03.9614469Z ·  ────┬──── 2026-10-25T13:30:03.9614598Z · ╰── This is the containing effect 2026-10-25T13:30:03.9614745Z 291 │ if (!environmentId || !projectCwd || !selectedProviderInstanceId) return; 2026-10-25T13:30:03.9614894Z 292 │ const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`; 2026-10-25T13:30:03.9614963Z 293 │ const now = Date.now(); 2026-10-25T13:30:03.9615076Z 294 │ const lastRequest = workspaceRefreshKeyRef.current; 2026-10-25T13:30:03.9615132Z 295 │ if ( 2026-10-25T13:30:03.9615208Z 296 │ lastRequest?.key === key && 2026-10-25T13:30:03.9615350Z 297 │ now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS 2026-10-25T13:30:03.9615407Z 298 │ ) 2026-10-25T13:30:03.9615467Z 299 │ return; 2026-10-25T13:30:03.9615640Z 300 │ if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) { 2026-10-25T13:30:03.9615725Z 301 │ setWorkspaceRefreshRetry(null); 2026-10-25T13:30:03.9615820Z ·  ────────────┬─────────── 2026-10-25T13:30:03.9615995Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.9616055Z 302 │ return; 2026-10-25T13:30:03.9616104Z ╰──── 2026-10-25T13:30:03.9616708Z  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-25T13:30:03.9617032Z  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-25T13:30:03.9617035Z 2026-10-25T13:30:03.9617233Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T13:30:03.9617394Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:331:5] 2026-10-25T13:30:03.9617448Z 330 │ }, [ 2026-10-25T13:30:03.9617511Z 331 │ draftMessage, 2026-10-25T13:30:03.9617588Z ·  ──────┬───── 2026-10-25T13:30:03.9617731Z · ╰── Unnecessary dependency `draftMessage` 2026-10-25T13:30:03.9617794Z 332 │ environmentId, 2026-10-25T13:30:03.9617851Z ╰──── 2026-10-25T13:30:03.9618145Z  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-25T13:30:03.9618455Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9618458Z 2026-10-25T13:30:03.9618713Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T13:30:03.9618874Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:40:5] 2026-10-25T13:30:03.9618986Z 37 │ const [initialized, setInitialized] = useState(false); 2026-10-25T13:30:03.9619055Z 38 │ useLayoutEffect(() => { 2026-10-25T13:30:03.9619323Z ·  ───────┬─────── 2026-10-25T13:30:03.9619522Z · ╰── This is the containing effect 2026-10-25T13:30:03.9619582Z 39 │ reset(); 2026-10-25T13:30:03.9619649Z 40 │ setInitialized(true); 2026-10-25T13:30:03.9619724Z ·  ───────┬────── 2026-10-25T13:30:03.9619891Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.9619950Z 41 │ }, [reset]); 2026-10-25T13:30:03.9620000Z ╰──── 2026-10-25T13:30:03.9620593Z  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-25T13:30:03.9620919Z  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-25T13:30:03.9620924Z 2026-10-25T13:30:03.9621179Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T13:30:03.9621337Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:93:5] 2026-10-25T13:30:03.9621389Z 88 │ 2026-10-25T13:30:03.9621450Z 89 │ useEffect(() => { 2026-10-25T13:30:03.9621519Z ·  ────┬──── 2026-10-25T13:30:03.9621645Z · ╰── This is the containing effect 2026-10-25T13:30:03.9621801Z 90 │ if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return; 2026-10-25T13:30:03.9621906Z 91 │ const branchName = initialProjectRef.branch; 2026-10-25T13:30:03.9621975Z 92 │ let active = true; 2026-10-25T13:30:03.9622069Z 93 │ setPendingCheckouts((count) => count + 1); 2026-10-25T13:30:03.9622153Z ·  ─────────┬───────── 2026-10-25T13:30:03.9622320Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T13:30:03.9622475Z 94 │ // Serialize replacements: ignoring a stale result cannot undo its Git mutation. 2026-10-25T13:30:03.9622526Z ╰──── 2026-10-25T13:30:03.9623120Z  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-25T13:30:03.9623473Z  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-25T13:30:03.9623480Z 2026-10-25T13:30:03.9623645Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T13:30:03.9623802Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:712:76] 2026-10-25T13:30:03.9623981Z 711 │ const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() })); 2026-10-25T13:30:03.9624148Z 712 │ if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() }); 2026-10-25T13:30:03.9624284Z ·  ─────┬──── 2026-10-25T13:30:03.9624548Z · ╰── Cannot call impure function 2026-10-25T13:30:03.9624823Z 713 │ const snoozeGateNow = new Date(snoozeGateClock.now).toISOString(); 2026-10-25T13:30:03.9624874Z ╰──── 2026-10-25T13:30:03.9625158Z  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-25T13:30:03.9625451Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T13:30:03.9625454Z 2026-10-25T13:30:03.9625618Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T13:30:03.9625774Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:733:71] 2026-10-25T13:30:03.9625853Z 732 │ const snoozePresets = useMemo( 2026-10-25T13:30:03.9626034Z 733 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-25T13:30:03.9626169Z ·  ─────┬──── 2026-10-25T13:30:03.9626351Z · ╰── Cannot call impure function 2026-10-25T13:30:03.9626467Z 734 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-25T13:30:03.9626515Z ╰──── 2026-10-25T13:30:03.9626790Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T13:30:03.9627083Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T13:30:03.9627086Z 2026-10-25T13:30:03.9627270Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-25T13:30:03.9627427Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:734:6] 2026-10-25T13:30:03.9627600Z 733 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-25T13:30:03.9627713Z 734 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-25T13:30:03.9627806Z ·  ────────────┬─────────── 2026-10-25T13:30:03.9627980Z · ╰── Unnecessary dependency `props.snoozePresetMinute` 2026-10-25T13:30:03.9628033Z 735 │ ); 2026-10-25T13:30:03.9628084Z ╰──── 2026-10-25T13:30:03.9628495Z  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-25T13:30:03.9628853Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9628855Z 2026-10-25T13:30:03.9629035Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-25T13:30:03.9629187Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:780:7] 2026-10-25T13:30:03.9629255Z 779 │ thread.pinnedAt, 2026-10-25T13:30:03.9629317Z 780 │ variant, 2026-10-25T13:30:03.9629390Z ·  ───┬─── 2026-10-25T13:30:03.9629523Z · ╰── Unnecessary dependency `variant` 2026-10-25T13:30:03.9629578Z 781 │ ], 2026-10-25T13:30:03.9629629Z ╰──── 2026-10-25T13:30:03.9629943Z  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-25T13:30:03.9630254Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T13:30:03.9630256Z 2026-10-25T13:30:03.9630449Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T13:30:03.9630607Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1229:21] 2026-10-25T13:30:03.9630734Z 1228 │ {providerDrivers.slice(0, -1).map((driver, index) => ( 2026-10-25T13:30:03.9630865Z 1229 │ 2026-10-25T13:30:03.9630979Z ·  ────────────────────────── 2026-10-25T13:30:03.9631096Z 1230 │ 2026-10-25T13:30:03.9631151Z ╰──── 2026-10-25T13:30:03.9631294Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-25T13:30:03.9631298Z 2026-10-25T13:30:03.9631381Z Found 0 errors and 383 warnings in 5589 files (5.8s, 8 threads) 2026-10-25T13:30:04.0116455Z Post job cleanup. 2026-10-25T13:30:04.0765128Z Cache hit occurred on the primary key electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309, not saving cache. 2026-10-25T13:30:04.0852578Z Post job cleanup. 2026-10-25T13:30:04.1185488Z ##[start-action display=Cache full pnpm store;id=__cdc1a910-3d38-401a-8b1b-103b2321eb93.__actions_cache] 2026-10-25T13:30:04.1827211Z Post job cleanup. 2026-10-25T13:30:04.2756846Z Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-1af206af93d733fa7c4e35fa5de35961f61c0d15b9f10a3bf0b6b76380c4d2df, not saving cache. 2026-10-25T13:30:04.2795636Z ##[end-action id=__cdc1a910-3d38-401a-8b1b-103b2321eb93.__actions_cache;outcome=success;conclusion=success;duration_ms=160] 2026-10-25T13:30:04.2797259Z ##[start-action display=Cache Vite+;id=__cdc1a910-3d38-401a-8b1b-103b2321eb93.vp_cache] 2026-10-25T13:30:04.2816422Z Post job cleanup. 2026-10-25T13:30:04.3450652Z Cache hit occurred on the primary key vite-plus-home-v2-Linux-X64-1.4.0-node26.12.1-pnpm@12.14.0, not saving cache. 2026-10-25T13:30:04.3490224Z ##[end-action id=__cdc1a910-3d38-401a-8b1b-103b2321eb93.vp_cache;outcome=success;conclusion=success;duration_ms=69] 2026-10-25T13:30:04.3531078Z Post job cleanup. 2026-10-25T13:30:04.3951931Z [command]/usr/local/bin/git version 2026-10-25T13:30:04.3983234Z git version 2.55.0 2026-10-25T13:30:04.4001531Z Temporarily overriding HOME='/home/runner/_work/_temp/7611a110-3880-4aff-b7eb-0cec05687e29' before making global git config changes 2026-10-25T13:30:04.4002129Z Adding repository directory to the temporary git global config as a safe directory 2026-10-25T13:30:04.4004600Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-25T13:30:04.4033565Z Removing SSH command configuration 2026-10-25T13:30:04.4036549Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-25T13:30:04.4061569Z [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-25T13:30:04.4201539Z fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules 2026-10-25T13:30:04.4231366Z ##[warning]The process '/usr/local/bin/git' failed with exit code 128 2026-10-25T13:30:04.4283954Z A job completed hook has been configured by the self-hosted runner administrator 2026-10-25T13:30:04.4306429Z ##[group]Run '/job_completed.sh' 2026-10-25T13:30:04.4317391Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-25T13:30:04.4317569Z env: 2026-10-25T13:30:04.4317686Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 146 2026-10-25T13:30:04.4317851Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 552 2026-10-25T13:30:04.4317998Z BLACKSMITH_CHECK_RUN_ID: 121182404788 2026-10-25T13:30:04.4318145Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-25T13:30:04.4318287Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-25T13:30:04.4318425Z ##[endgroup] 2026-10-25T13:30:04.4398718Z Docker container cache not activated, skipping hash computation. 2026-10-25T13:30:04.4693875Z No active SSH sessions detected. Proceeding with shutdown immediately. 2026-10-25T13:30:04.5210888Z Cleaning up orphan processes